From 22f2ac378013592d667f173d3121cb3a5386e12c Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Wed, 30 Sep 2026 12:25:21 +0000 Subject: [PATCH 01/70] fix(registry): dispatch rms_norm to the CUDA backend on CUDA `test_registry_dispatches_rms_norm` asserts that the registry resolves `rms_norm` to `RMSNormCudaOp` whenever CUDA and the compiled kernels are both present, but `OpBackend` had no CUDA member for this operator and the CUDA priority list contained only `PYTORCH_NATIVE_RMS_NORM`, so the assert could never hold. The test therefore fails on any CUDA machine that builds the native extension, and only passes when `_HAS_CUDA_RMSNORM` is false -- which is why an unbuilt CI has not caught it. `RMSNormCudaOp` is already a first-class backend elsewhere: it is the `"cuda"` candidate in `gtest/operator_specs.py` and is used directly by `attention_preprocess.py`. Only the registry was missing it. Add `OpBackend.CUDA_RMS_NORM` and put it ahead of the PyTorch reference in the CUDA priority list. Because `_load_backend` only catches import errors and this module imports cleanly without `_C`, a CUDA-first list would otherwise hand out an op that raises at call time on an unbuilt install; so `RMSNormCudaOp.__init__` now validates the extension and its three symbols, matching `_require_cuda_activation` in the activation ops. The registry already treats a backend whose construction raises as unavailable, so the list degrades to `NativeRMSNormOp` as before. Only the `cuda` priority map changes; rocm/musa/cpu/npu are untouched. Verified on 2x B200 (sm_100, driver 580.126.20, torch 2.13.0+cu130) with the extension rebuilt from source: pytest tests/test_rms_norm.py -q pytest tests/ rl_engine/tests/ -q -p no:randomly \ --ignore=tests/test_rocm_aiter_api_contract.py tests/test_rms_norm.py passes, including test_registry_dispatches_rms_norm, which fails on the merge-base. The full suite gains no failure. The ignored file fails to import on the merge-base as well. Absolute suite counts are reported in the PR description against a named base commit, not here: they shift whenever a sibling test is added, so a count frozen in a commit message goes stale the moment the branch is rebased. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- rl_engine/kernels/ops/cuda/norm/rmsnorm.py | 27 +++++++++++++++++ rl_engine/kernels/registry.py | 6 +++- tests/test_rms_norm.py | 35 ++++++++++++++++++++++ 3 files changed, 67 insertions(+), 1 deletion(-) diff --git a/rl_engine/kernels/ops/cuda/norm/rmsnorm.py b/rl_engine/kernels/ops/cuda/norm/rmsnorm.py index 773325c5d..f7af2a8bc 100644 --- a/rl_engine/kernels/ops/cuda/norm/rmsnorm.py +++ b/rl_engine/kernels/ops/cuda/norm/rmsnorm.py @@ -5,6 +5,25 @@ from rl_engine.kernels.ops.vjp_fp32 import reduce_rows_fp32, rmsnorm_dweight_rows_fp32 +def _require_cuda_symbols(what: str, *names: str) -> None: + """Raise when the compiled kernels backing ``what`` are missing. + + The registry treats a backend whose construction raises as unavailable and + falls through to the next candidate, so calling this from ``__init__`` is + what lets a CUDA-first priority list degrade to the PyTorch reference on a + build without the extension. Mirrors ``_require_cuda_activation`` in the + activation ops. + """ + if not _EXT_AVAILABLE or _C is None: + raise RuntimeError(f"{what} requires the compiled rl_engine._C extension.") + missing = [name for name in names if not hasattr(_C, name)] + if missing: + raise RuntimeError( + f"{what} symbols ({', '.join(missing)}) are not compiled into _C. " + "Rebuild the extension with csrc/cuda/rmsnorm.cu." + ) + + class RMSNormCuda(torch.autograd.Function): """ PyTorch autograd wrapper for CUDA RMSNorm. @@ -99,6 +118,14 @@ class RMSNormCudaOp: backward_impl = "cuda_rmsnorm_dx_declared_fp32_rowfold_dw" + def __init__(self) -> None: + _require_cuda_symbols( + "CUDA RMSNorm", + "rmsnorm_forward", + "rmsnorm_backward_dx", + "rmsnorm_backward_dw", + ) + def __call__(self, x, weight, *, eps=1e-6): return self.forward(x, weight, eps=eps) diff --git a/rl_engine/kernels/registry.py b/rl_engine/kernels/registry.py index 9eeb1c42b..3b935499a 100644 --- a/rl_engine/kernels/registry.py +++ b/rl_engine/kernels/registry.py @@ -154,6 +154,7 @@ class OpBackend(Enum, metaclass=_KernelEnumMeta): ) # RMSNorm(pre-norm / QK-Norm) - pure Pytorch reference(ws1 ground-truth) + CUDA_RMS_NORM = "rl_engine.kernels.ops.cuda.norm.rmsnorm.RMSNormCudaOp" TRITON_RMS_NORM = "rl_engine.kernels.ops.triton.rmsnorm_triton.RMSNormTritonOp" PYTORCH_NATIVE_RMS_NORM = "rl_engine.kernels.ops.pytorch.norm.rms_norm.NativeRMSNormOp" @@ -589,7 +590,10 @@ def __init__(self): OpBackend.TRITON_BATCH_INVARIANT_LOGP, OpBackend.PYTORCH_BATCH_INVARIANT_LOGP, ], - "rms_norm": [OpBackend.PYTORCH_NATIVE_RMS_NORM], + "rms_norm": [ + OpBackend.CUDA_RMS_NORM, + OpBackend.PYTORCH_NATIVE_RMS_NORM, + ], "lm_head": [OpBackend.PYTORCH_NATIVE_LM_HEAD], "embedding": [OpBackend.PYTORCH_NATIVE_EMBEDDING], "silu": [ diff --git a/tests/test_rms_norm.py b/tests/test_rms_norm.py index e8dcaa0a2..cfc12ab68 100644 --- a/tests/test_rms_norm.py +++ b/tests/test_rms_norm.py @@ -247,6 +247,41 @@ def test_backward_batch_invariance_slice(): assert torch.equal(x_slice.grad, grad_x_full_sliced) +# 9b. The CUDA backend must report itself unavailable by failing construction, +# which is the seam the registry uses to fall back (see _get_or_create_backend). +def test_cuda_op_construction_fails_without_extension(monkeypatch): + from rl_engine.kernels.ops.cuda.norm import rmsnorm as cuda_rmsnorm + + monkeypatch.setattr(cuda_rmsnorm, "_EXT_AVAILABLE", False) + monkeypatch.setattr(cuda_rmsnorm, "_C", None) + with pytest.raises(RuntimeError, match="requires the compiled rl_engine._C extension"): + cuda_rmsnorm.RMSNormCudaOp() + + +def test_cuda_op_construction_fails_when_symbols_missing(monkeypatch): + from rl_engine.kernels.ops.cuda.norm import rmsnorm as cuda_rmsnorm + + class _WithoutRMSNorm: # a built extension that lacks the rmsnorm symbols + pass + + monkeypatch.setattr(cuda_rmsnorm, "_EXT_AVAILABLE", True) + monkeypatch.setattr(cuda_rmsnorm, "_C", _WithoutRMSNorm()) + with pytest.raises(RuntimeError, match="are not compiled into _C"): + cuda_rmsnorm.RMSNormCudaOp() + + +@requires_cuda +def test_registry_falls_back_to_native_without_extension(monkeypatch): + """A CUDA-first priority list must still resolve on a build without _C.""" + from rl_engine.kernels.ops.cuda.norm import rmsnorm as cuda_rmsnorm + from rl_engine.kernels.registry import KernelRegistry + + monkeypatch.setattr(cuda_rmsnorm, "_EXT_AVAILABLE", False) + monkeypatch.setattr(cuda_rmsnorm, "_C", None) + # A fresh registry, so the cached instance from other tests is not reused. + assert isinstance(KernelRegistry().get_op("rms_norm"), NativeRMSNormOp) + + # 10. Registry dispatch resolves to the hardware op when available def test_registry_dispatches_rms_norm(): from rl_engine.kernels.registry import kernel_registry From ba9b89e34408671b66a4e10a9e9ced570373358e Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Wed, 30 Sep 2026 18:06:44 +0000 Subject: [PATCH 02/70] fix(norm): validate only used CUDA symbols and exercise explicit fallback Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- rl_engine/kernels/ops/cuda/norm/rmsnorm.py | 1 - tests/test_rms_norm.py | 34 ++++++++++++++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/rl_engine/kernels/ops/cuda/norm/rmsnorm.py b/rl_engine/kernels/ops/cuda/norm/rmsnorm.py index f7af2a8bc..21be8dfb8 100644 --- a/rl_engine/kernels/ops/cuda/norm/rmsnorm.py +++ b/rl_engine/kernels/ops/cuda/norm/rmsnorm.py @@ -123,7 +123,6 @@ def __init__(self) -> None: "CUDA RMSNorm", "rmsnorm_forward", "rmsnorm_backward_dx", - "rmsnorm_backward_dw", ) def __call__(self, x, weight, *, eps=1e-6): diff --git a/tests/test_rms_norm.py b/tests/test_rms_norm.py index cfc12ab68..0b2a6178f 100644 --- a/tests/test_rms_norm.py +++ b/tests/test_rms_norm.py @@ -270,7 +270,6 @@ class _WithoutRMSNorm: # a built extension that lacks the rmsnorm symbols cuda_rmsnorm.RMSNormCudaOp() -@requires_cuda def test_registry_falls_back_to_native_without_extension(monkeypatch): """A CUDA-first priority list must still resolve on a build without _C.""" from rl_engine.kernels.ops.cuda.norm import rmsnorm as cuda_rmsnorm @@ -279,7 +278,38 @@ def test_registry_falls_back_to_native_without_extension(monkeypatch): monkeypatch.setattr(cuda_rmsnorm, "_EXT_AVAILABLE", False) monkeypatch.setattr(cuda_rmsnorm, "_C", None) # A fresh registry, so the cached instance from other tests is not reused. - assert isinstance(KernelRegistry().get_op("rms_norm"), NativeRMSNormOp) + assert isinstance(KernelRegistry().get_op("rms_norm", device="cuda"), NativeRMSNormOp) + + +@pytest.mark.parametrize("missing", ["rmsnorm_forward", "rmsnorm_backward_dx"]) +def test_registry_falls_back_when_required_symbol_is_missing(monkeypatch, missing): + from types import SimpleNamespace + + from rl_engine.kernels.ops.cuda.norm import rmsnorm as cuda_rmsnorm + from rl_engine.kernels.registry import KernelRegistry + + symbols = {name: object() for name in ("rmsnorm_forward", "rmsnorm_backward_dx")} + del symbols[missing] + monkeypatch.setattr(cuda_rmsnorm, "_EXT_AVAILABLE", True) + monkeypatch.setattr(cuda_rmsnorm, "_C", SimpleNamespace(**symbols)) + assert isinstance(KernelRegistry().get_op("rms_norm", device="cuda"), NativeRMSNormOp) + + +def test_registry_cuda_requires_only_used_symbols_and_cpu_stays_native(monkeypatch): + from types import SimpleNamespace + + from rl_engine.kernels.ops.cuda.norm import rmsnorm as cuda_rmsnorm + from rl_engine.kernels.registry import KernelRegistry + + monkeypatch.setattr(cuda_rmsnorm, "_EXT_AVAILABLE", True) + monkeypatch.setattr( + cuda_rmsnorm, + "_C", + SimpleNamespace(rmsnorm_forward=object(), rmsnorm_backward_dx=object()), + ) + registry = KernelRegistry() + assert isinstance(registry.get_op("rms_norm", device="cuda"), RMSNormCudaOp) + assert isinstance(registry.get_op("rms_norm", device="cpu"), NativeRMSNormOp) # 10. Registry dispatch resolves to the hardware op when available From 1dd6dbb698c35b7e666cda77a8df5b32fb46ca80 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Sun, 4 Oct 2026 01:48:41 +0000 Subject: [PATCH 03/70] test(rmsnorm): gate the dispatch test on the symbols the CUDA op requires Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- tests/test_rms_norm.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/test_rms_norm.py b/tests/test_rms_norm.py index 0b2a6178f..2785ec678 100644 --- a/tests/test_rms_norm.py +++ b/tests/test_rms_norm.py @@ -17,9 +17,10 @@ try: from rl_engine.kernels.ops.base import _C, _EXT_AVAILABLE + # The same two symbols RMSNormCudaOp.__init__ requires; a build that has them + # dispatches to the CUDA op, so the dispatch test must agree with that guard. _HAS_CUDA_RMSNORM = _EXT_AVAILABLE and all( - hasattr(_C, name) - for name in ("rmsnorm_forward", "rmsnorm_backward_dx", "rmsnorm_backward_dw") + hasattr(_C, name) for name in ("rmsnorm_forward", "rmsnorm_backward_dx") ) except ImportError: # pragma: no cover - import can fail when the extension is not built. _HAS_CUDA_RMSNORM = False From 6a4f07818c75b14af84c7a8b7ed45aaa99a69659 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Sun, 4 Oct 2026 12:51:23 +0000 Subject: [PATCH 04/70] fix(rmsnorm): guard the CUDA launchers on the input's device The forward, backward-dx and both backward-dw launchers took the current CUDA stream without switching to the input's device, so a tensor on cuda:1 while cuda:0 is current launched on the wrong GPU. Add a device guard on the input's device in each launcher. Use at::cuda::OptionalCUDAGuard with the headers included unconditionally, as activation.cu does: those launchers compile in the ROCm build too, where the file's existing c10::cuda::CUDAGuard stays inside the !USE_ROCM block. A two-device test checks that the op runs on the input's device and matches the single-device result. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- csrc/cuda/rmsnorm.cu | 8 ++++++-- tests/test_rms_norm.py | 27 +++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/csrc/cuda/rmsnorm.cu b/csrc/cuda/rmsnorm.cu index 1adaca5bd..b32bc5af4 100644 --- a/csrc/cuda/rmsnorm.cu +++ b/csrc/cuda/rmsnorm.cu @@ -1,9 +1,7 @@ #include #include -#if !defined(USE_ROCM) #include #include -#endif #include #include #include @@ -251,6 +249,9 @@ void rmsnorm_forward_cuda( torch::Tensor rstd, double eps ) { + // Launch on x's device: the current CUDA stream belongs to the current + // device, which need not be x's. + const at::cuda::OptionalCUDAGuard device_guard(device_of(x)); int T = x.size(0); int H = x.size(1); int threads = choose_threads(H); @@ -283,6 +284,7 @@ void rmsnorm_backward_dx_cuda( torch::Tensor rstd, torch::Tensor dx ) { + const at::cuda::OptionalCUDAGuard device_guard(device_of(x)); int T = x.size(0); int H = x.size(1); int threads = choose_threads(H); @@ -315,6 +317,7 @@ void rmsnorm_backward_partial_dw_cuda( torch::Tensor mask, torch::Tensor partial_dw ) { + const at::cuda::OptionalCUDAGuard device_guard(device_of(x)); int T = x.size(0); int H = x.size(1); @@ -342,6 +345,7 @@ void rmsnorm_backward_reduce_dw_cuda( torch::Tensor partial_dw, torch::Tensor dw ) { + const at::cuda::OptionalCUDAGuard device_guard(device_of(partial_dw)); int chunks = partial_dw.size(0); int H = partial_dw.size(1); diff --git a/tests/test_rms_norm.py b/tests/test_rms_norm.py index 2785ec678..b17a3f302 100644 --- a/tests/test_rms_norm.py +++ b/tests/test_rms_norm.py @@ -379,6 +379,33 @@ def test_cuda_triton_rms_norm_matches_native_forward_and_backward(impl, dtype, r ) +@requires_cuda_rmsnorm +@pytest.mark.skipif(torch.cuda.device_count() < 2, reason="requires at least two CUDA devices") +def test_cuda_rms_norm_runs_on_the_input_device_not_the_current_one(): + # The launchers take the current CUDA stream, which belongs to the current + # device; they must switch to x's device first or a cuda:1 input while + # cuda:0 is current launches on the wrong GPU. + torch.manual_seed(0) + x_cpu = torch.randn(8, 768, dtype=torch.float32) + w_cpu = torch.randn(768, dtype=torch.float32) + dy_cpu = torch.randn(8, 768, dtype=torch.float32) + + def run(device): + x = x_cpu.to(device=device, dtype=torch.bfloat16).requires_grad_(True) + w = w_cpu.to(device=device, dtype=torch.bfloat16).requires_grad_(True) + y = rmsnorm_cuda(x, w, eps=_EPS) + y.backward(dy_cpu.to(device=device, dtype=torch.bfloat16)) + torch.cuda.synchronize(device) + return y.detach(), x.grad.detach(), w.grad.detach() + + with torch.cuda.device(0): + expected = run("cuda:0") + actual = run("cuda:1") + for got, want in zip(actual, expected, strict=True): + assert got.device == torch.device("cuda:1") + assert torch.equal(got.cpu(), want.cpu()) + + @requires_cuda @pytest.mark.parametrize("impl", ["triton", "cuda"]) def test_cuda_triton_rms_norm_deterministic_repeat(impl): From 6741d16505b6c40c8abab3c91d887af8d3f76baf Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Wed, 30 Sep 2026 14:03:12 +0000 Subject: [PATCH 05/70] feat(ws1): Qwen3-Next RMSNorm references and zero-centred CUDA offset Advances RFC #428 C1 on the CUDA track. Claim level: L0 repeatable and L1 batch-invariant. L2 is NOT claimed -- see "On exactness against vLLM" below. Qwen3-Next's decoder and final norms store a zero-centred weight and compute `x * rstd * (1 + w)`, with the `1 +` applied in fp32 after the upcast. Folding it into a bf16 weight beforehand rounds the offset away, so it has to reach the kernel as a parameter rather than being pre-applied by the caller. NativeRMSNormOp gains `weight_offset` (default 0.0) Qwen3NextRMSNormOp subclasses it, overriding only weight_offset = 1.0 Qwen3NextRMSNormGatedOp GDN gated norm: plain w, weight multiply in fp32 Qwen3NextRMSNormGatedHFOp the transformers convention, kept as a witness The offset is applied under `if cls.weight_offset:` rather than unconditionally, because `0.0 + w` rewrites -0.0 to +0.0. torch.equal does not notice that, but a bitwise comparison does, and the plain path must stay bit-for-bit what it was. A test pins it at the bit level. The gated pair exists because transformers and vLLM disagree on where the gated norm's weight multiply happens, and the gap is not a ULP: on bf16 / head_v_dim=128 they differ in 35% of elements with max|diff| = 6.25e-2. Isolating the cast order alone reproduces the gap (5.3e-2), so the cast order dominates rather than the reduction order. The two conventions share their validation and normalization and differ only in a `_scale_by_weight` hook. CUDA: `weight_offset` added to the forward and dx kernels, defaulting to 0.0 so every existing caller and binding is unaffected. The dw kernel is untouched: d/dw (offset + w) == d/dw w. weight_offset=1.0 vs an explicit fp32 (1 + w) weight bitwise equal weight_offset=1.0 vs a bf16-folded (1 + w) weight differs, as required default offset vs the previous kernel bitwise equal The first line is the correctness argument: the in-kernel offset is the same arithmetic as the fp32 reference, not an approximation. The second is a regression guard -- if it ever passes, the offset has stopped being fp32. On exactness against vLLM ------------------------- Measured over 40 seeds (bf16, head_v_dim=128, 512 rows): ours vs forward_native 6/40 seeds differ, worst 1.56e-2 ours vs forward_cuda 18/40 seeds differ, worst 3.91e-3 forward_native vs forward_cuda 21/40 seeds differ, worst 1.56e-2 vLLM's own two paths are not bitwise equal to each other, so "bitwise equal to vLLM" is undefined until a single provider is named. In fp32 the two paths differ on ~36% of elements, every one by an fp32 ULP -- the tree shapes differ, the semantics do not. What this reproduces is the convention (fp32 weight multiply, single trailing cast); the residual is the reduction tree. The reduction stays the repo's fixed 32-wide chunked sum, which is what buys L1. It was introduced for NPU but is needed on CUDA too: over 20 seeds at H=2048 in bf16 -- Qwen3-Next's own hidden_size and dtype -- a plain mean(-1) broke slice invariance on 1 of 20 while the chunked reduction broke on 0 of 20. Matching stock vLLM bitwise would mean adopting a reduction that is not itself batch-invariant, i.e. trading L1 for L2. tests/check_qwen3_next_norm_providers.py pins the dispatch facts and bounds the gap, asserting magnitudes rather than equality so a vLLM bump that changes the provider fails loudly. It is named `check_` rather than `test_`, following tests/distributed/check_*.py: it imports real vLLM, and tests/test_framework_operator_integrations.py asserts vllm is absent from sys.modules, an invariant any collected test importing vLLM would break for the whole session. Also: `rl_engine/_C.pyi` updated for the new `weight_offset` argument (CI runs mypy against it), `tests/test_qwen3_next_norm.py` added to the CI test list in .github/workflows/ci.yml, and an operator page added per docs/operators/README.md ("the documentation page is part of the operator contract"). Verified on 2x B200 (sm_100, driver 580.126.20, torch 2.13.0+cu130, triton 3.7.1, vllm 0.30.0, transformers 5.17.0): pytest tests/test_qwen3_next_norm.py -q pytest tests/check_qwen3_next_norm_providers.py -q pytest tests/ rl_engine/tests/ -q -p no:randomly \ --ignore=tests/test_rocm_aiter_api_contract.py Both new files pass and the full suite gains no failure. The ignored file fails to import on the merge-base as well. Absolute suite counts are reported in the PR description against a named base commit, not here: they shift whenever a sibling test is added, so a count frozen in a commit message goes stale the moment the branch is rebased. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- .github/workflows/ci.yml | 2 +- csrc/cuda/rmsnorm.cu | 29 +- csrc/ops.cpp | 24 +- docs/.nav.yml | 1 + docs/operators/README.md | 1 + docs/operators/qwen3-next-rms-norm.md | 103 ++++ rl_engine/_C.pyi | 2 + rl_engine/kernels/ops/cuda/norm/rmsnorm.py | 37 +- .../ops/pytorch/norm/qwen3_next_rms_norm.py | 198 +++++++ .../kernels/ops/pytorch/norm/rms_norm.py | 30 +- tests/check_qwen3_next_norm_providers.py | 232 ++++++++ tests/test_qwen3_next_norm.py | 502 ++++++++++++++++++ 12 files changed, 1127 insertions(+), 34 deletions(-) create mode 100644 docs/operators/qwen3-next-rms-norm.md create mode 100644 rl_engine/kernels/ops/pytorch/norm/qwen3_next_rms_norm.py create mode 100644 tests/check_qwen3_next_norm_providers.py create mode 100644 tests/test_qwen3_next_norm.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 75627621e..5f8c900b3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -67,7 +67,7 @@ jobs: run: | python -m pytest rl_engine/tests/test_dispatch.py -v PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 python -m pytest tests/test_attention_correctness.py -q -rs - python -m pytest tests/test_forward_invariance.py tests/test_tolerance_contract.py tests/test_ws1_workload.py tests/test_gradient_invariance.py tests/test_elementwise_inventory.py tests/test_four_judgment_matrix.py tests/test_op_checks.py tests/test_operator_inputs.py tests/test_profiler.py tests/test_kv_consistency.py tests/test_ws1_qwen3_dense.py tests/test_ws1_chain_integration.py -q + python -m pytest tests/test_forward_invariance.py tests/test_tolerance_contract.py tests/test_ws1_workload.py tests/test_gradient_invariance.py tests/test_elementwise_inventory.py tests/test_four_judgment_matrix.py tests/test_op_checks.py tests/test_operator_inputs.py tests/test_profiler.py tests/test_kv_consistency.py tests/test_ws1_qwen3_dense.py tests/test_ws1_chain_integration.py tests/test_qwen3_next_norm.py -q - name: Run Cross-Configuration Contract Tests (CPU-safe) run: | diff --git a/csrc/cuda/rmsnorm.cu b/csrc/cuda/rmsnorm.cu index b32bc5af4..fc6c425d6 100644 --- a/csrc/cuda/rmsnorm.cu +++ b/csrc/cuda/rmsnorm.cu @@ -108,7 +108,8 @@ __global__ void rmsnorm_fwd_kernel( float* __restrict__ rstd, int T, int H, - float eps + float eps, + float weight_offset ) { int row = blockIdx.x; int tid = threadIdx.x; @@ -135,10 +136,13 @@ __global__ void rmsnorm_fwd_kernel( __syncthreads(); - // Write y = x * rstd * weight. + // Write y = x * rstd * (weight_offset + weight). The offset is added in + // fp32 after the upcast: a zero-centred weight (Qwen3-Next, Gemma) must not + // have its "+1" folded into the low-precision weight beforehand, which would + // round the offset and break the bitwise contract. for (int col = tid; col < H; col += blockDim.x) { float xv = load_as_float(x_row + col); - float wv = load_as_float(weight + col); + float wv = load_as_float(weight + col) + weight_offset; float out = xv * row_rstd * wv; store_from_float(y_row + col, out); } @@ -153,7 +157,8 @@ __global__ void rmsnorm_bwd_dx_kernel( const float* __restrict__ rstd, scalar_t* __restrict__ dx, int T, - int H + int H, + float weight_offset ) { int row = blockIdx.x; int tid = threadIdx.x; @@ -167,7 +172,7 @@ __global__ void rmsnorm_bwd_dx_kernel( for (int col = tid; col < H; col += blockDim.x) { float dyv = load_as_float(dy_row + col); float xv = load_as_float(x_row + col); - float wv = load_as_float(weight + col); + float wv = load_as_float(weight + col) + weight_offset; local_dot += dyv * wv * xv; } @@ -179,7 +184,7 @@ __global__ void rmsnorm_bwd_dx_kernel( for (int col = tid; col < H; col += blockDim.x) { float dyv = load_as_float(dy_row + col); float xv = load_as_float(x_row + col); - float wv = load_as_float(weight + col); + float wv = load_as_float(weight + col) + weight_offset; float out = r * dyv * wv - xv * coeff; store_from_float(dx_row + col, out); @@ -247,7 +252,8 @@ void rmsnorm_forward_cuda( torch::Tensor weight, torch::Tensor y, torch::Tensor rstd, - double eps + double eps, + double weight_offset ) { // Launch on x's device: the current CUDA stream belongs to the current // device, which need not be x's. @@ -270,7 +276,8 @@ void rmsnorm_forward_cuda( rstd.data_ptr(), T, H, - static_cast(eps) + static_cast(eps), + static_cast(weight_offset) ); }); }); @@ -282,7 +289,8 @@ void rmsnorm_backward_dx_cuda( torch::Tensor x, torch::Tensor weight, torch::Tensor rstd, - torch::Tensor dx + torch::Tensor dx, + double weight_offset ) { const at::cuda::OptionalCUDAGuard device_guard(device_of(x)); int T = x.size(0); @@ -303,7 +311,8 @@ void rmsnorm_backward_dx_cuda( rstd.data_ptr(), dx.data_ptr(), T, - H + H, + static_cast(weight_offset) ); }); }); diff --git a/csrc/ops.cpp b/csrc/ops.cpp index 11fda1159..4e786e5b3 100644 --- a/csrc/ops.cpp +++ b/csrc/ops.cpp @@ -260,14 +260,16 @@ void rmsnorm_forward_cuda( torch::Tensor weight, torch::Tensor y, torch::Tensor rstd, - double eps); + double eps, + double weight_offset); void rmsnorm_backward_dx_cuda( torch::Tensor dy, torch::Tensor x, torch::Tensor weight, torch::Tensor rstd, - torch::Tensor dx); + torch::Tensor dx, + double weight_offset); void rmsnorm_backward_partial_dw_cuda( torch::Tensor dy, @@ -296,7 +298,8 @@ static void rmsnorm_check_input(const torch::Tensor& x, const char* name) { std::vector rmsnorm_forward( torch::Tensor x, torch::Tensor weight, - double eps) + double eps, + double weight_offset) { rmsnorm_check_input(x, "x"); rmsnorm_check_input(weight, "weight"); @@ -309,7 +312,7 @@ std::vector rmsnorm_forward( auto y = torch::empty_like(x); auto rstd = torch::empty({T}, x.options().dtype(torch::kFloat32)); - rmsnorm_forward_cuda(x, weight, y, rstd, eps); + rmsnorm_forward_cuda(x, weight, y, rstd, eps, weight_offset); return {y, rstd}; } @@ -318,7 +321,8 @@ torch::Tensor rmsnorm_backward_dx( torch::Tensor dy, torch::Tensor x, torch::Tensor weight, - torch::Tensor rstd) + torch::Tensor rstd, + double weight_offset) { rmsnorm_check_input(dy, "dy"); rmsnorm_check_input(x, "x"); @@ -333,7 +337,7 @@ torch::Tensor rmsnorm_backward_dx( auto dx = torch::empty_like(x); - rmsnorm_backward_dx_cuda(dy, x, weight, rstd, dx); + rmsnorm_backward_dx_cuda(dy, x, weight, rstd, dx, weight_offset); return dx; } @@ -712,8 +716,12 @@ PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { &det_gemm_db_transposed, "Batch-invariant deterministic GEMM backward in canonical [N,K] layout"); // registry RMSNorm - m.def("rmsnorm_forward", &rmsnorm_forward, "Batch-invariant RMSNorm forward CUDA"); - m.def("rmsnorm_backward_dx", &rmsnorm_backward_dx, "Batch-invariant RMSNorm backward dx CUDA"); + m.def("rmsnorm_forward", &rmsnorm_forward, "Batch-invariant RMSNorm forward CUDA", + py::arg("x"), py::arg("weight"), py::arg("eps"), + py::arg("weight_offset") = 0.0); + m.def("rmsnorm_backward_dx", &rmsnorm_backward_dx, "Batch-invariant RMSNorm backward dx CUDA", + py::arg("dy"), py::arg("x"), py::arg("weight"), py::arg("rstd"), + py::arg("weight_offset") = 0.0); m.def("rmsnorm_backward_dw", &rmsnorm_backward_dw, "Deterministic RMSNorm backward dweight CUDA"); #if !defined(USE_ROCM) m.def( diff --git a/docs/.nav.yml b/docs/.nav.yml index 7d71230a3..9133710de 100644 --- a/docs/.nav.yml +++ b/docs/.nav.yml @@ -29,6 +29,7 @@ nav: - operators/sampling.md - operators/det-gemm.md - operators/embedding.md + - operators/qwen3-next-rms-norm.md - Developer Guide: - contributing/README.md - General: diff --git a/docs/operators/README.md b/docs/operators/README.md index 00f4cbb45..0d955ed18 100644 --- a/docs/operators/README.md +++ b/docs/operators/README.md @@ -32,4 +32,5 @@ Every operator page should include: - [Matmul](matmul.md) - [Sampling](sampling.md) - [Token Embedding](embedding.md) +- [Qwen3-Next RMSNorm (zero-centred)](qwen3-next-rms-norm.md) - [Operator Doc Template](../contributing/operator-doc-template.md) diff --git a/docs/operators/qwen3-next-rms-norm.md b/docs/operators/qwen3-next-rms-norm.md new file mode 100644 index 000000000..292139bea --- /dev/null +++ b/docs/operators/qwen3-next-rms-norm.md @@ -0,0 +1,103 @@ +# Qwen3-Next RMSNorm (zero-centred) + +## Summary + +Qwen3-Next's decoder and final norms store a **zero-centred** weight and compute +`x * rstd * (1 + w)` rather than `x * rstd * w`. The `1 +` is applied in fp32, +after the upcast — folding it into a low-precision weight beforehand rounds the +offset away and silently breaks any bitwise claim. + +This operator exists for RFC #428 C1 (Embedding / RMSNorm / residual / final norm +exactness) on the Qwen3-Next rollout-vs-replay path. The Gated DeltaNet block uses +a *different* weight convention and a different cast order; it is a separate +operator. + +Upstream references: `transformers` `Qwen3NextRMSNorm`, and vLLM's `GemmaRMSNorm`, +which `vllm/model_executor/models/qwen3_next.py` aliases as `Qwen3NextRMSNorm`. + +## Entry Point + +```python +from rl_engine.kernels.ops.pytorch.norm.qwen3_next_rms_norm import Qwen3NextRMSNormOp +from rl_engine.kernels.ops.cuda.norm.rmsnorm import Qwen3NextRMSNormCudaOp, rmsnorm_cuda + +y = Qwen3NextRMSNormOp().forward(x, weight, eps=1e-6) # reference +y = Qwen3NextRMSNormCudaOp().forward(x, weight, eps=1e-6) # CUDA + +# The offset is a kernel parameter, not a pre-pass: +y = rmsnorm_cuda(x, weight, eps=1e-6, weight_offset=1.0) +``` + +## Backends + +| Backend | Wrapper | Native symbol | Status | +| --- | --- | --- | --- | +| CUDA | `Qwen3NextRMSNormCudaOp` | `rl_engine._C.rmsnorm_forward` (`weight_offset=1.0`) | Supported | +| ROCm | — | — | Not implemented | +| PyTorch fallback | `Qwen3NextRMSNormOp` | — | Supported (WS1 gold) | + +`Qwen3NextRMSNormOp` subclasses `NativeRMSNormOp` and overrides only +`weight_offset`; the base applies it in fp32. + +## Tensor Contract + +| Argument | Shape | Dtype | Requirements | +| --- | --- | --- | --- | +| `x` | `[..., H]` | fp32 / bf16 / fp16 | CUDA path requires contiguous | +| `weight` | `[H]` | matches `x` | zero-centred (upstream inits to zeros) | +| `eps` | scalar | float | inside the sqrt; `1e-6` for Qwen3-Next | + +## Dispatch Behavior + +Registered as the `qwen3_next_rms_norm` gtest operator. On CUDA the registry +prefers `Qwen3NextRMSNormCudaOp`; every other platform resolves to the PyTorch +reference. The CUDA op validates the compiled symbols in `__init__`, so on a build +without the extension construction raises and the registry falls through to the +reference rather than handing out an op that fails at call time. + +## Accuracy + +Claim level: **L0 repeatable, L1 batch-invariant**. L2 is not claimed. + +The reduction is the repo's fixed 32-wide chunked sum +(`shape_invariant_rstd`), which is what makes a row's result independent of the +batch layout. It deliberately differs from upstream's `mean(-1)`: measured on B200, +over 20 seeds at `H=2048` in bf16, a plain `mean(-1)` broke slice invariance on 1 +of 20 while the chunked reduction broke on 0 of 20. + +The cost is that the decoder norm is **not** bitwise equal to stock vLLM — 7 +elements of 1048576 differ, `max|diff| = 1.56e-2` in bf16 at `H=2048`. That gap is +inherent: matching stock vLLM bitwise would mean adopting a reduction that is not +itself batch-invariant, i.e. trading L1 for L2. + +The in-kernel offset is exact, not an approximation: `weight_offset=1.0` is bitwise +equal to passing an explicit fp32 `1 + w` weight, and differs from a bf16-folded +`1 + w`, both asserted. + +Tolerances come from `tolerance_contract.json` (`reduction` × dtype); no private +thresholds. + +## Performance Notes + +The CUDA path reuses the existing `rmsnorm_fwd_kernel` reduction +(`block_reduce_sum` over `choose_threads(H)`), so the offset costs one fp32 add per +element and no extra memory traffic. + +```bash +python scripts/check_operator.py --op qwen3_next_rms_norm --candidate cuda \ + --device cuda --dtype bf16 --check-grad +``` + +## Tests + +```bash +python -m pytest tests/test_qwen3_next_norm.py -v +``` + +## Known Limitations + +- CUDA only; no ROCm, Ascend or Triton backend. +- Not bitwise against stock vLLM (see Accuracy); an L2 claim needs the strict + provider on both sides, per RFC #428 §1 item 1. +- Measured on sm_100 (B200). Per RFC #428 §2.2 no claim carries across + H100/H200/B100/B200. diff --git a/rl_engine/_C.pyi b/rl_engine/_C.pyi index fb3c4379c..b911feaf7 100644 --- a/rl_engine/_C.pyi +++ b/rl_engine/_C.pyi @@ -260,12 +260,14 @@ def rmsnorm_forward( x: torch.Tensor, weight: torch.Tensor, eps: float, + weight_offset: float = ..., ) -> list[torch.Tensor]: ... def rmsnorm_backward_dx( dy: torch.Tensor, x: torch.Tensor, weight: torch.Tensor, rstd: torch.Tensor, + weight_offset: float = ..., ) -> torch.Tensor: ... def rmsnorm_backward_dw( dy: torch.Tensor, diff --git a/rl_engine/kernels/ops/cuda/norm/rmsnorm.py b/rl_engine/kernels/ops/cuda/norm/rmsnorm.py index 21be8dfb8..3b72e497d 100644 --- a/rl_engine/kernels/ops/cuda/norm/rmsnorm.py +++ b/rl_engine/kernels/ops/cuda/norm/rmsnorm.py @@ -30,16 +30,18 @@ class RMSNormCuda(torch.autograd.Function): """ @staticmethod - def forward(ctx, x, weight, mask=None, eps=1e-6): + def forward(ctx, x, weight, mask=None, eps=1e-6, weight_offset=0.0): """ Forward: - y = x * rsqrt(mean(x^2) + eps) * weight + y = x * rsqrt(mean(x^2) + eps) * (weight_offset + weight) Input: x: [T, H], fp16/bf16/fp32 CUDA tensor weight: [H], fp16/bf16/fp32 CUDA tensor mask: [T], bool CUDA tensor eps: float + weight_offset: float, added to weight in fp32 inside the kernel. + 1.0 selects the zero-centred (1 + w) convention. Output: y: [T, H] @@ -64,10 +66,11 @@ def forward(ctx, x, weight, mask=None, eps=1e-6): assert mask.dim() == 1, "mask must be [T]" assert mask.shape[0] == x.shape[0], "mask length mismatch" - y, rstd = _C.rmsnorm_forward(x, weight, float(eps)) + y, rstd = _C.rmsnorm_forward(x, weight, float(eps), float(weight_offset)) ctx.save_for_backward(x, weight, rstd, mask) ctx.eps = eps + ctx.weight_offset = float(weight_offset) return y @@ -81,7 +84,7 @@ def backward(ctx, grad_out): x, weight, rstd, mask = ctx.saved_tensors dy = grad_out.contiguous() - dx = _C.rmsnorm_backward_dx(dy, x, weight, rstd) + dx = _C.rmsnorm_backward_dx(dy, x, weight, rstd, ctx.weight_offset) # The shape-independent FP32 left fold preserves the C2 Batch/Chunk # reduction order while the CUDA reducer executes it in one launch. @@ -101,16 +104,18 @@ def backward(ctx, grad_out): family="cuda", ) - return dx, dw, None, None + # dw is unchanged by the offset: d/dw (offset + w) == d/dw w. + return dx, dw, None, None, None -def rmsnorm_cuda(x, weight, eps=1e-6, mask=None): +def rmsnorm_cuda(x, weight, eps=1e-6, mask=None, weight_offset=0.0): """ use: y = rmsnorm_cuda(x, weight) y = rmsnorm_cuda(x, weight, mask=mask) + y = rmsnorm_cuda(x, weight, weight_offset=1.0) # zero-centred weight """ - return RMSNormCuda.apply(x, weight, mask, eps) + return RMSNormCuda.apply(x, weight, mask, eps, weight_offset) class RMSNormCudaOp: @@ -124,6 +129,9 @@ def __init__(self) -> None: "rmsnorm_forward", "rmsnorm_backward_dx", ) + #: Added to the weight in fp32 inside the kernel. Subclasses override it; + #: 0.0 is the plain convention. + weight_offset = 0.0 def __call__(self, x, weight, *, eps=1e-6): return self.forward(x, weight, eps=eps) @@ -131,7 +139,9 @@ def __call__(self, x, weight, *, eps=1e-6): def forward(self, x, weight, *, eps=1e-6): hidden = x.shape[-1] x_2d = x.contiguous().view(-1, hidden) - y_2d = rmsnorm_cuda(x_2d, weight.contiguous(), eps=eps) + y_2d = rmsnorm_cuda( + x_2d, weight.contiguous(), eps=eps, weight_offset=self.weight_offset + ) return y_2d.view_as(x) def parameter_vjp_contributions_fp32(self, *, x, weight, grad_output, eps=1e-6): @@ -140,3 +150,14 @@ def parameter_vjp_contributions_fp32(self, *, x, weight, grad_output, eps=1e-6): rstd = torch.rsqrt(x32.square().mean(dim=-1) + float(eps)) rows = grad_output.float() * x32 * rstd.unsqueeze(-1) return {"weight": rows} + + +class Qwen3NextRMSNormCudaOp(RMSNormCudaOp): + """Zero-centred CUDA RMSNorm: ``y = x * rstd * (1 + weight)``. + + The decoder and final norms of Qwen3-Next (and Gemma) store a zero-centred + weight. The ``+1`` is applied inside the kernel after the fp32 upcast, so it + is never rounded through the low-precision weight dtype. + """ + + weight_offset = 1.0 diff --git a/rl_engine/kernels/ops/pytorch/norm/qwen3_next_rms_norm.py b/rl_engine/kernels/ops/pytorch/norm/qwen3_next_rms_norm.py new file mode 100644 index 000000000..5261245d0 --- /dev/null +++ b/rl_engine/kernels/ops/pytorch/norm/qwen3_next_rms_norm.py @@ -0,0 +1,198 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Qwen3-Next RMSNorm references (WS1 ground truth for RFC #428 C1). + +Qwen3-Next ships two RMSNorm conventions that differ both in how the weight is +applied and in where the dtype casts sit. They are kept as separate operators +because the cast order is part of the contract, not a flag: + +``Qwen3NextRMSNorm`` (decoder / final norm) + normalize in fp32, scale by ``(1 + weight)`` in fp32, cast once at the end. + The stored weight is zero-centred, so the ``1 +`` offset MUST be applied + after the fp32 upcast -- folding it into a bf16 weight first rounds the + offset and silently breaks the bitwise claim. + +``Qwen3NextRMSNormGated`` (inside the Gated DeltaNet block) + normalize in fp32, scale by a plain (non zero-centred) weight, then gate by + ``silu(gate)``. Where the weight multiply happens is NOT agreed upstream -- + see below -- so it is an explicit part of the operator identity here. + +Divergence at the gated-norm boundary (measured) +------------------------------------------------- +``transformers`` and vLLM do not agree on the gated variant: + +* vLLM (``RMSNormGated``, both ``forward_native`` and the FLA Triton + ``forward_cuda``) keeps the normalized value in fp32 for the weight multiply. +* ``transformers`` (``Qwen3NextRMSNormGated``) casts the normalized value back + to the input dtype *before* the weight multiply. + +On B200 / bf16 / ``head_v_dim=128`` these differ in 35% of elements with +``max|diff| = 6.25e-2``; swapping only the cast order reproduces the gap +(``5.3e-2``), so the cast order -- not the reduction order -- dominates. Because +RFC #428 claims L2 exactness against **vLLM rollout**, the fp32 multiply is the +strict default; the transformers convention is kept as a named witness so the +divergence stays testable instead of being silently picked. + +What "agrees with vLLM" means here, precisely +---------------------------------------------- +Only the *convention* is reproduced, not the bits. vLLM's own two paths are not +bitwise equal to each other: over 40 seeds (bf16, ``head_v_dim=128``, 512 rows), +``forward_native`` and ``forward_cuda`` disagreed on 21, worst +``max|diff| = 1.56e-2``. Against this operator the figures were 6/40 and 18/40. +So "bitwise equal to vLLM" is undefined until a single provider is named, and +this operator does not claim it -- see the reduction-order note below. + +Both reuse :func:`shape_invariant_rstd` so the reduction order -- and hence the +result -- never depends on the batch layout (RFC #428 section 6, item 2). The +reduction order therefore deliberately differs from upstream's ``mean(-1)``; +what is reproduced exactly is the weight convention and the cast order. + +Why the chunked reduction is kept on CUDA too +--------------------------------------------- +:func:`shape_invariant_rstd` was introduced for NPU, where ``mean``/``sum`` pick +shape-dependent kernels. Measured on B200 (sm_100) it is needed on CUDA as well: +over 20 seeds at ``H=2048`` in bf16 -- Qwen3-Next's own ``hidden_size`` and dtype +-- a plain ``mean(-1)`` broke slice invariance (``rstd(x[3:5]) != rstd(x)[3:5]``) +on 1 of 20, while the chunked reduction broke on 0 of 20. Failures were also seen +at ``H=5120`` in fp32. + +The cost is that the decoder norm is NOT bitwise equal to stock vLLM: 7 elements +of 1048576 differ (``max|diff| = 1.56e-2``, bf16, H=2048). That gap is inherent -- +matching stock vLLM bitwise would mean adopting a reduction that is itself not +batch-invariant, i.e. trading L1 for L2. These operators therefore claim L0 and L1 +only; an L2 claim needs the strict provider on both sides, per RFC #428 section 1, +item 1. +""" + +from __future__ import annotations + +import torch +import torch.nn.functional as F + +from rl_engine.kernels.ops.pytorch.norm.rms_norm import ( + NativeRMSNormOp, + check_norm_weight, + shape_invariant_rstd, +) + +__all__ = [ + "Qwen3NextRMSNormOp", + "Qwen3NextRMSNormGatedOp", + "Qwen3NextRMSNormGatedHFOp", +] + + +class Qwen3NextRMSNormOp(NativeRMSNormOp): + """Zero-centred RMSNorm: ``out = x * rstd * (1 + weight)``. + + Only the weight convention differs from :class:`NativeRMSNormOp`, so that is + all this overrides. The base applies the offset in fp32, after the upcast, + which is what ``transformers`` and vLLM both do -- folding ``1 +`` into a + bf16 weight beforehand would round the offset away. + """ + + weight_offset = 1.0 + + +class Qwen3NextRMSNormGatedOp: + """Gated RMSNorm used by the Gated DeltaNet block (vLLM/strict convention). + + ``out = (x * rstd * weight) * silu(gate)``, with every multiply in fp32 and + a single cast on the way out. This is the convention vLLM's ``RMSNormGated`` + uses with ``norm_before_gate=True``, which is what the RFC #428 L2 claim is + measured against. + + Not a subclass of the plain op: it takes an extra tensor and its epilogue + differs, so it is not a drop-in substitute for one. + + The weight is plain, NOT zero-centred -- upstream initializes it to ones. + """ + + def __call__( + self, + x: torch.Tensor, + weight: torch.Tensor, + gate: torch.Tensor, + *, + eps: float = 1e-6, + ) -> torch.Tensor: + return self.forward(x, weight, gate, eps=eps) + + def forward( + self, + x: torch.Tensor, + weight: torch.Tensor, + gate: torch.Tensor, + *, + eps: float = 1e-6, + ) -> torch.Tensor: + return self._rms_norm_gated(x, weight, gate, eps=eps, output_dtype=x.dtype) + + def forward_fp32( + self, + x: torch.Tensor, + weight: torch.Tensor, + gate: torch.Tensor, + *, + eps: float = 1e-6, + ) -> torch.Tensor: + """Ground-truth: fp32 in, fp32 out.""" + return self._rms_norm_gated(x, weight, gate, eps=eps, output_dtype=torch.float32) + + # ------------------------------------------------------------------ # + # Shared by both conventions; only `_scale_by_weight` differs. + # ------------------------------------------------------------------ # + @staticmethod + def _normalized( + x: torch.Tensor, weight: torch.Tensor, gate: torch.Tensor, *, eps: float + ) -> torch.Tensor: + check_norm_weight(x, weight) + if gate.shape != x.shape: + raise ValueError( + f"gate must match x, got tuple(gate.shape)={tuple(gate.shape)} " + f"vs tuple(x.shape)={tuple(x.shape)}" + ) + x_f = x.float() + rstd = shape_invariant_rstd(x_f, float(eps)).unsqueeze(-1) + return x_f * rstd + + @staticmethod + def _scale_by_weight( + normed: torch.Tensor, weight: torch.Tensor, input_dtype: torch.dtype + ) -> torch.Tensor: + """vLLM: the weight multiply stays in fp32.""" + del input_dtype + return normed * weight.float() + + @classmethod + def _rms_norm_gated( + cls, + x: torch.Tensor, + weight: torch.Tensor, + gate: torch.Tensor, + *, + eps: float, + output_dtype: torch.dtype, + ) -> torch.Tensor: + normed = cls._normalized(x, weight, gate, eps=eps) + scaled = cls._scale_by_weight(normed, weight, x.dtype) + # The gate activation is evaluated in fp32 and promotes the product. + gated = scaled * F.silu(gate.float()) + return gated.to(output_dtype) + + +class Qwen3NextRMSNormGatedHFOp(Qwen3NextRMSNormGatedOp): + """``transformers`` gated convention: weight multiply in the input dtype. + + Kept so the HF-vs-vLLM divergence documented in the module docstring stays + covered by a test rather than discovered in a drift report. Do NOT use this + for an L2 claim against vLLM rollout. + """ + + @staticmethod + def _scale_by_weight( + normed: torch.Tensor, weight: torch.Tensor, input_dtype: torch.dtype + ) -> torch.Tensor: + """transformers: round-trip through the input dtype first.""" + return weight * normed.to(input_dtype) diff --git a/rl_engine/kernels/ops/pytorch/norm/rms_norm.py b/rl_engine/kernels/ops/pytorch/norm/rms_norm.py index 135556c3c..66d4723fa 100644 --- a/rl_engine/kernels/ops/pytorch/norm/rms_norm.py +++ b/rl_engine/kernels/ops/pytorch/norm/rms_norm.py @@ -86,6 +86,15 @@ def strict_add_rms_norm( return _strict_add_rms_norm(x, residual, weight, eps) +def check_norm_weight(x: torch.Tensor, weight: torch.Tensor) -> None: + """Shared shape guard for the RMSNorm family (plain, zero-centred, gated).""" + if weight.dim() != 1 or weight.shape[0] != x.shape[-1]: + raise ValueError( + f"weight must be 1-D of size x.shape[-1]={x.shape[-1]}, " + f"got tuple(weight.shape)={tuple(weight.shape)}" + ) + + def shape_invariant_rstd(x_f: torch.Tensor, eps: float) -> torch.Tensor: """Shape-invariant per-row rstd (the shared RMSNorm statistic). @@ -113,6 +122,10 @@ class NativeRMSNormOp: out = x * rsqrt(mean(x^2, dim=-1) + eps) * weight """ + #: Added to the weight in fp32 before it scales the normalized value. + #: Subclasses set 1.0 for the zero-centred ``(1 + w)`` convention. + weight_offset = 0.0 + def __init__(self) -> None: pass @@ -151,21 +164,24 @@ def forward_fp32( # ------------------------------------------------------------------ # # Helpers # ------------------------------------------------------------------ # - @staticmethod + @classmethod def _rms_norm( + cls, x: torch.Tensor, weight: torch.Tensor, *, eps: float, output_dtype: torch.dtype, ) -> torch.Tensor: - if weight.dim() != 1 or weight.shape[0] != x.shape[-1]: - raise ValueError( - f"weight must be 1-D of size x.shape[-1]={x.shape[-1]}, " - f"got tuple(weight.shape)={tuple(weight.shape)}" - ) + check_norm_weight(x, weight) x_f = x.float() rstd = shape_invariant_rstd(x_f, float(eps)).unsqueeze(-1) normed = x_f * rstd - out = normed * weight.float() + scale = weight.float() + # Guarded rather than unconditional: `0.0 + w` rewrites -0.0 to +0.0, + # which torch.equal does not notice but a bitwise comparison does. The + # plain path must stay bit-for-bit what it was. + if cls.weight_offset: + scale = cls.weight_offset + scale + out = normed * scale return out.to(output_dtype) diff --git a/tests/check_qwen3_next_norm_providers.py b/tests/check_qwen3_next_norm_providers.py new file mode 100644 index 000000000..062052cfa --- /dev/null +++ b/tests/check_qwen3_next_norm_providers.py @@ -0,0 +1,232 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Which vLLM gated-RMSNorm path is the strict provider, and how far apart are they. + +Named ``check_`` rather than ``test_`` on purpose, following +``tests/distributed/check_*.py``: this module imports real vLLM, and +``tests/test_framework_operator_integrations.py`` asserts that ``vllm`` is absent +from ``sys.modules`` -- an invariant any collected test importing vLLM would break +for the whole session. Run it explicitly: + + pytest tests/check_qwen3_next_norm_providers.py -v + +RFC #428 section 2.1 defines L2 as "bitwise identical to vLLM rollout". For +Qwen3-Next's GDN gated norm that phrase is not well defined until a single +provider is named, because vLLM ships several and they do not agree bitwise with +each other. + +This module pins two things so a vLLM upgrade cannot move them silently: + +1. **Dispatch facts** -- which provider actually runs, asserted on the env + defaults and the registered ops rather than inferred from reading one branch. +2. **The size of the gap** -- a seed sweep that asserts an upper bound on the + disagreement and on the mismatch rate. It deliberately does NOT assert + equality; the point is to keep the number honest, not to pretend it is zero. + +Measured on 2x B200 (sm_100, torch 2.13.0+cu130, vllm 0.30.0), bf16, +``head_v_dim=128``, 512 rows, 40 seeds: + +=============================== ================== ================ +comparison seeds not bitwise worst max|diff| +=============================== ================== ================ +ours vs ``forward_native`` 6 / 40 1.56e-2 +ours vs ``forward_cuda`` 18 / 40 3.91e-3 +``forward_native`` vs ``cuda`` 21 / 40 1.56e-2 +=============================== ================== ================ +""" + +from __future__ import annotations + +import pytest +import torch + +from rl_engine.kernels.ops.pytorch.norm.qwen3_next_rms_norm import Qwen3NextRMSNormGatedOp + +# vLLM is imported inside the checks, never at module scope, so that merely +# collecting this file does not pull it into sys.modules. + +pytestmark = pytest.mark.skipif(not torch.cuda.is_available(), reason="CUDA is required") + +# Qwen3-Next-80B-A3B-Instruct: linear_value_head_dim / rms_norm_eps. +_HEAD_V_DIM = 128 +_EPS = 1e-6 +_ROWS = 512 +_SEEDS = 40 + +# The gated norm is constructed by vLLM's GDN block with exactly these settings; +# see vllm/model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py. +_NORM_BEFORE_GATE = True +_GROUP_SIZE = None +_ACTIVATION = "silu" + + +@pytest.fixture(scope="module") +def vllm_config_ctx(): + """`RMSNormGated` is a CustomOp and refuses to build outside a config context.""" + pytest.importorskip("vllm", reason="vLLM is required to identify the provider") + from vllm.config import VllmConfig, set_current_vllm_config + + with set_current_vllm_config(VllmConfig()): + yield + + +def _make_norm(): + from vllm.model_executor.layers.layernorm import RMSNormGated + + return RMSNormGated( + _HEAD_V_DIM, + eps=_EPS, + group_size=_GROUP_SIZE, + norm_before_gate=_NORM_BEFORE_GATE, + activation=_ACTIVATION, + ) + + +def _inputs(seed: int, dtype: torch.dtype, rows: int = _ROWS): + g = torch.Generator(device="cuda").manual_seed(seed) + x = torch.randn(rows, _HEAD_V_DIM, device="cuda", dtype=dtype, generator=g) + gate = torch.randn(rows, _HEAD_V_DIM, device="cuda", dtype=dtype, generator=g) + weight = torch.randn(_HEAD_V_DIM, device="cuda", dtype=dtype, generator=g) + return x, gate, weight + + +def _disagreement(a: torch.Tensor, b: torch.Tensor) -> tuple[float, float]: + """(worst absolute difference, fraction of elements that differ bitwise).""" + bits_a = a.float().view(torch.int32) + bits_b = b.float().view(torch.int32) + mismatch = int((bits_a != bits_b).sum()) + worst = (a.float() - b.float()).abs().max().item() + return worst, mismatch / a.numel() + + +# --------------------------------------------------------------------------- # +# 1. Dispatch facts -- which provider actually runs +# --------------------------------------------------------------------------- # +def test_custom_op_has_distinct_native_and_cuda_paths(vllm_config_ctx): + """`forward_native` is a reference; `forward_cuda` is what CustomOp dispatches.""" + norm = _make_norm() + assert type(norm).forward_cuda is not type(norm).forward_native + + +def test_gdn_decode_provider_env_defaults_are_recorded(): + """Pin the env defaults that decide which GDN decode kernel runs. + + These are what make ``fused_recurrent_gated_delta_rule_packed_decode`` (not + ``fused_sigmoid_gating_delta_rule_update``) the rollout decode path. If a + vLLM bump flips either default, the provider identity behind any L2 claim + changes, so this must fail loudly rather than drift. + """ + pytest.importorskip("vllm", reason="vLLM is required to identify the provider") + import vllm.envs as envs + + observed = { + "VLLM_GDN_DECODE_KERNEL": envs.VLLM_GDN_DECODE_KERNEL.strip().lower(), + "VLLM_ENABLE_FLA_PACKED_RECURRENT_DECODE": bool( + envs.VLLM_ENABLE_FLA_PACKED_RECURRENT_DECODE + ), + } + assert observed == { + "VLLM_GDN_DECODE_KERNEL": "cuda", + "VLLM_ENABLE_FLA_PACKED_RECURRENT_DECODE": True, + }, ( + f"GDN decode provider defaults changed: {observed}. Re-derive which kernel " + "the rollout decode path takes before relying on any exactness claim." + ) + + +# --------------------------------------------------------------------------- # +# 2. The gap, bounded -- never asserted to be zero +# --------------------------------------------------------------------------- # +@pytest.mark.parametrize( + "dtype, max_abs, max_mismatch_rate", + [ + # bf16 rounding absorbs most of the reduction-tree difference, so few + # elements move -- but each that does moves by a whole bf16 ULP. + (torch.bfloat16, 2e-2, 0.05), + # fp32 has nothing to absorb it: ~36% of elements differ, every one of + # them by an fp32 ULP. Bounding the rate here would be measuring the + # wrong thing; the magnitude is what says the two agree semantically. + (torch.float32, 1e-5, 1.0), + ], +) +def test_vllm_paths_disagree_only_within_bounds(vllm_config_ctx, dtype, max_abs, max_mismatch_rate): + """vLLM's own two paths differ; bound how much. + + A growing magnitude means the reduction trees have diverged semantically, + which would invalidate treating either as the reference. A high mismatch + *rate* at ULP magnitude does not -- it just means the tree shapes differ. + """ + norm = _make_norm().to("cuda", dtype) + worst_abs, worst_rate, differing = 0.0, 0.0, 0 + for seed in range(_SEEDS): + x, gate, weight = _inputs(seed, dtype) + norm.weight.data = weight.clone() + native = norm.forward_native(x, gate) + cuda = norm.forward_cuda(x, gate) + abs_d, rate = _disagreement(native, cuda) + worst_abs, worst_rate = max(worst_abs, abs_d), max(worst_rate, rate) + differing += int(rate > 0.0) + + assert worst_abs <= max_abs, ( + f"vLLM forward_native vs forward_cuda worst |diff| {worst_abs:.3e} exceeds " + f"{max_abs:.3e} over {_SEEDS} seeds ({differing} seeds differ)" + ) + assert worst_rate <= max_mismatch_rate + + +@pytest.mark.parametrize("path", ["forward_native", "forward_cuda"]) +def test_ours_tracks_each_vllm_path_within_bounds(vllm_config_ctx, path): + """Our strict op follows vLLM's convention; bound the residual. + + Not an equality assertion. We reproduce the fp32 weight multiply and the + single trailing cast, but our reduction is the repo's fixed 32-wide chunked + sum rather than whatever tree the provider uses, so a few elements straddle + a rounding boundary. + """ + dtype = torch.bfloat16 + ours = Qwen3NextRMSNormGatedOp() + norm = _make_norm().to("cuda", dtype) + + worst_abs, worst_rate = 0.0, 0.0 + for seed in range(_SEEDS): + x, gate, weight = _inputs(seed, dtype) + norm.weight.data = weight.clone() + reference = getattr(norm, path)(x, gate) + abs_d, rate = _disagreement(ours.forward(x, weight, gate), reference) + worst_abs, worst_rate = max(worst_abs, abs_d), max(worst_rate, rate) + + assert worst_abs <= 2e-2, f"worst |diff| vs {path} was {worst_abs:.3e}" + assert worst_rate <= 0.05, f"mismatch rate vs {path} was {worst_rate:.3%}" + + +# --------------------------------------------------------------------------- # +# 3. Batch invariance -- the property we DO claim +# --------------------------------------------------------------------------- # +@pytest.mark.parametrize("path", ["forward_native", "forward_cuda"]) +def test_vllm_gated_norm_is_batch_invariant(vllm_config_ctx, path): + """If this ever fails, vLLM stops being a coherent L2 target. + + Kept as a guard rather than a claim about our code: a provider whose output + depends on unrelated rows cannot anchor a bitwise contract. + """ + dtype = torch.bfloat16 + norm = _make_norm().to("cuda", dtype) + for seed in range(8): + x, gate, weight = _inputs(seed, dtype) + norm.weight.data = weight.clone() + full = getattr(norm, path)(x, gate) + for n in (1, 2, 8, 16, 32, 48, 64, 256): + sliced = getattr(norm, path)(x[:n], gate[:n]) + assert torch.equal(sliced, full[:n]), f"{path} seed={seed} n={n}" + + +def test_our_gated_op_is_batch_invariant(): + """The L1 claim for this operator, bitwise.""" + dtype = torch.bfloat16 + ours = Qwen3NextRMSNormGatedOp() + for seed in range(8): + x, gate, weight = _inputs(seed, dtype) + full = ours.forward(x, weight, gate) + for n in (1, 2, 8, 16, 32, 48, 64, 256): + assert torch.equal(ours.forward(x[:n], weight, gate[:n]), full[:n]) diff --git a/tests/test_qwen3_next_norm.py b/tests/test_qwen3_next_norm.py new file mode 100644 index 000000000..c66bf2ba7 --- /dev/null +++ b/tests/test_qwen3_next_norm.py @@ -0,0 +1,502 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""WS1 C1 (RFC #428): Qwen3-Next RMSNorm conventions and batch invariance. + +Claim levels exercised here (RFC #428 section 2.1): + * L0 repeatable -- identical inputs reproduce bitwise identical outputs. + * L1 batch-invariant -- a row is unaffected by unrelated rows, padding or order. + +L2 (train-rollout exact against vLLM) is NOT claimed by this file; it needs the +rollout engine on the other side. + +The reduction order here is the repo's fixed 32-wide chunked reduction, which +differs from upstream's ``mean(-1)``. What is reproduced exactly is the weight +convention and the cast order, so comparisons against the upstream formula are +tolerance based while the invariance assertions are bitwise. +""" + +from __future__ import annotations + +import pytest +import torch +import torch.nn.functional as F + +from rl_engine.kernels.ops.pytorch.norm.qwen3_next_rms_norm import ( + Qwen3NextRMSNormGatedHFOp, + Qwen3NextRMSNormGatedOp, + Qwen3NextRMSNormOp, +) + +# Qwen3-Next-80B-A3B-Instruct config.json +_HIDDEN = 2048 # hidden_size +_HEAD_V_DIM = 128 # linear_value_head_dim -- the gated norm width +_EPS = 1e-6 # rms_norm_eps + + +def _rand(shape, seed): + g = torch.Generator().manual_seed(seed) + return torch.randn(*shape, generator=g, dtype=torch.float32) + + +# --------------------------------------------------------------------------- # +# Upstream formulas, transcribed from transformers/models/qwen3_next. +# These pin the exact semantics; they are deliberately verbatim. +# --------------------------------------------------------------------------- # +def _hf_rms_norm(x, weight, eps=_EPS): + output = x.float() * torch.rsqrt(x.float().pow(2).mean(-1, keepdim=True) + eps) + output = output * (1.0 + weight.float()) + return output.type_as(x) + + +def _vllm_rms_norm_gated(x, weight, gate, eps=_EPS): + """vLLM ``RMSNormGated.forward_static`` with ``norm_before_gate=True``.""" + orig_dtype = x.dtype + x, weight, z = x.float(), weight.float(), gate.float() + variance = x.pow(2).mean(dim=-1, keepdim=True) + out = (x * torch.rsqrt(variance + eps)) * weight + out = out * F.silu(z) + return out.to(orig_dtype) + + +def _hf_rms_norm_gated(x, weight, gate, eps=_EPS): + input_dtype = x.dtype + h = x.to(torch.float32) + variance = h.pow(2).mean(-1, keepdim=True) + h = h * torch.rsqrt(variance + eps) + h = weight * h.to(input_dtype) + h = h * F.silu(gate.to(torch.float32)) + return h.to(input_dtype) + + +# --------------------------------------------------------------------------- # +# 1. The zero-centred (1 + w) convention +# --------------------------------------------------------------------------- # +def test_zero_weight_is_identity_scaling(): + """weight == 0 must leave the normalized value untouched, bitwise. + + This is what separates the zero-centred convention from the plain one: a + plain RMSNorm returns all zeros for a zero weight, this one returns the + bare normalized value. + """ + from rl_engine.kernels.ops.pytorch.norm.rms_norm import ( + NativeRMSNormOp, + shape_invariant_rstd, + ) + + x = _rand((4, _HIDDEN), seed=0) + zeros = torch.zeros(_HIDDEN) + + x_f = x.float() + bare = x_f * shape_invariant_rstd(x_f, _EPS).unsqueeze(-1) + assert torch.equal(Qwen3NextRMSNormOp().forward_fp32(x, zeros, eps=_EPS), bare) + + # ... and the plain convention really does differ here. + assert torch.equal( + NativeRMSNormOp().forward_fp32(x, zeros, eps=_EPS), torch.zeros_like(bare) + ) + + +def test_weight_offset_is_one(): + """w and w+1 scaling relationship: out(w) == norm * (1 + w).""" + op = Qwen3NextRMSNormOp() + x = _rand((2, _HEAD_V_DIM), seed=1) + unit = op.forward_fp32(x, torch.zeros(_HEAD_V_DIM)) # scale = 1 + doubled = op.forward_fp32(x, torch.ones(_HEAD_V_DIM)) # scale = 2 + torch.testing.assert_close(doubled, 2.0 * unit, atol=1e-6, rtol=1e-6) + + +def test_offset_applied_in_fp32_not_folded_into_bf16(): + """The 1 + w offset must not be pre-rounded through bf16. + + A weight one bf16 ULP below zero stays distinguishable from exactly zero + once the offset is added in fp32; folding (1 + w) into bf16 first would + collapse both to 1.0 and lose the difference. + """ + op = Qwen3NextRMSNormOp() + x = _rand((2, _HEAD_V_DIM), seed=2) + tiny = torch.full((_HEAD_V_DIM,), -(2**-9), dtype=torch.bfloat16) + folded = (1.0 + tiny.float()).bfloat16() # the wrong way + assert not torch.equal( + op.forward_fp32(x, tiny), + op.forward_fp32(x, folded - 1.0), + ) + + +# --------------------------------------------------------------------------- # +# 2. L1 -- batch invariance, bitwise +# --------------------------------------------------------------------------- # +@pytest.mark.parametrize("hidden", [_HIDDEN, _HEAD_V_DIM]) +def test_batch_invariance_slice(hidden): + op = Qwen3NextRMSNormOp() + w, x = _rand((hidden,), seed=3), _rand((8, 32, hidden), seed=4) + full = op.forward_fp32(x, w) + assert torch.equal(op.forward_fp32(x[:1], w), full[:1]) + assert torch.equal(op.forward_fp32(x[3:5], w), full[3:5]) + + +@pytest.mark.parametrize("batch", [1, 2, 8, 16, 32, 48, 64]) +def test_batch_invariance_across_concurrency(batch): + """RFC #428 section 10: batch size / concurrency axis 1..64.""" + op = Qwen3NextRMSNormOp() + w = _rand((_HIDDEN,), seed=5) + target = _rand((1, _HIDDEN), seed=6) + others = _rand((batch - 1, _HIDDEN), seed=7) if batch > 1 else None + alone = op.forward_fp32(target, w) + for position in ("first", "last"): + if others is None: + batched, index = target, 0 + elif position == "first": + batched, index = torch.cat([target, others]), 0 + else: + batched, index = torch.cat([others, target]), batch - 1 + assert torch.equal(op.forward_fp32(batched, w)[index : index + 1], alone) + + +def test_batch_invariance_with_padding(): + op = Qwen3NextRMSNormOp() + w = _rand((_HIDDEN,), seed=8) + x = _rand((4, _HIDDEN), seed=9) + padded = torch.cat([x, _rand((6, _HIDDEN), seed=10)], dim=0) + assert torch.equal(op.forward_fp32(padded, w)[:4], op.forward_fp32(x, w)) + + +def test_gated_batch_invariance_slice(): + op = Qwen3NextRMSNormGatedOp() + w = _rand((_HEAD_V_DIM,), seed=11) + x = _rand((8, 32, _HEAD_V_DIM), seed=12) + gate = _rand((8, 32, _HEAD_V_DIM), seed=13) + full = op.forward_fp32(x, w, gate) + assert torch.equal(op.forward_fp32(x[:1], w, gate[:1]), full[:1]) + assert torch.equal(op.forward_fp32(x[3:5], w, gate[3:5]), full[3:5]) + + +# --------------------------------------------------------------------------- # +# 2b. The fixed-order reduction is what buys invariance -- on CUDA too +# --------------------------------------------------------------------------- # +@pytest.mark.skipif(not torch.cuda.is_available(), reason="CUDA is required") +@pytest.mark.parametrize("hidden", [_HIDDEN, _HEAD_V_DIM]) +def test_chunked_reduction_is_slice_invariant_on_device(hidden): + """The rstd statistic must be slice-invariant on the accelerator, every seed. + + Measured counterpoint on B200/bf16/H=2048: a plain ``mean(-1)`` broke this on + 1 of 20 seeds. We assert only the property we rely on -- asserting that torch's + ``mean`` is broken would be a brittle test of someone else's kernel. + """ + from rl_engine.kernels.ops.pytorch.norm.rms_norm import shape_invariant_rstd + + for seed in range(20): + g = torch.Generator(device="cuda").manual_seed(seed) + x = torch.randn(64, hidden, device="cuda", dtype=torch.bfloat16, generator=g) + full = shape_invariant_rstd(x.float(), _EPS) + assert torch.equal(shape_invariant_rstd(x[3:5].float(), _EPS), full[3:5]), seed + assert torch.equal(shape_invariant_rstd(x[:1].float(), _EPS), full[:1]), seed + + +@pytest.mark.skipif(not torch.cuda.is_available(), reason="CUDA is required") +def test_op_batch_invariance_on_device(): + """L1 for the op itself, on the accelerator, in the model's dtype.""" + op = Qwen3NextRMSNormOp() + g = torch.Generator(device="cuda").manual_seed(0) + x = torch.randn(64, _HIDDEN, device="cuda", dtype=torch.bfloat16, generator=g) + w = torch.randn(_HIDDEN, device="cuda", dtype=torch.bfloat16, generator=g) + full = op.forward(x, w) + for n in (1, 2, 8, 16, 32, 48, 64): + assert torch.equal(op.forward(x[:n], w), full[:n]), n + + +# --------------------------------------------------------------------------- # +# 3. L0 -- repeatable +# --------------------------------------------------------------------------- # +def test_deterministic_repeat(): + op = Qwen3NextRMSNormOp() + x, w = _rand((64, _HIDDEN), seed=14), _rand((_HIDDEN,), seed=15) + first = op.forward_fp32(x, w) + for _ in range(10): + assert torch.equal(op.forward_fp32(x, w), first) + + +# --------------------------------------------------------------------------- # +# 4. Agreement with the upstream formula (tolerance, not bitwise: the reduction +# order differs by design) +# --------------------------------------------------------------------------- # +@pytest.mark.parametrize("hidden", [_HIDDEN, _HEAD_V_DIM]) +def test_matches_upstream_formula_fp32(hidden): + op = Qwen3NextRMSNormOp() + x, w = _rand((4, 16, hidden), seed=16), _rand((hidden,), seed=17) + torch.testing.assert_close(op.forward_fp32(x, w), _hf_rms_norm(x, w), atol=1e-6, rtol=1e-6) + + +def test_gated_strict_matches_vllm_formula_fp32(): + """The strict gated op follows vLLM, which is what the L2 claim targets.""" + op = Qwen3NextRMSNormGatedOp() + x = _rand((4, 16, _HEAD_V_DIM), seed=18) + w = _rand((_HEAD_V_DIM,), seed=19) + gate = _rand((4, 16, _HEAD_V_DIM), seed=20) + torch.testing.assert_close( + op.forward_fp32(x, w, gate), + _vllm_rms_norm_gated(x, w, gate), + atol=1e-6, + rtol=1e-6, + ) + + +def test_gated_hf_witness_matches_hf_formula_fp32(): + op = Qwen3NextRMSNormGatedHFOp() + x = _rand((4, 16, _HEAD_V_DIM), seed=18) + w = _rand((_HEAD_V_DIM,), seed=19) + gate = _rand((4, 16, _HEAD_V_DIM), seed=20) + torch.testing.assert_close( + op.forward_fp32(x, w, gate), + _hf_rms_norm_gated(x, w, gate), + atol=1e-6, + rtol=1e-6, + ) + + +def test_gated_conventions_diverge_in_low_precision(): + """Pin the HF-vs-vLLM gated divergence (RFC #428 first-divergence boundary). + + With fp32 inputs the two conventions coincide, because the HF round-trip is + an identity. In bf16 they do not, and the gap is far larger than a ULP: this + is why the convention is part of the operator identity and not a detail. + """ + strict, witness = Qwen3NextRMSNormGatedOp(), Qwen3NextRMSNormGatedHFOp() + x = _rand((64, _HEAD_V_DIM), seed=33).bfloat16() + w = _rand((_HEAD_V_DIM,), seed=34).bfloat16() + gate = _rand((64, _HEAD_V_DIM), seed=35).bfloat16() + + a, b = strict.forward(x, w, gate), witness.forward(x, w, gate) + assert not torch.equal(a, b), "the two gated conventions must be distinguishable" + assert (a.float() - b.float()).abs().max() > 1e-3 + + # ... and in fp32 the round-trip vanishes, so they agree bitwise. + xf, wf, gf = x.float(), w.float(), gate.float() + assert torch.equal(strict.forward(xf, wf, gf), witness.forward(xf, wf, gf)) + + +@pytest.mark.parametrize("dtype", [torch.bfloat16, torch.float16]) +def test_matches_upstream_formula_low_precision(dtype): + op = Qwen3NextRMSNormOp() + x = _rand((4, 16, _HIDDEN), seed=21).to(dtype) + w = _rand((_HIDDEN,), seed=22).to(dtype) + got, ref = op.forward(x, w), _hf_rms_norm(x, w) + assert got.dtype == ref.dtype == dtype + torch.testing.assert_close(got.float(), ref.float(), atol=2e-2, rtol=1.6e-2) + + +@pytest.mark.parametrize("dtype", [torch.bfloat16, torch.float16]) +def test_gated_hf_witness_low_precision(dtype): + """Covers the mid-computation cast back to the input dtype.""" + op = Qwen3NextRMSNormGatedHFOp() + x = _rand((4, 16, _HEAD_V_DIM), seed=23).to(dtype) + w = _rand((_HEAD_V_DIM,), seed=24).to(dtype) + gate = _rand((4, 16, _HEAD_V_DIM), seed=25).to(dtype) + got, ref = op.forward(x, w, gate), _hf_rms_norm_gated(x, w, gate) + assert got.dtype == ref.dtype == dtype + torch.testing.assert_close(got.float(), ref.float(), atol=2e-2, rtol=1.6e-2) + + +@pytest.mark.parametrize("dtype", [torch.bfloat16, torch.float16]) +def test_gated_strict_low_precision(dtype): + op = Qwen3NextRMSNormGatedOp() + x = _rand((4, 16, _HEAD_V_DIM), seed=23).to(dtype) + w = _rand((_HEAD_V_DIM,), seed=24).to(dtype) + gate = _rand((4, 16, _HEAD_V_DIM), seed=25).to(dtype) + got, ref = op.forward(x, w, gate), _vllm_rms_norm_gated(x, w, gate) + assert got.dtype == ref.dtype == dtype + torch.testing.assert_close(got.float(), ref.float(), atol=2e-2, rtol=1.6e-2) + + +# --------------------------------------------------------------------------- # +# 5. dtype paths and guards +# --------------------------------------------------------------------------- # +@pytest.mark.parametrize("dtype", [torch.float32, torch.bfloat16, torch.float16]) +def test_dtype_paths(dtype): + op = Qwen3NextRMSNormOp() + x = _rand((2, 16, _HIDDEN), seed=26).to(dtype) + w = _rand((_HIDDEN,), seed=27).to(dtype) + assert op.forward(x, w).dtype == dtype + assert op.forward_fp32(x, w).dtype == torch.float32 + + +def test_eps_inside_sqrt(): + op = Qwen3NextRMSNormOp() + out = op.forward_fp32(torch.zeros(1, _HIDDEN), torch.zeros(_HIDDEN)) + assert torch.isfinite(out).all() + assert torch.equal(out, torch.zeros(1, _HIDDEN)) + + +def test_bad_weight_shape_raises(): + op = Qwen3NextRMSNormOp() + with pytest.raises(ValueError, match="weight must be 1-D"): + op.forward_fp32(_rand((2, _HIDDEN), seed=28), _rand((_HIDDEN - 1,), seed=29)) + + +def test_gated_shape_mismatch_raises(): + op = Qwen3NextRMSNormGatedOp() + x, w = _rand((2, _HEAD_V_DIM), seed=30), _rand((_HEAD_V_DIM,), seed=31) + with pytest.raises(ValueError, match="gate must match x"): + op.forward_fp32(x, w, _rand((3, _HEAD_V_DIM), seed=32)) + + +# --------------------------------------------------------------------------- # +# 6. CUDA kernel: the offset is applied in fp32 inside the kernel +# --------------------------------------------------------------------------- # +_CUDA_RMSNORM = False +if torch.cuda.is_available(): # pragma: no branch - probe only + try: + from rl_engine.kernels.ops.base import _C, _EXT_AVAILABLE + + _CUDA_RMSNORM = _EXT_AVAILABLE and hasattr(_C, "rmsnorm_forward") + except ImportError: # pragma: no cover + _CUDA_RMSNORM = False + +requires_cuda_rmsnorm = pytest.mark.skipif( + not _CUDA_RMSNORM, reason="CUDA RMSNorm extension is not available" +) + + +@requires_cuda_rmsnorm +def test_cuda_offset_equals_explicit_fp32_weight(): + """``weight_offset=1.0`` must equal passing an fp32 ``1 + w``, bitwise. + + This is the correctness proof for doing the offset inside the kernel: it is + the same arithmetic as the fp32 reference, not an approximation of it. + """ + from rl_engine.kernels.ops.cuda.norm.rmsnorm import rmsnorm_cuda + + torch.manual_seed(0) + x = torch.randn(512, _HIDDEN, device="cuda", dtype=torch.bfloat16) + w = torch.randn(_HIDDEN, device="cuda", dtype=torch.bfloat16) + + offset = rmsnorm_cuda(x, w, eps=_EPS, weight_offset=1.0) + explicit = rmsnorm_cuda(x, (1.0 + w.float()), eps=_EPS) + assert torch.equal(offset, explicit) + + +@requires_cuda_rmsnorm +def test_cuda_offset_is_not_folded_through_bfloat16(): + """Pre-rounding ``1 + w`` to bf16 must give a different answer. + + If this ever becomes equal, the offset has stopped being applied in fp32 and + the zero-centred contract is silently broken. + """ + from rl_engine.kernels.ops.cuda.norm.rmsnorm import rmsnorm_cuda + + torch.manual_seed(0) + x = torch.randn(512, _HIDDEN, device="cuda", dtype=torch.bfloat16) + w = torch.randn(_HIDDEN, device="cuda", dtype=torch.bfloat16) + + offset = rmsnorm_cuda(x, w, eps=_EPS, weight_offset=1.0) + folded = rmsnorm_cuda(x, (1.0 + w.float()).bfloat16(), eps=_EPS) + assert not torch.equal(offset, folded) + + +@requires_cuda_rmsnorm +def test_cuda_default_offset_preserves_plain_convention(): + """An unset offset must leave the existing kernel behaviour untouched.""" + from rl_engine.kernels.ops.cuda.norm.rmsnorm import RMSNormCudaOp, rmsnorm_cuda + + torch.manual_seed(0) + x = torch.randn(256, _HEAD_V_DIM, device="cuda", dtype=torch.bfloat16) + w = torch.randn(_HEAD_V_DIM, device="cuda", dtype=torch.bfloat16) + assert torch.equal(RMSNormCudaOp().forward(x, w, eps=_EPS), rmsnorm_cuda(x, w, eps=_EPS)) + + +@requires_cuda_rmsnorm +@pytest.mark.parametrize("batch", [1, 2, 8, 16, 32, 48, 64, 512]) +def test_cuda_zero_centred_batch_invariance(batch): + """L1 for the zero-centred CUDA op across the RFC #428 concurrency axis.""" + from rl_engine.kernels.ops.cuda.norm.rmsnorm import Qwen3NextRMSNormCudaOp + + op = Qwen3NextRMSNormCudaOp() + torch.manual_seed(0) + x = torch.randn(512, _HIDDEN, device="cuda", dtype=torch.bfloat16) + w = torch.randn(_HIDDEN, device="cuda", dtype=torch.bfloat16) + assert torch.equal(op.forward(x[:batch], w, eps=_EPS), op.forward(x, w, eps=_EPS)[:batch]) + + +@requires_cuda_rmsnorm +def test_cuda_zero_centred_within_tolerance_of_golden(): + from rl_engine.kernels.ops.cuda.norm.rmsnorm import Qwen3NextRMSNormCudaOp + + torch.manual_seed(0) + x = torch.randn(256, _HIDDEN, device="cuda", dtype=torch.bfloat16) + w = torch.randn(_HIDDEN, device="cuda", dtype=torch.bfloat16) + got = Qwen3NextRMSNormCudaOp().forward(x, w, eps=_EPS) + ref = Qwen3NextRMSNormOp().forward_fp32(x, w, eps=_EPS) + torch.testing.assert_close(got.float(), ref, atol=2e-2, rtol=1.6e-2) + + +@requires_cuda_rmsnorm +def test_cuda_zero_centred_backward_is_offset_aware(): + """dx must see (1 + w); dw is offset-independent since d/dw (1+w) == d/dw w.""" + from rl_engine.kernels.ops.cuda.norm.rmsnorm import rmsnorm_cuda + + torch.manual_seed(0) + x = torch.randn(128, _HEAD_V_DIM, device="cuda", dtype=torch.float32) + w = torch.randn(_HEAD_V_DIM, device="cuda", dtype=torch.float32) + dy = torch.randn(128, _HEAD_V_DIM, device="cuda", dtype=torch.float32) + + grads = {} + for name, off in (("plain", 0.0), ("zero_centred", 1.0)): + xg = x.clone().requires_grad_(True) + wg = w.clone().requires_grad_(True) + rmsnorm_cuda(xg, wg, eps=_EPS, weight_offset=off).backward(dy.clone()) + grads[name] = (xg.grad.clone(), wg.grad.clone()) + + assert torch.isfinite(grads["zero_centred"][0]).all() + assert not torch.equal(grads["plain"][0], grads["zero_centred"][0]) # dx differs + assert torch.equal(grads["plain"][1], grads["zero_centred"][1]) # dw does not + + +# --------------------------------------------------------------------------- # +# 8. `__call__` is the documented entry point and must agree with `forward` +# --------------------------------------------------------------------------- # +def test_call_matches_forward(): + x, w = _rand((4, _HIDDEN), seed=40), _rand((_HIDDEN,), seed=41) + op = Qwen3NextRMSNormOp() + assert torch.equal(op(x, w, eps=_EPS), op.forward(x, w, eps=_EPS)) + + +@pytest.mark.parametrize("cls", [Qwen3NextRMSNormGatedOp, Qwen3NextRMSNormGatedHFOp]) +def test_gated_call_matches_forward(cls): + x = _rand((4, _HEAD_V_DIM), seed=42) + w = _rand((_HEAD_V_DIM,), seed=43) + gate = _rand((4, _HEAD_V_DIM), seed=44) + op = cls() + assert torch.equal(op(x, w, gate, eps=_EPS), op.forward(x, w, gate, eps=_EPS)) + + +def test_zero_centred_op_inherits_the_plain_reference(): + """The only difference from the plain op is the weight convention. + + Pins the inheritance: if the subclass ever grows its own `_rms_norm`, this + stops being true and the two references can drift apart silently. + """ + from rl_engine.kernels.ops.pytorch.norm.rms_norm import NativeRMSNormOp + + assert issubclass(Qwen3NextRMSNormOp, NativeRMSNormOp) + assert Qwen3NextRMSNormOp.weight_offset == 1.0 + assert NativeRMSNormOp.weight_offset == 0.0 + assert Qwen3NextRMSNormOp._rms_norm.__func__ is NativeRMSNormOp._rms_norm.__func__ + + +def test_plain_reference_is_unchanged_by_the_offset_plumbing(): + """Adding `weight_offset` to the base must not perturb the plain path. + + `0.0 + w` rewrites -0.0 to +0.0, which torch.equal does not notice, so this + compares the raw bits. + """ + from rl_engine.kernels.ops.pytorch.norm.rms_norm import NativeRMSNormOp + + x = _rand((2, _HEAD_V_DIM), seed=45) + w = torch.zeros(_HEAD_V_DIM) + w[0] = -0.0 + got = NativeRMSNormOp().forward_fp32(x, w, eps=_EPS) + x_f = x.float() + from rl_engine.kernels.ops.pytorch.norm.rms_norm import shape_invariant_rstd + + expected = (x_f * shape_invariant_rstd(x_f, _EPS).unsqueeze(-1)) * w.float() + assert torch.equal(got.view(torch.int32), expected.view(torch.int32)) From 5f5654a99268ba7e7bfc0aef646bf46e1c7d379d Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Wed, 30 Sep 2026 18:15:09 +0000 Subject: [PATCH 06/70] fix(norm): preserve signed zero and use CUDA statistics for parameter VJPs Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- csrc/cuda/rmsnorm.cu | 9 ++-- rl_engine/kernels/ops/cuda/norm/rmsnorm.py | 17 +++++--- tests/test_qwen3_next_norm.py | 51 +++++++++++++++++++--- 3 files changed, 60 insertions(+), 17 deletions(-) diff --git a/csrc/cuda/rmsnorm.cu b/csrc/cuda/rmsnorm.cu index fc6c425d6..5b570c557 100644 --- a/csrc/cuda/rmsnorm.cu +++ b/csrc/cuda/rmsnorm.cu @@ -142,7 +142,8 @@ __global__ void rmsnorm_fwd_kernel( // round the offset and break the bitwise contract. for (int col = tid; col < H; col += blockDim.x) { float xv = load_as_float(x_row + col); - float wv = load_as_float(weight + col) + weight_offset; + float wv = load_as_float(weight + col); + if (weight_offset != 0.0f) wv += weight_offset; float out = xv * row_rstd * wv; store_from_float(y_row + col, out); } @@ -172,7 +173,8 @@ __global__ void rmsnorm_bwd_dx_kernel( for (int col = tid; col < H; col += blockDim.x) { float dyv = load_as_float(dy_row + col); float xv = load_as_float(x_row + col); - float wv = load_as_float(weight + col) + weight_offset; + float wv = load_as_float(weight + col); + if (weight_offset != 0.0f) wv += weight_offset; local_dot += dyv * wv * xv; } @@ -184,7 +186,8 @@ __global__ void rmsnorm_bwd_dx_kernel( for (int col = tid; col < H; col += blockDim.x) { float dyv = load_as_float(dy_row + col); float xv = load_as_float(x_row + col); - float wv = load_as_float(weight + col) + weight_offset; + float wv = load_as_float(weight + col); + if (weight_offset != 0.0f) wv += weight_offset; float out = r * dyv * wv - xv * coeff; store_from_float(dx_row + col, out); diff --git a/rl_engine/kernels/ops/cuda/norm/rmsnorm.py b/rl_engine/kernels/ops/cuda/norm/rmsnorm.py index 3b72e497d..7d5a7a754 100644 --- a/rl_engine/kernels/ops/cuda/norm/rmsnorm.py +++ b/rl_engine/kernels/ops/cuda/norm/rmsnorm.py @@ -129,6 +129,7 @@ def __init__(self) -> None: "rmsnorm_forward", "rmsnorm_backward_dx", ) + #: Added to the weight in fp32 inside the kernel. Subclasses override it; #: 0.0 is the plain convention. weight_offset = 0.0 @@ -139,16 +140,18 @@ def __call__(self, x, weight, *, eps=1e-6): def forward(self, x, weight, *, eps=1e-6): hidden = x.shape[-1] x_2d = x.contiguous().view(-1, hidden) - y_2d = rmsnorm_cuda( - x_2d, weight.contiguous(), eps=eps, weight_offset=self.weight_offset - ) + y_2d = rmsnorm_cuda(x_2d, weight.contiguous(), eps=eps, weight_offset=self.weight_offset) return y_2d.view_as(x) def parameter_vjp_contributions_fp32(self, *, x, weight, grad_output, eps=1e-6): - del weight - x32 = x.float() - rstd = torch.rsqrt(x32.square().mean(dim=-1) + float(eps)) - rows = grad_output.float() * x32 * rstd.unsqueeze(-1) + hidden = x.shape[-1] + _, rstd = _C.rmsnorm_forward( + x.contiguous().reshape(-1, hidden), + weight.contiguous(), + float(eps), + float(self.weight_offset), + ) + rows = rmsnorm_dweight_rows_fp32(x, grad_output, rstd=rstd.reshape(x.shape[:-1])) return {"weight": rows} diff --git a/tests/test_qwen3_next_norm.py b/tests/test_qwen3_next_norm.py index c66bf2ba7..9fdf02e73 100644 --- a/tests/test_qwen3_next_norm.py +++ b/tests/test_qwen3_next_norm.py @@ -79,10 +79,7 @@ def test_zero_weight_is_identity_scaling(): plain RMSNorm returns all zeros for a zero weight, this one returns the bare normalized value. """ - from rl_engine.kernels.ops.pytorch.norm.rms_norm import ( - NativeRMSNormOp, - shape_invariant_rstd, - ) + from rl_engine.kernels.ops.pytorch.norm.rms_norm import NativeRMSNormOp, shape_invariant_rstd x = _rand((4, _HIDDEN), seed=0) zeros = torch.zeros(_HIDDEN) @@ -92,9 +89,7 @@ def test_zero_weight_is_identity_scaling(): assert torch.equal(Qwen3NextRMSNormOp().forward_fp32(x, zeros, eps=_EPS), bare) # ... and the plain convention really does differ here. - assert torch.equal( - NativeRMSNormOp().forward_fp32(x, zeros, eps=_EPS), torch.zeros_like(bare) - ) + assert torch.equal(NativeRMSNormOp().forward_fp32(x, zeros, eps=_EPS), torch.zeros_like(bare)) def test_weight_offset_is_one(): @@ -500,3 +495,45 @@ def test_plain_reference_is_unchanged_by_the_offset_plumbing(): expected = (x_f * shape_invariant_rstd(x_f, _EPS).unsqueeze(-1)) * w.float() assert torch.equal(got.view(torch.int32), expected.view(torch.int32)) + + +@requires_cuda_rmsnorm +@pytest.mark.parametrize("dtype", [torch.float32, torch.float16, torch.bfloat16]) +def test_cuda_plain_signed_zero_is_preserved(dtype): + from rl_engine.kernels.ops.cuda.norm.rmsnorm import rmsnorm_cuda + + x = torch.ones(2, 128, device="cuda", dtype=dtype) + x[1].neg_() + weight = torch.full((128,), -0.0, device="cuda", dtype=dtype) + actual = rmsnorm_cuda(x, weight) + expected = x * weight + bits = torch.int32 if dtype == torch.float32 else torch.int16 + assert torch.equal(actual.view(bits), expected.view(bits)) + + +@requires_cuda_rmsnorm +@pytest.mark.parametrize("offset", [0.0, 1.0]) +@pytest.mark.parametrize("shape", [(512, 128), (2, 3, 2048)]) +@pytest.mark.parametrize("dtype", [torch.float32, torch.bfloat16]) +def test_cuda_parameter_contributions_reproduce_backward(offset, shape, dtype): + from rl_engine.kernels.ops.cuda.norm.rmsnorm import Qwen3NextRMSNormCudaOp, RMSNormCudaOp + from rl_engine.kernels.ops.vjp_fp32 import reduce_rows_fp32 + + torch.manual_seed(128) + x = torch.randn(shape, device="cuda", dtype=dtype) + weight = torch.randn(shape[-1], device="cuda", dtype=dtype, requires_grad=True) + upstream = torch.randn_like(x) + op = RMSNormCudaOp() if offset == 0.0 else Qwen3NextRMSNormCudaOp() + op(x, weight).backward(upstream) + rows = op.parameter_vjp_contributions_fp32(x=x, weight=weight, grad_output=upstream)["weight"] + folded = reduce_rows_fp32(rows.reshape(-1, shape[-1])).to(dtype) + assert torch.equal(weight.grad, folded) + + +def test_zero_centred_cuda_constructor_rejects_missing_extension(monkeypatch): + from rl_engine.kernels.ops.cuda.norm import rmsnorm + + monkeypatch.setattr(rmsnorm, "_EXT_AVAILABLE", False) + monkeypatch.setattr(rmsnorm, "_C", None) + with pytest.raises(RuntimeError, match="requires the compiled"): + rmsnorm.Qwen3NextRMSNormCudaOp() From b11b957ef6eba3b1ae7ceab68dd342ff04a8b243 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Wed, 30 Sep 2026 14:34:21 +0000 Subject: [PATCH 07/70] feat(cuda): gated RMSNorm kernel for the Qwen3-Next GDN block Adds the CUDA kernel behind `Qwen3NextRMSNormGatedOp`, and registers both it and the zero-centred decoder norm from the previous commit. y = x * rstd * (weight_offset + weight) * act(gate) Every multiply is fp32 with one cast at the store, matching vLLM's RMSNormGated with norm_before_gate=True and group_size=None -- the only configuration the GDN block constructs. Other configurations are rejected rather than approximated. `expf` is used rather than the `__expf` intrinsic: the fast intrinsic trades accuracy for speed and would move the result away from the fp32 reference. Forward reuses the existing block_reduce_sum / choose_threads(H), so for a fixed H the reduction tree is independent of the row count -- that is the L1 guarantee -- and `rstd` comes out bitwise identical to the ungated kernel for the same x, which is asserted. Backward is assembled from deterministic pieces: dx new kernel, the ungated dx with (w + offset) -> (w + offset) * act(z) dweight reuses rmsnorm_dweight_rows_fp32 + the ascending-row fp32 left fold dgate row-local and reduction-free, fp32 in the wrapper Both backwards route through one `_fold_dweight_rows` helper so the file keeps a single left-fold entrypoint, which tests/test_vjp_fp32.py pins, and one `_require_cuda_symbols` helper so the module has a single availability contract. The gated op is deliberately NOT a subclass of RMSNormCudaOp: it takes an extra required tensor, so it cannot stand in for one. Same reasoning as on the PyTorch side, and stated in its docstring so the question is not reopened. Registration: `rms_norm_gated` and `qwen3_next_rms_norm` in OP_SPECS (both with a cuda-sm90 candidate, as every other reduction spec carries), operator_inputs builders, OpBackend members and priority maps on all five platforms, test_dispatch assertions, and the WS1 registered-ops set in tests/test_ws1_gtest_gpu.py. Operator pages added per docs/operators/README.md, which states the page is part of the operator contract. Claim level: L0 repeatable and L1 batch-invariant. NOT L2 -- see tests/check_qwen3_next_norm_providers.py, which pins the dispatch facts and bounds the gap against vLLM rather than asserting equality. Verified on 2x B200 (sm_100, driver 580.126.20, torch 2.13.0+cu130, vllm 0.30.0): pytest tests/test_qwen3_next_norm.py -q pytest tests/check_qwen3_next_norm_providers.py -q python scripts/check_operator.py --op rms_norm_gated --candidate cuda \ --device cuda --dtype bf16 --check-grad -> pass_rate=1.0000 python scripts/check_operator.py --op qwen3_next_rms_norm --candidate cuda \ --device cuda --dtype bf16 --check-grad -> pass_rate=1.0000 pytest tests/ rl_engine/tests/ -q -p no:randomly \ --ignore=tests/test_rocm_aiter_api_contract.py Both new files pass, both operators report pass_rate=1.0000 on the CUDA candidate, and the full suite gains no failure. The ignored file fails to import on the merge-base as well. Absolute suite counts are reported in the PR description against a named base commit, not here: they shift whenever a sibling test is added, so a count frozen in a commit message goes stale the moment the branch is rebased. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- csrc/cuda/rmsnorm.cu | 197 ++++++++++++++++++ csrc/ops.cpp | 96 +++++++++ docs/.nav.yml | 1 + docs/operators/README.md | 1 + docs/operators/qwen3-next-rms-norm-gated.md | 114 +++++++++++ docs/operators/qwen3-next-rms-norm.md | 4 +- rl_engine/kernels/gtest/operator_inputs.py | 23 +++ rl_engine/kernels/gtest/operator_specs.py | 30 +++ rl_engine/kernels/ops/cuda/norm/rmsnorm.py | 207 +++++++++++++++++-- rl_engine/kernels/registry.py | 32 +++ rl_engine/tests/test_dispatch.py | 36 ++++ tests/test_qwen3_next_norm.py | 215 ++++++++++++++++++++ tests/test_ws1_gtest_gpu.py | 2 + 13 files changed, 940 insertions(+), 18 deletions(-) create mode 100644 docs/operators/qwen3-next-rms-norm-gated.md diff --git a/csrc/cuda/rmsnorm.cu b/csrc/cuda/rmsnorm.cu index 0c09b3a4a..c80945300 100644 --- a/csrc/cuda/rmsnorm.cu +++ b/csrc/cuda/rmsnorm.cu @@ -198,6 +198,130 @@ __global__ void rmsnorm_bwd_dx_kernel( } +// --------------------------------------------------------------------------- +// Gated RMSNorm (Qwen3-Next GDN block). +// +// y = x * rstd * (weight_offset + weight) * act(gate) +// +// The gate activation and the weight multiply are both evaluated in fp32 and +// there is exactly one cast, at the store. This mirrors vLLM's RMSNormGated +// with norm_before_gate=True, which is how the GDN block constructs it. +// +// ACT selects the gate activation: 0 = silu/swish, 1 = sigmoid. expf (not the +// __expf intrinsic) is used deliberately -- the fast intrinsic trades accuracy +// for speed and would put the result further from the fp32 reference. +// --------------------------------------------------------------------------- + +template +__device__ __forceinline__ float gate_activation(float z) { + const float sigma = 1.0f / (1.0f + expf(-z)); + return (ACT == 0) ? z * sigma : sigma; +} + +template +__device__ __forceinline__ float gate_activation_grad(float z) { + const float sigma = 1.0f / (1.0f + expf(-z)); + // d/dz [z * sigma] = sigma * (1 + z * (1 - sigma)); d/dz [sigma] = sigma * (1 - sigma) + return (ACT == 0) ? sigma * (1.0f + z * (1.0f - sigma)) : sigma * (1.0f - sigma); +} + + +template +__global__ void rmsnorm_gated_fwd_kernel( + const scalar_t* __restrict__ x, + const weight_t* __restrict__ weight, + const scalar_t* __restrict__ gate, + scalar_t* __restrict__ y, + float* __restrict__ rstd, + int T, + int H, + float eps, + float weight_offset +) { + int row = blockIdx.x; + int tid = threadIdx.x; + + const scalar_t* x_row = x + row * H; + const scalar_t* gate_row = gate + row * H; + scalar_t* y_row = y + row * H; + + float local_sum = 0.0f; + + // The statistic is over x only; the gate never enters the reduction, so + // rstd here is bit-identical to the ungated kernel's for the same x. + for (int col = tid; col < H; col += blockDim.x) { + float xv = load_as_float(x_row + col); + local_sum += xv * xv; + } + + float sum = block_reduce_sum(local_sum); + + float row_rstd = rsqrtf(sum / static_cast(H) + eps); + + if (tid == 0) { + rstd[row] = row_rstd; + } + + __syncthreads(); + + for (int col = tid; col < H; col += blockDim.x) { + float xv = load_as_float(x_row + col); + float wv = load_as_float(weight + col) + weight_offset; + float zv = load_as_float(gate_row + col); + float out = xv * row_rstd * wv * gate_activation(zv); + store_from_float(y_row + col, out); + } +} + + +template +__global__ void rmsnorm_gated_bwd_dx_kernel( + const scalar_t* __restrict__ dy, + const scalar_t* __restrict__ x, + const weight_t* __restrict__ weight, + const scalar_t* __restrict__ gate, + const float* __restrict__ rstd, + scalar_t* __restrict__ dx, + int T, + int H, + float weight_offset +) { + int row = blockIdx.x; + int tid = threadIdx.x; + + const scalar_t* dy_row = dy + row * H; + const scalar_t* x_row = x + row * H; + const scalar_t* gate_row = gate + row * H; + scalar_t* dx_row = dx + row * H; + + float local_dot = 0.0f; + + // Identical to the ungated dx, with the per-column scale (w + offset) + // replaced by (w + offset) * act(gate): the gate is a constant wrt x. + for (int col = tid; col < H; col += blockDim.x) { + float dyv = load_as_float(dy_row + col); + float xv = load_as_float(x_row + col); + float wv = load_as_float(weight + col) + weight_offset; + float zv = load_as_float(gate_row + col); + local_dot += dyv * (wv * gate_activation(zv)) * xv; + } + + float dot = block_reduce_sum(local_dot); + + float r = rstd[row]; + float coeff = dot * r * r * r / static_cast(H); + + for (int col = tid; col < H; col += blockDim.x) { + float dyv = load_as_float(dy_row + col); + float xv = load_as_float(x_row + col); + float wv = load_as_float(weight + col) + weight_offset; + float zv = load_as_float(gate_row + col); + + float out = r * dyv * (wv * gate_activation(zv)) - xv * coeff; + store_from_float(dx_row + col, out); + } +} + template __global__ void rmsnorm_partial_dw_kernel( const scalar_t* __restrict__ dy, @@ -325,6 +449,79 @@ void rmsnorm_backward_dx_cuda( } +void rmsnorm_gated_forward_cuda( + torch::Tensor x, + torch::Tensor weight, + torch::Tensor gate, + torch::Tensor y, + torch::Tensor rstd, + double eps, + double weight_offset, + int64_t activation +) { + int T = x.size(0); + int H = x.size(1); + int threads = choose_threads(H); + size_t smem = threads * sizeof(float); + + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + + AT_DISPATCH_FLOATING_TYPES_AND2(at::kHalf, at::kBFloat16, x.scalar_type(), "rmsnorm_gated_forward_cuda", [&] { + using x_t = scalar_t; + AT_DISPATCH_FLOATING_TYPES_AND2(at::kHalf, at::kBFloat16, weight.scalar_type(), "rmsnorm_gated_forward_weight_cuda", [&] { + using w_t = scalar_t; + if (activation == 0) { + rmsnorm_gated_fwd_kernel<<>>( + x.data_ptr(), weight.data_ptr(), gate.data_ptr(), + y.data_ptr(), rstd.data_ptr(), + T, H, static_cast(eps), static_cast(weight_offset)); + } else { + rmsnorm_gated_fwd_kernel<<>>( + x.data_ptr(), weight.data_ptr(), gate.data_ptr(), + y.data_ptr(), rstd.data_ptr(), + T, H, static_cast(eps), static_cast(weight_offset)); + } + }); + }); +} + + +void rmsnorm_gated_backward_dx_cuda( + torch::Tensor dy, + torch::Tensor x, + torch::Tensor weight, + torch::Tensor gate, + torch::Tensor rstd, + torch::Tensor dx, + double weight_offset, + int64_t activation +) { + int T = x.size(0); + int H = x.size(1); + int threads = choose_threads(H); + size_t smem = threads * sizeof(float); + + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + + AT_DISPATCH_FLOATING_TYPES_AND2(at::kHalf, at::kBFloat16, x.scalar_type(), "rmsnorm_gated_backward_dx_cuda", [&] { + using x_t = scalar_t; + AT_DISPATCH_FLOATING_TYPES_AND2(at::kHalf, at::kBFloat16, weight.scalar_type(), "rmsnorm_gated_backward_dx_weight_cuda", [&] { + using w_t = scalar_t; + if (activation == 0) { + rmsnorm_gated_bwd_dx_kernel<<>>( + dy.data_ptr(), x.data_ptr(), weight.data_ptr(), + gate.data_ptr(), rstd.data_ptr(), dx.data_ptr(), + T, H, static_cast(weight_offset)); + } else { + rmsnorm_gated_bwd_dx_kernel<<>>( + dy.data_ptr(), x.data_ptr(), weight.data_ptr(), + gate.data_ptr(), rstd.data_ptr(), dx.data_ptr(), + T, H, static_cast(weight_offset)); + } + }); + }); +} + void rmsnorm_backward_partial_dw_cuda( torch::Tensor dy, torch::Tensor x, diff --git a/csrc/ops.cpp b/csrc/ops.cpp index 4e786e5b3..b37ab102c 100644 --- a/csrc/ops.cpp +++ b/csrc/ops.cpp @@ -271,6 +271,26 @@ void rmsnorm_backward_dx_cuda( torch::Tensor dx, double weight_offset); +void rmsnorm_gated_forward_cuda( + torch::Tensor x, + torch::Tensor weight, + torch::Tensor gate, + torch::Tensor y, + torch::Tensor rstd, + double eps, + double weight_offset, + int64_t activation); + +void rmsnorm_gated_backward_dx_cuda( + torch::Tensor dy, + torch::Tensor x, + torch::Tensor weight, + torch::Tensor gate, + torch::Tensor rstd, + torch::Tensor dx, + double weight_offset, + int64_t activation); + void rmsnorm_backward_partial_dw_cuda( torch::Tensor dy, torch::Tensor x, @@ -342,6 +362,73 @@ torch::Tensor rmsnorm_backward_dx( return dx; } +static void rmsnorm_gated_check( + const torch::Tensor& x, + const torch::Tensor& weight, + const torch::Tensor& gate, + int64_t activation) +{ + rmsnorm_check_input(x, "x"); + rmsnorm_check_input(weight, "weight"); + rmsnorm_check_input(gate, "gate"); + + TORCH_CHECK(x.dim() == 2, "x must be 2D [T, H]"); + TORCH_CHECK(weight.dim() == 1, "weight must be 1D [H]"); + TORCH_CHECK(x.size(1) == weight.size(0), "x.size(1) must equal weight.size(0)"); + TORCH_CHECK(gate.sizes() == x.sizes(), "gate must have the same shape as x"); + TORCH_CHECK( + gate.scalar_type() == x.scalar_type(), + "gate must have the same dtype as x"); + // 0 = silu/swish, 1 = sigmoid. Anything else fails closed rather than + // silently computing a different activation (RFC #428 section 6, item 7). + TORCH_CHECK( + activation == 0 || activation == 1, + "activation must be 0 (silu) or 1 (sigmoid), got ", activation); +} + +std::vector rmsnorm_gated_forward( + torch::Tensor x, + torch::Tensor weight, + torch::Tensor gate, + double eps, + double weight_offset, + int64_t activation) +{ + rmsnorm_gated_check(x, weight, gate, activation); + + auto T = x.size(0); + auto y = torch::empty_like(x); + auto rstd = torch::empty({T}, x.options().dtype(torch::kFloat32)); + + rmsnorm_gated_forward_cuda(x, weight, gate, y, rstd, eps, weight_offset, activation); + + return {y, rstd}; +} + +torch::Tensor rmsnorm_gated_backward_dx( + torch::Tensor dy, + torch::Tensor x, + torch::Tensor weight, + torch::Tensor gate, + torch::Tensor rstd, + double weight_offset, + int64_t activation) +{ + rmsnorm_gated_check(x, weight, gate, activation); + rmsnorm_check_input(dy, "dy"); + rmsnorm_check_input(rstd, "rstd"); + + TORCH_CHECK(dy.sizes() == x.sizes(), "dy must have the same shape as x"); + TORCH_CHECK(rstd.dim() == 1 && rstd.size(0) == x.size(0), "rstd must be [T]"); + + auto dx = torch::empty_like(x); + + rmsnorm_gated_backward_dx_cuda( + dy, x, weight, gate, rstd, dx, weight_offset, activation); + + return dx; +} + torch::Tensor rmsnorm_backward_dw( torch::Tensor dy, torch::Tensor x, @@ -723,6 +810,15 @@ PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { py::arg("dy"), py::arg("x"), py::arg("weight"), py::arg("rstd"), py::arg("weight_offset") = 0.0); m.def("rmsnorm_backward_dw", &rmsnorm_backward_dw, "Deterministic RMSNorm backward dweight CUDA"); + m.def("rmsnorm_gated_forward", &rmsnorm_gated_forward, + "Batch-invariant gated RMSNorm forward CUDA", + py::arg("x"), py::arg("weight"), py::arg("gate"), py::arg("eps"), + py::arg("weight_offset") = 0.0, py::arg("activation") = 0); + m.def("rmsnorm_gated_backward_dx", &rmsnorm_gated_backward_dx, + "Batch-invariant gated RMSNorm backward dx CUDA", + py::arg("dy"), py::arg("x"), py::arg("weight"), py::arg("gate"), + py::arg("rstd"), py::arg("weight_offset") = 0.0, + py::arg("activation") = 0); #if !defined(USE_ROCM) m.def( "reduce_rows_fp32_left_fold", diff --git a/docs/.nav.yml b/docs/.nav.yml index 9133710de..88dea32e5 100644 --- a/docs/.nav.yml +++ b/docs/.nav.yml @@ -30,6 +30,7 @@ nav: - operators/det-gemm.md - operators/embedding.md - operators/qwen3-next-rms-norm.md + - operators/qwen3-next-rms-norm-gated.md - Developer Guide: - contributing/README.md - General: diff --git a/docs/operators/README.md b/docs/operators/README.md index 0d955ed18..0b93b3d90 100644 --- a/docs/operators/README.md +++ b/docs/operators/README.md @@ -33,4 +33,5 @@ Every operator page should include: - [Sampling](sampling.md) - [Token Embedding](embedding.md) - [Qwen3-Next RMSNorm (zero-centred)](qwen3-next-rms-norm.md) +- [Qwen3-Next Gated RMSNorm](qwen3-next-rms-norm-gated.md) - [Operator Doc Template](../contributing/operator-doc-template.md) diff --git a/docs/operators/qwen3-next-rms-norm-gated.md b/docs/operators/qwen3-next-rms-norm-gated.md new file mode 100644 index 000000000..1bc531ea6 --- /dev/null +++ b/docs/operators/qwen3-next-rms-norm-gated.md @@ -0,0 +1,114 @@ +# Qwen3-Next Gated RMSNorm + +## Summary + +The norm inside Qwen3-Next's Gated DeltaNet block: + +``` +out = x * rstd * weight * silu(gate) +``` + +It is a different operator from the decoder norm, not a variant of it: the weight is +plain rather than zero-centred (upstream initializes it to ones), it takes a second +input tensor, and — critically — `transformers` and vLLM disagree about where the +weight multiply happens. See [Qwen3-Next RMSNorm](qwen3-next-rms-norm.md) for the +decoder-norm convention. + +Added for RFC #428 C1 on the Qwen3-Next rollout-vs-replay path. + +## Entry Point + +```python +from rl_engine.kernels.ops.pytorch.norm.qwen3_next_rms_norm import ( + Qwen3NextRMSNormGatedOp, # strict / vLLM convention + Qwen3NextRMSNormGatedHFOp, # transformers convention, kept as a witness +) +from rl_engine.kernels.ops.cuda.norm.rmsnorm import ( + Qwen3NextRMSNormGatedCudaOp, + rmsnorm_gated_cuda, +) + +y = Qwen3NextRMSNormGatedCudaOp().forward(x, weight, gate, eps=1e-6) +y = rmsnorm_gated_cuda(x, weight, gate, eps=1e-6, activation="sigmoid") +``` + +## Backends + +| Backend | Wrapper | Native symbol | Status | +| --- | --- | --- | --- | +| CUDA | `Qwen3NextRMSNormGatedCudaOp` | `rl_engine._C.rmsnorm_gated_forward` | Supported | +| ROCm | — | — | Not implemented | +| PyTorch fallback | `Qwen3NextRMSNormGatedOp` | — | Supported (WS1 gold) | + +The CUDA op is deliberately **not** a subclass of `RMSNormCudaOp`: it takes an extra +required tensor, so it cannot stand in for one. + +## Tensor Contract + +| Argument | Shape | Dtype | Requirements | +| --- | --- | --- | --- | +| `x` | `[..., H]` | fp32 / bf16 / fp16 | contiguous on the CUDA path | +| `weight` | `[H]` | matches `x` | plain, NOT zero-centred | +| `gate` | same as `x` | same as `x` | shape and dtype are enforced | +| `eps` | scalar | float | `1e-6` for Qwen3-Next | +| `activation` | — | `"silu"`/`"swish"`/`"sigmoid"` | anything else is rejected | + +Only `norm_before_gate=True` and `group_size=None` are implemented — the single +configuration vLLM's GDN block constructs. Other configurations fail closed rather +than being approximated (RFC #428 §6 item 7). + +## Dispatch Behavior + +Registered as `rms_norm_gated`. CUDA prefers the kernel; every other platform +resolves to the PyTorch reference. `__init__` validates the compiled symbols, so on a +build without the extension the registry falls through instead of returning an op +that raises at call time. + +## Accuracy + +Claim level: **L0 repeatable, L1 batch-invariant**. L2 is not claimed. + +`transformers` casts the normalized value back to the input dtype *before* the weight +multiply; vLLM keeps it in fp32. On B200 / bf16 / `head_v_dim=128` the two differ in +35% of elements with `max|diff| = 6.25e-2`, and isolating the cast order alone +reproduces the gap — so the cast order dominates, not the reduction order. Because +RFC #428 measures L2 against vLLM rollout, the fp32 multiply is the strict default; +`Qwen3NextRMSNormGatedHFOp` keeps the other convention as a tested witness. + +"Bitwise equal to vLLM" is undefined until a provider is named: vLLM's own +`forward_native` and `forward_cuda` disagreed on 21 of 40 seeds (worst 1.56e-2 in +bf16; ~36% of elements at fp32 ULP in fp32). What this reproduces is the convention; +the residual is the reduction tree. + +`rstd` is bitwise identical to the ungated kernel's for the same `x` — asserted, so a +gate leaking into the statistic would fail. + +Backward is assembled from deterministic pieces: `dx` from a row-local kernel, +`dweight` from fp32 row contributions reduced by the ascending-row left fold, and +`dgate` elementwise in fp32 with no reduction. + +## Performance Notes + +Reuses the existing `block_reduce_sum` / `choose_threads(H)` reduction, so the gate +costs one extra load and one fp32 multiply per element. + +```bash +python scripts/check_operator.py --op rms_norm_gated --candidate cuda \ + --device cuda --dtype bf16 --check-grad +``` + +## Tests + +```bash +python -m pytest tests/test_qwen3_next_norm.py -v +# imports real vLLM, so it is not collected by default: +python -m pytest tests/check_qwen3_next_norm_providers.py -v +``` + +## Known Limitations + +- CUDA only; no ROCm, Ascend or Triton backend. +- `norm_before_gate=False` and grouped norms are not implemented. +- Not bitwise against either vLLM path (see Accuracy). +- Measured on sm_100 (B200); RFC #428 §2.2 forbids carrying the claim across + H100/H200/B100/B200. diff --git a/docs/operators/qwen3-next-rms-norm.md b/docs/operators/qwen3-next-rms-norm.md index 81fdde9b3..e5e9a47c0 100644 --- a/docs/operators/qwen3-next-rms-norm.md +++ b/docs/operators/qwen3-next-rms-norm.md @@ -9,8 +9,8 @@ offset away and silently breaks any bitwise claim. This operator exists for RFC #428 C1 (Embedding / RMSNorm / residual / final norm exactness) on the Qwen3-Next rollout-vs-replay path. The Gated DeltaNet block uses -a *different* weight convention and a different cast order; it is a separate -operator. +a *different* weight convention and a different cast order; see +[Gated RMSNorm](qwen3-next-rms-norm-gated.md). Upstream references: `transformers` `Qwen3NextRMSNorm`, and vLLM's `GemmaRMSNorm`, which `vllm/model_executor/models/qwen3_next.py` aliases as `Qwen3NextRMSNorm`. diff --git a/rl_engine/kernels/gtest/operator_inputs.py b/rl_engine/kernels/gtest/operator_inputs.py index ca3b7c120..1cd03d31f 100644 --- a/rl_engine/kernels/gtest/operator_inputs.py +++ b/rl_engine/kernels/gtest/operator_inputs.py @@ -26,6 +26,8 @@ def make_operator_inputs( ) -> dict[str, Any]: builders = { "rms_norm": _make_rms_norm_inputs, + "rms_norm_gated": _make_rms_norm_gated_inputs, + "qwen3_next_rms_norm": _make_rms_norm_inputs, "qk_norm": _make_qk_norm_inputs, "pack": _make_pack_inputs, "matmul": _make_matmul_inputs, @@ -54,6 +56,8 @@ def operator_shape_name(op_name: str, args: argparse.Namespace) -> str: vocab = _arg_int(args, "vocab", DEFAULT_VOCAB) names = { "rms_norm": f"{batch}x{seq}x{_normalized_dim(args)}", + "rms_norm_gated": f"{batch}x{seq}x{_arg_int(args, 'head_dim', DEFAULT_HEAD_DIM)}", + "qwen3_next_rms_norm": f"{batch}x{seq}x{_normalized_dim(args)}", "qk_norm": f"{batch}x{seq}x{_arg_int(args, 'n_heads', DEFAULT_N_HEADS)}x" f"{_arg_int(args, 'head_dim', DEFAULT_HEAD_DIM)}", "pack": f"{batch}x{seq}x{_normalized_dim(args)}", @@ -91,6 +95,25 @@ def _make_rms_norm_inputs( } +def _make_rms_norm_gated_inputs( + args: argparse.Namespace, dtype: torch.dtype, device: torch.device +) -> dict[str, Any]: + """Gated RMSNorm inputs at the GDN block's width. + + The gated norm normalizes over ``linear_value_head_dim`` (128 for + Qwen3-Next), not ``hidden_size``, so it follows ``head_dim`` rather than + ``normalized_dim``. + """ + batch, seq = _batch_seq(args) + head_dim = _arg_int(args, "head_dim", DEFAULT_HEAD_DIM) + return { + "x": _floating_tensor((batch, seq, head_dim), args, dtype, device, offset=0), + "weight": _floating_tensor((head_dim,), args, dtype, device, offset=1), + "gate": _floating_tensor((batch, seq, head_dim), args, dtype, device, offset=2), + "eps": _arg_float(args, "eps", DEFAULT_RMS_EPS), + } + + def _make_qk_norm_inputs( args: argparse.Namespace, dtype: torch.dtype, device: torch.device ) -> dict[str, Any]: diff --git a/rl_engine/kernels/gtest/operator_specs.py b/rl_engine/kernels/gtest/operator_specs.py index 4b86c2b7e..cccbc23b2 100644 --- a/rl_engine/kernels/gtest/operator_specs.py +++ b/rl_engine/kernels/gtest/operator_specs.py @@ -46,6 +46,36 @@ def _load_object(path: str) -> Any: }, grad_input_names=("x", "weight"), ), + "rms_norm_gated": OperatorSpec( + name="rms_norm_gated", + op_class="reduction", + gold_path=( + "rl_engine.kernels.ops.pytorch.norm.qwen3_next_rms_norm.Qwen3NextRMSNormGatedOp" + ), + gold_method="forward_fp32", + candidate_paths={ + "pytorch": ( + "rl_engine.kernels.ops.pytorch.norm.qwen3_next_rms_norm.Qwen3NextRMSNormGatedOp" + ), + "cuda": ("rl_engine.kernels.ops.cuda.norm.rmsnorm.Qwen3NextRMSNormGatedCudaOp"), + "cuda-sm90": ("rl_engine.kernels.ops.cuda.norm.rmsnorm.Qwen3NextRMSNormGatedCudaOp"), + }, + grad_input_names=("x", "weight", "gate"), + ), + "qwen3_next_rms_norm": OperatorSpec( + name="qwen3_next_rms_norm", + op_class="reduction", + gold_path=("rl_engine.kernels.ops.pytorch.norm.qwen3_next_rms_norm.Qwen3NextRMSNormOp"), + gold_method="forward_fp32", + candidate_paths={ + "pytorch": ( + "rl_engine.kernels.ops.pytorch.norm.qwen3_next_rms_norm.Qwen3NextRMSNormOp" + ), + "cuda": "rl_engine.kernels.ops.cuda.norm.rmsnorm.Qwen3NextRMSNormCudaOp", + "cuda-sm90": ("rl_engine.kernels.ops.cuda.norm.rmsnorm.Qwen3NextRMSNormCudaOp"), + }, + grad_input_names=("x", "weight"), + ), "qk_norm": OperatorSpec( name="qk_norm", op_class="reduction", diff --git a/rl_engine/kernels/ops/cuda/norm/rmsnorm.py b/rl_engine/kernels/ops/cuda/norm/rmsnorm.py index af9a31358..fc1aa9554 100644 --- a/rl_engine/kernels/ops/cuda/norm/rmsnorm.py +++ b/rl_engine/kernels/ops/cuda/norm/rmsnorm.py @@ -5,23 +5,14 @@ from rl_engine.kernels.ops.vjp_fp32 import reduce_rows_fp32, rmsnorm_dweight_rows_fp32 -def _require_cuda_symbols(what: str, *names: str) -> None: - """Raise when the compiled kernels backing ``what`` are missing. +def _fold_dweight_rows(rows: torch.Tensor, dtype: torch.dtype) -> torch.Tensor: + """The single left-fold entrypoint for this backend's dweight reductions. - The registry treats a backend whose construction raises as unavailable and - falls through to the next candidate, so calling this from ``__init__`` is - what lets a CUDA-first priority list degrade to the PyTorch reference on a - build without the extension. Mirrors ``_require_cuda_activation`` in the - activation ops. + Both the plain and the gated backward route through here so the file keeps + one auditable reduction path; the ascending-row fp32 fold is what makes + dweight independent of the batch layout. """ - if not _EXT_AVAILABLE or _C is None: - raise RuntimeError(f"{what} requires the compiled rl_engine._C extension.") - missing = [name for name in names if not hasattr(_C, name)] - if missing: - raise RuntimeError( - f"{what} symbols ({', '.join(missing)}) are not compiled into _C. " - "Rebuild the extension with csrc/cuda/rmsnorm.cu." - ) + return reduce_rows_fp32(rows).to(dtype) class RMSNormCuda(torch.autograd.Function): @@ -92,7 +83,7 @@ def backward(ctx, grad_out): # Multiplication is part of the pre-existing mask contract, including # IEEE propagation for non-finite inactive contributions. rows = rows * mask.to(dtype=rows.dtype).unsqueeze(-1) - dw = reduce_rows_fp32(rows).to(weight.dtype) + dw = _fold_dweight_rows(rows, weight.dtype) record_backward( "rms_norm", kernel_id=( @@ -166,3 +157,187 @@ class Qwen3NextRMSNormCudaOp(RMSNormCudaOp): """ weight_offset = 1.0 + + +# --------------------------------------------------------------------------- # +# Gated RMSNorm (Qwen3-Next GDN block) +# --------------------------------------------------------------------------- # + +def _require_cuda_symbols(what: str, *names: str) -> None: + """Raise when the compiled kernels backing ``what`` are missing. + + The registry treats a backend whose construction raises as unavailable and + falls through, so calling this from ``__init__`` is what lets a CUDA-first + priority list degrade to the PyTorch reference on a build without the + extension. Mirrors ``_require_cuda_activation`` in the activation ops. + """ + if not _EXT_AVAILABLE or _C is None: + raise RuntimeError(f"{what} requires the compiled rl_engine._C extension.") + missing = [name for name in names if not hasattr(_C, name)] + if missing: + raise RuntimeError( + f"{what} symbols ({', '.join(missing)}) are not compiled into _C. " + "Rebuild the extension with csrc/cuda/rmsnorm.cu." + ) + + +#: Gate activations understood by the CUDA kernel, in binding order. +_GATE_ACTIVATIONS = {"silu": 0, "swish": 0, "sigmoid": 1} + + +def _gate_activation_fp32(gate: torch.Tensor, activation: int) -> torch.Tensor: + """act(gate) in fp32, matching the kernel's ``gate_activation``.""" + gate32 = gate.float() + return torch.nn.functional.silu(gate32) if activation == 0 else torch.sigmoid(gate32) + + +def _gate_activation_grad_fp32(gate: torch.Tensor, activation: int) -> torch.Tensor: + """d act(gate) / d gate in fp32, matching ``gate_activation_grad``.""" + gate32 = gate.float() + sigma = torch.sigmoid(gate32) + if activation == 0: + return sigma * (1.0 + gate32 * (1.0 - sigma)) + return sigma * (1.0 - sigma) + + +class RMSNormGatedCuda(torch.autograd.Function): + """Autograd wrapper for the gated CUDA RMSNorm. + + Forward is the fused kernel. Backward is assembled from deterministic + pieces: ``dx`` from a row-local CUDA kernel, ``dweight`` from fp32 row + contributions reduced by the ascending-row left fold, and ``dgate`` purely + elementwise in fp32 (no reduction, so batch invariance is trivial). + """ + + @staticmethod + def forward(ctx, x, weight, gate, eps=1e-6, weight_offset=0.0, activation=0): + """ + Forward: + y = x * rsqrt(mean(x^2) + eps) * (weight_offset + weight) * act(gate) + + Input: + x, gate: [T, H], fp16/bf16/fp32 CUDA tensors of matching dtype + weight: [H] + activation: 0 = silu/swish, 1 = sigmoid + """ + assert x.is_cuda and weight.is_cuda and gate.is_cuda, "inputs must be CUDA tensors" + assert x.is_contiguous() and weight.is_contiguous() and gate.is_contiguous() + assert x.dim() == 2, "x must be [T, H]" + assert weight.dim() == 1, "weight must be [H]" + assert gate.shape == x.shape, "gate must match x" + assert _EXT_AVAILABLE and hasattr(_C, "rmsnorm_gated_forward"), ( + "Gated RMSNorm CUDA extension is unavailable. Rebuild with csrc/cuda/rmsnorm.cu." + ) + + y, rstd = _C.rmsnorm_gated_forward( + x, weight, gate, float(eps), float(weight_offset), int(activation) + ) + + ctx.save_for_backward(x, weight, gate, rstd) + ctx.eps = eps + ctx.weight_offset = float(weight_offset) + ctx.activation = int(activation) + + return y + + @staticmethod + def backward(ctx, grad_out): + x, weight, gate, rstd = ctx.saved_tensors + dy = grad_out.contiguous() + act = ctx.activation + + dx = _C.rmsnorm_gated_backward_dx( + dy, x, weight, gate, rstd, ctx.weight_offset, act + ) + + # dweight: the gate is a per-element constant here, so the ungated row + # contributions apply once dy carries act(gate). + gate_act = _gate_activation_fp32(gate, act) + rows = rmsnorm_dweight_rows_fp32(x, dy.float() * gate_act, rstd=rstd) + dw = _fold_dweight_rows(rows, weight.dtype) + + # dgate: row-local and reduction-free. + normed = x.float() * rstd.unsqueeze(-1) + scale = weight.float() + ctx.weight_offset + dgate = (dy.float() * normed * scale * _gate_activation_grad_fp32(gate, act)).to( + gate.dtype + ) + + record_backward( + "rms_norm_gated", + kernel_id=( + "rl_engine._C.rmsnorm_gated_backward_dx" + "+rl_engine.kernels.ops.vjp_fp32.rmsnorm_dweight_rows_fp32" + "+rl_engine.kernels.ops.vjp_fp32.reduce_rows_fp32" + ), + impl="cuda_rmsnorm_gated_dx_declared_fp32_rowfold_dw", + family="cuda", + ) + + return dx, dw, dgate, None, None, None + + +def rmsnorm_gated_cuda(x, weight, gate, eps=1e-6, weight_offset=0.0, activation="silu"): + """ + use: + y = rmsnorm_gated_cuda(x, weight, gate) + y = rmsnorm_gated_cuda(x, weight, gate, activation="sigmoid") + """ + if activation not in _GATE_ACTIVATIONS: + raise ValueError( + f"activation must be one of {sorted(_GATE_ACTIVATIONS)}, got {activation!r}" + ) + return RMSNormGatedCuda.apply( + x, weight, gate, eps, weight_offset, _GATE_ACTIVATIONS[activation] + ) + + +class Qwen3NextRMSNormGatedCudaOp: + """CUDA gated RMSNorm for the Qwen3-Next GDN block. + + Deliberately not a subclass of :class:`RMSNormCudaOp`: it takes an extra + required tensor, so it cannot stand in for one. + + ``out = x * rstd * weight * silu(gate)``, every multiply in fp32 with a + single cast at the store. The weight is plain, not zero-centred, matching + vLLM's ``RMSNormGated`` with ``norm_before_gate=True`` and ``group_size=None`` + -- which is exactly how the GDN block constructs it. Other configurations + are rejected rather than approximated. + """ + + backward_impl = "cuda_rmsnorm_gated_dx_declared_fp32_rowfold_dw" + + #: The gated weight is plain; kept as an attribute so the surface matches + #: the ungated op and a zero-centred variant stays one subclass away. + weight_offset = 0.0 + activation = "silu" + + def __init__(self) -> None: + _require_cuda_symbols( + "Gated CUDA RMSNorm", "rmsnorm_gated_forward", "rmsnorm_gated_backward_dx" + ) + + def __call__(self, x, weight, gate, *, eps=1e-6): + return self.forward(x, weight, gate, eps=eps) + + def forward(self, x, weight, gate, *, eps=1e-6): + hidden = x.shape[-1] + x_2d = x.contiguous().view(-1, hidden) + gate_2d = gate.contiguous().view(-1, hidden) + y_2d = rmsnorm_gated_cuda( + x_2d, + weight.contiguous(), + gate_2d, + eps=eps, + weight_offset=self.weight_offset, + activation=self.activation, + ) + return y_2d.view_as(x) + + def parameter_vjp_contributions_fp32(self, *, x, weight, gate, grad_output, eps=1e-6): + del weight + x32 = x.float() + rstd = torch.rsqrt(x32.square().mean(dim=-1) + float(eps)) + act = _GATE_ACTIVATIONS[self.activation] + rows = grad_output.float() * _gate_activation_fp32(gate, act) * x32 * rstd.unsqueeze(-1) + return {"weight": rows} diff --git a/rl_engine/kernels/registry.py b/rl_engine/kernels/registry.py index 3b935499a..f3aa51bb1 100644 --- a/rl_engine/kernels/registry.py +++ b/rl_engine/kernels/registry.py @@ -158,6 +158,18 @@ class OpBackend(Enum, metaclass=_KernelEnumMeta): TRITON_RMS_NORM = "rl_engine.kernels.ops.triton.rmsnorm_triton.RMSNormTritonOp" PYTORCH_NATIVE_RMS_NORM = "rl_engine.kernels.ops.pytorch.norm.rms_norm.NativeRMSNormOp" + # Zero-centred RMSNorm (Qwen3-Next decoder / final norm) + CUDA_QWEN3_NEXT_RMS_NORM = "rl_engine.kernels.ops.cuda.norm.rmsnorm.Qwen3NextRMSNormCudaOp" + PYTORCH_NATIVE_QWEN3_NEXT_RMS_NORM = ( + "rl_engine.kernels.ops.pytorch.norm.qwen3_next_rms_norm.Qwen3NextRMSNormOp" + ) + + # Gated RMSNorm (Qwen3-Next Gated DeltaNet block) + CUDA_RMS_NORM_GATED = "rl_engine.kernels.ops.cuda.norm.rmsnorm.Qwen3NextRMSNormGatedCudaOp" + PYTORCH_NATIVE_RMS_NORM_GATED = ( + "rl_engine.kernels.ops.pytorch.norm.qwen3_next_rms_norm.Qwen3NextRMSNormGatedOp" + ) + # Generic fallback TRITON_GENERIC = "rl_engine.kernels.ops.triton.generic.TritonOp" PYTORCH_ATTN = "rl_engine.kernels.ops.pytorch.attention.NativeAttentionOp" @@ -594,6 +606,14 @@ def __init__(self): OpBackend.CUDA_RMS_NORM, OpBackend.PYTORCH_NATIVE_RMS_NORM, ], + "rms_norm_gated": [ + OpBackend.CUDA_RMS_NORM_GATED, + OpBackend.PYTORCH_NATIVE_RMS_NORM_GATED, + ], + "qwen3_next_rms_norm": [ + OpBackend.CUDA_QWEN3_NEXT_RMS_NORM, + OpBackend.PYTORCH_NATIVE_QWEN3_NEXT_RMS_NORM, + ], "lm_head": [OpBackend.PYTORCH_NATIVE_LM_HEAD], "embedding": [OpBackend.PYTORCH_NATIVE_EMBEDDING], "silu": [ @@ -649,6 +669,8 @@ def __init__(self): ], "matmul": [OpBackend.PYTORCH_NATIVE_MATMUL], "rms_norm": [OpBackend.PYTORCH_NATIVE_RMS_NORM], + "rms_norm_gated": [OpBackend.PYTORCH_NATIVE_RMS_NORM_GATED], + "qwen3_next_rms_norm": [OpBackend.PYTORCH_NATIVE_QWEN3_NEXT_RMS_NORM], "lm_head": [OpBackend.PYTORCH_NATIVE_LM_HEAD], "embedding": [OpBackend.PYTORCH_NATIVE_EMBEDDING], "silu": [OpBackend.TRITON_SILU, OpBackend.PYTORCH_NATIVE_SILU], @@ -690,6 +712,8 @@ def __init__(self): OpBackend.TRITON_RMS_NORM, OpBackend.PYTORCH_NATIVE_RMS_NORM, ], + "rms_norm_gated": [OpBackend.PYTORCH_NATIVE_RMS_NORM_GATED], + "qwen3_next_rms_norm": [OpBackend.PYTORCH_NATIVE_QWEN3_NEXT_RMS_NORM], "lm_head": [OpBackend.PYTORCH_NATIVE_LM_HEAD], "embedding": [ OpBackend.TRITON_EMBEDDING, @@ -718,6 +742,8 @@ def __init__(self): "batch_invariant_logp": [OpBackend.PYTORCH_BATCH_INVARIANT_LOGP], "matmul": [OpBackend.PYTORCH_NATIVE_MATMUL], "rms_norm": [OpBackend.PYTORCH_NATIVE_RMS_NORM], + "rms_norm_gated": [OpBackend.PYTORCH_NATIVE_RMS_NORM_GATED], + "qwen3_next_rms_norm": [OpBackend.PYTORCH_NATIVE_QWEN3_NEXT_RMS_NORM], "lm_head": [OpBackend.PYTORCH_NATIVE_LM_HEAD], "embedding": [OpBackend.PYTORCH_NATIVE_EMBEDDING], "silu": [OpBackend.PYTORCH_NATIVE_SILU], @@ -758,6 +784,12 @@ def __init__(self): OpBackend.ASCEND_RMS_NORM, OpBackend.PYTORCH_NATIVE_RMS_NORM, ] + self._priority_map["npu"]["rms_norm_gated"] = [ + OpBackend.PYTORCH_NATIVE_RMS_NORM_GATED, + ] + self._priority_map["npu"]["qwen3_next_rms_norm"] = [ + OpBackend.PYTORCH_NATIVE_QWEN3_NEXT_RMS_NORM, + ] self._priority_map["npu"]["embedding"] = [ OpBackend.ASCEND_EMBEDDING, OpBackend.PYTORCH_NATIVE_EMBEDDING, diff --git a/rl_engine/tests/test_dispatch.py b/rl_engine/tests/test_dispatch.py index d095619ee..ed873c2dd 100644 --- a/rl_engine/tests/test_dispatch.py +++ b/rl_engine/tests/test_dispatch.py @@ -4,6 +4,7 @@ import sys from types import ModuleType +import pytest import torch import rl_engine.platforms.device as device_module @@ -256,3 +257,38 @@ def test_executor_flow(): print("\n All infrastructure tests passed!") except Exception as e: print(f"\n Test failed with error: {e}") + + +def test_gated_rms_norm_priority_is_cuda_first_with_pytorch_fallback(): + """The gated norm has a CUDA kernel; every other platform falls back. + + No Triton, ROCm or Ascend gated kernel exists yet, so those platforms must + resolve to the PyTorch reference rather than to nothing -- an operator + missing from a priority map falls through to ``OpBackend.PYTORCH_NATIVE``, + which is the logprob op, not a norm. + """ + registry = KernelRegistry() + + assert registry._priority_map["cuda"]["rms_norm_gated"] == [ + OpBackend.CUDA_RMS_NORM_GATED, + OpBackend.PYTORCH_NATIVE_RMS_NORM_GATED, + ] + for platform in ("rocm", "musa", "cpu", "npu"): + assert registry._priority_map[platform]["rms_norm_gated"] == [ + OpBackend.PYTORCH_NATIVE_RMS_NORM_GATED + ], platform + + +def test_gated_rms_norm_cuda_backend_reports_absence_by_failing_construction(monkeypatch): + """Without the compiled symbols the CUDA backend must be skipped, not returned.""" + from rl_engine.kernels.ops.cuda.norm import rmsnorm as cuda_rmsnorm + from rl_engine.kernels.ops.pytorch.norm.qwen3_next_rms_norm import Qwen3NextRMSNormGatedOp + + monkeypatch.setattr(cuda_rmsnorm, "_EXT_AVAILABLE", False) + monkeypatch.setattr(cuda_rmsnorm, "_C", None) + with pytest.raises(RuntimeError, match="requires the compiled rl_engine._C extension"): + cuda_rmsnorm.Qwen3NextRMSNormGatedCudaOp() + + # ... and the registry must therefore hand out the reference, not raise. + resolved = KernelRegistry().get_op("rms_norm_gated") + assert isinstance(resolved, Qwen3NextRMSNormGatedOp) diff --git a/tests/test_qwen3_next_norm.py b/tests/test_qwen3_next_norm.py index a62d8410f..c1f7e9d73 100644 --- a/tests/test_qwen3_next_norm.py +++ b/tests/test_qwen3_next_norm.py @@ -458,6 +458,221 @@ def test_cuda_zero_centred_backward_is_offset_aware(): assert torch.equal(grads["plain"][1], grads["zero_centred"][1]) # dw does not +# --------------------------------------------------------------------------- # +# 7. Gated RMSNorm CUDA kernel (the GDN block's norm) +# --------------------------------------------------------------------------- # +_HAS_CUDA_GATED = False +if torch.cuda.is_available(): # pragma: no branch - probe only + try: + from rl_engine.kernels.ops.base import _C as _C_probe + from rl_engine.kernels.ops.base import _EXT_AVAILABLE as _EXT_probe + + _HAS_CUDA_GATED = _EXT_probe and hasattr(_C_probe, "rmsnorm_gated_forward") + except ImportError: # pragma: no cover + _HAS_CUDA_GATED = False + +requires_cuda_gated = pytest.mark.skipif( + not _HAS_CUDA_GATED, reason="gated RMSNorm CUDA extension is not available" +) + +# tolerance_contract.json, judgments/forward_accuracy/by_op_class/reduction/bfloat16 +_BF16_ATOL, _BF16_RTOL = 2e-2, 1.6e-2 + + +def _gated_cuda_inputs(seed=0, rows=512, hidden=_HEAD_V_DIM, dtype=torch.bfloat16): + g = torch.Generator(device="cuda").manual_seed(seed) + x = torch.randn(rows, hidden, device="cuda", dtype=dtype, generator=g) + gate = torch.randn(rows, hidden, device="cuda", dtype=dtype, generator=g) + weight = torch.randn(hidden, device="cuda", dtype=dtype, generator=g) + return x, weight, gate + + +@requires_cuda_gated +def test_cuda_gated_matches_golden_within_contract(): + from rl_engine.kernels.ops.cuda.norm.rmsnorm import Qwen3NextRMSNormGatedCudaOp + + x, w, gate = _gated_cuda_inputs() + got = Qwen3NextRMSNormGatedCudaOp().forward(x, w, gate, eps=_EPS) + ref = Qwen3NextRMSNormGatedOp().forward_fp32(x, w, gate, eps=_EPS) + torch.testing.assert_close(got.float(), ref, atol=_BF16_ATOL, rtol=_BF16_RTOL) + + +@requires_cuda_gated +def test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel(): + """The gate must not perturb the normalization statistic. + + Same x, same rstd, bitwise -- otherwise the gate has leaked into the + reduction and the two kernels no longer share a contract. + """ + from rl_engine.kernels.ops.base import _C + + x, w, gate = _gated_cuda_inputs() + _, rstd_gated = _C.rmsnorm_gated_forward(x, w, gate, _EPS, 0.0, 0) + _, rstd_plain = _C.rmsnorm_forward(x, w, _EPS, 0.0) + assert torch.equal(rstd_gated, rstd_plain) + + +@requires_cuda_gated +@pytest.mark.parametrize("batch", [1, 2, 8, 16, 32, 48, 64, 512]) +def test_cuda_gated_batch_invariance(batch): + """L1 across the RFC #428 concurrency axis, bitwise.""" + from rl_engine.kernels.ops.cuda.norm.rmsnorm import Qwen3NextRMSNormGatedCudaOp + + op = Qwen3NextRMSNormGatedCudaOp() + x, w, gate = _gated_cuda_inputs() + full = op.forward(x, w, gate, eps=_EPS) + assert torch.equal(op.forward(x[:batch], w, gate[:batch], eps=_EPS), full[:batch]) + + +@requires_cuda_gated +def test_cuda_gated_zero_gate_zeroes_output(): + from rl_engine.kernels.ops.cuda.norm.rmsnorm import Qwen3NextRMSNormGatedCudaOp + + x, w, _ = _gated_cuda_inputs() + out = Qwen3NextRMSNormGatedCudaOp().forward(x, w, torch.zeros_like(x), eps=_EPS) + assert torch.equal(out, torch.zeros_like(out)) + + +@requires_cuda_gated +def test_cuda_gated_unit_weight_is_plain_norm_times_silu(): + from rl_engine.kernels.ops.cuda.norm.rmsnorm import ( + Qwen3NextRMSNormGatedCudaOp, + rmsnorm_cuda, + ) + + x, _, gate = _gated_cuda_inputs() + ones = torch.ones(_HEAD_V_DIM, device="cuda", dtype=x.dtype) + got = Qwen3NextRMSNormGatedCudaOp().forward(x, ones, gate, eps=_EPS).float() + ref = rmsnorm_cuda(x, ones, eps=_EPS).float() * F.silu(gate.float()) + torch.testing.assert_close(got, ref, atol=_BF16_ATOL, rtol=_BF16_RTOL) + + +@requires_cuda_gated +def test_cuda_gated_sigmoid_activation(): + from rl_engine.kernels.ops.cuda.norm.rmsnorm import rmsnorm_gated_cuda, rmsnorm_cuda + + x, w, gate = _gated_cuda_inputs() + got = rmsnorm_gated_cuda(x, w, gate, eps=_EPS, activation="sigmoid").float() + ref = rmsnorm_cuda(x, w, eps=_EPS).float() * torch.sigmoid(gate.float()) + torch.testing.assert_close(got, ref, atol=_BF16_ATOL, rtol=_BF16_RTOL) + + +@requires_cuda_gated +def test_cuda_gated_backward_matches_autograd_golden(): + """dx, dweight and dgate against the fp32 reference's autograd.""" + from rl_engine.kernels.ops.cuda.norm.rmsnorm import rmsnorm_gated_cuda + + x, w, gate = _gated_cuda_inputs() + x, w, gate = x.float(), w.float(), gate.float() + dy = torch.randn_like(x) + + got = [t.clone().requires_grad_(True) for t in (x, w, gate)] + rmsnorm_gated_cuda(*got, eps=_EPS).backward(dy) + ref = [t.clone().requires_grad_(True) for t in (x, w, gate)] + Qwen3NextRMSNormGatedOp().forward_fp32(*ref, eps=_EPS).backward(dy) + + for name, a, b in zip(("dx", "dweight", "dgate"), got, ref): + torch.testing.assert_close(a.grad, b.grad, atol=1e-4, rtol=1e-4, msg=name) + + +@requires_cuda_gated +@pytest.mark.parametrize("batch", [1, 8, 64, 512]) +def test_cuda_gated_dweight_is_batch_invariant(batch): + """A row's contribution to dweight must not depend on the batch it sits in. + + The ascending-row fp32 left fold makes dweight over the first n rows exactly + the fold of those n row-contributions -- so the n-row run must reproduce the + 512-row run's prefix, bitwise. + """ + from rl_engine.kernels.ops.base import _C + from rl_engine.kernels.ops.cuda.norm.rmsnorm import rmsnorm_gated_cuda + from rl_engine.kernels.ops.vjp_fp32 import reduce_rows_fp32 + + x, w, gate = _gated_cuda_inputs() + x, w, gate = x.float(), w.float(), gate.float() + dy = torch.randn_like(x) + + wg = w.clone().requires_grad_(True) + rmsnorm_gated_cuda(x[:batch], wg, gate[:batch], eps=_EPS).backward(dy[:batch]) + + # rstd from the full-batch forward: the row statistic is batch-invariant, so + # its prefix is what the n-row run must have seen. Recomputing it with + # mean(-1) instead would compare against a different reduction. + _, rstd_full = _C.rmsnorm_gated_forward(x, w, gate, _EPS, 0.0, 0) + rows = dy * F.silu(gate) * x * rstd_full.unsqueeze(-1) + assert torch.equal(wg.grad, reduce_rows_fp32(rows[:batch])) + + +@requires_cuda_gated +def test_cuda_gated_weight_offset_is_applied_in_fp32(): + """The gated kernel carries the same offset contract as the plain one.""" + from rl_engine.kernels.ops.cuda.norm.rmsnorm import rmsnorm_gated_cuda + + x, w, gate = _gated_cuda_inputs() + offset = rmsnorm_gated_cuda(x, w, gate, eps=_EPS, weight_offset=1.0) + explicit = rmsnorm_gated_cuda(x, (1.0 + w.float()), gate, eps=_EPS) + assert torch.equal(offset, explicit) + folded = rmsnorm_gated_cuda(x, (1.0 + w.float()).bfloat16(), gate, eps=_EPS) + assert not torch.equal(offset, folded) + + +@requires_cuda_gated +def test_cuda_gated_parameter_vjp_contributions_match_the_fold(): + """The harness hook must return the same rows the backward folds.""" + from rl_engine.kernels.ops.cuda.norm.rmsnorm import Qwen3NextRMSNormGatedCudaOp + + x, w, gate = _gated_cuda_inputs(rows=64) + x, w, gate = x.float(), w.float(), gate.float() + dy = torch.randn_like(x) + + rows = Qwen3NextRMSNormGatedCudaOp().parameter_vjp_contributions_fp32( + x=x, weight=w, gate=gate, grad_output=dy, eps=_EPS + )["weight"] + rstd = torch.rsqrt(x.square().mean(dim=-1) + _EPS) + expected = dy * F.silu(gate) * x * rstd.unsqueeze(-1) + torch.testing.assert_close(rows, expected, atol=1e-6, rtol=1e-6) + + +@requires_cuda_gated +def test_cuda_gated_sigmoid_backward_uses_the_sigmoid_derivative(): + """The activation gradient has two branches; only silu was covered.""" + from rl_engine.kernels.ops.cuda.norm.rmsnorm import rmsnorm_gated_cuda + + x, w, gate = _gated_cuda_inputs(rows=64) + x, w, gate = x.float(), w.float(), gate.float() + dy = torch.randn_like(x) + + got = [t.clone().requires_grad_(True) for t in (x, w, gate)] + rmsnorm_gated_cuda(*got, eps=_EPS, activation="sigmoid").backward(dy) + + ref = [t.clone().requires_grad_(True) for t in (x, w, gate)] + rstd = torch.rsqrt(ref[0].square().mean(dim=-1) + _EPS) + out = (ref[0] * rstd.unsqueeze(-1) * ref[1]) * torch.sigmoid(ref[2]) + out.backward(dy) + for name, a, b in zip(("dx", "dweight", "dgate"), got, ref): + torch.testing.assert_close(a.grad, b.grad, atol=1e-4, rtol=1e-4, msg=name) + + +@requires_cuda_gated +def test_cuda_gated_rejects_bad_activation(): + from rl_engine.kernels.ops.cuda.norm.rmsnorm import rmsnorm_gated_cuda + + x, w, gate = _gated_cuda_inputs(rows=8) + with pytest.raises(ValueError, match="activation must be one of"): + rmsnorm_gated_cuda(x, w, gate, eps=_EPS, activation="gelu") + + +@requires_cuda_gated +def test_cuda_gated_rejects_mismatched_gate(): + from rl_engine.kernels.ops.cuda.norm.rmsnorm import rmsnorm_gated_cuda + + x, w, gate = _gated_cuda_inputs(rows=8) + with pytest.raises((AssertionError, RuntimeError)): + rmsnorm_gated_cuda(x, w, gate[:4], eps=_EPS) + with pytest.raises((AssertionError, RuntimeError)): + rmsnorm_gated_cuda(x, w, gate.float(), eps=_EPS) + + # --------------------------------------------------------------------------- # # 8. `__call__` is the documented entry point and must agree with `forward` # --------------------------------------------------------------------------- # diff --git a/tests/test_ws1_gtest_gpu.py b/tests/test_ws1_gtest_gpu.py index 2f4ec8648..84b6daccb 100644 --- a/tests/test_ws1_gtest_gpu.py +++ b/tests/test_ws1_gtest_gpu.py @@ -36,6 +36,8 @@ def test_all_ws1_single_ops_are_registered(): names = set(operator_names()) assert { "rms_norm", + "rms_norm_gated", + "qwen3_next_rms_norm", "qk_norm", "det_gemm", "attention", From d03c8523a6e39bb616deead401d13ff9b53b4740 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Thu, 1 Oct 2026 21:36:52 +0000 Subject: [PATCH 08/70] fix(norm): contract tolerances and corrected claims for the Qwen3-Next norms Tests: the low-precision and CUDA-vs-golden comparisons hard-coded atol=2e-2/rtol=1.6e-2, which is the contract's elementwise bf16 row. They now resolve forward_accuracy for op_class="reduction" from tolerance_contract.json. That loosens bf16 (5e-2/2e-2) and tightens fp16 (1e-3/1e-3, previously 2e-2); the fp16 cases still pass. The vLLM provider-gap bounds in tests/check_qwen3_next_norm_providers.py are labelled as gap bounds, not contract thresholds. Docs and docstrings: correct statements this branch had committed. - The operator page no longer says the op is registered or prints a check_operator command; the gtest spec and registry entry arrive with the gated-norm PR. - Withdrawn: "7 of 1048576 differ" (single seed, no script), the 35% / 5.3e-2 cast-order isolation (an fp32 round-trip is a no-op), "needed on CUDA as well", and "matching vLLM means trading L1 for L2" (one unreproduced observation). Replaced with the scoped claim levels and the probe results. - The provider check no longer claims to establish which path vLLM dispatches, or a per-element fp32 ULP bound. - The module docstring is cut to the contract and links to the operator page. Comments: why the kernel's offset add is guarded (signed zero, with the pinning test), and why parameter_vjp_contributions_fp32 passes the offset. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- csrc/cuda/rmsnorm.cu | 3 + docs/operators/qwen3-next-rms-norm.md | 60 +++++++++------ rl_engine/kernels/ops/cuda/norm/rmsnorm.py | 2 + .../ops/pytorch/norm/qwen3_next_rms_norm.py | 76 +++++-------------- tests/check_qwen3_next_norm_providers.py | 43 ++++++----- tests/test_qwen3_next_norm.py | 22 ++++-- 6 files changed, 102 insertions(+), 104 deletions(-) diff --git a/csrc/cuda/rmsnorm.cu b/csrc/cuda/rmsnorm.cu index 5b570c557..0c09b3a4a 100644 --- a/csrc/cuda/rmsnorm.cu +++ b/csrc/cuda/rmsnorm.cu @@ -143,6 +143,9 @@ __global__ void rmsnorm_fwd_kernel( for (int col = tid; col < H; col += blockDim.x) { float xv = load_as_float(x_row + col); float wv = load_as_float(weight + col); + // Guarded: `-0.0f + 0.0f` is +0.0f, so an unconditional add would flip the + // sign bit of -0.0 weights on the plain path. Pinned by + // tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved. if (weight_offset != 0.0f) wv += weight_offset; float out = xv * row_rstd * wv; store_from_float(y_row + col, out); diff --git a/docs/operators/qwen3-next-rms-norm.md b/docs/operators/qwen3-next-rms-norm.md index 292139bea..81fdde9b3 100644 --- a/docs/operators/qwen3-next-rms-norm.md +++ b/docs/operators/qwen3-next-rms-norm.md @@ -49,32 +49,47 @@ y = rmsnorm_cuda(x, weight, eps=1e-6, weight_offset=1.0) ## Dispatch Behavior -Registered as the `qwen3_next_rms_norm` gtest operator. On CUDA the registry -prefers `Qwen3NextRMSNormCudaOp`; every other platform resolves to the PyTorch -reference. The CUDA op validates the compiled symbols in `__init__`, so on a build -without the extension construction raises and the registry falls through to the -reference rather than handing out an op that fails at call time. +Not registered on this branch: there is no `qwen3_next_rms_norm` gtest spec and no +registry entry yet. Both arrive with the gated-norm PR. Until then, construct the +ops directly as in "Entry Point". The CUDA op validates the compiled symbols in +`__init__`, so on a build without the extension construction raises instead of +handing out an op that fails at call time. ## Accuracy -Claim level: **L0 repeatable, L1 batch-invariant**. L2 is not claimed. +Claim levels: -The reduction is the repo's fixed 32-wide chunked sum -(`shape_invariant_rstd`), which is what makes a row's result independent of the -batch layout. It deliberately differs from upstream's `mean(-1)`: measured on B200, -over 20 seeds at `H=2048` in bf16, a plain `mean(-1)` broke slice invariance on 1 -of 20 while the chunked reduction broke on 0 of 20. +- **L1** (prefix-slice and concurrency) for `Qwen3NextRMSNormCudaOp`; padding, + packing and order are not tested for the CUDA op. +- **L1** (slice, concurrency and padding) for `Qwen3NextRMSNormOp`. +- **L0** for `Qwen3NextRMSNormOp` only (CPU, fp32); no test repeats the CUDA op. +- L2 is not claimed. -The cost is that the decoder norm is **not** bitwise equal to stock vLLM — 7 -elements of 1048576 differ, `max|diff| = 1.56e-2` in bf16 at `H=2048`. That gap is -inherent: matching stock vLLM bitwise would mean adopting a reduction that is not -itself batch-invariant, i.e. trading L1 for L2. +The PyTorch reference uses the repo's fixed 32-wide chunked sum +(`shape_invariant_rstd`, introduced in `8ed1693` as a device-agnostic reference). +On B200, over 20 seeds at `H=2048` in bf16, a plain `mean(-1)` broke slice +invariance on 1 of 20 seeds (slices `x[3:5]` and `x[:1]` of 64 rows; which one +failed was not recorded), and the chunked reduction broke on none. That is a recorded +observation, not an assertion. + +The CUDA kernel has its own fixed-order reduction (per-thread strided partial sums, +then `block_reduce_sum`). It is not bitwise equal to the PyTorch reference. + +Neither is bitwise equal to vLLM. In one-off probes (not committed checks), the +reference differed from every vLLM path tried (eager, inductor-compiled, and eager +under `VLLM_BATCH_INVARIANT=1`) on 36–39 of 40 seeds, `max|diff| <= 1.56e-2` +(bf16, `H=2048`, 512 rows). The difference is attributed to reduction order, but that +has not been isolated. Only the no-residual call was compared; vLLM's +`fused_add_rms_norm` path (every decoder norm except layer 0's input norm) has no +reference here. The in-kernel offset is exact, not an approximation: `weight_offset=1.0` is bitwise equal to passing an explicit fp32 `1 + w` weight, and differs from a bf16-folded `1 + w`, both asserted. -Tolerances come from `tolerance_contract.json` (`reduction` × dtype); no private +Accuracy tests resolve their tolerances from `tolerance_contract.json` +(`forward_accuracy`, `reduction` × dtype). The bounds in +`tests/check_qwen3_next_norm_providers.py` are provider-gap bounds, not contract thresholds. ## Performance Notes @@ -83,11 +98,6 @@ The CUDA path reuses the existing `rmsnorm_fwd_kernel` reduction (`block_reduce_sum` over `choose_threads(H)`), so the offset costs one fp32 add per element and no extra memory traffic. -```bash -python scripts/check_operator.py --op qwen3_next_rms_norm --candidate cuda \ - --device cuda --dtype bf16 --check-grad -``` - ## Tests ```bash @@ -97,7 +107,11 @@ python -m pytest tests/test_qwen3_next_norm.py -v ## Known Limitations - CUDA only; no ROCm, Ascend or Triton backend. -- Not bitwise against stock vLLM (see Accuracy); an L2 claim needs the strict - provider on both sides, per RFC #428 §1 item 1. +- Not registered as a gtest operator or in the registry on this branch (see + "Dispatch Behavior"). +- Not bitwise against vLLM (see Accuracy). An L2 claim needs a single source of + truth for the forward on both sides, per RFC #428 §0 item 1. +- The gated pair (`Qwen3NextRMSNormGatedOp`, `Qwen3NextRMSNormGatedHFOp`) is + documented with its CUDA kernel in the gated-norm PR, not on this page. - Measured on sm_100 (B200). Per RFC #428 §2.2 no claim carries across H100/H200/B100/B200. diff --git a/rl_engine/kernels/ops/cuda/norm/rmsnorm.py b/rl_engine/kernels/ops/cuda/norm/rmsnorm.py index 7d5a7a754..af9a31358 100644 --- a/rl_engine/kernels/ops/cuda/norm/rmsnorm.py +++ b/rl_engine/kernels/ops/cuda/norm/rmsnorm.py @@ -145,6 +145,8 @@ def forward(self, x, weight, *, eps=1e-6): def parameter_vjp_contributions_fp32(self, *, x, weight, grad_output, eps=1e-6): hidden = x.shape[-1] + # Only `rstd` is used, and it does not depend on the offset; the offset is + # passed so this is the same call the forward makes, not because it matters. _, rstd = _C.rmsnorm_forward( x.contiguous().reshape(-1, hidden), weight.contiguous(), diff --git a/rl_engine/kernels/ops/pytorch/norm/qwen3_next_rms_norm.py b/rl_engine/kernels/ops/pytorch/norm/qwen3_next_rms_norm.py index 5261245d0..2b3c410a9 100644 --- a/rl_engine/kernels/ops/pytorch/norm/qwen3_next_rms_norm.py +++ b/rl_engine/kernels/ops/pytorch/norm/qwen3_next_rms_norm.py @@ -3,66 +3,26 @@ """Qwen3-Next RMSNorm references (WS1 ground truth for RFC #428 C1). -Qwen3-Next ships two RMSNorm conventions that differ both in how the weight is -applied and in where the dtype casts sit. They are kept as separate operators -because the cast order is part of the contract, not a flag: +Qwen3-Next ships two RMSNorm conventions. They differ in how the weight is applied +and in where the dtype casts sit, so they are separate operators rather than a flag: ``Qwen3NextRMSNorm`` (decoder / final norm) - normalize in fp32, scale by ``(1 + weight)`` in fp32, cast once at the end. - The stored weight is zero-centred, so the ``1 +`` offset MUST be applied - after the fp32 upcast -- folding it into a bf16 weight first rounds the - offset and silently breaks the bitwise claim. + Normalize in fp32, scale by ``(1 + weight)`` in fp32, cast once at the end. The + stored weight is zero-centred, so the ``1 +`` must be applied after the fp32 + upcast; folding it into a bf16 weight first rounds the offset. ``Qwen3NextRMSNormGated`` (inside the Gated DeltaNet block) - normalize in fp32, scale by a plain (non zero-centred) weight, then gate by - ``silu(gate)``. Where the weight multiply happens is NOT agreed upstream -- - see below -- so it is an explicit part of the operator identity here. - -Divergence at the gated-norm boundary (measured) -------------------------------------------------- -``transformers`` and vLLM do not agree on the gated variant: - -* vLLM (``RMSNormGated``, both ``forward_native`` and the FLA Triton - ``forward_cuda``) keeps the normalized value in fp32 for the weight multiply. -* ``transformers`` (``Qwen3NextRMSNormGated``) casts the normalized value back - to the input dtype *before* the weight multiply. - -On B200 / bf16 / ``head_v_dim=128`` these differ in 35% of elements with -``max|diff| = 6.25e-2``; swapping only the cast order reproduces the gap -(``5.3e-2``), so the cast order -- not the reduction order -- dominates. Because -RFC #428 claims L2 exactness against **vLLM rollout**, the fp32 multiply is the -strict default; the transformers convention is kept as a named witness so the -divergence stays testable instead of being silently picked. - -What "agrees with vLLM" means here, precisely ----------------------------------------------- -Only the *convention* is reproduced, not the bits. vLLM's own two paths are not -bitwise equal to each other: over 40 seeds (bf16, ``head_v_dim=128``, 512 rows), -``forward_native`` and ``forward_cuda`` disagreed on 21, worst -``max|diff| = 1.56e-2``. Against this operator the figures were 6/40 and 18/40. -So "bitwise equal to vLLM" is undefined until a single provider is named, and -this operator does not claim it -- see the reduction-order note below. - -Both reuse :func:`shape_invariant_rstd` so the reduction order -- and hence the -result -- never depends on the batch layout (RFC #428 section 6, item 2). The -reduction order therefore deliberately differs from upstream's ``mean(-1)``; -what is reproduced exactly is the weight convention and the cast order. - -Why the chunked reduction is kept on CUDA too ---------------------------------------------- -:func:`shape_invariant_rstd` was introduced for NPU, where ``mean``/``sum`` pick -shape-dependent kernels. Measured on B200 (sm_100) it is needed on CUDA as well: -over 20 seeds at ``H=2048`` in bf16 -- Qwen3-Next's own ``hidden_size`` and dtype --- a plain ``mean(-1)`` broke slice invariance (``rstd(x[3:5]) != rstd(x)[3:5]``) -on 1 of 20, while the chunked reduction broke on 0 of 20. Failures were also seen -at ``H=5120`` in fp32. - -The cost is that the decoder norm is NOT bitwise equal to stock vLLM: 7 elements -of 1048576 differ (``max|diff| = 1.56e-2``, bf16, H=2048). That gap is inherent -- -matching stock vLLM bitwise would mean adopting a reduction that is itself not -batch-invariant, i.e. trading L1 for L2. These operators therefore claim L0 and L1 -only; an L2 claim needs the strict provider on both sides, per RFC #428 section 1, -item 1. + Normalize in fp32, scale by a plain weight, then gate by ``silu(gate)``. + vLLM's ``RMSNormGated`` multiplies the weight in fp32; transformers casts the + normalized value back to the input dtype first. ``Qwen3NextRMSNormGatedOp`` + follows vLLM; ``Qwen3NextRMSNormGatedHFOp`` keeps the transformers convention + as a witness, and ``test_gated_conventions_diverge_in_low_precision`` pins that + the two differ in bf16 and agree bitwise in fp32. + +All three reuse :func:`shape_invariant_rstd`, a fixed-order reduction. They +reproduce the weight convention and cast order, not vLLM's reduction tree, and are +not bitwise equal to any vLLM path probed so far. Claim levels, measurements and +limitations are in ``docs/operators/qwen3-next-rms-norm.md``. """ from __future__ import annotations @@ -100,8 +60,8 @@ class Qwen3NextRMSNormGatedOp: ``out = (x * rstd * weight) * silu(gate)``, with every multiply in fp32 and a single cast on the way out. This is the convention vLLM's ``RMSNormGated`` - uses with ``norm_before_gate=True``, which is what the RFC #428 L2 claim is - measured against. + uses with ``norm_before_gate=True``. Which gated convention is the strict + default is still open; see the operator page. Not a subclass of the plain op: it takes an extra tensor and its epilogue differs, so it is not a drop-in substitute for one. diff --git a/tests/check_qwen3_next_norm_providers.py b/tests/check_qwen3_next_norm_providers.py index 062052cfa..7086aa341 100644 --- a/tests/check_qwen3_next_norm_providers.py +++ b/tests/check_qwen3_next_norm_providers.py @@ -1,7 +1,7 @@ # SPDX-License-Identifier: Apache-2.0 # Copyright (c) 2026 RL-Kernel Contributors -"""Which vLLM gated-RMSNorm path is the strict provider, and how far apart are they. +"""How far apart vLLM's eager gated-RMSNorm paths are, and ours from each. Named ``check_`` rather than ``test_`` on purpose, following ``tests/distributed/check_*.py``: this module imports real vLLM, and @@ -16,13 +16,17 @@ provider is named, because vLLM ships several and they do not agree bitwise with each other. -This module pins two things so a vLLM upgrade cannot move them silently: +This module records two things so a vLLM upgrade cannot move them silently: -1. **Dispatch facts** -- which provider actually runs, asserted on the env - defaults and the registered ops rather than inferred from reading one branch. +1. **Provider facts** -- the GDN decode env defaults, and that ``RMSNormGated`` + has distinct ``forward_native`` and ``forward_cuda`` methods. It does NOT + determine which path vLLM dispatches at runtime: the checks below call each + method directly (eager), and vLLM's default compiled mode traces + ``forward_native`` into an inductor graph instead. 2. **The size of the gap** -- a seed sweep that asserts an upper bound on the - disagreement and on the mismatch rate. It deliberately does NOT assert - equality; the point is to keep the number honest, not to pretend it is zero. + disagreement and on the mismatch rate between the eager paths. The bounds are + provider-gap bounds, not ``tolerance_contract.json`` thresholds, and they + deliberately do NOT assert equality. Measured on 2x B200 (sm_100, torch 2.13.0+cu130, vllm 0.30.0), bf16, ``head_v_dim=128``, 512 rows, 40 seeds: @@ -101,21 +105,24 @@ def _disagreement(a: torch.Tensor, b: torch.Tensor) -> tuple[float, float]: # --------------------------------------------------------------------------- # -# 1. Dispatch facts -- which provider actually runs +# 1. Provider facts -- recorded, not a runtime dispatch check # --------------------------------------------------------------------------- # def test_custom_op_has_distinct_native_and_cuda_paths(vllm_config_ctx): - """`forward_native` is a reference; `forward_cuda` is what CustomOp dispatches.""" + """The two methods are distinct. Which one runs depends on the vLLM mode: eager + (``custom_ops="all"``) dispatches ``forward_cuda``; the default compiled mode + traces ``forward_native``. This test does not check that choice.""" norm = _make_norm() assert type(norm).forward_cuda is not type(norm).forward_native def test_gdn_decode_provider_env_defaults_are_recorded(): - """Pin the env defaults that decide which GDN decode kernel runs. + """Record the GDN decode env defaults. - These are what make ``fused_recurrent_gated_delta_rule_packed_decode`` (not - ``fused_sigmoid_gating_delta_rule_update``) the rollout decode path. If a - vLLM bump flips either default, the provider identity behind any L2 claim - changes, so this must fail loudly rather than drift. + This records the defaults only; it does not assert which kernel runs. For + Qwen3-Next the ``VLLM_GDN_DECODE_KERNEL="cuda"`` default does not take effect: + vLLM builds its GDN layers with ``gqa_interleaved_layout=True`` and falls back + to the Triton decode kernel. A change of either default still fails here, as a + prompt to re-derive the decode path. """ pytest.importorskip("vllm", reason="vLLM is required to identify the provider") import vllm.envs as envs @@ -141,12 +148,11 @@ def test_gdn_decode_provider_env_defaults_are_recorded(): @pytest.mark.parametrize( "dtype, max_abs, max_mismatch_rate", [ - # bf16 rounding absorbs most of the reduction-tree difference, so few - # elements move -- but each that does moves by a whole bf16 ULP. + # Provider-gap bounds, not contract thresholds. bf16 rounding absorbs most + # of the reduction-tree difference, so few elements move. (torch.bfloat16, 2e-2, 0.05), - # fp32 has nothing to absorb it: ~36% of elements differ, every one of - # them by an fp32 ULP. Bounding the rate here would be measuring the - # wrong thing; the magnitude is what says the two agree semantically. + # In fp32 about 36% of elements differ, so the rate is left unbounded and + # only the magnitude is bounded (no per-element ULP bound is asserted). (torch.float32, 1e-5, 1.0), ], ) @@ -196,6 +202,7 @@ def test_ours_tracks_each_vllm_path_within_bounds(vllm_config_ctx, path): abs_d, rate = _disagreement(ours.forward(x, weight, gate), reference) worst_abs, worst_rate = max(worst_abs, abs_d), max(worst_rate, rate) + # Provider-gap bounds, not contract thresholds. assert worst_abs <= 2e-2, f"worst |diff| vs {path} was {worst_abs:.3e}" assert worst_rate <= 0.05, f"mismatch rate vs {path} was {worst_rate:.3%}" diff --git a/tests/test_qwen3_next_norm.py b/tests/test_qwen3_next_norm.py index 9fdf02e73..a62d8410f 100644 --- a/tests/test_qwen3_next_norm.py +++ b/tests/test_qwen3_next_norm.py @@ -5,7 +5,8 @@ Claim levels exercised here (RFC #428 section 2.1): * L0 repeatable -- identical inputs reproduce bitwise identical outputs. - * L1 batch-invariant -- a row is unaffected by unrelated rows, padding or order. + * L1 batch-invariant -- a row is unaffected by slicing, concurrency and (for the + PyTorch reference) padding; packing and order are not exercised. L2 (train-rollout exact against vLLM) is NOT claimed by this file; it needs the rollout engine on the other side. @@ -22,6 +23,7 @@ import torch import torch.nn.functional as F +from rl_engine.kernels.gtest.tolerance import load_contract, resolve_tolerance from rl_engine.kernels.ops.pytorch.norm.qwen3_next_rms_norm import ( Qwen3NextRMSNormGatedHFOp, Qwen3NextRMSNormGatedOp, @@ -33,6 +35,16 @@ _HEAD_V_DIM = 128 # linear_value_head_dim -- the gated norm width _EPS = 1e-6 # rms_norm_eps +_CONTRACT = load_contract() + + +def _forward_tol(dtype: torch.dtype) -> dict[str, float]: + """C1 forward_accuracy row for the ``reduction`` op class -- no private thresholds.""" + spec = resolve_tolerance( + _CONTRACT, judgment="forward_accuracy", op_class="reduction", dtype=dtype + ) + return {"atol": spec.atol, "rtol": spec.rtol} + def _rand(shape, seed): g = torch.Generator().manual_seed(seed) @@ -277,7 +289,7 @@ def test_matches_upstream_formula_low_precision(dtype): w = _rand((_HIDDEN,), seed=22).to(dtype) got, ref = op.forward(x, w), _hf_rms_norm(x, w) assert got.dtype == ref.dtype == dtype - torch.testing.assert_close(got.float(), ref.float(), atol=2e-2, rtol=1.6e-2) + torch.testing.assert_close(got.float(), ref.float(), **_forward_tol(dtype)) @pytest.mark.parametrize("dtype", [torch.bfloat16, torch.float16]) @@ -289,7 +301,7 @@ def test_gated_hf_witness_low_precision(dtype): gate = _rand((4, 16, _HEAD_V_DIM), seed=25).to(dtype) got, ref = op.forward(x, w, gate), _hf_rms_norm_gated(x, w, gate) assert got.dtype == ref.dtype == dtype - torch.testing.assert_close(got.float(), ref.float(), atol=2e-2, rtol=1.6e-2) + torch.testing.assert_close(got.float(), ref.float(), **_forward_tol(dtype)) @pytest.mark.parametrize("dtype", [torch.bfloat16, torch.float16]) @@ -300,7 +312,7 @@ def test_gated_strict_low_precision(dtype): gate = _rand((4, 16, _HEAD_V_DIM), seed=25).to(dtype) got, ref = op.forward(x, w, gate), _vllm_rms_norm_gated(x, w, gate) assert got.dtype == ref.dtype == dtype - torch.testing.assert_close(got.float(), ref.float(), atol=2e-2, rtol=1.6e-2) + torch.testing.assert_close(got.float(), ref.float(), **_forward_tol(dtype)) # --------------------------------------------------------------------------- # @@ -421,7 +433,7 @@ def test_cuda_zero_centred_within_tolerance_of_golden(): w = torch.randn(_HIDDEN, device="cuda", dtype=torch.bfloat16) got = Qwen3NextRMSNormCudaOp().forward(x, w, eps=_EPS) ref = Qwen3NextRMSNormOp().forward_fp32(x, w, eps=_EPS) - torch.testing.assert_close(got.float(), ref, atol=2e-2, rtol=1.6e-2) + torch.testing.assert_close(got.float(), ref, **_forward_tol(torch.bfloat16)) @requires_cuda_rmsnorm From 7dd291a9d25757079406989004745ebd3b7a7284 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Wed, 30 Sep 2026 18:22:52 +0000 Subject: [PATCH 09/70] fix(norm): enforce gated tensor boundaries and align parameter VJP statistics Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- csrc/cuda/rmsnorm.cu | 13 +++ csrc/ops.cpp | 27 ++++++ docs/operators/qwen3-next-rms-norm-gated.md | 10 ++- rl_engine/_C.pyi | 17 ++++ rl_engine/kernels/ops/cuda/norm/rmsnorm.py | 37 +++++--- .../ops/pytorch/norm/qwen3_next_rms_norm.py | 2 + tests/test_qwen3_next_norm.py | 88 +++++++++++++++---- 7 files changed, 162 insertions(+), 32 deletions(-) diff --git a/csrc/cuda/rmsnorm.cu b/csrc/cuda/rmsnorm.cu index c80945300..2d5c98ec4 100644 --- a/csrc/cuda/rmsnorm.cu +++ b/csrc/cuda/rmsnorm.cu @@ -389,6 +389,7 @@ void rmsnorm_forward_cuda( // device, which need not be x's. const at::cuda::OptionalCUDAGuard device_guard(device_of(x)); int T = x.size(0); + if (T == 0) return; int H = x.size(1); int threads = choose_threads(H); size_t smem = threads * sizeof(float); @@ -411,6 +412,7 @@ void rmsnorm_forward_cuda( ); }); }); + C10_CUDA_KERNEL_LAUNCH_CHECK(); } @@ -424,6 +426,7 @@ void rmsnorm_backward_dx_cuda( ) { const at::cuda::OptionalCUDAGuard device_guard(device_of(x)); int T = x.size(0); + if (T == 0) return; int H = x.size(1); int threads = choose_threads(H); size_t smem = threads * sizeof(float); @@ -446,6 +449,7 @@ void rmsnorm_backward_dx_cuda( ); }); }); + C10_CUDA_KERNEL_LAUNCH_CHECK(); } @@ -459,7 +463,9 @@ void rmsnorm_gated_forward_cuda( double weight_offset, int64_t activation ) { + const c10::cuda::CUDAGuard device_guard(x.device()); int T = x.size(0); + if (T == 0) return; int H = x.size(1); int threads = choose_threads(H); size_t smem = threads * sizeof(float); @@ -483,6 +489,7 @@ void rmsnorm_gated_forward_cuda( } }); }); + C10_CUDA_KERNEL_LAUNCH_CHECK(); } @@ -496,7 +503,9 @@ void rmsnorm_gated_backward_dx_cuda( double weight_offset, int64_t activation ) { + const c10::cuda::CUDAGuard device_guard(x.device()); int T = x.size(0); + if (T == 0) return; int H = x.size(1); int threads = choose_threads(H); size_t smem = threads * sizeof(float); @@ -520,6 +529,7 @@ void rmsnorm_gated_backward_dx_cuda( } }); }); + C10_CUDA_KERNEL_LAUNCH_CHECK(); } void rmsnorm_backward_partial_dw_cuda( @@ -531,6 +541,7 @@ void rmsnorm_backward_partial_dw_cuda( ) { const at::cuda::OptionalCUDAGuard device_guard(device_of(x)); int T = x.size(0); + if (T == 0) return; int H = x.size(1); int chunks = (T + RMSNORM_DW_ROWS_PER_CHUNK - 1) / RMSNORM_DW_ROWS_PER_CHUNK; @@ -550,6 +561,7 @@ void rmsnorm_backward_partial_dw_cuda( H ); }); + C10_CUDA_KERNEL_LAUNCH_CHECK(); } @@ -572,6 +584,7 @@ void rmsnorm_backward_reduce_dw_cuda( chunks, H ); + C10_CUDA_KERNEL_LAUNCH_CHECK(); } #if !defined(USE_ROCM) diff --git a/csrc/ops.cpp b/csrc/ops.cpp index b37ab102c..1efb116fc 100644 --- a/csrc/ops.cpp +++ b/csrc/ops.cpp @@ -315,6 +315,24 @@ static void rmsnorm_check_input(const torch::Tensor& x, const char* name) { TORCH_CHECK(x.is_contiguous(), name, " must be contiguous"); } +static void rmsnorm_check_weight(const torch::Tensor& x, const torch::Tensor& weight) { + TORCH_CHECK(x.dim() == 2 && x.size(1) > 0, "x must be 2D with positive hidden size"); + TORCH_CHECK(x.scalar_type() == torch::kFloat32 || x.scalar_type() == torch::kFloat16 || + x.scalar_type() == torch::kBFloat16, "x must be float32, float16 or bfloat16"); + TORCH_CHECK(weight.dim() == 1 && weight.size(0) == x.size(1), "weight must be [H]"); + TORCH_CHECK(weight.device() == x.device(), "weight must be on the same device as x"); + TORCH_CHECK(weight.scalar_type() == x.scalar_type() || weight.scalar_type() == torch::kFloat32, + "weight must have x dtype or float32"); +} + +static void rmsnorm_check_backward(const torch::Tensor& dy, const torch::Tensor& x, + const torch::Tensor& rstd) { + TORCH_CHECK(dy.device() == x.device() && rstd.device() == x.device(), + "dy and rstd must be on the same device as x"); + TORCH_CHECK(dy.scalar_type() == x.scalar_type(), "dy must have the same dtype as x"); + TORCH_CHECK(rstd.scalar_type() == torch::kFloat32, "rstd must be float32"); +} + std::vector rmsnorm_forward( torch::Tensor x, torch::Tensor weight, @@ -323,6 +341,7 @@ std::vector rmsnorm_forward( { rmsnorm_check_input(x, "x"); rmsnorm_check_input(weight, "weight"); + rmsnorm_check_weight(x, weight); TORCH_CHECK(x.dim() == 2, "x must be 2D [T, H]"); TORCH_CHECK(weight.dim() == 1, "weight must be 1D [H]"); @@ -347,7 +366,9 @@ torch::Tensor rmsnorm_backward_dx( rmsnorm_check_input(dy, "dy"); rmsnorm_check_input(x, "x"); rmsnorm_check_input(weight, "weight"); + rmsnorm_check_weight(x, weight); rmsnorm_check_input(rstd, "rstd"); + rmsnorm_check_backward(dy, x, rstd); TORCH_CHECK(dy.sizes() == x.sizes(), "dy and x must have same shape"); TORCH_CHECK(x.dim() == 2, "x must be 2D [T, H]"); @@ -370,7 +391,9 @@ static void rmsnorm_gated_check( { rmsnorm_check_input(x, "x"); rmsnorm_check_input(weight, "weight"); + rmsnorm_check_weight(x, weight); rmsnorm_check_input(gate, "gate"); + TORCH_CHECK(gate.device() == x.device(), "gate must be on the same device as x"); TORCH_CHECK(x.dim() == 2, "x must be 2D [T, H]"); TORCH_CHECK(weight.dim() == 1, "weight must be 1D [H]"); @@ -417,6 +440,7 @@ torch::Tensor rmsnorm_gated_backward_dx( rmsnorm_gated_check(x, weight, gate, activation); rmsnorm_check_input(dy, "dy"); rmsnorm_check_input(rstd, "rstd"); + rmsnorm_check_backward(dy, x, rstd); TORCH_CHECK(dy.sizes() == x.sizes(), "dy must have the same shape as x"); TORCH_CHECK(rstd.dim() == 1 && rstd.size(0) == x.size(0), "rstd must be [T]"); @@ -438,6 +462,7 @@ torch::Tensor rmsnorm_backward_dw( rmsnorm_check_input(dy, "dy"); rmsnorm_check_input(x, "x"); rmsnorm_check_input(rstd, "rstd"); + rmsnorm_check_backward(dy, x, rstd); rmsnorm_check_input(mask, "mask"); TORCH_CHECK(dy.sizes() == x.sizes(), "dy and x must have same shape"); @@ -445,6 +470,8 @@ torch::Tensor rmsnorm_backward_dw( TORCH_CHECK(rstd.dim() == 1, "rstd must be 1D [T]"); TORCH_CHECK(mask.dim() == 1, "mask must be 1D [T]"); TORCH_CHECK(mask.scalar_type() == torch::kBool, "mask must be bool"); + TORCH_CHECK(mask.device() == x.device(), "mask must be on the same device as x"); + TORCH_CHECK(x.size(1) > 0, "hidden size must be positive"); TORCH_CHECK(rstd.size(0) == x.size(0), "rstd.size(0) must equal x.size(0)"); TORCH_CHECK(mask.size(0) == x.size(0), "mask.size(0) must equal x.size(0)"); diff --git a/docs/operators/qwen3-next-rms-norm-gated.md b/docs/operators/qwen3-next-rms-norm-gated.md index 1bc531ea6..55071d25b 100644 --- a/docs/operators/qwen3-next-rms-norm-gated.md +++ b/docs/operators/qwen3-next-rms-norm-gated.md @@ -47,12 +47,16 @@ required tensor, so it cannot stand in for one. | Argument | Shape | Dtype | Requirements | | --- | --- | --- | --- | -| `x` | `[..., H]` | fp32 / bf16 / fp16 | contiguous on the CUDA path | -| `weight` | `[H]` | matches `x` | plain, NOT zero-centred | -| `gate` | same as `x` | same as `x` | shape and dtype are enforced | +| `x` | `[..., H]` | fp32 / bf16 / fp16 | H > 0; wrapper makes contiguous copies | +| `weight` | `[H]` | matches `x` or fp32 | plain, NOT zero-centred | +| `gate` | same as `x` | same as `x` | shape, dtype and device must match before flattening | | `eps` | scalar | float | `1e-6` for Qwen3-Next | | `activation` | — | `"silu"`/`"swish"`/`"sigmoid"` | anything else is rejected | +All tensors must share a device. Low-level CUDA bindings require contiguous +2-D inputs, and validate backward gradient dtype and FP32 statistics. Empty +batches are supported by the bindings. + Only `norm_before_gate=True` and `group_size=None` are implemented — the single configuration vLLM's GDN block constructs. Other configurations fail closed rather than being approximated (RFC #428 §6 item 7). diff --git a/rl_engine/_C.pyi b/rl_engine/_C.pyi index b911feaf7..1e686fb9c 100644 --- a/rl_engine/_C.pyi +++ b/rl_engine/_C.pyi @@ -269,6 +269,23 @@ def rmsnorm_backward_dx( rstd: torch.Tensor, weight_offset: float = ..., ) -> torch.Tensor: ... +def rmsnorm_gated_forward( + x: torch.Tensor, + weight: torch.Tensor, + gate: torch.Tensor, + eps: float, + weight_offset: float = ..., + activation: int = ..., +) -> list[torch.Tensor]: ... +def rmsnorm_gated_backward_dx( + dy: torch.Tensor, + x: torch.Tensor, + weight: torch.Tensor, + gate: torch.Tensor, + rstd: torch.Tensor, + weight_offset: float = ..., + activation: int = ..., +) -> torch.Tensor: ... def rmsnorm_backward_dw( dy: torch.Tensor, x: torch.Tensor, diff --git a/rl_engine/kernels/ops/cuda/norm/rmsnorm.py b/rl_engine/kernels/ops/cuda/norm/rmsnorm.py index fc1aa9554..3c66e144c 100644 --- a/rl_engine/kernels/ops/cuda/norm/rmsnorm.py +++ b/rl_engine/kernels/ops/cuda/norm/rmsnorm.py @@ -163,6 +163,7 @@ class Qwen3NextRMSNormCudaOp(RMSNormCudaOp): # Gated RMSNorm (Qwen3-Next GDN block) # --------------------------------------------------------------------------- # + def _require_cuda_symbols(what: str, *names: str) -> None: """Raise when the compiled kernels backing ``what`` are missing. @@ -225,9 +226,9 @@ def forward(ctx, x, weight, gate, eps=1e-6, weight_offset=0.0, activation=0): assert x.dim() == 2, "x must be [T, H]" assert weight.dim() == 1, "weight must be [H]" assert gate.shape == x.shape, "gate must match x" - assert _EXT_AVAILABLE and hasattr(_C, "rmsnorm_gated_forward"), ( - "Gated RMSNorm CUDA extension is unavailable. Rebuild with csrc/cuda/rmsnorm.cu." - ) + assert _EXT_AVAILABLE and hasattr( + _C, "rmsnorm_gated_forward" + ), "Gated RMSNorm CUDA extension is unavailable. Rebuild with csrc/cuda/rmsnorm.cu." y, rstd = _C.rmsnorm_gated_forward( x, weight, gate, float(eps), float(weight_offset), int(activation) @@ -246,9 +247,7 @@ def backward(ctx, grad_out): dy = grad_out.contiguous() act = ctx.activation - dx = _C.rmsnorm_gated_backward_dx( - dy, x, weight, gate, rstd, ctx.weight_offset, act - ) + dx = _C.rmsnorm_gated_backward_dx(dy, x, weight, gate, rstd, ctx.weight_offset, act) # dweight: the gate is a per-element constant here, so the ungated row # contributions apply once dy carries act(gate). @@ -259,9 +258,7 @@ def backward(ctx, grad_out): # dgate: row-local and reduction-free. normed = x.float() * rstd.unsqueeze(-1) scale = weight.float() + ctx.weight_offset - dgate = (dy.float() * normed * scale * _gate_activation_grad_fp32(gate, act)).to( - gate.dtype - ) + dgate = (dy.float() * normed * scale * _gate_activation_grad_fp32(gate, act)).to(gate.dtype) record_backward( "rms_norm_gated", @@ -321,6 +318,8 @@ def __call__(self, x, weight, gate, *, eps=1e-6): return self.forward(x, weight, gate, eps=eps) def forward(self, x, weight, gate, *, eps=1e-6): + if gate.shape != x.shape: + raise ValueError(f"gate must match x, got {tuple(gate.shape)} vs {tuple(x.shape)}") hidden = x.shape[-1] x_2d = x.contiguous().view(-1, hidden) gate_2d = gate.contiguous().view(-1, hidden) @@ -335,9 +334,21 @@ def forward(self, x, weight, gate, *, eps=1e-6): return y_2d.view_as(x) def parameter_vjp_contributions_fp32(self, *, x, weight, gate, grad_output, eps=1e-6): - del weight - x32 = x.float() - rstd = torch.rsqrt(x32.square().mean(dim=-1) + float(eps)) + if gate.shape != x.shape: + raise ValueError(f"gate must match x, got {tuple(gate.shape)} vs {tuple(x.shape)}") + hidden = x.shape[-1] act = _GATE_ACTIVATIONS[self.activation] - rows = grad_output.float() * _gate_activation_fp32(gate, act) * x32 * rstd.unsqueeze(-1) + _, rstd = _C.rmsnorm_gated_forward( + x.contiguous().reshape(-1, hidden), + weight.contiguous(), + gate.contiguous().reshape(-1, hidden), + float(eps), + float(self.weight_offset), + act, + ) + rows = rmsnorm_dweight_rows_fp32( + x, + grad_output.float() * _gate_activation_fp32(gate, act), + rstd=rstd.reshape(x.shape[:-1]), + ) return {"weight": rows} diff --git a/rl_engine/kernels/ops/pytorch/norm/qwen3_next_rms_norm.py b/rl_engine/kernels/ops/pytorch/norm/qwen3_next_rms_norm.py index 2b3c410a9..1f84f86f3 100644 --- a/rl_engine/kernels/ops/pytorch/norm/qwen3_next_rms_norm.py +++ b/rl_engine/kernels/ops/pytorch/norm/qwen3_next_rms_norm.py @@ -113,6 +113,8 @@ def _normalized( f"gate must match x, got tuple(gate.shape)={tuple(gate.shape)} " f"vs tuple(x.shape)={tuple(x.shape)}" ) + if gate.dtype != x.dtype or gate.device != x.device: + raise ValueError("gate must have the same dtype and device as x") x_f = x.float() rstd = shape_invariant_rstd(x_f, float(eps)).unsqueeze(-1) return x_f * rstd diff --git a/tests/test_qwen3_next_norm.py b/tests/test_qwen3_next_norm.py index c1f7e9d73..2f738a1c8 100644 --- a/tests/test_qwen3_next_norm.py +++ b/tests/test_qwen3_next_norm.py @@ -535,10 +535,7 @@ def test_cuda_gated_zero_gate_zeroes_output(): @requires_cuda_gated def test_cuda_gated_unit_weight_is_plain_norm_times_silu(): - from rl_engine.kernels.ops.cuda.norm.rmsnorm import ( - Qwen3NextRMSNormGatedCudaOp, - rmsnorm_cuda, - ) + from rl_engine.kernels.ops.cuda.norm.rmsnorm import Qwen3NextRMSNormGatedCudaOp, rmsnorm_cuda x, _, gate = _gated_cuda_inputs() ones = torch.ones(_HEAD_V_DIM, device="cuda", dtype=x.dtype) @@ -549,7 +546,7 @@ def test_cuda_gated_unit_weight_is_plain_norm_times_silu(): @requires_cuda_gated def test_cuda_gated_sigmoid_activation(): - from rl_engine.kernels.ops.cuda.norm.rmsnorm import rmsnorm_gated_cuda, rmsnorm_cuda + from rl_engine.kernels.ops.cuda.norm.rmsnorm import rmsnorm_cuda, rmsnorm_gated_cuda x, w, gate = _gated_cuda_inputs() got = rmsnorm_gated_cuda(x, w, gate, eps=_EPS, activation="sigmoid").float() @@ -617,20 +614,35 @@ def test_cuda_gated_weight_offset_is_applied_in_fp32(): @requires_cuda_gated -def test_cuda_gated_parameter_vjp_contributions_match_the_fold(): - """The harness hook must return the same rows the backward folds.""" - from rl_engine.kernels.ops.cuda.norm.rmsnorm import Qwen3NextRMSNormGatedCudaOp +@pytest.mark.parametrize("dtype", [torch.float32, torch.bfloat16]) +@pytest.mark.parametrize("activation", ["silu", "sigmoid"]) +def test_cuda_gated_parameter_vjp_contributions_match_the_fold(dtype, activation): + """Compare the harness hook with actual autograd, including its CUDA rstd.""" + from rl_engine.kernels.ops.cuda.norm.rmsnorm import ( + Qwen3NextRMSNormGatedCudaOp, + _fold_dweight_rows, + ) - x, w, gate = _gated_cuda_inputs(rows=64) - x, w, gate = x.float(), w.float(), gate.float() + x, w, gate = (t.to(dtype) for t in _gated_cuda_inputs(rows=512)) + w = w.float().requires_grad_() dy = torch.randn_like(x) + op = Qwen3NextRMSNormGatedCudaOp() + op.activation = activation + op.forward(x, w, gate, eps=_EPS).backward(dy) + rows = op.parameter_vjp_contributions_fp32(x=x, weight=w, gate=gate, grad_output=dy, eps=_EPS)[ + "weight" + ] + assert torch.equal(_fold_dweight_rows(rows, torch.float32), w.grad) - rows = Qwen3NextRMSNormGatedCudaOp().parameter_vjp_contributions_fp32( - x=x, weight=w, gate=gate, grad_output=dy, eps=_EPS - )["weight"] - rstd = torch.rsqrt(x.square().mean(dim=-1) + _EPS) - expected = dy * F.silu(gate) * x * rstd.unsqueeze(-1) - torch.testing.assert_close(rows, expected, atol=1e-6, rtol=1e-6) + +@requires_cuda_gated +def test_cuda_gated_wrapper_rejects_equal_numel_wrong_shape(): + from rl_engine.kernels.ops.cuda.norm.rmsnorm import Qwen3NextRMSNormGatedCudaOp + + x, w, gate = _gated_cuda_inputs(rows=6) + x = x.reshape(2, 3, -1) + with pytest.raises(ValueError, match="gate must match x"): + Qwen3NextRMSNormGatedCudaOp().forward(x, w, gate) @requires_cuda_gated @@ -764,3 +776,47 @@ def test_zero_centred_cuda_constructor_rejects_missing_extension(monkeypatch): monkeypatch.setattr(rmsnorm, "_C", None) with pytest.raises(RuntimeError, match="requires the compiled"): rmsnorm.Qwen3NextRMSNormCudaOp() + + +@requires_cuda_gated +@pytest.mark.parametrize( + "fault", ["weight_shape", "weight_dtype", "gate_dtype", "dy_dtype", "rstd_dtype"] +) +def test_gated_extension_rejects_invalid_tensor_contract(fault): + from rl_engine import _C + + x, w, gate = _gated_cuda_inputs(rows=8) + dy = torch.ones_like(x) + rstd = torch.ones(8, device=x.device, dtype=torch.float32) + if fault == "weight_shape": + w = w[:-1] + elif fault == "weight_dtype": + w = w.half() + elif fault == "gate_dtype": + gate = gate.float() + elif fault == "dy_dtype": + dy = dy.float() + else: + rstd = rstd.bfloat16() + with pytest.raises(RuntimeError): + _C.rmsnorm_gated_backward_dx(dy, x, w, gate, rstd) + + +@requires_cuda_gated +def test_gated_extension_handles_empty_batch_and_nondefault_stream(): + from rl_engine import _C + + stream = torch.cuda.Stream() + with torch.cuda.stream(stream): + x, w, gate = _gated_cuda_inputs(rows=8) + actual, rstd = _C.rmsnorm_gated_forward(x, w, gate, _EPS) + dx = _C.rmsnorm_gated_backward_dx(torch.ones_like(x), x, w, gate, rstd) + empty, empty_rstd = _C.rmsnorm_gated_forward(x[:0], w, gate[:0], _EPS) + empty_dx = _C.rmsnorm_gated_backward_dx(x[:0], x[:0], w, gate[:0], empty_rstd) + stream.synchronize() + expected, expected_rstd = _C.rmsnorm_gated_forward(x, w, gate, _EPS) + expected_dx = _C.rmsnorm_gated_backward_dx(torch.ones_like(x), x, w, gate, expected_rstd) + assert torch.equal(actual, expected) + assert torch.equal(dx, expected_dx) + assert empty.shape == empty_dx.shape == (0, x.shape[-1]) + assert empty_rstd.numel() == 0 From 8df1ffbc4a3984dd3a25bacd1b46633d915dc88a Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Wed, 30 Sep 2026 18:34:21 +0000 Subject: [PATCH 10/70] test(norm): add Qwen3-Next workload and C3 C4 adapters Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- ci/run_ws1_gtest.sh | 10 + rl_engine/kernels/gtest/gradient_adapters.py | 58 +- .../testing/qwen3_next_norm_manifest.json | 759 ++++++++++++++++++ rl_engine/testing/qwen3_next_workload.py | 90 +++ rl_engine/testing/ws1_workload.py | 18 +- scripts/check_forward_invariance.py | 16 +- scripts/check_gradient_invariance.py | 16 +- tests/test_qwen3_next_workload.py | 60 ++ tests/test_ws1_ascend_closeout.py | 22 + 9 files changed, 1035 insertions(+), 14 deletions(-) create mode 100644 rl_engine/testing/qwen3_next_norm_manifest.json create mode 100644 rl_engine/testing/qwen3_next_workload.py create mode 100644 tests/test_qwen3_next_workload.py diff --git a/ci/run_ws1_gtest.sh b/ci/run_ws1_gtest.sh index 0e9b172cc..03b77173d 100755 --- a/ci/run_ws1_gtest.sh +++ b/ci/run_ws1_gtest.sh @@ -75,3 +75,13 @@ for cell in required: ) print("[ws1-gtest] C8 gate passed") PY + +echo "[ws1-gtest] Qwen3-Next C3/C4 norms (operator scope)" +for op in qwen3_next_rms_norm rms_norm_gated; do + for gate in forward gradient; do + "$PY" "scripts/check_${gate}_invariance.py" \ + --manifest rl_engine/testing/qwen3_next_norm_manifest.json \ + --op "$op" --candidate cuda --backend-profile cuda_bf16 \ + --hidden 2048 --head-dim 128 + done +done diff --git a/rl_engine/kernels/gtest/gradient_adapters.py b/rl_engine/kernels/gtest/gradient_adapters.py index 74bb2c0a0..a1fb325c0 100644 --- a/rl_engine/kernels/gtest/gradient_adapters.py +++ b/rl_engine/kernels/gtest/gradient_adapters.py @@ -53,6 +53,7 @@ class GradientAdapterSpec: source_files: tuple[str, ...] shape_dependent_bwd_accum: str = "forbidden" atomic_add: str = "forbidden" + model_id: str | None = None @dataclass(frozen=True) @@ -115,6 +116,26 @@ def to_dict(self) -> dict[str, Any]: "csrc/cuda/rmsnorm.cu", ), ), + "qwen3_next_rms_norm": GradientAdapterSpec( + op_name="qwen3_next_rms_norm", + chain_node="qwen3_next_rms_norm", + op_class="reduction", + spec_name="qwen3_next_rms_norm", + tensors=(_DX, _DWEIGHT), + requirement="required", + source_files=("rl_engine/kernels/ops/cuda/norm/rmsnorm.py", "csrc/cuda/rmsnorm.cu"), + model_id="Qwen/Qwen3-Next-80B-A3B-Instruct", + ), + "rms_norm_gated": GradientAdapterSpec( + op_name="rms_norm_gated", + chain_node="rms_norm_gated", + op_class="reduction", + spec_name="rms_norm_gated", + tensors=(_DX, _DWEIGHT, _DGATE), + requirement="required", + source_files=("rl_engine/kernels/ops/cuda/norm/rmsnorm.py", "csrc/cuda/rmsnorm.cu"), + model_id="Qwen/Qwen3-Next-80B-A3B-Instruct", + ), "qk_norm": GradientAdapterSpec( op_name="qk_norm", chain_node="qk_norm", @@ -291,18 +312,27 @@ def get_adapter(op_name: str) -> GradientAdapterSpec: raise KeyError(f"unknown gradient adapter {op_name!r}") from exc -def required_gradient_adapters() -> tuple[GradientAdapterSpec, ...]: +def required_gradient_adapters( + manifest: WS1Manifest | None = None, +) -> tuple[GradientAdapterSpec, ...]: + selected = manifest or load_manifest() + model_id = selected.model_identity["model_id"] + subset = selected.raw.get("scope") == "qwen3_next_norm_operators" return tuple( spec for spec in GRADIENT_ADAPTERS.values() if spec.requirement in ("required", "layout_supported") + and spec.model_id in (None, model_id) + and (not subset or spec.model_id == model_id) ) -def required_forward_adapters() -> tuple[GradientAdapterSpec, ...]: +def required_forward_adapters( + manifest: WS1Manifest | None = None, +) -> tuple[GradientAdapterSpec, ...]: """Same enumerable WS1 ops as C4; C3 reuses the registry, not a second list.""" - return required_gradient_adapters() + return required_gradient_adapters(manifest) @dataclass(frozen=True) @@ -620,9 +650,9 @@ def _row_parameters( head_dim: int = 16, ) -> dict[str, torch.Tensor]: """Config-independent trainable parameters, built in the execution dtype.""" - if op_name == "rms_norm": + if op_name in {"rms_norm", "qwen3_next_rms_norm"}: return {"weight": _shared_parameter((hidden,), device=device, dtype=dtype, offset=1)} - if op_name == "qk_norm": + if op_name in {"qk_norm", "rms_norm_gated"}: return {"weight": _shared_parameter((head_dim,), device=device, dtype=dtype, offset=1)} if op_name == "det_gemm": return {"b": _shared_parameter((hidden, hidden), device=device, dtype=dtype, offset=2)} @@ -663,12 +693,19 @@ def _row_inputs( """ n = len(keys) leading = (n,) - if op_name == "rms_norm": + if op_name in {"rms_norm", "qwen3_next_rms_norm"}: return { "x": _stack_rows(keys, leading, (hidden,), device=device, dtype=dtype), "weight": params["weight"], "eps": 1.0e-6, } + if op_name == "rms_norm_gated": + return { + "x": _stack_rows(keys, leading, (head_dim,), device=device, dtype=dtype), + "gate": _stack_rows(keys, leading, (head_dim,), device=device, dtype=dtype, offset=7), + "weight": params["weight"], + "eps": 1.0e-6, + } if op_name == "qk_norm": return { "x": _stack_rows(keys, leading, (head_dim,), device=device, dtype=dtype), @@ -1228,6 +1265,15 @@ def resolve_profile_candidate( manifest: WS1Manifest | None = None, ) -> dict[str, Any]: m = manifest if manifest is not None else load_manifest() + subset = m.raw.get("scope") == "qwen3_next_norm_operators" + if adapter.model_id not in (None, m.model_identity["model_id"]) or ( + subset and adapter.model_id != m.model_identity["model_id"] + ): + return { + "status": "absent_not_required", + "expected_backend_id": None, + "candidate_path": None, + } if adapter.requirement == "absent_not_required": return { "status": "absent_not_required", diff --git a/rl_engine/testing/qwen3_next_norm_manifest.json b/rl_engine/testing/qwen3_next_norm_manifest.json new file mode 100644 index 000000000..9cf5977ef --- /dev/null +++ b/rl_engine/testing/qwen3_next_norm_manifest.json @@ -0,0 +1,759 @@ +{ + "version": "1.0", + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "seed": 20260812, + "model_identity": { + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "config_fingerprint": { + "num_hidden_layers": 48, + "hidden_size": 2048, + "intermediate_size": 5120, + "num_attention_heads": 16, + "num_key_value_heads": 2, + "head_dim": 256, + "vocab_size": 151936, + "linear_key_head_dim": 128, + "linear_value_head_dim": 128, + "linear_num_key_heads": 16, + "linear_num_value_heads": 32, + "num_experts": 512, + "num_experts_per_tok": 10 + }, + "exit_forbids_architecture_shrink": true, + "weight_snapshot": { + "pin_method": "revision-and-sha256", + "total_size_bytes": 162649725440, + "index_file": "model.safetensors.index.json", + "index_sha256": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "content_hash_algorithm": "sha256-of-sorted-shard-records-v1", + "content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "shards": [ + { + "filename": "model-00001-of-00041.safetensors", + "size_bytes": 3999619256, + "sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + { + "filename": "model-00002-of-00041.safetensors", + "size_bytes": 3999841784, + "sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + { + "filename": "model-00003-of-00041.safetensors", + "size_bytes": 3999515584, + "sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + { + "filename": "model-00004-of-00041.safetensors", + "size_bytes": 3999842000, + "sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + { + "filename": "model-00005-of-00041.safetensors", + "size_bytes": 3999842208, + "sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + { + "filename": "model-00006-of-00041.safetensors", + "size_bytes": 3999853216, + "sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + { + "filename": "model-00007-of-00041.safetensors", + "size_bytes": 3999841912, + "sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + { + "filename": "model-00008-of-00041.safetensors", + "size_bytes": 3999842000, + "sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + { + "filename": "model-00009-of-00041.safetensors", + "size_bytes": 3999843192, + "sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + { + "filename": "model-00010-of-00041.safetensors", + "size_bytes": 3999517808, + "sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + { + "filename": "model-00011-of-00041.safetensors", + "size_bytes": 4000181296, + "sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + { + "filename": "model-00012-of-00041.safetensors", + "size_bytes": 3999843880, + "sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + { + "filename": "model-00013-of-00041.safetensors", + "size_bytes": 3999517472, + "sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + { + "filename": "model-00014-of-00041.safetensors", + "size_bytes": 3999843984, + "sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + { + "filename": "model-00015-of-00041.safetensors", + "size_bytes": 4000181736, + "sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + { + "filename": "model-00016-of-00041.safetensors", + "size_bytes": 3999517256, + "sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + { + "filename": "model-00017-of-00041.safetensors", + "size_bytes": 3999843880, + "sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + { + "filename": "model-00018-of-00041.safetensors", + "size_bytes": 3999843880, + "sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + { + "filename": "model-00019-of-00041.safetensors", + "size_bytes": 3999844096, + "sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + { + "filename": "model-00020-of-00041.safetensors", + "size_bytes": 3999855040, + "sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + { + "filename": "model-00021-of-00041.safetensors", + "size_bytes": 3999843792, + "sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + { + "filename": "model-00022-of-00041.safetensors", + "size_bytes": 3999843880, + "sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + { + "filename": "model-00023-of-00041.safetensors", + "size_bytes": 3999517464, + "sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + { + "filename": "model-00024-of-00041.safetensors", + "size_bytes": 3999844264, + "sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + { + "filename": "model-00025-of-00041.safetensors", + "size_bytes": 4000181296, + "sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + { + "filename": "model-00026-of-00041.safetensors", + "size_bytes": 3999517472, + "sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + { + "filename": "model-00027-of-00041.safetensors", + "size_bytes": 3999843880, + "sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + { + "filename": "model-00028-of-00041.safetensors", + "size_bytes": 3999843984, + "sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + { + "filename": "model-00029-of-00041.safetensors", + "size_bytes": 3999855320, + "sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + { + "filename": "model-00030-of-00041.safetensors", + "size_bytes": 3999843672, + "sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + { + "filename": "model-00031-of-00041.safetensors", + "size_bytes": 3999843880, + "sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + { + "filename": "model-00032-of-00041.safetensors", + "size_bytes": 3999843880, + "sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + { + "filename": "model-00033-of-00041.safetensors", + "size_bytes": 3999517688, + "sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + { + "filename": "model-00034-of-00041.safetensors", + "size_bytes": 4000181496, + "sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + { + "filename": "model-00035-of-00041.safetensors", + "size_bytes": 3999843792, + "sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + { + "filename": "model-00036-of-00041.safetensors", + "size_bytes": 3999517472, + "sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + { + "filename": "model-00037-of-00041.safetensors", + "size_bytes": 3999843872, + "sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + { + "filename": "model-00038-of-00041.safetensors", + "size_bytes": 3999844264, + "sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + { + "filename": "model-00039-of-00041.safetensors", + "size_bytes": 3999854888, + "sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + { + "filename": "model-00040-of-00041.safetensors", + "size_bytes": 3365572496, + "sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + { + "filename": "model-00041-of-00041.safetensors", + "size_bytes": 3301131296, + "sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + ], + "weight_files_total_size_bytes": 162659161528 + } + }, + "chain_semantics": { + "execution_dtype": "bfloat16", + "reference_dtype": "float32", + "accumulation_dtype": "float32", + "temperature": 1.0, + "loss_reduction": "sum_over_active_tokens_then_optional_mean_by_active_count", + "logprob_selection": "selected_token_logprob_on_active_mask", + "active_token_policy": "active selected tokens only", + "aggregates": [ + "max_abs_dlogp", + "approx_kl0", + "clipfrac0" + ], + "clip_interval": [ + 0.8, + 1.2 + ], + "clip_interval_note": "Pinned for clipfrac0; must match C1 chain_logprob_aggregates.default_clip_interval unless an explicit contract revision changes both.", + "comparison_roles_source": "rl_engine/kernels/gtest/tolerance_contract.json", + "forbidden_comparison_roles": [ + "baseline", + "singleton_aggregate" + ], + "singleton_aggregate_note": "singleton_aggregate is a C2 execution/aggregation mode only. It must never populate comparison_lhs_role or comparison_rhs_role.", + "tf32_policy_ref": "rl_engine/kernels/gtest/tolerance_contract.json#/policy/tf32", + "tf32_note": "WS1 TF32 enable/disable is owned by the C1 contract; C2 gates must not introduce a private TF32 policy.", + "report_naming": { + "comparison_lhs_role": "from_c1_by_report_kind", + "comparison_rhs_role": "from_c1_by_report_kind", + "forbidden_in_reports": [ + "baseline", + "singleton_aggregate" + ], + "singleton_aggregate_is": "c2_execution_aggregation_mode_only", + "note": "C2 freezes naming rules; C3+ emit reports that must obey these roles." + }, + "backend_actual_semantics": { + "c2_representative_actual_source": "scripts/ws1_candidate_evidence.py runtime execution", + "full_model_runtime_observed_actual_owner": [ + "C3", + "C8", + "C10", + "C11" + ], + "note": "C2 executes every representative case and records runtime-observed actual backend/kernel provenance. Later children own full-model dispatch provenance." + } + }, + "stochastic_policy": { + "dropout": 0.0, + "attention_dropout": 0.0, + "sampling_in_logprob_parity": false, + "canonical_gate_uses_dropout_zero": true, + "rng_source": "manifest_seed_plus_logical_sample_token_identity", + "undeclared_randomness": "hard_fail", + "retained_stochastic_ops": [] + }, + "primary_matrix": { + "description": "Fixed #150 Batch \u00d7 Chunked-Prefill matrix prerequisite workload cells.", + "N": 4, + "batch_size_bn": 4, + "sample_ids": [ + "s0", + "s1", + "s2", + "s3" + ], + "sample_order_fixed": true, + "batch_permutation": { + "enabled": true, + "permutation": [ + 2, + 0, + 3, + 1 + ], + "target_sample_position_in_bn": 0, + "note": "Permutation exercises layout invariance; logical compare restores sample_id order." + }, + "chunk": { + "chunk_size_tokens": 7, + "require_ge_2_chunks": true, + "non_divisible_case": true, + "note": "Longest primary seq_len=19 with chunk_size=7 yields chunks [7,7,5]." + }, + "cells": [ + { + "cell_id": "B1-singleton_aggregate/full", + "batch_mode": "singleton_aggregate", + "batch_size_per_run": 1, + "num_runs": 4, + "prefill_mode": "full", + "aggregation": { + "order": "sample_ids", + "denominator": "active_token_count_across_all_samples" + } + }, + { + "cell_id": "BN/full", + "batch_mode": "batched", + "batch_size_per_run": 4, + "num_runs": 1, + "prefill_mode": "full", + "aggregation": { + "order": "sample_ids", + "denominator": "active_token_count_across_all_samples" + } + }, + { + "cell_id": "B1-singleton_aggregate/chunked", + "batch_mode": "singleton_aggregate", + "batch_size_per_run": 1, + "num_runs": 4, + "prefill_mode": "chunked", + "aggregation": { + "order": "sample_ids", + "denominator": "active_token_count_across_all_samples" + } + }, + { + "cell_id": "BN/chunked", + "batch_mode": "batched", + "batch_size_per_run": 4, + "num_runs": 1, + "prefill_mode": "chunked", + "aggregation": { + "order": "sample_ids", + "denominator": "active_token_count_across_all_samples" + } + } + ] + }, + "fixtures": { + "prompt_template": "ws1_fixed_token_fixture", + "dtype_for_token_tensors": "int64", + "position_ids": { + "basis": "logical_zero_based_per_sample", + "reset_after_pack_boundary": true + }, + "attention_mask": { + "active_value": 1, + "padding_value": 0, + "causal": true + }, + "primary_seq_len": 19, + "primary_prompt_len": 8, + "short_seq_len": 8, + "long_seq_len": 32, + "varlen_seq_lens": [ + 11, + 16, + 13, + 19 + ], + "padding": { + "modes": [ + "right", + "left" + ], + "pad_token_id": 151643, + "primary_padded_len": 20 + }, + "packing": { + "status": "supported", + "implementation": "rl_engine.kernels.ops.pytorch.packing.pack.NativePackOp", + "packed_fixture": { + "sample_order": [ + "s0", + "s1", + "s2", + "s3" + ], + "segment_lengths": [ + 11, + 16, + 13, + 19 + ], + "total_tokens": 59, + "restore_key": [ + "sample_id", + "token_position" + ] + } + }, + "loss_mask": { + "prompt_tokens_active": false, + "completion_tokens_active": true + }, + "samples": [ + { + "sample_id": "s0", + "seq_len": 11, + "prompt_len": 8, + "token_ids": [ + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 200, + 201, + 202 + ] + }, + { + "sample_id": "s1", + "seq_len": 16, + "prompt_len": 8, + "token_ids": [ + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217 + ] + }, + { + "sample_id": "s2", + "seq_len": 13, + "prompt_len": 8, + "token_ids": [ + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 220, + 221, + 222, + 223, + 224 + ] + }, + { + "sample_id": "s3", + "seq_len": 19, + "prompt_len": 8, + "token_ids": [ + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239, + 240 + ] + } + ], + "short_full_model_fixture": { + "fixture_id": "short_full_model_seq8", + "seq_len": 8, + "prompt_len": 4, + "token_ids": [ + 310, + 311, + 312, + 313, + 410, + 411, + 412, + 413 + ], + "note": "Shorter sequence on full architecture+weights only; never shrinks layers/hidden/heads/vocab.", + "candidate_case_ids": [ + "short_full_model_seq8_qwen3_next_rms_norm", + "short_full_model_seq8_rms_norm_gated" + ] + }, + "long_full_model_fixture": { + "fixture_id": "long_full_model_seq32", + "seq_len": 32, + "prompt_len": 16, + "token_ids": [ + 500, + 501, + 502, + 503, + 504, + 505, + 506, + 507, + 508, + 509, + 510, + 511, + 512, + 513, + 514, + 515, + 600, + 601, + 602, + 603, + 604, + 605, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 613, + 614, + 615 + ], + "note": "Long fixed sequence on the same full architecture and pinned weight snapshot.", + "candidate_case_ids": [ + "long_full_model_seq32_qwen3_next_rms_norm", + "long_full_model_seq32_rms_norm_gated" + ] + }, + "representative_full_model_fixture": { + "fixture_id": "rep_full_model_seq16", + "seq_len": 16, + "prompt_len": 8, + "sample_ids": [ + "s0", + "s1", + "s2", + "s3" + ], + "note": "Primary variable-length matrix fixture; full architecture+weights.", + "candidate_case_ids": [ + "rep_full_model_seq16_qwen3_next_rms_norm", + "rep_full_model_seq16_rms_norm_gated" + ] + }, + "prompt_lens": [ + 8, + 8, + 8, + 8 + ], + "completion_lens": [ + 3, + 8, + 5, + 11 + ], + "max_completion_len": 11 + }, + "logical_identity": { + "key": [ + "sample_id", + "token_position" + ], + "token_position_basis": "logical_unpadded_index_in_sample", + "restore_before_compare_after": [ + "pad", + "pack", + "chunk", + "batch_permute" + ], + "gradient_singleton_aggregate": { + "definition": "N independent B=1 runs of the same N logical samples, aggregated with fixed sample order and active-token denominator", + "compare_to": "single B=N run of the same logical sample/token multiset", + "forbid_different_sample_sets": true + } + }, + "capabilities": { + "required_chain_ops": [ + { + "op": "qwen3_next_rms_norm", + "status": "required" + }, + { + "op": "rms_norm_gated", + "status": "required" + } + ], + "operator_spec_map": { + "qwen3_next_rms_norm": "qwen3_next_rms_norm", + "rms_norm_gated": "rms_norm_gated" + } + }, + "backend_profiles": { + "cuda_bf16": { + "backend_family": "cuda", + "execution_dtype": "bfloat16", + "required_nodes": [ + { + "node": "qwen3_next_rms_norm", + "status": "declared", + "expected_backend_id": "cuda", + "expected_kernel_config_id": "rl_engine.kernels.ops.cuda.norm.rmsnorm.Qwen3NextRMSNormCudaOp", + "algorithm_property": "fixed row reduction and ordered FP32 parameter fold" + }, + { + "node": "rms_norm_gated", + "status": "declared", + "expected_backend_id": "cuda", + "expected_kernel_config_id": "rl_engine.kernels.ops.cuda.norm.rmsnorm.Qwen3NextRMSNormGatedCudaOp", + "algorithm_property": "fixed row reduction and ordered FP32 parameter fold" + } + ] + }, + "triton_cuda_bf16": { + "backend_family": "triton", + "execution_dtype": "bfloat16", + "required_nodes": [ + { + "node": "qwen3_next_rms_norm", + "status": "missing_required", + "expected_backend_id": null, + "expected_kernel_config_id": null, + "algorithm_property": "fixed row reduction and ordered FP32 parameter fold" + }, + { + "node": "rms_norm_gated", + "status": "missing_required", + "expected_backend_id": null, + "expected_kernel_config_id": null, + "algorithm_property": "fixed row reduction and ordered FP32 parameter fold" + } + ] + }, + "ascend_bf16": { + "backend_family": "ascend", + "execution_dtype": "bfloat16", + "required_nodes": [ + { + "node": "qwen3_next_rms_norm", + "status": "missing_required", + "expected_backend_id": null, + "expected_kernel_config_id": null, + "algorithm_property": "fixed row reduction and ordered FP32 parameter fold" + }, + { + "node": "rms_norm_gated", + "status": "missing_required", + "expected_backend_id": null, + "expected_kernel_config_id": null, + "algorithm_property": "fixed row reduction and ordered FP32 parameter fold" + } + ] + } + }, + "representative_cases": [ + { + "case_id": "short_full_model_seq8_qwen3_next_rms_norm", + "fixture_id": "short_full_model_seq8", + "operator_spec": "qwen3_next_rms_norm", + "hidden": 2048, + "architecture_identity": "qwen3_next_80b_a3b_norm_operators" + }, + { + "case_id": "short_full_model_seq8_rms_norm_gated", + "fixture_id": "short_full_model_seq8", + "operator_spec": "rms_norm_gated", + "hidden": 128, + "architecture_identity": "qwen3_next_80b_a3b_norm_operators" + }, + { + "case_id": "long_full_model_seq32_qwen3_next_rms_norm", + "fixture_id": "long_full_model_seq32", + "operator_spec": "qwen3_next_rms_norm", + "hidden": 2048, + "architecture_identity": "qwen3_next_80b_a3b_norm_operators" + }, + { + "case_id": "long_full_model_seq32_rms_norm_gated", + "fixture_id": "long_full_model_seq32", + "operator_spec": "rms_norm_gated", + "hidden": 128, + "architecture_identity": "qwen3_next_80b_a3b_norm_operators" + }, + { + "case_id": "rep_full_model_seq16_qwen3_next_rms_norm", + "fixture_id": "rep_full_model_seq16", + "operator_spec": "qwen3_next_rms_norm", + "hidden": 2048, + "architecture_identity": "qwen3_next_80b_a3b_norm_operators" + }, + { + "case_id": "rep_full_model_seq16_rms_norm_gated", + "fixture_id": "rep_full_model_seq16", + "operator_spec": "rms_norm_gated", + "hidden": 128, + "architecture_identity": "qwen3_next_80b_a3b_norm_operators" + } + ], + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "provenance_boundary": { + "scope": "Synthetic norm inputs at checkpoint dimensions; not checkpoint execution or model-level L2.", + "runtime_verified": false + }, + "scope": "qwen3_next_norm_operators", + "full_model_evidence": false +} diff --git a/rl_engine/testing/qwen3_next_workload.py b/rl_engine/testing/qwen3_next_workload.py new file mode 100644 index 000000000..ffe3367cd --- /dev/null +++ b/rl_engine/testing/qwen3_next_workload.py @@ -0,0 +1,90 @@ +"""Qwen3-Next norm-only C3/C4 workload, explicitly separate from the Dense chain.""" + +from collections.abc import Mapping +from typing import Any + +from rl_engine.testing.ws1_workload import ( + WorkloadError, + _validate_backend_profiles, + _validate_fixtures, + _validate_logical_identity, + _validate_model_identity, + _validate_primary_matrix, + _validate_stochastic_policy, + manifest_identity_hash, +) + +MODEL_ID = "Qwen/Qwen3-Next-80B-A3B-Instruct" +REVISION = "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7" +FINGERPRINT = { + "num_hidden_layers": 48, + "hidden_size": 2048, + "intermediate_size": 5120, + "num_attention_heads": 16, + "num_key_value_heads": 2, + "head_dim": 256, + "vocab_size": 151936, + "linear_key_head_dim": 128, + "linear_value_head_dim": 128, + "linear_num_key_heads": 16, + "linear_num_value_heads": 32, + "num_experts": 512, + "num_experts_per_tok": 10, +} +NORM_OPS = {"qwen3_next_rms_norm": 2048, "rms_norm_gated": 128} + + +def validate_norm_manifest(raw: Mapping[str, Any]) -> None: + identity = raw["model_identity"] + if identity["model_id"] != MODEL_ID or identity["revision"] != REVISION: + raise WorkloadError("Qwen3-Next norm workload requires the pinned official checkpoint") + _validate_model_identity(identity, fingerprint=FINGERPRINT, model_label="Qwen3-Next") + if ( + raw.get("scope") != "qwen3_next_norm_operators" + or raw.get("full_model_evidence") is not False + ): + raise WorkloadError("norm workload cannot claim full-model evidence") + _validate_stochastic_policy(raw["stochastic_policy"]) + _validate_primary_matrix(raw["primary_matrix"], raw["fixtures"]) + _validate_fixtures(raw["fixtures"], raw["primary_matrix"]) + _validate_logical_identity(raw["logical_identity"]) + caps = raw["capabilities"] + if {e["op"] for e in caps["required_chain_ops"]} != set(NORM_OPS): + raise WorkloadError("norm workload must contain exactly the two Qwen3-Next norms") + if any(e["status"] != "required" for e in caps["required_chain_ops"]): + raise WorkloadError("both norm operators are required") + _validate_backend_profiles(raw["backend_profiles"], caps) + cases = {case["case_id"]: case for case in raw["representative_cases"]} + if len(cases) != len(raw["representative_cases"]): + raise WorkloadError("duplicate norm case ID") + referenced = set() + for key in ( + "short_full_model_fixture", + "long_full_model_fixture", + "representative_full_model_fixture", + ): + fixture = raw["fixtures"][key] + for case_id in fixture["candidate_case_ids"]: + if case_id not in cases or cases[case_id]["fixture_id"] != fixture["fixture_id"]: + raise WorkloadError("norm case fixture binding mismatch") + referenced.add(case_id) + if referenced != set(cases): + raise WorkloadError("unreferenced norm case") + if {case["operator_spec"] for case in cases.values()} != set(NORM_OPS): + raise WorkloadError("representative cases must cover both norms") + for case in cases.values(): + if case["hidden"] != NORM_OPS[case["operator_spec"]]: + raise WorkloadError("norm case hidden dimension does not match checkpoint") + if case["architecture_identity"] != "qwen3_next_80b_a3b_norm_operators": + raise WorkloadError("norm cases cannot claim Dense or full-model architecture evidence") + if raw["fixture_identity_sha256"] != manifest_identity_hash(raw): + raise WorkloadError("Qwen3-Next fixture identity hash mismatch") + + +def validate_norm_dimensions(raw: Mapping[str, Any], op: str, hidden: int, head_dim: int) -> None: + if raw.get("scope") != "qwen3_next_norm_operators": + return + if op not in NORM_OPS or hidden != 2048 or head_dim != 128: + raise WorkloadError( + "Qwen3-Next norm gate requires its two norm ops, --hidden 2048 --head-dim 128" + ) diff --git a/rl_engine/testing/ws1_workload.py b/rl_engine/testing/ws1_workload.py index 376a7a66b..997f441e7 100644 --- a/rl_engine/testing/ws1_workload.py +++ b/rl_engine/testing/ws1_workload.py @@ -264,7 +264,12 @@ def load_manifest(path: str | Path | None = None) -> WS1Manifest: raw = json.load(fh) if not isinstance(raw, dict): raise WorkloadError("manifest root must be a JSON object") - validate_manifest(raw) + if raw.get("scope") == "qwen3_next_norm_operators": + from rl_engine.testing.qwen3_next_workload import validate_norm_manifest + + validate_norm_manifest(raw) + else: + validate_manifest(raw) return WS1Manifest(raw=raw, path=manifest_path) @@ -292,20 +297,25 @@ def validate_manifest(raw: Mapping[str, Any]) -> None: ) -def _validate_model_identity(identity: Mapping[str, Any]) -> None: +def _validate_model_identity( + identity: Mapping[str, Any], + *, + fingerprint: Mapping[str, Any] = _OFFICIAL_FINGERPRINT, + model_label: str = "Qwen3-8B Dense", +) -> None: for key in ("model_id", "revision", "config_fingerprint", "weight_snapshot"): if key not in identity: raise WorkloadError(f"model_identity missing {key!r}") fp = identity["config_fingerprint"] if not isinstance(fp, Mapping): raise WorkloadError("config_fingerprint must be an object") - for key, expected in _OFFICIAL_FINGERPRINT.items(): + for key, expected in fingerprint.items(): if key not in fp: raise WorkloadError(f"config_fingerprint missing {key!r}") if fp[key] != expected: raise WorkloadError( f"config_fingerprint {key}={fp[key]!r} does not match official " - f"Qwen3-8B Dense pin {expected!r}; architecture shrink is forbidden" + f"{model_label} pin {expected!r}; architecture shrink is forbidden" ) if not identity.get("exit_forbids_architecture_shrink", False): raise WorkloadError("exit_forbids_architecture_shrink must be true") diff --git a/scripts/check_forward_invariance.py b/scripts/check_forward_invariance.py index 8736bc7bc..57a27088b 100644 --- a/scripts/check_forward_invariance.py +++ b/scripts/check_forward_invariance.py @@ -112,6 +112,7 @@ def parse_args() -> argparse.Namespace: if adapter.requirement != "absent_not_required" ] parser = argparse.ArgumentParser(description="WS1 C3 forward invariance GPU gate") + parser.add_argument("--manifest", type=pathlib.Path, default=None) parser.add_argument("--op", choices=sorted(runnable), default="rms_norm") parser.add_argument( "--candidate", required=True, help="Manifest-declared CUDA/Triton/Ascend candidate" @@ -145,7 +146,10 @@ def main() -> None: raise SystemExit("ERROR: --vocab must cover every fixed C2 workload token id") contract = load_contract() - manifest = load_manifest() + manifest = load_manifest(args.manifest) + from rl_engine.testing.qwen3_next_workload import validate_norm_dimensions + + validate_norm_dimensions(manifest.raw, args.op, args.hidden, args.head_dim) adapter = get_adapter(args.op) if adapter.requirement == "layout_supported": raise SystemExit( @@ -231,7 +235,15 @@ def main() -> None: ) if args.json: - print(json.dumps(report.to_dict(), indent=2, default=str)) + payload = report.to_dict() + payload["workload"] = { + "workload_id": manifest.workload_id, + "scope": manifest.raw.get("scope", "qwen3_8b_dense"), + "fixture_identity_sha256": manifest.raw["fixture_identity_sha256"], + "model_id": manifest.model_identity["model_id"], + "full_model_evidence": False, + } + print(json.dumps(payload, indent=2, default=str)) else: _summarize(report) if not report.passed: diff --git a/scripts/check_gradient_invariance.py b/scripts/check_gradient_invariance.py index 606be9a54..c2943a4c2 100644 --- a/scripts/check_gradient_invariance.py +++ b/scripts/check_gradient_invariance.py @@ -124,6 +124,7 @@ def parse_args() -> argparse.Namespace: if adapter.requirement != "absent_not_required" ] parser = argparse.ArgumentParser(description="WS1 C4 gradient invariance GPU gate") + parser.add_argument("--manifest", type=pathlib.Path, default=None) parser.add_argument("--op", choices=sorted(runnable), default="rms_norm") parser.add_argument( "--candidate", required=True, help="Manifest-declared CUDA/Triton/Ascend candidate" @@ -158,7 +159,10 @@ def main() -> None: raise SystemExit(f"ERROR: C4 required-profile evidence needs a real device: {exc}") from exc contract = load_contract() - manifest = load_manifest() + manifest = load_manifest(args.manifest) + from rl_engine.testing.qwen3_next_workload import validate_norm_dimensions + + validate_norm_dimensions(manifest.raw, args.op, args.hidden, args.head_dim) adapter = get_adapter(args.op) if adapter.requirement == "layout_supported": # Pack is the same PyTorch layout op under both profiles and is not a C2 @@ -253,7 +257,15 @@ def main() -> None: ) from exc if args.json: - print(json.dumps(report.to_dict(), indent=2, default=str)) + payload = report.to_dict() + payload["workload"] = { + "workload_id": manifest.workload_id, + "scope": manifest.raw.get("scope", "qwen3_8b_dense"), + "fixture_identity_sha256": manifest.raw["fixture_identity_sha256"], + "model_id": manifest.model_identity["model_id"], + "full_model_evidence": False, + } + print(json.dumps(payload, indent=2, default=str)) else: _summarize(report) if not report.passed: diff --git a/tests/test_qwen3_next_workload.py b/tests/test_qwen3_next_workload.py new file mode 100644 index 000000000..e433de102 --- /dev/null +++ b/tests/test_qwen3_next_workload.py @@ -0,0 +1,60 @@ +"""The norm workload cannot stand in for Dense or full-checkpoint evidence.""" + +import copy +from pathlib import Path + +import pytest + +from rl_engine.kernels.gtest.gradient_adapters import get_adapter, resolve_profile_candidate +from rl_engine.testing.qwen3_next_workload import validate_norm_manifest +from rl_engine.testing.ws1_workload import WorkloadError, load_manifest, manifest_identity_hash + +MANIFEST = Path(__file__).resolve().parents[1] / "rl_engine/testing/qwen3_next_norm_manifest.json" + + +def test_norm_manifest_pins_real_architecture_and_separate_scope(): + manifest = load_manifest(MANIFEST) + assert manifest.model_identity["config_fingerprint"]["hidden_size"] == 2048 + assert manifest.raw["full_model_evidence"] is False + for name, gradients in ( + ("qwen3_next_rms_norm", ("dx", "dweight")), + ("rms_norm_gated", ("dx", "dweight", "dgate")), + ): + adapter = get_adapter(name) + assert tuple(t.name for t in adapter.tensors) == gradients + assert resolve_profile_candidate(adapter, "cuda_bf16", manifest)["status"] == "declared" + assert ( + resolve_profile_candidate(adapter, "triton_cuda_bf16", manifest)["status"] + == "missing_required" + ) + assert ( + resolve_profile_candidate(adapter, "cuda_bf16", load_manifest())["status"] + == "absent_not_required" + ) + + +@pytest.mark.parametrize("fault", ["architecture", "full_model", "revision", "shape", "binding"]) +def test_norm_manifest_rejects_false_evidence_even_with_regenerated_hash(fault): + raw = copy.deepcopy(load_manifest(MANIFEST).raw) + if fault == "architecture": + raw["model_identity"]["config_fingerprint"]["hidden_size"] = 4096 + elif fault == "full_model": + raw["full_model_evidence"] = True + elif fault == "revision": + raw["model_identity"]["revision"] = "main" + elif fault == "shape": + raw["representative_cases"][0]["hidden"] = 64 + else: + raw["representative_cases"][0]["fixture_id"] = "wrong_fixture" + raw["fixture_identity_sha256"] = manifest_identity_hash(raw) + with pytest.raises(WorkloadError): + validate_norm_manifest(raw) + + +def test_norm_dimension_gate_rejects_shrunk_workload(): + from rl_engine.testing.qwen3_next_workload import validate_norm_dimensions + + raw = load_manifest(MANIFEST).raw + with pytest.raises(WorkloadError, match="hidden 2048"): + validate_norm_dimensions(raw, "qwen3_next_rms_norm", 64, 128) + validate_norm_dimensions(raw, "rms_norm_gated", 2048, 128) diff --git a/tests/test_ws1_ascend_closeout.py b/tests/test_ws1_ascend_closeout.py index 0aed72980..29369eb8a 100644 --- a/tests/test_ws1_ascend_closeout.py +++ b/tests/test_ws1_ascend_closeout.py @@ -188,9 +188,15 @@ def test_c2_ascend_cases_pin_real_ascend_kernels_and_sources(): def test_c3_c4_every_required_adapter_resolves_an_ascend_candidate(): manifest = load_manifest() + model_id = manifest.model_identity["model_id"] for name, adapter in GRADIENT_ADAPTERS.items(): if adapter.requirement not in ("required",): continue + # An adapter scoped to another model (the CUDA-only Qwen3-Next norms) + # resolves to `absent_not_required` for this manifest by design; this + # test covers the chain of the model whose manifest it loads. + if adapter.model_id not in (None, model_id): + continue resolved = resolve_profile_candidate(adapter, PROFILE, manifest) assert resolved["status"] == "declared", name assert resolved["expected_backend_id"] == "ascend", name @@ -198,6 +204,22 @@ def test_c3_c4_every_required_adapter_resolves_an_ascend_candidate(): assert candidate_family(str(resolved["expected_backend_id"])) == "ascend" +def test_model_scoped_adapters_are_absent_not_required_for_other_models(): + """The scoping the test above relies on must actually hold. + + Without this, skipping scoped adapters could hide one that silently resolves + to a real candidate for the wrong model. + """ + manifest = load_manifest() + model_id = manifest.model_identity["model_id"] + scoped = [a for a in GRADIENT_ADAPTERS.values() if a.model_id not in (None, model_id)] + assert scoped, "expected at least the Qwen3-Next norm adapters to be model-scoped" + for adapter in scoped: + resolved = resolve_profile_candidate(adapter, PROFILE, manifest) + assert resolved["status"] == "absent_not_required", adapter.op_name + assert resolved["candidate_path"] is None, adapter.op_name + + def test_c4_adapter_status_matrix_has_no_red_ascend_rows(): rows = [r for r in gradient_adapter_status_matrix() if r.backend_profile == PROFILE] assert rows From aaf09864cb4a3ce1574ea79eb7c5490697c05db8 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Wed, 30 Sep 2026 18:40:19 +0000 Subject: [PATCH 11/70] fix(norm): preserve gated signed-zero weights when offset is disabled Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- csrc/cuda/rmsnorm.cu | 9 ++++++--- tests/test_qwen3_next_norm.py | 14 ++++++++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/csrc/cuda/rmsnorm.cu b/csrc/cuda/rmsnorm.cu index 2d5c98ec4..4249cf525 100644 --- a/csrc/cuda/rmsnorm.cu +++ b/csrc/cuda/rmsnorm.cu @@ -266,7 +266,8 @@ __global__ void rmsnorm_gated_fwd_kernel( for (int col = tid; col < H; col += blockDim.x) { float xv = load_as_float(x_row + col); - float wv = load_as_float(weight + col) + weight_offset; + float wv = load_as_float(weight + col); + if (weight_offset != 0.0f) wv += weight_offset; float zv = load_as_float(gate_row + col); float out = xv * row_rstd * wv * gate_activation(zv); store_from_float(y_row + col, out); @@ -301,7 +302,8 @@ __global__ void rmsnorm_gated_bwd_dx_kernel( for (int col = tid; col < H; col += blockDim.x) { float dyv = load_as_float(dy_row + col); float xv = load_as_float(x_row + col); - float wv = load_as_float(weight + col) + weight_offset; + float wv = load_as_float(weight + col); + if (weight_offset != 0.0f) wv += weight_offset; float zv = load_as_float(gate_row + col); local_dot += dyv * (wv * gate_activation(zv)) * xv; } @@ -314,7 +316,8 @@ __global__ void rmsnorm_gated_bwd_dx_kernel( for (int col = tid; col < H; col += blockDim.x) { float dyv = load_as_float(dy_row + col); float xv = load_as_float(x_row + col); - float wv = load_as_float(weight + col) + weight_offset; + float wv = load_as_float(weight + col); + if (weight_offset != 0.0f) wv += weight_offset; float zv = load_as_float(gate_row + col); float out = r * dyv * (wv * gate_activation(zv)) - xv * coeff; diff --git a/tests/test_qwen3_next_norm.py b/tests/test_qwen3_next_norm.py index 2f738a1c8..ff82183fc 100644 --- a/tests/test_qwen3_next_norm.py +++ b/tests/test_qwen3_next_norm.py @@ -820,3 +820,17 @@ def test_gated_extension_handles_empty_batch_and_nondefault_stream(): assert torch.equal(dx, expected_dx) assert empty.shape == empty_dx.shape == (0, x.shape[-1]) assert empty_rstd.numel() == 0 + + +@requires_cuda_gated +@pytest.mark.parametrize("dtype", [torch.float32, torch.float16, torch.bfloat16]) +def test_cuda_gated_signed_zero_weight_is_preserved(dtype): + from rl_engine.kernels.ops.cuda.norm.rmsnorm import rmsnorm_gated_cuda + + x = torch.ones(2, 128, device="cuda", dtype=dtype) + x[1].neg_() + weight = torch.full((128,), -0.0, device="cuda", dtype=dtype) + actual = rmsnorm_gated_cuda(x, weight, torch.ones_like(x)) + expected = x * weight + bits = torch.int32 if dtype == torch.float32 else torch.int16 + assert torch.equal(actual.view(bits), expected.view(bits)) From 4ea1611f48eeb45cb31c21804a96bb8f520450e0 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Thu, 1 Oct 2026 18:28:40 +0000 Subject: [PATCH 12/70] test(dispatch): cover qwen3_next_rms_norm priority and missing-extension fallback The zero-centred norm was registered CUDA-first alongside the gated one, but only rms_norm_gated had dispatch tests. Mirror them: pin the priority on all five platforms, and assert that the inherited RMSNormCudaOp.__init__ symbol check makes the registry fall through to the PyTorch reference. Each assertion was checked to fail on CPU with the behaviour removed: PyTorch first in the CUDA list, the ROCm entry dropped, and the __init__ check removed. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- rl_engine/tests/test_dispatch.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/rl_engine/tests/test_dispatch.py b/rl_engine/tests/test_dispatch.py index ed873c2dd..7f1066ab0 100644 --- a/rl_engine/tests/test_dispatch.py +++ b/rl_engine/tests/test_dispatch.py @@ -292,3 +292,31 @@ def test_gated_rms_norm_cuda_backend_reports_absence_by_failing_construction(mon # ... and the registry must therefore hand out the reference, not raise. resolved = KernelRegistry().get_op("rms_norm_gated") assert isinstance(resolved, Qwen3NextRMSNormGatedOp) + + +def test_qwen3_next_rms_norm_priority_is_cuda_first_with_pytorch_fallback(): + """The zero-centred norm follows the gated one: CUDA kernel first, reference elsewhere.""" + registry = KernelRegistry() + + assert registry._priority_map["cuda"]["qwen3_next_rms_norm"] == [ + OpBackend.CUDA_QWEN3_NEXT_RMS_NORM, + OpBackend.PYTORCH_NATIVE_QWEN3_NEXT_RMS_NORM, + ] + for platform in ("rocm", "musa", "cpu", "npu"): + assert registry._priority_map[platform]["qwen3_next_rms_norm"] == [ + OpBackend.PYTORCH_NATIVE_QWEN3_NEXT_RMS_NORM + ], platform + + +def test_qwen3_next_rms_norm_cuda_backend_reports_absence_by_failing_construction(monkeypatch): + """The inherited ``RMSNormCudaOp.__init__`` check must reach the subclass.""" + from rl_engine.kernels.ops.cuda.norm import rmsnorm as cuda_rmsnorm + from rl_engine.kernels.ops.pytorch.norm.qwen3_next_rms_norm import Qwen3NextRMSNormOp + + monkeypatch.setattr(cuda_rmsnorm, "_EXT_AVAILABLE", False) + monkeypatch.setattr(cuda_rmsnorm, "_C", None) + with pytest.raises(RuntimeError, match="requires the compiled rl_engine._C extension"): + cuda_rmsnorm.Qwen3NextRMSNormCudaOp() + + resolved = KernelRegistry().get_op("qwen3_next_rms_norm") + assert isinstance(resolved, Qwen3NextRMSNormOp) From 5eaeca8983f7e057b8e96dc49312020da916e594 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Thu, 1 Oct 2026 18:28:40 +0000 Subject: [PATCH 13/70] test(norm): sweep the gated-vs-plain rstd identity across dtype, H, activation, offset The bitwise rstd identity was asserted for one configuration only (bf16, H=128, silu, offset 0). Parametrize it over fp32/fp16/bf16 x H in {128, 2048, 5120} x {silu, sigmoid} x offset in {0.0, 1.0}, 36 cases, with the plain kernel taking the same offset. All 36 are expected to hold by construction: both kernels run the same sum-of-squares loop, block_reduce_sum and choose_threads(H) launch shape, and neither the gate nor the offset enters the statistic. The H values cover both block sizes (128 and 512 threads) and two per-thread serial lengths. Not yet run on a GPU; the cases skip without the compiled extension. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- tests/test_qwen3_next_norm.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/tests/test_qwen3_next_norm.py b/tests/test_qwen3_next_norm.py index ff82183fc..f9c10b46e 100644 --- a/tests/test_qwen3_next_norm.py +++ b/tests/test_qwen3_next_norm.py @@ -498,17 +498,27 @@ def test_cuda_gated_matches_golden_within_contract(): @requires_cuda_gated -def test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel(): +@pytest.mark.parametrize("offset", [0.0, 1.0]) +@pytest.mark.parametrize("activation", [0, 1], ids=["silu", "sigmoid"]) +@pytest.mark.parametrize("hidden", [_HEAD_V_DIM, 2048, 5120]) +@pytest.mark.parametrize( + "dtype", [torch.float32, torch.float16, torch.bfloat16], ids=["fp32", "fp16", "bf16"] +) +def test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel(dtype, hidden, activation, offset): """The gate must not perturb the normalization statistic. Same x, same rstd, bitwise -- otherwise the gate has leaked into the - reduction and the two kernels no longer share a contract. + reduction and the two kernels no longer share a contract. Both kernels + launch with ``choose_threads(H)``: H=128 runs 128 threads with one column + each, 2048 and 5120 run 512 threads with 4 and 10 serial columns each. + Each activation is its own template instantiation, and the offset is + applied only after the statistic, so neither it nor the gate may move it. """ from rl_engine.kernels.ops.base import _C - x, w, gate = _gated_cuda_inputs() - _, rstd_gated = _C.rmsnorm_gated_forward(x, w, gate, _EPS, 0.0, 0) - _, rstd_plain = _C.rmsnorm_forward(x, w, _EPS, 0.0) + x, w, gate = _gated_cuda_inputs(hidden=hidden, dtype=dtype) + _, rstd_gated = _C.rmsnorm_gated_forward(x, w, gate, _EPS, offset, activation) + _, rstd_plain = _C.rmsnorm_forward(x, w, _EPS, offset) assert torch.equal(rstd_gated, rstd_plain) From b0f4c5cae326ce47500efa0237a70bbd41605f8b Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Thu, 1 Oct 2026 21:46:15 +0000 Subject: [PATCH 14/70] fix(norm): address the gated-norm review (R2-2, 7, 8, 9, 12, 13, 14, 16, 17) R2-1 (private bf16 tolerances cited as the reduction row) was resolved in the preceding merge, which switched the gated tests to c1's _forward_tol. - R2-2 docs/operators/qwen3-next-rms-norm-gated.md: Accuracy now points to tolerance_contract.json (forward_accuracy, reduction x dtype); the 35% / 6.25e-2 HF-vs-vLLM figure is labelled a one-off with its setup (one seed, B200, bf16, head_v_dim=128, 512 rows, eager); the 40-seed figures are attributed to tests/check_qwen3_next_norm_providers.py. Withdrawn, as on the c1 page: the cast-order isolation, the per-element fp32 ULP wording, and "fails closed (RFC section 6 item 7)" for configurations the op has no parameter for. Claim levels now read L1 (prefix slices; batch size, chunking, padding, permutation in the C3/C4 gates), L0 not separately tested; the rstd sweep is described. - R2-7 csrc/ops.cpp: drop the dim and size TORCH_CHECKs that rmsnorm_check_weight already performs, in rmsnorm_forward, rmsnorm_backward_dx and rmsnorm_gated_check. Error messages for those cases now come from rmsnorm_check_weight; no test matches the removed messages. - R2-8 workload_report() in rl_engine/testing/ws1_workload.py replaces the payload block duplicated in both gate scripts. full_model_evidence is read from the manifest: False for the Qwen3-Next norm manifest, None (not declared) for the Dense manifest, which previously reported a hard-coded False. - R2-9 the gate scripts import validate_norm_dimensions at module level, and --manifest has a help string. - R2-12 the four dispatch tests become two, parametrized over both norms. The fallback test now resolves for device="cuda", so the CUDA-first list is walked even on a CPU-only host, and asserts the CUDA backend was tried and failed. Before, on CPU, get_op went through the CPU list and the assertion held trivially. - R2-13 SPDX headers on rl_engine/testing/qwen3_next_workload.py and tests/test_qwen3_next_workload.py. - R2-14 ci/run_ws1_gtest.sh runs the four Qwen3-Next gates as explicit commands instead of a loop over interpolated script names. - R2-16 Qwen3NextRMSNormGatedCudaOp takes activation as a constructor argument, validated before the extension check; the test no longer mutates the instance. "swish" stays as vLLM's alias for "silu", now asserted bitwise on CUDA. - R2-17 the Python dgate path adds weight_offset only when it is nonzero, like the kernels, so a -0.0 weight keeps its sign in dgate. New tests: activation rejected at construction (CPU), swish == silu (CUDA), dgate signed zero (CUDA, 3 dtypes). Checked on CPU that the fallback and constructor tests fail with the behaviour removed. The CUDA tests and the csrc change are not yet run on a GPU. Deferred: R2-6 (shared sum-of-squares device function), R2-10 (private validator imports), R2-11. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- ci/run_ws1_gtest.sh | 17 ++-- csrc/ops.cpp | 10 --- docs/operators/qwen3-next-rms-norm-gated.md | 54 ++++++++---- rl_engine/kernels/ops/cuda/norm/rmsnorm.py | 38 +++++--- rl_engine/testing/qwen3_next_workload.py | 3 + rl_engine/testing/ws1_workload.py | 15 ++++ rl_engine/tests/test_dispatch.py | 97 +++++++++++---------- scripts/check_forward_invariance.py | 20 ++--- scripts/check_gradient_invariance.py | 20 ++--- tests/test_qwen3_next_norm.py | 44 +++++++++- tests/test_qwen3_next_workload.py | 3 + 11 files changed, 200 insertions(+), 121 deletions(-) diff --git a/ci/run_ws1_gtest.sh b/ci/run_ws1_gtest.sh index 03b77173d..e6d8e0dc0 100755 --- a/ci/run_ws1_gtest.sh +++ b/ci/run_ws1_gtest.sh @@ -77,11 +77,12 @@ print("[ws1-gtest] C8 gate passed") PY echo "[ws1-gtest] Qwen3-Next C3/C4 norms (operator scope)" -for op in qwen3_next_rms_norm rms_norm_gated; do - for gate in forward gradient; do - "$PY" "scripts/check_${gate}_invariance.py" \ - --manifest rl_engine/testing/qwen3_next_norm_manifest.json \ - --op "$op" --candidate cuda --backend-profile cuda_bf16 \ - --hidden 2048 --head-dim 128 - done -done +QWEN3_NEXT_NORM_MANIFEST=rl_engine/testing/qwen3_next_norm_manifest.json +"$PY" scripts/check_forward_invariance.py --manifest "$QWEN3_NEXT_NORM_MANIFEST" \ + --op qwen3_next_rms_norm --candidate cuda --backend-profile cuda_bf16 --hidden 2048 --head-dim 128 +"$PY" scripts/check_gradient_invariance.py --manifest "$QWEN3_NEXT_NORM_MANIFEST" \ + --op qwen3_next_rms_norm --candidate cuda --backend-profile cuda_bf16 --hidden 2048 --head-dim 128 +"$PY" scripts/check_forward_invariance.py --manifest "$QWEN3_NEXT_NORM_MANIFEST" \ + --op rms_norm_gated --candidate cuda --backend-profile cuda_bf16 --hidden 2048 --head-dim 128 +"$PY" scripts/check_gradient_invariance.py --manifest "$QWEN3_NEXT_NORM_MANIFEST" \ + --op rms_norm_gated --candidate cuda --backend-profile cuda_bf16 --hidden 2048 --head-dim 128 diff --git a/csrc/ops.cpp b/csrc/ops.cpp index 1efb116fc..ee9862b28 100644 --- a/csrc/ops.cpp +++ b/csrc/ops.cpp @@ -343,10 +343,6 @@ std::vector rmsnorm_forward( rmsnorm_check_input(weight, "weight"); rmsnorm_check_weight(x, weight); - TORCH_CHECK(x.dim() == 2, "x must be 2D [T, H]"); - TORCH_CHECK(weight.dim() == 1, "weight must be 1D [H]"); - TORCH_CHECK(x.size(1) == weight.size(0), "x.size(1) must equal weight.size(0)"); - auto T = x.size(0); auto y = torch::empty_like(x); auto rstd = torch::empty({T}, x.options().dtype(torch::kFloat32)); @@ -371,8 +367,6 @@ torch::Tensor rmsnorm_backward_dx( rmsnorm_check_backward(dy, x, rstd); TORCH_CHECK(dy.sizes() == x.sizes(), "dy and x must have same shape"); - TORCH_CHECK(x.dim() == 2, "x must be 2D [T, H]"); - TORCH_CHECK(weight.dim() == 1, "weight must be 1D [H]"); TORCH_CHECK(rstd.dim() == 1, "rstd must be 1D [T]"); TORCH_CHECK(rstd.size(0) == x.size(0), "rstd.size(0) must equal x.size(0)"); @@ -394,10 +388,6 @@ static void rmsnorm_gated_check( rmsnorm_check_weight(x, weight); rmsnorm_check_input(gate, "gate"); TORCH_CHECK(gate.device() == x.device(), "gate must be on the same device as x"); - - TORCH_CHECK(x.dim() == 2, "x must be 2D [T, H]"); - TORCH_CHECK(weight.dim() == 1, "weight must be 1D [H]"); - TORCH_CHECK(x.size(1) == weight.size(0), "x.size(1) must equal weight.size(0)"); TORCH_CHECK(gate.sizes() == x.sizes(), "gate must have the same shape as x"); TORCH_CHECK( gate.scalar_type() == x.scalar_type(), diff --git a/docs/operators/qwen3-next-rms-norm-gated.md b/docs/operators/qwen3-next-rms-norm-gated.md index 55071d25b..49221c8a0 100644 --- a/docs/operators/qwen3-next-rms-norm-gated.md +++ b/docs/operators/qwen3-next-rms-norm-gated.md @@ -29,6 +29,7 @@ from rl_engine.kernels.ops.cuda.norm.rmsnorm import ( ) y = Qwen3NextRMSNormGatedCudaOp().forward(x, weight, gate, eps=1e-6) +y = Qwen3NextRMSNormGatedCudaOp(activation="sigmoid").forward(x, weight, gate, eps=1e-6) y = rmsnorm_gated_cuda(x, weight, gate, eps=1e-6, activation="sigmoid") ``` @@ -51,15 +52,15 @@ required tensor, so it cannot stand in for one. | `weight` | `[H]` | matches `x` or fp32 | plain, NOT zero-centred | | `gate` | same as `x` | same as `x` | shape, dtype and device must match before flattening | | `eps` | scalar | float | `1e-6` for Qwen3-Next | -| `activation` | — | `"silu"`/`"swish"`/`"sigmoid"` | anything else is rejected | +| `activation` | — | `"silu"`/`"swish"`/`"sigmoid"` | constructor argument; `"swish"` is an alias for `"silu"`, as in vLLM; anything else is rejected | All tensors must share a device. Low-level CUDA bindings require contiguous 2-D inputs, and validate backward gradient dtype and FP32 statistics. Empty batches are supported by the bindings. -Only `norm_before_gate=True` and `group_size=None` are implemented — the single -configuration vLLM's GDN block constructs. Other configurations fail closed rather -than being approximated (RFC #428 §6 item 7). +Only `norm_before_gate=True` and `group_size=None` are implemented — the +configuration vLLM's GDN block constructs. The op has no parameter for either, so +other configurations are not implemented rather than rejected at runtime. ## Dispatch Behavior @@ -70,22 +71,39 @@ that raises at call time. ## Accuracy -Claim level: **L0 repeatable, L1 batch-invariant**. L2 is not claimed. +Claim levels: + +- **L1** for `Qwen3NextRMSNormGatedCudaOp`: prefix slices in + `tests/test_qwen3_next_norm.py`, and batch size, chunking, padding and permutation + in the C3/C4 gates (`ci/run_ws1_gtest.sh`). +- **L0** is not separately tested for the CUDA op; no test repeats it. +- L2 is not claimed. + +Accuracy tests resolve their tolerances from `tolerance_contract.json` +(`forward_accuracy`, `reduction` × dtype). The bounds in +`tests/check_qwen3_next_norm_providers.py` are provider-gap bounds, not contract +thresholds. `transformers` casts the normalized value back to the input dtype *before* the weight -multiply; vLLM keeps it in fp32. On B200 / bf16 / `head_v_dim=128` the two differ in -35% of elements with `max|diff| = 6.25e-2`, and isolating the cast order alone -reproduces the gap — so the cast order dominates, not the reduction order. Because -RFC #428 measures L2 against vLLM rollout, the fp32 multiply is the strict default; -`Qwen3NextRMSNormGatedHFOp` keeps the other convention as a tested witness. - -"Bitwise equal to vLLM" is undefined until a provider is named: vLLM's own -`forward_native` and `forward_cuda` disagreed on 21 of 40 seeds (worst 1.56e-2 in -bf16; ~36% of elements at fp32 ULP in fp32). What this reproduces is the convention; -the residual is the reduction tree. - -`rstd` is bitwise identical to the ungated kernel's for the same `x` — asserted, so a -gate leaking into the statistic would fail. +multiply; vLLM keeps it in fp32. `Qwen3NextRMSNormGatedOp` follows vLLM and +`Qwen3NextRMSNormGatedHFOp` keeps the transformers convention as a witness. +`test_gated_conventions_diverge_in_low_precision` asserts that the two differ in bf16 +(by more than `1e-3`) and agree bitwise in fp32. One earlier measurement, with no +committed script, found them differing on 35% of elements with `max|diff| = 6.25e-2` +(one seed, B200, bf16, `head_v_dim=128`, 512 rows, direct eager calls). That is a +one-off observation, not an assertion. Which convention the strict profile should use +is an open question for RFC #428. + +"Bitwise equal to vLLM" is undefined until a provider is named. Over 40 seeds (bf16, +`head_v_dim=128`, 512 rows, B200), vLLM's eager `forward_native` and `forward_cuda` +disagreed on 21, worst `1.56e-2`; in fp32 they stay within the asserted `1e-5`. These +figures come from `tests/check_qwen3_next_norm_providers.py`, which imports real vLLM +and must be run explicitly. The PyTorch reference reproduces the convention, not +vLLM's reduction tree. + +`rstd` is bitwise identical to the ungated kernel's for the same `x`, asserted over +fp32/fp16/bf16 × H ∈ {128, 2048, 5120} × {silu, sigmoid} × offset ∈ {0, 1}, so a gate +leaking into the statistic would fail. Backward is assembled from deterministic pieces: `dx` from a row-local kernel, `dweight` from fp32 row contributions reduced by the ascending-row left fold, and diff --git a/rl_engine/kernels/ops/cuda/norm/rmsnorm.py b/rl_engine/kernels/ops/cuda/norm/rmsnorm.py index 3c66e144c..08934d9bb 100644 --- a/rl_engine/kernels/ops/cuda/norm/rmsnorm.py +++ b/rl_engine/kernels/ops/cuda/norm/rmsnorm.py @@ -182,10 +182,20 @@ def _require_cuda_symbols(what: str, *names: str) -> None: ) -#: Gate activations understood by the CUDA kernel, in binding order. +#: Gate activations understood by the CUDA kernel, in binding order. ``swish`` is +#: an alias for ``silu``, as in vLLM's GDN block, which maps ``output_gate_type`` +#: "swish" to "silu" before constructing ``RMSNormGated``. _GATE_ACTIVATIONS = {"silu": 0, "swish": 0, "sigmoid": 1} +def _check_gate_activation(activation: str) -> int: + if activation not in _GATE_ACTIVATIONS: + raise ValueError( + f"activation must be one of {sorted(_GATE_ACTIVATIONS)}, got {activation!r}" + ) + return _GATE_ACTIVATIONS[activation] + + def _gate_activation_fp32(gate: torch.Tensor, activation: int) -> torch.Tensor: """act(gate) in fp32, matching the kernel's ``gate_activation``.""" gate32 = gate.float() @@ -257,7 +267,10 @@ def backward(ctx, grad_out): # dgate: row-local and reduction-free. normed = x.float() * rstd.unsqueeze(-1) - scale = weight.float() + ctx.weight_offset + # Same guard as the kernels: an unconditional `+ 0.0` turns -0.0 weights into +0.0. + scale = weight.float() + if ctx.weight_offset != 0.0: + scale = scale + ctx.weight_offset dgate = (dy.float() * normed * scale * _gate_activation_grad_fp32(gate, act)).to(gate.dtype) record_backward( @@ -280,13 +293,8 @@ def rmsnorm_gated_cuda(x, weight, gate, eps=1e-6, weight_offset=0.0, activation= y = rmsnorm_gated_cuda(x, weight, gate) y = rmsnorm_gated_cuda(x, weight, gate, activation="sigmoid") """ - if activation not in _GATE_ACTIVATIONS: - raise ValueError( - f"activation must be one of {sorted(_GATE_ACTIVATIONS)}, got {activation!r}" - ) - return RMSNormGatedCuda.apply( - x, weight, gate, eps, weight_offset, _GATE_ACTIVATIONS[activation] - ) + act = _check_gate_activation(activation) + return RMSNormGatedCuda.apply(x, weight, gate, eps, weight_offset, act) class Qwen3NextRMSNormGatedCudaOp: @@ -298,8 +306,11 @@ class Qwen3NextRMSNormGatedCudaOp: ``out = x * rstd * weight * silu(gate)``, every multiply in fp32 with a single cast at the store. The weight is plain, not zero-centred, matching vLLM's ``RMSNormGated`` with ``norm_before_gate=True`` and ``group_size=None`` - -- which is exactly how the GDN block constructs it. Other configurations - are rejected rather than approximated. + -- which is how the GDN block constructs it. The op has no ``norm_before_gate`` + or ``group_size`` parameter, so other configurations are not implemented. + + ``activation`` is fixed at construction; the registry constructs the + released config's ``"silu"``. """ backward_impl = "cuda_rmsnorm_gated_dx_declared_fp32_rowfold_dw" @@ -307,9 +318,10 @@ class Qwen3NextRMSNormGatedCudaOp: #: The gated weight is plain; kept as an attribute so the surface matches #: the ungated op and a zero-centred variant stays one subclass away. weight_offset = 0.0 - activation = "silu" - def __init__(self) -> None: + def __init__(self, activation: str = "silu") -> None: + _check_gate_activation(activation) + self.activation = activation _require_cuda_symbols( "Gated CUDA RMSNorm", "rmsnorm_gated_forward", "rmsnorm_gated_backward_dx" ) diff --git a/rl_engine/testing/qwen3_next_workload.py b/rl_engine/testing/qwen3_next_workload.py index ffe3367cd..63c1f2399 100644 --- a/rl_engine/testing/qwen3_next_workload.py +++ b/rl_engine/testing/qwen3_next_workload.py @@ -1,3 +1,6 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + """Qwen3-Next norm-only C3/C4 workload, explicitly separate from the Dense chain.""" from collections.abc import Mapping diff --git a/rl_engine/testing/ws1_workload.py b/rl_engine/testing/ws1_workload.py index 997f441e7..9162aa798 100644 --- a/rl_engine/testing/ws1_workload.py +++ b/rl_engine/testing/ws1_workload.py @@ -273,6 +273,21 @@ def load_manifest(path: str | Path | None = None) -> WS1Manifest: return WS1Manifest(raw=raw, path=manifest_path) +def workload_report(manifest: WS1Manifest) -> dict[str, Any]: + """The ``workload`` block the C3/C4 gate scripts attach to their JSON report. + + ``full_model_evidence`` is whatever the manifest declares, and ``None`` when + it declares nothing. + """ + return { + "workload_id": manifest.workload_id, + "scope": manifest.raw.get("scope", "qwen3_8b_dense"), + "fixture_identity_sha256": manifest.raw["fixture_identity_sha256"], + "model_id": manifest.model_identity["model_id"], + "full_model_evidence": manifest.raw.get("full_model_evidence"), + } + + def validate_manifest(raw: Mapping[str, Any]) -> None: """Hard-fail if any required C2 pin is missing or inconsistent.""" missing = [k for k in _REQUIRED_TOP_LEVEL if k not in raw] diff --git a/rl_engine/tests/test_dispatch.py b/rl_engine/tests/test_dispatch.py index 7f1066ab0..716cb8c09 100644 --- a/rl_engine/tests/test_dispatch.py +++ b/rl_engine/tests/test_dispatch.py @@ -259,64 +259,65 @@ def test_executor_flow(): print(f"\n Test failed with error: {e}") -def test_gated_rms_norm_priority_is_cuda_first_with_pytorch_fallback(): - """The gated norm has a CUDA kernel; every other platform falls back. - - No Triton, ROCm or Ascend gated kernel exists yet, so those platforms must - resolve to the PyTorch reference rather than to nothing -- an operator - missing from a priority map falls through to ``OpBackend.PYTORCH_NATIVE``, - which is the logprob op, not a norm. - """ - registry = KernelRegistry() - - assert registry._priority_map["cuda"]["rms_norm_gated"] == [ +_QWEN3_NEXT_NORMS = [ + pytest.param( + "rms_norm_gated", OpBackend.CUDA_RMS_NORM_GATED, OpBackend.PYTORCH_NATIVE_RMS_NORM_GATED, - ] - for platform in ("rocm", "musa", "cpu", "npu"): - assert registry._priority_map[platform]["rms_norm_gated"] == [ - OpBackend.PYTORCH_NATIVE_RMS_NORM_GATED - ], platform - - -def test_gated_rms_norm_cuda_backend_reports_absence_by_failing_construction(monkeypatch): - """Without the compiled symbols the CUDA backend must be skipped, not returned.""" - from rl_engine.kernels.ops.cuda.norm import rmsnorm as cuda_rmsnorm - from rl_engine.kernels.ops.pytorch.norm.qwen3_next_rms_norm import Qwen3NextRMSNormGatedOp - - monkeypatch.setattr(cuda_rmsnorm, "_EXT_AVAILABLE", False) - monkeypatch.setattr(cuda_rmsnorm, "_C", None) - with pytest.raises(RuntimeError, match="requires the compiled rl_engine._C extension"): - cuda_rmsnorm.Qwen3NextRMSNormGatedCudaOp() - - # ... and the registry must therefore hand out the reference, not raise. - resolved = KernelRegistry().get_op("rms_norm_gated") - assert isinstance(resolved, Qwen3NextRMSNormGatedOp) - - -def test_qwen3_next_rms_norm_priority_is_cuda_first_with_pytorch_fallback(): - """The zero-centred norm follows the gated one: CUDA kernel first, reference elsewhere.""" - registry = KernelRegistry() - - assert registry._priority_map["cuda"]["qwen3_next_rms_norm"] == [ + "Qwen3NextRMSNormGatedCudaOp", + "Qwen3NextRMSNormGatedOp", + id="rms_norm_gated", + ), + pytest.param( + "qwen3_next_rms_norm", OpBackend.CUDA_QWEN3_NEXT_RMS_NORM, OpBackend.PYTORCH_NATIVE_QWEN3_NEXT_RMS_NORM, - ] + "Qwen3NextRMSNormCudaOp", + "Qwen3NextRMSNormOp", + id="qwen3_next_rms_norm", + ), +] + + +@pytest.mark.parametrize("op_type, cuda_backend, ref_backend, cuda_cls, ref_cls", _QWEN3_NEXT_NORMS) +def test_qwen3_next_norm_priority_is_cuda_first_with_pytorch_fallback( + op_type, cuda_backend, ref_backend, cuda_cls, ref_cls +): + """Both Qwen3-Next norms have a CUDA kernel; every other platform falls back. + + No Triton, ROCm or Ascend kernel exists yet, so those platforms must resolve + to the PyTorch reference rather than to nothing -- an operator missing from a + priority map falls through to ``OpBackend.PYTORCH_NATIVE``, which is the + logprob op, not a norm. + """ + registry = KernelRegistry() + + assert registry._priority_map["cuda"][op_type] == [cuda_backend, ref_backend] for platform in ("rocm", "musa", "cpu", "npu"): - assert registry._priority_map[platform]["qwen3_next_rms_norm"] == [ - OpBackend.PYTORCH_NATIVE_QWEN3_NEXT_RMS_NORM - ], platform + assert registry._priority_map[platform][op_type] == [ref_backend], platform -def test_qwen3_next_rms_norm_cuda_backend_reports_absence_by_failing_construction(monkeypatch): - """The inherited ``RMSNormCudaOp.__init__`` check must reach the subclass.""" +@pytest.mark.skipif(torch.version.hip is not None, reason="a cuda device maps to rocm on HIP") +@pytest.mark.parametrize("op_type, cuda_backend, ref_backend, cuda_cls, ref_cls", _QWEN3_NEXT_NORMS) +def test_qwen3_next_norm_cuda_backend_absence_falls_through_to_reference( + monkeypatch, op_type, cuda_backend, ref_backend, cuda_cls, ref_cls +): + """Without the compiled symbols the CUDA backend must be skipped, not returned. + + The zero-centred op inherits its check from ``RMSNormCudaOp.__init__``. The + lookup names a CUDA device so the CUDA-first list is walked even on a + CPU-only host; resolving for the host's own platform would reach the + reference through the CPU list without ever trying the CUDA backend. + """ from rl_engine.kernels.ops.cuda.norm import rmsnorm as cuda_rmsnorm - from rl_engine.kernels.ops.pytorch.norm.qwen3_next_rms_norm import Qwen3NextRMSNormOp + from rl_engine.kernels.ops.pytorch.norm import qwen3_next_rms_norm as reference monkeypatch.setattr(cuda_rmsnorm, "_EXT_AVAILABLE", False) monkeypatch.setattr(cuda_rmsnorm, "_C", None) with pytest.raises(RuntimeError, match="requires the compiled rl_engine._C extension"): - cuda_rmsnorm.Qwen3NextRMSNormCudaOp() + getattr(cuda_rmsnorm, cuda_cls)() - resolved = KernelRegistry().get_op("qwen3_next_rms_norm") - assert isinstance(resolved, Qwen3NextRMSNormOp) + registry = KernelRegistry() + resolved = registry.get_op(op_type, device="cuda") + assert type(resolved) is getattr(reference, ref_cls) + assert cuda_backend.name in registry._failed_backends diff --git a/scripts/check_forward_invariance.py b/scripts/check_forward_invariance.py index 57a27088b..9757946c8 100644 --- a/scripts/check_forward_invariance.py +++ b/scripts/check_forward_invariance.py @@ -40,7 +40,8 @@ resolve_profile_candidate, ) from rl_engine.kernels.gtest.tolerance import resolve_dtype_policy # noqa: E402 -from rl_engine.testing.ws1_workload import load_manifest # noqa: E402 +from rl_engine.testing.qwen3_next_workload import validate_norm_dimensions # noqa: E402 +from rl_engine.testing.ws1_workload import load_manifest, workload_report # noqa: E402 def _object_path(value: Any) -> str: @@ -112,7 +113,12 @@ def parse_args() -> argparse.Namespace: if adapter.requirement != "absent_not_required" ] parser = argparse.ArgumentParser(description="WS1 C3 forward invariance GPU gate") - parser.add_argument("--manifest", type=pathlib.Path, default=None) + parser.add_argument( + "--manifest", + type=pathlib.Path, + default=None, + help="Workload manifest JSON (default: the Qwen3-8B Dense C2 manifest)", + ) parser.add_argument("--op", choices=sorted(runnable), default="rms_norm") parser.add_argument( "--candidate", required=True, help="Manifest-declared CUDA/Triton/Ascend candidate" @@ -147,8 +153,6 @@ def main() -> None: contract = load_contract() manifest = load_manifest(args.manifest) - from rl_engine.testing.qwen3_next_workload import validate_norm_dimensions - validate_norm_dimensions(manifest.raw, args.op, args.hidden, args.head_dim) adapter = get_adapter(args.op) if adapter.requirement == "layout_supported": @@ -236,13 +240,7 @@ def main() -> None: if args.json: payload = report.to_dict() - payload["workload"] = { - "workload_id": manifest.workload_id, - "scope": manifest.raw.get("scope", "qwen3_8b_dense"), - "fixture_identity_sha256": manifest.raw["fixture_identity_sha256"], - "model_id": manifest.model_identity["model_id"], - "full_model_evidence": False, - } + payload["workload"] = workload_report(manifest) print(json.dumps(payload, indent=2, default=str)) else: _summarize(report) diff --git a/scripts/check_gradient_invariance.py b/scripts/check_gradient_invariance.py index c2943a4c2..fb4e8ccdf 100644 --- a/scripts/check_gradient_invariance.py +++ b/scripts/check_gradient_invariance.py @@ -40,7 +40,8 @@ ) from rl_engine.kernels.gtest.gradient_invariance import MissingBackwardError # noqa: E402 from rl_engine.kernels.gtest.tolerance import resolve_dtype_policy # noqa: E402 -from rl_engine.testing.ws1_workload import load_manifest # noqa: E402 +from rl_engine.testing.qwen3_next_workload import validate_norm_dimensions # noqa: E402 +from rl_engine.testing.ws1_workload import load_manifest, workload_report # noqa: E402 def _object_path(value: Any) -> str: @@ -124,7 +125,12 @@ def parse_args() -> argparse.Namespace: if adapter.requirement != "absent_not_required" ] parser = argparse.ArgumentParser(description="WS1 C4 gradient invariance GPU gate") - parser.add_argument("--manifest", type=pathlib.Path, default=None) + parser.add_argument( + "--manifest", + type=pathlib.Path, + default=None, + help="Workload manifest JSON (default: the Qwen3-8B Dense C2 manifest)", + ) parser.add_argument("--op", choices=sorted(runnable), default="rms_norm") parser.add_argument( "--candidate", required=True, help="Manifest-declared CUDA/Triton/Ascend candidate" @@ -160,8 +166,6 @@ def main() -> None: contract = load_contract() manifest = load_manifest(args.manifest) - from rl_engine.testing.qwen3_next_workload import validate_norm_dimensions - validate_norm_dimensions(manifest.raw, args.op, args.hidden, args.head_dim) adapter = get_adapter(args.op) if adapter.requirement == "layout_supported": @@ -258,13 +262,7 @@ def main() -> None: if args.json: payload = report.to_dict() - payload["workload"] = { - "workload_id": manifest.workload_id, - "scope": manifest.raw.get("scope", "qwen3_8b_dense"), - "fixture_identity_sha256": manifest.raw["fixture_identity_sha256"], - "model_id": manifest.model_identity["model_id"], - "full_model_evidence": False, - } + payload["workload"] = workload_report(manifest) print(json.dumps(payload, indent=2, default=str)) else: _summarize(report) diff --git a/tests/test_qwen3_next_norm.py b/tests/test_qwen3_next_norm.py index f9c10b46e..be48ebd07 100644 --- a/tests/test_qwen3_next_norm.py +++ b/tests/test_qwen3_next_norm.py @@ -636,8 +636,7 @@ def test_cuda_gated_parameter_vjp_contributions_match_the_fold(dtype, activation x, w, gate = (t.to(dtype) for t in _gated_cuda_inputs(rows=512)) w = w.float().requires_grad_() dy = torch.randn_like(x) - op = Qwen3NextRMSNormGatedCudaOp() - op.activation = activation + op = Qwen3NextRMSNormGatedCudaOp(activation=activation) op.forward(x, w, gate, eps=_EPS).backward(dy) rows = op.parameter_vjp_contributions_fp32(x=x, weight=w, gate=gate, grad_output=dy, eps=_EPS)[ "weight" @@ -684,6 +683,27 @@ def test_cuda_gated_rejects_bad_activation(): rmsnorm_gated_cuda(x, w, gate, eps=_EPS, activation="gelu") +def test_gated_cuda_op_rejects_bad_activation_at_construction(): + """The activation is validated before the extension check, so this runs on CPU.""" + from rl_engine.kernels.ops.cuda.norm.rmsnorm import Qwen3NextRMSNormGatedCudaOp + + with pytest.raises(ValueError, match="activation must be one of"): + Qwen3NextRMSNormGatedCudaOp(activation="gelu") + + +@requires_cuda_gated +def test_cuda_gated_swish_is_an_alias_for_silu(): + """vLLM maps output_gate_type "swish" to "silu"; the alias must not select sigmoid.""" + from rl_engine.kernels.ops.cuda.norm.rmsnorm import Qwen3NextRMSNormGatedCudaOp + + x, w, gate = _gated_cuda_inputs(rows=64) + swish = Qwen3NextRMSNormGatedCudaOp(activation="swish").forward(x, w, gate, eps=_EPS) + silu = Qwen3NextRMSNormGatedCudaOp(activation="silu").forward(x, w, gate, eps=_EPS) + sigmoid = Qwen3NextRMSNormGatedCudaOp(activation="sigmoid").forward(x, w, gate, eps=_EPS) + assert torch.equal(swish, silu) + assert not torch.equal(swish, sigmoid) + + @requires_cuda_gated def test_cuda_gated_rejects_mismatched_gate(): from rl_engine.kernels.ops.cuda.norm.rmsnorm import rmsnorm_gated_cuda @@ -844,3 +864,23 @@ def test_cuda_gated_signed_zero_weight_is_preserved(dtype): expected = x * weight bits = torch.int32 if dtype == torch.float32 else torch.int16 assert torch.equal(actual.view(bits), expected.view(bits)) + + +@requires_cuda_gated +@pytest.mark.parametrize("dtype", [torch.float32, torch.float16, torch.bfloat16]) +def test_cuda_gated_dgate_keeps_signed_zero_weight(dtype): + """dgate scales by the weight too, so it must not turn a -0.0 weight into +0.0. + + dgate = dy * x * rstd * w * act'(gate); with dy, rstd, act'(1) > 0 its sign is + the sign of ``x * w``, zeros included. + """ + from rl_engine.kernels.ops.cuda.norm.rmsnorm import rmsnorm_gated_cuda + + x = torch.ones(2, 128, device="cuda", dtype=dtype) + x[1].neg_() + weight = torch.full((128,), -0.0, device="cuda", dtype=dtype) + gate = torch.ones_like(x).requires_grad_() + rmsnorm_gated_cuda(x, weight, gate).backward(torch.ones_like(x)) + expected = x * weight + bits = torch.int32 if dtype == torch.float32 else torch.int16 + assert torch.equal(gate.grad.view(bits), expected.view(bits)) diff --git a/tests/test_qwen3_next_workload.py b/tests/test_qwen3_next_workload.py index e433de102..b0fafe26c 100644 --- a/tests/test_qwen3_next_workload.py +++ b/tests/test_qwen3_next_workload.py @@ -1,3 +1,6 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + """The norm workload cannot stand in for Dense or full-checkpoint evidence.""" import copy From 0cceb8445a81f4b346572bbb387f9ecc4fb10335 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Fri, 2 Oct 2026 02:19:47 +0000 Subject: [PATCH 15/70] fix(rmsnorm): use OptionalCUDAGuard in the launchers outside the ROCm guard The six rmsnorm launchers compiled on both CUDA and ROCm (plain forward and dx, gated forward and dx, partial and reduce dweight) constructed a non-optional c10::cuda::CUDAGuard. No other file the ROCm build compiles uses that class outside a USE_ROCM guard, while activation.cu and deterministic_attention.cu use at::cuda::OptionalCUDAGuard. Match the guard used by activation.cu so the ROCm build relies only on patterns it already compiles. The guard follows the same tensor as before (x, or partial_dw for the reduce launcher). CUDA behaviour is unchanged: these tensors are always on a CUDA device, so the optional guard always sets the device. The left-fold launcher sits inside the USE_ROCM guard and keeps its c10::cuda::CUDAGuard. The ROCm build is still untested. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- csrc/cuda/rmsnorm.cu | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/csrc/cuda/rmsnorm.cu b/csrc/cuda/rmsnorm.cu index 4249cf525..5a334ea8a 100644 --- a/csrc/cuda/rmsnorm.cu +++ b/csrc/cuda/rmsnorm.cu @@ -466,7 +466,7 @@ void rmsnorm_gated_forward_cuda( double weight_offset, int64_t activation ) { - const c10::cuda::CUDAGuard device_guard(x.device()); + const at::cuda::OptionalCUDAGuard device_guard(device_of(x)); int T = x.size(0); if (T == 0) return; int H = x.size(1); @@ -506,7 +506,7 @@ void rmsnorm_gated_backward_dx_cuda( double weight_offset, int64_t activation ) { - const c10::cuda::CUDAGuard device_guard(x.device()); + const at::cuda::OptionalCUDAGuard device_guard(device_of(x)); int T = x.size(0); if (T == 0) return; int H = x.size(1); From cf68fd94cc10e61b8898d9ff3ac41e57639db09a Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Sun, 4 Oct 2026 02:07:15 +0000 Subject: [PATCH 16/70] docs(norm): reconcile the C1 norm page, docstrings and gated tests with the stacked C1 branch Carried over from the former merge of the C1 branch into this one: the decoder-norm page again states the registration and the check_operator command, the gated tests use the contract's reduction tolerances through _forward_tol, and the reference docstrings name the gated page. Same final tree as before the re-stack. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- docs/operators/qwen3-next-rms-norm.md | 16 ++++++++-------- .../ops/pytorch/norm/qwen3_next_rms_norm.py | 5 +++-- tests/test_qwen3_next_norm.py | 9 +++------ 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/docs/operators/qwen3-next-rms-norm.md b/docs/operators/qwen3-next-rms-norm.md index e5e9a47c0..420409857 100644 --- a/docs/operators/qwen3-next-rms-norm.md +++ b/docs/operators/qwen3-next-rms-norm.md @@ -49,11 +49,11 @@ y = rmsnorm_cuda(x, weight, eps=1e-6, weight_offset=1.0) ## Dispatch Behavior -Not registered on this branch: there is no `qwen3_next_rms_norm` gtest spec and no -registry entry yet. Both arrive with the gated-norm PR. Until then, construct the -ops directly as in "Entry Point". The CUDA op validates the compiled symbols in -`__init__`, so on a build without the extension construction raises instead of -handing out an op that fails at call time. +Registered as the `qwen3_next_rms_norm` gtest operator. On CUDA the registry +prefers `Qwen3NextRMSNormCudaOp`; every other platform resolves to the PyTorch +reference. The CUDA op validates the compiled symbols in `__init__`, so on a build +without the extension construction raises and the registry falls through to the +reference rather than handing out an op that fails at call time. ## Accuracy @@ -102,16 +102,16 @@ element and no extra memory traffic. ```bash python -m pytest tests/test_qwen3_next_norm.py -v +python scripts/check_operator.py --op qwen3_next_rms_norm --candidate cuda \ + --device cuda --dtype bf16 --check-grad ``` ## Known Limitations - CUDA only; no ROCm, Ascend or Triton backend. -- Not registered as a gtest operator or in the registry on this branch (see - "Dispatch Behavior"). - Not bitwise against vLLM (see Accuracy). An L2 claim needs a single source of truth for the forward on both sides, per RFC #428 §0 item 1. - The gated pair (`Qwen3NextRMSNormGatedOp`, `Qwen3NextRMSNormGatedHFOp`) is - documented with its CUDA kernel in the gated-norm PR, not on this page. + documented with its CUDA kernel on [Gated RMSNorm](qwen3-next-rms-norm-gated.md). - Measured on sm_100 (B200). Per RFC #428 §2.2 no claim carries across H100/H200/B100/B200. diff --git a/rl_engine/kernels/ops/pytorch/norm/qwen3_next_rms_norm.py b/rl_engine/kernels/ops/pytorch/norm/qwen3_next_rms_norm.py index 1f84f86f3..598eaf3ad 100644 --- a/rl_engine/kernels/ops/pytorch/norm/qwen3_next_rms_norm.py +++ b/rl_engine/kernels/ops/pytorch/norm/qwen3_next_rms_norm.py @@ -22,7 +22,8 @@ All three reuse :func:`shape_invariant_rstd`, a fixed-order reduction. They reproduce the weight convention and cast order, not vLLM's reduction tree, and are not bitwise equal to any vLLM path probed so far. Claim levels, measurements and -limitations are in ``docs/operators/qwen3-next-rms-norm.md``. +limitations are in ``docs/operators/qwen3-next-rms-norm.md`` and, for the gated +pair, ``docs/operators/qwen3-next-rms-norm-gated.md``. """ from __future__ import annotations @@ -61,7 +62,7 @@ class Qwen3NextRMSNormGatedOp: ``out = (x * rstd * weight) * silu(gate)``, with every multiply in fp32 and a single cast on the way out. This is the convention vLLM's ``RMSNormGated`` uses with ``norm_before_gate=True``. Which gated convention is the strict - default is still open; see the operator page. + default is still open; see ``docs/operators/qwen3-next-rms-norm-gated.md``. Not a subclass of the plain op: it takes an extra tensor and its epilogue differs, so it is not a drop-in substitute for one. diff --git a/tests/test_qwen3_next_norm.py b/tests/test_qwen3_next_norm.py index be48ebd07..ffa20253f 100644 --- a/tests/test_qwen3_next_norm.py +++ b/tests/test_qwen3_next_norm.py @@ -475,9 +475,6 @@ def test_cuda_zero_centred_backward_is_offset_aware(): not _HAS_CUDA_GATED, reason="gated RMSNorm CUDA extension is not available" ) -# tolerance_contract.json, judgments/forward_accuracy/by_op_class/reduction/bfloat16 -_BF16_ATOL, _BF16_RTOL = 2e-2, 1.6e-2 - def _gated_cuda_inputs(seed=0, rows=512, hidden=_HEAD_V_DIM, dtype=torch.bfloat16): g = torch.Generator(device="cuda").manual_seed(seed) @@ -494,7 +491,7 @@ def test_cuda_gated_matches_golden_within_contract(): x, w, gate = _gated_cuda_inputs() got = Qwen3NextRMSNormGatedCudaOp().forward(x, w, gate, eps=_EPS) ref = Qwen3NextRMSNormGatedOp().forward_fp32(x, w, gate, eps=_EPS) - torch.testing.assert_close(got.float(), ref, atol=_BF16_ATOL, rtol=_BF16_RTOL) + torch.testing.assert_close(got.float(), ref, **_forward_tol(torch.bfloat16)) @requires_cuda_gated @@ -551,7 +548,7 @@ def test_cuda_gated_unit_weight_is_plain_norm_times_silu(): ones = torch.ones(_HEAD_V_DIM, device="cuda", dtype=x.dtype) got = Qwen3NextRMSNormGatedCudaOp().forward(x, ones, gate, eps=_EPS).float() ref = rmsnorm_cuda(x, ones, eps=_EPS).float() * F.silu(gate.float()) - torch.testing.assert_close(got, ref, atol=_BF16_ATOL, rtol=_BF16_RTOL) + torch.testing.assert_close(got, ref, **_forward_tol(torch.bfloat16)) @requires_cuda_gated @@ -561,7 +558,7 @@ def test_cuda_gated_sigmoid_activation(): x, w, gate = _gated_cuda_inputs() got = rmsnorm_gated_cuda(x, w, gate, eps=_EPS, activation="sigmoid").float() ref = rmsnorm_cuda(x, w, eps=_EPS).float() * torch.sigmoid(gate.float()) - torch.testing.assert_close(got, ref, atol=_BF16_ATOL, rtol=_BF16_RTOL) + torch.testing.assert_close(got, ref, **_forward_tol(torch.bfloat16)) @requires_cuda_gated From ef4c88de2ec684b329c258c532260a84389c7888 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Wed, 30 Sep 2026 16:39:36 +0000 Subject: [PATCH 17/70] feat(ws1): Gated DeltaNet decode-step goldens for RFC #428 C6 The trainer-side reference for a Qwen3-Next rollout decode step: the recurrent Gated DeltaNet update and the causal-conv1d state update that precedes it. Claim level: L0 repeatable and L1 batch-invariant; L2 is not claimed. Design notes, measurements and the deferral list are in docs/design/ws1-c6-428-gdn-recurrent-replay.md. Provider -------- `fused_recurrent_gated_delta_rule_packed_decode`, not `fused_sigmoid_gating_delta_rule_update`. A decode-only, non-speculative batch returns early at qwen_gdn_linear_attn.py:1295-1307 into the packed path because VLLM_ENABLE_FLA_PACKED_RECURRENT_DECODE defaults to true; the sigmoid-gating kernel is the fallback for mixed prefill+decode and spec decode. The env defaults that decide this are asserted, so a vLLM bump fails loudly. Three places the kernel and the HF model disagree, transcribed from the kernel: * The gating is fused -- beta = sigmoid(b) and g = -exp(A_log) * softplus(a + dt_bias) are computed in fp32 inside the kernel with a threshold branch at 20, not as separate PyTorch ops. * No repeat_interleave: the kernel indexes i_h = i_hv // (HV // H). * The QK norm is an L2 norm over a plain sum, x / sqrt(sum(x*x) + 1e-6), dividing by sqrt rather than multiplying by rsqrt. scale hits q after the norm; k is never scaled. A fourth candidate divergence turned out not to be one: prefill passes use_qk_l2norm_in_kernel=False only because fused_post_conv_prep(apply_l2norm=True) already normalized q/k. Both paths normalize exactly once. Conv accumulation order is load-bearing: taps accumulate sequentially, acc = acc + win[t] * w[t] from zero. With an fp32 cache that reproduces the provider bitwise; a tree sum over the same four terms does not, and neither does an FMA. State ABI is mirrored: paged [num_blocks, HV, V, K] and [num_blocks, dim, width-1], NULL_BLOCK_ID (<= 0) skipping, an fp32 accumulator, and a store that rounds to the cache dtype -- fp32 or bf16, per FUSED_GDN_STATE_DTYPES. Contractions run in the repo's fixed 32-wide chunk order via one `_chunked_sum` primitive, which is what the L1 claim rests on. Agreement, B200, Qwen3-Next dims (H=16, HV=32, K=V=128) ------------------------------------------------------- recurrent, fp32 state, B=1..64 max|d out| 1.5e-08..6.1e-05, state <= 3.0e-07 recurrent, bf16 state, B=1..64 max|d out| 3.7e-09..3.1e-05, state <= 2.0e-03 conv: the rolled state is BITWISE exact in every configuration conv, fp32 cache: output bitwise but for 15 of 524288 elements at B=64 conv, bf16 cache: output agrees on ~63%, each disagreement one bf16 ULP L1: a sequence's output and state block are bitwise identical alone or at any position in a batch of 64, for both state dtypes Where the provider rounds in the bf16-conv-cache case is not reproduced; recorded as an open gap rather than guessed at. Decode versus chunked prefill ----------------------------- T=8 max|d| 3.66e-04 fp32 state / 5.49e-04 bf16 (7.0e-03 / 1.0e-02 rel) T=64 4.88e-04 / 5.49e-04 (6.6e-03 / 7.5e-03 rel) T=256 3.66e-04 / 3.66e-04 (5.0e-03 / 5.0e-03 rel) ~0.5-1% relative and flat in T. The recurrence is contracting -- per-step decay exp(g) averages ~0.47 -- so old rounding error is forgotten at roughly the rate old signal is, and the fp32-vs-bf16 state drift saturates at ~2% relative on the state (2.67e-03 at step 1, 1.52e-02 at 64, 2.47e-02 at 1024: a 16x longer run past step 64 grows it 1.6x). So the two paths are not bitwise, and ~1% relative on logits is still material for RL importance ratios, but this is a bounded error rather than a divergence. An fp32 recurrent state remains the right choice; the reason is the plateau, not a blow-up. Separately, the chunked prefill kernel refuses fp32 q/k/v outright (chunk.py:213), and causal_conv1d_update does not bounds-check conv_state_indices under its default validate_data=False. tests/check_gdn_recurrent_golden.py is named check_ rather than test_, following tests/distributed/check_*.py: it imports real vLLM, and tests/test_framework_operator_integrations.py asserts vllm is absent from sys.modules. pytest tests/check_gdn_recurrent_golden.py -q pytest tests/ rl_engine/tests/ -q -p no:randomly \ --ignore=tests/test_rocm_aiter_api_contract.py The new file passes and the full suite gains no failure. Absolute suite counts are reported in the PR description against a named base commit, not here: they shift whenever a sibling test is added, so a count frozen in a commit message goes stale the moment the branch is rebased. Not covered, deliberately: speculative decode and MTP, a backward for the recurrence, and the provider bridge. Reasons in the design doc. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- .../design/ws1-c6-428-gdn-recurrent-replay.md | 145 +++++ .../ops/pytorch/linear_attn/__init__.py | 20 + .../ops/pytorch/linear_attn/causal_conv1d.py | 193 +++++++ .../pytorch/linear_attn/gated_delta_rule.py | 294 ++++++++++ tests/check_gdn_recurrent_golden.py | 501 ++++++++++++++++++ 5 files changed, 1153 insertions(+) create mode 100644 docs/design/ws1-c6-428-gdn-recurrent-replay.md create mode 100644 rl_engine/kernels/ops/pytorch/linear_attn/__init__.py create mode 100644 rl_engine/kernels/ops/pytorch/linear_attn/causal_conv1d.py create mode 100644 rl_engine/kernels/ops/pytorch/linear_attn/gated_delta_rule.py create mode 100644 tests/check_gdn_recurrent_golden.py diff --git a/docs/design/ws1-c6-428-gdn-recurrent-replay.md b/docs/design/ws1-c6-428-gdn-recurrent-replay.md new file mode 100644 index 000000000..d0d0f3ea3 --- /dev/null +++ b/docs/design/ws1-c6-428-gdn-recurrent-replay.md @@ -0,0 +1,145 @@ +# WS1 C6 — Qwen3-Next Gated DeltaNet recurrent replay + +Design notes for RFC #428 work item C6 (GDN recurrent response replay) on the CUDA +track. Measured on 2× B200 (sm_100), torch 2.13.0+cu130, vllm 0.30.0, +transformers 5.17.0. + +Claim level reached: **L0 repeatable, L1 batch-invariant**. L2 is not claimed. + +## 1. Which provider a rollout decode actually takes + +vLLM 0.30.0 has three GDN decode paths, selected by env defaults rather than by the +model: + +| condition | path | +|---|---| +| `VLLM_GDN_DECODE_KERNEL="cuda"` (default) + MTP | `torch.ops._C.fused_gdn_decode_post_conv_mtp` — conv, recurrence and the gated norm fused | +| `VLLM_ENABLE_FLA_PACKED_RECURRENT_DECODE=1` (default), decode-only, non-spec | `fused_recurrent_gated_delta_rule_packed_decode` | +| otherwise | `fused_sigmoid_gating_delta_rule_update` | + +A pure RL rollout decode — N sequences each emitting one token, no speculative +decoding — returns early at `qwen_gdn_linear_attn.py:1295-1307` into the **packed** +path. The golden targets that one. Aligning against the sigmoid-gating kernel would +validate a path production does not take. + +`tests/check_qwen3_next_norm_providers.py` asserts those two env defaults, so a vLLM +bump that flips either fails loudly rather than silently re-pointing the claim. + +## 2. Three places the kernel and the HF model disagree + +The golden is transcribed from the kernel, not from `modeling_qwen3_next.py`: + +1. **The gating is fused.** `beta = sigmoid(b)` and + `g = -exp(A_log) * softplus(a + dt_bias)` are computed inside the Triton kernel, + with a `softplus` threshold branch at 20. HF computes them as separate PyTorch + ops — a different rounding path. +2. **No `repeat_interleave`.** The kernel indexes `i_h = i_hv // (HV // H)`, so q/k + stay at 16 heads while v has 32. HF materializes the repeat. +3. **The QK norm is an L2 norm over a plain sum**, `x / sqrt(sum(x*x) + 1e-6)` — not + an RMSNorm, not `F.normalize`, and dividing by `sqrt` rather than multiplying by + `rsqrt`, which differs in the last bit. `scale` is applied to `q` *after* the + norm; `k` is never scaled. + +A fourth, checked and found **not** to be a divergence: prefill passes +`use_qk_l2norm_in_kernel=False` only because `fused_post_conv_prep(apply_l2norm=True)` +already normalized q/k. Both paths normalize exactly once. + +## 3. State ABI + +Mirrored rather than reinvented: + +- recurrent state `[num_blocks, HV, V, K]`, V-major, addressed by `ssm_state_indices` +- conv state `[num_blocks, dim, width-1]`, layout chosen by the global + `is_conv_state_dim_first()`; the golden takes it as an argument and both are tested +- `NULL_BLOCK_ID` (index `<= 0`) means skip: zeros out, block untouched +- the accumulator is fp32 for the whole step; the store rounds to the state tensor's + dtype, which `FUSED_GDN_STATE_DTYPES` allows to be fp32 **or** bf16 +- `causal_conv1d_update` casts `x` to the cache dtype before anything else + +Contractions run in the repo's fixed 32-wide chunk order rather than `torch.matmul`, +whose reduction order is unspecified. That is what the L1 claim rests on, and also +why the golden is not bitwise against the kernel's tree. + +## 4. Agreement with the provider + +Qwen3-Next dims (H=16, HV=32, K=V=128), `use_qk_l2norm_in_kernel=True`: + +| | max\|diff\| out | max\|diff\| state | +|---|---|---| +| fp32 state, B=1..64 | 1.5e-08 .. 6.1e-05 | ≤ 3.0e-07 | +| bf16 state, B=1..64 | 3.7e-09 .. 3.1e-05 | ≤ 2.0e-03 | + +Causal conv (`conv_dim=8192`, `W=4`, B ≤ 64): the **rolled state is bitwise exact in +every configuration**. With an fp32 cache the output is bitwise but for a handful of +elements (15 of 524288 at B=64); with a bf16 cache it agrees on ~63%, each +disagreement exactly one bf16 ULP. The conv taps accumulate **sequentially**, +`acc = acc + win[t] * w[t]` from zero — a tree sum over the same four terms does not +reproduce the provider, an FMA does not either. + +Open: where the provider rounds in the bf16-conv-cache case is not reproduced. +Recorded rather than guessed at. + +## 5. Decode versus chunked prefill + +The quantity RFC #428 §4.2 is about. Single sequence, zero initial state: + +| T | max\|diff\|, fp32 state | max\|diff\|, bf16 state | +|---|---|---| +| 8 | 3.66e-04 (7.0e-03 rel) | 5.49e-04 (1.0e-02 rel) | +| 64 | 4.88e-04 (6.6e-03 rel) | 5.49e-04 (7.5e-03 rel) | +| 256 | 3.66e-04 (5.0e-03 rel) | 3.66e-04 (5.0e-03 rel) | + +**The gap is ~0.5–1% relative and flat in T** — smaller at T=256 than at T=8 — and the +state dtype barely moves it. + +The reason is that the recurrence is **contracting**: per-step decay `exp(g)` averages +~0.47 (max 0.996), so old rounding error is forgotten at roughly the rate old signal +is. Comparing an fp32 state against a bf16 one over 1024 steps shows the same shape: + +| step | relative \|d\| state | relative \|d\| out | +|---|---|---| +| 1 | 2.67e-03 | 3.47e-03 | +| 64 | 1.52e-02 | 1.07e-02 | +| 256 | 2.02e-02 | 1.09e-02 | +| 1024 | 2.47e-02 | 1.57e-02 | + +A 16× longer run past step 64 grows the drift only 1.6×; it saturates at ~2% relative +on the state and ~1–1.8% on the output. + +So the two paths are not bitwise, and ~1% relative on logits is still material for RL +importance ratios, but this is a bounded, characterizable error rather than a +divergence. An fp32 recurrent state remains the right choice for exactness work — the +reason is the 2% plateau, not a blow-up. + +Two related constraints: the chunked prefill kernel refuses fp32 q/k/v outright +(`chunk.py:213`), so the prefill side is bf16-only regardless; and +`causal_conv1d_update` does not bounds-check `conv_state_indices` under its default +`validate_data=False` — an index past the cache is an out-of-bounds write, not an +error. + +## 6. Current boundary + +Not covered, with reasons: + +| deferred | why | +|---|---| +| Speculative decode / MTP | `fused_gdn_decode_post_conv_mtp` fuses conv, recurrence and the gated norm; validating it needs a draft model | +| Backward for the recurrent step | no upstream backward exists, and a naive BPTT through a sequential recurrence is not batch-invariant — it needs its own design | +| Provider bridge / registry entry | the golden should survive a drift sweep against a real checkpoint first | +| Paged block allocation policy | the ABI is mirrored; the allocator is not modelled | +| TP sharding of `A_log` / `dt_bias` | single card only | +| ROCm / Ascend | CUDA first, per the WS1 order | + +`runtime_verified=false` (no checkpoint), `supports_backward=false`, +`checkpoint=absent`. Op-level agreement says nothing about 48 composed layers. + +## 7. Questions for the maintainers + +1. Is a **bf16 recurrent state** a supported configuration? The answer decides whether + the 2% plateau is a finding or a non-issue. +2. Is MTP / speculative decode in scope for WS1? If so, + `fused_gdn_decode_post_conv_mtp` becomes the primary provider for both the norm and + the recurrence, and the largest deferral above reopens. +3. For the CUDA strict profile, is the single source of truth **vLLM's** arithmetic or + **PyTorch eager**? §1 item 1 asks for one provider on both sides but §2.1 does not + say which, and the two differ by ~6e-2 in bf16. diff --git a/rl_engine/kernels/ops/pytorch/linear_attn/__init__.py b/rl_engine/kernels/ops/pytorch/linear_attn/__init__.py new file mode 100644 index 000000000..28602f18f --- /dev/null +++ b/rl_engine/kernels/ops/pytorch/linear_attn/__init__.py @@ -0,0 +1,20 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Linear-attention operators (Gated DeltaNet and friends).""" + +from rl_engine.kernels.ops.pytorch.linear_attn.causal_conv1d import ( + CausalConv1dUpdateOp, +) +from rl_engine.kernels.ops.pytorch.linear_attn.gated_delta_rule import ( + GatedDeltaRuleRecurrentStepOp, + NULL_BLOCK_ID, + SOFTPLUS_THRESHOLD, +) + +__all__ = [ + "CausalConv1dUpdateOp", + "GatedDeltaRuleRecurrentStepOp", + "NULL_BLOCK_ID", + "SOFTPLUS_THRESHOLD", +] diff --git a/rl_engine/kernels/ops/pytorch/linear_attn/causal_conv1d.py b/rl_engine/kernels/ops/pytorch/linear_attn/causal_conv1d.py new file mode 100644 index 000000000..ffbac6e13 --- /dev/null +++ b/rl_engine/kernels/ops/pytorch/linear_attn/causal_conv1d.py @@ -0,0 +1,193 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Causal depthwise conv1d single-token state update (WS1 ground truth, RFC #428 C6). + +The trainer-side reference for ``causal_conv1d_update``, which vLLM calls once +per decode token before the Gated DeltaNet recurrence. + +Semantics were established by differential testing against the provider rather +than transcribed, and the accumulation order matters: + +* ``x`` is cast to ``conv_state.dtype`` **before** anything else, so a bf16 + conv cache rounds the incoming token (``causal_conv1d.py:1160``). +* The window is ``[state[..., -(width-1):], x]``; the taps are accumulated + **sequentially in tap order**, ``acc = acc + win[t] * w[t]`` starting from + zero -- not a tree reduction and not an FMA. With an fp32 conv state this + reproduces the provider bitwise; a tree sum does not. +* Bias and the activation are applied in fp32, with one cast on the way out to + the input's original dtype. +* The new state is the window minus its oldest column. + +Measured against the provider on B200 (``conv_dim=8192``, ``W=4``, B up to 64): + +* **The rolled state is bitwise exact in every configuration**, fp32 and bf16 + cache alike -- ``max|diff| = 0``. That is the part the next token consumes, + so the recurrence carries no error from here. +* With an **fp32** conv state the output is bitwise on all but a handful of + elements (15 of 524288 at B=64), the residual being fp32 ULP. +* With a **bf16** conv state the output agrees on ~63% of elements, every + disagreement exactly one bf16 ULP. + +The bf16 output gap is a rounding-path difference, not a semantic one: none of +accumulate-in-bf16, bias-in-bf16 or activation-in-bf16 reproduces the provider, +so where it rounds is left unresolved rather than guessed at. An fp32 conv state +is what an exactness claim should use anyway -- the same conclusion the +recurrent state reaches in :mod:`.gated_delta_rule`. +""" + +from __future__ import annotations + +import torch +import torch.nn.functional as F + +from rl_engine.kernels.ops.pytorch.linear_attn.gated_delta_rule import NULL_BLOCK_ID + +__all__ = ["CausalConv1dUpdateOp"] + + +class CausalConv1dUpdateOp: + """One decode token through the paged causal-conv1d cache. + + ============== ========================== ========================== + tensor shape notes + ============== ========================== ========================== + ``x`` ``[B, dim]`` + ``conv_state`` ``[num_blocks, dim, W-1]`` paged; ``dim_first`` layout + ``weight`` ``[dim, W]`` + ``bias`` ``[dim]`` or ``None`` + ``indices`` ``[B]`` ``<= 0`` skips + ============== ========================== ========================== + + Returns ``(out, conv_state)``; the state is updated out of place. + """ + + def __call__( + self, + x: torch.Tensor, + conv_state: torch.Tensor, + weight: torch.Tensor, + conv_state_indices: torch.Tensor, + *, + bias: torch.Tensor | None = None, + activation: str | None = "silu", + dim_first: bool = True, + ) -> tuple[torch.Tensor, torch.Tensor]: + return self.forward( + x, + conv_state, + weight, + conv_state_indices, + bias=bias, + activation=activation, + dim_first=dim_first, + ) + + def forward( + self, + x: torch.Tensor, + conv_state: torch.Tensor, + weight: torch.Tensor, + conv_state_indices: torch.Tensor, + *, + bias: torch.Tensor | None = None, + activation: str | None = "silu", + dim_first: bool = True, + ) -> tuple[torch.Tensor, torch.Tensor]: + return self._update( + x, + conv_state, + weight, + conv_state_indices, + bias=bias, + activation=activation, + dim_first=dim_first, + output_dtype=x.dtype, + ) + + def forward_fp32( + self, + x: torch.Tensor, + conv_state: torch.Tensor, + weight: torch.Tensor, + conv_state_indices: torch.Tensor, + *, + bias: torch.Tensor | None = None, + activation: str | None = "silu", + dim_first: bool = True, + ) -> tuple[torch.Tensor, torch.Tensor]: + """Ground truth: fp32 output, so only the cache dtype rounds.""" + return self._update( + x, + conv_state, + weight, + conv_state_indices, + bias=bias, + activation=activation, + dim_first=dim_first, + output_dtype=torch.float32, + ) + + @staticmethod + def _update( + x, + conv_state, + weight, + conv_state_indices, + *, + bias, + activation, + dim_first, + output_dtype, + ): + if activation not in (None, "silu", "swish"): + raise ValueError(f"activation must be None, 'silu' or 'swish', got {activation!r}") + if x.dim() != 2: + raise ValueError(f"x must be 2-D [B, dim], got {tuple(x.shape)}") + if conv_state.dim() != 3: + raise ValueError( + f"conv_state must be 3-D [num_blocks, dim, W-1], got {tuple(conv_state.shape)}" + ) + if conv_state_indices.dim() != 1 or conv_state_indices.shape[0] != x.shape[0]: + raise ValueError("conv_state_indices must be 1-D with one entry per row of x") + + # The "SD" layout stores (state_len, dim); the kernels want (dim, state_len). + state = conv_state if dim_first else conv_state.transpose(-1, -2) + dim, tail = state.shape[-2], state.shape[-1] + width = weight.shape[-1] + if weight.shape[0] != dim: + raise ValueError(f"weight must be [dim, W] with dim={dim}, got {tuple(weight.shape)}") + if tail != width - 1: + raise ValueError(f"conv_state tail must be W-1={width - 1}, got {tail}") + + active = conv_state_indices > NULL_BLOCK_ID + out = torch.zeros(x.shape, dtype=torch.float32, device=x.device) + new_state = conv_state.clone() # the cache dtype is the contract here + if not bool(active.any()): + return out.to(output_dtype), new_state + + rows = torch.nonzero(active, as_tuple=False).flatten() + blocks = conv_state_indices[rows].long() + + # The incoming token is rounded to the cache dtype before it is used. + token = x[rows].to(conv_state.dtype) + window = torch.cat([state[blocks], token.unsqueeze(-1)], dim=-1) # [R, dim, W] + + # Sequential tap accumulation from zero, in fp32. A tree sum over the + # same four terms gives a different last bit and does NOT match. + acc = torch.zeros(len(rows), dim, dtype=torch.float32, device=x.device) + w32 = weight.float() + for tap in range(width): + acc = acc + window[..., tap].float() * w32[:, tap].unsqueeze(0) + if bias is not None: + acc = acc + bias.float() + if activation in ("silu", "swish"): + acc = F.silu(acc) + + out[rows] = acc + rolled = window[..., 1:] + if dim_first: + new_state[blocks] = rolled.to(conv_state.dtype) + else: + new_state[blocks] = rolled.transpose(-1, -2).to(conv_state.dtype) + return out.to(output_dtype), new_state diff --git a/rl_engine/kernels/ops/pytorch/linear_attn/gated_delta_rule.py b/rl_engine/kernels/ops/pytorch/linear_attn/gated_delta_rule.py new file mode 100644 index 000000000..cdf6f17b7 --- /dev/null +++ b/rl_engine/kernels/ops/pytorch/linear_attn/gated_delta_rule.py @@ -0,0 +1,294 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Gated DeltaNet single-token recurrent step (WS1 ground truth for RFC #428 C6). + +This is the trainer-side reference for what vLLM runs during rollout decode: +``fused_recurrent_gated_delta_rule_packed_decode``. That kernel -- not +``fused_sigmoid_gating_delta_rule_update`` -- is the path a pure RL rollout +takes, because ``VLLM_ENABLE_FLA_PACKED_RECURRENT_DECODE`` defaults to true and +a decode-only, non-speculative batch returns early into it. + +Three things are transcribed from the kernel rather than from the HuggingFace +model, because they differ: + +* **The gating is fused.** ``beta = sigmoid(b)`` and + ``g = -exp(A_log) * softplus(a + dt_bias)`` are computed here, in fp32, with + the kernel's ``softplus`` threshold branch. HF computes them separately in + PyTorch, which is a different rounding path. +* **No ``repeat_interleave``.** The kernel indexes ``i_h = i_hv // (HV // H)``, + so q/k stay at ``H`` heads while v has ``HV``. HF materializes the repeat. +* **The QK norm is an L2 norm over a plain sum**, ``x / sqrt(sum(x*x) + 1e-6)``, + not an RMSNorm and not ``F.normalize``. It divides by ``sqrt`` rather than + multiplying by ``rsqrt``; the two differ in the last bit, so the division is + kept. + +``scale`` is applied to ``q`` *after* the L2 norm; ``k`` is never scaled. + +State ABI (mirrored, not reinvented) +------------------------------------ +The recurrent state is paged: ``[num_blocks, HV, V, K]``, addressed per +sequence by ``ssm_state_indices``. Index ``<= 0`` is ``NULL_BLOCK_ID`` and means +"skip": the kernel writes zeros to the output and leaves the block untouched. +The accumulator is fp32 throughout the step, and the store rounds to the state +tensor's dtype -- which upstream allows to be fp32 *or* bf16. That rounding is +part of the recurrence and compounds across tokens, so it is modelled here +rather than skipped. +""" + +from __future__ import annotations + +import torch + +__all__ = ["GatedDeltaRuleRecurrentStepOp", "NULL_BLOCK_ID", "SOFTPLUS_THRESHOLD"] + +#: Paged-state sentinel: a sequence pointing here is skipped. +NULL_BLOCK_ID = 0 + +#: Above this, softplus is the identity (matches the kernel's constexpr). +SOFTPLUS_THRESHOLD = 20.0 + +#: Width of the fixed-order reduction chunks. The contraction order must not +#: depend on the batch layout, so it is pinned here exactly as +#: :func:`~rl_engine.kernels.ops.pytorch.norm.rms_norm.shape_invariant_rstd` +#: pins the RMSNorm statistic. +_REDUCTION_CHUNK = 32 + + +def _chunked_sum(x: torch.Tensor) -> torch.Tensor: + """Sum the last dim in a fixed 32-wide chunk order. + + The single reduction primitive for this module. Deliberately not + ``sum``/``matmul``/``einsum`` on the whole axis: their reduction order is + unspecified and may vary with shape, which is what a batch-invariant claim + cannot tolerate. Mirrors + :func:`~rl_engine.kernels.ops.pytorch.norm.rms_norm.shape_invariant_rstd`. + """ + tail = x.shape[-1] + if tail % _REDUCTION_CHUNK != 0: + return x.sum(dim=-1) + return x.reshape(*x.shape[:-1], -1, _REDUCTION_CHUNK).sum(dim=-1).sum(dim=-1) + + +def _fixed_order_contract(mat: torch.Tensor, vec: torch.Tensor) -> torch.Tensor: + """``sum(mat * vec, dim=-1)`` in a fixed chunk order.""" + return _chunked_sum(mat * vec) + + +def _l2_normalize(x: torch.Tensor, eps: float = 1e-6) -> torch.Tensor: + """``x / sqrt(sum(x*x) + eps)`` over the last dim, in fp32. + + A plain sum, not a mean: this is an L2 norm, not an RMSNorm. The division is + kept rather than folded into a reciprocal-sqrt multiply because the kernel + divides. + """ + return x / torch.sqrt(_chunked_sum(x * x) + eps).unsqueeze(-1) + + +def _softplus(x: torch.Tensor, threshold: float = SOFTPLUS_THRESHOLD) -> torch.Tensor: + """The kernel's branched softplus; the branch matters for large ``a + dt_bias``.""" + return torch.where(x <= threshold, torch.log1p(torch.exp(x)), x) + + +class GatedDeltaRuleRecurrentStepOp: + """One decode token of the Gated DeltaNet recurrence, over a paged state. + + Shapes follow the provider, not the model definition: + + ============= ====================================== =================== + tensor shape notes + ============= ====================================== =================== + ``mixed_qkv`` ``[B, H*K + H*K + HV*V]`` q | k | v, packed + ``a``, ``b`` ``[B, HV]`` + ``A_log`` ``[HV]`` fp32 + ``dt_bias`` ``[HV]`` fp32 + ``state`` ``[num_blocks, HV, V, K]`` paged, V-major + ``indices`` ``[B]`` ``<= 0`` skips + ============= ====================================== =================== + + Returns ``(out, state)`` with ``out`` of shape ``[B, 1, HV, V]``. The state + is updated out of place; pass the result back to continue the recurrence. + """ + + def __call__( + self, + mixed_qkv: torch.Tensor, + a: torch.Tensor, + b: torch.Tensor, + A_log: torch.Tensor, + dt_bias: torch.Tensor, + state: torch.Tensor, + ssm_state_indices: torch.Tensor, + *, + scale: float, + num_k_heads: int, + use_qk_l2norm: bool = True, + ) -> tuple[torch.Tensor, torch.Tensor]: + return self.forward( + mixed_qkv, + a, + b, + A_log, + dt_bias, + state, + ssm_state_indices, + scale=scale, + num_k_heads=num_k_heads, + use_qk_l2norm=use_qk_l2norm, + ) + + def forward( + self, + mixed_qkv: torch.Tensor, + a: torch.Tensor, + b: torch.Tensor, + A_log: torch.Tensor, + dt_bias: torch.Tensor, + state: torch.Tensor, + ssm_state_indices: torch.Tensor, + *, + scale: float, + num_k_heads: int, + use_qk_l2norm: bool = True, + ) -> tuple[torch.Tensor, torch.Tensor]: + """Step once, rounding the stored state to ``state.dtype``.""" + return self._step( + mixed_qkv, + a, + b, + A_log, + dt_bias, + state, + ssm_state_indices, + scale=scale, + num_k_heads=num_k_heads, + use_qk_l2norm=use_qk_l2norm, + state_dtype=state.dtype, + output_dtype=mixed_qkv.dtype, + ) + + def forward_fp32( + self, + mixed_qkv: torch.Tensor, + a: torch.Tensor, + b: torch.Tensor, + A_log: torch.Tensor, + dt_bias: torch.Tensor, + state: torch.Tensor, + ssm_state_indices: torch.Tensor, + *, + scale: float, + num_k_heads: int, + use_qk_l2norm: bool = True, + ) -> tuple[torch.Tensor, torch.Tensor]: + """Ground truth: keep the state and the output in fp32. + + The difference from :meth:`forward` is the per-token state rounding, so + running both and comparing isolates how much that rounding costs. + """ + return self._step( + mixed_qkv, + a, + b, + A_log, + dt_bias, + state, + ssm_state_indices, + scale=scale, + num_k_heads=num_k_heads, + use_qk_l2norm=use_qk_l2norm, + state_dtype=torch.float32, + output_dtype=torch.float32, + ) + + @staticmethod + def _step( + mixed_qkv, + a, + b, + A_log, + dt_bias, + state, + ssm_state_indices, + *, + scale, + num_k_heads, + use_qk_l2norm, + state_dtype, + output_dtype, + ): + if mixed_qkv.dim() != 2: + raise ValueError(f"mixed_qkv must be 2-D [B, D], got {tuple(mixed_qkv.shape)}") + if state.dim() != 4: + raise ValueError( + f"state must be 4-D [num_blocks, HV, V, K], got {tuple(state.shape)}" + ) + if ssm_state_indices.dim() != 1: + raise ValueError("ssm_state_indices must be 1-D [B] for packed decode") + + batch = mixed_qkv.shape[0] + hv, v_dim, k_dim = state.shape[-3:] + heads = int(num_k_heads) + if hv % heads != 0: + raise ValueError(f"HV={hv} must be a multiple of num_k_heads={heads}") + if a.shape != (batch, hv) or b.shape != (batch, hv): + raise ValueError( + f"a/b must be [B, HV] = {(batch, hv)}, got {tuple(a.shape)} / {tuple(b.shape)}" + ) + expected = heads * k_dim * 2 + hv * v_dim + if mixed_qkv.shape[1] != expected: + raise ValueError( + f"mixed_qkv last dim must be {expected} (q|k|v packed), " + f"got {mixed_qkv.shape[1]}" + ) + if ssm_state_indices.shape[0] != batch: + raise ValueError("ssm_state_indices must have one entry per sequence") + + group = hv // heads + qkv32 = mixed_qkv.float() + + # Unpack q | k | v. q and k carry H heads, v carries HV. + q = qkv32[:, : heads * k_dim].reshape(batch, heads, k_dim) + k = qkv32[:, heads * k_dim : 2 * heads * k_dim].reshape(batch, heads, k_dim) + v = qkv32[:, 2 * heads * k_dim :].reshape(batch, hv, v_dim) + + if use_qk_l2norm: + q = _l2_normalize(q) + k = _l2_normalize(k) + q = q * scale + + # i_h = i_hv // (HV // H): index, do not materialize a repeat. + head_of = torch.arange(hv, device=q.device) // group + q = q[:, head_of, :] # [B, HV, K] + k = k[:, head_of, :] + + # Fused gating, fp32, with the kernel's softplus branch. + decay = -torch.exp(A_log.float()) * _softplus(a.float() + dt_bias.float()) + beta = torch.sigmoid(b.float()) + + active = ssm_state_indices > NULL_BLOCK_ID + out = torch.zeros(batch, 1, hv, v_dim, dtype=torch.float32, device=q.device) + # The returned state carries `state_dtype`, not the caller's: forward_fp32 + # exists precisely to run the recurrence without the per-token rounding, + # so it must be able to widen a bf16 cache to fp32. + new_state = state.to(state_dtype).clone() + if not bool(active.any()): + return out.to(output_dtype), new_state + + rows = torch.nonzero(active, as_tuple=False).flatten() + blocks = ssm_state_indices[rows].long() + + h = state[blocks].float() # [R, HV, V, K] + h = h * torch.exp(decay[rows]).unsqueeze(-1).unsqueeze(-1) + + k_sel, q_sel, v_sel = k[rows], q[rows], v[rows] + # v -= h @ k, then v *= beta, then h += outer(v, k), then o = h @ q. + v_sel = v_sel - _fixed_order_contract(h, k_sel.unsqueeze(-2)) + v_sel = v_sel * beta[rows].unsqueeze(-1) + h = h + v_sel.unsqueeze(-1) * k_sel.unsqueeze(-2) + o = _fixed_order_contract(h, q_sel.unsqueeze(-2)) + + out[rows, 0] = o + # The store rounds; that rounding is part of the recurrence. + new_state[blocks] = h.to(state_dtype) + return out.to(output_dtype), new_state diff --git a/tests/check_gdn_recurrent_golden.py b/tests/check_gdn_recurrent_golden.py new file mode 100644 index 000000000..e9e18487c --- /dev/null +++ b/tests/check_gdn_recurrent_golden.py @@ -0,0 +1,501 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""The GDN recurrent-step golden against the kernel vLLM actually runs (RFC #428 C6). + +Named ``check_`` rather than ``test_``, following ``tests/distributed/check_*.py``: +this module imports real vLLM, and ``tests/test_framework_operator_integrations.py`` +asserts ``vllm`` is absent from ``sys.modules`` -- an invariant any collected test +importing vLLM would break for the whole session. Run it explicitly: + + pytest tests/check_gdn_recurrent_golden.py -v + +The provider here is ``fused_recurrent_gated_delta_rule_packed_decode``, not +``fused_sigmoid_gating_delta_rule_update``. A pure RL rollout decode -- N +sequences each emitting one token, no speculative decoding -- returns early into +the packed path because ``VLLM_ENABLE_FLA_PACKED_RECURRENT_DECODE`` defaults to +true. Aligning against the sigmoid-gating kernel would be validating a path +production does not take. + +Claim levels (RFC #428 section 2.1): L0 and L1 for the golden. L2 is not claimed; +the golden agrees with the provider at fp32-ULP scale but not bitwise, because +its contractions run in a fixed 32-wide chunk order rather than the kernel's +tree. + +Recurrent-state dtype, and how far a decode run actually drifts +---------------------------------------------------------------- +``FUSED_GDN_STATE_DTYPES`` allows the recurrent state to be fp32 or bf16, and a +bf16 store rounds the ``[HV, V, K]`` state once per token. The drift that causes +does **not** compound without bound, because the recurrence is contracting: the +per-step decay ``exp(g)`` averages ~0.47 here (max 0.996), so old error is +forgotten at roughly the rate old signal is. + +fp32 state vs bf16 state, identical inputs, B=8, B200: + +====== ================= =============== +step relative |d| state relative |d| out +====== ================= =============== +1 2.67e-03 3.47e-03 +64 1.52e-02 1.07e-02 +256 2.02e-02 1.09e-02 +1024 2.47e-02 1.57e-02 +====== ================= =============== + +The curve saturates: a 16x longer run past step 64 grows the state drift only +1.6x. The plateau is ~2% relative on the state and ~1-1.8% on the output. + +Chunked prefill vs step-by-step decode replay, single sequence, from a zero +state -- this is the quantity RFC #428 section 4.2 is about: + +====== ================== ================== +T max|diff|, fp32 max|diff|, bf16 +====== ================== ================== +8 3.66e-04 (7.0e-03) 5.49e-04 (1.0e-02) +64 4.88e-04 (6.6e-03) 5.49e-04 (7.5e-03) +256 3.66e-04 (5.0e-03) 3.66e-04 (5.0e-03) +====== ================== ================== + +(relative in parentheses). The gap is ~0.5-1% relative and **flat in T** -- at +T=256 it is smaller than at T=8 -- and the state dtype barely moves it. + +So the two paths are not bitwise, and ~1% relative on logits is still material +for RL importance ratios, but this is a bounded, characterizable error rather +than a divergence. An fp32 recurrent state is still the right choice for +exactness work; the reason is the 2% state plateau, not a blow-up. + +Note the chunked prefill kernel refuses fp32 q/k/v outright +(``chunk.py:213``), so the prefill side is bf16-only regardless. +""" + +from __future__ import annotations + +import pytest +import torch + +pytestmark = pytest.mark.skipif(not torch.cuda.is_available(), reason="CUDA is required") + +from rl_engine.kernels.ops.pytorch.linear_attn import ( # noqa: E402 + GatedDeltaRuleRecurrentStepOp, +) + +# Qwen3-Next-80B-A3B-Instruct: linear_num_key_heads / linear_num_value_heads / +# linear_key_head_dim / linear_value_head_dim. +_H, _HV, _K, _V = 16, 32, 128, 128 +_SCALE = _K**-0.5 +_PACKED_DIM = _H * _K * 2 + _HV * _V + + +def _vllm_step(): + pytest.importorskip("vllm", reason="vLLM is required to compare against the provider") + from vllm.third_party.flash_linear_attention.ops import ( + fused_recurrent_gated_delta_rule_packed_decode, + ) + + return fused_recurrent_gated_delta_rule_packed_decode + + +def _inputs(batch, num_blocks, state_dtype, io_dtype, seed, indices=None): + g = torch.Generator(device="cuda").manual_seed(seed) + rand = lambda *shape, dtype: torch.randn( # noqa: E731 + *shape, device="cuda", dtype=dtype, generator=g + ) + if indices is None: + indices = torch.arange(1, batch + 1, device="cuda", dtype=torch.int32) + return { + "mixed_qkv": rand(batch, _PACKED_DIM, dtype=io_dtype), + "a": rand(batch, _HV, dtype=io_dtype), + "b": rand(batch, _HV, dtype=io_dtype), + "A_log": rand(_HV, dtype=torch.float32), + "dt_bias": rand(_HV, dtype=torch.float32), + "state": rand(num_blocks, _HV, _V, _K, dtype=state_dtype) * 0.1, + "indices": indices, + } + + +def _run_provider(inp, io_dtype=torch.bfloat16): + """Returns (out, mutated_state). The kernel updates the state in place.""" + step = _vllm_step() + state = inp["state"].clone() + out = torch.empty( + inp["mixed_qkv"].shape[0], 1, _HV, _V, device="cuda", dtype=io_dtype + ) + step( + inp["mixed_qkv"], + inp["a"], + inp["b"], + inp["A_log"], + inp["dt_bias"], + _SCALE, + state, + out, + inp["indices"], + use_qk_l2norm_in_kernel=True, + ) + return out, state + + +def _run_golden(inp): + return GatedDeltaRuleRecurrentStepOp().forward( + inp["mixed_qkv"], + inp["a"], + inp["b"], + inp["A_log"], + inp["dt_bias"], + inp["state"].clone(), + inp["indices"], + scale=_SCALE, + num_k_heads=_H, + ) + + +# --------------------------------------------------------------------------- # +# 1. Against the provider +# --------------------------------------------------------------------------- # +@pytest.mark.parametrize("batch", [1, 4, 17, 64]) +@pytest.mark.parametrize( + "state_dtype, out_atol, state_atol", + [ + # fp32 state: agreement is at fp32-ULP scale. + (torch.float32, 1e-3, 1e-5), + # bf16 state: the store rounds every token, so the state carries a + # bf16 ULP. This is the configuration knob behind the drift probe. + (torch.bfloat16, 1e-3, 5e-3), + ], +) +def test_golden_matches_packed_decode_provider(batch, state_dtype, out_atol, state_atol): + inp = _inputs(batch, batch + 2, state_dtype, torch.bfloat16, seed=batch) + out_ref, state_ref = _run_provider(inp) + out_got, state_got = _run_golden(inp) + + assert (out_got.float() - out_ref.float()).abs().max().item() <= out_atol + assert (state_got.float() - state_ref.float()).abs().max().item() <= state_atol + + +def test_null_block_id_is_skipped_by_both(): + """Index 0 means "no state": zeros out, and the block is left alone.""" + indices = torch.tensor([1, 0, 2, 0], device="cuda", dtype=torch.int32) + inp = _inputs(4, 4, torch.float32, torch.bfloat16, seed=7, indices=indices) + + out_ref, state_ref = _run_provider(inp) + out_got, state_got = _run_golden(inp) + + for row in (1, 3): + assert bool((out_ref[row] == 0).all()), f"provider row {row}" + assert bool((out_got[row] == 0).all()), f"golden row {row}" + assert torch.equal(state_got[0], inp["state"][0]), "block 0 must be untouched" + + +# --------------------------------------------------------------------------- # +# 2. L1 -- a sequence is unaffected by the others sharing the batch +# --------------------------------------------------------------------------- # +@pytest.mark.parametrize("state_dtype", [torch.float32, torch.bfloat16]) +def test_golden_is_batch_invariant(state_dtype): + """Bitwise: the same sequence, alone or in a batch of 64, at any position.""" + batch = 64 + inp = _inputs(batch, batch + 2, state_dtype, torch.bfloat16, seed=3) + full_out, full_state = _run_golden(inp) + + op = GatedDeltaRuleRecurrentStepOp() + for row in (0, 1, 31, 63): + alone = { + key: (value[row : row + 1] if key in ("mixed_qkv", "a", "b", "indices") else value) + for key, value in inp.items() + } + out, state = op.forward( + alone["mixed_qkv"], + alone["a"], + alone["b"], + alone["A_log"], + alone["dt_bias"], + alone["state"].clone(), + alone["indices"], + scale=_SCALE, + num_k_heads=_H, + ) + assert torch.equal(out[0], full_out[row]), f"out row {row}" + block = int(inp["indices"][row]) + assert torch.equal(state[block], full_state[block]), f"state block {block}" + + +# --------------------------------------------------------------------------- # +# 3. The state-dtype rounding is modelled, not skipped +# --------------------------------------------------------------------------- # +def test_bf16_state_rounding_is_visible_but_saturates(): + """A bf16 state rounds from the first store, and the drift then flattens. + + The recurrence is contracting -- ``exp(g)`` is well below 1 for most heads -- + so old rounding error is forgotten at roughly the rate old signal is. The + drift therefore grows quickly at first and then plateaus, rather than + compounding without bound. Asserting a bound is the honest form: asserting + monotone growth would have been true over a truncated run and false over a + long one. + """ + batch, steps = 8, 128 + inp = _inputs(batch, batch + 2, torch.float32, torch.bfloat16, seed=11) + op = GatedDeltaRuleRecurrentStepOp() + + # Both runs start from the SAME bf16-representable state, so the initial + # cast is a no-op and drift[0] can only come from a per-token store. + seed_state = inp["state"].to(torch.bfloat16).float() + state_fp32 = seed_state.clone() + state_bf16 = seed_state.to(torch.bfloat16).clone() + assert torch.equal(state_fp32, state_bf16.float()), "the two runs must start equal" + drift = [] + for step in range(steps): + g = torch.Generator(device="cuda").manual_seed(100 + step) + token = torch.randn( + batch, _PACKED_DIM, device="cuda", dtype=torch.bfloat16, generator=g + ) + common = (inp["a"], inp["b"], inp["A_log"], inp["dt_bias"]) + _, state_fp32 = op.forward( + token, *common, state_fp32, inp["indices"], scale=_SCALE, num_k_heads=_H + ) + _, state_bf16 = op.forward( + token, *common, state_bf16, inp["indices"], scale=_SCALE, num_k_heads=_H + ) + scale = max(state_fp32.float().abs().max().item(), 1e-9) + drift.append((state_fp32.float() - state_bf16.float()).abs().max().item() / scale) + + assert drift[0] > 0.0, "a bf16 state must round on the very first store" + # Measured plateau is ~2% relative; the bound leaves room without hiding a + # genuine divergence. + assert max(drift) < 0.05, f"relative state drift reached {max(drift):.3e}" + # The back half must not be materially worse than the front half. + assert max(drift[steps // 2 :]) < 2.0 * max(drift[: steps // 2]) + 1e-3 + + +# --------------------------------------------------------------------------- # +# 4. The causal-conv1d state update, the other half of a decode step +# --------------------------------------------------------------------------- # +_CONV_DIM, _CONV_WIDTH = 8192, 4 # Qwen3-Next: key_dim*2 + value_dim, linear_conv_kernel_dim + + +def _conv_update(): + pytest.importorskip("vllm", reason="vLLM is required to compare against the provider") + from vllm.model_executor.layers.mamba.ops.causal_conv1d import causal_conv1d_update + + return causal_conv1d_update + + +def _conv_inputs(batch, state_dtype, seed, with_bias=True, indices=None): + g = torch.Generator(device="cuda").manual_seed(seed) + rand = lambda *shape, dtype: torch.randn( # noqa: E731 + *shape, device="cuda", dtype=dtype, generator=g + ) + if indices is None: + indices = torch.arange(1, batch + 1, device="cuda", dtype=torch.int32) + return { + "x": rand(batch, _CONV_DIM, dtype=torch.bfloat16), + # The cache must have room for every index used, plus the null block. + "state": rand(batch + 2, _CONV_DIM, _CONV_WIDTH - 1, dtype=state_dtype), + "weight": rand(_CONV_DIM, _CONV_WIDTH, dtype=torch.bfloat16), + "bias": rand(_CONV_DIM, dtype=torch.bfloat16) if with_bias else None, + "indices": indices, + } + + +def _run_conv_pair(inp, activation="silu"): + from rl_engine.kernels.ops.pytorch.linear_attn import CausalConv1dUpdateOp + + state_ref, out_ref = inp["state"].clone(), torch.empty_like(inp["x"]) + _conv_update()( + inp["x"], + state_ref, + inp["weight"], + inp["bias"], + activation, + conv_state_indices=inp["indices"], + out=out_ref, + ) + out_got, state_got = CausalConv1dUpdateOp().forward( + inp["x"], + inp["state"].clone(), + inp["weight"], + inp["indices"], + bias=inp["bias"], + activation=activation, + ) + return (out_ref, state_ref), (out_got, state_got) + + +@pytest.mark.parametrize("batch", [1, 4, 17, 64]) +def test_conv_state_update_is_bitwise_exact(batch): + """The rolled window is what the next token consumes, so it must be exact. + + Holds for an fp32 and a bf16 cache alike -- the rolling is a copy, not a + computation, which is also why bias and activation are not varied here: they + cannot reach the state. + """ + for state_dtype in (torch.float32, torch.bfloat16): + inp = _conv_inputs(batch, state_dtype, seed=batch) + (_, state_ref), (_, state_got) = _run_conv_pair(inp) + assert torch.equal(state_got, state_ref), f"{state_dtype} batch={batch}" + + +@pytest.mark.parametrize("batch", [1, 4, 17, 64]) +def test_conv_output_matches_provider_with_fp32_cache(batch): + """An fp32 cache reproduces the provider up to fp32 ULP on a few elements. + + Measured: 1 element of 8192 at B=1, 15 of 524288 at B=64. The bound is on + the magnitude and on a handful of elements rather than on a tight rate -- + at small batches a single straddling element is already 1.2e-4 of the + tensor, which says nothing about accuracy. + """ + inp = _conv_inputs(batch, torch.float32, seed=batch) + (out_ref, _), (out_got, _) = _run_conv_pair(inp) + mismatch = int( + (out_got.float().view(torch.int32) != out_ref.float().view(torch.int32)).sum() + ) + assert mismatch <= 32, f"{mismatch} of {out_got.numel()} elements differ" + assert (out_got.float() - out_ref.float()).abs().max().item() <= 1e-2 + + +@pytest.mark.parametrize("batch", [1, 17]) +def test_conv_output_bf16_cache_differs_only_by_one_ulp(batch): + """A bf16 cache disagrees often but never by more than a bf16 ULP. + + Bounded rather than asserted equal: where the provider rounds in this + configuration is not reproduced, and pretending otherwise would hide it. + """ + inp = _conv_inputs(batch, torch.bfloat16, seed=batch) + (out_ref, _), (out_got, _) = _run_conv_pair(inp) + assert (out_got.float() - out_ref.float()).abs().max().item() <= 7e-2 + + +def test_conv_null_block_id_is_skipped(): + from rl_engine.kernels.ops.pytorch.linear_attn import CausalConv1dUpdateOp + + indices = torch.tensor([1, 0, 2, 0], device="cuda", dtype=torch.int32) + inp = _conv_inputs(4, torch.float32, seed=5, with_bias=False, indices=indices) + out_got, state_got = CausalConv1dUpdateOp().forward( + inp["x"], inp["state"].clone(), inp["weight"], indices, bias=None + ) + for row in (1, 3): + assert bool((out_got[row] == 0).all()) + assert torch.equal(state_got[0], inp["state"][0]) + + +def test_conv_rejects_unknown_activation_and_bad_shapes(): + from rl_engine.kernels.ops.pytorch.linear_attn import CausalConv1dUpdateOp + + op = CausalConv1dUpdateOp() + inp = _conv_inputs(2, torch.float32, seed=1) + with pytest.raises(ValueError, match="activation must be"): + op.forward(inp["x"], inp["state"], inp["weight"], inp["indices"], activation="relu") + with pytest.raises(ValueError, match="conv_state tail must be"): + op.forward( + inp["x"], + inp["state"][..., :1], + inp["weight"], + inp["indices"], + activation=None, + ) + + +# --------------------------------------------------------------------------- # +# 5. forward_fp32, and the branches the provider comparison never reaches +# --------------------------------------------------------------------------- # +@pytest.mark.parametrize("state_dtype", [torch.float32, torch.bfloat16]) +def test_recurrent_forward_fp32_widens_the_state(state_dtype): + """forward_fp32 must run the recurrence without the per-token rounding. + + With a bf16 cache that means widening it -- the whole point of having the + method is to be able to compare against the rounded path. + """ + op = GatedDeltaRuleRecurrentStepOp() + inp = _inputs(4, 6, state_dtype, torch.bfloat16, seed=1) + out, state = op.forward_fp32( + inp["mixed_qkv"], + inp["a"], + inp["b"], + inp["A_log"], + inp["dt_bias"], + inp["state"].clone(), + inp["indices"], + scale=_SCALE, + num_k_heads=_H, + ) + assert out.dtype is torch.float32 and state.dtype is torch.float32 + + rounded, _ = _run_golden(inp) + if state_dtype is torch.bfloat16: + # The rounded path went through bf16; the fp32 path did not. + assert not torch.equal(rounded.float(), out) + + +def test_recurrent_call_matches_forward(): + op = GatedDeltaRuleRecurrentStepOp() + inp = _inputs(4, 6, torch.float32, torch.bfloat16, seed=2) + args = ( + inp["mixed_qkv"], + inp["a"], + inp["b"], + inp["A_log"], + inp["dt_bias"], + inp["state"].clone(), + inp["indices"], + ) + kwargs = dict(scale=_SCALE, num_k_heads=_H) + a_out, a_state = op(*args, **kwargs) + b_out, b_state = op.forward(*args, **kwargs) + assert torch.equal(a_out, b_out) and torch.equal(a_state, b_state) + + +def test_recurrent_without_in_kernel_l2norm_differs(): + """`use_qk_l2norm=False` is the prefill convention and must be reachable.""" + op = GatedDeltaRuleRecurrentStepOp() + inp = _inputs(4, 6, torch.float32, torch.bfloat16, seed=3) + common = ( + inp["mixed_qkv"], + inp["a"], + inp["b"], + inp["A_log"], + inp["dt_bias"], + ) + normed, _ = op.forward( + *common, inp["state"].clone(), inp["indices"], scale=_SCALE, num_k_heads=_H + ) + raw, _ = op.forward( + *common, + inp["state"].clone(), + inp["indices"], + scale=_SCALE, + num_k_heads=_H, + use_qk_l2norm=False, + ) + assert not torch.equal(normed, raw) + + +def test_conv_dim_first_false_matches_the_transposed_layout(): + """`dim_first=False` is vLLM's "SD" cache layout, not a dead branch.""" + from rl_engine.kernels.ops.pytorch.linear_attn import CausalConv1dUpdateOp + + op = CausalConv1dUpdateOp() + inp = _conv_inputs(4, torch.float32, seed=9) + ds_out, ds_state = op.forward( + inp["x"], inp["state"].clone(), inp["weight"], inp["indices"], bias=inp["bias"] + ) + sd_out, sd_state = op.forward( + inp["x"], + inp["state"].transpose(-1, -2).contiguous(), + inp["weight"], + inp["indices"], + bias=inp["bias"], + dim_first=False, + ) + assert torch.equal(ds_out, sd_out) + assert torch.equal(ds_state, sd_state.transpose(-1, -2)) + + +def test_conv_forward_fp32_and_call_entry_points(): + from rl_engine.kernels.ops.pytorch.linear_attn import CausalConv1dUpdateOp + + op = CausalConv1dUpdateOp() + inp = _conv_inputs(4, torch.float32, seed=10) + args = (inp["x"], inp["state"].clone(), inp["weight"], inp["indices"]) + out, _ = op.forward(*args, bias=inp["bias"]) + called, _ = op(*args, bias=inp["bias"]) + fp32, _ = op.forward_fp32(*args, bias=inp["bias"]) + assert torch.equal(out, called) + assert fp32.dtype is torch.float32 + torch.testing.assert_close(fp32, out.float(), atol=1e-2, rtol=1e-2) From dbb8d00ae8cc7c5d8dcd772be6715e8500e9d14b Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Wed, 30 Sep 2026 18:28:34 +0000 Subject: [PATCH 18/70] fix(gdn): validate cache ownership and reproduce conv product rounding Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- .github/workflows/ws1-gtest-gpu.yml | 8 ++ ci/run_ws1_gtest.sh | 21 ++-- .../design/ws1-c6-428-gdn-recurrent-replay.md | 78 +++++--------- .../ops/pytorch/linear_attn/__init__.py | 6 +- .../ops/pytorch/linear_attn/causal_conv1d.py | 66 ++++++------ .../pytorch/linear_attn/gated_delta_rule.py | 45 +++++++- tests/check_gdn_recurrent_golden.py | 101 +++++------------- tests/test_gdn_state_contract.py | 98 +++++++++++++++++ 8 files changed, 245 insertions(+), 178 deletions(-) create mode 100644 tests/test_gdn_state_contract.py diff --git a/.github/workflows/ws1-gtest-gpu.yml b/.github/workflows/ws1-gtest-gpu.yml index 646d80bdf..d8f32b714 100644 --- a/.github/workflows/ws1-gtest-gpu.yml +++ b/.github/workflows/ws1-gtest-gpu.yml @@ -20,6 +20,10 @@ on: - "scripts/check_gradient_invariance.py" - "scripts/ws1_candidate_evidence.py" - "tests/test_ws1_*.py" + - "tests/test_gdn_state_contract.py" + - "tests/test_qwen3_next_norm.py" + - "tests/check_qwen3_next_norm_providers.py" + - "tests/check_gdn_recurrent_golden.py" - "tests/test_forward_invariance.py" - "tests/test_gradient_invariance.py" - "tests/test_four_judgment_matrix.py" @@ -38,6 +42,10 @@ on: - "scripts/check_gradient_invariance.py" - "scripts/ws1_candidate_evidence.py" - "tests/test_ws1_*.py" + - "tests/test_gdn_state_contract.py" + - "tests/test_qwen3_next_norm.py" + - "tests/check_qwen3_next_norm_providers.py" + - "tests/check_gdn_recurrent_golden.py" - "tests/test_forward_invariance.py" - "tests/test_gradient_invariance.py" - "tests/test_four_judgment_matrix.py" diff --git a/ci/run_ws1_gtest.sh b/ci/run_ws1_gtest.sh index e6d8e0dc0..c9daa1118 100755 --- a/ci/run_ws1_gtest.sh +++ b/ci/run_ws1_gtest.sh @@ -77,12 +77,15 @@ print("[ws1-gtest] C8 gate passed") PY echo "[ws1-gtest] Qwen3-Next C3/C4 norms (operator scope)" -QWEN3_NEXT_NORM_MANIFEST=rl_engine/testing/qwen3_next_norm_manifest.json -"$PY" scripts/check_forward_invariance.py --manifest "$QWEN3_NEXT_NORM_MANIFEST" \ - --op qwen3_next_rms_norm --candidate cuda --backend-profile cuda_bf16 --hidden 2048 --head-dim 128 -"$PY" scripts/check_gradient_invariance.py --manifest "$QWEN3_NEXT_NORM_MANIFEST" \ - --op qwen3_next_rms_norm --candidate cuda --backend-profile cuda_bf16 --hidden 2048 --head-dim 128 -"$PY" scripts/check_forward_invariance.py --manifest "$QWEN3_NEXT_NORM_MANIFEST" \ - --op rms_norm_gated --candidate cuda --backend-profile cuda_bf16 --hidden 2048 --head-dim 128 -"$PY" scripts/check_gradient_invariance.py --manifest "$QWEN3_NEXT_NORM_MANIFEST" \ - --op rms_norm_gated --candidate cuda --backend-profile cuda_bf16 --hidden 2048 --head-dim 128 +for op in qwen3_next_rms_norm rms_norm_gated; do + for gate in forward gradient; do + "$PY" "scripts/check_${gate}_invariance.py" \ + --manifest rl_engine/testing/qwen3_next_norm_manifest.json \ + --op "$op" --candidate cuda --backend-profile cuda_bf16 \ + --hidden 2048 --head-dim 128 + done +done +# Provider imports run in a separate process from framework-isolation tests. +echo "[ws1-gtest] Qwen3-Next provider comparisons (required)" +"$PY" -c 'import torch, vllm; assert torch.cuda.is_available(), "CUDA is required"' +"$PY" -m pytest -q tests/check_qwen3_next_norm_providers.py tests/check_gdn_recurrent_golden.py diff --git a/docs/design/ws1-c6-428-gdn-recurrent-replay.md b/docs/design/ws1-c6-428-gdn-recurrent-replay.md index d0d0f3ea3..2aa1ddf23 100644 --- a/docs/design/ws1-c6-428-gdn-recurrent-replay.md +++ b/docs/design/ws1-c6-428-gdn-recurrent-replay.md @@ -69,53 +69,28 @@ Qwen3-Next dims (H=16, HV=32, K=V=128), `use_qk_l2norm_in_kernel=True`: | fp32 state, B=1..64 | 1.5e-08 .. 6.1e-05 | ≤ 3.0e-07 | | bf16 state, B=1..64 | 3.7e-09 .. 3.1e-05 | ≤ 2.0e-03 | -Causal conv (`conv_dim=8192`, `W=4`, B ≤ 64): the **rolled state is bitwise exact in -every configuration**. With an fp32 cache the output is bitwise but for a handful of -elements (15 of 524288 at B=64); with a bf16 cache it agrees on ~63%, each -disagreement exactly one bf16 ULP. The conv taps accumulate **sequentially**, -`acc = acc + win[t] * w[t]` from zero — a tree sum over the same four terms does not -reproduce the provider, an FMA does not either. - -Open: where the provider rounds in the bf16-conv-cache case is not reproduced. -Recorded rather than guessed at. +Causal conv uses sequential FP32 accumulation **starting from bias**, with +products first rounded to the operand dtype. The previous BF16 path incorrectly +promoted both operands to FP32; its disagreements were not limited to one BF16 +ULP. Cancellation and bias-order CPU tests now cover these errors. Provider +comparisons preserve the existing absolute bounds and additionally limit BF16 +mismatches to 32 elements on the checked fixtures. This is not a bitwise claim. ## 5. Decode versus chunked prefill -The quantity RFC #428 §4.2 is about. Single sequence, zero initial state: - -| T | max\|diff\|, fp32 state | max\|diff\|, bf16 state | -|---|---|---| -| 8 | 3.66e-04 (7.0e-03 rel) | 5.49e-04 (1.0e-02 rel) | -| 64 | 4.88e-04 (6.6e-03 rel) | 5.49e-04 (7.5e-03 rel) | -| 256 | 3.66e-04 (5.0e-03 rel) | 3.66e-04 (5.0e-03 rel) | +The earlier 1024-step drift and prefill tables did not have a checked-in runner; +they are withdrawn as acceptance evidence. The existing 128-step synthetic test +only bounds its fixed seed and gate inputs. It does not establish a universal +plateau, prefill/decode equality, or any bound on model logits. -**The gap is ~0.5–1% relative and flat in T** — smaller at T=256 than at T=8 — and the -state dtype barely moves it. +The strict profile uses FP32 recurrent state. BF16 state remains a differential +experiment. Full checkpoint prefill, response replay, optimizer updates and +reload all remain required before L2 can pass. -The reason is that the recurrence is **contracting**: per-step decay `exp(g)` averages -~0.47 (max 0.996), so old rounding error is forgotten at roughly the rate old signal -is. Comparing an fp32 state against a bf16 one over 1024 steps shows the same shape: - -| step | relative \|d\| state | relative \|d\| out | -|---|---|---| -| 1 | 2.67e-03 | 3.47e-03 | -| 64 | 1.52e-02 | 1.07e-02 | -| 256 | 2.02e-02 | 1.09e-02 | -| 1024 | 2.47e-02 | 1.57e-02 | - -A 16× longer run past step 64 grows the drift only 1.6×; it saturates at ~2% relative -on the state and ~1–1.8% on the output. - -So the two paths are not bitwise, and ~1% relative on logits is still material for RL -importance ratios, but this is a bounded, characterizable error rather than a -divergence. An fp32 recurrent state remains the right choice for exactness work — the -reason is the 2% plateau, not a blow-up. - -Two related constraints: the chunked prefill kernel refuses fp32 q/k/v outright -(`chunk.py:213`), so the prefill side is bf16-only regardless; and -`causal_conv1d_update` does not bounds-check `conv_state_indices` under its default -`validate_data=False` — an index past the cache is an out-of-bounds write, not an -error. +Cache indices must be int32/int64, on the input device, and positive active +indices must be unique and in range. Nonpositive sentinels may repeat. The golden +validates before any cache update; raw provider calls remain the caller's +responsibility (the provider's default does not bounds-check). ## 6. Current boundary @@ -133,13 +108,14 @@ Not covered, with reasons: `runtime_verified=false` (no checkpoint), `supports_backward=false`, `checkpoint=absent`. Op-level agreement says nothing about 48 composed layers. -## 7. Questions for the maintainers +## 7. Accepted execution boundaries + +Use a shared, explicitly pinned vLLM-compatible forward provider on both sides, +with independent VIME recomputation. Disable MTP and prefix reuse. Keep FP32 +recurrent state for strict acceptance; BF16 is experimental. Require bitwise +logits/logprobs at a common topology, at least two real optimizer updates, weight +synchronization and checkpoint reload. No operator-level test closes these gates. -1. Is a **bf16 recurrent state** a supported configuration? The answer decides whether - the 2% plateau is a finding or a non-issue. -2. Is MTP / speculative decode in scope for WS1? If so, - `fused_gdn_decode_post_conv_mtp` becomes the primary provider for both the norm and - the recurrence, and the largest deferral above reopens. -3. For the CUDA strict profile, is the single source of truth **vLLM's** arithmetic or - **PyTorch eager**? §1 item 1 asks for one provider on both sides but §2.1 does not - say which, and the two differ by ~6e-2 in bf16. +The 2026-09-30 real-checkpoint startup attempt with vLLM 0.30.0 failed before +inference: `VLLM batch_invariant mode is not supported for GDN_ATTN`. A shared +provider integration must resolve this; disabling the check is not L2 evidence. diff --git a/rl_engine/kernels/ops/pytorch/linear_attn/__init__.py b/rl_engine/kernels/ops/pytorch/linear_attn/__init__.py index 28602f18f..c974a89b1 100644 --- a/rl_engine/kernels/ops/pytorch/linear_attn/__init__.py +++ b/rl_engine/kernels/ops/pytorch/linear_attn/__init__.py @@ -3,13 +3,11 @@ """Linear-attention operators (Gated DeltaNet and friends).""" -from rl_engine.kernels.ops.pytorch.linear_attn.causal_conv1d import ( - CausalConv1dUpdateOp, -) +from rl_engine.kernels.ops.pytorch.linear_attn.causal_conv1d import CausalConv1dUpdateOp from rl_engine.kernels.ops.pytorch.linear_attn.gated_delta_rule import ( - GatedDeltaRuleRecurrentStepOp, NULL_BLOCK_ID, SOFTPLUS_THRESHOLD, + GatedDeltaRuleRecurrentStepOp, ) __all__ = [ diff --git a/rl_engine/kernels/ops/pytorch/linear_attn/causal_conv1d.py b/rl_engine/kernels/ops/pytorch/linear_attn/causal_conv1d.py index ffbac6e13..fb171af49 100644 --- a/rl_engine/kernels/ops/pytorch/linear_attn/causal_conv1d.py +++ b/rl_engine/kernels/ops/pytorch/linear_attn/causal_conv1d.py @@ -6,42 +6,22 @@ The trainer-side reference for ``causal_conv1d_update``, which vLLM calls once per decode token before the Gated DeltaNet recurrence. -Semantics were established by differential testing against the provider rather -than transcribed, and the accumulation order matters: - -* ``x`` is cast to ``conv_state.dtype`` **before** anything else, so a bf16 - conv cache rounds the incoming token (``causal_conv1d.py:1160``). -* The window is ``[state[..., -(width-1):], x]``; the taps are accumulated - **sequentially in tap order**, ``acc = acc + win[t] * w[t]`` starting from - zero -- not a tree reduction and not an FMA. With an fp32 conv state this - reproduces the provider bitwise; a tree sum does not. -* Bias and the activation are applied in fp32, with one cast on the way out to - the input's original dtype. -* The new state is the window minus its oldest column. - -Measured against the provider on B200 (``conv_dim=8192``, ``W=4``, B up to 64): - -* **The rolled state is bitwise exact in every configuration**, fp32 and bf16 - cache alike -- ``max|diff| = 0``. That is the part the next token consumes, - so the recurrence carries no error from here. -* With an **fp32** conv state the output is bitwise on all but a handful of - elements (15 of 524288 at B=64), the residual being fp32 ULP. -* With a **bf16** conv state the output agrees on ~63% of elements, every - disagreement exactly one bf16 ULP. - -The bf16 output gap is a rounding-path difference, not a semantic one: none of -accumulate-in-bf16, bias-in-bf16 or activation-in-bf16 reproduces the provider, -so where it rounds is left unresolved rather than guessed at. An fp32 conv state -is what an exactness claim should use anyway -- the same conclusion the -recurrent state reaches in :mod:`.gated_delta_rule`. +The incoming token is rounded to the cache dtype. Products are rounded in +operand dtype before sequential FP32 accumulation, starting from bias (or zero). +This matters for BF16 caches: promoting operands before multiplication loses the +provider's product rounding. Activation may still differ at transcendental ULP +scale; this reference does not establish model-level bitwise equality. + """ from __future__ import annotations import torch -import torch.nn.functional as F -from rl_engine.kernels.ops.pytorch.linear_attn.gated_delta_rule import NULL_BLOCK_ID +from rl_engine.kernels.ops.pytorch.linear_attn.gated_delta_rule import ( + NULL_BLOCK_ID, + _validate_state_indices, +) __all__ = ["CausalConv1dUpdateOp"] @@ -154,6 +134,21 @@ def _update( # The "SD" layout stores (state_len, dim); the kernels want (dim, state_len). state = conv_state if dim_first else conv_state.transpose(-1, -2) dim, tail = state.shape[-2], state.shape[-1] + if weight.ndim != 2 or dim <= 0 or weight.shape[-1] <= 0: + raise ValueError("weight must be 2-D [dim, W] with positive dimensions") + if x.shape[1] != dim: + raise ValueError("x and conv_state must have the same dim") + _validate_state_indices(conv_state_indices, x.shape[0], state.shape[0], x.device) + for name, tensor in ( + ("x", x), + ("conv_state", conv_state), + ("weight", weight), + ("bias", bias), + ): + if tensor is not None and (tensor.device != x.device or not tensor.is_floating_point()): + raise ValueError(f"{name} must be floating point on the input device") + if bias is not None and bias.shape != (dim,): + raise ValueError("bias must have shape [dim]") width = weight.shape[-1] if weight.shape[0] != dim: raise ValueError(f"weight must be [dim, W] with dim={dim}, got {tuple(weight.shape)}") @@ -173,16 +168,15 @@ def _update( token = x[rows].to(conv_state.dtype) window = torch.cat([state[blocks], token.unsqueeze(-1)], dim=-1) # [R, dim, W] - # Sequential tap accumulation from zero, in fp32. A tree sum over the - # same four terms gives a different last bit and does NOT match. + # Match the provider's product rounding and bias-before-taps order. acc = torch.zeros(len(rows), dim, dtype=torch.float32, device=x.device) - w32 = weight.float() - for tap in range(width): - acc = acc + window[..., tap].float() * w32[:, tap].unsqueeze(0) if bias is not None: acc = acc + bias.float() + for tap in range(width): + product = window[..., tap] * weight[:, tap].unsqueeze(0) + acc = acc + product.float() if activation in ("silu", "swish"): - acc = F.silu(acc) + acc = acc / (1.0 + torch.exp(-acc)) out[rows] = acc rolled = window[..., 1:] diff --git a/rl_engine/kernels/ops/pytorch/linear_attn/gated_delta_rule.py b/rl_engine/kernels/ops/pytorch/linear_attn/gated_delta_rule.py index cdf6f17b7..bfab76047 100644 --- a/rl_engine/kernels/ops/pytorch/linear_attn/gated_delta_rule.py +++ b/rl_engine/kernels/ops/pytorch/linear_attn/gated_delta_rule.py @@ -55,6 +55,21 @@ _REDUCTION_CHUNK = 32 +def _validate_state_indices(indices, batch, blocks, device): + """Each active row owns one cache block; inactive sentinels may repeat.""" + if indices.ndim != 1 or indices.shape[0] != batch: + raise ValueError("state indices must be 1-D with one entry per sequence") + if indices.dtype not in (torch.int32, torch.int64): + raise ValueError("state indices must have int32 or int64 dtype") + if indices.device != device: + raise ValueError("state indices must be on the input device") + active = indices[indices > NULL_BLOCK_ID] + if bool((active >= blocks).any()): + raise ValueError("active state index is out of range") + if active.unique().numel() != active.numel(): + raise ValueError("active state indices must be unique") + + def _chunked_sum(x: torch.Tensor) -> torch.Tensor: """Sum the last dim in a fixed 32-wide chunk order. @@ -67,7 +82,9 @@ def _chunked_sum(x: torch.Tensor) -> torch.Tensor: tail = x.shape[-1] if tail % _REDUCTION_CHUNK != 0: return x.sum(dim=-1) - return x.reshape(*x.shape[:-1], -1, _REDUCTION_CHUNK).sum(dim=-1).sum(dim=-1) + return ( + x.reshape(*x.shape[:-1], tail // _REDUCTION_CHUNK, _REDUCTION_CHUNK).sum(dim=-1).sum(dim=-1) + ) def _fixed_order_contract(mat: torch.Tensor, vec: torch.Tensor) -> torch.Tensor: @@ -220,15 +237,33 @@ def _step( if mixed_qkv.dim() != 2: raise ValueError(f"mixed_qkv must be 2-D [B, D], got {tuple(mixed_qkv.shape)}") if state.dim() != 4: - raise ValueError( - f"state must be 4-D [num_blocks, HV, V, K], got {tuple(state.shape)}" - ) + raise ValueError(f"state must be 4-D [num_blocks, HV, V, K], got {tuple(state.shape)}") if ssm_state_indices.dim() != 1: raise ValueError("ssm_state_indices must be 1-D [B] for packed decode") batch = mixed_qkv.shape[0] hv, v_dim, k_dim = state.shape[-3:] - heads = int(num_k_heads) + if isinstance(num_k_heads, bool) or not isinstance(num_k_heads, int) or num_k_heads <= 0: + raise ValueError("num_k_heads must be a positive integer") + if min(hv, v_dim, k_dim) <= 0: + raise ValueError("state head dimensions must be positive") + heads = num_k_heads + _validate_state_indices(ssm_state_indices, batch, state.shape[0], mixed_qkv.device) + for name, tensor in ( + ("a", a), + ("b", b), + ("A_log", A_log), + ("dt_bias", dt_bias), + ("state", state), + ): + if tensor.device != mixed_qkv.device: + raise ValueError(f"{name} must be on the input device") + if not tensor.is_floating_point(): + raise ValueError(f"{name} must be floating point") + if not mixed_qkv.is_floating_point(): + raise ValueError("mixed_qkv must be floating point") + if A_log.shape != (hv,) or dt_bias.shape != (hv,): + raise ValueError("A_log and dt_bias must have shape [HV]") if hv % heads != 0: raise ValueError(f"HV={hv} must be a multiple of num_k_heads={heads}") if a.shape != (batch, hv) or b.shape != (batch, hv): diff --git a/tests/check_gdn_recurrent_golden.py b/tests/check_gdn_recurrent_golden.py index e9e18487c..7c7e929ac 100644 --- a/tests/check_gdn_recurrent_golden.py +++ b/tests/check_gdn_recurrent_golden.py @@ -22,49 +22,11 @@ its contractions run in a fixed 32-wide chunk order rather than the kernel's tree. -Recurrent-state dtype, and how far a decode run actually drifts ----------------------------------------------------------------- -``FUSED_GDN_STATE_DTYPES`` allows the recurrent state to be fp32 or bf16, and a -bf16 store rounds the ``[HV, V, K]`` state once per token. The drift that causes -does **not** compound without bound, because the recurrence is contracting: the -per-step decay ``exp(g)`` averages ~0.47 here (max 0.996), so old error is -forgotten at roughly the rate old signal is. - -fp32 state vs bf16 state, identical inputs, B=8, B200: - -====== ================= =============== -step relative |d| state relative |d| out -====== ================= =============== -1 2.67e-03 3.47e-03 -64 1.52e-02 1.07e-02 -256 2.02e-02 1.09e-02 -1024 2.47e-02 1.57e-02 -====== ================= =============== - -The curve saturates: a 16x longer run past step 64 grows the state drift only -1.6x. The plateau is ~2% relative on the state and ~1-1.8% on the output. - -Chunked prefill vs step-by-step decode replay, single sequence, from a zero -state -- this is the quantity RFC #428 section 4.2 is about: - -====== ================== ================== -T max|diff|, fp32 max|diff|, bf16 -====== ================== ================== -8 3.66e-04 (7.0e-03) 5.49e-04 (1.0e-02) -64 4.88e-04 (6.6e-03) 5.49e-04 (7.5e-03) -256 3.66e-04 (5.0e-03) 3.66e-04 (5.0e-03) -====== ================== ================== - -(relative in parentheses). The gap is ~0.5-1% relative and **flat in T** -- at -T=256 it is smaller than at T=8 -- and the state dtype barely moves it. - -So the two paths are not bitwise, and ~1% relative on logits is still material -for RL importance ratios, but this is a bounded, characterizable error rather -than a divergence. An fp32 recurrent state is still the right choice for -exactness work; the reason is the 2% state plateau, not a blow-up. - -Note the chunked prefill kernel refuses fp32 q/k/v outright -(``chunk.py:213``), so the prefill side is bf16-only regardless. +The fixed-seed 128-step rounding test below is a bounded synthetic regression, +not evidence of a universal drift plateau or model-logit agreement. Earlier +1024-step and prefill tables had no reproducible runner and are withdrawn until +those experiments are checked in. Operator outputs are not model logits. + """ from __future__ import annotations @@ -74,9 +36,7 @@ pytestmark = pytest.mark.skipif(not torch.cuda.is_available(), reason="CUDA is required") -from rl_engine.kernels.ops.pytorch.linear_attn import ( # noqa: E402 - GatedDeltaRuleRecurrentStepOp, -) +from rl_engine.kernels.ops.pytorch.linear_attn import GatedDeltaRuleRecurrentStepOp # noqa: E402 # Qwen3-Next-80B-A3B-Instruct: linear_num_key_heads / linear_num_value_heads / # linear_key_head_dim / linear_value_head_dim. @@ -116,9 +76,7 @@ def _run_provider(inp, io_dtype=torch.bfloat16): """Returns (out, mutated_state). The kernel updates the state in place.""" step = _vllm_step() state = inp["state"].clone() - out = torch.empty( - inp["mixed_qkv"].shape[0], 1, _HV, _V, device="cuda", dtype=io_dtype - ) + out = torch.empty(inp["mixed_qkv"].shape[0], 1, _HV, _V, device="cuda", dtype=io_dtype) step( inp["mixed_qkv"], inp["a"], @@ -220,16 +178,8 @@ def test_golden_is_batch_invariant(state_dtype): # --------------------------------------------------------------------------- # # 3. The state-dtype rounding is modelled, not skipped # --------------------------------------------------------------------------- # -def test_bf16_state_rounding_is_visible_but_saturates(): - """A bf16 state rounds from the first store, and the drift then flattens. - - The recurrence is contracting -- ``exp(g)`` is well below 1 for most heads -- - so old rounding error is forgotten at roughly the rate old signal is. The - drift therefore grows quickly at first and then plateaus, rather than - compounding without bound. Asserting a bound is the honest form: asserting - monotone growth would have been true over a truncated run and false over a - long one. - """ +def test_bf16_state_rounding_stays_within_fixed_fixture_bound(): + """Bound this fixed 128-step fixture; no general contraction claim.""" batch, steps = 8, 128 inp = _inputs(batch, batch + 2, torch.float32, torch.bfloat16, seed=11) op = GatedDeltaRuleRecurrentStepOp() @@ -243,9 +193,7 @@ def test_bf16_state_rounding_is_visible_but_saturates(): drift = [] for step in range(steps): g = torch.Generator(device="cuda").manual_seed(100 + step) - token = torch.randn( - batch, _PACKED_DIM, device="cuda", dtype=torch.bfloat16, generator=g - ) + token = torch.randn(batch, _PACKED_DIM, device="cuda", dtype=torch.bfloat16, generator=g) common = (inp["a"], inp["b"], inp["A_log"], inp["dt_bias"]) _, state_fp32 = op.forward( token, *common, state_fp32, inp["indices"], scale=_SCALE, num_k_heads=_H @@ -257,8 +205,7 @@ def test_bf16_state_rounding_is_visible_but_saturates(): drift.append((state_fp32.float() - state_bf16.float()).abs().max().item() / scale) assert drift[0] > 0.0, "a bf16 state must round on the very first store" - # Measured plateau is ~2% relative; the bound leaves room without hiding a - # genuine divergence. + # Preserve the original regression bound for this fixed fixture. assert max(drift) < 0.05, f"relative state drift reached {max(drift):.3e}" # The back half must not be materially worse than the front half. assert max(drift[steps // 2 :]) < 2.0 * max(drift[: steps // 2]) + 1e-3 @@ -343,23 +290,18 @@ def test_conv_output_matches_provider_with_fp32_cache(batch): """ inp = _conv_inputs(batch, torch.float32, seed=batch) (out_ref, _), (out_got, _) = _run_conv_pair(inp) - mismatch = int( - (out_got.float().view(torch.int32) != out_ref.float().view(torch.int32)).sum() - ) + mismatch = int((out_got.float().view(torch.int32) != out_ref.float().view(torch.int32)).sum()) assert mismatch <= 32, f"{mismatch} of {out_got.numel()} elements differ" assert (out_got.float() - out_ref.float()).abs().max().item() <= 1e-2 @pytest.mark.parametrize("batch", [1, 17]) -def test_conv_output_bf16_cache_differs_only_by_one_ulp(batch): - """A bf16 cache disagrees often but never by more than a bf16 ULP. - - Bounded rather than asserted equal: where the provider rounds in this - configuration is not reproduced, and pretending otherwise would hide it. - """ +def test_conv_output_bf16_cache_matches_rounded_product_path(batch): + """Product rounding is reproduced; activation ULP residuals remain allowed.""" inp = _conv_inputs(batch, torch.bfloat16, seed=batch) (out_ref, _), (out_got, _) = _run_conv_pair(inp) assert (out_got.float() - out_ref.float()).abs().max().item() <= 7e-2 + assert int((out_got != out_ref).sum()) <= 32 def test_conv_null_block_id_is_skipped(): @@ -499,3 +441,16 @@ def test_conv_forward_fp32_and_call_entry_points(): assert torch.equal(out, called) assert fp32.dtype is torch.float32 torch.testing.assert_close(fp32, out.float(), atol=1e-2, rtol=1e-2) + + +def test_conv_provider_preserves_bf16_product_cancellation(): + inp = _conv_inputs(1, torch.bfloat16, seed=1, with_bias=False) + inp["state"].zero_() + inp["state"][1, :, -1] = 1.0078125 + inp["weight"].zero_() + inp["weight"][:, -2] = 1.0078125 + inp["weight"][:, -1] = 1.0 + inp["x"].fill_(-1.015625) + (provider, _), (golden, _) = _run_conv_pair(inp, activation=None) + assert torch.count_nonzero(provider) == 0 + assert torch.equal(provider, golden) diff --git a/tests/test_gdn_state_contract.py b/tests/test_gdn_state_contract.py new file mode 100644 index 000000000..9e84ba288 --- /dev/null +++ b/tests/test_gdn_state_contract.py @@ -0,0 +1,98 @@ +"""Provider-independent cache contracts, collected in the ordinary CPU suite.""" + +import pytest +import torch + +from rl_engine.kernels.ops.pytorch.linear_attn import ( + CausalConv1dUpdateOp, + GatedDeltaRuleRecurrentStepOp, +) + + +def _call(kind, indices, heads=1): + batch = indices.numel() + if kind == "conv": + state = torch.randn(4, 2, 3) + before = state.clone() + result = CausalConv1dUpdateOp()(torch.randn(batch, 2), state, torch.randn(2, 4), indices) + else: + state = torch.randn(4, 2, 2, 32) + before = state.clone() + result = GatedDeltaRuleRecurrentStepOp()( + torch.randn(batch, 68), + torch.randn(batch, 2), + torch.randn(batch, 2), + torch.zeros(2), + torch.zeros(2), + state, + indices, + scale=32**-0.5, + num_k_heads=heads, + ) + assert torch.equal(state, before) + return result, before + + +@pytest.mark.parametrize("kind", ["conv", "gdn"]) +@pytest.mark.parametrize( + "indices,message", + [ + (torch.tensor([1.5, 2.0]), "int32 or int64"), + (torch.tensor([True, False]), "int32 or int64"), + (torch.tensor([1, 1]), "unique"), + (torch.tensor([1, 4]), "out of range"), + ], +) +def test_invalid_cache_indices_are_rejected(kind, indices, message): + with pytest.raises(ValueError, match=message): + _call(kind, indices) + + +@pytest.mark.parametrize("kind", ["conv", "gdn"]) +@pytest.mark.parametrize("indices", [torch.tensor([0, -1, 0]), torch.empty(0, dtype=torch.int64)]) +def test_inactive_and_empty_batches_preserve_cache(kind, indices): + (out, state), before = _call(kind, indices) + assert torch.equal(state, before) + assert torch.count_nonzero(out) == 0 + + +@pytest.mark.parametrize("heads", [0, -1, 1.5, True]) +def test_gdn_requires_positive_integer_heads(heads): + with pytest.raises(ValueError, match="positive integer"): + _call("gdn", torch.tensor([1, 2]), heads=heads) + + +def test_conv_bias_is_accumulated_before_taps(): + # Adding bias last would yield 1.0 instead of 0.0. + out, _ = CausalConv1dUpdateOp()( + torch.tensor([[-1e8]]), + torch.zeros(2, 1, 1), + torch.tensor([[0.0, 1.0]]), + torch.tensor([1]), + bias=torch.tensor([1e8]), + activation=None, + ) + assert out.item() == 0.0 + out, _ = CausalConv1dUpdateOp()( + torch.tensor([[-1e8]]), + torch.ones(2, 1, 1), + torch.ones(1, 2), + torch.tensor([1]), + bias=torch.tensor([1e8]), + activation=None, + ) + assert out.item() == 0.0 + + +def test_conv_bf16_products_round_before_fp32_accumulation(): + state = torch.zeros(2, 1, 1, dtype=torch.bfloat16) + state[1, 0, 0] = 1.0078125 + out, _ = CausalConv1dUpdateOp().forward_fp32( + torch.tensor([[-1.015625]], dtype=torch.bfloat16), + state, + torch.tensor([[1.0078125, 1.0]], dtype=torch.bfloat16), + torch.tensor([1]), + activation=None, + ) + # The first exact product is 1.015686..., rounded to 1.015625 in BF16. + assert out.item() == 0.0 From dcb926310546af8f25b558e69014e052406b2c1b Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Wed, 30 Sep 2026 18:35:04 +0000 Subject: [PATCH 19/70] fix(gdn): avoid overflow in inactive softplus gradient branch Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- .../kernels/ops/pytorch/linear_attn/gated_delta_rule.py | 4 +++- tests/test_gdn_state_contract.py | 8 ++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/rl_engine/kernels/ops/pytorch/linear_attn/gated_delta_rule.py b/rl_engine/kernels/ops/pytorch/linear_attn/gated_delta_rule.py index bfab76047..e2af3a0c3 100644 --- a/rl_engine/kernels/ops/pytorch/linear_attn/gated_delta_rule.py +++ b/rl_engine/kernels/ops/pytorch/linear_attn/gated_delta_rule.py @@ -104,7 +104,9 @@ def _l2_normalize(x: torch.Tensor, eps: float = 1e-6) -> torch.Tensor: def _softplus(x: torch.Tensor, threshold: float = SOFTPLUS_THRESHOLD) -> torch.Tensor: """The kernel's branched softplus; the branch matters for large ``a + dt_bias``.""" - return torch.where(x <= threshold, torch.log1p(torch.exp(x)), x) + small = x <= threshold + safe = torch.where(small, x, torch.zeros_like(x)) + return torch.where(small, torch.log1p(torch.exp(safe)), x) class GatedDeltaRuleRecurrentStepOp: diff --git a/tests/test_gdn_state_contract.py b/tests/test_gdn_state_contract.py index 9e84ba288..70255bb0d 100644 --- a/tests/test_gdn_state_contract.py +++ b/tests/test_gdn_state_contract.py @@ -96,3 +96,11 @@ def test_conv_bf16_products_round_before_fp32_accumulation(): ) # The first exact product is 1.015686..., rounded to 1.015625 in BF16. assert out.item() == 0.0 + + +def test_softplus_large_branch_has_finite_gradient(): + from rl_engine.kernels.ops.pytorch.linear_attn.gated_delta_rule import _softplus + + x = torch.tensor([100.0, 21.0, 0.0], requires_grad=True) + _softplus(x).sum().backward() + assert torch.equal(x.grad, torch.tensor([1.0, 1.0, 0.5])) From 16204ab1de6d3f22d5a568c56dd8866c2278e44f Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Wed, 30 Sep 2026 18:42:32 +0000 Subject: [PATCH 20/70] ci(qwen3-next): separate audited provider runtime from legacy CUDA gate Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- .github/workflows/qwen3-next-provider-gpu.yml | 42 +++++++++++++++++++ ci/run_ws1_gtest.sh | 4 -- 2 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/qwen3-next-provider-gpu.yml diff --git a/.github/workflows/qwen3-next-provider-gpu.yml b/.github/workflows/qwen3-next-provider-gpu.yml new file mode 100644 index 000000000..ee1851881 --- /dev/null +++ b/.github/workflows/qwen3-next-provider-gpu.yml @@ -0,0 +1,42 @@ +name: Qwen3-Next-provider-GPU + +on: + pull_request: + branches: [main] + paths: + - "rl_engine/kernels/ops/**" + - "rl_engine/integrations/qwen3_next_gdn.py" + - "rl_engine/testing/qwen3_next*" + - "tests/check_*qwen3_next*.py" + - "tests/check_gdn_recurrent_golden.py" + - "ci/run_qwen3_next_operator_gates.sh" + - ".github/workflows/qwen3-next-provider-gpu.yml" + workflow_dispatch: + +permissions: + contents: read + +jobs: + provider: + # This label must identify a maintained CUDA 13 / vLLM 0.30.0 environment. + # Never run untrusted fork PR code on the self-hosted runner. + if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository + runs-on: [self-hosted, linux, x64, rl-kernel-qwen3-next] + timeout-minutes: 30 + steps: + - uses: actions/checkout@v4 + with: + persist-credentials: false + - name: Require the audited runtime + run: | + python3 - <<'PY' + import torch, vllm + assert torch.__version__ == "2.13.0+cu130" + assert vllm.__version__ == "0.30.0" + assert torch.cuda.is_available() + PY + - name: Build the extension against that runtime + run: python3 setup.py build_ext --inplace + - name: Check pinned providers in their own process + run: | + python3 -m pytest -q tests/check_qwen3_next_norm_providers.py tests/check_gdn_recurrent_golden.py diff --git a/ci/run_ws1_gtest.sh b/ci/run_ws1_gtest.sh index c9daa1118..03b77173d 100755 --- a/ci/run_ws1_gtest.sh +++ b/ci/run_ws1_gtest.sh @@ -85,7 +85,3 @@ for op in qwen3_next_rms_norm rms_norm_gated; do --hidden 2048 --head-dim 128 done done -# Provider imports run in a separate process from framework-isolation tests. -echo "[ws1-gtest] Qwen3-Next provider comparisons (required)" -"$PY" -c 'import torch, vllm; assert torch.cuda.is_available(), "CUDA is required"' -"$PY" -m pytest -q tests/check_qwen3_next_norm_providers.py tests/check_gdn_recurrent_golden.py From 697bea887281354d13f7f81af5ed3417e8b1e994 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Thu, 1 Oct 2026 18:26:46 +0000 Subject: [PATCH 21/70] test(gdn): assert the packed-decode provider leaves the null block untouched test_null_block_id_is_skipped_by_both checked that both sides write zeros for a NULL_BLOCK_ID row, but asserted "block untouched" only for the golden. The provider returns before any store for state_idx <= 0 (fused_recurrent.py:299-303 in vllm 0.30.0); assert it on the provider's state as well so the test name matches what it checks. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- tests/check_gdn_recurrent_golden.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/check_gdn_recurrent_golden.py b/tests/check_gdn_recurrent_golden.py index 7c7e929ac..aefecaddf 100644 --- a/tests/check_gdn_recurrent_golden.py +++ b/tests/check_gdn_recurrent_golden.py @@ -141,6 +141,7 @@ def test_null_block_id_is_skipped_by_both(): assert bool((out_ref[row] == 0).all()), f"provider row {row}" assert bool((out_got[row] == 0).all()), f"golden row {row}" assert torch.equal(state_got[0], inp["state"][0]), "block 0 must be untouched" + assert torch.equal(state_ref[0], inp["state"][0]), "provider must leave block 0 untouched" # --------------------------------------------------------------------------- # From 12a22256e69496a9600577bb267be2d97e0e1046 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Thu, 1 Oct 2026 18:27:08 +0000 Subject: [PATCH 22/70] ci(qwen3-next): drop stale and forward-referencing workflow paths ws1-gtest-gpu.yml: 158fc75 added four Qwen3-Next/GDN test files to the pull_request and push path filters together with a step in ci/run_ws1_gtest.sh that ran the two check_ files. 03176a3 moved that step to qwen3-next-provider-gpu.yml but left the filters, so editing those files triggered a RunPod job that never executed them. Remove the filters; the file is back to its state on feat/cuda-qwen3-next-gated-rmsnorm. qwen3-next-provider-gpu.yml: drop rl_engine/integrations/qwen3_next_gdn.py and ci/run_qwen3_next_operator_gates.sh from the path filter. Neither file exists on this branch. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- .github/workflows/qwen3-next-provider-gpu.yml | 2 -- .github/workflows/ws1-gtest-gpu.yml | 8 -------- 2 files changed, 10 deletions(-) diff --git a/.github/workflows/qwen3-next-provider-gpu.yml b/.github/workflows/qwen3-next-provider-gpu.yml index ee1851881..b53c73441 100644 --- a/.github/workflows/qwen3-next-provider-gpu.yml +++ b/.github/workflows/qwen3-next-provider-gpu.yml @@ -5,11 +5,9 @@ on: branches: [main] paths: - "rl_engine/kernels/ops/**" - - "rl_engine/integrations/qwen3_next_gdn.py" - "rl_engine/testing/qwen3_next*" - "tests/check_*qwen3_next*.py" - "tests/check_gdn_recurrent_golden.py" - - "ci/run_qwen3_next_operator_gates.sh" - ".github/workflows/qwen3-next-provider-gpu.yml" workflow_dispatch: diff --git a/.github/workflows/ws1-gtest-gpu.yml b/.github/workflows/ws1-gtest-gpu.yml index d8f32b714..646d80bdf 100644 --- a/.github/workflows/ws1-gtest-gpu.yml +++ b/.github/workflows/ws1-gtest-gpu.yml @@ -20,10 +20,6 @@ on: - "scripts/check_gradient_invariance.py" - "scripts/ws1_candidate_evidence.py" - "tests/test_ws1_*.py" - - "tests/test_gdn_state_contract.py" - - "tests/test_qwen3_next_norm.py" - - "tests/check_qwen3_next_norm_providers.py" - - "tests/check_gdn_recurrent_golden.py" - "tests/test_forward_invariance.py" - "tests/test_gradient_invariance.py" - "tests/test_four_judgment_matrix.py" @@ -42,10 +38,6 @@ on: - "scripts/check_gradient_invariance.py" - "scripts/ws1_candidate_evidence.py" - "tests/test_ws1_*.py" - - "tests/test_gdn_state_contract.py" - - "tests/test_qwen3_next_norm.py" - - "tests/check_qwen3_next_norm_providers.py" - - "tests/check_gdn_recurrent_golden.py" - "tests/test_forward_invariance.py" - "tests/test_gradient_invariance.py" - "tests/test_four_judgment_matrix.py" From b54ac72644cdb75680c94a04d07a4cc19780d031 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Thu, 1 Oct 2026 18:29:46 +0000 Subject: [PATCH 23/70] feat(gdn): add a runner for the C6 provider-agreement measurements The design note quoted provider-vs-golden figures (max|d out|, max|d state|, conv mismatch counts) that no committed code printed, so they could not be reproduced. scripts/ws1_gdn_provider_agreement.py prints them as JSON, using tests/check_gdn_recurrent_golden.py's own input helpers and seeds (imported, not copied): - recurrent: per (batch, state dtype), max|d out|, max|d state| and bitwise mismatch counts, next to the bounds the check file asserts; - conv: per (batch, cache dtype), output mismatch count, max|diff| and whether the rolled state is bitwise equal; - the conv comparison again with triton.knobs.language.default_fp_fusion off, plus the fma.rn.f32 count in each compiled variant of the provider's conv-update kernel, to test whether the fp32-cache mismatches are FMA contraction. Provenance (git commit and dirty flag, torch/triton/vllm versions, device) is recorded with the results. Requires CUDA and vLLM; not run in CI. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- scripts/ws1_gdn_provider_agreement.py | 238 ++++++++++++++++++++++++++ 1 file changed, 238 insertions(+) create mode 100644 scripts/ws1_gdn_provider_agreement.py diff --git a/scripts/ws1_gdn_provider_agreement.py b/scripts/ws1_gdn_provider_agreement.py new file mode 100644 index 000000000..a3a433575 --- /dev/null +++ b/scripts/ws1_gdn_provider_agreement.py @@ -0,0 +1,238 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Measure how closely the GDN decode-step goldens track vLLM's providers (RFC #428 C6). + +``tests/check_gdn_recurrent_golden.py`` asserts loose bounds; this runner prints the +measured values behind them, so the numbers quoted in +``docs/design/ws1-c6-428-gdn-recurrent-replay.md`` can be reproduced. Inputs and seeds +are the check file's own helpers, imported from it rather than copied. + +Three measurements, emitted as one JSON document on stdout: + +* ``recurrent``: provider vs golden for the packed recurrent decode, per + (batch, state dtype): max|d out|, max|d state| and bitwise mismatch counts. +* ``conv``: provider vs golden for ``causal_conv1d_update``, per (batch, cache dtype): + output mismatch count and max|diff|, and whether the rolled state is bitwise equal. +* ``conv`` again with Triton FP fusion disabled + (``triton.knobs.language.default_fp_fusion = False``), plus ``conv_ptx``: the number + of ``fma.rn.f32`` instructions in each compiled variant of the provider's conv + kernel. If the fp32-cache mismatches are FMA contraction, they should vanish with + fusion off and the fusion-off PTX should contain no ``fma.rn.f32``. + +Requires CUDA and vLLM 0.30.0. Run it from a clean checkout so ``git_dirty`` is false: + + python scripts/ws1_gdn_provider_agreement.py > gdn_provider_agreement.json +""" + +from __future__ import annotations + +import argparse +import contextlib +import importlib.util +import json +import platform +import subprocess +import sys +from pathlib import Path +from typing import Any + +import torch + +REPO_ROOT = Path(__file__).resolve().parents[1] +if str(REPO_ROOT) not in sys.path: + sys.path.insert(0, str(REPO_ROOT)) + +_CHECK_FILE = REPO_ROOT / "tests" / "check_gdn_recurrent_golden.py" +_STATE_DTYPES = {"fp32": torch.float32, "bf16": torch.bfloat16} +_INT_VIEW = {2: torch.int16, 4: torch.int32} + + +def _load_check_module(): + """Import the check file by path; ``tests/`` is not a package.""" + spec = importlib.util.spec_from_file_location("check_gdn_recurrent_golden", _CHECK_FILE) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + +def _bit_mismatches(a: torch.Tensor, b: torch.Tensor) -> int: + """Elements whose bit patterns differ (NaN-safe, unlike ``a != b``).""" + assert a.dtype == b.dtype and a.shape == b.shape, (a.dtype, b.dtype, a.shape, b.shape) + view = _INT_VIEW[a.element_size()] + return int((a.contiguous().view(view) != b.contiguous().view(view)).sum()) + + +def _max_abs_diff(a: torch.Tensor, b: torch.Tensor) -> float: + return (a.float() - b.float()).abs().max().item() + + +def _git(*args: str) -> str: + try: + return subprocess.run( + ["git", *args], cwd=REPO_ROOT, capture_output=True, text=True, check=True + ).stdout.strip() + except (OSError, subprocess.CalledProcessError) as exc: + return f"unavailable: {exc}" + + +def _provenance() -> dict[str, Any]: + import triton + import vllm + + return { + "git_commit": _git("rev-parse", "HEAD"), + "git_dirty": bool(_git("status", "--porcelain")), + "python": platform.python_version(), + "torch": torch.__version__, + "triton": triton.__version__, + "vllm": vllm.__version__, + "device": torch.cuda.get_device_name(), + "capability": list(torch.cuda.get_device_capability()), + "default_fp_fusion": bool(triton.knobs.language.default_fp_fusion), + } + + +@contextlib.contextmanager +def _fp_fusion(enabled: bool): + """Set Triton's default FP fusion for kernels compiled inside the block. + + ``enable_fp_fusion`` is part of the options string in Triton's kernel cache key, + so flipping it compiles a fresh variant rather than reusing the fused one. + """ + import triton + + knobs = triton.knobs.language + previous = knobs.default_fp_fusion + knobs.default_fp_fusion = enabled + try: + yield + finally: + knobs.default_fp_fusion = previous + + +def _measure_recurrent(check, batches: list[int]) -> list[dict[str, Any]]: + bounds = {"fp32": (1e-3, 1e-5), "bf16": (1e-3, 5e-3)} # check file :117, :120 + rows = [] + for batch in batches: + for name, state_dtype in _STATE_DTYPES.items(): + # Same call as test_golden_matches_packed_decode_provider. + inp = check._inputs(batch, batch + 2, state_dtype, torch.bfloat16, seed=batch) + out_ref, state_ref = check._run_provider(inp) + out_got, state_got = check._run_golden(inp) + rows.append( + { + "batch": batch, + "state_dtype": name, + "max_abs_diff_out": _max_abs_diff(out_got, out_ref), + "max_abs_diff_state": _max_abs_diff(state_got, state_ref), + "out_mismatch_elements": _bit_mismatches(out_got, out_ref), + "out_elements": out_ref.numel(), + "state_mismatch_elements": _bit_mismatches(state_got, state_ref), + "state_elements": state_ref.numel(), + "asserted_out_atol": bounds[name][0], + "asserted_state_atol": bounds[name][1], + } + ) + return rows + + +def _measure_conv(check, batches: list[int], fp_fusion: bool) -> list[dict[str, Any]]: + rows = [] + with _fp_fusion(fp_fusion): + for batch in batches: + for name, cache_dtype in _STATE_DTYPES.items(): + # Same call as the test_conv_* provider comparisons. + inp = check._conv_inputs(batch, cache_dtype, seed=batch) + (out_ref, state_ref), (out_got, state_got) = check._run_conv_pair(inp) + rows.append( + { + "batch": batch, + "cache_dtype": name, + "fp_fusion": fp_fusion, + "out_mismatch_elements": _bit_mismatches(out_got, out_ref), + "out_elements": out_ref.numel(), + "max_abs_diff_out": _max_abs_diff(out_got, out_ref), + "state_bitwise_equal": torch.equal(state_got, state_ref), + } + ) + return rows + + +def _conv_ptx_fma_counts() -> list[dict[str, Any]] | dict[str, str]: + """``fma.rn.f32`` count per compiled variant of the provider's conv-update kernel.""" + try: + from vllm.model_executor.layers.mamba.ops import causal_conv1d as conv_module + + kernel = conv_module._causal_conv1d_update_kernel + while not hasattr(kernel, "device_caches") and hasattr(kernel, "fn"): + kernel = kernel.fn + variants = [] + for device, cache in kernel.device_caches.items(): + for compiled in cache[0].values(): + ptx = compiled.asm["ptx"] + variants.append( + { + "device": str(device), + "enable_fp_fusion": getattr(compiled.metadata, "enable_fp_fusion", None), + "fma_rn_f32": ptx.count("fma.rn.f32"), + "mul_rn_f32": ptx.count("mul.rn.f32"), + "add_rn_f32": ptx.count("add.rn.f32"), + } + ) + return variants + except Exception as exc: # introspection of Triton internals; report, do not fail + return {"unavailable": f"{type(exc).__name__}: {exc}"} + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser(description=__doc__.splitlines()[0]) + parser.add_argument( + "--batches", + default="1,4,17,64", + help="comma-separated batch sizes (default: the check file's 1,4,17,64)", + ) + parser.add_argument( + "--skip-fusion-off", + action="store_true", + help="do not rerun the conv comparison with Triton FP fusion disabled", + ) + return parser.parse_args() + + +def main() -> int: + args = parse_args() + if not torch.cuda.is_available(): + print("CUDA is required", file=sys.stderr) + return 2 + try: + import vllm # noqa: F401 + except ImportError: + print("vLLM is required", file=sys.stderr) + return 2 + + batches = [int(b) for b in args.batches.split(",") if b.strip()] + check = _load_check_module() + report: dict[str, Any] = { + "runner": "scripts/ws1_gdn_provider_agreement.py", + "provenance": _provenance(), + "inputs": { + "source": "tests/check_gdn_recurrent_golden.py (_inputs, _conv_inputs)", + "seed": "seed=batch for every case", + "batches": batches, + "recurrent": "bf16 I/O, use_qk_l2norm_in_kernel=True, num_blocks=batch+2", + "conv": "bias=True, activation=silu, dim_first=True, W=4, dim=8192", + }, + "recurrent": _measure_recurrent(check, batches), + "conv": _measure_conv(check, batches, fp_fusion=True), + } + if not args.skip_fusion_off: + report["conv"] += _measure_conv(check, batches, fp_fusion=False) + report["conv_ptx"] = _conv_ptx_fma_counts() + print(json.dumps(report, indent=2, sort_keys=True)) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) From 7b30633a80b9192538176f8aa9798e7748c1ca9d Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Thu, 1 Oct 2026 19:01:57 +0000 Subject: [PATCH 24/70] docs(gdn): correct the C6 design note against vLLM 0.30.0 source MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Review after 03176a3 found nine statements in the note that the source does not support. Fix them: - §1: the decode path is chosen per engine step and by the model, not by env defaults alone. Tabulate decode-only / mixed / draft-token steps with their conv and recurrent kernels. Qwen3-Next's gqa_interleaved_layout=True makes the fused CUDA decode unsupported, so the layer falls back to triton and fused_gdn_decode_post_conv_mtp is unreachable (:1834). The env-default assertion guards the packed-decode default but not VLLM_GDN_DECODE_KERNEL. - §2: the golden follows the kernel's arithmetic but is not a transcription everywhere: softplus uses log1p where the kernel uses log(1 + exp), and FLA_USE_FAST_OPS swaps in fast exp/log. - §3: split NULL_BLOCK_ID semantics. The recurrent provider skips <= 0 and writes zeros; the conv provider skips only == null_block_id (0) and does not write the output row; both goldens skip <= 0 and write zeros. - §4: replace the "measured" table, which had no runner, with the bounds the check file asserts and point to scripts/ws1_gdn_provider_agreement.py. State the fp32-cache conv mismatch and the FMA hypothesis the runner tests. - §5: add the mixed decode-and-prefill caveat on the provider side, including vllm-project/vllm#49827, and state that validate_data=True does not check index values either. - §6: restate the MTP deferral against RFC #428 §2.2 and the actual Qwen3-Next MTP path. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- .../design/ws1-c6-428-gdn-recurrent-replay.md | 179 ++++++++++++++---- 1 file changed, 137 insertions(+), 42 deletions(-) diff --git a/docs/design/ws1-c6-428-gdn-recurrent-replay.md b/docs/design/ws1-c6-428-gdn-recurrent-replay.md index 2aa1ddf23..7832bbb1b 100644 --- a/docs/design/ws1-c6-428-gdn-recurrent-replay.md +++ b/docs/design/ws1-c6-428-gdn-recurrent-replay.md @@ -2,34 +2,65 @@ Design notes for RFC #428 work item C6 (GDN recurrent response replay) on the CUDA track. Measured on 2× B200 (sm_100), torch 2.13.0+cu130, vllm 0.30.0, -transformers 5.17.0. +transformers 5.17.0. vLLM paths below are relative to the installed `vllm` 0.30.0 +package; two files are named `causal_conv1d.py`, and each citation says whether it +means vLLM's (`model_executor/layers/mamba/ops/causal_conv1d.py`) or the golden's +(`rl_engine/kernels/ops/pytorch/linear_attn/causal_conv1d.py`). Claim level reached: **L0 repeatable, L1 batch-invariant**. L2 is not claimed. ## 1. Which provider a rollout decode actually takes -vLLM 0.30.0 has three GDN decode paths, selected by env defaults rather than by the -model: +vLLM 0.30.0 picks the GDN decode path per engine step. The choice depends on env +defaults, on what else the step contains, and on how the model constructs the layer: -| condition | path | -|---|---| -| `VLLM_GDN_DECODE_KERNEL="cuda"` (default) + MTP | `torch.ops._C.fused_gdn_decode_post_conv_mtp` — conv, recurrence and the gated norm fused | -| `VLLM_ENABLE_FLA_PACKED_RECURRENT_DECODE=1` (default), decode-only, non-spec | `fused_recurrent_gated_delta_rule_packed_decode` | -| otherwise | `fused_sigmoid_gating_delta_rule_update` | - -A pure RL rollout decode — N sequences each emitting one token, no speculative -decoding — returns early at `qwen_gdn_linear_attn.py:1295-1307` into the **packed** -path. The golden targets that one. Aligning against the sigmoid-gating kernel would -validate a path production does not take. - -`tests/check_qwen3_next_norm_providers.py` asserts those two env defaults, so a vLLM -bump that flips either fails loudly rather than silently re-pointing the claim. - -## 2. Three places the kernel and the HF model disagree - -The golden is transcribed from the kernel, not from `modeling_qwen3_next.py`: - -1. **The gating is fused.** `beta = sigmoid(b)` and +| step contains | conv | recurrence | +|---|---|---| +| decodes only, no draft tokens | `causal_conv1d_update` | `fused_recurrent_gated_delta_rule_packed_decode` | +| decodes and at least one prefill, no draft tokens | `causal_conv1d_fn` | `fused_sigmoid_gating_delta_rule_update` for the cached decode rows | +| draft tokens (speculative decode / MTP) | `causal_conv1d_update` with `num_accepted_tokens` | `fused_sigmoid_gating_delta_rule_update`; plain decodes in the step are reclassified as prefills | + +- **Decode-only.** With `VLLM_ENABLE_FLA_PACKED_RECURRENT_DECODE` at its default of on + (`envs.py:1199-1200`), a decode-only step returns early at + `model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py:1295-1307` into + `_forward_core_decode_non_spec`, which calls the packed kernel (`:1697-1708`). **The + goldens target this path.** With the variable off, the same step goes through + `fused_sigmoid_gating_delta_rule_update` instead (`:1553-1572`). +- **Mixed decode and prefill.** `_forward_core` runs the conv for the whole non-spec + batch through `causal_conv1d_fn` (branch at `:1373`, call at `:1378-1388`) and the + cached decode rows through `fused_sigmoid_gating_delta_rule_update` + (`split_non_spec` defined at `:1408-1412`, branch at `:1493`, call at `:1497-1512`). + See §5 for what that does to the claim. +- **Draft tokens.** Spec rows go through `causal_conv1d_update` with + `num_accepted_tokens` (`:1357-1370`) and `fused_sigmoid_gating_delta_rule_update` + (`:1470-1487`). Plain decodes in the same step are reclassified as prefills + (`v1/attention/backends/gdn_attn.py:283-289`). A step with speculative decoding + enabled but zero draft tokens sets `spec_sequence_masks` to `None` + (`gdn_attn.py:236-243`) and is treated as decode-only. + +`VLLM_GDN_DECODE_KERNEL` defaults to `"cuda"`, but that is not what Qwen3-Next runs. +`model_executor/models/qwen3_next.py:495` constructs the layer with +`gqa_interleaved_layout=True`, which makes `_fused_gdn_decode_unsupported_reason` +(`qwen_gdn_linear_attn.py:535-554`) return a reason. The layer then logs a fallback +to `"triton"` (`:520-523`), or raises `ValueError` if `VLLM_GDN_DECODE_KERNEL` was +explicitly set to `cuda` (`:516-519`). As a consequence the fused +`torch.ops._C.fused_gdn_decode_post_conv_mtp` path is unreachable for Qwen3-Next: +`_can_use_fused_gdn_mtp_decode` requires `gdn_decode_kernel == "cuda"` (`:1834`). +This section is read from the source. + +`tests/check_qwen3_next_norm_providers.py` asserts both env defaults (`:124-131`). For +`VLLM_ENABLE_FLA_PACKED_RECURRENT_DECODE` that is a useful guard: a vLLM bump that +flips it fails loudly. For `VLLM_GDN_DECODE_KERNEL` it guards nothing for Qwen3-Next, +because the interleaved layout, not the default, decides the kernel. Neither +assertion checks which kernel actually runs. + +## 2. How the golden relates to the kernel + +The golden follows the kernel's arithmetic, not `modeling_qwen3_next.py`'s. Checked +line by line against `third_party/flash_linear_attention/ops/fused_recurrent.py:288-335`, +three places where the kernel and the HF model differ: + +1. **The gating is fused, in fp32.** `beta = sigmoid(b)` and `g = -exp(A_log) * softplus(a + dt_bias)` are computed inside the Triton kernel, with a `softplus` threshold branch at 20. HF computes them as separate PyTorch ops — a different rounding path. @@ -40,9 +71,19 @@ The golden is transcribed from the kernel, not from `modeling_qwen3_next.py`: `rsqrt`, which differs in the last bit. `scale` is applied to `q` *after* the norm; `k` is never scaled. -A fourth, checked and found **not** to be a divergence: prefill passes -`use_qk_l2norm_in_kernel=False` only because `fused_post_conv_prep(apply_l2norm=True)` -already normalized q/k. Both paths normalize exactly once. +Where the golden is **not** a transcription: + +- softplus: the kernel computes `tl.log(1.0 + tl.exp(x))` (`fused_recurrent.py:327`); + the golden computes `torch.log1p(torch.exp(safe))`, where `safe` is `x` on the taken + branch (`gated_delta_rule.py:107-109`). These round differently. +- The kernel's `exp`/`log` become `fast_expf`/`fast_logf` when `FLA_USE_FAST_OPS=1` + (`third_party/flash_linear_attention/ops/op.py:16-25`). The golden models the + default. + +Checked and found **not** to be a divergence: prefill passes +`use_qk_l2norm_in_kernel=False` (`qwen_gdn_linear_attn.py:1542`) only because +`fused_post_conv_prep(apply_l2norm=True)` (`:1450`) already normalized q/k. Decode +passes `True` (`:1707`). Both paths normalize exactly once. ## 3. State ABI @@ -51,30 +92,60 @@ Mirrored rather than reinvented: - recurrent state `[num_blocks, HV, V, K]`, V-major, addressed by `ssm_state_indices` - conv state `[num_blocks, dim, width-1]`, layout chosen by the global `is_conv_state_dim_first()`; the golden takes it as an argument and both are tested -- `NULL_BLOCK_ID` (index `<= 0`) means skip: zeros out, block untouched - the accumulator is fp32 for the whole step; the store rounds to the state tensor's - dtype, which `FUSED_GDN_STATE_DTYPES` allows to be fp32 **or** bf16 -- `causal_conv1d_update` casts `x` to the cache dtype before anything else + dtype, which `FUSED_GDN_STATE_DTYPES` (`qwen_gdn_linear_attn.py:91`) allows to be + fp32 **or** bf16 +- `causal_conv1d_update` casts `x` to the cache dtype before computing + +`NULL_BLOCK_ID` is **not** one contract across the two providers: + +| | recurrent provider | conv provider | both goldens | +|---|---|---|---| +| which indices skip | `<= 0` (`fused_recurrent.py:300`) | `== null_block_id` only, default `NULL_BLOCK_ID` = 0 (vLLM `causal_conv1d.py:835`; `v1/attention/backends/utils.py:47`) | `<= 0` | +| output for a skipped row | zeros (`fused_recurrent.py:301-302`) | not written (vLLM `causal_conv1d.py:835-839` returns before any store) | zeros | +| state block | not touched | not touched | not touched | -Contractions run in the repo's fixed 32-wide chunk order rather than `torch.matmul`, -whose reduction order is unspecified. That is what the L1 claim rests on, and also -why the golden is not bitwise against the kernel's tree. +A negative conv index is therefore inactive in the golden +(`tests/test_gdn_state_contract.py:51-56`) but a real, out-of-range index to the conv +provider. + +Contractions use `_chunked_sum` (`gated_delta_rule.py:73-87`): fixed 32-wide chunks, +so the reduction shape per row does not depend on the batch size, rather than +`torch.matmul`, whose reduction order is unspecified. That is the argument for the +L1 claim; L1 itself is established empirically by `test_golden_is_batch_invariant`. +The same choice is why the golden is not bitwise against the kernel's reduction. ## 4. Agreement with the provider -Qwen3-Next dims (H=16, HV=32, K=V=128), `use_qk_l2norm_in_kernel=True`: +Qwen3-Next dims (H=16, HV=32, K=V=128), bf16 I/O, `use_qk_l2norm_in_kernel=True`, +random inputs, B ∈ {1, 4, 17, 64}, one seed per batch. Bounds asserted by +`tests/check_gdn_recurrent_golden.py`: | | max\|diff\| out | max\|diff\| state | |---|---|---| -| fp32 state, B=1..64 | 1.5e-08 .. 6.1e-05 | ≤ 3.0e-07 | -| bf16 state, B=1..64 | 3.7e-09 .. 3.1e-05 | ≤ 2.0e-03 | +| fp32 state | ≤ 1e-3 | ≤ 1e-5 | +| bf16 state | ≤ 1e-3 | ≤ 5e-3 | + +`scripts/ws1_gdn_provider_agreement.py` prints the measured values behind these +bounds for the same inputs. An earlier table here quoted tighter figures from a +single run with no committed runner; it is withdrawn in favour of the runner's +output. Causal conv uses sequential FP32 accumulation **starting from bias**, with -products first rounded to the operand dtype. The previous BF16 path incorrectly -promoted both operands to FP32; its disagreements were not limited to one BF16 -ULP. Cancellation and bias-order CPU tests now cover these errors. Provider -comparisons preserve the existing absolute bounds and additionally limit BF16 -mismatches to 32 elements on the checked fixtures. This is not a bitwise claim. +products first rounded to the operand dtype (golden `causal_conv1d.py:167-177`; +the provider initialises from bias at vLLM `causal_conv1d.py:960-967`, `1000`). The +previous BF16 path incorrectly promoted both operands to FP32; its disagreements +were not limited to one BF16 ULP. The CPU tests in `tests/test_gdn_state_contract.py` +cover bias order and bf16 product rounding, and +`test_conv_provider_preserves_bf16_product_cancellation` checks the provider on a +constructed cancellation input. Provider comparisons limit mismatches to 32 elements +on the checked fixtures. This is not a bitwise claim. + +With an fp32 cache a few output elements still differ. The cause is not pinned. One +candidate is FP contraction: Triton's default `enable_fp_fusion=True` may contract the +provider's `acc += matrix_x * matrix_w` (vLLM `causal_conv1d.py:1061`) into an FMA, +whereas the golden rounds the product first. The runner reruns the comparison with +fusion off and counts `fma.rn.f32` in the compiled kernel to test this. ## 5. Decode versus chunked prefill @@ -83,14 +154,38 @@ they are withdrawn as acceptance evidence. The existing 128-step synthetic test only bounds its fixed seed and gate inputs. It does not establish a universal plateau, prefill/decode equality, or any bound on model logits. +**Mixed decode-and-prefill steps (provider side).** The goldens target the +decode-only path (§1). In a step that also holds a prefill, vLLM 0.30.0 sends the +cached decode rows through `causal_conv1d_fn` and +`fused_sigmoid_gating_delta_rule_update` instead, so in those steps neither golden +matches what rollout runs. The two recurrent kernels do not agree bitwise. A +measurement on B200 with Qwen3-Next TP1 shapes, driving the real +`GDNAttentionMetadataBuilder.build()` and `_forward_core`, found the step's bf16 +output equal but the fp32 state different in 75,146 of 524,288 elements (8.8e-08 +relative). In 4 of 20 seeds the difference reached a bf16 output within the next 16 +decode steps. This was measured outside this change and is not yet published; treat it +as a reported observation. + +vllm-project/vllm#49827, open and unmerged, would route mixed-step *recurrent* +decodes through the packed kernel too, according to its description. It was +validated on Qwen3.5 (non-interleaved), H100, TP1, and it does not change the conv +path in mixed steps, which stays `causal_conv1d_fn`. Disabling +`VLLM_ENABLE_FLA_PACKED_RECURRENT_DECODE` instead sends every decode row through +`fused_sigmoid_gating_delta_rule_update`, and the recurrent golden's target would +have to change. + The strict profile uses FP32 recurrent state. BF16 state remains a differential experiment. Full checkpoint prefill, response replay, optimizer updates and reload all remain required before L2 can pass. Cache indices must be int32/int64, on the input device, and positive active indices must be unique and in range. Nonpositive sentinels may repeat. The golden -validates before any cache update; raw provider calls remain the caller's -responsibility (the provider's default does not bounds-check). +validates before any cache update. Raw provider calls remain the caller's +responsibility: neither provider checks index values. `causal_conv1d_update`'s +`validate_data=True` adds only shape and stride asserts and a +`null_block_id is not None` assert (vLLM `causal_conv1d.py:1151-1153`, `1188-1201`), +so an out-of-range index is an unchecked memory access in either mode (read from +the source, not exercised). ## 6. Current boundary @@ -98,7 +193,7 @@ Not covered, with reasons: | deferred | why | |---|---| -| Speculative decode / MTP | `fused_gdn_decode_post_conv_mtp` fuses conv, recurrence and the gated norm; validating it needs a draft model | +| Speculative decode / MTP | RFC #428 §2.2 excludes speculative decoding from the first claim. Qwen3-Next's MTP head ships in the checkpoint (`mtp.*`, loaded by `model_executor/models/qwen3_next_mtp.py`) and is full attention (`qwen3_next_mtp.py:90-92`). Enabling it changes the target model's GDN path in steps that carry draft tokens (§1); `fused_gdn_decode_post_conv_mtp` is unreachable for Qwen3-Next | | Backward for the recurrent step | no upstream backward exists, and a naive BPTT through a sequential recurrence is not batch-invariant — it needs its own design | | Provider bridge / registry entry | the golden should survive a drift sweep against a real checkpoint first | | Paged block allocation policy | the ABI is mirrored; the allocator is not modelled | From 9da9c36e47241114b2bd980fb90bea5d6461480b Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Thu, 1 Oct 2026 19:05:59 +0000 Subject: [PATCH 25/70] fix(gdn): report unknown git state as null, not dirty, in the C6 runner _git() returned the string "unavailable: ..." on failure, so bool(_git("status", "--porcelain")) turned "git missing / not a checkout" into git_dirty=True. Return None on failure and record git_dirty and git_commit as null in that case, so the provenance distinguishes unknown from dirty. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- scripts/ws1_gdn_provider_agreement.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/scripts/ws1_gdn_provider_agreement.py b/scripts/ws1_gdn_provider_agreement.py index a3a433575..393d342cd 100644 --- a/scripts/ws1_gdn_provider_agreement.py +++ b/scripts/ws1_gdn_provider_agreement.py @@ -68,22 +68,25 @@ def _max_abs_diff(a: torch.Tensor, b: torch.Tensor) -> float: return (a.float() - b.float()).abs().max().item() -def _git(*args: str) -> str: +def _git(*args: str) -> str | None: + """Stripped stdout, or ``None`` if git is missing or the command fails.""" try: return subprocess.run( ["git", *args], cwd=REPO_ROOT, capture_output=True, text=True, check=True ).stdout.strip() - except (OSError, subprocess.CalledProcessError) as exc: - return f"unavailable: {exc}" + except (OSError, subprocess.CalledProcessError): + return None def _provenance() -> dict[str, Any]: import triton import vllm + status = _git("status", "--porcelain") return { + # None means "unknown" (no git, or not a checkout), never "clean". "git_commit": _git("rev-parse", "HEAD"), - "git_dirty": bool(_git("status", "--porcelain")), + "git_dirty": None if status is None else bool(status), "python": platform.python_version(), "torch": torch.__version__, "triton": triton.__version__, From 5216a6c3443519e85f6d01a91500fcab60dbf450 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Thu, 1 Oct 2026 19:06:16 +0000 Subject: [PATCH 26/70] docs(gdn): restate the backward deferral against RFC #428 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The §6 row deferred backward because "a naive BPTT through a sequential recurrence is not batch-invariant". RFC #428 does not ask backward to be: §2.2 item 4 says backward need not match rollout, only be correct for the replayed forward, and §9.1 makes the GDN backward its own work item, C7. Cite those instead, matching the PR description. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- docs/design/ws1-c6-428-gdn-recurrent-replay.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/design/ws1-c6-428-gdn-recurrent-replay.md b/docs/design/ws1-c6-428-gdn-recurrent-replay.md index 7832bbb1b..efe2b08aa 100644 --- a/docs/design/ws1-c6-428-gdn-recurrent-replay.md +++ b/docs/design/ws1-c6-428-gdn-recurrent-replay.md @@ -194,7 +194,7 @@ Not covered, with reasons: | deferred | why | |---|---| | Speculative decode / MTP | RFC #428 §2.2 excludes speculative decoding from the first claim. Qwen3-Next's MTP head ships in the checkpoint (`mtp.*`, loaded by `model_executor/models/qwen3_next_mtp.py`) and is full attention (`qwen3_next_mtp.py:90-92`). Enabling it changes the target model's GDN path in steps that carry draft tokens (§1); `fused_gdn_decode_post_conv_mtp` is unreachable for Qwen3-Next | -| Backward for the recurrent step | no upstream backward exists, and a naive BPTT through a sequential recurrence is not batch-invariant — it needs its own design | +| Backward for the recurrent step | RFC #428 §2.2 item 4: backward need not match rollout, only be correct for the replayed forward. RFC §9.1 makes it a separate work item, **C7** (GDN backward/recompute adapter including prompt-state gradient). `supports_backward=false` here; `_softplus`'s NaN-gradient fix (`08969ac`) adds no backward claim | | Provider bridge / registry entry | the golden should survive a drift sweep against a real checkpoint first | | Paged block allocation policy | the ABI is mirrored; the allocator is not modelled | | TP sharding of `A_log` / `dt_bias` | single card only | From 10e523056bfcab6d16bc9e0e9791c1ceaa0e0cc2 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Thu, 1 Oct 2026 19:47:57 +0000 Subject: [PATCH 27/70] fix(gdn): make the C6 runner's fusion-off arm and FMA count real A run of the runner at d66e595 showed both of its FMA probes were ineffective: - The fusion-off arm reused the fused kernel. Triton 3.7.1 keys its in-memory kernel cache on the launch kwargs; the default_fp_fusion knob is read in parse_options only after a cache miss. Flipping the knob in-process never missed, so all six recorded variants had enable_fp_fusion=True and the "off" counts were the "on" counts again. Run the fusion-off arm in a child process with TRITON_DEFAULT_FP_FUSION=0 and a private TRITON_CACHE_DIR instead. - fma.rn.f32 = 0 in the PTX does not rule out FMA. With fusion on, Triton emits plain mul.f32/add.f32 and lets ptxas contract them into FFMA; with fusion off it passes --fmad=false. Count plain and .rn PTX ops, and FFMA/FMUL/FADD in the SASS (Triton's bundled cuobjdump). Report per-arm kernel variants under conv_kernels and add fusion_check, which says whether the fusion-off variants were actually compiled without fusion, so a silent no-op cannot pass for a result again. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- scripts/ws1_gdn_provider_agreement.py | 166 +++++++++++++++++--------- 1 file changed, 109 insertions(+), 57 deletions(-) diff --git a/scripts/ws1_gdn_provider_agreement.py b/scripts/ws1_gdn_provider_agreement.py index 393d342cd..539fa9979 100644 --- a/scripts/ws1_gdn_provider_agreement.py +++ b/scripts/ws1_gdn_provider_agreement.py @@ -15,11 +15,19 @@ (batch, state dtype): max|d out|, max|d state| and bitwise mismatch counts. * ``conv``: provider vs golden for ``causal_conv1d_update``, per (batch, cache dtype): output mismatch count and max|diff|, and whether the rolled state is bitwise equal. -* ``conv`` again with Triton FP fusion disabled - (``triton.knobs.language.default_fp_fusion = False``), plus ``conv_ptx``: the number - of ``fma.rn.f32`` instructions in each compiled variant of the provider's conv - kernel. If the fp32-cache mismatches are FMA contraction, they should vanish with - fusion off and the fusion-off PTX should contain no ``fma.rn.f32``. +* ``conv`` again with Triton FP fusion disabled, plus ``conv_kernels``: per compiled + variant of the provider's conv-update kernel, its ``enable_fp_fusion`` option and + instruction counts from the PTX and from the SASS. + +The fusion-off arm runs in a child process with ``TRITON_DEFAULT_FP_FUSION=0`` and a +private ``TRITON_CACHE_DIR``. Flipping ``triton.knobs.language.default_fp_fusion`` +in-process does not work: Triton's in-memory kernel cache is keyed on the launch +kwargs, and the knob is read only after a cache miss, so the fused variant is reused. + +Count FMAs in the SASS, not only the PTX. With fusion on, Triton emits plain +``mul.f32``/``add.f32`` and leaves ptxas free to contract them into ``FFMA``; with +fusion off it passes ``--fmad=false`` to ptxas. A PTX with no ``fma.rn.f32`` can still +run FMAs. ``fusion_check`` reports whether each arm compiled what it claims to. Requires CUDA and vLLM 0.30.0. Run it from a clean checkout so ``git_dirty`` is false: @@ -29,12 +37,14 @@ from __future__ import annotations import argparse -import contextlib import importlib.util import json +import os import platform +import re import subprocess import sys +import tempfile from pathlib import Path from typing import Any @@ -47,6 +57,16 @@ _CHECK_FILE = REPO_ROOT / "tests" / "check_gdn_recurrent_golden.py" _STATE_DTYPES = {"fp32": torch.float32, "bf16": torch.bfloat16} _INT_VIEW = {2: torch.int16, 4: torch.int32} +# Opcode patterns. PTX: a rounding-qualified op (".rn") may not be contracted by ptxas; +# the plain form may. SASS: count opcode tokens, including modifiers such as FFMA.FTZ. +_PTX_OPS = { + "fma_rn_f32": r"\bfma\.rn\.f32\b", + "mul_f32": r"\bmul\.f32\b", + "add_f32": r"\badd\.f32\b", + "mul_rn_f32": r"\bmul\.rn\.f32\b", + "add_rn_f32": r"\badd\.rn\.f32\b", +} +_SASS_OPS = {"FFMA": r"\bFFMA[\w.]*", "FMUL": r"\bFMUL[\w.]*", "FADD": r"\bFADD[\w.]*"} def _load_check_module(): @@ -97,24 +117,6 @@ def _provenance() -> dict[str, Any]: } -@contextlib.contextmanager -def _fp_fusion(enabled: bool): - """Set Triton's default FP fusion for kernels compiled inside the block. - - ``enable_fp_fusion`` is part of the options string in Triton's kernel cache key, - so flipping it compiles a fresh variant rather than reusing the fused one. - """ - import triton - - knobs = triton.knobs.language - previous = knobs.default_fp_fusion - knobs.default_fp_fusion = enabled - try: - yield - finally: - knobs.default_fp_fusion = previous - - def _measure_recurrent(check, batches: list[int]) -> list[dict[str, Any]]: bounds = {"fp32": (1e-3, 1e-5), "bf16": (1e-3, 5e-3)} # check file :117, :120 rows = [] @@ -141,30 +143,36 @@ def _measure_recurrent(check, batches: list[int]) -> list[dict[str, Any]]: return rows -def _measure_conv(check, batches: list[int], fp_fusion: bool) -> list[dict[str, Any]]: +def _measure_conv(check, batches: list[int]) -> list[dict[str, Any]]: + import triton + + fp_fusion = bool(triton.knobs.language.default_fp_fusion) # this process's setting rows = [] - with _fp_fusion(fp_fusion): - for batch in batches: - for name, cache_dtype in _STATE_DTYPES.items(): - # Same call as the test_conv_* provider comparisons. - inp = check._conv_inputs(batch, cache_dtype, seed=batch) - (out_ref, state_ref), (out_got, state_got) = check._run_conv_pair(inp) - rows.append( - { - "batch": batch, - "cache_dtype": name, - "fp_fusion": fp_fusion, - "out_mismatch_elements": _bit_mismatches(out_got, out_ref), - "out_elements": out_ref.numel(), - "max_abs_diff_out": _max_abs_diff(out_got, out_ref), - "state_bitwise_equal": torch.equal(state_got, state_ref), - } - ) + for batch in batches: + for name, cache_dtype in _STATE_DTYPES.items(): + # Same call as the test_conv_* provider comparisons. + inp = check._conv_inputs(batch, cache_dtype, seed=batch) + (out_ref, state_ref), (out_got, state_got) = check._run_conv_pair(inp) + rows.append( + { + "batch": batch, + "cache_dtype": name, + "fp_fusion": fp_fusion, + "out_mismatch_elements": _bit_mismatches(out_got, out_ref), + "out_elements": out_ref.numel(), + "max_abs_diff_out": _max_abs_diff(out_got, out_ref), + "state_bitwise_equal": torch.equal(state_got, state_ref), + } + ) return rows -def _conv_ptx_fma_counts() -> list[dict[str, Any]] | dict[str, str]: - """``fma.rn.f32`` count per compiled variant of the provider's conv-update kernel.""" +def _count(patterns: dict[str, str], text: str) -> dict[str, int]: + return {name: len(re.findall(pattern, text)) for name, pattern in patterns.items()} + + +def _conv_kernel_variants() -> list[dict[str, Any]] | dict[str, str]: + """Options and instruction counts per compiled variant of the conv-update kernel.""" try: from vllm.model_executor.layers.mamba.ops import causal_conv1d as conv_module @@ -174,21 +182,55 @@ def _conv_ptx_fma_counts() -> list[dict[str, Any]] | dict[str, str]: variants = [] for device, cache in kernel.device_caches.items(): for compiled in cache[0].values(): - ptx = compiled.asm["ptx"] - variants.append( - { - "device": str(device), - "enable_fp_fusion": getattr(compiled.metadata, "enable_fp_fusion", None), - "fma_rn_f32": ptx.count("fma.rn.f32"), - "mul_rn_f32": ptx.count("mul.rn.f32"), - "add_rn_f32": ptx.count("add.rn.f32"), - } - ) + row: dict[str, Any] = { + "device": str(device), + "enable_fp_fusion": getattr(compiled.metadata, "enable_fp_fusion", None), + "ptx": _count(_PTX_OPS, compiled.asm["ptx"]), + } + try: + row["sass"] = _count(_SASS_OPS, compiled.asm["sass"]) + except Exception as exc: # needs cuobjdump; report, do not fail + row["sass"] = {"unavailable": f"{type(exc).__name__}: {exc}"} + variants.append(row) return variants except Exception as exc: # introspection of Triton internals; report, do not fail return {"unavailable": f"{type(exc).__name__}: {exc}"} +def _conv_report(check, batches: list[int]) -> dict[str, Any]: + return {"conv": _measure_conv(check, batches), "conv_kernels": _conv_kernel_variants()} + + +def _conv_report_without_fusion(batches: str) -> dict[str, Any]: + """Rerun the conv arm in a child process that compiles with fusion off.""" + with tempfile.TemporaryDirectory(prefix="triton-nofusion-") as cache_dir: + env = dict(os.environ, TRITON_DEFAULT_FP_FUSION="0", TRITON_CACHE_DIR=cache_dir) + child = subprocess.run( + [sys.executable, str(Path(__file__).resolve()), "--conv-only", "--batches", batches], + env=env, + stdout=subprocess.PIPE, + text=True, + check=True, + ) + return json.loads(child.stdout) + + +def _fusion_check(on: Any, off: Any) -> dict[str, Any]: + """Whether each arm's compiled variants carry the fusion setting it claims.""" + + def flags(variants: Any) -> list[Any] | None: + if not isinstance(variants, list): + return None + return [v["enable_fp_fusion"] for v in variants] + + on_flags, off_flags = flags(on), flags(off) + return { + "fusion_on_variants": on_flags, + "fusion_off_variants": off_flags, + "fusion_off_effective": bool(off_flags) and all(f is False for f in off_flags), + } + + def parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser(description=__doc__.splitlines()[0]) parser.add_argument( @@ -201,6 +243,8 @@ def parse_args() -> argparse.Namespace: action="store_true", help="do not rerun the conv comparison with Triton FP fusion disabled", ) + # Internal: the fusion-off child process prints only the conv arm. + parser.add_argument("--conv-only", action="store_true", help=argparse.SUPPRESS) return parser.parse_args() @@ -217,6 +261,10 @@ def main() -> int: batches = [int(b) for b in args.batches.split(",") if b.strip()] check = _load_check_module() + if args.conv_only: + print(json.dumps(_conv_report(check, batches), sort_keys=True)) + return 0 + report: dict[str, Any] = { "runner": "scripts/ws1_gdn_provider_agreement.py", "provenance": _provenance(), @@ -228,11 +276,15 @@ def main() -> int: "conv": "bias=True, activation=silu, dim_first=True, W=4, dim=8192", }, "recurrent": _measure_recurrent(check, batches), - "conv": _measure_conv(check, batches, fp_fusion=True), } + fused = _conv_report(check, batches) + report["conv"] = fused["conv"] + report["conv_kernels"] = {"fusion_on": fused["conv_kernels"]} if not args.skip_fusion_off: - report["conv"] += _measure_conv(check, batches, fp_fusion=False) - report["conv_ptx"] = _conv_ptx_fma_counts() + unfused = _conv_report_without_fusion(args.batches) + report["conv"] += unfused["conv"] + report["conv_kernels"]["fusion_off"] = unfused["conv_kernels"] + report["fusion_check"] = _fusion_check(fused["conv_kernels"], unfused["conv_kernels"]) print(json.dumps(report, indent=2, sort_keys=True)) return 0 From 2d895d09da9c22c69594cc8b7c55e8ced7c519bb Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Thu, 1 Oct 2026 19:48:57 +0000 Subject: [PATCH 28/70] docs(gdn): quote the runner's measured C6 agreement, not stale counts The runner on d66e595 (B200, clean checkout) reproduced the recurrent figures the note had withdrawn for lack of a runner, so restore them as a per-batch table with their provenance and bitwise output-mismatch counts. The conv counts quoted in test_conv_output_matches_provider_with_fp32_cache's docstring (1 of 8192 at B=1, 15 of 524288 at B=64) predate the product- rounding fix; the runner measures 0, 0, 1 and 5 for B = 1, 4, 17, 64. Replace them, and record the bf16-cache counts in the note. State plainly that the FMA explanation for the fp32-cache mismatches is not determined: that run's fusion-off arm reused the fused kernel, and a PTX without fma.rn.f32 cannot exclude ptxas contraction. The runner now tests both (previous commit). Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- .../design/ws1-c6-428-gdn-recurrent-replay.md | 42 +++++++++++++++---- tests/check_gdn_recurrent_golden.py | 8 ++-- 2 files changed, 38 insertions(+), 12 deletions(-) diff --git a/docs/design/ws1-c6-428-gdn-recurrent-replay.md b/docs/design/ws1-c6-428-gdn-recurrent-replay.md index efe2b08aa..44c6c5a36 100644 --- a/docs/design/ws1-c6-428-gdn-recurrent-replay.md +++ b/docs/design/ws1-c6-428-gdn-recurrent-replay.md @@ -126,10 +126,24 @@ random inputs, B ∈ {1, 4, 17, 64}, one seed per batch. Bounds asserted by | fp32 state | ≤ 1e-3 | ≤ 1e-5 | | bf16 state | ≤ 1e-3 | ≤ 5e-3 | -`scripts/ws1_gdn_provider_agreement.py` prints the measured values behind these -bounds for the same inputs. An earlier table here quoted tighter figures from a -single run with no committed runner; it is withdrawn in favour of the runner's -output. +Measured values for the same inputs, from `scripts/ws1_gdn_provider_agreement.py` on +B200 at commit `acf38b6` (clean checkout). The last column counts output elements +whose bits differ: + +| state | B | max\|diff\| out | max\|diff\| state | out elements differing | +|---|---|---|---|---| +| fp32 | 1 | 1.49e-08 | 1.19e-07 | 1 / 4096 | +| fp32 | 4 | 9.54e-07 | 1.79e-07 | 2 / 16384 | +| fp32 | 17 | 3.81e-06 | 2.38e-07 | 10 / 69632 | +| fp32 | 64 | 6.10e-05 | 2.98e-07 | 40 / 262144 | +| bf16 | 1 | 3.73e-09 | 9.77e-04 | 2 / 4096 | +| bf16 | 4 | 1.53e-05 | 9.77e-04 | 2 / 16384 | +| bf16 | 17 | 3.05e-05 | 1.95e-03 | 14 / 69632 | +| bf16 | 64 | 3.05e-05 | 1.95e-03 | 36 / 262144 | + +This reproduces the figures an earlier version of this note quoted without a runner +(out 1.5e-08 .. 6.1e-05 and state ≤ 3.0e-07 for fp32; out 3.7e-09 .. 3.1e-05 and +state ≤ 2.0e-03 for bf16). It is one seed per batch on one device. Causal conv uses sequential FP32 accumulation **starting from bias**, with products first rounded to the operand dtype (golden `causal_conv1d.py:167-177`; @@ -141,11 +155,21 @@ cover bias order and bf16 product rounding, and constructed cancellation input. Provider comparisons limit mismatches to 32 elements on the checked fixtures. This is not a bitwise claim. -With an fp32 cache a few output elements still differ. The cause is not pinned. One -candidate is FP contraction: Triton's default `enable_fp_fusion=True` may contract the -provider's `acc += matrix_x * matrix_w` (vLLM `causal_conv1d.py:1061`) into an FMA, -whereas the golden rounds the product first. The runner reruns the comparison with -fusion off and counts `fma.rn.f32` in the compiled kernel to test this. +Measured with the same runner and commit: the rolled conv state is bitwise equal in +all 8 (batch, cache dtype) cases. Output elements differing, with an fp32 cache: +0 / 8192 (B=1), 0 / 32768 (B=4), 1 / 139264 (B=17, max|diff| 2.44e-04) and +5 / 524288 (B=64, max|diff| 3.91e-03). With a bf16 cache: 0 at B=1, 4 and 17, and +3 / 524288 at B=64 (max|diff| 1.56e-02). + +Why a few fp32-cache elements differ is **not determined**. One candidate is FP +contraction: with Triton's default `enable_fp_fusion=True`, ptxas may contract the +provider's `acc += matrix_x * matrix_w` (vLLM `causal_conv1d.py:1061`) into an `FFMA`, +whereas the golden rounds the product first. A PTX without `fma.rn.f32` does not rule +this out, because the contraction can happen in ptxas. The runner tests it by +rerunning the comparison in a child process compiled with fusion off and by counting +`FFMA` in each variant's SASS; its `fusion_check` field says whether the fusion-off +variants were really compiled that way. The run above predates that arm working (its +fusion-off pass reused the fused kernel), so it is no evidence either way. ## 5. Decode versus chunked prefill diff --git a/tests/check_gdn_recurrent_golden.py b/tests/check_gdn_recurrent_golden.py index aefecaddf..103098fc5 100644 --- a/tests/check_gdn_recurrent_golden.py +++ b/tests/check_gdn_recurrent_golden.py @@ -282,10 +282,12 @@ def test_conv_state_update_is_bitwise_exact(batch): @pytest.mark.parametrize("batch", [1, 4, 17, 64]) def test_conv_output_matches_provider_with_fp32_cache(batch): - """An fp32 cache reproduces the provider up to fp32 ULP on a few elements. + """An fp32 cache reproduces the provider except on a few output elements. - Measured: 1 element of 8192 at B=1, 15 of 524288 at B=64. The bound is on - the magnitude and on a handful of elements rather than on a tight rate -- + Measured by scripts/ws1_gdn_provider_agreement.py (B200, acf38b6): 0 of 8192 + at B=1, 0 at B=4, 1 of 139264 at B=17, 5 of 524288 at B=64; max|diff| 3.9e-3. + The bound is on the magnitude and on a handful of elements rather than on a + tight rate -- at small batches a single straddling element is already 1.2e-4 of the tensor, which says nothing about accuracy. """ From 52f7f61951104f38ada05e71978a6445952ab690 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Thu, 1 Oct 2026 20:08:52 +0000 Subject: [PATCH 29/70] docs(gdn): record that FP contraction does not explain the conv mismatches MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The fixed runner (b54e50f) on 7622616, B200, settles the FMA hypothesis left open in §4. Its fusion-off arm took effect: all six variants compiled with enable_fp_fusion=False, and their PTX uses only .rn-qualified f32 mul/add, which ptxas may not contract. With contraction verifiably off, the fp32-cache mismatch counts (0, 0, 1, 5 for B = 1, 4, 17, 64) and max|diff| are identical to the fused run, and neither arm's SASS has an FFMA. So FP contraction is ruled out; the actual cause stays open. The note bases the conclusion on the A/B outcome, not on the opcode counts: each variant's PTX has only two f32 multiplies, too few to be the four tap products, so the counters do not show where the products are computed. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- .../design/ws1-c6-428-gdn-recurrent-replay.md | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/docs/design/ws1-c6-428-gdn-recurrent-replay.md b/docs/design/ws1-c6-428-gdn-recurrent-replay.md index 44c6c5a36..25febbb8c 100644 --- a/docs/design/ws1-c6-428-gdn-recurrent-replay.md +++ b/docs/design/ws1-c6-428-gdn-recurrent-replay.md @@ -161,15 +161,23 @@ all 8 (batch, cache dtype) cases. Output elements differing, with an fp32 cache: 5 / 524288 (B=64, max|diff| 3.91e-03). With a bf16 cache: 0 at B=1, 4 and 17, and 3 / 524288 at B=64 (max|diff| 1.56e-02). -Why a few fp32-cache elements differ is **not determined**. One candidate is FP -contraction: with Triton's default `enable_fp_fusion=True`, ptxas may contract the -provider's `acc += matrix_x * matrix_w` (vLLM `causal_conv1d.py:1061`) into an `FFMA`, -whereas the golden rounds the product first. A PTX without `fma.rn.f32` does not rule -this out, because the contraction can happen in ptxas. The runner tests it by -rerunning the comparison in a child process compiled with fusion off and by counting -`FFMA` in each variant's SASS; its `fusion_check` field says whether the fusion-off -variants were really compiled that way. The run above predates that arm working (its -fusion-off pass reused the fused kernel), so it is no evidence either way. +**FP contraction is ruled out** as the cause of the few differing fp32-cache +elements; what does cause them is **not determined**. The candidate was that, with +Triton's default `enable_fp_fusion=True`, ptxas contracts the provider's +`acc += matrix_x * matrix_w` (vLLM `causal_conv1d.py:1061`) into an `FFMA`, whereas the +golden rounds the product first. The runner tests this by rerunning the comparison in +a child process compiled with fusion off. On B200 at commit `cf6be1a`: + +- the fusion-off arm took effect: all 6 compiled variants carry + `enable_fp_fusion=False`, and their PTX has only `.rn`-qualified f32 `mul`/`add`, + which ptxas may not contract; +- the mismatch counts and max\|diff\| are **identical** with fusion on and off + (0, 0, 1, 5 for B = 1, 4, 17, 64); +- neither arm's SASS contains `FFMA`. + +The conclusion rests on the second point. The opcode counts are supporting evidence +only: each variant's PTX has 2 f32 multiplies, too few to be the four tap products, so +the counters do not show which instructions compute those products. ## 5. Decode versus chunked prefill From 7862a1263e0079d4ae72fd6a7e3346d8214ef1c8 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Thu, 1 Oct 2026 20:24:02 +0000 Subject: [PATCH 30/70] docs(gdn): scope the mixed-step caveat to what was measured MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit §5 said a mixed decode-and-prefill step leaves the decode row's bf16 output equal. That holds only at TP1 head counts (H=16, HV=32). At TP4 per-rank head counts (H=4, HV=8) the same step already moves one output element (4.8e-05 relative) and 32,663 of 131,072 state elements (1.7e-07), with the same numbers for all three prefill-bearing compositions. Tabulate both head counts and state the measurement's limits: one standalone layer from config.json, synthetic parameters and cache, single process with no engine, scheduler or CUDA graph, metadata built by the test. The 4-of-20 propagation figure is TP1-only and does not carry over to real weights. Conv output and state matched bitwise, so the difference is in the recurrent kernels. vllm-project/vllm#49827's two commits on 0.30.0 close the decode-row gap at both head counts (scheduler part untested); with packed decode disabled the decode row is bitwise equal in every composition. Source: the GDN evidence branch's committed results (not yet published). Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- .../design/ws1-c6-428-gdn-recurrent-replay.md | 51 +++++++++++++------ 1 file changed, 35 insertions(+), 16 deletions(-) diff --git a/docs/design/ws1-c6-428-gdn-recurrent-replay.md b/docs/design/ws1-c6-428-gdn-recurrent-replay.md index 25febbb8c..21abba4aa 100644 --- a/docs/design/ws1-c6-428-gdn-recurrent-replay.md +++ b/docs/design/ws1-c6-428-gdn-recurrent-replay.md @@ -189,22 +189,41 @@ plateau, prefill/decode equality, or any bound on model logits. **Mixed decode-and-prefill steps (provider side).** The goldens target the decode-only path (§1). In a step that also holds a prefill, vLLM 0.30.0 sends the cached decode rows through `causal_conv1d_fn` and -`fused_sigmoid_gating_delta_rule_update` instead, so in those steps neither golden -matches what rollout runs. The two recurrent kernels do not agree bitwise. A -measurement on B200 with Qwen3-Next TP1 shapes, driving the real -`GDNAttentionMetadataBuilder.build()` and `_forward_core`, found the step's bf16 -output equal but the fp32 state different in 75,146 of 524,288 elements (8.8e-08 -relative). In 4 of 20 seeds the difference reached a bf16 output within the next 16 -decode steps. This was measured outside this change and is not yet published; treat it -as a reported observation. - -vllm-project/vllm#49827, open and unmerged, would route mixed-step *recurrent* -decodes through the packed kernel too, according to its description. It was -validated on Qwen3.5 (non-interleaved), H100, TP1, and it does not change the conv -path in mixed steps, which stays `causal_conv1d_fn`. Disabling -`VLLM_ENABLE_FLA_PACKED_RECURRENT_DECODE` instead sends every decode row through -`fused_sigmoid_gating_delta_rule_update`, and the recurrent golden's target would -have to change. +`fused_sigmoid_gating_delta_rule_update` instead, so in those steps the recurrent +golden does not target what rollout runs. + +A measurement on B200 drove the real `GDNAttentionMetadataBuilder.build()` and +`_forward_core` of **one standalone layer** built from the checkpoint's +`config.json`. Its limits: parameters and cache were synthetic (no weights loaded); it +ran in a single process, with no engine, scheduler or CUDA graph; and the test, not the +scheduler, built the attention metadata (decode rows first). For one target decode +request with an fp32 recurrent state, three prefill-bearing step compositions gave +identical numbers: + +| head counts | step's bf16 output | fp32 state | +|---|---|---| +| TP1 (H=16, HV=32) | matched | 75,146 of 524,288 elements differ (8.8e-08 relative) | +| TP4 per-rank (H=4, HV=8) | 1 element differs (4.8e-05 relative) | 32,663 of 131,072 differ (1.7e-07) | + +The convolution output and conv state matched bitwise in every composition, so the +difference comes from the recurrent kernels, not from `causal_conv1d_fn`. At TP1 the +state difference reached a bf16 output within the next 16 plain decode steps in 4 of +20 seeds; that was measured at TP1 only, and with synthetic parameters the frequency +does not carry over to real weights. At TP4 per-rank head counts it appears in the +same step's output. This is a provider-side batch-composition dependence: whether a +prefill shares the step changes a decode row's state, and at TP4 per-rank head counts +its output too, which no golden can fix. The measurement was made outside this change +and is not yet published; treat it as a reported observation. + +vllm-project/vllm#49827, open and unmerged, routes mixed-step *recurrent* decodes +through the packed kernel too. Its two commits, applied to 0.30.0, closed the gap to 0 +at both head counts above; its scheduler part was not tested. It does not change the +conv path in mixed steps, which stays `causal_conv1d_fn`, and its own validation is on +Qwen3.5 (non-interleaved), H100, TP1. Disabling +`VLLM_ENABLE_FLA_PACKED_RECURRENT_DECODE` instead sends every non-speculative decode +row through `fused_sigmoid_gating_delta_rule_update`; the same measurement found the +decode row's output and state bitwise equal in every step composition in that +configuration, and the recurrent golden's target would then have to change. The strict profile uses FP32 recurrent state. BF16 state remains a differential experiment. Full checkpoint prefill, response replay, optimizer updates and From 1d693124e6ba5d0ab24e2ecb6371e460d74e0c76 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Thu, 1 Oct 2026 22:33:35 +0000 Subject: [PATCH 31/70] fix(gdn): address the C6 review (R3 F1-4, F6, F10-14, F17, F20) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - F1: the runner's usage example writes its JSON to $TMPDIR, outside the checkout. Redirecting into the repo left an untracked file that made the next run report git_dirty: true. - F2: label the §5 mixed-step measurements and the §7 startup failure as reported observations with no checked-in runner, hence not acceptance evidence, by the same rule that withdrew the earlier tables. - F3: mark every bound in the check file as a regression bound against the provider (the drift bound: against the golden), not gate evidence, and give the contract's forward_accuracy/by_op_class/reduction row (tolerance_contract.json: fp32 1e-4/1e-4, bf16 5e-2/2e-2) for scale, in the check file and in design note §4. - F4: run tests/test_gdn_state_contract.py in ci.yml's unit-tests list. - F6: rename the note to docs/design/rfc428-c6-gdn-recurrent-replay.md, retitle it "RFC #428 C6", and write the backward item as "RFC #428 C7", so neither collides with upstream's WS1 C6 (#272) / C7 (#273). The runner's docstring was the only in-repo reference to the old path. - F10: _RECURRENT_BOUNDS is a module constant in the check file; the parametrization and the runner both read it instead of copying values. - F11: derive H, HV, K, V from qwen3_next_workload.FINGERPRINT; _CONV_DIM is _PACKED_DIM. - F12: runner provenance records rl_engine.__file__ and the FLA_USE_FAST_OPS / TRITON_DEFAULT_FP_FUSION environment. - F13: qwen3-next-provider-gpu.yml gets a header (purpose, security), concurrency, a fork-pr-notice job, and a check after the build that rl_engine._C was loaded from inside $GITHUB_WORKSPACE. - F14: the NULL_BLOCK_ID comment says <= 0 is the recurrent provider's semantics and vLLM's conv provider skips only == 0. - F17: drop two index checks in GatedDeltaRuleRecurrentStepOp that _validate_state_indices repeats. The length check could not fire; the 1-D check could, so a 2-D index now raises the validator's message ("state indices must be 1-D with one entry per sequence") instead. - F20: SPDX header on tests/test_gdn_state_contract.py. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- .github/workflows/ci.yml | 2 +- .github/workflows/qwen3-next-provider-gpu.yml | 46 ++++++++++++++++++- ...y.md => rfc428-c6-gdn-recurrent-replay.md} | 23 +++++++--- .../ops/pytorch/linear_attn/causal_conv1d.py | 2 +- .../pytorch/linear_attn/gated_delta_rule.py | 9 ++-- scripts/ws1_gdn_provider_agreement.py | 22 ++++++--- tests/check_gdn_recurrent_golden.py | 46 +++++++++++++------ tests/test_gdn_state_contract.py | 3 ++ 8 files changed, 117 insertions(+), 36 deletions(-) rename docs/design/{ws1-c6-428-gdn-recurrent-replay.md => rfc428-c6-gdn-recurrent-replay.md} (92%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5f8c900b3..814a4ae22 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -67,7 +67,7 @@ jobs: run: | python -m pytest rl_engine/tests/test_dispatch.py -v PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 python -m pytest tests/test_attention_correctness.py -q -rs - python -m pytest tests/test_forward_invariance.py tests/test_tolerance_contract.py tests/test_ws1_workload.py tests/test_gradient_invariance.py tests/test_elementwise_inventory.py tests/test_four_judgment_matrix.py tests/test_op_checks.py tests/test_operator_inputs.py tests/test_profiler.py tests/test_kv_consistency.py tests/test_ws1_qwen3_dense.py tests/test_ws1_chain_integration.py tests/test_qwen3_next_norm.py -q + python -m pytest tests/test_forward_invariance.py tests/test_tolerance_contract.py tests/test_ws1_workload.py tests/test_gradient_invariance.py tests/test_elementwise_inventory.py tests/test_four_judgment_matrix.py tests/test_op_checks.py tests/test_operator_inputs.py tests/test_profiler.py tests/test_kv_consistency.py tests/test_ws1_qwen3_dense.py tests/test_ws1_chain_integration.py tests/test_qwen3_next_norm.py tests/test_gdn_state_contract.py -q - name: Run Cross-Configuration Contract Tests (CPU-safe) run: | diff --git a/.github/workflows/qwen3-next-provider-gpu.yml b/.github/workflows/qwen3-next-provider-gpu.yml index b53c73441..146818019 100644 --- a/.github/workflows/qwen3-next-provider-gpu.yml +++ b/.github/workflows/qwen3-next-provider-gpu.yml @@ -1,3 +1,17 @@ +# SPDX-License-Identifier: Apache-2.0 +# RFC #428 Qwen3-Next provider comparisons: the C1/C3/C4 norm providers and the C6 +# GDN decode-step goldens, each checked against the real vLLM 0.30.0 provider. +# +# These check_ files import vLLM, so the default pytest collection never runs them +# (tests/test_framework_operator_integrations.py asserts vLLM is not imported). This +# workflow runs them in their own process on a self-hosted runner that a maintainer +# registers with the labels below and keeps on the audited runtime (CUDA 13, +# torch 2.13.0+cu130, vLLM 0.30.0). Without such a runner the job queues rather than +# reporting a false pass. +# +# Security: do not use pull_request_target. Fork PRs never reach the self-hosted +# runner; a maintainer dispatches the reviewed commit from a trusted branch. + name: Qwen3-Next-provider-GPU on: @@ -11,13 +25,26 @@ on: - ".github/workflows/qwen3-next-provider-gpu.yml" workflow_dispatch: +concurrency: + group: qwen3-next-provider-gpu-${{ github.ref }} + cancel-in-progress: false + permissions: contents: read jobs: + fork-pr-notice: + if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository + runs-on: ubuntu-latest + steps: + - name: Report required trusted execution + run: | + echo "Fork code does not run on the self-hosted Qwen3-Next provider runner." + echo "A maintainer must dispatch this workflow from a trusted upstream branch." + echo "source_repository=${{ github.event.pull_request.head.repo.full_name }}" + echo "source_sha=${{ github.event.pull_request.head.sha }}" + provider: - # This label must identify a maintained CUDA 13 / vLLM 0.30.0 environment. - # Never run untrusted fork PR code on the self-hosted runner. if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository runs-on: [self-hosted, linux, x64, rl-kernel-qwen3-next] timeout-minutes: 30 @@ -35,6 +62,21 @@ jobs: PY - name: Build the extension against that runtime run: python3 setup.py build_ext --inplace + - name: Require the extension built from this checkout + # A stale editable install elsewhere on the runner would otherwise satisfy the + # import and test some other tree's _C. + run: | + python3 - <<'PY' + import os + from pathlib import Path + + from rl_engine import _C + + workspace = Path(os.environ["GITHUB_WORKSPACE"]).resolve() + loaded = Path(_C.__file__).resolve() + assert workspace in loaded.parents, f"rl_engine._C loaded from {loaded}, outside {workspace}" + print("rl_engine._C:", loaded) + PY - name: Check pinned providers in their own process run: | python3 -m pytest -q tests/check_qwen3_next_norm_providers.py tests/check_gdn_recurrent_golden.py diff --git a/docs/design/ws1-c6-428-gdn-recurrent-replay.md b/docs/design/rfc428-c6-gdn-recurrent-replay.md similarity index 92% rename from docs/design/ws1-c6-428-gdn-recurrent-replay.md rename to docs/design/rfc428-c6-gdn-recurrent-replay.md index 21abba4aa..718e5ab65 100644 --- a/docs/design/ws1-c6-428-gdn-recurrent-replay.md +++ b/docs/design/rfc428-c6-gdn-recurrent-replay.md @@ -1,4 +1,4 @@ -# WS1 C6 — Qwen3-Next Gated DeltaNet recurrent replay +# RFC #428 C6 — Qwen3-Next Gated DeltaNet recurrent replay Design notes for RFC #428 work item C6 (GDN recurrent response replay) on the CUDA track. Measured on 2× B200 (sm_100), torch 2.13.0+cu130, vllm 0.30.0, @@ -119,7 +119,12 @@ The same choice is why the golden is not bitwise against the kernel's reduction. Qwen3-Next dims (H=16, HV=32, K=V=128), bf16 I/O, `use_qk_l2norm_in_kernel=True`, random inputs, B ∈ {1, 4, 17, 64}, one seed per batch. Bounds asserted by -`tests/check_gdn_recurrent_golden.py`: +`tests/check_gdn_recurrent_golden.py` (`_RECURRENT_BOUNDS`). They, and every other +bound in that file, are **regression bounds against the provider, not gate evidence**; +they do not go through `resolve_tolerance`. For scale, the gate contract's +`forward_accuracy/by_op_class/reduction` row in +`rl_engine/kernels/gtest/tolerance_contract.json` is atol = rtol = 1e-4 for float32 +and atol = 5e-2, rtol = 2e-2 for bfloat16. | | max\|diff\| out | max\|diff\| state | |---|---|---| @@ -153,7 +158,7 @@ were not limited to one BF16 ULP. The CPU tests in `tests/test_gdn_state_contrac cover bias order and bf16 product rounding, and `test_conv_provider_preserves_bf16_product_cancellation` checks the provider on a constructed cancellation input. Provider comparisons limit mismatches to 32 elements -on the checked fixtures. This is not a bitwise claim. +on the checked fixtures (a regression bound, not gate evidence). This is not a bitwise claim. Measured with the same runner and commit: the rolled conv state is bitwise equal in all 8 (batch, cache dtype) cases. Output elements differing, with an fp32 cache: @@ -192,6 +197,10 @@ cached decode rows through `causal_conv1d_fn` and `fused_sigmoid_gating_delta_rule_update` instead, so in those steps the recurrent golden does not target what rollout runs. +*The numbers in the rest of this subsection are a reported observation with no +checked-in runner in this repository. By the same rule that withdrew the tables above, +they are not acceptance evidence.* + A measurement on B200 drove the real `GDNAttentionMetadataBuilder.build()` and `_forward_core` of **one standalone layer** built from the checkpoint's `config.json`. Its limits: parameters and cache were synthetic (no weights loaded); it @@ -213,7 +222,7 @@ does not carry over to real weights. At TP4 per-rank head counts it appears in t same step's output. This is a provider-side batch-composition dependence: whether a prefill shares the step changes a decode row's state, and at TP4 per-rank head counts its output too, which no golden can fix. The measurement was made outside this change -and is not yet published; treat it as a reported observation. +and is not yet published. vllm-project/vllm#49827, open and unmerged, routes mixed-step *recurrent* decodes through the packed kernel too. Its two commits, applied to 0.30.0, closed the gap to 0 @@ -245,7 +254,7 @@ Not covered, with reasons: | deferred | why | |---|---| | Speculative decode / MTP | RFC #428 §2.2 excludes speculative decoding from the first claim. Qwen3-Next's MTP head ships in the checkpoint (`mtp.*`, loaded by `model_executor/models/qwen3_next_mtp.py`) and is full attention (`qwen3_next_mtp.py:90-92`). Enabling it changes the target model's GDN path in steps that carry draft tokens (§1); `fused_gdn_decode_post_conv_mtp` is unreachable for Qwen3-Next | -| Backward for the recurrent step | RFC #428 §2.2 item 4: backward need not match rollout, only be correct for the replayed forward. RFC §9.1 makes it a separate work item, **C7** (GDN backward/recompute adapter including prompt-state gradient). `supports_backward=false` here; `_softplus`'s NaN-gradient fix (`08969ac`) adds no backward claim | +| Backward for the recurrent step | RFC #428 §2.2 item 4: backward need not match rollout, only be correct for the replayed forward. RFC §9.1 makes it a separate work item, **RFC #428 C7** (GDN backward/recompute adapter including prompt-state gradient). `supports_backward=false` here; `_softplus`'s NaN-gradient fix (`08969ac`) adds no backward claim | | Provider bridge / registry entry | the golden should survive a drift sweep against a real checkpoint first | | Paged block allocation policy | the ABI is mirrored; the allocator is not modelled | | TP sharding of `A_log` / `dt_bias` | single card only | @@ -264,4 +273,6 @@ synchronization and checkpoint reload. No operator-level test closes these gates The 2026-09-30 real-checkpoint startup attempt with vLLM 0.30.0 failed before inference: `VLLM batch_invariant mode is not supported for GDN_ATTN`. A shared -provider integration must resolve this; disabling the check is not L2 evidence. +provider integration must resolve this; disabling the check is not L2 evidence. *This +failure is a reported observation: the attempt's log and launcher are not checked into +this repository, so it is not acceptance evidence either.* diff --git a/rl_engine/kernels/ops/pytorch/linear_attn/causal_conv1d.py b/rl_engine/kernels/ops/pytorch/linear_attn/causal_conv1d.py index fb171af49..99036f6de 100644 --- a/rl_engine/kernels/ops/pytorch/linear_attn/causal_conv1d.py +++ b/rl_engine/kernels/ops/pytorch/linear_attn/causal_conv1d.py @@ -36,7 +36,7 @@ class CausalConv1dUpdateOp: ``conv_state`` ``[num_blocks, dim, W-1]`` paged; ``dim_first`` layout ``weight`` ``[dim, W]`` ``bias`` ``[dim]`` or ``None`` - ``indices`` ``[B]`` ``<= 0`` skips + ``indices`` ``[B]`` ``<= 0`` skips (vLLM: ``== 0``) ============== ========================== ========================== Returns ``(out, conv_state)``; the state is updated out of place. diff --git a/rl_engine/kernels/ops/pytorch/linear_attn/gated_delta_rule.py b/rl_engine/kernels/ops/pytorch/linear_attn/gated_delta_rule.py index e2af3a0c3..27708f319 100644 --- a/rl_engine/kernels/ops/pytorch/linear_attn/gated_delta_rule.py +++ b/rl_engine/kernels/ops/pytorch/linear_attn/gated_delta_rule.py @@ -42,7 +42,10 @@ __all__ = ["GatedDeltaRuleRecurrentStepOp", "NULL_BLOCK_ID", "SOFTPLUS_THRESHOLD"] -#: Paged-state sentinel: a sequence pointing here is skipped. +#: Paged-state sentinel. Both goldens skip a row whose index is ``<= NULL_BLOCK_ID``: +#: that is the recurrent provider's semantics (``state_idx <= 0``). vLLM's conv +#: provider skips only ``== null_block_id`` (0), so a negative index is a real index +#: there; see the design note's NULL_BLOCK_ID table. NULL_BLOCK_ID = 0 #: Above this, softplus is the identity (matches the kernel's constexpr). @@ -240,8 +243,6 @@ def _step( raise ValueError(f"mixed_qkv must be 2-D [B, D], got {tuple(mixed_qkv.shape)}") if state.dim() != 4: raise ValueError(f"state must be 4-D [num_blocks, HV, V, K], got {tuple(state.shape)}") - if ssm_state_indices.dim() != 1: - raise ValueError("ssm_state_indices must be 1-D [B] for packed decode") batch = mixed_qkv.shape[0] hv, v_dim, k_dim = state.shape[-3:] @@ -278,8 +279,6 @@ def _step( f"mixed_qkv last dim must be {expected} (q|k|v packed), " f"got {mixed_qkv.shape[1]}" ) - if ssm_state_indices.shape[0] != batch: - raise ValueError("ssm_state_indices must have one entry per sequence") group = hv // heads qkv32 = mixed_qkv.float() diff --git a/scripts/ws1_gdn_provider_agreement.py b/scripts/ws1_gdn_provider_agreement.py index 539fa9979..83727fdb5 100644 --- a/scripts/ws1_gdn_provider_agreement.py +++ b/scripts/ws1_gdn_provider_agreement.py @@ -4,9 +4,9 @@ """Measure how closely the GDN decode-step goldens track vLLM's providers (RFC #428 C6). -``tests/check_gdn_recurrent_golden.py`` asserts loose bounds; this runner prints the -measured values behind them, so the numbers quoted in -``docs/design/ws1-c6-428-gdn-recurrent-replay.md`` can be reproduced. Inputs and seeds +``tests/check_gdn_recurrent_golden.py`` asserts loose regression bounds; this runner +prints the measured values behind them, so the numbers quoted in +``docs/design/rfc428-c6-gdn-recurrent-replay.md`` can be reproduced. Inputs and seeds are the check file's own helpers, imported from it rather than copied. Three measurements, emitted as one JSON document on stdout: @@ -29,9 +29,11 @@ fusion off it passes ``--fmad=false`` to ptxas. A PTX with no ``fma.rn.f32`` can still run FMAs. ``fusion_check`` reports whether each arm compiled what it claims to. -Requires CUDA and vLLM 0.30.0. Run it from a clean checkout so ``git_dirty`` is false: +Requires CUDA and vLLM 0.30.0. Run it from a clean checkout so ``git_dirty`` is false, +and write the result outside the checkout: an untracked file inside it would itself +make the next run report ``git_dirty: true``. - python scripts/ws1_gdn_provider_agreement.py > gdn_provider_agreement.json + python scripts/ws1_gdn_provider_agreement.py > "${TMPDIR:-/tmp}/gdn_provider_agreement.json" """ from __future__ import annotations @@ -57,6 +59,9 @@ _CHECK_FILE = REPO_ROOT / "tests" / "check_gdn_recurrent_golden.py" _STATE_DTYPES = {"fp32": torch.float32, "bf16": torch.bfloat16} _INT_VIEW = {2: torch.int16, 4: torch.int32} +# FLA_USE_FAST_OPS swaps the kernel's exp/log for fast_expf/fast_logf; +# TRITON_DEFAULT_FP_FUSION decides whether ptxas may contract mul/add. +_PROVENANCE_ENV = ("FLA_USE_FAST_OPS", "TRITON_DEFAULT_FP_FUSION") # Opcode patterns. PTX: a rounding-qualified op (".rn") may not be contracted by ptxas; # the plain form may. SASS: count opcode tokens, including modifiers such as FFMA.FTZ. _PTX_OPS = { @@ -102,11 +107,16 @@ def _provenance() -> dict[str, Any]: import triton import vllm + import rl_engine + status = _git("status", "--porcelain") return { # None means "unknown" (no git, or not a checkout), never "clean". "git_commit": _git("rev-parse", "HEAD"), "git_dirty": None if status is None else bool(status), + # Which tree was imported, and the env knobs that change the provider's code. + "rl_engine_file": rl_engine.__file__, + "env": {key: os.environ.get(key) for key in _PROVENANCE_ENV}, "python": platform.python_version(), "torch": torch.__version__, "triton": triton.__version__, @@ -118,7 +128,7 @@ def _provenance() -> dict[str, Any]: def _measure_recurrent(check, batches: list[int]) -> list[dict[str, Any]]: - bounds = {"fp32": (1e-3, 1e-5), "bf16": (1e-3, 5e-3)} # check file :117, :120 + bounds = {name: check._RECURRENT_BOUNDS[dtype] for name, dtype in _STATE_DTYPES.items()} rows = [] for batch in batches: for name, state_dtype in _STATE_DTYPES.items(): diff --git a/tests/check_gdn_recurrent_golden.py b/tests/check_gdn_recurrent_golden.py index 103098fc5..7815939c0 100644 --- a/tests/check_gdn_recurrent_golden.py +++ b/tests/check_gdn_recurrent_golden.py @@ -37,13 +37,33 @@ pytestmark = pytest.mark.skipif(not torch.cuda.is_available(), reason="CUDA is required") from rl_engine.kernels.ops.pytorch.linear_attn import GatedDeltaRuleRecurrentStepOp # noqa: E402 +from rl_engine.testing.qwen3_next_workload import FINGERPRINT # noqa: E402 -# Qwen3-Next-80B-A3B-Instruct: linear_num_key_heads / linear_num_value_heads / -# linear_key_head_dim / linear_value_head_dim. -_H, _HV, _K, _V = 16, 32, 128, 128 +# Qwen3-Next-80B-A3B-Instruct dims, from the pinned checkpoint fingerprint. +_H = FINGERPRINT["linear_num_key_heads"] +_HV = FINGERPRINT["linear_num_value_heads"] +_K = FINGERPRINT["linear_key_head_dim"] +_V = FINGERPRINT["linear_value_head_dim"] _SCALE = _K**-0.5 _PACKED_DIM = _H * _K * 2 + _HV * _V +# Every bound in this file is a regression bound against the vLLM provider (or, for +# the bf16-state drift test, against the golden itself), set from measurements. None +# is gate evidence, and none goes through rl_engine.kernels.gtest.tolerance's +# resolve_tolerance. For scale, the gate contract's +# forward_accuracy/by_op_class/reduction row in +# rl_engine/kernels/gtest/tolerance_contract.json is atol = rtol = 1e-4 for float32 +# and atol = 5e-2, rtol = 2e-2 for bfloat16. +# +# (max|d out|, max|d state|) per recurrent-state dtype. Read by +# scripts/ws1_gdn_provider_agreement.py, so the runner reports against the same values. +_RECURRENT_BOUNDS = { + # fp32 state: agreement is at fp32-ULP scale. + torch.float32: (1e-3, 1e-5), + # bf16 state: the store rounds every token, so the state carries a bf16 ULP. + torch.bfloat16: (1e-3, 5e-3), +} + def _vllm_step(): pytest.importorskip("vllm", reason="vLLM is required to compare against the provider") @@ -110,17 +130,9 @@ def _run_golden(inp): # 1. Against the provider # --------------------------------------------------------------------------- # @pytest.mark.parametrize("batch", [1, 4, 17, 64]) -@pytest.mark.parametrize( - "state_dtype, out_atol, state_atol", - [ - # fp32 state: agreement is at fp32-ULP scale. - (torch.float32, 1e-3, 1e-5), - # bf16 state: the store rounds every token, so the state carries a - # bf16 ULP. This is the configuration knob behind the drift probe. - (torch.bfloat16, 1e-3, 5e-3), - ], -) -def test_golden_matches_packed_decode_provider(batch, state_dtype, out_atol, state_atol): +@pytest.mark.parametrize("state_dtype", list(_RECURRENT_BOUNDS), ids=["fp32", "bf16"]) +def test_golden_matches_packed_decode_provider(batch, state_dtype): + out_atol, state_atol = _RECURRENT_BOUNDS[state_dtype] inp = _inputs(batch, batch + 2, state_dtype, torch.bfloat16, seed=batch) out_ref, state_ref = _run_provider(inp) out_got, state_got = _run_golden(inp) @@ -207,6 +219,7 @@ def test_bf16_state_rounding_stays_within_fixed_fixture_bound(): assert drift[0] > 0.0, "a bf16 state must round on the very first store" # Preserve the original regression bound for this fixed fixture. + # Regression bound for this fixture, golden against golden; not gate evidence. assert max(drift) < 0.05, f"relative state drift reached {max(drift):.3e}" # The back half must not be materially worse than the front half. assert max(drift[steps // 2 :]) < 2.0 * max(drift[: steps // 2]) + 1e-3 @@ -215,7 +228,8 @@ def test_bf16_state_rounding_stays_within_fixed_fixture_bound(): # --------------------------------------------------------------------------- # # 4. The causal-conv1d state update, the other half of a decode step # --------------------------------------------------------------------------- # -_CONV_DIM, _CONV_WIDTH = 8192, 4 # Qwen3-Next: key_dim*2 + value_dim, linear_conv_kernel_dim +# The conv runs over the packed q|k|v channels; Qwen3-Next's linear_conv_kernel_dim is 4. +_CONV_DIM, _CONV_WIDTH = _PACKED_DIM, 4 def _conv_update(): @@ -294,6 +308,7 @@ def test_conv_output_matches_provider_with_fp32_cache(batch): inp = _conv_inputs(batch, torch.float32, seed=batch) (out_ref, _), (out_got, _) = _run_conv_pair(inp) mismatch = int((out_got.float().view(torch.int32) != out_ref.float().view(torch.int32)).sum()) + # Regression bounds against the provider, not gate evidence (see the module note). assert mismatch <= 32, f"{mismatch} of {out_got.numel()} elements differ" assert (out_got.float() - out_ref.float()).abs().max().item() <= 1e-2 @@ -303,6 +318,7 @@ def test_conv_output_bf16_cache_matches_rounded_product_path(batch): """Product rounding is reproduced; activation ULP residuals remain allowed.""" inp = _conv_inputs(batch, torch.bfloat16, seed=batch) (out_ref, _), (out_got, _) = _run_conv_pair(inp) + # Regression bounds against the provider, not gate evidence (see the module note). assert (out_got.float() - out_ref.float()).abs().max().item() <= 7e-2 assert int((out_got != out_ref).sum()) <= 32 diff --git a/tests/test_gdn_state_contract.py b/tests/test_gdn_state_contract.py index 70255bb0d..7af1e083d 100644 --- a/tests/test_gdn_state_contract.py +++ b/tests/test_gdn_state_contract.py @@ -1,3 +1,6 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + """Provider-independent cache contracts, collected in the ordinary CPU suite.""" import pytest From c0ab21c20abacb0627e07df45fb49c5d6ebd3fc2 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Thu, 1 Oct 2026 23:35:23 +0000 Subject: [PATCH 32/70] docs(gdn): refresh the design note's in-repo line references f128870 added three comment lines above NULL_BLOCK_ID and an SPDX header to tests/test_gdn_state_contract.py, and the gated merge (c4b451c) rewrote the docstring of the env-default test in tests/check_qwen3_next_norm_providers.py, so four references pointed at the wrong lines: - gated_delta_rule.py:107-109 -> :110-112 (_softplus body) - gated_delta_rule.py:73-87 -> :76-90 (_chunked_sum) - tests/test_gdn_state_contract.py:51-56 -> :54-59 (inactive-index test) - check_qwen3_next_norm_providers.py:124-131 -> :129-142 (env-default assert) The golden causal_conv1d.py:167-177 reference is still right. vLLM-package references are unaffected. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- docs/design/rfc428-c6-gdn-recurrent-replay.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/design/rfc428-c6-gdn-recurrent-replay.md b/docs/design/rfc428-c6-gdn-recurrent-replay.md index 718e5ab65..4b9ca767e 100644 --- a/docs/design/rfc428-c6-gdn-recurrent-replay.md +++ b/docs/design/rfc428-c6-gdn-recurrent-replay.md @@ -48,7 +48,7 @@ explicitly set to `cuda` (`:516-519`). As a consequence the fused `_can_use_fused_gdn_mtp_decode` requires `gdn_decode_kernel == "cuda"` (`:1834`). This section is read from the source. -`tests/check_qwen3_next_norm_providers.py` asserts both env defaults (`:124-131`). For +`tests/check_qwen3_next_norm_providers.py` asserts both env defaults (`:129-142`). For `VLLM_ENABLE_FLA_PACKED_RECURRENT_DECODE` that is a useful guard: a vLLM bump that flips it fails loudly. For `VLLM_GDN_DECODE_KERNEL` it guards nothing for Qwen3-Next, because the interleaved layout, not the default, decides the kernel. Neither @@ -75,7 +75,7 @@ Where the golden is **not** a transcription: - softplus: the kernel computes `tl.log(1.0 + tl.exp(x))` (`fused_recurrent.py:327`); the golden computes `torch.log1p(torch.exp(safe))`, where `safe` is `x` on the taken - branch (`gated_delta_rule.py:107-109`). These round differently. + branch (`gated_delta_rule.py:110-112`). These round differently. - The kernel's `exp`/`log` become `fast_expf`/`fast_logf` when `FLA_USE_FAST_OPS=1` (`third_party/flash_linear_attention/ops/op.py:16-25`). The golden models the default. @@ -106,10 +106,10 @@ Mirrored rather than reinvented: | state block | not touched | not touched | not touched | A negative conv index is therefore inactive in the golden -(`tests/test_gdn_state_contract.py:51-56`) but a real, out-of-range index to the conv +(`tests/test_gdn_state_contract.py:54-59`) but a real, out-of-range index to the conv provider. -Contractions use `_chunked_sum` (`gated_delta_rule.py:73-87`): fixed 32-wide chunks, +Contractions use `_chunked_sum` (`gated_delta_rule.py:76-90`): fixed 32-wide chunks, so the reduction shape per row does not depend on the batch size, rather than `torch.matmul`, whose reduction order is unspecified. That is the argument for the L1 claim; L1 itself is established empirically by `test_golden_is_batch_invariant`. From f8d93993d809ded2dc65391ac745bf5a32ca4da2 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Fri, 2 Oct 2026 02:22:32 +0000 Subject: [PATCH 33/70] feat(gdn): localise the fp32-cache conv mismatches in the C6 runner The runner reported that a few conv outputs differ from vLLM with an fp32 cache but not why. Add two sections, reusing its inputs, provenance and the fusion-off child process: - conv_silu (fusion on): the conv inputs widened to fp32, fp32 cache and output. Compares the pre-activation values (activation off), the SiLU outputs with a ULP histogram, and four Triton SiLU formulations -- x / (1 + tl.exp(-x)) as in the provider, and the variants with div_rn and/or libdevice.exp -- applied to the golden's pre-activation values, each compared bitwise with both sides. - conv_noact_bf16 (fusion on and off): the no-activation conv with a bf16 output against the golden, whether it equals its fp32-output twin rounded to bf16, each mismatch's magnitude and size in bf16 ULPs, and the compiled variants of both specializations. The two run in separate loops so the variants each one adds can be told apart. The PTX counts gain the packed f32x2 forms, ex2.approx and div.full.f32. fusion_check now covers every variant an arm compiles. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- scripts/ws1_gdn_provider_agreement.py | 234 +++++++++++++++++++++++--- 1 file changed, 212 insertions(+), 22 deletions(-) diff --git a/scripts/ws1_gdn_provider_agreement.py b/scripts/ws1_gdn_provider_agreement.py index 83727fdb5..715cd5627 100644 --- a/scripts/ws1_gdn_provider_agreement.py +++ b/scripts/ws1_gdn_provider_agreement.py @@ -9,7 +9,7 @@ ``docs/design/rfc428-c6-gdn-recurrent-replay.md`` can be reproduced. Inputs and seeds are the check file's own helpers, imported from it rather than copied. -Three measurements, emitted as one JSON document on stdout: +Measurements, emitted as one JSON document on stdout: * ``recurrent``: provider vs golden for the packed recurrent decode, per (batch, state dtype): max|d out|, max|d state| and bitwise mismatch counts. @@ -18,6 +18,13 @@ * ``conv`` again with Triton FP fusion disabled, plus ``conv_kernels``: per compiled variant of the provider's conv-update kernel, its ``enable_fp_fusion`` option and instruction counts from the PTX and from the SASS. +* ``conv_silu`` localises the fp32-cache conv mismatches, on the same inputs widened to + fp32 with an fp32 output: the pre-activation comparison (activation off), the SiLU + comparison with its ULP histogram, and four Triton SiLU variants applied to the + golden's pre-activation values, each compared bitwise with both sides. +* ``conv_noact_bf16``: the no-activation, bf16-output specialization against the golden, + whether it equals the fp32-output run rounded to bf16, each mismatch's size, and the + compiled variants of both specializations; with fusion on and off. The fusion-off arm runs in a child process with ``TRITON_DEFAULT_FP_FUSION=0`` and a private ``TRITON_CACHE_DIR``. Flipping ``triton.knobs.language.default_fp_fusion`` @@ -41,6 +48,7 @@ import argparse import importlib.util import json +import math import os import platform import re @@ -70,8 +78,16 @@ "add_f32": r"\badd\.f32\b", "mul_rn_f32": r"\bmul\.rn\.f32\b", "add_rn_f32": r"\badd\.rn\.f32\b", + # Packed pairs (sm_100), approximate exp and division. + "fma_rn_f32x2": r"\bfma\.rn\.f32x2\b", + "mul_f32x2": r"\bmul(\.rn)?\.f32x2\b", + "add_f32x2": r"\badd(\.rn)?\.f32x2\b", + "ex2_approx": r"\bex2\.approx", + "div_full_f32": r"\bdiv\.full\.f32\b", } _SASS_OPS = {"FFMA": r"\bFFMA[\w.]*", "FMUL": r"\bFMUL[\w.]*", "FADD": r"\bFADD[\w.]*"} +# Triton SiLU variants for conv_silu, by MODE of _triton_silu's kernel. +_SILU_VARIANTS = ("div_exp", "divrn_exp", "div_libexp", "divrn_libexp") def _load_check_module(): @@ -181,34 +197,203 @@ def _count(patterns: dict[str, str], text: str) -> dict[str, int]: return {name: len(re.findall(pattern, text)) for name, pattern in patterns.items()} -def _conv_kernel_variants() -> list[dict[str, Any]] | dict[str, str]: - """Options and instruction counts per compiled variant of the conv-update kernel.""" - try: - from vllm.model_executor.layers.mamba.ops import causal_conv1d as conv_module +def _compiled_conv_variants() -> dict[tuple[str, Any], Any]: + """Every compiled variant of vLLM's conv-update kernel in this process, by cache key.""" + from vllm.model_executor.layers.mamba.ops import causal_conv1d as conv_module + + kernel = conv_module._causal_conv1d_update_kernel + while not hasattr(kernel, "device_caches") and hasattr(kernel, "fn"): + kernel = kernel.fn + return { + (str(device), key): compiled + for device, cache in kernel.device_caches.items() + for key, compiled in cache[0].items() + } + - kernel = conv_module._causal_conv1d_update_kernel - while not hasattr(kernel, "device_caches") and hasattr(kernel, "fn"): - kernel = kernel.fn +def _conv_kernel_variants(keys: Any = None) -> list[dict[str, Any]] | dict[str, str]: + """Options and instruction counts per compiled variant (only ``keys``, if given).""" + try: variants = [] - for device, cache in kernel.device_caches.items(): - for compiled in cache[0].values(): - row: dict[str, Any] = { - "device": str(device), - "enable_fp_fusion": getattr(compiled.metadata, "enable_fp_fusion", None), - "ptx": _count(_PTX_OPS, compiled.asm["ptx"]), - } - try: - row["sass"] = _count(_SASS_OPS, compiled.asm["sass"]) - except Exception as exc: # needs cuobjdump; report, do not fail - row["sass"] = {"unavailable": f"{type(exc).__name__}: {exc}"} - variants.append(row) + for (device, key), compiled in _compiled_conv_variants().items(): + if keys is not None and (device, key) not in keys: + continue + row: dict[str, Any] = { + "device": device, + "enable_fp_fusion": getattr(compiled.metadata, "enable_fp_fusion", None), + "ptx": _count(_PTX_OPS, compiled.asm["ptx"]), + } + try: + row["sass"] = _count(_SASS_OPS, compiled.asm["sass"]) + except Exception as exc: # needs cuobjdump; report, do not fail + row["sass"] = {"unavailable": f"{type(exc).__name__}: {exc}"} + variants.append(row) return variants except Exception as exc: # introspection of Triton internals; report, do not fail return {"unavailable": f"{type(exc).__name__}: {exc}"} +def _new_variant_keys(before: set[Any]) -> set[Any] | None: + try: + return set(_compiled_conv_variants()) - before + except Exception: # introspection of Triton internals; report, do not fail + return None + + +def _bf16_ulps(diff: float, ref: float) -> float | None: + """``diff`` in units of one bf16 ULP at the magnitude of ``ref`` (None at zero).""" + if ref == 0.0: + return None if diff else 0.0 + return diff / 2.0 ** (math.floor(math.log2(abs(ref))) - 7) + + +def _conv_noact_bf16(check, batches: list[int]) -> dict[str, Any]: + """The no-activation conv with a bf16 output, against its fp32-output twin. + + The provider casts x to the fp32 cache dtype before launching, so the two runs + compute the same thing and differ only in the output dtype, i.e. in which Triton + specialization runs. Each specialization runs in its own loop so that the compiled + variants it adds can be told apart. + """ + import triton + + fp_fusion = bool(triton.knobs.language.default_fp_fusion) + try: + before = set(_compiled_conv_variants()) + except Exception: # introspection of Triton internals; report, do not fail + before = set() + bf16_out = {} + for batch in batches: + inp = check._conv_inputs(batch, torch.float32, seed=batch) + bf16_out[batch] = check._run_conv_pair(inp, activation=None) + bf16_keys = _new_variant_keys(before) + fp32_out = {} + for batch in batches: + inp = check._conv_inputs(batch, torch.float32, seed=batch) + fp32_out[batch] = check._run_conv_pair(dict(inp, x=inp["x"].float()), activation=None) + fp32_keys = _new_variant_keys(before | (bf16_keys or set())) + + rows = [] + for batch in batches: + (b_ref, _), (b_got, _) = bf16_out[batch] + (d_ref, _), (d_got, _) = fp32_out[batch] + differ = torch.nonzero(b_ref.view(torch.int16) != b_got.view(torch.int16)).tolist() + mismatches = [] + for r, ch in differ: + provider, golden = b_ref[r, ch].item(), b_got[r, ch].item() + mismatches.append( + { + "abs_out": abs(golden), + "abs_diff": abs(provider - golden), + "bf16_ulps": _bf16_ulps(abs(provider - golden), golden), + } + ) + rows.append( + { + "batch": batch, + "fp_fusion": fp_fusion, + "out_mismatch_elements": len(differ), + "out_elements": b_ref.numel(), + "provider_eq_rne_of_fp32_out": torch.equal(b_ref, d_ref.to(torch.bfloat16)), + "fp32_out_mismatch_elements": _bit_mismatches(d_got, d_ref), + "mismatches": mismatches, + } + ) + return { + "batches": rows, + "bf16_out_kernels": _conv_kernel_variants(bf16_keys) if bf16_keys is not None else None, + "fp32_out_kernels": _conv_kernel_variants(fp32_keys) if fp32_keys is not None else None, + } + + +def _triton_silu(): + """``apply(x, mode)``: one of the four SiLU formulations, evaluated by Triton.""" + import triton + import triton.language as tl + from triton.language.extra import libdevice + + @triton.jit + def silu(x_ptr, y_ptr, n, MODE: tl.constexpr, BLOCK: tl.constexpr): + offs = tl.program_id(0) * BLOCK + tl.arange(0, BLOCK) + mask = offs < n + x = tl.load(x_ptr + offs, mask=mask, other=0.0) + if MODE == 0: # the provider's source: x / (1 + tl.exp(-x)) + y = x / (1 + tl.exp(-x)) + elif MODE == 1: + y = tl.math.div_rn(x, 1 + tl.exp(-x)) + elif MODE == 2: + y = x / (1 + libdevice.exp(-x)) + else: + y = tl.math.div_rn(x, 1 + libdevice.exp(-x)) + tl.store(y_ptr + offs, y, mask=mask) + + def apply(x: torch.Tensor, mode: int) -> torch.Tensor: + flat = x.contiguous().view(-1) + y = torch.empty_like(flat) + silu[(triton.cdiv(flat.numel(), 1024),)](flat, y, flat.numel(), MODE=mode, BLOCK=1024) + return y.view_as(x) + + return apply + + +def _ulp_histogram(a: torch.Tensor, b: torch.Tensor) -> dict[str, int]: + """Differing fp32 elements by bit-pattern distance.""" + d = (a.contiguous().view(torch.int32).long() - b.contiguous().view(torch.int32).long()).abs() + d = d[d != 0] + return { + "1": int((d == 1).sum()), + "2": int((d == 2).sum()), + "3-4": int(((d == 3) | (d == 4)).sum()), + ">4": int((d > 4).sum()), + } + + +def _conv_silu(check, batches: list[int]) -> list[dict[str, Any]]: + """Where the fp32-cache conv mismatches come from, on fp32 inputs and outputs.""" + silu = _triton_silu() + rows = [] + for batch in batches: + inp = check._conv_inputs(batch, torch.float32, seed=batch) + inp32 = dict(inp, x=inp["x"].float()) # the same values, kept in fp32 throughout + (pre_ref, _), (pre_got, _) = check._run_conv_pair(inp32, activation=None) + (out_ref, _), (out_got, _) = check._run_conv_pair(inp32) + variants = {name: silu(pre_got, mode) for mode, name in enumerate(_SILU_VARIANTS)} + rows.append( + { + "batch": batch, + "elements": out_ref.numel(), + "preactivation_mismatch_elements": _bit_mismatches(pre_got, pre_ref), + "silu_mismatch_elements": _bit_mismatches(out_got, out_ref), + "silu_ulp_histogram": _ulp_histogram(out_got, out_ref), + # Applied to the golden's pre-activation values. + "triton_silu_vs_provider": { + k: _bit_mismatches(v, out_ref) for k, v in variants.items() + }, + "triton_silu_vs_golden": { + k: _bit_mismatches(v, out_got) for k, v in variants.items() + }, + } + ) + return rows + + def _conv_report(check, batches: list[int]) -> dict[str, Any]: - return {"conv": _measure_conv(check, batches), "conv_kernels": _conv_kernel_variants()} + conv = _measure_conv(check, batches) + kernels = _conv_kernel_variants() # before the no-activation runs add their own + return { + "conv": conv, + "conv_kernels": kernels, + "conv_noact_bf16": _conv_noact_bf16(check, batches), + } + + +def _arm_variants(arm: dict[str, Any]) -> list[Any] | None: + """Every compiled variant an arm reports, or None if any listing is unavailable.""" + noact = arm["conv_noact_bf16"] + lists = [arm["conv_kernels"], noact["bf16_out_kernels"], noact["fp32_out_kernels"]] + if not all(isinstance(x, list) for x in lists): + return None + return [v for x in lists for v in x] def _conv_report_without_fusion(batches: str) -> dict[str, Any]: @@ -284,17 +469,22 @@ def main() -> int: "batches": batches, "recurrent": "bf16 I/O, use_qk_l2norm_in_kernel=True, num_blocks=batch+2", "conv": "bias=True, activation=silu, dim_first=True, W=4, dim=8192", + "conv_silu": "the conv inputs with x widened to fp32; fp32 cache and output", + "conv_noact_bf16": "the conv inputs with activation=None; fp32 cache", }, "recurrent": _measure_recurrent(check, batches), } fused = _conv_report(check, batches) report["conv"] = fused["conv"] report["conv_kernels"] = {"fusion_on": fused["conv_kernels"]} + report["conv_noact_bf16"] = {"fusion_on": fused["conv_noact_bf16"]} + report["conv_silu"] = _conv_silu(check, batches) if not args.skip_fusion_off: unfused = _conv_report_without_fusion(args.batches) report["conv"] += unfused["conv"] report["conv_kernels"]["fusion_off"] = unfused["conv_kernels"] - report["fusion_check"] = _fusion_check(fused["conv_kernels"], unfused["conv_kernels"]) + report["conv_noact_bf16"]["fusion_off"] = unfused["conv_noact_bf16"] + report["fusion_check"] = _fusion_check(_arm_variants(fused), _arm_variants(unfused)) print(json.dumps(report, indent=2, sort_keys=True)) return 0 From 610f1b7d8f8ba807ad4a0714c588a2a80a48eaed Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Fri, 2 Oct 2026 02:36:59 +0000 Subject: [PATCH 34/70] docs(gdn): state the conv mismatch causes, measured by the runner MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit §4 said FP contraction was ruled out and the cause of the few fp32-cache conv mismatches was not determined. The runner's conv_silu and conv_noact_bf16 sections (bb89750) now settle both, on B200: - With SiLU (Qwen3-Next's configuration): everything before the activation matches bitwise; the mismatches come from Triton lowering the activation's exp and division to ex2.approx and div.full.f32, where the golden matches libdevice exp with IEEE division. Triton's x / (1 + tl.exp(-x)) on the golden's pre-activation values reproduces the provider bitwise. No FFMA, and fusion off changes nothing, so "contraction ruled out" now holds for this path only. - Without an activation and with a bf16 output: that specialization does contract the tap multiply-adds (fma.rn.f32x2 / FFMA); its fp32-output twin does not and matches bitwise. 1/0/4/14 mismatches, mostly near-cancelling outputs; 0 with TRITON_DEFAULT_FP_FUSION=0. Not on Qwen3-Next's decode path. The recurrent provider's Triton exp/sigmoid is noted as open. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- docs/design/rfc428-c6-gdn-recurrent-replay.md | 59 +++++++++++++------ 1 file changed, 42 insertions(+), 17 deletions(-) diff --git a/docs/design/rfc428-c6-gdn-recurrent-replay.md b/docs/design/rfc428-c6-gdn-recurrent-replay.md index 4b9ca767e..31475af42 100644 --- a/docs/design/rfc428-c6-gdn-recurrent-replay.md +++ b/docs/design/rfc428-c6-gdn-recurrent-replay.md @@ -166,23 +166,48 @@ all 8 (batch, cache dtype) cases. Output elements differing, with an fp32 cache: 5 / 524288 (B=64, max|diff| 3.91e-03). With a bf16 cache: 0 at B=1, 4 and 17, and 3 / 524288 at B=64 (max|diff| 1.56e-02). -**FP contraction is ruled out** as the cause of the few differing fp32-cache -elements; what does cause them is **not determined**. The candidate was that, with -Triton's default `enable_fp_fusion=True`, ptxas contracts the provider's -`acc += matrix_x * matrix_w` (vLLM `causal_conv1d.py:1061`) into an `FFMA`, whereas the -golden rounds the product first. The runner tests this by rerunning the comparison in -a child process compiled with fusion off. On B200 at commit `cf6be1a`: - -- the fusion-off arm took effect: all 6 compiled variants carry - `enable_fp_fusion=False`, and their PTX has only `.rn`-qualified f32 `mul`/`add`, - which ptxas may not contract; -- the mismatch counts and max\|diff\| are **identical** with fusion on and off - (0, 0, 1, 5 for B = 1, 4, 17, 64); -- neither arm's SASS contains `FFMA`. - -The conclusion rests on the second point. The opcode counts are supporting evidence -only: each variant's PTX has 2 f32 multiplies, too few to be the four tap products, so -the counters do not show which instructions compute those products. +**Why a few fp32-cache outputs differ.** There are two mechanisms, both on the provider +side, and which one applies depends on the Triton specialization. Measured by +`scripts/ws1_gdn_provider_agreement.py` (`conv_silu`, `conv_noact_bf16`) on B200 at commit +`bb89750`: + +*With SiLU -- Qwen3-Next's configuration and the check file's -- the activation's +implementation.* + +- With the activation off and the output kept in fp32, provider and golden agree bitwise + on every element at B = 1, 4, 17 and 64: the cast to the cache dtype, the bias start, + the product rounding and the tap order all match. +- Both sides compute `acc / (1 + exp(-acc))` (vLLM `causal_conv1d.py:1085`), but Triton + lowers the exp and the fp32 division to `ex2.approx` and `div.full.f32`, while the + golden's PyTorch result equals the same expression with `libdevice.exp` and IEEE + division (`div_rn`). Applying Triton's `x / (1 + tl.exp(-x))` to the golden's + pre-activation values reproduces the provider's fp32 output bitwise; replacing only the + exp, or only the division, reproduces neither side. +- In fp32 about 38% of outputs differ: 86% of those by 1 ULP, 12% by 2, 3% by 3 or 4, + 0.2% by more. Only values on opposite sides of a bf16 rounding midpoint survive the bf16 + store: 0, 0, 1 and 5 elements, each one bf16 ULP apart. +- FP contraction plays no part on this path. These specializations compute the tap + products as packed `mul.f32x2` with separate adds and contain no `FFMA`; recompiling + with `TRITON_DEFAULT_FP_FUSION=0` leaves every count unchanged. + +*Without an activation and with a bf16 output -- FP contraction.* + +- With fusion at its default, this specialization contracts each tap's multiply-add + (`fma.rn.f32x2` in the PTX, `FFMA` in the SASS). Its fp32-output twin computes the same + values (the provider casts x to the fp32 cache dtype first) but is not contracted, and + matches the golden bitwise. +- The bf16 outputs differ in 1, 0, 4 and 14 elements (max |diff| 3.9e-3). 18 of the 19 + have |out| < 0.11, where the taps nearly cancel; there the gap can span several bf16 + ULPs (up to 96 at |out| ≈ 2.4e-7) while staying at most 2.4e-7 in absolute terms. +- With `TRITON_DEFAULT_FP_FUSION=0` this specialization compiles to separate multiplies + and adds, and the mismatches drop to 0. The golden is self-consistent across output + dtypes. Qwen3-Next's conv applies SiLU, so this specialization is not on its decode + path. + +*Open:* the recurrent provider computes `exp(g)` and `sigmoid(b)` with Triton (`tl.exp` +via the vendored FLA `op.py`), the golden with PyTorch; the same kind of difference may +account for part of the recurrent output mismatches in the table above. Not +investigated. ## 5. Decode versus chunked prefill From 395fef838ad8cd2ba5ccd376b6151c2225bfd753 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Sun, 4 Oct 2026 02:16:59 +0000 Subject: [PATCH 35/70] ci(qwen3-next): reconcile the WS1 gtest script with the stacked gated-norm branch Carried over from the former merges of the gated-norm branch into this one; the final tree is the same as before the re-stack. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- ci/run_ws1_gtest.sh | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/ci/run_ws1_gtest.sh b/ci/run_ws1_gtest.sh index 03b77173d..e6d8e0dc0 100755 --- a/ci/run_ws1_gtest.sh +++ b/ci/run_ws1_gtest.sh @@ -77,11 +77,12 @@ print("[ws1-gtest] C8 gate passed") PY echo "[ws1-gtest] Qwen3-Next C3/C4 norms (operator scope)" -for op in qwen3_next_rms_norm rms_norm_gated; do - for gate in forward gradient; do - "$PY" "scripts/check_${gate}_invariance.py" \ - --manifest rl_engine/testing/qwen3_next_norm_manifest.json \ - --op "$op" --candidate cuda --backend-profile cuda_bf16 \ - --hidden 2048 --head-dim 128 - done -done +QWEN3_NEXT_NORM_MANIFEST=rl_engine/testing/qwen3_next_norm_manifest.json +"$PY" scripts/check_forward_invariance.py --manifest "$QWEN3_NEXT_NORM_MANIFEST" \ + --op qwen3_next_rms_norm --candidate cuda --backend-profile cuda_bf16 --hidden 2048 --head-dim 128 +"$PY" scripts/check_gradient_invariance.py --manifest "$QWEN3_NEXT_NORM_MANIFEST" \ + --op qwen3_next_rms_norm --candidate cuda --backend-profile cuda_bf16 --hidden 2048 --head-dim 128 +"$PY" scripts/check_forward_invariance.py --manifest "$QWEN3_NEXT_NORM_MANIFEST" \ + --op rms_norm_gated --candidate cuda --backend-profile cuda_bf16 --hidden 2048 --head-dim 128 +"$PY" scripts/check_gradient_invariance.py --manifest "$QWEN3_NEXT_NORM_MANIFEST" \ + --op rms_norm_gated --candidate cuda --backend-profile cuda_bf16 --hidden 2048 --head-dim 128 From 0b41350536a738c76af5b20c5a409b166289f276 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Sun, 4 Oct 2026 11:46:39 +0000 Subject: [PATCH 36/70] fix(gdn): keep _chunked_sum fixed-order for widths not divisible by 32 The non-multiple-of-32 branch fell back to a whole-axis sum, whose reduction order is unspecified, which contradicts the batch-invariance contract the helper exists to enforce. Zero-pad the last dim to the next chunk boundary instead and reduce in the same fixed chunk order for every width. Qwen3-Next uses K=128 so the shipped goldens are unaffected; a CPU test covers an odd width. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- .../ops/pytorch/linear_attn/gated_delta_rule.py | 6 +++++- tests/test_gdn_state_contract.py | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/rl_engine/kernels/ops/pytorch/linear_attn/gated_delta_rule.py b/rl_engine/kernels/ops/pytorch/linear_attn/gated_delta_rule.py index 27708f319..181bfca5d 100644 --- a/rl_engine/kernels/ops/pytorch/linear_attn/gated_delta_rule.py +++ b/rl_engine/kernels/ops/pytorch/linear_attn/gated_delta_rule.py @@ -84,7 +84,11 @@ def _chunked_sum(x: torch.Tensor) -> torch.Tensor: """ tail = x.shape[-1] if tail % _REDUCTION_CHUNK != 0: - return x.sum(dim=-1) + # Zero-pad to the next chunk boundary instead of falling back to an + # unpinned ``sum``: exact zeros add nothing, so the result is the same + # fixed chunk order for every width. + x = torch.nn.functional.pad(x, (0, _REDUCTION_CHUNK - tail % _REDUCTION_CHUNK)) + tail = x.shape[-1] return ( x.reshape(*x.shape[:-1], tail // _REDUCTION_CHUNK, _REDUCTION_CHUNK).sum(dim=-1).sum(dim=-1) ) diff --git a/tests/test_gdn_state_contract.py b/tests/test_gdn_state_contract.py index 7af1e083d..a154efd35 100644 --- a/tests/test_gdn_state_contract.py +++ b/tests/test_gdn_state_contract.py @@ -107,3 +107,18 @@ def test_softplus_large_branch_has_finite_gradient(): x = torch.tensor([100.0, 21.0, 0.0], requires_grad=True) _softplus(x).sum().backward() assert torch.equal(x.grad, torch.tensor([1.0, 1.0, 0.5])) + + +def test_chunked_sum_keeps_fixed_order_for_non_multiple_of_32_width(): + from rl_engine.kernels.ops.pytorch.linear_attn.gated_delta_rule import ( + _REDUCTION_CHUNK, + _chunked_sum, + ) + + torch.manual_seed(0) + x = torch.randn(3, 5, 2 * _REDUCTION_CHUNK + 7) + padded = torch.nn.functional.pad(x, (0, _REDUCTION_CHUNK - 7)) + chunked = padded.reshape(3, 5, 3, _REDUCTION_CHUNK).sum(dim=-1).sum(dim=-1) + assert torch.equal(_chunked_sum(x), chunked) + # The reduction must not depend on the leading shape either. + assert torch.equal(_chunked_sum(x[:1]), _chunked_sum(x)[:1]) From bec7e7adc01763c26dd7325689ed5f3b4ca06239 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Wed, 7 Oct 2026 16:35:28 +0000 Subject: [PATCH 37/70] fix(norm): reject stale RMSNorm bindings and enable GPU coverage Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- .github/workflows/ws1-gtest-gpu.yml | 6 +++ ci/run_ws1_gtest.sh | 1 + csrc/ops.cpp | 2 + rl_engine/_C.pyi | 3 ++ rl_engine/kernels/ops/cuda/norm/rmsnorm.py | 29 ++++++------ tests/test_qwen3_next_norm.py | 6 ++- tests/test_rms_norm.py | 51 +++++++++++++++++++--- 7 files changed, 77 insertions(+), 21 deletions(-) diff --git a/.github/workflows/ws1-gtest-gpu.yml b/.github/workflows/ws1-gtest-gpu.yml index 646d80bdf..f48d62382 100644 --- a/.github/workflows/ws1-gtest-gpu.yml +++ b/.github/workflows/ws1-gtest-gpu.yml @@ -12,6 +12,8 @@ on: pull_request: branches: [ main ] paths: + - "csrc/cuda/rmsnorm.cu" + - "csrc/ops.cpp" - "rl_engine/kernels/gtest/**" - "rl_engine/kernels/ops/**" - "rl_engine/testing/**" @@ -20,6 +22,7 @@ on: - "scripts/check_gradient_invariance.py" - "scripts/ws1_candidate_evidence.py" - "tests/test_ws1_*.py" + - "tests/test_qwen3_next_norm.py" - "tests/test_forward_invariance.py" - "tests/test_gradient_invariance.py" - "tests/test_four_judgment_matrix.py" @@ -30,6 +33,8 @@ on: push: branches: [ main ] paths: + - "csrc/cuda/rmsnorm.cu" + - "csrc/ops.cpp" - "rl_engine/kernels/gtest/**" - "rl_engine/kernels/ops/**" - "rl_engine/testing/**" @@ -38,6 +43,7 @@ on: - "scripts/check_gradient_invariance.py" - "scripts/ws1_candidate_evidence.py" - "tests/test_ws1_*.py" + - "tests/test_qwen3_next_norm.py" - "tests/test_forward_invariance.py" - "tests/test_gradient_invariance.py" - "tests/test_four_judgment_matrix.py" diff --git a/ci/run_ws1_gtest.sh b/ci/run_ws1_gtest.sh index 0e9b172cc..e4d8a36fa 100755 --- a/ci/run_ws1_gtest.sh +++ b/ci/run_ws1_gtest.sh @@ -19,6 +19,7 @@ echo "[ws1-gtest] interpreter=$PY out=$OUT" "$PY" -m pytest -q \ tests/test_ws1_gtest_gpu.py \ + tests/test_qwen3_next_norm.py \ tests/test_triton_batch_invariant_attention.py \ tests/test_four_judgment_matrix.py \ tests/test_ws1_candidate_evidence.py \ diff --git a/csrc/ops.cpp b/csrc/ops.cpp index 4e786e5b3..7ae1523f6 100644 --- a/csrc/ops.cpp +++ b/csrc/ops.cpp @@ -716,6 +716,8 @@ PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { &det_gemm_db_transposed, "Batch-invariant deterministic GEMM backward in canonical [N,K] layout"); // registry RMSNorm + // API version 2 includes weight_offset in both entry points. + m.attr("rmsnorm_api_version") = 2; m.def("rmsnorm_forward", &rmsnorm_forward, "Batch-invariant RMSNorm forward CUDA", py::arg("x"), py::arg("weight"), py::arg("eps"), py::arg("weight_offset") = 0.0); diff --git a/rl_engine/_C.pyi b/rl_engine/_C.pyi index b911feaf7..225f997b6 100644 --- a/rl_engine/_C.pyi +++ b/rl_engine/_C.pyi @@ -256,6 +256,9 @@ def swiglu_backward( gate: torch.Tensor, up: torch.Tensor, ) -> list[torch.Tensor]: ... + +rmsnorm_api_version: int + def rmsnorm_forward( x: torch.Tensor, weight: torch.Tensor, diff --git a/rl_engine/kernels/ops/cuda/norm/rmsnorm.py b/rl_engine/kernels/ops/cuda/norm/rmsnorm.py index af9a31358..a0da2ddd4 100644 --- a/rl_engine/kernels/ops/cuda/norm/rmsnorm.py +++ b/rl_engine/kernels/ops/cuda/norm/rmsnorm.py @@ -4,9 +4,11 @@ from rl_engine.kernels.ops.base import _C, _EXT_AVAILABLE from rl_engine.kernels.ops.vjp_fp32 import reduce_rows_fp32, rmsnorm_dweight_rows_fp32 +_RMSNORM_API_VERSION = 2 -def _require_cuda_symbols(what: str, *names: str) -> None: - """Raise when the compiled kernels backing ``what`` are missing. + +def _require_cuda_rmsnorm() -> None: + """Raise when the compiled RMSNorm bindings are missing or incompatible. The registry treats a backend whose construction raises as unavailable and falls through to the next candidate, so calling this from ``__init__`` is @@ -15,13 +17,21 @@ def _require_cuda_symbols(what: str, *names: str) -> None: activation ops. """ if not _EXT_AVAILABLE or _C is None: - raise RuntimeError(f"{what} requires the compiled rl_engine._C extension.") + raise RuntimeError("CUDA RMSNorm requires the compiled rl_engine._C extension.") + names = ("rmsnorm_forward", "rmsnorm_backward_dx") missing = [name for name in names if not hasattr(_C, name)] if missing: raise RuntimeError( - f"{what} symbols ({', '.join(missing)}) are not compiled into _C. " + f"CUDA RMSNorm symbols ({', '.join(missing)}) are not compiled into _C. " "Rebuild the extension with csrc/cuda/rmsnorm.cu." ) + api_version = getattr(_C, "rmsnorm_api_version", None) + if api_version != _RMSNORM_API_VERSION: + raise RuntimeError( + f"CUDA RMSNorm requires rl_engine._C RMSNorm API version {_RMSNORM_API_VERSION} " + f"(loaded {api_version!r}). Rebuild the extension with csrc/cuda/rmsnorm.cu " + "for weight_offset support." + ) class RMSNormCuda(torch.autograd.Function): @@ -46,6 +56,7 @@ def forward(ctx, x, weight, mask=None, eps=1e-6, weight_offset=0.0): Output: y: [T, H] """ + _require_cuda_rmsnorm() assert x.is_cuda, "x must be CUDA tensor" assert weight.is_cuda, "weight must be CUDA tensor" assert x.is_contiguous(), "x must be contiguous" @@ -53,10 +64,6 @@ def forward(ctx, x, weight, mask=None, eps=1e-6, weight_offset=0.0): assert x.dim() == 2, "x must be [T, H]" assert weight.dim() == 1, "weight must be [H]" assert x.shape[1] == weight.shape[0], "hidden size mismatch" - assert _EXT_AVAILABLE and hasattr( - _C, "rmsnorm_forward" - ), "RMSNorm CUDA extension is unavailable. Please rebuild with rmsnorm.cu." - if mask is None: mask = torch.ones((x.shape[0],), device=x.device, dtype=torch.bool) else: @@ -124,11 +131,7 @@ class RMSNormCudaOp: backward_impl = "cuda_rmsnorm_dx_declared_fp32_rowfold_dw" def __init__(self) -> None: - _require_cuda_symbols( - "CUDA RMSNorm", - "rmsnorm_forward", - "rmsnorm_backward_dx", - ) + _require_cuda_rmsnorm() #: Added to the weight in fp32 inside the kernel. Subclasses override it; #: 0.0 is the plain convention. diff --git a/tests/test_qwen3_next_norm.py b/tests/test_qwen3_next_norm.py index a62d8410f..d45670a7d 100644 --- a/tests/test_qwen3_next_norm.py +++ b/tests/test_qwen3_next_norm.py @@ -355,7 +355,11 @@ def test_gated_shape_mismatch_raises(): try: from rl_engine.kernels.ops.base import _C, _EXT_AVAILABLE - _CUDA_RMSNORM = _EXT_AVAILABLE and hasattr(_C, "rmsnorm_forward") + _CUDA_RMSNORM = ( + _EXT_AVAILABLE + and getattr(_C, "rmsnorm_api_version", None) == 2 + and all(hasattr(_C, name) for name in ("rmsnorm_forward", "rmsnorm_backward_dx")) + ) except ImportError: # pragma: no cover _CUDA_RMSNORM = False diff --git a/tests/test_rms_norm.py b/tests/test_rms_norm.py index b17a3f302..ec3046593 100644 --- a/tests/test_rms_norm.py +++ b/tests/test_rms_norm.py @@ -17,10 +17,11 @@ try: from rl_engine.kernels.ops.base import _C, _EXT_AVAILABLE - # The same two symbols RMSNormCudaOp.__init__ requires; a build that has them - # dispatches to the CUDA op, so the dispatch test must agree with that guard. - _HAS_CUDA_RMSNORM = _EXT_AVAILABLE and all( - hasattr(_C, name) for name in ("rmsnorm_forward", "rmsnorm_backward_dx") + # Keep dispatch expectations aligned with the constructor's capability guard. + _HAS_CUDA_RMSNORM = ( + _EXT_AVAILABLE + and getattr(_C, "rmsnorm_api_version", None) == 2 + and all(hasattr(_C, name) for name in ("rmsnorm_forward", "rmsnorm_backward_dx")) ) except ImportError: # pragma: no cover - import can fail when the extension is not built. _HAS_CUDA_RMSNORM = False @@ -263,7 +264,7 @@ def test_cuda_op_construction_fails_when_symbols_missing(monkeypatch): from rl_engine.kernels.ops.cuda.norm import rmsnorm as cuda_rmsnorm class _WithoutRMSNorm: # a built extension that lacks the rmsnorm symbols - pass + rmsnorm_api_version = 2 monkeypatch.setattr(cuda_rmsnorm, "_EXT_AVAILABLE", True) monkeypatch.setattr(cuda_rmsnorm, "_C", _WithoutRMSNorm()) @@ -291,12 +292,43 @@ def test_registry_falls_back_when_required_symbol_is_missing(monkeypatch, missin symbols = {name: object() for name in ("rmsnorm_forward", "rmsnorm_backward_dx")} del symbols[missing] + symbols["rmsnorm_api_version"] = 2 monkeypatch.setattr(cuda_rmsnorm, "_EXT_AVAILABLE", True) monkeypatch.setattr(cuda_rmsnorm, "_C", SimpleNamespace(**symbols)) assert isinstance(KernelRegistry().get_op("rms_norm", device="cuda"), NativeRMSNormOp) -def test_registry_cuda_requires_only_used_symbols_and_cpu_stays_native(monkeypatch): +@pytest.mark.parametrize("api_version", [None, 1, 3]) +def test_cuda_rejects_incompatible_rmsnorm_api_before_dispatch(monkeypatch, api_version): + from rl_engine.kernels.ops.cuda.norm import rmsnorm as cuda_rmsnorm + from rl_engine.kernels.registry import KernelRegistry + + class _LegacyRMSNorm: + def rmsnorm_forward(self, x, weight, eps): + pytest.fail("an incompatible extension must not be invoked") + + def rmsnorm_backward_dx(self, dy, x, weight, rstd): + pytest.fail("an incompatible extension must not be invoked") + + extension = _LegacyRMSNorm() + if api_version is not None: + extension.rmsnorm_api_version = api_version + monkeypatch.setattr(cuda_rmsnorm, "_EXT_AVAILABLE", True) + monkeypatch.setattr(cuda_rmsnorm, "_C", extension) + + for op_type in (cuda_rmsnorm.RMSNormCudaOp, cuda_rmsnorm.Qwen3NextRMSNormCudaOp): + with pytest.raises(RuntimeError, match="RMSNorm API version 2.*Rebuild"): + op_type() + + registry_op = KernelRegistry().get_op("rms_norm", device="cuda") + assert isinstance(registry_op, NativeRMSNormOp) + x, weight = torch.ones(2, 8), torch.ones(8) + assert torch.isfinite(registry_op(x, weight)).all() + with pytest.raises(RuntimeError, match="RMSNorm API version 2.*Rebuild"): + rmsnorm_cuda(x, weight, weight_offset=1.0) + + +def test_registry_cuda_requires_current_api_and_only_used_symbols(monkeypatch): from types import SimpleNamespace from rl_engine.kernels.ops.cuda.norm import rmsnorm as cuda_rmsnorm @@ -306,10 +338,15 @@ def test_registry_cuda_requires_only_used_symbols_and_cpu_stays_native(monkeypat monkeypatch.setattr( cuda_rmsnorm, "_C", - SimpleNamespace(rmsnorm_forward=object(), rmsnorm_backward_dx=object()), + SimpleNamespace( + rmsnorm_api_version=2, + rmsnorm_forward=object(), + rmsnorm_backward_dx=object(), + ), ) registry = KernelRegistry() assert isinstance(registry.get_op("rms_norm", device="cuda"), RMSNormCudaOp) + cuda_rmsnorm.Qwen3NextRMSNormCudaOp() assert isinstance(registry.get_op("rms_norm", device="cpu"), NativeRMSNormOp) From 53767ab89110fe53a70d4c6abcfff626b10f37b5 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Thu, 8 Oct 2026 17:27:59 +0000 Subject: [PATCH 38/70] feat(scripts): Qwen3-Next norm evidence runner vs existing implementations Compares the zero-centred RMSNorm CUDA op with the PyTorch reference, transformers, vLLM and FlashInfer (optional providers are skipped when absent): error vs an FP64 golden, row invariance (256 rows alone vs a 4096-row batch, three seeds, bitwise) and forward/backward latency. The plot script renders the report as one figure per op. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- scripts/plot_qwen3_next_norm_evidence.py | 117 ++++++++++ scripts/qwen3_next_norm_evidence.py | 276 +++++++++++++++++++++++ 2 files changed, 393 insertions(+) create mode 100644 scripts/plot_qwen3_next_norm_evidence.py create mode 100644 scripts/qwen3_next_norm_evidence.py diff --git a/scripts/plot_qwen3_next_norm_evidence.py b/scripts/plot_qwen3_next_norm_evidence.py new file mode 100644 index 000000000..54dab1a67 --- /dev/null +++ b/scripts/plot_qwen3_next_norm_evidence.py @@ -0,0 +1,117 @@ +#!/usr/bin/env python +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Plot a report from scripts/qwen3_next_norm_evidence.py: one 2x2 figure per op. + + python scripts/plot_qwen3_next_norm_evidence.py report.json # figure[-].png beside it +""" + +from __future__ import annotations + +import json +import sys +from pathlib import Path + +import matplotlib + +matplotlib.use("Agg") +import matplotlib.pyplot as plt # noqa: E402 + +COLORS = ["#2a6fdb", "#7a7a7a", "#e07b39", "#3aa676", "#9b59b6", "#c0392b"] + + +def _short(name: str) -> str: + return name.replace(" (forward only)", "*") + + +def plot_op(op: str, data: dict, title: str, out: Path) -> None: + names = list(data["row_invariance"]) + color = {n: COLORS[i % len(COLORS)] for i, n in enumerate(names)} + fig, axes = plt.subplots(2, 2, figsize=(13, 9)) + fig.suptitle(title, fontsize=13) + + for ax, key, label in ( + (axes[0, 0], "forward_us", "forward latency"), + (axes[0, 1], "backward_us", "backward latency (training-capable only)"), + ): + for name in names: + rows = sorted(int(r) for r in data["latency"][name]) + ys = [data["latency"][name][str(r)].get(key) for r in rows] + if all(y is None for y in ys): + continue + ax.plot(rows, ys, "o-", color=color[name], label=_short(name)) + ax.set_xscale("log", base=2) + ax.set_yscale("log") + ax.set_xlabel("rows") + ax.set_ylabel("µs (median)") + ax.set_title(label) + ax.grid(True, which="both", alpha=0.3) + ax.legend(fontsize=8) + + ax = axes[1, 0] + acc = data["accuracy"][max(data["accuracy"], key=int)] + metrics = [ + ("forward_max_abs", "forward max |err|"), + ("dx_max_abs_over_absmax", "dx max |err| / max|dx|"), + ("dweight_max_abs_over_absmax", "dweight max |err| / max|dw|"), + ] + width = 0.8 / len(names) + for i, name in enumerate(names): + vals = [acc[name].get(m) for m, _ in metrics] + xs = [j + (i - (len(names) - 1) / 2) * width for j in range(len(metrics))] + ax.bar( + [x for x, v in zip(xs, vals) if v is not None], + [v for v in vals if v is not None], + width, + color=color[name], + label=_short(name), + ) + ax.set_xticks(range(len(metrics)), [label for _, label in metrics], fontsize=9) + ax.set_yscale("log") + ax.set_title(f"error vs FP64 golden ({max(data['accuracy'], key=int)} rows, BF16)") + ax.grid(True, axis="y", alpha=0.3) + ax.legend(fontsize=8) + + ax = axes[1, 1] + bi = data["row_invariance"] + checked = next(iter(bi.values()))["rows_checked"] + ys = range(len(names)) + fwd = [bi[n]["forward_rows_differing"] for n in names] + dx = [ + bi[n]["dx_rows_differing"] if bi[n]["dx_rows_differing"] is not None else 0 for n in names + ] + ax.barh([y - 0.2 for y in ys], fwd, 0.4, color="#2a6fdb", label="forward") + ax.barh([y + 0.2 for y in ys], dx, 0.4, color="#e07b39", label="dx") + for y, n, f, d in zip(ys, names, fwd, dx): + no_bwd = bi[n]["dx_rows_differing"] is None + ax.text(max(f, d) + 0.2, y, f"{f} / {'n/a' if no_bwd else d}", va="center", fontsize=8) + ax.set_yticks(list(ys), [_short(n) for n in names], fontsize=8) + ax.invert_yaxis() + ax.set_xlabel(f"rows differing (of {checked}; row alone vs inside a batch, bitwise)") + ax.set_title("row invariance (0 = batch-invariant)") + ax.legend(fontsize=8) + ax.grid(True, axis="x", alpha=0.3) + + fig.text(0.01, 0.005, "* forward only (no backward)", fontsize=8) + fig.tight_layout(rect=(0, 0.02, 1, 0.96)) + fig.savefig(out, dpi=130) + print(f"wrote {out}") + + +def main() -> None: + path = Path(sys.argv[1]) + report = json.loads(path.read_text()) + env = report["environment"] + ops = report["ops"] + for op, data in ops.items(): + name = "figure.png" if len(ops) == 1 else f"figure-{op}.png" + title = ( + f"Qwen3-Next {op.replace('_', ' ')} — {env['gpu']}, hidden {report['hidden']}, " + f"BF16, commit {report['git_commit'][:7]}" + ) + plot_op(op, data, title, path.parent / name) + + +if __name__ == "__main__": + main() diff --git a/scripts/qwen3_next_norm_evidence.py b/scripts/qwen3_next_norm_evidence.py new file mode 100644 index 000000000..27a063df6 --- /dev/null +++ b/scripts/qwen3_next_norm_evidence.py @@ -0,0 +1,276 @@ +#!/usr/bin/env python +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Accuracy, row invariance and latency of the Qwen3-Next norms vs existing implementations. + +Writes one JSON report (RFC #428, reuse rule of #420): every candidate is compared with +an FP64 golden, checked for row invariance (a row computed alone vs inside a batch, +bitwise), and timed. Optional providers (transformers, vLLM, FlashInfer) are skipped +when they are not installed; the report says which ran. + + python scripts/qwen3_next_norm_evidence.py --out report.json + python scripts/plot_qwen3_next_norm_evidence.py report.json +""" + +from __future__ import annotations + +import argparse +import json +import platform +import statistics +import subprocess +import sys +from pathlib import Path +from typing import Any, Callable + +import torch + +REPO_ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(REPO_ROOT)) + +from rl_engine.kernels.ops.cuda.norm.rmsnorm import Qwen3NextRMSNormCudaOp # noqa: E402 +from rl_engine.kernels.ops.pytorch.norm.qwen3_next_rms_norm import Qwen3NextRMSNormOp # noqa: E402 + +EPS = 1e-6 +HIDDEN = 2048 # Qwen3-Next hidden size (decoder and final norms) +TIMED_ROWS = (1024, 4096, 16384, 65536) + + +# --------------------------------------------------------------------------- # +# Candidates: name -> (forward fn(x, w) -> y, has_backward) +# --------------------------------------------------------------------------- # + + +def zero_centred_candidates() -> dict[str, dict[str, Any]]: + cands: dict[str, dict[str, Any]] = { + "rl-kernel CUDA": {"fn": Qwen3NextRMSNormCudaOp(), "backward": True}, + "rl-kernel PyTorch reference": {"fn": Qwen3NextRMSNormOp(), "backward": True}, + } + try: + from transformers.models.qwen3_next.modeling_qwen3_next import Qwen3NextRMSNorm + + module = Qwen3NextRMSNorm(HIDDEN, eps=EPS).cuda() + + def hf(x, w, module=module): + return torch.func.functional_call(module, {"weight": w}, (x,)) + + cands["transformers Qwen3NextRMSNorm"] = {"fn": hf, "backward": True} + except ImportError: + pass + try: + from vllm.config import VllmConfig, set_current_vllm_config + + with set_current_vllm_config(VllmConfig()): + from vllm.model_executor.layers.layernorm import GemmaRMSNorm + + gemma = GemmaRMSNorm(HIDDEN, eps=EPS).cuda() + + def vllm_fwd(x, w, gemma=gemma): + gemma.weight.data = w.detach() + return gemma.forward_cuda(x) + + cands["vLLM GemmaRMSNorm (forward only)"] = {"fn": vllm_fwd, "backward": False} + except ImportError: + pass + try: + import flashinfer + + cands["FlashInfer gemma_rmsnorm (forward only)"] = { + "fn": lambda x, w: flashinfer.norm.gemma_rmsnorm(x, w, EPS), + "backward": False, + } + except ImportError: + pass + return cands + + +def zero_centred_golden(x: torch.Tensor, w: torch.Tensor) -> torch.Tensor: + x64 = x.double() + return x64 * torch.rsqrt(x64.square().mean(-1, keepdim=True) + EPS) * (1.0 + w.double()) + + +# --------------------------------------------------------------------------- # +# Measurements +# --------------------------------------------------------------------------- # + + +def _inputs(rows: int, seed: int, dtype=torch.bfloat16): + g = torch.Generator(device="cuda").manual_seed(seed) + x = (torch.randn(rows, HIDDEN, device="cuda", generator=g) * 2).to(dtype) + w = (torch.randn(HIDDEN, device="cuda", generator=g) * 0.1).to(dtype) + up = torch.randn(rows, HIDDEN, device="cuda", generator=g).to(dtype) + return x, w, up + + +def _grads(fn, x, w, up, dtype=None): + xl = (x if dtype is None else x.to(dtype)).detach().clone().requires_grad_(True) + wl = (w if dtype is None else w.to(dtype)).detach().clone().requires_grad_(True) + out = fn(xl, wl) + out.backward(up if dtype is None else up.to(dtype)) + return out.detach(), xl.grad, wl.grad + + +def accuracy(cands, golden, rows: int, seed: int) -> dict[str, Any]: + x, w, up = _inputs(rows, seed) + ref_out, ref_dx, ref_dw = _grads(golden, x, w, up, torch.float64) + result = {} + for name, c in cands.items(): + entry: dict[str, Any] = {} + if c["backward"]: + out, dx, dw = _grads(c["fn"], x, w, up) + for key, got, ref in (("dx", dx, ref_dx), ("dweight", dw, ref_dw)): + err = (got.double() - ref).abs().max().item() + entry[f"{key}_max_abs_over_absmax"] = err / ref.abs().max().item() + else: + with torch.no_grad(): + out = c["fn"](x, w) + err = (out.double() - ref_out).abs() + entry["forward_max_abs"] = err.max().item() + entry["forward_correctly_rounded_fraction"] = ( + (out == ref_out.to(out.dtype)).float().mean().item() + ) + result[name] = entry + return result + + +def row_invariance(cands, seeds=(3, 4, 5), rows: int = 4096, step: int = 16) -> dict[str, Any]: + """256 rows computed alone vs the same rows inside a batch, bitwise.""" + + result = {} + for name, c in cands.items(): + fwd_bad = dx_bad = checked = 0 + for seed in seeds: + x, w, up = _inputs(rows, seed) + if c["backward"]: + full_out, full_dx, _ = _grads(c["fn"], x, w, up) + else: + with torch.no_grad(): + full_out = c["fn"](x, w) + for i in range(0, rows, step): + sl = slice(i, i + 1) + if c["backward"]: + out, dx, _ = _grads(c["fn"], x[sl], w, up[sl]) + dx_bad += not torch.equal(dx[0], full_dx[i]) + else: + with torch.no_grad(): + out = c["fn"](x[sl], w) + fwd_bad += not torch.equal(out[0], full_out[i]) + checked += 1 + result[name] = { + "rows_checked": checked, + "forward_rows_differing": fwd_bad, + "dx_rows_differing": dx_bad if c["backward"] else None, + "batch_rows": rows, + "seeds": list(seeds), + } + return result + + +def _time_us(fn: Callable[[], Any], warmup: int = 10, iters: int = 50) -> float: + for _ in range(warmup): + fn() + torch.cuda.synchronize() + samples = [] + for _ in range(iters): + start, end = torch.cuda.Event(enable_timing=True), torch.cuda.Event(enable_timing=True) + start.record() + fn() + end.record() + end.synchronize() + samples.append(start.elapsed_time(end) * 1e3) + return statistics.median(samples) + + +def latency(cands, rows_list=TIMED_ROWS) -> dict[str, Any]: + result: dict[str, Any] = {name: {} for name in cands} + for rows in rows_list: + x, w, up = _inputs(rows, seed=11) + for name, c in cands.items(): + row: dict[str, float] = {} + with torch.no_grad(): + row["forward_us"] = _time_us(lambda f=c["fn"]: f(x, w)) + if c["backward"]: + xl = x.detach().clone().requires_grad_(True) + wl = w.detach().clone().requires_grad_(True) + out = c["fn"](xl, wl) + row["backward_us"] = _time_us( + lambda o=out: torch.autograd.grad(o, (xl, wl), up, retain_graph=True) + ) + result[name][str(rows)] = row + return result + + +# --------------------------------------------------------------------------- # + + +def _git(*args: str) -> str: + try: + return subprocess.check_output(["git", *args], cwd=REPO_ROOT, text=True).strip() + except (OSError, subprocess.CalledProcessError): + return "" + + +def environment() -> dict[str, Any]: + env = { + "gpu": torch.cuda.get_device_name(), + "capability": list(torch.cuda.get_device_capability()), + "torch": torch.__version__, + "cuda": torch.version.cuda, + "python": platform.python_version(), + } + for mod in ("transformers", "vllm", "flashinfer"): + try: + env[mod] = __import__(mod).__version__ + except ImportError: + env[mod] = None + return env + + +def run_op(name: str, cands, golden) -> dict[str, Any]: + print(f"[{name}] candidates: {', '.join(cands)}", flush=True) + report = { + "accuracy": {str(r): accuracy(cands, golden, r, seed=r) for r in (257, 4096)}, + "row_invariance": row_invariance(cands), + "latency": latency(cands), + } + for cand, entry in report["row_invariance"].items(): + print(f" BI {cand}: {entry}", flush=True) + return report + + +def build_report(ops: dict[str, tuple[Callable, Callable]]) -> dict[str, Any]: + torch.backends.cuda.matmul.allow_tf32 = False + report = { + "kind": "qwen3_next_norm_evidence", + "rfc": "RL-Align/RL-Kernel#428", + "git_commit": _git("rev-parse", "HEAD") or "unknown", + "git_dirty": bool(_git("status", "--porcelain", "--untracked-files=no")), + "environment": environment(), + "hidden": HIDDEN, + "eps": EPS, + "dtype": "bfloat16", + "ops": {}, + } + for name, (make_cands, golden) in ops.items(): + report["ops"][name] = run_op(name, make_cands(), golden) + return report + + +OPS = {"zero_centred_rmsnorm": (zero_centred_candidates, zero_centred_golden)} + + +def main() -> None: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--out", type=Path, required=True) + args = parser.parse_args() + if not torch.cuda.is_available(): + raise SystemExit("needs a CUDA device") + report = build_report(OPS) + args.out.parent.mkdir(parents=True, exist_ok=True) + args.out.write_text(json.dumps(report, indent=2) + "\n") + print(f"wrote {args.out} (commit {report['git_commit'][:7]}, dirty={report['git_dirty']})") + + +if __name__ == "__main__": + main() From a441ff972d52cf56b180ea00758404e986f55013 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Thu, 8 Oct 2026 18:10:56 +0000 Subject: [PATCH 39/70] feat(scripts): extend the Qwen3-Next norm evidence runner to the gated RMSNorm Adds the gated op (hidden 128, rows = tokens x heads) against the PyTorch reference, transformers' cast-first Qwen3NextRMSNormGated and vLLM's RMSNormGated, with an FP64 golden in vLLM's convention. Row inputs are now generic, so the gate is sliced, differentiated and row-checked like x. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- scripts/plot_qwen3_next_norm_evidence.py | 20 +-- scripts/qwen3_next_norm_evidence.py | 198 +++++++++++++++-------- 2 files changed, 146 insertions(+), 72 deletions(-) diff --git a/scripts/plot_qwen3_next_norm_evidence.py b/scripts/plot_qwen3_next_norm_evidence.py index 54dab1a67..41c444100 100644 --- a/scripts/plot_qwen3_next_norm_evidence.py +++ b/scripts/plot_qwen3_next_norm_evidence.py @@ -22,13 +22,13 @@ def _short(name: str) -> str: - return name.replace(" (forward only)", "*") + return name.replace(" (forward only)", "*").replace(" (cast-first)", "\n(cast-first)") def plot_op(op: str, data: dict, title: str, out: Path) -> None: names = list(data["row_invariance"]) color = {n: COLORS[i % len(COLORS)] for i, n in enumerate(names)} - fig, axes = plt.subplots(2, 2, figsize=(13, 9)) + fig, axes = plt.subplots(2, 2, figsize=(14, 10), layout="constrained") fig.suptitle(title, fontsize=13) for ax, key, label in ( @@ -52,10 +52,12 @@ def plot_op(op: str, data: dict, title: str, out: Path) -> None: ax = axes[1, 0] acc = data["accuracy"][max(data["accuracy"], key=int)] metrics = [ - ("forward_max_abs", "forward max |err|"), - ("dx_max_abs_over_absmax", "dx max |err| / max|dx|"), - ("dweight_max_abs_over_absmax", "dweight max |err| / max|dw|"), + ("forward_max_abs", "forward\nmax |err|"), + ("dx_max_abs_over_absmax", "dx\nmax |err| / max"), + ("dweight_max_abs_over_absmax", "dweight\nmax |err| / max"), + ("dgate_max_abs_over_absmax", "dgate\nmax |err| / max"), ] + metrics = [m for m in metrics if any(acc[n].get(m[0]) is not None for n in names)] width = 0.8 / len(names) for i, name in enumerate(names): vals = [acc[name].get(m) for m, _ in metrics] @@ -87,14 +89,13 @@ def plot_op(op: str, data: dict, title: str, out: Path) -> None: no_bwd = bi[n]["dx_rows_differing"] is None ax.text(max(f, d) + 0.2, y, f"{f} / {'n/a' if no_bwd else d}", va="center", fontsize=8) ax.set_yticks(list(ys), [_short(n) for n in names], fontsize=8) + ax.set_xlim(0, max(3, max(fwd + dx) * 1.4)) ax.invert_yaxis() ax.set_xlabel(f"rows differing (of {checked}; row alone vs inside a batch, bitwise)") ax.set_title("row invariance (0 = batch-invariant)") ax.legend(fontsize=8) ax.grid(True, axis="x", alpha=0.3) - fig.text(0.01, 0.005, "* forward only (no backward)", fontsize=8) - fig.tight_layout(rect=(0, 0.02, 1, 0.96)) fig.savefig(out, dpi=130) print(f"wrote {out}") @@ -106,9 +107,10 @@ def main() -> None: ops = report["ops"] for op, data in ops.items(): name = "figure.png" if len(ops) == 1 else f"figure-{op}.png" + hidden = data.get("hidden", report.get("hidden")) title = ( - f"Qwen3-Next {op.replace('_', ' ')} — {env['gpu']}, hidden {report['hidden']}, " - f"BF16, commit {report['git_commit'][:7]}" + f"Qwen3-Next {op.replace('_', ' ')} — {env['gpu']}, hidden {hidden}, " + f"BF16, commit {report['git_commit'][:7]} (* forward only)" ) plot_op(op, data, title, path.parent / name) diff --git a/scripts/qwen3_next_norm_evidence.py b/scripts/qwen3_next_norm_evidence.py index 27a063df6..d29f249ee 100644 --- a/scripts/qwen3_next_norm_evidence.py +++ b/scripts/qwen3_next_norm_evidence.py @@ -25,24 +25,30 @@ from typing import Any, Callable import torch +import torch.nn.functional as F REPO_ROOT = Path(__file__).resolve().parents[1] sys.path.insert(0, str(REPO_ROOT)) -from rl_engine.kernels.ops.cuda.norm.rmsnorm import Qwen3NextRMSNormCudaOp # noqa: E402 -from rl_engine.kernels.ops.pytorch.norm.qwen3_next_rms_norm import Qwen3NextRMSNormOp # noqa: E402 +from rl_engine.kernels.ops.cuda.norm.rmsnorm import ( # noqa: E402 + Qwen3NextRMSNormCudaOp, + Qwen3NextRMSNormGatedCudaOp, +) +from rl_engine.kernels.ops.pytorch.norm.qwen3_next_rms_norm import ( # noqa: E402 + Qwen3NextRMSNormGatedOp, + Qwen3NextRMSNormOp, +) EPS = 1e-6 -HIDDEN = 2048 # Qwen3-Next hidden size (decoder and final norms) -TIMED_ROWS = (1024, 4096, 16384, 65536) # --------------------------------------------------------------------------- # -# Candidates: name -> (forward fn(x, w) -> y, has_backward) +# Ops. Each candidate is fn(*row_inputs, weight) -> y, plus whether it has a +# backward. Row inputs are sliced together for the row-invariance check. # --------------------------------------------------------------------------- # -def zero_centred_candidates() -> dict[str, dict[str, Any]]: +def zero_centred_candidates(hidden: int) -> dict[str, dict[str, Any]]: cands: dict[str, dict[str, Any]] = { "rl-kernel CUDA": {"fn": Qwen3NextRMSNormCudaOp(), "backward": True}, "rl-kernel PyTorch reference": {"fn": Qwen3NextRMSNormOp(), "backward": True}, @@ -50,7 +56,7 @@ def zero_centred_candidates() -> dict[str, dict[str, Any]]: try: from transformers.models.qwen3_next.modeling_qwen3_next import Qwen3NextRMSNorm - module = Qwen3NextRMSNorm(HIDDEN, eps=EPS).cuda() + module = Qwen3NextRMSNorm(hidden, eps=EPS).cuda() def hf(x, w, module=module): return torch.func.functional_call(module, {"weight": w}, (x,)) @@ -64,7 +70,7 @@ def hf(x, w, module=module): with set_current_vllm_config(VllmConfig()): from vllm.model_executor.layers.layernorm import GemmaRMSNorm - gemma = GemmaRMSNorm(HIDDEN, eps=EPS).cuda() + gemma = GemmaRMSNorm(hidden, eps=EPS).cuda() def vllm_fwd(x, w, gemma=gemma): gemma.weight.data = w.detach() @@ -85,46 +91,121 @@ def vllm_fwd(x, w, gemma=gemma): return cands -def zero_centred_golden(x: torch.Tensor, w: torch.Tensor) -> torch.Tensor: +def zero_centred_golden(x, w): x64 = x.double() return x64 * torch.rsqrt(x64.square().mean(-1, keepdim=True) + EPS) * (1.0 + w.double()) +def gated_candidates(hidden: int) -> dict[str, dict[str, Any]]: + cuda_op, ref_op = Qwen3NextRMSNormGatedCudaOp(), Qwen3NextRMSNormGatedOp() + cands: dict[str, dict[str, Any]] = { + "rl-kernel CUDA": {"fn": lambda x, g, w: cuda_op(x, w, g, eps=EPS), "backward": True}, + "rl-kernel PyTorch reference": { + "fn": lambda x, g, w: ref_op(x, w, g, eps=EPS), + "backward": True, + }, + } + try: + from transformers.models.qwen3_next.modeling_qwen3_next import Qwen3NextRMSNormGated + + module = Qwen3NextRMSNormGated(hidden, eps=EPS).cuda() + + def hf(x, g, w, module=module): + return torch.func.functional_call(module, {"weight": w}, (x, g)) + + cands["transformers Qwen3NextRMSNormGated (cast-first)"] = {"fn": hf, "backward": True} + except ImportError: + pass + try: + from vllm.config import VllmConfig, set_current_vllm_config + + with set_current_vllm_config(VllmConfig()): + from vllm.model_executor.layers.layernorm import RMSNormGated + + gated = RMSNormGated(hidden, eps=EPS, norm_before_gate=True).cuda() + + def vllm_fwd(x, g, w, gated=gated): + gated.weight.data = w.detach() + return gated.forward_cuda(x, g) + + cands["vLLM RMSNormGated (forward only)"] = {"fn": vllm_fwd, "backward": False} + except ImportError: + pass + return cands + + +def gated_golden(x, g, w): + """vLLM's convention (the one #468 implements) in FP64: x * rstd * w * silu(gate).""" + + x64 = x.double() + return (x64 * torch.rsqrt(x64.square().mean(-1, keepdim=True) + EPS) * w.double()) * F.silu( + g.double() + ) + + +OPS: dict[str, dict[str, Any]] = { + "zero_centred_rmsnorm": { + "hidden": 2048, # decoder and final norms + "row_inputs": 1, + "weight": lambda h, gen: torch.randn(h, device="cuda", generator=gen) * 0.1, + "candidates": zero_centred_candidates, + "golden": zero_centred_golden, + "timed_rows": (1024, 4096, 16384, 65536), + }, + "gated_rmsnorm": { + "hidden": 128, # GDN value head dim; rows are tokens x heads + "row_inputs": 2, + "weight": lambda h, gen: 1.0 + torch.randn(h, device="cuda", generator=gen) * 0.1, + "candidates": gated_candidates, + "golden": gated_golden, + "timed_rows": (4096, 16384, 65536, 262144), + }, +} + + # --------------------------------------------------------------------------- # # Measurements # --------------------------------------------------------------------------- # -def _inputs(rows: int, seed: int, dtype=torch.bfloat16): +def _inputs(spec, rows: int, seed: int, dtype=torch.bfloat16): g = torch.Generator(device="cuda").manual_seed(seed) - x = (torch.randn(rows, HIDDEN, device="cuda", generator=g) * 2).to(dtype) - w = (torch.randn(HIDDEN, device="cuda", generator=g) * 0.1).to(dtype) - up = torch.randn(rows, HIDDEN, device="cuda", generator=g).to(dtype) - return x, w, up + h = spec["hidden"] + row_inputs = [(torch.randn(rows, h, device="cuda", generator=g) * 2).to(dtype)] + for _ in range(spec["row_inputs"] - 1): + row_inputs.append(torch.randn(rows, h, device="cuda", generator=g).to(dtype)) + w = spec["weight"](h, g).to(dtype) + up = torch.randn(rows, h, device="cuda", generator=g).to(dtype) + return row_inputs, w, up -def _grads(fn, x, w, up, dtype=None): - xl = (x if dtype is None else x.to(dtype)).detach().clone().requires_grad_(True) - wl = (w if dtype is None else w.to(dtype)).detach().clone().requires_grad_(True) - out = fn(xl, wl) +def _grads(fn, row_inputs, w, up, dtype=None): + def leaf(t): + return (t if dtype is None else t.to(dtype)).detach().clone().requires_grad_(True) + + rl, wl = [leaf(t) for t in row_inputs], leaf(w) + out = fn(*rl, wl) out.backward(up if dtype is None else up.to(dtype)) - return out.detach(), xl.grad, wl.grad + return out.detach(), [t.grad for t in rl], wl.grad -def accuracy(cands, golden, rows: int, seed: int) -> dict[str, Any]: - x, w, up = _inputs(rows, seed) - ref_out, ref_dx, ref_dw = _grads(golden, x, w, up, torch.float64) +def accuracy(spec, cands, rows: int, seed: int) -> dict[str, Any]: + row_inputs, w, up = _inputs(spec, rows, seed) + ref_out, ref_drows, ref_dw = _grads(spec["golden"], row_inputs, w, up, torch.float64) result = {} for name, c in cands.items(): entry: dict[str, Any] = {} if c["backward"]: - out, dx, dw = _grads(c["fn"], x, w, up) - for key, got, ref in (("dx", dx, ref_dx), ("dweight", dw, ref_dw)): + out, drows, dw = _grads(c["fn"], row_inputs, w, up) + pairs = [("dx", drows[0], ref_drows[0]), ("dweight", dw, ref_dw)] + if len(drows) > 1: + pairs.append(("dgate", drows[1], ref_drows[1])) + for key, got, ref in pairs: err = (got.double() - ref).abs().max().item() entry[f"{key}_max_abs_over_absmax"] = err / ref.abs().max().item() else: with torch.no_grad(): - out = c["fn"](x, w) + out = c["fn"](*row_inputs, w) err = (out.double() - ref_out).abs() entry["forward_max_abs"] = err.max().item() entry["forward_correctly_rounded_fraction"] = ( @@ -134,27 +215,27 @@ def accuracy(cands, golden, rows: int, seed: int) -> dict[str, Any]: return result -def row_invariance(cands, seeds=(3, 4, 5), rows: int = 4096, step: int = 16) -> dict[str, Any]: +def row_invariance(spec, cands, seeds=(3, 4, 5), rows: int = 4096, step: int = 16): """256 rows computed alone vs the same rows inside a batch, bitwise.""" result = {} for name, c in cands.items(): fwd_bad = dx_bad = checked = 0 for seed in seeds: - x, w, up = _inputs(rows, seed) + row_inputs, w, up = _inputs(spec, rows, seed) if c["backward"]: - full_out, full_dx, _ = _grads(c["fn"], x, w, up) + full_out, full_drows, _ = _grads(c["fn"], row_inputs, w, up) else: with torch.no_grad(): - full_out = c["fn"](x, w) + full_out = c["fn"](*row_inputs, w) for i in range(0, rows, step): - sl = slice(i, i + 1) + part = [t[i : i + 1] for t in row_inputs] if c["backward"]: - out, dx, _ = _grads(c["fn"], x[sl], w, up[sl]) - dx_bad += not torch.equal(dx[0], full_dx[i]) + out, drows, _ = _grads(c["fn"], part, w, up[i : i + 1]) + dx_bad += not all(torch.equal(d[0], fd[i]) for d, fd in zip(drows, full_drows)) else: with torch.no_grad(): - out = c["fn"](x[sl], w) + out = c["fn"](*part, w) fwd_bad += not torch.equal(out[0], full_out[i]) checked += 1 result[name] = { @@ -182,20 +263,19 @@ def _time_us(fn: Callable[[], Any], warmup: int = 10, iters: int = 50) -> float: return statistics.median(samples) -def latency(cands, rows_list=TIMED_ROWS) -> dict[str, Any]: +def latency(spec, cands) -> dict[str, Any]: result: dict[str, Any] = {name: {} for name in cands} - for rows in rows_list: - x, w, up = _inputs(rows, seed=11) + for rows in spec["timed_rows"]: + row_inputs, w, up = _inputs(spec, rows, seed=11) for name, c in cands.items(): row: dict[str, float] = {} with torch.no_grad(): - row["forward_us"] = _time_us(lambda f=c["fn"]: f(x, w)) + row["forward_us"] = _time_us(lambda f=c["fn"]: f(*row_inputs, w)) if c["backward"]: - xl = x.detach().clone().requires_grad_(True) - wl = w.detach().clone().requires_grad_(True) - out = c["fn"](xl, wl) + leaves = [t.detach().clone().requires_grad_(True) for t in [*row_inputs, w]] + out = c["fn"](*leaves) row["backward_us"] = _time_us( - lambda o=out: torch.autograd.grad(o, (xl, wl), up, retain_graph=True) + lambda o=out, lv=leaves: torch.autograd.grad(o, lv, up, retain_graph=True) ) result[name][str(rows)] = row return result @@ -227,19 +307,27 @@ def environment() -> dict[str, Any]: return env -def run_op(name: str, cands, golden) -> dict[str, Any]: +def run_op(name: str, spec) -> dict[str, Any]: + cands = spec["candidates"](spec["hidden"]) print(f"[{name}] candidates: {', '.join(cands)}", flush=True) report = { - "accuracy": {str(r): accuracy(cands, golden, r, seed=r) for r in (257, 4096)}, - "row_invariance": row_invariance(cands), - "latency": latency(cands), + "hidden": spec["hidden"], + "accuracy": {str(r): accuracy(spec, cands, r, seed=r) for r in (257, 4096)}, + "row_invariance": row_invariance(spec, cands), + "latency": latency(spec, cands), } for cand, entry in report["row_invariance"].items(): print(f" BI {cand}: {entry}", flush=True) return report -def build_report(ops: dict[str, tuple[Callable, Callable]]) -> dict[str, Any]: +def main() -> None: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--out", type=Path, required=True) + parser.add_argument("--ops", default=",".join(OPS), help="comma list of ops") + args = parser.parse_args() + if not torch.cuda.is_available(): + raise SystemExit("needs a CUDA device") torch.backends.cuda.matmul.allow_tf32 = False report = { "kind": "qwen3_next_norm_evidence", @@ -247,26 +335,10 @@ def build_report(ops: dict[str, tuple[Callable, Callable]]) -> dict[str, Any]: "git_commit": _git("rev-parse", "HEAD") or "unknown", "git_dirty": bool(_git("status", "--porcelain", "--untracked-files=no")), "environment": environment(), - "hidden": HIDDEN, "eps": EPS, "dtype": "bfloat16", - "ops": {}, + "ops": {name: run_op(name, OPS[name]) for name in args.ops.split(",")}, } - for name, (make_cands, golden) in ops.items(): - report["ops"][name] = run_op(name, make_cands(), golden) - return report - - -OPS = {"zero_centred_rmsnorm": (zero_centred_candidates, zero_centred_golden)} - - -def main() -> None: - parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument("--out", type=Path, required=True) - args = parser.parse_args() - if not torch.cuda.is_available(): - raise SystemExit("needs a CUDA device") - report = build_report(OPS) args.out.parent.mkdir(parents=True, exist_ok=True) args.out.write_text(json.dumps(report, indent=2) + "\n") print(f"wrote {args.out} (commit {report['git_commit'][:7]}, dirty={report['git_dirty']})") From 3d0bae7174c09a133ea1288d820b63e4a7db8f57 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Thu, 8 Oct 2026 18:11:14 +0000 Subject: [PATCH 40/70] fix(scripts): readable Qwen3-Next norm evidence figure layout Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- scripts/plot_qwen3_next_norm_evidence.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/scripts/plot_qwen3_next_norm_evidence.py b/scripts/plot_qwen3_next_norm_evidence.py index 54dab1a67..41c444100 100644 --- a/scripts/plot_qwen3_next_norm_evidence.py +++ b/scripts/plot_qwen3_next_norm_evidence.py @@ -22,13 +22,13 @@ def _short(name: str) -> str: - return name.replace(" (forward only)", "*") + return name.replace(" (forward only)", "*").replace(" (cast-first)", "\n(cast-first)") def plot_op(op: str, data: dict, title: str, out: Path) -> None: names = list(data["row_invariance"]) color = {n: COLORS[i % len(COLORS)] for i, n in enumerate(names)} - fig, axes = plt.subplots(2, 2, figsize=(13, 9)) + fig, axes = plt.subplots(2, 2, figsize=(14, 10), layout="constrained") fig.suptitle(title, fontsize=13) for ax, key, label in ( @@ -52,10 +52,12 @@ def plot_op(op: str, data: dict, title: str, out: Path) -> None: ax = axes[1, 0] acc = data["accuracy"][max(data["accuracy"], key=int)] metrics = [ - ("forward_max_abs", "forward max |err|"), - ("dx_max_abs_over_absmax", "dx max |err| / max|dx|"), - ("dweight_max_abs_over_absmax", "dweight max |err| / max|dw|"), + ("forward_max_abs", "forward\nmax |err|"), + ("dx_max_abs_over_absmax", "dx\nmax |err| / max"), + ("dweight_max_abs_over_absmax", "dweight\nmax |err| / max"), + ("dgate_max_abs_over_absmax", "dgate\nmax |err| / max"), ] + metrics = [m for m in metrics if any(acc[n].get(m[0]) is not None for n in names)] width = 0.8 / len(names) for i, name in enumerate(names): vals = [acc[name].get(m) for m, _ in metrics] @@ -87,14 +89,13 @@ def plot_op(op: str, data: dict, title: str, out: Path) -> None: no_bwd = bi[n]["dx_rows_differing"] is None ax.text(max(f, d) + 0.2, y, f"{f} / {'n/a' if no_bwd else d}", va="center", fontsize=8) ax.set_yticks(list(ys), [_short(n) for n in names], fontsize=8) + ax.set_xlim(0, max(3, max(fwd + dx) * 1.4)) ax.invert_yaxis() ax.set_xlabel(f"rows differing (of {checked}; row alone vs inside a batch, bitwise)") ax.set_title("row invariance (0 = batch-invariant)") ax.legend(fontsize=8) ax.grid(True, axis="x", alpha=0.3) - fig.text(0.01, 0.005, "* forward only (no backward)", fontsize=8) - fig.tight_layout(rect=(0, 0.02, 1, 0.96)) fig.savefig(out, dpi=130) print(f"wrote {out}") @@ -106,9 +107,10 @@ def main() -> None: ops = report["ops"] for op, data in ops.items(): name = "figure.png" if len(ops) == 1 else f"figure-{op}.png" + hidden = data.get("hidden", report.get("hidden")) title = ( - f"Qwen3-Next {op.replace('_', ' ')} — {env['gpu']}, hidden {report['hidden']}, " - f"BF16, commit {report['git_commit'][:7]}" + f"Qwen3-Next {op.replace('_', ' ')} — {env['gpu']}, hidden {hidden}, " + f"BF16, commit {report['git_commit'][:7]} (* forward only)" ) plot_op(op, data, title, path.parent / name) From db420ab3fcf0cb49cf667b27bd17d8ce9414eb07 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Thu, 8 Oct 2026 18:18:42 +0000 Subject: [PATCH 41/70] test(gdn): L1 batch-invariance check for the causal-conv1d golden Every sequence of a batch of 257 is compared, bitwise, alone and inside sub-batches of 2, 7 and 64 at other offsets and a shuffled batch order, with contiguous and shuffled cache blocks, fp32 and bf16 caches, with and without bias and SiLU, over three seeds: output rows and rolled state blocks are unchanged. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- tests/check_gdn_recurrent_golden.py | 46 +++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/tests/check_gdn_recurrent_golden.py b/tests/check_gdn_recurrent_golden.py index 7815939c0..d7aa3f34f 100644 --- a/tests/check_gdn_recurrent_golden.py +++ b/tests/check_gdn_recurrent_golden.py @@ -294,6 +294,52 @@ def test_conv_state_update_is_bitwise_exact(batch): assert torch.equal(state_got, state_ref), f"{state_dtype} batch={batch}" +@pytest.mark.parametrize("state_dtype", [torch.float32, torch.bfloat16]) +@pytest.mark.parametrize("activation", ["silu", None]) +@pytest.mark.parametrize("with_bias", [True, False]) +def test_conv_golden_is_batch_invariant(state_dtype, activation, with_bias): + """L1 for the conv golden, bitwise: a sequence's output row and state block + do not depend on which other sequences share the step. + + Every sequence of a batch of 257 is run alone; sub-batches of 2, 7 and 64 at + other offsets and a shuffled batch order are run too, with contiguous and + shuffled cache blocks, over three seeds. + """ + from rl_engine.kernels.ops.pytorch.linear_attn import CausalConv1dUpdateOp + + op = CausalConv1dUpdateOp() + batch = 257 + for seed in (3, 4, 5): + g = torch.Generator(device="cpu").manual_seed(seed) + perm = torch.randperm(batch, generator=g).cuda() + shuffled_blocks = (torch.randperm(batch, generator=g) + 1).to("cuda", torch.int32) + for indices in (None, shuffled_blocks): + inp = _conv_inputs(batch, state_dtype, seed, with_bias=with_bias, indices=indices) + + def run(rows, inp=inp): + return op.forward( + inp["x"][rows], + inp["state"].clone(), + inp["weight"], + inp["indices"][rows], + bias=inp["bias"], + activation=activation, + ) + + full_out, full_state = run(torch.arange(batch, device="cuda")) + picks = [torch.tensor([r], device="cuda") for r in range(batch)] + picks += [ + torch.arange(o, o + s, device="cuda") for s, o in ((2, 0), (7, 100), (64, 193)) + ] + picks.append(perm) + for rows in picks: + out, state = run(rows) + blocks = inp["indices"][rows].long() + where = f"seed={seed} rows[{int(rows[0])}..] n={rows.numel()}" + assert torch.equal(out, full_out[rows]), f"out {where}" + assert torch.equal(state[blocks], full_state[blocks]), f"state {where}" + + @pytest.mark.parametrize("batch", [1, 4, 17, 64]) def test_conv_output_matches_provider_with_fp32_cache(batch): """An fp32 cache reproduces the provider except on a few output elements. From ba467508cb935d4049552436c4beef2a60c1a75f Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Thu, 8 Oct 2026 18:32:22 +0000 Subject: [PATCH 42/70] docs(norm): zero-centred RMSNorm evidence vs existing implementations on B200 Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- docs/operators/qwen3-next-rms-norm.md | 28 +++ .../qwen3-next-rms-norm-b200/figure.png | Bin 0 -> 241252 bytes .../qwen3-next-rms-norm-b200/report.json | 225 ++++++++++++++++++ 3 files changed, 253 insertions(+) create mode 100644 docs/usage/evidence/qwen3-next-rms-norm-b200/figure.png create mode 100644 docs/usage/evidence/qwen3-next-rms-norm-b200/report.json diff --git a/docs/operators/qwen3-next-rms-norm.md b/docs/operators/qwen3-next-rms-norm.md index 81fdde9b3..ede972b3a 100644 --- a/docs/operators/qwen3-next-rms-norm.md +++ b/docs/operators/qwen3-next-rms-norm.md @@ -98,6 +98,34 @@ The CUDA path reuses the existing `rmsnorm_fwd_kernel` reduction (`block_reduce_sum` over `choose_threads(H)`), so the offset costs one fp32 add per element and no extra memory traffic. +## Evidence + +![zero-centred RMSNorm vs existing implementations on B200](../usage/evidence/qwen3-next-rms-norm-b200/figure.png) + +[`report.json`](../usage/evidence/qwen3-next-rms-norm-b200/report.json) was written by +`scripts/qwen3_next_norm_evidence.py` from a clean tree at `3d0bae7`, on an otherwise idle +B200 (torch 2.13.0+cu130, transformers 5.17.0, vLLM 0.30.0, FlashInfer 0.6.18). Hidden 2048, +BF16. + +| | rl-kernel CUDA | PyTorch reference | transformers | vLLM `GemmaRMSNorm`* | FlashInfer `gemma_rmsnorm`* | +|---|---|---|---|---|---| +| rows differing alone vs in a batch, forward / `dx` (of 768) | **0 / 0** | 0 / 12 | 2 / 11 | 2 / n/a | 0 / n/a | +| forward, 65536 rows | 425 µs | 2148 µs | 1449 µs | 1449 µs | **90 µs** | +| backward, 65536 rows | 30.9 ms | **3.0 ms** | 3.1 ms | n/a | n/a | + +\* forward only, no backward. + +- **Accuracy is the same for every implementation:** forward max error 1.56e-2 against the + FP64 golden (BF16 output rounding; 99.999% of elements correctly rounded), `dx` and + `dweight` within 2.8e-3 and 2.1e-3 of their maximum. +- **Row invariance:** only this op and FlashInfer give every row the same bits alone and in a + batch; FlashInfer has no backward. transformers and vLLM differ on 2 forward rows in 768. +- **The backward is about 10× slower than transformers at 65536 rows.** `dweight` is folded + over rows in ascending order by `reduce_rows_fp32_left_fold`, one thread per column, so + that the batch `dweight` equals the in-order sum of single-row contributions bitwise (the + gradient-invariance contract's singleton-aggregate check). That serial fold over rows is + the cost; a faster tree fold would not pass that check. + ## Tests ```bash diff --git a/docs/usage/evidence/qwen3-next-rms-norm-b200/figure.png b/docs/usage/evidence/qwen3-next-rms-norm-b200/figure.png new file mode 100644 index 0000000000000000000000000000000000000000..a408aff9c5b251764da2c9a76b1b5bb69a61366f GIT binary patch literal 241252 zcmce;cRZH;-#>n$VKk6cAyKk-8D(TAWlLsO(y%2n6%v(QL_(Q`NTG~6BSHv8GNP== z-mBm9xUTzi|L*(u`2G9+{&9V-&*kAf9mo54zhAHCdL6fPPikzX-9<|xk+vSwRMjVu zHnWpR8=0s#;U@zY4&C^doQIl;hk^514=-ysd(sJO50{J19v2;LxGvkfxjQ;LNs5Sz zi%1A@o%8T;ahDSnz4YI|A>!=jAR2gQ9A84BanU^OP9p7CC;p+>94i|{q9BousU9`F zk~G%sWx~|nzIk$@C7g?kFN|71t>DbY!`uRCA1rO!JJLSHv)vK@aL%S)$9AH;xPwQ% z`g%vTh=2fXn*N5PBmPY*nsb+^iQ_YRGi~i|ne!94LB}u`5 zSFuw!IZ@g7_MmoLmWHf>c-*NUT!ohY!adG0o#MGDN#6}~*yk?Qd+S>Bgh zL}Xhyt7u4g`0;CBPcgmrnz&n4r8?IAhSk{EINf-gvCHP|oK?$nqo31{v#!pz>ZDt+ z%eoIXTzm9rPsYiIVVv?lv6o#t95iKWNGYfCEf>e%OfZSCGBRG*d#p}D^7HdcdHnc> zef_<@iORp~??bj0oc|&a_f`5_GncBW>Y0XkaW*-REbX1IJx4=ES~CTOA1UeRY-biU z4oXkozf0Qb_WYmk@4tREPXA+AbhqpBM9-aEvtmk8!1BlekC7I&^h@;@%1cLvhig|a zKS)dz)E14?avl9DoTPY_^WD35)Z4e;tf){(N=jWcO5*>gmr#yQ%x&%zD+Z?sMmjigY(Fhz@?d? z$0rgG31sfL>lwi*FXs8%@a0#0Vt;N?)8ix?8yhj)*OSals>OwXw1)0CUapIi)*Ci$ z;^yb4$;ik!*Ht1OvSsIWe1BG%r4iG-kI_8^FG~dl1&LM(NlDkCMh^4W9yINF7Aknk zLPA0=!_9l+>N$7s4p+Ikt?&1jr=fT6s(;Bb`ds8_u!Td8iIOF zK6^Igu|@=oT;*nmvSNL_!+Tn z_K}#Fm<)3U&TK5U`^ZSC#G`(j?@t8XQD>nEn=jML-GRw?3mZGA5NG)zUF+RRI+aU8-i@K_6Xr))(y82!AV66A7jKnXi+Yp z(#6rCR9(-^JbfoCh_I8F`@ozFw)@K#R!b zs4yG=l(XiS7f#6>K8(u1qMyxl?b@}D5?3B&6%}!uzm9L;m|q_p6|G#oo@en!nLCQ< zL>~(C0B(wgjzx&xH*qKv#~@4Z@ur?K?;G;I^S{1pSq_)>q^Z%#$jRjxy~4-BmavL@ zQ5=sRJvuozS6%8p^yBBx8yP1O``=!p8vgS1zNz<+$KQ4TBYunY>gwv6T3Tf66o#EU zX^tPSryNRnvr3|8Wxa{Dv-$MkAaPUp+*E%xonfx2kvZ?dgUovr15}?H=QbDEYIJmV zrk($i6B-)&7F*wSyi0bhqkwADrcEYqF6Va1?bxy7Gj15ik&GKwTwmll|Ml6eH(nF{ z5sK@9sKg=L_uTzi6T#|eYWym8&^z{ff~3Q9hbB%e(a*m3H@!vPc#P;@>?zwxYA$tm zASwq73kx+3&AZN*7pAZ=wd2JoaHv$izq&+Mz&e4&-{H8c>b6Z;#@j0x8?Yrw6O$zOfIkMgo|6pj)$)NLr ztzPHiMWNGXW;;me1}x=%OZt6o4o%7Xsi>$Zl^!1U66w=tsf>?jt7~X5lo6GadysP~ z|0Ibhx#x$3XI(tp+!)RJ_sF;?^%Zu#k78yX@2g!O4RU{G@#eD4L}GKZZs`EioXbA$ z2L~^(P^9?G{T?Vyo}KlW>M6H=zbV+h_UTPq%iPI5@;<7bzuWeb?9QA~!j|4xcQbVO zyL07!lGND-w&}@9E>e-*$LJ%izxG$oRroDMdw6;>TMlJsXV3P%-<S_g)g6brJeB z!^v)!YJ1?uB^O#=1(7=d26}PTy*07_;}6v`S}fj>UVa<4f%Z0iyt+Ln+;Rd z&@fO|zP>nte)6>Iy||Fj?b~i_9bSZH-oMnOFIjpw3JVLvq$Uh9Pco2xe=p8& zm<77orQjzs^80s7M}aLrH@EUw-<73ldpB3tRN$Oepa(+(%g9W8_nXr%3qb8 z@1sKbgoW>DpE!}N98Al!XOETLlEeoS*M82sw+kek(NC_d%nM@``~Lj7gAFWbo`>3Q zQtZTms!g+J&z{A_#n9eh>=v4n59NYscJS7|R5vem+kcni@TRR>w_fq}tuH$Hsjf~L z9Xl#HnK*)vZK}g091RQ%Tql1VU0hz~mXKid@$qrFeE9>~AoD!~llIyu9&wv0YIa$- z4Jf>-c6R%K=YEWg+)7osseJtS`uxSSXEQwZBqS!judk;An)`r%Vka8>*mmx;#u#f-+P?k4g9qmaQX3T#4qe(c-c@=7t>5Nznwpz;a8M8du4?P*$kF?cH((t&;9ivwB`Yf{ZAt%S4-Y`4CW*T{B{zv$RWx{+iCDbeCoRm!N4>HzQS<)h z_9);;6!H|Dbv6mRP_lE$l`B`c1O@3dA~@CD+$1iKciqCT@*FzEBI(emntAdeiL^(- z?=4Dz%go>jzvWq)!NI|E-(LxbY~3A#=JdYMJe%U;L+syC>uFBhY-kH(*8hWReVp zv$J!V@4~h?!BZb_xm6xb$@1^7QEjHDrw;@IHZe6Nzkg2!^nCr*t5+@lMHkvdlH`3^ zP`|P)%jK45M{eL#IWO}!o<4nga&nSH!fqhe;jq_u)s4;DC#QaDG$crFE+{B4!H$vh z7!I_$x@OenU~O%kWth$AGdp|@r9NC<+^M(X4tmfJG`Z&1Ru!zF7>;}J!mX?R(Auq?oVM-Wy?gfe7rMN>Jc)YRUMJ={*FN&b)wy;n>aAOYuU(_)>gpms%eHHm zKzC0`i45`a_IxW1ZS5^M1fL7-kKbk!rvwmns~@r)Lc1cKLz(x?rq0ez8Q1=xhT@wS zFJ63p>HDEBl+uqMKe~8$Q~~M`#havLYPxHFqBnwgG;(sg4jnqgCV5snJHYA{m+7mE zG(0>!NphaFm22~fi(B8X-e#9&M6-Phkm0g0ZXtE4)3DF2r>7_M)~##F$($9d)AeaW za=WC?1-@`-B7gg~^O1r-85H5J|H^#!LmhSXka(xs$h}053Z`Ryj_0nOcqmu1UMS1r z&7t34bHhPPxFjU>&n9Cvy8Hz*aW}TzuRVzkkBwVBYWduE!HM*?xHmwsJ^bCLPg^Z5 zEfz4-lH?d$hiHY z=H});V{Lt{@!{d8tHRI7Pww2lUDZ?W+cz;05wS;++}6efPVym?f#+B95b4`Q@|Qdd zvt0iaZO3E{*-uHbI|vMn&cp2F>%_poKne_4TmJY-Qc6k{WupL$%(XN+vVG1}x2|Gy zb{O^}w}Jxawr$%?UR_Ke>m7Adc*K%U>;?2(U?yceOo3B*w{aeRbB{~=#d9X zCSe1s;P_m;bZM%Z)r!x*hd-~kzrRj;!C!N6{#$FN4uzc+6p=X}44N>)93ae{oXpYO%@iJ9)cW`h*c6q>fVe z14P*pGB2S&dGcg!Lqio7o}hzxvRiRDUTT$})m;)D?o2zP1GYi9x*(Z$Le>) zE_R5uJv(jS<;LeHak1fr#gI8NAPQb{}^e>75ac+tnTQ}i= zoO<2WmTlmQ2c!K!iUzERHFI=$IK`?mprg!Nk~l@KKR;ww?qIWh_9X6d6;ScCL9XdR zN+kl?J9?)YU9JpRt8z4Zby2S)EGjhXSPZYt@d-4ij}0>m3#^q*QHhn6l^rt@3y<#I zW68C6V=VIN$*~w}(g`r3zG8M#WM*b&OY&{+k#8>!P^17(KYeIC+=t4j1r%%}NXCY( z6HYv}UBh$XBj|rEFp72kkK4Dmod2A*ks{^jjZL>&gDqX_)(<)NBu&f@uBw|@UX?wT zuKz&Z_mCrj2*192chuVXxb+fFP-Ik8l=cGvB}RtN_*>P+)1`lfgoQ`Yke8ecoB-h& zeYyCS6XiT}%paiVMc%k^gFJ9hO6nW{xSJ#Bpb80_%T=rLQ5!&bsU?%L=ti}xC^2qJ z5gdo_m6es*-P@6OJljx9@@#{y&qWY=zJ2>t^Tx1G@suQk9XD;~)J9h@?u=1Rz-@>} zpeKY66;FEM$xiu<_Esux8ov`g~rZL$=$^{M4g^ooj#64KJA;u{+pZZ|$s6ur+o^lJMqDNWux+1dOIYu_cV z{^@*a`0~6_Y1!QDY;8@=O*D>dJYU+TFK7fgehpeNE}zhgZ$Lp%V!RauemMdmL86|2 zv`;n^6y2CF{a)QXU~Q$B+;>o)Hcv<-_9D*j>TZg=zVT|qiZeixg(uQ z$@rm5olj;Ht-}JSLSwHU7Uto(v1toiikK)XE9(P53W_j%f>&5?-u;o-Z?$nnIy$=7 zK6B@z#&28~$OAmQ(4H3+60&J-`16g>&^+_fwAldebDc%}6m`CAbTzz{&X2MmKX1Qq z)JJA85W2};BR3Hvaz0}Tm>6dn8d<>{%I^z`(u*9Q+Cbo^Fm zPdoEa+%}}eKO;3YYG}zaawSg!b(M!}TlG&?P&pjWouenU zeEph%YM8Ku6T_>t-hKRN)1B42W2&>0eJa62Ig!psePt?q=Cu5zV^?&(6^91*YHDa` zpgAUxm(zoTH_H1j8;aznao!cRETf;eRQKBu=jKUzy4tQ?yJiPJ?JivcYCpiWVzJfs zcHCw{4~%mpQ|(GwrcWjxZ$hyQZ?&xOJ4VWa=pmuPNwd96d0-fO<=)5RY<2q=s1|Tt zRU|#sK}V3eUw{6b@SPt^#aWJ0<=%TsRT@G9NT-brKQF0o)L?S z(6GWcv6?3 zap2{=r}uFv1|+So&gh)~R=EETyR1I%i7QuRjPlGANV)(H#8&c{{&lRg*m;lt+?P`} z)gIVJ5+gx@DfCM05_Z%$<>A1MN1+8iELj7#i99wmG^ByXb&%rQ(fOpBA6P!OCDi#y zRqoU%9*q|C{EwisTdLNfoAyhfwx^>iwL%{{2kv3`;_L~^LMjKSLlXA%l<{EuvolSK ztysd5AMbATd-RnsN&U#e0-!nnb9eC?YHGLI6C?kk*`7nU_m~~l+jZz-e0%_q(uP3L zJ7p-D>6L%i6En0ExH-cweSdXpG)^nMf2jq6p=o7+{2Km(2Si2FvMb^*&wtU%VA%Az zvc2483~)jX4f8SZS_^P%^|b%rwFS5DOTWJeiU&G5IB4Mbrvs|B;3j9-EhQITZD$h; z+{SrCv!bG+Kb)_xItWk1D97*?i-@@%} z@$D4;y3Njf6ralqR(@0HRF16~w_2AMCUlhEh0r!RmxB%WPu#wC?P&7*LH_>H(c?<< zbn6`*CJEl;aGU||h1~)rK65!G+7N4_o(OO0d)@lw%YIv1+hxG$e=ZNQ$?xXW8;kuq zpCv;I10TCMvm|>F5B|W(q!d7a@FtJ8e!$BhOLX>6cuy`?rA_hp3Gx@8ZlcPYB|SFl8Q3*Y7O%l}2@8T1+rVAY10| z-|6DFF#fP)`$TW0PQF!T29z9qY{YCZE-CjxZ69pWYxSuOXkOKGMCC${)o^G`N(F^z z#tMI|tJ88CZtlJM*Fsy;<%g1--=f$AN71$@I1JgeV5GVMZ9%0dCzaz%Eb0J_Sj1j(CFTTg&e#W+s-3^wd6 z_0zb`c696RLr*}g?p*%UsRqd_gV=f3q;ILFxnzC4-s2U=u!~&!=FQWhGP(8TQBlgm zn=el7laYxhN)WSvVG52!ba}b_Rt~w?uI}z^NMS{OOKx!?THCg7KY&B;T5`q9%PYZM z3{5LEY<$;4X=l!d3jPoL{Qdc5WK8@N##%EYv|sNya58j3pY-eJPaa9Dtj&MA-<&$@ z^G}i9xo3~g!SikO6Xk-&&r*ne45plg(zq{5vueo1lk%?Y&A*2vB_D%qge@HJ3!n(Z zBi|cya`6sRp3bRLr%a&=5bH=3kbH!B6I$HFFrt`-Th?8+Dc!uYdB4Y|6`KC>t{tl3Jwm=j#bZ^Bt`BVvK;na`0xZP;jh8mm-xKB`wLLkuBVk1OEdz-|!OujbTe{azg;e|g zy~@bE{n@k8iHW;QOH1`yGfsSLYl|i6;#zB)nsk=#epDF`wDs|k11U))HKU2x|5x$e zyS%X97dw_uQZfeXNOS}OnLr1joe{k2EJNGdK>&X3fi(ajqDui|(^kesM@MtdKWOOw zZAo2X^wjtc&e5-y%Ofqpq{tU9UUb#RfT|RzWyn zF=RJdQC@K70ZVO~_O!|C3SRYpp^r^*#vNYNV;R^cqi}USsi>$3x?1h3@c^^S?T83g zt6lt^gYY2eNja9~ugT6_%tmj;6%;ImY{z>WR;Rt;He4}xuh5nYSS`6C^6LxT(Vf=i z&?WjOGVu5gI<}~;ZY_B6!eHg_DfHkrXf~8g5fzb=CXa8se4>mTxn>bx6uj5m>%)f+ zZso@yl4V)H581#s-j~VugN>Paf5kI{w$YX1C^!2MgNXqWEr+%WJ-SJb} zOXn|n?8bGz#u-hn4I^&zE_(ZaXvTKOob0&&@C&=zTTZ)6!% zFz&cu)ltKEOErUGkKVlebDc*D8v_~l4~mG~g^YIY$J=ZD6M>UkHMqGU@VL3Tr9tn?DpTnDChcV_k(O4f4)g<7 z%BoAW#TO7Gn>`&hhg5}opKk=9s5>K@C^`kpz4ZqMH)6xnv`S$5T2lw7{k6wJKpr?mQ zt{*=L;>Lsm${|i~=QA{&R6HN5IZC1IJvV$@L-7A^Egtmgg?GDzX3r zUA$t|=kublP@k=f*>v9pG*ouwW5WzF?rgcJHk5_FMLE0T8S3;vp@RpYFfkPGclZgF zW=p}%DQLA!gTh6e?O(s%EA^rqCEU#``JYZ?=?ePl3C_B}h>RyMDN}9g8_+#{@9+;z zRVkm@bCh;wFNT<1_AM_gMwZ=gCjxJ%)9YMdw08 zA;@6QIjm~I(Hj2GITjud{0TGcSK|RQGc(gtw{-G~q4l_JaQS?&f0C~q-8;x1)yp^K z=CVRVsi)W*vc(oG)Pm&V3JP2cZX18jvp7r{8^IU*=9*<=AdlYVpH`ke38oUr^C4S=TB$uMo3{ZNR&0Mo7>zBdQh<$Vl~w11(I zp>1FH>h;fb2{>~ms zNF@B9;nC5@FhPf#Q>h4nOz>3RTL|^*>+71@+Cea>a*T5Y27gXWZ0Ej?v+J`ko?FBY zmy$#eU3Njw)qam+abY1PY2Utme4kDk80-LoCKW2?t*rYirgZHLzQ0sVUl5FW<&^OdTqstq`j!RQ_LM6I@w&b4N2J^Sf_(eNMLY9O3u zSl%$yexN}1yV7^P_M{^bntYLSucb97WNcC(_NQRdM1McG^dI2bNUikd=4K_3M5c_H z+1U+|{?B^Lys38YPCQaP0LiVkwl*+1IXV82;`TiXsyKr{3*zV7_|ogEYig)!d(;mc zIFR7I^sp5jTT@5pCMcYieO)eu5Q+8|N-~G;i&`1`Ttwu8@1EHt7&A!;Dl2ma1oCTu ze#r{{rYX~uVG-UZx9*Y(ght)vas2pkk`l~QYq)dLRwa9AYN$vEMf|{{0**~Z5MvQ% zr?0P%!p!WuUw!s7cKFPMhK`G4WMn*JXSaa_Ra04CpOM5TUlTNfu1aJi9vr$PAlduz zBMqQu?F)10zWOp29g2;OjkH68or(h=lVsfq_mt4H3Hcn9bozuOoQ1KT^4(Y;^3Cmg z&OnYQQBzaDg}6sSB2orl-OxPqj7sM><=g(N@DcIb&mU9p=(|>|>{$ z!ntDt#%IrFwD>`}toqyJ?JTI>nWh^*6q6L>`z$drku32WVj~E32ev>|26Mm;C{l6j zywp%7COq~2+$dvO@Q#g(3&vBYB7sC~ft>lW&I`8l?0ENXG*^T^He=u3f%n5DCB;N| zP^(Kb1y~dF5*G>(M}5JGRm4|5JybYgUn%&z&impMeg5&Da={tjl`p5PQt^CbeCLIr z>>2D^=>1;oOhuCO{JjA+DXxWj;V(#w;Myn1WmVPTtWyBO!81g4DO>v>4OJEAfs0#J zUA-Sx9-)^4&0U8B)rX@kQRyFy*vglQz(NP}&6_tP(!zra+|GF<5L~libz!3SCmdli zv`Bhp=3uNBeUywMY#BoKEHC35e8YxwMiEF}5g{4o81gsG!cIfS z=Z`LAsy_JOl>cLx5gjitumT=`Mlc2kj*E+nG(J8qCM~Ujn1<`h{G};bt1C4>#>ex- z6g``^8r3COJ=8wUA*)DU*Ec=|Ub7933O(Xb@GEM+fFEab&urs6ASftU=D%V*Fhqgq z#+E$_?Dh9WYp^N>P%&JST`D4=Pn69wi%UvUk>ImFEjsyuP4L9Ok`NpMmcM_&Jp|;t zD*abjlrF0^lF7V)b1d(D0zJLFI%Vww4=;#Lz zXcZMJ{pw?ql7ysBe7j67x)%I4i5uW6PeK~0CO=pRlT%agP(1p;rW(zl9f0if-ESh? zOB{vt(a+7zZ{Zy^zwvSwI$gK{+{@5(JgwsZ$guiQ<3rcwSx3@aunFc(N5f1J3L+9- z@NwA{1I+uv)vZ^q-?+iR&Yt8D5QgUgLtR8#7|%)RawUY1r5O zV~067I7&Y-Q9>7pfAF9mM-QkXD)CWo1w~lEUp`5MbB~%sAH+l4R;zdwn(FvcJ7jwtD9drVmCD(r&k1_y*0 z7XK9YqSOV!faUYI7Lj72-<8G}?QYo^vN8CW858Y{Uvx~)LPy$3!Bt)yDj3odO%l*C z`I0ORSCkT>Wg^f$?!vYtWM^ak$YcX8E!v9Z--1BBefO;b-r*tJ4WjvQ!a*Yrb;a7e z8O+Y7aaRLqeai)oTgAGKkLFh_Yvs8{WMuFXavR~4LT-gcpKh+JVL_g;7*}`o)*CQo ztjilN-o;nZ+aJArM^pf1USjAA>;@u9S5i{)0}(gE_R{{@K<=su`|ZV*?}_J0h3~SF z-3Za)Jt0(v*w^hla3K6>dRoZ@Ew+&>k^rRI7YugR)Zd>8{fPe#Zg1Cfj7j4(t^1w9 zIqg5=<06~b!AE?Fbe-zHie48lubMl%rCktT^Z3(wuqn{?Xd|TDgxJ_1Ega8 zw_Pe|D>njF+#`aX#u;FC8%#}23C9a2uaS=w%^taWAWk+TJJ)ze_wN_y?S~U?5ANJS6Cd`~2*ui0A%DXuj`5lzm4V++HAD3*lB zChgSq7KD?qXNi7VxxOqIu=1x^IbTDjrlqwt>cNAY$@J@n0%|rk+@$KEOUEV>%eu;a zS#eN=3s=#q=pNR9gWZO{__nEOJHnG$I9JK_$M-Q3g%oA^J;X6_+>hPavo=T=kRly^ zMyI*qIZyrlvedmJKoWUEBr!_hb~Y$@x(H8 zAG2m1|1$crWMB&?HpQtv30aNnh==icye;5r^2#~lKs$8fwS4PNU2vY;yQQ}wlKT#P z&yMo$zx`3ka+GCofc*rYj0_v>Ol2rQAcw&eRGZ!+LI&VNPbI|3$qCRWQQjFgUGWCM zgr4DdTQ(6PVG$6u4|12U{E?Y*`o-C5{cS1d@;;X(XS*LNX{@V@rsI2!mV!-&mZAm_ z=ZZiNX?lW&*2n4Bsm7$CM}_{8FHWWk7)@`~nqNPK@IcX}?<}YC%-=!nA`-HMTMd+P zuD3!S?0H68G%3IO^XPr?4`I8A47L4()YQF1^FjpYV#jj|6jsmV@*Xmo?6SJ(N>b{r z@E;g_gG<2QCN4o!lbS?CR7iz;dXQ8jE(d*`-~R`Tz%@L76&#vr4wmOnsB?QDnh?p1 zf@xW6@`m7RY(^ob8~#c462YIB=a~UD(p(bA<1qjdw!dnlxVS-msE}E$0s** z(HUC#&(UP4YMm~vj&~mh4yu^|hkg#hhyR2g-;+Q@28I|)Jd4|mSG=kK^cD`?o@?K}4Jb%N zYkTb93lWZy)lv_>65ppkalOGYKacto0`Fc`C^X2 zy)VEqY$gUW@}iGK1hH0-b#K;Dmv2~^8$EDxhmYVWaKDP<5U=?GC?BC=VFCq1n~d_> zqmj*^0AnWblw*Ekl6*~A|Hgtzzs!?VJNr!Qp0ZX>CY}Cz^(kFW$wZX$n&5)i&Hq5i zRY^(7Y9E(Ihu7%vJo54!kYL}UL=Pl8q@|@X%?}IYtmGklh*ZN;a{JnwlPvJ+unm-)=mDt+w!3&wC0^zsZ8U^egp znWP*si4&GVGcSt*7T9dHIqWmNWo>Ws?=3U;1Kt~KeE8I(6d(74f2Dc+xC(-@M2x%C zK1d6GoG4(d9tzo1^^r)9$OZ&u5Tb~Rj-~{0E8Xk_<03vWF}yyGS$X1Z7_(sAk^CiMI7T4TE)6CzB2^BVfag$_hvtkNgQ)Iq-Q;3+b1WAKH`?;4sl ztqnGfYq$YI2|mIJs5yK@SV*WUdH2%8V)%#xy%)5Oquw(2@X#%{zq<6Do4*}h&-(oN zFaiL9_AH55JvA0~?Z$sHS#{3AjH|ub-Eiq+^nRP?x_S|O_Ur2_&OoI~$B)y23Nl_z zbpK0J-VI`dIFQv7d)A8ZO?;fR#?*{E+1TEG|8AE4^C=>-0g~s?nA~O{$`Z_y^o@sx z$%xqfHOY!sE&IaTV4C#fai}F5FP@lOSg3(cMyEU7uh%m48Ji%^Qb%^;J0hvUuvHrt zii0`7z|ody*EmU@%Y#Y#mA)=Gu6NEfI>53Oz;TQdM)3hIYfj|=`#Ik>O%t> zCHI_q%CaX-KGf8NZ#9kef00`z80PS)jCwA=OWuUeeUD&H@3l{f(&6uo1__t0s;1`s z+qX&?oI+c^43CXHdp^|$U4khuGi&?}oa!3Ty439KTd+AGQ2H=r4noWI=jP@>K#bD}zi?`0qB1-;#eEt7u2%96P;t-E8fGX%st&FC=-I_5;MdkTVx+di&Iv-u z253K0;2=Fm^cWpao(z%U7Bt5?ZNc*(s>HZbAO%%b$WauC^K)ACAqI2P(?py$Zjz>m>H5gQ8?IIyitLuWL?r2aRhW1$0V_4X zaL}P=ATp=KA8@)-3{S&#UvRYUt|2|kt^95QPhX?c1H6P$q#Dz*Uud$3dtnJ+JWH$KvXb-z#JR}IB>^2fVHMU4eiVP$E06pk0^#p?DaYt5>~4R*!c*DAH14G|IseD(HpgM(!9-ukSv5L}Ya6)U zuv#}-{|HVFgC|#wonAG9riv1sex-ZJ*l@uj)v14AVE>_7p>4UQFDXe07t)Jjs}4R` zSyLYmOoJv$cuGG`eReiH3eiJ5NrpjbUOoT-0QpPCA@q#x#H`IfGbSNGwy?ve))so} zrQ}LHMxw89Y}qOCq-xjm;gJy{!^p*r)3k*ohG2rNeu^EK* z9FE0?Koa2x5>`4QHOElR`)83TZU#DxbFhRa#dzPU>`FmH83+z|#Ezjoavqx2oS0L= ze8OH4VhZNO1F606xe8ysB6MX+B_Nc0$D}b8MyUk+tQS9libg})xocP5r>Ds1QgETH z6Z0|X<}oi`NFu}#KH!4LIhg8^Vyh_7uN@>ePfw%Q+F%jYbEFhJURIw+sB@1zJUrkH zHWQG1`naZM3XtCp(gPrSbMJtq0ajNFL?C|+4yrpjIU%U?aOf4}_-Nddxt!WnS$UX? zgd&pHT2~ha*scail#9reFGCTtZ$bW!krWmhs%t__5g&eoP^ToM2;0SSYKy~L=` zzTg4PW5*a~w2vK&N?_f+`#91m8vN&%F%ZJ1j zphDi4Jye=Mgl8V3%FU23h!uwq$4#=cvr{FMeG<||%d3}*`FMC#%zN<#%pyGI&a%al znOMFZr1PCc+2kdR-E0UHFn-2&5}i1yqz8aR9~N9TE*Aqd2VGx7$}%0`;+Bw-+DDqj z22U8lllGY(;~%`_=y(j9mKz$ItLc3a3qC=?<9|HA{%6*TyhQdv_~Mz%Iznbjq;tq1 zXtnDZ&;I!?-BifCe}5Fb_=a-n1l~e@Da7kL|VHrfcY+((Xh54I;ZbnfPj~X(5(GzRGs&4J* zp9x2T41NzbdtB)rBIN_vB69y#%Fr3>y!NCK=I;8~W15OcOsBmy-4cEI76xabyi} zEmfl`-~2cQU&7( zmF;e6ZssB}ac~I7yh>THI0_E}9uXr+4&tYRMurQZ6cPGH_W{^P%jjl zE`7Q*KlV*xj;AkxU)$Zo;|UR3k|I0XjmtToB)^PX3E0iXrb)`uiWAUkg^OY`cm<

iox9KDE9yw8zceeTS9);ObMeViDv)MS71Ax}Nwa)aQXg zFT}u_HjgI}ksVZwNWpNhZY*5{@yUb%x*aai+YfkR$ks14a;B-LCz(J9aaQEP46V0Q z0DU(043XPqXbrm$5O#dE7sLbF8Ei-vB5WBF5@No8Kiu=>`9FfjPC<(HqI??=uXeLH zn7?lZ6PuV4!s*~HzKCGm2*^V$UBfR{mwk2H>ORGbtN7jGS|zf1>kE~C2X>3;o*n&~ zD-kEqS2jO8`vjDTPum^oH;ln0G!$$qq>3bPjCpgO7=?zle<_s!F!grhLlX)e+Y^iMvadb0P|Z+e#(z zjb=li5;ZW$A~6cW_!vOMz|{0X=l7FU6g6D{VEbQOouNfSa_b%ib93Ww;qq$swSqsg z#+u-+V}qyx&*}Pd9KR>TU?qe}+aa??L>q2xy||5CCURmrC)Uc$ED`e{N1?IaJDw=X z7t{Nw&^O3XARVZ$uKOp#&cAkjV=^*@95R*saAm)#Wf%{l8*4VwL&wkcmB}KT0n{Er z8W85ntU^u zzWJ5x1sFn1!7=UJ$$y`)_S?#Ry%M+*CX0w}Brb_UORG?3ax_oTX~`d?oJ;B#`s+JDAjsjaj~RbkLJ%w`>vm>dBBj zKW4_>e(t35jSGOanBa>|xPR{+uYwi2w~iwxxVa&JCe|8PU;pqa5h_GZ>(*A;wyk)g ze>w_OGTxQCAi?e<<-a(2)M=@In+#)AN5|XhY7CzPFzu&ELFLUUI)cpZAsW5Bf^7gU z?3$XIZ_xmzpfwR%IC9xRfI)yN!RUPh31F?o{hP^vqJq*%XLWVyp>3sLzF|6&Sx-;z z%FN)_P-=A58)!vjYq{XEIRAD$%dG?hf@Iz@v4URu0}U1%JP`9!5Q}K#w`iJ}uwB1? z{mjLSw|P%I;InA#?X_ZGE<{F1Oj6R|^~HddeVE(PNj^dmDPMGF@=jbAr-EN7F~QQ+ z#ZI*C#J{-QGQTB8O#X0jV-z+_Xf9iY?qb#=6uHFTRv*XI|ps@THiJA6p({TiY+eGq1d@%OW5c@eN^ z2A_GH^Cq+vm{oAL7~pE+n_wgyb^Jyf!$QI<6DHT!d=Zbp zQ`BsRfC|RXTWh}d|+gPLU+>rxmf#!#@VoO`#MPVIkWPr zMvX792Y4Wo0dHmjrxuJoPQtt(vF&i-?^;?IzkdBn`$*O;EIj-@s4%XHf=DPly8mxF z<hEQD8LBZ`YNfMMd-`xoksqVPjRTDW<6H(?YBGi0x{np&^JV`?j(cc1tP7=6Td zehc<}7GMR&tCF0(A?r^;r^V3ayPh6Sgw;svx$Q+x-KMMCQn+(^yf)&3Fj^36y3kIh z4|%-~n?MXczKz9wfu@SPSO_ zHl|k$jyOAYm0UyIN9w}YEkq_ka=Sg&k{+|EWiHQXQ50ULLeI0@6 zK0-gh@DXDsDDV5;-aRO>{mtcJU{Ms1IXa3QcYL_Zk?8!*tmxb|`0?*h4hG*m1wt?; zY^nLv#48v8IjC@>gp3VnF7$`{pZAi)Wntd+U3)tsm}Pu36khY*{qAB{%OcnWEs(Y# zmgw2DXY@==vCi-5K7`dF@uOGlWWmP9#)T(`_4O9n!^E@!2M#k*McRH|v6!@eSDACW zpoxr1PaIu%i>Z*a;HvWf=WoViE~Kl>dk58~EkC$62{QX_8;n?Buuabgs{o~CB#b^p zZdydPtwa!0ei(hH<|ZQwKfU!3<=Z`1S1Cx)wXI!QBj6)!A>J|Ie<;YBnj!@N=lQEw zA_I*7-rE*ylgn7KxR3_hXIWFS@rpefx8t_LXd@;I!Mg4Oz%zez5Mnd11Lh#?f6S2v zL&^tR?Zb4_(jhq-8k%c2ZcxFZAf^}Z={oMTeKtwJuK)M-FDp&-6&wJJIkSlYx0$~Z z!{;06SV$yfN((Uby@gGTtJj0Ppg7u=O@$W*^o#J~buT-&$w>UKx5cPo%4q}0Ju%%1 zG<)XE8Qo4bo7)98)&GC5m2v#P^;#OX|6^~uF?mPSEW9cLy4ePXRJbzD%|Bl43xf|r zi9&;tunm&Ck=Bk~yTVYWh%rA*@>QED{kv=?35179>>{EExw`WI>96Ihw-*!vsld44 z4Ul-kP1oO*s(>+Xi;j*CCU=^@-zll681RMIDDU3BO(_beN*Rt&e58~96OWr15l0q> zgzgg8>YrEhl&=`u!VC?b$S;Lwd5l$t^=e6eFp(v+Zo@qDo!Ik7K|6m83O`3fr6vD zy1I_6!T)?%SZa&E4;I) z4?F>{_c)c%5K&Ng1_g&yxO=mhv94*l1qquh$9Hy^0d@`Xq7TxQ$sZK(8Axv%8@FLd zN1`6{97nvTH$a5TGAZCj>)ej~O{rf@Obn4xFwD}Wz~-PJ5p(C*%`jhy0Xk^vA%x$u zQ5KEw-((z|1-lT>6FNFIz!Z4O+oh$YOXnaF^#i97v&yLZy6{!covSSl{+RCvIC=lH z!hh9@g9p{1l!RZ(I-PA82A6p+Tq#VL5#k_M)(77-J-#^Pbu1b0SJqjqz73?v)X~4io+Co=Z+fUyVlOm`7N(D-~~r` zmlg;T%*>djLGUVR;@u~(7~kOy6xN);v?V|)c%u($f4E=!$A9001t9oq-pA5N{)}8{E&!+mBF*)}uM2?h175zQIq4_>LRl;dFslN1b24e(g4Q z!gIm>D26Edv5W-vMm(TzcsLYH`=gMGDiL`B+MyufYb87nqpP9n92c1&FaxnxiUC2T zrLy=NnMHS(@h%nMJ{Iulz_>VOXl}&o1kkIAHlNPviEJ$qK*Y?%8Ar!kXlx(LHbW6* z)Hg8roMR-&wtKf=!%yIPBE5yE*mbPr(3_JaA_PY|1L;?y^~*Qsuvb=BGKmXBHoo?v zLqLu8B-Rn__A%6r=Ln2svU*%)^$Z|nM0WIRi6K7(jDW#^jE&s}tQ<_d$-VTDwe-G` zXYXLoAjFjo8#Zvs%I-vBleRaC$-|;F`%PY1mixmT0pO*kM~WK6Soy_^v7CR?WSlny zmsW7Fvo}L1F)#OF#;VZv8j0T%wE?nlg0LGz;#*CWbhulR1XhI-7LB=-1_@%i4GJ)_ zMPb?%|A>1SxER6i#(6$0egg6>A3y&s(9tZssv{PhBj)ngXQ%rMu^a9u3}Hrzl!dUh zL~HxA(<)$kG2cTVSheEV{Cah`a+(JF`6!N7)W_DAmT2&5CCmx`^STtqxP=AyGBhMY zR5+esmxzzIHm_&U>div*Qr(Y05BNFvS&rG5q z6{+fH8|EdE#Z5q3vFV6+hVjO{f>wqgjbQM1M8vczSEuRlbU!}%+}@sv%&Q*8^cfg1 zj{T5?m1>P0&*wMDpeHSlWIi(Nto*mg#cf6=VlRo1Q-Mu0Fw9tcp?$0GJWZ!&H*$*&Z+f8WIK{3w6KWe^Cbc@GnI8D7@4t~ zz8evd>0G&X4>=wCdoP|pPeH*F6v}kj@(O`+*ly8Jk0U%{U}yJ)Tm)(*WnagXqnmnN zdl$(0^7_gIKje$hP)L93q+z6d3}06wg`i1d`r5>ND>RggWQhEBsrT=(;-v4Du!|FX ze&b<;YL?sb>Rw)@dtDhWr^wBH_3G79-{Z*j4g(HslpETZlgzrYyI8i^8!uoYM1_nf z&3$bME-p{@-7tS0ZGOM-=l-!hp82h-puf@R!npc9iGMA87qz-k) zX;V{ugaEQJaYc-pi$8)6{!u7jYYBmZT5Nd|Qfe#^M|2@6d~9xxgllLLB^(y`6OZd3 zJr<*w950=Flkv2bu}?MxLb|czyt{b|8`t<>6rx)-4VXNG;V&oxc|@IPDA~Hj7uxS4 zpi}KwN);=+;EwGGPXojL4ERftz*7Gh5jp4_4dMs5wT>N21u&{l62ylyv6(}^yFs$X zZk+qgjFA-#(PyI8luA5#@&sbRPW&kS-HCs3TOH3{&9fLXg}7nk{}}FC|MBy1%wGE~ z6>7i6Tc@VfN>EN;I(0vQZgdn*Ucclb-1}c&7vQ9Y&k!%<@KB!I?_g_yus?`QByxyQ zsgLDZV}6#0A_cFSN*Ey=BOm08_ettp*_-^L=XB&BgCbD?a21>+mQgtrI@ZzK=m@Cq zf*`icfbY>5YCU+dL-)^*@WR0N&<1Hp08LT&Qj9Yiz(3K1sIeslaZY-@%Yk38gs78M za>k9XyOGeT^85Mo=SR4EUE2WpLAF$!CkTV{Fku*hq3dH>v<3V{@0!d5i&v{ zD@w8wG76QFk(G>;EgFcHkd3shG#G3K&3Z(7G40-{rZJwHBQ}ANdv7?Z0*eLerome-!^i}xy-ml z_`nEam@GPouO80>K@FNt=(QEY;C* z5z+{!4@;zr*RBn#fFSB7Da{N#vf{&2Z^u^doDN+&Jem%dA7w);K(B$WhS!$Ky%_ur zegVhCIg<4)SIyMWZ-2Dt+r>Gvf50xom%(XH8ck;xsKyhXZRgIN3r9u~wg*Xs*wCkh z`ryo#>)=wNa~DcjpX&Jn^l4=3L}2<`Ro(mdSJZ2QFSW6;IacB#|A}m#V`5Ve8mb=a z9w%0fHA(I!;UM)$k6}wmNwDbh%&MWybx!Aoy1Ke2>10a*Z>uVJpeofCKUHKWZtqV{ zk?OIe{Qy6tl?vx8cWeg6Hq2=adT^W4ZtwSer%6vm8|UN2?b`se$~W5_T>g;qZ`L!U z^^-$h_b^N!~qHSi1!~Rx99<-jf zj~TJWP4ro}Tz@3=NuTFwvL4;x?dRJ{dI^HA^H#PTF~MDCxT}lHV0bpNv{UhGHI9Xk zDuz@X0z|K7_gnQm-7MwDyd$i4*ca){pWm}pNK`B9+3y|G`RSN1SlT!(OIERbcB5``dNx+SRE< z&?1tJoP7DW;lpt9JaVjntp|0qZ!{wY?06eR@li^yLbv)}{R; z8d@GIEw2c8ri3k>g!3RMzO7K+4dR_eX4D-x*Sn?l&+9jzl6an~Z{1aj^gA>$x$ou3 zF`6l%%5Oqc;{WKpGk*j-o%Cy(!=D|H%y*(~!eTRCYUU3}FajFP3ZTABc9rE+>m zBq%hNPI5r-BXUH6t0TkPxMhn=HRx@oa5*VKpDiF}kT^NY8~Cw%upE*Lh*(iQ#z88H z5)n_^Hum=RNW~8!vfvcgH6~GmHffNsSh}5zuX*6mWW3!sys8a3JDo#pu~~x3`Mh$) ziU2gQlWeLk#as7GB#wz{S%@O@Y&DBA(gX_LuU{u@x@d08r<*4~_Q{`IG$_N<6X+t( zoAZ>UULpYp%fIdDC=uGP^z_a&z$^)IgP<2bX$;cdK2?S6ieR&rV zyt!Zc-{>}Z5i&m@$Qj%BKKq?aCLmnLcIJ>ieh1pfCqdAzwrgq>y5ANObUv*lsF(Gw zhtoqANP;h{HgN`FrFDq|-^mLne}W)#M7?;lefMLn!9pBo%g;E{MOIXOimRffMKc=b zaN=J7BS(%H8JBMN7Y2(P$z`*{QP8xIdW5+cJnNaWtI3*?Hne7^JlnGSiXyFA4h`Si ziP(0#OYruOLVZu;+8p5nM$Jh&t93&!I54o4hRsJ|4A?Pv)YT6k!In_UP%e+*90^?5 z=Lk9>RDuNn9Iz9Iv3Zf;VJVPPN6P+Gn-&^W0+Ki~pCVNo9Ffju?`u6{Xa8~5KX)4x zi?my!!KN;{(L-|c?%g?Pi4pNDjr&88q&)XrnUj>%1}v+Mno`FIbD@N-wx6errIsy{ zdBOZ*pSl1zu={E+dCi^YKkq_7+)b*yynMZVyVgkcMI#qp&-;Nt0v(zfRjOS|Mfe+S zlt3>W$cG~Ux^~%m-8hla)~5?EU&#Ve52tEmcrDgX&n6p@5)DViOTvt0K@mE>fZY{# zYSbK+)z!0jg@WsYoCp9UU?oc=Lgc?H+R9+X2)m!(&+Ma-zX`1(5mV>y)E98Kj_~74+@IYCAn28vbUE zJR@|>P^XLgZfzZ2rVQNhh^@b)snJe#d$tUaJ0_3f{bP%Jl)6{!F`KsiJB8Z`zvtnK zXRlh{59l~a^g0NONl6^22hryM=``uhNl(witpA?(w*Mm4=zje}h~+bU{MHfq@qiV6 z-TPT(t!nRX58fWPa#HT8)2Cl)2fKz>w;Jwe67)=@b%!jcg>AcY>(qJi=hn46XaeokFZyw$yOi+OwA1S8lg?x@Zp6h%j#* zRKIo`qA!&h&)MKducy3}Tb%0V=GODhp|mHE_g@<zh|Lg$im!ir3#Xp8#CqMP6e*VlWirc)GSyR-Odx*gVkbN>&m4? zmi8n`oPqbFIDrv83%5CPWzVdlsp{%GgiAMfORpdszSo>5<8;@1Hz-7?RehHEebm8A18#sJBfBm+dHSaNr%!7VlarmhzHKSr{fO`A zYqUDi;}DO+d#&UA1Hg??RGe}Rpa&g^z&1e zj*;<#1>{tTvYs?~^0EDK%yTY`QDp>T5A&zNB8Ad-wl+mB-gFbi-#BX?Pg{W{Z%wQ3t7`U`6)>%M=K&B+= zr#kJCv4CveyQXq+N`w68XdQ!QmQ)NYB zv2Wu`!e}cA*m5P{UhB(O}rZC04t7$*<=3 zKcNZHAW*Ziipqh@mraj_HLn0C6ZGjv>Bj_fOdCD;$KoZbw%ZLxei27Q{P?Hd(bC7y zQm|ahF3ou`MY0BSEOh>-e7taf>C)ys{%MibH&#EKCO}GFy6~oS+}c%(oUNM_uuP%fd}|0IaeR`io<92!x$|Y~k=7lGx_0VxIAS2XYYcyKl2U3cs^PGZg+08Zk zvucJ79oloA`BPGsNBlJJ`N5r++DxhO?=g&WL)-PiFU7Kn%Nt@6Q9g6k7t(|U} zYW^@J;6lnZMcmlMGyo|&oyn)4JY5~R`OKt-V6~T1l{(%x#}9fxY)z_e8k*ePuA&4E zoOPx!+GB)!*-Mfl*4rE+=$?x764C@3E87w^qj!D1y3o(b;6&NVdxtF>2Pg-1!OdF6 z#NUSw&yJWUY0zy&a(NgyGw#u&7UD)Y&9L1RJ#q~wo7<#5BoBRyrVSVAJg~2EF~QH} zf8y=h_QJh|rFnV#;q43X$9TlQMO$@@L(>4fwc?;6MCbfXc@KYBr3>Un%O30<57&~( z>;~avKoow9l68Oe)9b7;K|{j{3tw{N3w;Tpdm0-ilfwn?=x@*QF;IeXvNN_qg0&!6 z3uJudYbc=3h&z(O>vxu94F#`m4K5`7!AX(6f5{x&f6A`T!hmSS_48-yK$iqAFS-xl zG?JIDwrhj3f|K(TRnuFXySPQs+2CVEo+@&}X35I^Hzo*%I<6Y|aShGCwSb_4O&1&y*?A&wspo401U*CAD)$?| z`4E6!JUJmbsJLCAZbxw4QCl~T@MbjwkO&4bfHRiv?UVgf7SNhX>^VUGJjUprBT&tg z9}Ce152ms|ZT?a3&=O!MaK(Q&)_7gD<9<2m_T|-ZSrs3T!u!M+z>0@un z78mVBM3Z>V`kSI(ePeR=q3Dl1`L)}&x$$7ZPKCc}{uQMyudmJE6TYV@J){>#m>?XX zjyNg;`XdC1l_=v2u+3Q)m=`aaQE{+4Kse8bcEy}^l4!0%Pm+CqcUO!IAED7HjJ111 z542!=C;?hZT_op3{Tcbb%>3mQDfp$zA0>-8Tmm2wEYhxo=Ttu0>Kt z%s^tEm2 zG~K=Q+9)MWyYrhjZ_dYFIDyS`i&+yf_J8_vPls_gZfIz@iG!jf4o~3qdlPzl9Wcs` zzp^pv$a6DY(?k(fcUoEwmSDXWx}y=YGKBZiTH{*=c#44jBW$7ES`3;qC&l*716o(c zh6xel(=fcMCQVmV)ZK268VPal?6vQh3!zP(A}_g3n|Wj!5QI9Vv_+jzD2qPrmKw+o zpX~0}hP^gSqRP$tlu*JAv$L~{szI>9fQKXC!@@E9NqYJaVZxI_nk!_O@hj6|MGGuBH{IdE8o_XzdMZ)woXe8>I=i@ z)gA`LF~c9n_Pk>w8n`RkA?WFtajY55(p-GAOm(_Y=VR63R0k*ILOLzIeW}6uBa=fc z?Knp8H&soEb>mu+Vf!Pw+fIokTj+n?BlE?7WR5$OnhHDYGOG}~GUq|3eN z=yhbn76p<0`u2^daV6+(fC^fZ?$dQ|Y`peILr~lY8+Ju!rI)vO}}t$U7ehO zAUH>mWDAr-7(oan&5FpY?~CeDLE}P62jHE8WP+&jkG{TsRK=K$>^R6g;Y>|K`FErq0BPUvcRWDs zDF9*+zSQi!Zk*t(SvnGA@pKXJMD}h;|Ni~Cn2_5`MB64ga+06NWTq{2fQJ{&YJ!9p z!p4w=Z6I&s*cWH~Ou)Vp5V{UJIak^~?bP3-BEt#Po}bSIl2bH}kwF)cNK6*L)6x=6 za%L<3#zSW*Fo@_{$HMs$M+byQ2jYjY>=&mG+22Lx8~sYB%60=0$|K(tb{m{QbkDZu zj1dzpKHqnpoaXrfV`ova5!2V!RTVX>lyDJwhIHZnq|NibN$H^RSEgkH8Tmkf4yV{y z`;&jS0J(vfYa|Yd%E}!mGlWkOpOYlS8?v(3Z^nkW{#!BZt^G$vS;7Mm9hKjqHHBCK zBqW{}z@@g~1^C#tUH@j2Id=7AsX|wH^!V{3i$|WR|GZrEf6@jk=CuF_B(SAL6EGnp z5L)aD7n*I4ee5(I+gfJR?3hw@wO;%>kzeyUqRs#$KIT8Lj~Fswd_-f{$L$=el%FX# z*CtebIHOJL!T@A93BtdF=C!E0tL1ka?yP>RXMNl!ykPb7KdWBWK`4nc75!KoQ7zFj zmN+49pHro!WV6G{9t$d(w-@~*J!$Vw;YJ~9{~@~!MD8Xtb?@!?ik`jJuZnNn_WD{M zM9bHzqCI4lF06U8$sR?ui|FWUYWyPzd=UDzCME}o8>yY|pWk=ixl}!U-uW_|f(yhT z7+Mhvb2g0)8ri`>F7{;_$k?r>OKby^+R8j;42=VWUHLv~?Y~kNLkThZ5puSpi0Vx^ zE}c?wf$Sl69U2_J8Qp@SsVc-(6EkPRoMt($-b5Vhd}sSdXAm~gr^i$-PZzZ}cL5EB zmQbK{$;m;7v>#8KXyY*Tj99vgz2&=4H_Ld???26vtv31+iY$rr{EypdaHU2dC!KMz z`ga%vufZhfdWRHHmgg)$mEK#|o1RsB^NZqS2YC~YCO!w zeFF8d5Vz(%H~3G>lR5_Qk`84lQKM6!Ws=2-9?$1>)Vtl_J(4*%Pk4J@v65M;5C%u_ z4P zJZBP6kC`D=DYLG6PPMg*$V!~rJliek6#7MB_|MKt;BbFV*vJ~w{Xf~?ct~71U?`kM zB>(-kzu6_(L_bdWnp}(fzx9aCUmvCXKLv*TR7c&= z+np*`i?RnCM=0vRrddz_Ca>23?}WC5a#Z+ipy?X>b6}kHuD@Si9C+>7vlc1c^O?kf zYR_xe*nh8dqVU>hdz}$~)6~Lf!-nPy)SVhtR^ESyq8!Lq%M*4IxbFocO@R$HY;Dz< z9&_>f^;IKH*Oca&7&cap9pzB#eP+6Cdg{PwW<@&7CmEwWlA*u1w)0br+pga(D>u!{ zNqd=)a;@Qi{D6P>j&zS#?NC^&5#6cirXeZ2SnAHSjN zz=*0N$CuYF^mOmtbqn^4BQCGnprrH5IH)hb|G%&P_uD)!n|R)TcEdosXwCn4_O5nq z|Gyu;>%+WdTI*QS9BcAcJyCzz*#Vf$vf#(B$@Xw9JW|7>jCXZ8BA{@5Y9BpdJ6UZpum3}W4 z&%A5b@>X9|(bzb26TJq4DgSWrIEF1K%t11zpY=5IpVIv8d(w}#M}WjRF^4HP$RUh{ zdR1KawM38E|If=Vtgf{lU3|#!R8pU<2nP?O+Bm>VjryAZSG8vtaPQeOnNgvCFGDfU z(WK9yGukfOWC%l}I>tXYNUCvL{_n~ic_U(6a;nOWFyP)%qb7Y?rnMuiu+kc31S-OOEbDAoBcgiSsk^ zmf)90SZQaNx(}T0PVVQi;MmLEAi^Ne!M9x=HE#yV#xuKGEX#D(c^1F3sdeo%y_xH- zO85Ms`ut+7+}>!JM{~p0ubd)uYH;3jz-lR}FYfSx?y|*#o5OPoZIH_XiWa>B-TeM^ zVs6~Kcat-Ua7Gt|5k@DpIdnu4HH$5kSVwd{g5Q7;^_>1jnn|~Nq9|J>laL4?7LiD> zi$nl7ixzE)^9xoVMGrO^iWrdCs4?l^IC5r&X-I4r2@&fEcnd=33syeR%NOWgVVcjj z4xYN!&{S{3O*>J6_!e7$_T97pqefSt$h^pA+EG09E?!N`Gh#0p9Ab5&K~}fE3vVN8 zBvLT+?;T-FC5~XFz_474M5L;smtr>tRD_TANbPWEirn#+TQWSnvujGmU*+vR5oJ=+{(}NaG*XKZavb)Vcebt6 zJ+HRJXgisD$CbzZsOo8exL;dA>S)4U?fLV2ypZKn7{oI1qJ|iXwPCd^jC|0Svzl z6@F9|zBau?MglvS2|FK|TF?ENfE3m?u;swFDgrg(8NADnc#1XKpwHPlw&&t<1+q_e$V-93p3v2Z*A;9qJ;tuq52-_bl zx}HCDXlhw>1}j7ET(tX?U++z;2*vKKrAvGB0%!71Vi5%AcU&9Rl9-7*6OWyPS595M zKf@r<7$2YavcuZY+i_+Y?Ut^wsIL?5-J1RHnWWZV2x5z0+R zt15n(QJxhK&tuHXgZ1TA9sVa5q^hAZP{EYOvDoo zL5eGGw`XV0-nj9Kw;7a*7{E$eGDXZD6H|1Q@quvdJHDexi%H&;cYiYyBq*<7-FvJn zgmhWdDC8w$@e^Xd^%Thc87#2}fQKjJtU9d6*47eOI3za@H0tFhLLrxDNA;iy0yHi# zJqAcEjt7G#ojSNJh?vXz^Z%WQ9fNO|m1+FEc_r7j`X51zfu%b8S1wqJMJJ2Vg%U3i zR6*j1dA!hL#zCCzKz=ALQM3-fAoVCvT!v48?oBBPJ={mZGJ9=YT{wZN z0{bu{vmf$pvi=g+~2=*XeVB3`&i@l(DnrB4GG1u{BF;|g z-3>VHP+PQ+2t6{H*iO=8ypmfIJP!~g9Lw``rm$b3H7>B3*Zmf$w`f?VLv;2hpm?EV zm#m=&xHh+`aoFn(y%m=^a)zM|pNajcL|ne`DdXb+w?%EkNoT4xZ{!$if5cnusO*kV zFt&R9?W3?7Vj|``T=vBDHz4|hq}0;;Y?_Z#Z9Kx#Zf2IncN=ilLI3`*omXp;dt95; z)8)_7>c(la$B!Gm_58-mhOxZ61zYOQiD`25cA5waCB{rRmVe46Q5}oNGdxw>*{$Ud z(3nZoU7sZsG-KYjm#|a19qBz@Sy_YG4waO`60vbA=>;Prdr~OG!a@>s*)g!&;+`XW zBt4~lk}N0xA%J^}`SkY;D-y{+_`snfN75F5Yrg8L)2B`yAcxMQj-f<609Zp`uc#2Z z+Za$G7P*bI{u#b-bp@5n{)29US;8GnECa%dFc_5F1mP2q22gpovKKSY{{hibv0kWI z(W$?zY|jke!DQu8lPY}bT_TS{XdUQPrjP~u=F6)oCTtaO{-nou? zb6JGhKaS;Jx6vDqO4nV~K68DS@Ec z;Vnqz6XH$Aeg8a5>tyj+&lyRl%)$Pu&oxmyx(r+|$|*5{?b%8k#~?TlwrJJ%=nK(f zNPa7(0}2&f@L6A9;cGJT`jp*mW`mM6%&kY3P5-46uOwBmAU{8#^1hTaz5x;m=Gkkv zY&lyTPBKigZ1I9VQJix6eXQlER{3z-G_4n1Jx6=W4BFQu29e?Ywr~U^J_))MpW--H zNl2xYp@1zS5En6qri(vJm*UEuFW>2e#txvX5&7=Xrf<}sEXa0)?q3v+T-YFST3s_#w5CMV-En3R)ZCaKLOjmE5ALt6`n0tE&O3Bu(4B z?%thJ#uu;W{|ND!vh+dxXf-OE=b$+F-{fWmSee^HH@AN4ncs9 zGugLe(ebn_7DSBbQ-t}jsF1Tr4UO$`Wx~}=ayJrYIrrGxAmzemkpIh9A*7;CNnqm( zFyDG&Gb7kELpFBbSsD<%XMXEup8oNDvl5ppy2}kTqzTkwy*Ex6VAbEA>I&Iyyd;z)YEQ*KkJc)d` z6Y1dKOP54PB#C+IM2Nsn9NBG!J4yXi zGHQS~#c(`MWEpg)k~Ji$;zy7yjgHv*cSN|Liplc|@BbrKP<;h5>__k?OIEywZ~-SS z$O9HBZwgtsK}o5`8aeUh{j;FF`JHRwfrJq%M=t&#qXl#+#$A%-0lg#^F&?1}oTg9C zi8i1*T}A3HMjuUz?k2&!UWWa%bi{F@Ss>Y=7?CPQvisNw>p)6D@R3Y}#YnwBQ3_T5 z_#y2jYzm-@#b9vtHzI8opC||?5=}@x;TKHf-l7|~^f-y&T$)ApjBOq@W^$+MaRR7;OQt2jgXg1@9)|sOkPQ6QrMtk z^q6>Q0FASW1kY)~6_*5&Sex&n)KPYa>Vyem`lrBR0@B+PL_{#EH6tsPlk z1%wtcz!fvx4nVWQnVK|Ji~$wHY$S1FY$e*AivsIphtU?k1L-7^sC5(?DmHCfw_d}t zpu+ApY9v+};$0KiTgZ!|WGwSKqpD~!Cgtz)mW=UlYo%u}XGMs*;wmyK(eBG~>uDJx zV^UuIJ?iBf^p-*v0+)3GG*=whG?WUr%zKz(lK+FhkA#t}to?3MTVLOM?|I=rzoE+G>|rN%soZ2K>B%*pV9MEKZZ6k09c@w<`q#U ziXox`03-DhOO+Qas0x+38>9=fMW1#aM^pZnSu+<{(jqCyfcTRwsGXcRnhMY}v}wFS zx9iyC#(sLW!>*{W&?1ql_|QS-v)RHJr_@$mWt#e2*?8gD>fbA_+%DIDkiO>H>f2J= z;VK~IG=q}lBy^Yy8_SzF7Z~5k-UQ4m?DcoAM%G6=!;&6E<0I?Fk%@Wyn`-+`JM@}&zln}xSPS;Oh$kX2k8_n92V>M2)nJkC=-F!X>*1&1SCU}-z4Oc)f1N{WNae7NsdaA-- z)GmAr=m<_33vB9G$j-T^$LQHiokGX%&f(wGro4GGeY(Hp#|q1u$pgpT2#W|m00Icc zx3%n7@ygb*I*V-TqF-6>+~aFK)^qsT@C_RVEUX!q73?%to%MFep{1?=5IH%`j)U#~ zvASY@bih-$HJ65Q?=-(M)sv&}j8tjt)`E(O^xZz%VRydy??OTk_|3jvuh z^`Abj=Rc}rV;*!ke0So>v%}74>%?j_rvum08KIrbA%<=;$S_)X>nsAxF0W3hu@;{_ zHt1??p`xw!;)*`EX4xgI8|k+BKj87L0|qilLZ67MKNLsk8AH-=aGo(i5LwHf=pb|@ zwnzpI9oj}hOV57V8GVYtO@?%zcdKoiV{;n{KAF_Tfvnb@JMMFHRaC|5A`y&WK9cs0 zA65S^Y#J1|yQFq!M!Oi7r;8`M`Q2%~s$a>O$L9OPtDQv4hq%Z;?Zk>eE~=8dRah86 zI1$nO&3_9<_JlA6NEN^qgU+Amy08JaZoQU%oAgjXlw~J^XAk+Tbn?nXt6rmI0fPNA z>b#|-$gK*${k@*P&px!M>$qE=jryuIHf6q;+jZ{Tr_;Yq zl(jx_vZ}+a5lJgCa`jm*^&b}gvkxNl1O(XMnM$$Kmn|X2-6LxR6rl{sCue+|?qNPP z=*p{ zzHy`O|6MNHt1IiRY#&bTs5CgD>|^&1m2O^rlC4#dOSW#cqAVd|rzW*^T#{pJTitZW zO>MUAQB|FJ{Ik}TjSFo5DUdekb?&pH$=H!P2@w+iU(codM>T`Yw&{D0_A)g5_uVVX z$CCw%P%Rk67j%XRFE7zF&TNCcKiNo@Q2WiMV`t>zD-!5e@`0mn#oEr{dCSF)YK}-5 zPp1Fsu3WrE`qYc?eM-Jdo+sw7UGh9DQ^PFExvj5EPEPC9cT_ZxhLFOi8lCWN<(_m! z@t=&AwmGxr*xqQy;j70M$gNnm{Lx=(!h()p0c*tA)-60ohp7_>RUlmL$gfS|J7PTk z$%y~&ciVNz8rMNb&o(Z0RMQ0M?F)6fI&`@^yXWbuKGCE6FOM0PnpLS7S3K1!vDle7 zRZYwq5a4uX=wFT`Y1HV^{~$yLij7Xc(ueHtpqE!~EGJ&2hTT5iyIs(~)Ss)}4T?5p z>p4SO<}}nlNH+MU;GOlL`|a^*=EHh*nPhJ!l2EWEig$SketKSnwh2tR<*HR5yN}i} zGU|`h-Z26E2<3(f!lqhIx?8&|j0J_Yv2O8r+u9vsmIz?)n6ClSJ_668?QmV!?0lBQ zVKz<=zz-3DP^_omJ04%>O#&#lB$Cs zaO=Ptw7u#;Squ=YQ;b|}trHZ@5-tD^dK+uEZ&UBfkJa~7O2}Ge5kD;`AH24Mz-LK) z^H3s@2(*P7UMOG2Jg($MmmBKy<6Wm#NO>u?k;s&6TJz{rYURdd7d>REeqQ0)oL&W#}Da zR%W>+`uVo7bfP!m9I{@~B!hs%^R13HU#=UqrN&yar>d|6%Ij*Q&!p{?$U_&)*YFy; zP)i%CHK9DHMIk0xe|)4VE$HMGYf1d;eg@IUt`2;E!zvcEhu%uVn+J;XNPH=ydQ5*~ zkWJ^fA8c}~Bzw-z6|$pb6$dWqIX->*aRd8FpK5(X z*+_L4WMyw=rT{_*x#ep<$TdWa;<#cIr6LegIy@N*(jV7D(QMD4m`kdwD4GOT`8^j_ zWi|vV6@k2-XdBwu>p>z}t>_l{!Z!NrQ8DTlD`qE09h!@!wtYsNoGbd%t-fXV5oD&( zOrFlqL89?vD9ZZVuh zbOaZHs7XkDfPf1?5wV0x#xW!Fp@V~PPZbM^(_Q3Qh{Y}tTU5&GDMW9wCk4>LUnKF$ z#E7)WR3rXm4%7gN(BlKOtV8G`mJR;EE>wf5iqn~%fI)BphjPzg=1t0gldqd523R=@ zEjpDF3$dBi=~hiKC2Y{dt_0Q)liS&^2WZz7(r~IoF|b+qw%9j(pA+@qUHMZUA(PSH4D6n6&rDaAH-`>vMwdClH+U_C87<@fv`mE7-A0E>K#q91mhmPj&Mg zH~t0&>(&Lea^yi2fVL(I^cdWM2}=V}3u+PN>1cLg1<_0-Ay<`|vg=yy)7kWgr=OeL zLkLQMe}$@%x>#se8U7s40Yrv&yWL!n;Dvd2I+IBl1{vqIV0^hNKdx zehuJelnOP?F>0))_I>cRt}fuYodC^+bW~IeG;Qy%>PSuvR4PV{iy8{tb{TVZuw}m( z8rliXF+r@wiWTp|&T@NViv2b0smbsYSQi3RkjK;-3pfoHlX$IIG>cYg0r)507DM59 z{GY%!#jX;WH@Qmas_hs37=O}*E5QM{7XeB5#uQEaZoytrL<>us`Q5jj7JljQp4K`1 z=UXy16Az51A_$Y42ylnIU)X@BhZ63D5fjdr$IvVZ|0e2*mUN;BM*`3>RZ(c)g!kA7bCS0+n0%roqAwO*h1xP8-@fF zL`Woi-*<0#pWAZkDp#GT^_s_XeI45JT!&3mbWsu0#PFRzd1JLquSlNFmE{o%0t8W| zhSIS4!*do#3_Ro?hw_iR_ej6$8<&@>a5iV(M!6q3Gu!QdF6TJt!Q6H&N`{ZTARTsP z_=WbnHf7D|HdMOg!Nih7IWs$SDA^V<<=1gac0~GvsjAmehe$Lv_TcXJO%K?GLbD&EUA>?20VR4q$3KBDQTOFbbM#E;%$c zqQc8UfqldH!PRe5pe1-6iT%uD9wC1_MsqY&3F6y|%irehZ`o!~ZKWJN^?COzVhgB- zOYg7-zSEhgK28qhpf)vD)ZUtrU;;si=x)>BKE1Ja*7fR7k6Iz}(E#@sRzv=_RUHWP zTR+?pLgCXM9*J1*3}113I172aS|iEna)hO*V**G?W2&D`!PH1SVGsK|g*1FQ%LMNq zgEy76UjmP#1X1TKHw8L|C0c|r1mJLsJ&@)jmWL1F{8)zsRQT90s&B!hnX{Zi0mC~o z_UR&61|2E5uG>+l&q32w!YDs3cQA2q(Jz2H697K~q#yIol-aBZtu|YAC5PKn;5JcU zUE%_{Vlfd=pdW)46-&)*FK0}`azpTKuftY{DfIjL^($@ZgTe1T)(3W*S-2qRTiC3s z+hX9UDL@_;V2;2qvCnsMcXQyV5Yu)hjL2h}iro7qn*ZNFN<@R*aul})4@b$%&$KfZ zB1{EcZ_yA*C|CncYFqVW*lk<{h^j)|9Jt((*XazS2|0^*!nI@m%iDc7o`UKC&uOy6vZ?l=9^yt)zz{_#>y^S1vIh&`%ikM zT(Pr3ed)spW>B_ZHoR!q+xjv3)y7=%hJ{!aV%hPS<9!n(*x_53bQ9hK1%h}zLKg>G zkw-Fk8DCUzdS%i?Fu|F?M9c4N?Q`PX(XU_}E3SJIbH)(>Z?E_|?pG^7X%&&g!4Zz; zIhha{B%=ROJVCa+^47P?h+(fRxF{^bN@G#YUn2OB33#ziPfvHS?>ljOI-B678u?5x z?@fA?p)2U?X>aexj5B-n)o1eYZZq4j)pib0-u+?lZ##!M^C$e?yX@vxt4HcSTU+H5|!lg%_&~8H(`xs(2g)^bi=#76qrQwz5(w*}6kvd-ovy=U8>#9VbVqou+_@9Nu+WN+)r@QiIK*=2odv6BNO55OX*EWs> zL{~$@F>|9XM|qA-v25Umt{Jn!-bB!cO#(N_IAlc%y; zi||YXfj&WDzShi4i_&exlB?2U9zbTbGXWwrW9XpC7j2MUV#^)izN{P>>DaMjwTi`g z{z}RTd-W})GxblrI8@`kTo z(QI97OeQ5yl=P1GnyfMCv)ml#uAOjh^Pk8iF~2uldf;Ey4bH3xRxYnxbuO4;goZZ z(0DRmSA*tTlGN0qIU;?XzO;e#W+HU_AO?J+PY}GQ zg5J6ILx%mPc`Ji0dOTpb;t8{2HR@9_z=_5)G#x^$nzX1$;HexBbhFs+5rlUw#jYYDKU&pxbu_H~4bBiL*zE zxyrr)a)-LfPx)e{#w6OOq#tft$sWTE4nPWo4{g$@*q{z41+G_cgnu@$idI4g=Fh7l!TV;<@*F zR4}$ukAFyymaMqmYuK=0#mT!jXJ}_pO1X1zOP-j2Hve#E{>NT@`W!P19lyeAs_D+3 zfZ?LqEzo3Y)L~<-VtbViA(9HvOoA>U~mNj~-S2o!{lklUrD5)XWHEm}#ccRgZ~{ey@`C?@#Pw zQ#B3a6YTaf_~~;&-(ILWWJIjqTYL?2C3E;==@ElXoTW!p zy_6Ye*}Qs2jc|?!;(Ui$1O1-RZhSaBpOwF(_sd+=wI?0}`Z$Yr$n1mM}ro+HoH$0oSHz=d| z=JJ;qNINa5A6#cUzkPIJpT$p#15C}#%}4%TG2M<})ZKmZGPB^h?-<68r0DUFooB~y z3DTSVeWZ0o&MLdKiYH1%T;UpGvg+oSN1+NuRSZ{8*{0>n=_wkAIi$(&>_be7 zsI?Phkkn8L|3j&S<+VGSbD5z-{ClltK7+wKm=2thm*#HQ)hBVj86Ga$eYFNRgwLX@ zL7Y*zJ2>2k3^cZS=wZh(Se-S!2Ml2W-}TPE`E^CG0ri<@ow@e~l`(L~BARz>Ojh%% zywiWY<5fLa|KyZb*)Y$MOSJz~kWGE(9C!gwtJ>F1?Xnra=N-X@R+h(}UTet+v==X4 z?D^w~-!4~TUDfNA=9!UOmf{vJ#<&NqBjqh%qn7GK?0w(|FT@8O5B|22H_5L3sh;<+ z8?p>+(Z~WFZtSZKsGm_~H&&)I=t!T@^;I#Taav>$1lkLby6<*1-$H1jf=sQ|lJ;fp zS|O%2sc)-_J{V8>aJlJ}zOl#dVJ>!VRE(y-TX;A*CFu-%W4stSpBQ|Vo9j;%a_QI> zvL+A3<)>(vwLnmdZCXk0!|Bv@mouX^Ns3Jvm#rkLPkJG+0aSTI=!_ek%j_QCr1z^| zqnHvMg>;QQv67F1>uaE$q5ouy)^i865o6J_xI?Spsq@fWYI1bcK?e){=81-0h3Geb zR`sqrgzziBtSpTJMaY5Ea1OiVZuT_wk3>{SSPr=cxz3+EcMV(mi&eC4$}|cElI1i? zu$SQ^*cL!!ic>{m`CSpGdazU#N`t`l!o6DtITP>ZL~~uRFzWKdZ=XL0{e1K1&z~1D zLq33A3Trvad@*G7M0PMfXez>)-Z?<>WYGc0wzH7QUhbP{7sbZapJXo7l&%J?Eox>? zlnz)j%pmpNlzs2}qScl2#k3>dP%;J7t1V5R&zfT(8b}eM|M4y*Ah?q&`|YYJeOFIC zhZJ(V-k9(J!5F5|URwv}8*cg#m?XcrI0Zt`HK=V4I|(Y`nN>FEhfr_E{L0x^I_@A* zLa6L7Hy1oZjCUPQ}%R7w5Y$6lNHVm z-a8gViD>5BeW51qtK<$g+@Bu&$_bozT0u0?Ko#TB_EPhezZo?Ve{%-m zNkMV(96ln7pGz~=>I;8|e(EGA+(J5Hgef#Qy71@H*xzz_>_82a9?Ow^bJ*ZpbA+RR z;RTHrT=I!L59N{&uyU4AKk9?aShRTXNO(T_=dVr(eKwfWdVS&=Wg!qSdv@*#oAKqQ zL=xx}B5z4{RJEmkpJ5#K8=j2%W9^8pLl{;dluYAWLcn!Me%GVAlODPFC`n1)*RM~B zN#TWR)b^>YUoirnLpq4_7%O}!#-c0U^G#9h`wxX}0Tmg**z`s9G=hnbMPfadI5A>X zw3rBFN-0V7o@SlP2j4=ihku5S`0~;l{Xyx{P8Ijp{|$63b|Fjmf>D$O^~+)EFLlfJ znY};i2WD3C!Y;nrJi_RnGV*{xo|Wss>5Wl-5gS$eg2U;6`9O|e;^grlYR%8t@XChA zanvg^Z;$l(4cYls4`xfU%b(U+&$Vwm-ZCk@yk=z=&A>}B&O^gr@t_2VND?Oe=CnTG zMbuj3SofjErTtmBrlhbXH@YJInZcwR0f5mCzUj51Z66Yb{=65~Z(r+?R%)^o_JLeL zpBueT=ERa>Fr3g4XKrz5Nr06Y7mpU@AR)i+{5KY4N~(S5`;M0vj-n^!H7kGqG)!y! z^J_KDgn$-T3_h|AEGPg}Yg*83u1m02(LIFSUVmgF+MbGaFYCpe7myC2*3J58Ps)M@ z-!-Te!IO49e^JYnl=yt^&j9mJEW{IwCUiGDqR!P{XH}9A;U}+&A^>{Ro!% zk@9a5XRki&vV-CYFQ1o<*3N99b!*pte;K=VZ$0jLhv`bRwwq1@NNSQ*_>~qaHgi_ z^7y@O%VwaHbJOhlq7&5i7=CeDG1KIV37=YvUMVOjgd@ZxB=~)cK3wwk^a^ro+U-&> zMgs}&_h2?)SSq&@vif18<=5S`Xg~&oP0Wn`rCK!EB`nO`S1Lk46nFq=74`XZE=YY8 zd(0^M&-dW-#q+XOXV_W9|62In_R>>}ftww~VEvV8F0w>rSZ)wK{vA&*<#?4uPZhD0I69+Ea^Tg=gO&y7#* zke(T{IV>P!%%7TbPu3_4EXsGnwp5BGzb(@@MPv_Ey6f}fji#R5HqZLGXQw`#a#1Z= zF($?5Y=_OubG4qiZY?_OWb^a*=JXERJTrH1Sl(ITIPCRBq{Joedvtt)bYj#vDM6tH zbE1M8xmbHbM^XD!Aeqf4Lc*M!7Y02sb5F`Mib3sZ=T6j`RRc=Giq(l>MW{}P0iRKj z`KtBj2WJ-Uxc@A|_Op-Ig~e6jTrJQ@whkvGeh;e)A@EJn2SaQ3s3gov}j5 zi-Nk$p?2-2umklouw@){;wu%%0Won7z~IIC-@4-K@50bsiENP)s_5wQw*02{C&vvf z=^2|VovgHSK!~Yn#}(h_4>a!>wbENT{G4WY_nGSl(;pmY-P%cH1iz8jm=cs}9x@pH zVsj+JA&!IMq*;v@weztjE|0{&_jsOoJY?E3EB^$q{FmW+k+OZ>YvhwSDv@#y1oWIG4xzCkrr|gb?katKcaO_U2$^Jw7i|5WG z)g!~@twun(F*)T`6~R9XcoHamef*c^U)TIHmpcdCv~U=*`dWt>UNJ_4>x^!vmlw=W zihmvS&zRmP4+TDc!PJ?|vKoLBZ#8LgorO}sI75MOIHN*M@p~2P7`2y)nZlxL;!ZOH z-jp44cTdjAF%BBgTU^W&Qe^M&suufG0$zpxHr-YiaHRLMT~)G0Hgn_09?wkC>~3k> z>Q?Wc0f}=0Z{10`qdT?y>h0MkXQnRNJHmP9?Afh}WRpL)_;7OY9MLBR`bkcGi}|vP zj{Ha+GGxewSDP)@9~lj)#fS;jBD9BMtS4PYIB8|xdHi@TV?1t#r}`%CL1Vo@x(!Kw zq~f$`#)`3ri=y9Lcu{gQGIIWll-FgakA$l)_p{KYur%{+IQKKEJKJ>KjclFu zKMw3Oit=jj=+pLayL&1ZZgny@wxW`|ft?$}6Akqj~`JW5_k$cN1$e!mKHUT6BM(Y{^LaKqXUa@Et>)?Ks=mhu+Zhr0l(hUl z=n7yER7Td9M`VDyCcJs$g$o@&KNp0ZEML!eFJ7qpdex^p0W*OhIzbFCNrT!DB?*u& z0!MmzpH8WWNr0+*(LaL1T`T22$2~uYGgp3*(u($Si8`FtA{bLEy&nFKewv;1is@-+ zXxz}Ba3iO&-`AGG)jGAZ&o)OI-Mv|O%`i>r`1TiLcBqBkZ89tE=G0Ao>9{2hvKL6* zpd}}KaBqqsQoQ2@bCM5LS8s@%I|0Aj9uT$U>V&eSv@{p)y+_ZUrlrr{Mr`N`@x!E$ zHk@-D#m``5-AaXb11*I7_lCud^hqwD&{A|Mf@KFshPuA$`4J5V-_fy`;!#jg^pGB- zmbxPclKFaeVFm{{=}F&hogit!{lIX$3{bz~iR;Q?qC8CpsKh#%$9!)qpn6MPR2VGH z4OZzS>ChOJiuZT1$HQ`dn;2O6*yzlk5dH3Kb=irAm=`aXoN`l|+uhw}_K#Z{Gn*Rv z4;>-*@vHX2md9V)&nrJxv)uk0TX9g`wp*k_w4sq3(l}zGEaO-hGT&NFR)SF?f3cx9 z>Gu=6ML*N#mbN|E)3U>z7^bmrGYg2*tN7z=fhSeb}HWltV_`|7L<}TMWOo{N21HTmvrCpI@kLR z7;qyt%FDt{|4zbbYn6V}FXbBI_BL$fNMStCW8lCH2mvANMmVm$=ob(|0}gol4|0N& zF1;!1(6y_+Wd>`Dk5vGH<)X;IQPyc$yGV}+Xf#4g^6=c0-DBo=?{@0VXEpeLfLpC1 zFqJ?GCoNOz4io+>w~oCpf*kCz(1X83{&5=R4v?tVGBPlkU6(2HD64xaU+hySZwn-%`kYHlsca6O$_ zb9n=#sfY#SS!jZ1BCDdFfH0m4;1l|WwY|maD?z*DXP$q|bRW0rfg47Fgqt80Qn#%= z!D@lnqCa38jhqv%ZU7vdGtlnG%b)g!x)=^__8cgjJ}uiP@Bptxs9g(k2M(Y7>0<Xu(OL}5fj#qn+;ce$5X zSn9gyz+DV&JJJMVI*m?5M^|L2KqNVz6SbNmPc2`om-^#FH(s?mY!Z+ce0J{^+jGJ!=P9EBPF134klOs4aag@%ij2hH#T!kyC5^;-t$hXAASz9Nif z(Zv>6EvGeLH3HYTdeTMMlLlxLhk z;2yewCsDi{A~#xiXX|q7t6|xS>iN?mDvVoe?svU0C$NR)+Gig-9h#G^|Ii&2!pbN7 zVVBChBLl-B-VwQ9`MIA`X)c`5mp5SpF`n4`u;UsgglwLQ&!d>R98~f8;;eQEZS)B# z_<1Efd*%*t`C+(0xY^Ub)}H+^^qBVh%V2yBg_)VKV-?NEJcpR?$^A4e0xThGg~*CK z#lbhrbxqoEGujRW?gALR)50R2BZ*2 zC{p!F3_P@OXXaI$_!eoV5XAXn06qq19^z^JE!&6Y8POd^k>Xe=b%qCm3*V5Zlc~f6 zgh#*=5 z;FEIf2w4}W4R+RY^TQ2Ed#dmExLWXa`Q7EQzrI_2{L^>xIP;Ay)X%SP6Yn*&LyG#K z&xy&Mb3JTN1?UX=To|M{J!k@bd^dM8i$Z{#+c-MY~WGx-&=)l8=O#YzuK0L=4o2_{U{FA)cim72qIn*hk#JYqBm`46 zlgJbUscu;zCsBHA$LG1VD>vLhlecgOC~z zO5lSkjUNzkd~xpk`SVhzGM`)S|IDN%4MsK6S9<<7LM0{vUZhBU+`NrYD+y@|%{}y0D%mpM z$ExhL8%hch6s0hWcJkA#(IrWpuPAj&NlX;R zV+7|UO7rEo6_X2yAkHxLr4PDjGRgMo#1^7Cf;Efv#u>nc%RcUwr1pZh0Fe{A8BS%N zX?D@Sv#KGR@M6=5{^bDfiAS|EJ5Tik$HQFmmzQ1#;72C!sl4!e=1&OY?|`xOmE?Vb z)p2lWDt30j)B>YlFFuz5{uuD@RlT3QY3p)&_yooykZw3xm8%7xKPR^vXe-W=ELkUC zA8#SD0n@iZR7CbI-XuJh6Zyoaf`Y&?$3&t{_Ou+XA^O*N%4to5tnzX;aT$4U`SOTW5mhcjSEj&1dPa+=vzR;s{spNOjBS#2ss zujR`b-CauR;uyku9T)tk9rgCVQ7H$*u^c z%#iG4?-jC>(fj$To^#&!davtQ=Q$nz|KGU3_x)M77lCR~h?;Y3eMqAKJQMLRWLyEk z1KYU=-l{PuUWECSF>cT{*$UkA)r%?4@L)kAPB0|lfvgH=yb!t=&Wf$Z_32wKo2dZ7b#}L8V6z4mPP&B!h1o0P0_LWEb{}Ait zz$cV4M-ZYNG*oGXsOTf1L&aEsQY%Qm=g7kbG+k)dfWVML9;ZNzy$Mj%r?_terWV() z=eM+6a?l(c9j(Nfy#5{P8zC~FkkvtbgHlHN(uGdj&IY4QOwPO1o4PxC$;pUem}bN3 zsKVYA%a@ZdL7R+PVKI=kS~M40k@I%s3i-8AH?QGZ+>3}(v9K?>N@!uW_hzk{WgGkiA>pWno-Cm z<*U{=gkFy3Ol(38Jl`OVlauk(y$vK{5X#i=K{L`oOz9xJ0>=IW3Nq|qRVd5N$sybk zP7)q1%SL?wG~Wx<=PRGJ4K>!GpU-?0Bw{Z&k}L=*Z^inU1f&&>x7v@A+lL0!B%}Tc zdLSaAqySb(#OH)_K}$%rV}}H6%J@ZxQdL+T1%kF`$ zlu~D<=yU1 z5Fye495z32xo5$VQhWi)i53!ym9DH#M(Dm>5&WOaI6P2p_OI?9jSooBPE^;$NInIA1^~weJNL9m!c?!ojUTnna z(E??LJ}AVr1!aX8GVv-@0$#z76Rv*#ss*vPNb(>qUNlTZ>IIOt207edR;qVfpl?Gq zL>SJ7coV-)e3DqOZ=}fs(uLYVbdS)y5j=^=P^{jPMx*j5ENdjK<30{}lpKho{qdRt zpNe==Wk7~l^hKSJ0$1k9V}`CiQ_Wu9NK=%o&bWCUtNLfxAcq`Q?10x``9!G$NtZwM zb+72pO_lSP_1gSpo-*whntL5|+EPyfOjflo*6*!=K^c+0gdW7%LtYlc!P%cbpZy{s zmvc;@ zvACL;ph0a+?dXCDWr*oT3`M5K;}srj!jYoT#Weai2IBV1AW{=~P$D>M3o9x(Kg{`b z;y&V`Qj9;lhs4o%d2L3+bT!-R5Zy++zq&XoNwWud`YeQh{8NMVNo5esL&viZ+<7<7 zIA8^6`{FIVjzKWH#E*Ft0~)}YbR1}@$4891;Rz9!kIS~kT|*=l8`uVPxikwK*6%48 zB93Wdq9966S%I%#z7V$@iS*L<@t{aO^D}CeZ`(xZ6aYJ}GMNbBS5pnx7cYmw3>%e; zFp=ZFL=kACQE8@OPZncfbpXq`_$_#B1xO*g{MHfiMEwcrdF14Rl!#+!6o9#oivKpU zS{KC|3Xke|CtI-LCr`Tj6v&6Cqs1Szd`dLZphsw@OO-U+Ah-C&nQD zhz+7=PUk@&Iu8^Xjtf&n`u2F_o8$nNA+5pdMZ|TGgWp9Vi;-%M>2G->i26phK){Z5 z2M0i00#Niq3{I5m)-4UP)zy!I5O`su{Pj_dua$vd8L{%B12gXF^kMvSz~yOWUm;S# zidtOCg0W_f_8{JR?^R5Vfg71R z0`D4z0@{a|CU)%d5!S8dEK0gVrl;CO&KOlY~$MFT}jl9M&0 z?o*1LM!{o3$FB!L3LepF6b+K$+(8|vmLyPdgjzgbllw^>-R4PIGck3$R2{vRSQy`F zWF>vZ-})*T(S{}CZonFK7e@JO)8AByk{eqQ-da{FKrp_6>hW*P_M$^b8X5`gIVPjb zp$_;sPLTl%#|+4>Lv)-0K|dm_7oLIU=0np6yw~=}cdg)II*)r`j{!i=TPCyf@qo#9 z!|#JG$FHMSK%Px8nnVcV*|`R<1*qL8FJinA()N?=bAdXw$?_N%D`r86U3j1#)TL$97023hV2Y z=}!b|@UrMS_xLD%h$W)Xs(wj;-w=Z4qwFNW;6WaKET!O-wmtE~w$mxxF#-Spdh|jd zUf6^hA%VqEi#GQ5e9%1eH}USO!Mx%E7ZzMP`;pF|l$vzujX$Xi!gj8`wG8aGk?e1NhxXZvIF)%63THt};|{F)XYy z6r`6>i+9;|%TPzReHR|bvA;^K{SK9v%;2|&elC+H>33xkg750yaP=)&V7JN8QjYZ+ zslozDHrmh3%>Fq zvrMwNu*#%C#*QB>3DDI2r2|CkC`a*1Eyu@?dIA+8TtRK}Wkwvun2BcL0j!!>4Y3CXLphd&9z8x@Ih5|GOw?!i zk)%w)bs%f4){e7l>y|B;QP=c;J+x5i6UkzDloHNS3fhCyi}`C9zhmRT1UkY*U9b~4 z7Kqj$YCsvv|3tZ6Oklz%;B+8Sj>zB@gEKI1l|xu z8>Yx7DA?!5l}CD9i6|<*T{W05i0zALcknn9pA#UZWkL3N-EcHOWXgg9NAz(K4%4dH zQ)FQ*PU9c}6SeH7nxSO47urWg!nO9MLp890K`0Qnkk;YybNEHj0Ol$@z6k-KLFU&D zl06U`l!&ap`#xv5qg;*Awd1YSRyP~9?I?v0`dzcy!lNTG%v*H#Z$nrl5N3iCsHl8VYLg?G@EE%FVC6stT?jBd($tF19Kr8%AU-sRSITf=5qTdl z6oA4kEkE&u6t=X4k#mchx&RZmO<$NblG#^4(B(KXphv_@(>YQ%#S#sGN*2wsrzy>;dkEf87V{?t^PqMYg_Bg@mJ8Z>6C*eeK$Ji^56d z*ddjk7IJ!dR29q_#1@E9(q(6%V<%byG%JJ$vbN-8lFwHJdX16)k(N7N4U!ULv~5lb zr!2v$LxpS~k7j{HW_!jhvIL`mw8wcgQ)QKe%}GiRZx_t0DhvQwKYQl>=hX16oM#A)1J4WMTJ-v|+44HKfA4 z-;K$R_-;@sb-u*a8D$c454ptXVXhFI2k) z_HRABI)@Yj8v_B)mO}hVf=ClEh@yAZ#fdODjgp1)Eg#Nj8^m4S;~G4A=nS{9vG%ZdA0_uxStpYh10Jj$D)#>T3J;oG&>Nu`Z#f8?yqplRCm z;A+SW@A-y=p3~*V)$*P>?obB1;ILIl(~-hq=8TaB=(wT8Q?m3J4=;jkxCv7XZi5i+ zbp<;gb>xAN8LXuOk=Tcuiq(rQPzI9Ak2jf6Gmqxmxu@(rh#0gbdpjm63}1L_i%`cf zT?kF&K$|q z4>?0}Fl5@;*rY(znjyF-N^-D>y$zPlIAHyRm&VNu#wkq}AVp=9Bz_$9K+Y3&alOf* zkC)`F<@}Osfq6w{9uFczoYIVP5ywaeQ;0^4_-O~ zBmx^{D{lNaWSZu0_{ z!^>6!?aTuEEnKQ;?zCelaNi^1{=2k?$htlps++wB|vN<3;u-=vwY9 zlb1R2Ia#1y0t|3AQj8K{K^e9vm7*ikttF`vv9Ps*ql~~qNKtxqnVr3T4LsdZDjNKb zYu2pE^tuEZ44S&9(|p*b^AP=~q~~s)>=_(DgCeYWz5QcF=Q0AR#kIhxlA#hH*FRZp zzc4S2qced^9yr_zoM6H@)}kP;2WundpghrSwSkWR0cIRNph4|pd|~c-igxC6@IE6i zo(>&q489BT1EZo4oZaeP^rYv&$jB#>&z72+kM1|O6738i-(%=9?*slI-UO(l6Gmpb z(;wHGEOz(p$xT~&9<~e|v)~Jtt1(L*G9F*gu4WPVIX^7f-d0PWGa==|i71vzyD(K9 z7rZxTF%2TKQ6BJ)$4ks&l&8Z57j?xL*E1QnxLfXwX;4w=Xg1;(@Kb}<$#l|1x%=Xh z^z~P>iGSKi7d}4k#W@8Xubn38&Hs-QHn=0>#9n=Gfiee~Mm^|bVHI@4`9SAk#07*I zR3S2hbE|D+_V7;%h?>s1$V!c|Bruqtzd$Wf>kty@!k%U~XI7qPzxC2lr#BoM?e6uk z%ifn*p`ltXKR3bwb>W^jbKf8Ywb#fPjbmAdA9ykEW)Pmp*tu)4c?@uUCin*s02l5<{mWMj%0xtHW+0G zLX@Ze5F1l%+45cOd7RG{#t)B8-llx3GPzQbSsF!i`@PiBd;V8tF1=MYYT4wm`t#vV z5hr?;(#87?4+Usa1o@&~yx}sdA8}9j2}n423OMA-fn+yoOn{_vw{#8de?ll{% ziK|?n^lC|rcY_S25aU5Mov4dCO~jg**YywADQjqP(|obhTqSx*_`O5YszBz;$vz?v zMP|=b<(;^k@ijxq;Mg(SsyBt#vU_g5+E1X5$BWsgJ4Qz2VD3ryKt7y#X4%X(TH#*@ zFN_XRa4*>#ehS{mFXu4h3VN*6GaSc>KSXd-EE_1piHFgNJK@5{c*Pi!)NVg`G{?5E z(ak={>W4feQr|BtDqQ9M{Hfk$ne3V_%~7MywZFxRL>y0L!{J)W&afpQuzAMXg1c`> zL!*{M>uP6-h8fZ0l3$Y*oUhrAA(LKN^Y*#Db!kS0&x2aac5P;svJMK)xV5C4EXl;W zzfUOGudPSJ)vzx^5(Y&Qu?Z8SbCvGf*RN0SFj)xN?mhERknci+A;&ZMD>gCyweg<| z3bwA>Bi8!Jt~&=JNq*PJCsierw@*IE8J3IptXe+;?&1!7#;JV!mN$P6E*pIpdi;-s zbZ-N^d77v;2+=shiD0cLI395$*FqUXB@wW&!A>}2`e1KB2s34s+MS>y6bFAY{oMZi zc$1x(w&}sk1hryE@C2sB?%R1=_DU*JuezIm%SHU_p=|uE??*}Cjfw;e}3{-{>PJW&Qf8EJxhgcv`e2aO9vBWKa4 z2>qhK2>XEXMuqm8bq0*q&j&*cY3t(|SLL`aS)NPYAdnj}K_-CIn4598(&o)PBUuL5 ze#}{%;YcRR?{T$|7#AX{1&k8V7w6^bu}MF_p7F=N1MbehV&zt`JZ<2M zG*X}cSj$Ir#NPJc51vK!Ky-Sm+j|lf)NrsDXEHh`vIIt?y%J7*BF#)mDWQ7!sNr^o z>WI(IrgG#gOG`_mF9%0Au(Ut?9? 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

+TUKd)9XTh%C%rI3$4*JbUQq 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

u^9HK&R;~B`h~VB%OTU5%YaoX6h22hLRd# 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 GTmBd03B~CE literal 0 HcmV?d00001 diff --git a/docs/usage/evidence/qwen3-next-rms-norm-b200/report.json b/docs/usage/evidence/qwen3-next-rms-norm-b200/report.json new file mode 100644 index 000000000..0fc8452ae --- /dev/null +++ b/docs/usage/evidence/qwen3-next-rms-norm-b200/report.json @@ -0,0 +1,225 @@ +{ + "kind": "qwen3_next_norm_evidence", + "rfc": "RL-Align/RL-Kernel#428", + "git_commit": "3d0bae7174c09a133ea1288d820b63e4a7db8f57", + "git_dirty": false, + "environment": { + "gpu": "NVIDIA B200", + "capability": [ + 10, + 0 + ], + "torch": "2.13.0+cu130", + "cuda": "13.0", + "python": "3.12.14", + "transformers": "5.17.0", + "vllm": "0.30.0", + "flashinfer": "0.6.18.post1" + }, + "hidden": 2048, + "eps": 1e-06, + "dtype": "bfloat16", + "ops": { + "zero_centred_rmsnorm": { + "accuracy": { + "257": { + "rl-kernel CUDA": { + "dx_max_abs_over_absmax": 0.002701418159021442, + "dweight_max_abs_over_absmax": 0.0023356239188215265, + "forward_max_abs": 0.01552825644384992, + "forward_correctly_rounded_fraction": 0.9999942779541016 + }, + "rl-kernel PyTorch reference": { + "dx_max_abs_over_absmax": 0.002701418159021442, + "dweight_max_abs_over_absmax": 0.0023356239188215265, + "forward_max_abs": 0.01552825644384992, + "forward_correctly_rounded_fraction": 0.9999905228614807 + }, + "transformers Qwen3NextRMSNorm": { + "dx_max_abs_over_absmax": 0.002701418159021442, + "dweight_max_abs_over_absmax": 0.0023356239188215265, + "forward_max_abs": 0.01552825644384992, + "forward_correctly_rounded_fraction": 0.9999905228614807 + }, + "vLLM GemmaRMSNorm (forward only)": { + "forward_max_abs": 0.01552825644384992, + "forward_correctly_rounded_fraction": 0.9999905228614807 + }, + "FlashInfer gemma_rmsnorm (forward only)": { + "forward_max_abs": 0.01552825644384992, + "forward_correctly_rounded_fraction": 0.9999886155128479 + } + }, + "4096": { + "rl-kernel CUDA": { + "dx_max_abs_over_absmax": 0.0027934846392837836, + "dweight_max_abs_over_absmax": 0.002058919545322908, + "forward_max_abs": 0.015599696412158082, + "forward_correctly_rounded_fraction": 0.999991774559021 + }, + "rl-kernel PyTorch reference": { + "dx_max_abs_over_absmax": 0.0027934846392837836, + "dweight_max_abs_over_absmax": 0.002058919545322908, + "forward_max_abs": 0.015599696412158082, + "forward_correctly_rounded_fraction": 0.9999927282333374 + }, + "transformers Qwen3NextRMSNorm": { + "dx_max_abs_over_absmax": 0.0027934846392837836, + "dweight_max_abs_over_absmax": 0.002058919545322908, + "forward_max_abs": 0.015599696412158082, + "forward_correctly_rounded_fraction": 0.9999921321868896 + }, + "vLLM GemmaRMSNorm (forward only)": { + "forward_max_abs": 0.015599696412158082, + "forward_correctly_rounded_fraction": 0.9999921321868896 + }, + "FlashInfer gemma_rmsnorm (forward only)": { + "forward_max_abs": 0.015599696412158082, + "forward_correctly_rounded_fraction": 0.999992847442627 + } + } + }, + "row_invariance": { + "rl-kernel CUDA": { + "rows_checked": 768, + "forward_rows_differing": 0, + "dx_rows_differing": 0, + "batch_rows": 4096, + "seeds": [ + 3, + 4, + 5 + ] + }, + "rl-kernel PyTorch reference": { + "rows_checked": 768, + "forward_rows_differing": 0, + "dx_rows_differing": 12, + "batch_rows": 4096, + "seeds": [ + 3, + 4, + 5 + ] + }, + "transformers Qwen3NextRMSNorm": { + "rows_checked": 768, + "forward_rows_differing": 2, + "dx_rows_differing": 11, + "batch_rows": 4096, + "seeds": [ + 3, + 4, + 5 + ] + }, + "vLLM GemmaRMSNorm (forward only)": { + "rows_checked": 768, + "forward_rows_differing": 2, + "dx_rows_differing": null, + "batch_rows": 4096, + "seeds": [ + 3, + 4, + 5 + ] + }, + "FlashInfer gemma_rmsnorm (forward only)": { + "rows_checked": 768, + "forward_rows_differing": 0, + "dx_rows_differing": null, + "batch_rows": 4096, + "seeds": [ + 3, + 4, + 5 + ] + } + }, + "latency": { + "rl-kernel CUDA": { + "1024": { + "forward_us": 24.70399998128414, + "backward_us": 568.7519907951355 + }, + "4096": { + "forward_us": 39.16800022125244, + "backward_us": 1259.3119740486145 + }, + "16384": { + "forward_us": 122.36800044775009, + "backward_us": 7879.024028778076 + }, + "65536": { + "forward_us": 425.80799758434296, + "backward_us": 30937.551498413086 + } + }, + "rl-kernel PyTorch reference": { + "1024": { + "forward_us": 70.54400071501732, + "backward_us": 644.7039842605591 + }, + "4096": { + "forward_us": 155.90400248765945, + "backward_us": 624.2719888687134 + }, + "16384": { + "forward_us": 577.5039792060852, + "backward_us": 986.7520034313202 + }, + "65536": { + "forward_us": 2148.0319499969482, + "backward_us": 2990.224003791809 + } + }, + "transformers Qwen3NextRMSNorm": { + "1024": { + "forward_us": 69.34399902820587, + "backward_us": 608.5599958896637 + }, + "4096": { + "forward_us": 117.3119992017746, + "backward_us": 606.3359975814819 + }, + "16384": { + "forward_us": 407.50400722026825, + "backward_us": 1027.888000011444 + }, + "65536": { + "forward_us": 1449.4240283966064, + "backward_us": 3144.6080207824707 + } + }, + "vLLM GemmaRMSNorm (forward only)": { + "1024": { + "forward_us": 65.61600044369698 + }, + "4096": { + "forward_us": 118.40000003576279 + }, + "16384": { + "forward_us": 405.90400993824005 + }, + "65536": { + "forward_us": 1449.6000409126282 + } + }, + "FlashInfer gemma_rmsnorm (forward only)": { + "1024": { + "forward_us": 14.448000118136406 + }, + "4096": { + "forward_us": 16.24000072479248 + }, + "16384": { + "forward_us": 32.207999378442764 + }, + "65536": { + "forward_us": 90.55999666452408 + } + } + } + } + } +} From 024823d81ec15c5722c1bcdc3e94cf102220bfa0 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Thu, 8 Oct 2026 18:33:00 +0000 Subject: [PATCH 43/70] docs(norm): gated RMSNorm evidence vs existing implementations on B200 Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- docs/operators/qwen3-next-rms-norm-gated.md | 28 ++ .../figure-gated_rmsnorm.png | Bin 0 -> 246981 bytes .../figure-zero_centred_rmsnorm.png | Bin 0 -> 241545 bytes .../report.json | 400 ++++++++++++++++++ 4 files changed, 428 insertions(+) create mode 100644 docs/usage/evidence/qwen3-next-rms-norm-gated-b200/figure-gated_rmsnorm.png create mode 100644 docs/usage/evidence/qwen3-next-rms-norm-gated-b200/figure-zero_centred_rmsnorm.png create mode 100644 docs/usage/evidence/qwen3-next-rms-norm-gated-b200/report.json diff --git a/docs/operators/qwen3-next-rms-norm-gated.md b/docs/operators/qwen3-next-rms-norm-gated.md index 49221c8a0..ba5d13501 100644 --- a/docs/operators/qwen3-next-rms-norm-gated.md +++ b/docs/operators/qwen3-next-rms-norm-gated.md @@ -119,6 +119,34 @@ python scripts/check_operator.py --op rms_norm_gated --candidate cuda \ --device cuda --dtype bf16 --check-grad ``` +## Evidence + +![gated RMSNorm vs existing implementations on B200](../usage/evidence/qwen3-next-rms-norm-gated-b200/figure-gated_rmsnorm.png) + +[`report.json`](../usage/evidence/qwen3-next-rms-norm-gated-b200/report.json) was written by +`scripts/qwen3_next_norm_evidence.py` from a clean tree at `822b085`, on an otherwise idle +B200 (torch 2.13.0+cu130, transformers 5.17.0, vLLM 0.30.0). Head dim 128, BF16; the FP64 +golden uses vLLM's convention. The same report re-measures the zero-centred op +([figure](../usage/evidence/qwen3-next-rms-norm-gated-b200/figure-zero_centred_rmsnorm.png)). + +| | rl-kernel CUDA | PyTorch reference | transformers (cast-first) | vLLM `RMSNormGated`* | +|---|---|---|---|---| +| rows differing alone vs in a batch, forward / `dx`,`dgate` (of 768) | **0 / 0** | 0 / 0 | 0 / 0 | 0 / n/a | +| forward elements correctly rounded vs the golden | **99.999%** | 99.999% | 65.6% | 99.999% | +| forward, 262144 rows | 235 µs | 774 µs | 697 µs | **81 µs** | +| backward, 262144 rows | 114 ms | **1.4 ms** | 1.5 ms | n/a | + +\* forward only, no backward. + +- **Every implementation is row-invariant** for this op. +- **transformers computes a different function:** it casts to BF16 before the weight + multiply, so 34% of its forward elements differ from vLLM's convention, and its gradients + are about twice as far from the golden. +- **The backward is about 80× slower than transformers at 262144 rows**, for the same reason + as the zero-centred op: `dweight` (128 columns here) is folded over the rows in ascending + order, one thread per column, so that it meets the gradient-invariance contract's + singleton-aggregate check bitwise. + ## Tests ```bash diff --git a/docs/usage/evidence/qwen3-next-rms-norm-gated-b200/figure-gated_rmsnorm.png b/docs/usage/evidence/qwen3-next-rms-norm-gated-b200/figure-gated_rmsnorm.png new file mode 100644 index 0000000000000000000000000000000000000000..eaf59c4182d415031d99472f07667b3529decd67 GIT binary patch literal 246981 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

E!(){*k$)^R2Y3xQMu` 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 literal 0 HcmV?d00001 diff --git a/docs/usage/evidence/qwen3-next-rms-norm-gated-b200/figure-zero_centred_rmsnorm.png b/docs/usage/evidence/qwen3-next-rms-norm-gated-b200/figure-zero_centred_rmsnorm.png new file mode 100644 index 0000000000000000000000000000000000000000..5cd70b5cfcd6c378a0d6ab1acc7a31d541222430 GIT binary patch literal 241545 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≻1Vtf|)KbfRA?6K)8}6x5Fctnye>k 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 Date: Thu, 8 Oct 2026 18:33:10 +0000 Subject: [PATCH 44/70] docs(norm): correct the gated backward slowdown ratio Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- docs/operators/qwen3-next-rms-norm-gated.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/operators/qwen3-next-rms-norm-gated.md b/docs/operators/qwen3-next-rms-norm-gated.md index ba5d13501..41d7616a1 100644 --- a/docs/operators/qwen3-next-rms-norm-gated.md +++ b/docs/operators/qwen3-next-rms-norm-gated.md @@ -142,7 +142,7 @@ golden uses vLLM's convention. The same report re-measures the zero-centred op - **transformers computes a different function:** it casts to BF16 before the weight multiply, so 34% of its forward elements differ from vLLM's convention, and its gradients are about twice as far from the golden. -- **The backward is about 80× slower than transformers at 262144 rows**, for the same reason +- **The backward is about 75× slower than transformers at 262144 rows**, for the same reason as the zero-centred op: `dweight` (128 columns here) is folded over the rows in ascending order, one thread per column, so that it meets the gradient-invariance contract's singleton-aggregate check bitwise. From 2e950f386bd3c4c2c07f41472f48878be94ea3b8 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Fri, 9 Oct 2026 01:43:43 +0000 Subject: [PATCH 45/70] feat(qwen3-next): MoE route/combine contract with a batch-invariant grouped expert GEMM RFC #428 moe_route_combine_contract (CUDA). - Routing: FP32 router through the pinned vLLM batch-invariant GEMM, a fixed-order softmax, stable descending argsort (ties go to the lower expert id) and FP32 renormalisation of the ten selected weights. - Experts: per-route gate_up and down projections through vLLM 0.30.0's fused_moe Triton kernel with the batch-invariant tile passed explicitly (BLOCK 64/64/32, SPLIT_K=1); no routed-weight multiply and no sum inside the kernel, so every (token, route) row has one writer. Bitwise equal to the previous per-expert GEMM loop at TP4 and TP1 widths; fails closed if VLLM_TRITON_USE_TD is enabled. - Combine: ten ordered FP32 multiply-adds and one BF16 cast; no atomics. - Backward: per-expert pinned GEMMs into one dense gradient buffer; dx is summed in ascending expert order. - TP4 block: HF load/export for all 512 experts, replicated router and shared-expert gate, Megatron-style copy/reduce autograd boundaries moved into qwen3_next_tp.py. - Prior-art runner and plot comparing HF transformers, vLLM fused_moe (BI=0/1) and FlashInfer cutlass_fused_moe; TP4 real-weight gate script. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- .github/workflows/ci.yml | 2 +- .github/workflows/qwen3-next-provider-gpu.yml | 11 +- rl_engine/integrations/qwen3_next_forward.py | 338 ++++++++++++++ rl_engine/integrations/qwen3_next_tp.py | 65 +++ .../integrations/qwen3_next_tp_blocks.py | 138 ++++++ rl_engine/testing/qwen3_next_moe_prior_art.py | 440 ++++++++++++++++++ rl_engine/testing/tensor_identity.py | 38 ++ scripts/plot_qwen3_next_moe_prior_art.py | 159 +++++++ scripts/qwen3_next_moe_prior_art.py | 87 ++++ scripts/qwen3_next_tp_moe_check.py | 207 ++++++++ tests/check_qwen3_next_forward.py | 238 ++++++++++ tests/test_qwen3_next_forward_contract.py | 62 +++ tests/test_qwen3_next_tp_blocks.py | 93 ++++ tests/test_tensor_identity.py | 41 ++ 14 files changed, 1915 insertions(+), 4 deletions(-) create mode 100644 rl_engine/integrations/qwen3_next_forward.py create mode 100644 rl_engine/integrations/qwen3_next_tp.py create mode 100644 rl_engine/integrations/qwen3_next_tp_blocks.py create mode 100644 rl_engine/testing/qwen3_next_moe_prior_art.py create mode 100644 rl_engine/testing/tensor_identity.py create mode 100644 scripts/plot_qwen3_next_moe_prior_art.py create mode 100644 scripts/qwen3_next_moe_prior_art.py create mode 100644 scripts/qwen3_next_tp_moe_check.py create mode 100644 tests/check_qwen3_next_forward.py create mode 100644 tests/test_qwen3_next_forward_contract.py create mode 100644 tests/test_qwen3_next_tp_blocks.py create mode 100644 tests/test_tensor_identity.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 814a4ae22..2fb92d641 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -67,7 +67,7 @@ jobs: run: | python -m pytest rl_engine/tests/test_dispatch.py -v PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 python -m pytest tests/test_attention_correctness.py -q -rs - python -m pytest tests/test_forward_invariance.py tests/test_tolerance_contract.py tests/test_ws1_workload.py tests/test_gradient_invariance.py tests/test_elementwise_inventory.py tests/test_four_judgment_matrix.py tests/test_op_checks.py tests/test_operator_inputs.py tests/test_profiler.py tests/test_kv_consistency.py tests/test_ws1_qwen3_dense.py tests/test_ws1_chain_integration.py tests/test_qwen3_next_norm.py tests/test_gdn_state_contract.py -q + python -m pytest tests/test_forward_invariance.py tests/test_tolerance_contract.py tests/test_ws1_workload.py tests/test_gradient_invariance.py tests/test_elementwise_inventory.py tests/test_four_judgment_matrix.py tests/test_op_checks.py tests/test_operator_inputs.py tests/test_profiler.py tests/test_kv_consistency.py tests/test_ws1_qwen3_dense.py tests/test_ws1_chain_integration.py tests/test_qwen3_next_norm.py tests/test_gdn_state_contract.py tests/test_tensor_identity.py tests/test_qwen3_next_forward_contract.py tests/test_qwen3_next_tp_blocks.py -q - name: Run Cross-Configuration Contract Tests (CPU-safe) run: | diff --git a/.github/workflows/qwen3-next-provider-gpu.yml b/.github/workflows/qwen3-next-provider-gpu.yml index 146818019..691489402 100644 --- a/.github/workflows/qwen3-next-provider-gpu.yml +++ b/.github/workflows/qwen3-next-provider-gpu.yml @@ -1,6 +1,7 @@ # SPDX-License-Identifier: Apache-2.0 -# RFC #428 Qwen3-Next provider comparisons: the C1/C3/C4 norm providers and the C6 -# GDN decode-step goldens, each checked against the real vLLM 0.30.0 provider. +# RFC #428 Qwen3-Next provider comparisons: the C1/C3/C4 norm providers, the C6 +# GDN decode-step goldens and the shared GEMM/MoE route-combine provider, each +# checked against the real vLLM 0.30.0 provider. # # These check_ files import vLLM, so the default pytest collection never runs them # (tests/test_framework_operator_integrations.py asserts vLLM is not imported). This @@ -19,6 +20,7 @@ on: branches: [main] paths: - "rl_engine/kernels/ops/**" + - "rl_engine/integrations/qwen3_next*" - "rl_engine/testing/qwen3_next*" - "tests/check_*qwen3_next*.py" - "tests/check_gdn_recurrent_golden.py" @@ -78,5 +80,8 @@ jobs: print("rl_engine._C:", loaded) PY - name: Check pinned providers in their own process + # The FP32 router needs IEEE Triton dots from process start. + env: + TRITON_F32_DEFAULT: ieee run: | - python3 -m pytest -q tests/check_qwen3_next_norm_providers.py tests/check_gdn_recurrent_golden.py + python3 -m pytest -q tests/check_qwen3_next_norm_providers.py tests/check_gdn_recurrent_golden.py tests/check_qwen3_next_forward.py diff --git a/rl_engine/integrations/qwen3_next_forward.py b/rl_engine/integrations/qwen3_next_forward.py new file mode 100644 index 000000000..b5a1e20e0 --- /dev/null +++ b/rl_engine/integrations/qwen3_next_forward.py @@ -0,0 +1,338 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Explicit CUDA forward primitives for the Qwen3-Next shared TP4 profile. + +These functions do not install framework hooks or advertise engine capabilities. +The caller owns parameter sharding, TP collectives, positions and cache identity. +Weights remain BF16; only the router explicitly computes in FP32, as in VIME's +Qwen3-Next configuration. No CPU or alternate-kernel fallback is permitted. +""" + +from dataclasses import dataclass +from functools import lru_cache +from importlib.metadata import version + +import torch +import torch.nn.functional as F +from torch.autograd.function import once_differentiable + +FORWARD_PROVIDER_ID = "qwen3-next-shared-cuda-forward-v1" + + +@lru_cache(maxsize=1) +def _vllm_linear(): + if version("vllm") != "0.30.0": + raise RuntimeError("Shared Qwen3-Next linear requires pinned vLLM 0.30.0") + from vllm.model_executor.determinism.batch_invariant import linear_batch_invariant + + return linear_batch_invariant + + +# The batch-invariant tile vLLM itself selects under VLLM_BATCH_INVARIANT=1 +# (fused_moe.get_default_config), passed explicitly so no environment variable, +# tuned-config file or token count can change it. +_GROUPED_CONFIG = { + "BLOCK_SIZE_M": 64, + "BLOCK_SIZE_N": 64, + "BLOCK_SIZE_K": 32, + "GROUP_SIZE_M": 8, + "SPLIT_K": 1, +} + + +@lru_cache(maxsize=1) +def _vllm_grouped(): + if version("vllm") != "0.30.0": + raise RuntimeError("Shared Qwen3-Next experts require pinned vLLM 0.30.0") + from vllm.model_executor.layers.fused_moe.fused_moe import ( + _prepare_expert_assignment, + dispatch_fused_moe_kernel, + ) + from vllm.model_executor.layers.fused_moe.utils import resolve_moe_use_td + + return _prepare_expert_assignment, dispatch_fused_moe_kernel, resolve_moe_use_td + + +def grouped_route_linear(rows, weight, route_indices): + """Per-route ``rows @ weight[expert].T`` through vLLM's fused MoE Triton kernel. + + ``rows`` is [T, K] (one row per token, shared by its ten routes) or + [T*10, K] (one row per route); the result is [T, 10, N] in route order. + No routed weight is applied and nothing is summed: every output row has + exactly one writer, and its K loop has the fixed order of the fixed tile. + """ + prepare, dispatch, use_td = _vllm_grouped() + if use_td(): + raise RuntimeError("VLLM_TRITON_USE_TD changes the MoE kernel; strict mode requires 0") + import triton.language as tl + + tokens, top_k = route_indices.shape + out = rows.new_empty((tokens, top_k, weight.shape[1])) + if tokens == 0: + return out + indices = route_indices.to(torch.int32).contiguous() + sorted_ids, expert_ids, padded = prepare( + indices, _GROUPED_CONFIG, tokens, top_k, weight.shape[0], None, ignore_invalid_experts=True + ) + dispatch( + rows.contiguous(), + weight, + out, + None, + None, + None, + None, + sorted_ids, + expert_ids, + padded, + False, + top_k if rows.shape[0] == tokens else 1, + _GROUPED_CONFIG, + compute_type=tl.bfloat16, + use_fp8_w8a8=False, + use_int8_w8a8=False, + use_int8_w8a16=False, + use_int4_w4a16=False, + per_channel_quant=False, + ) + return out + + +def _cuda_tensors(*tensors): + if torch.version.hip is not None or any(not value.is_cuda for value in tensors): + raise ValueError("Shared Qwen3-Next forward requires CUDA tensors; no CPU fallback") + if any(value.device != tensors[0].device for value in tensors[1:]): + raise ValueError("Shared Qwen3-Next tensors must be on the same device") + + +class _SharedLinear(torch.autograd.Function): + @staticmethod + def forward(ctx, x, weight, bias): + ctx.save_for_backward(x, weight) + ctx.has_bias = bias is not None + if x.shape[0] == 0: + return x.new_empty((0, weight.shape[0])) + with torch.cuda.device(x.device): + return _vllm_linear()(x, weight, bias) + + @staticmethod + @once_differentiable + def backward(ctx, grad_output): + x, weight = ctx.saved_tensors + if x.shape[0] == 0: + return ( + torch.empty_like(x) if ctx.needs_input_grad[0] else None, + torch.zeros_like(weight) if ctx.needs_input_grad[1] else None, + weight.new_zeros(weight.shape[0]) if ctx.has_bias else None, + ) + grad = grad_output.contiguous() + with torch.cuda.device(x.device): + linear = _vllm_linear() + dx = linear(grad, weight.t()) if ctx.needs_input_grad[0] else None + dw = linear(grad.t(), x.t()) if ctx.needs_input_grad[1] else None + db = grad.sum(dim=0) if ctx.has_bias and ctx.needs_input_grad[2] else None + return dx, dw, db + + +def shared_linear(x, weight, bias=None): + """Pinned vLLM deterministic GEMM with an explicit first-order VJP. + + x is [..., K], weight is [N, K], output is [..., N]. Operands have one + common BF16 or FP32 dtype. Empty token dimensions preserve autograd. + Backward executes dX=dY@W and dW=dY.T@X through the same fixed provider. + """ + _cuda_tensors(x, weight, *(() if bias is None else (bias,))) + if x.ndim < 2 or weight.ndim != 2 or x.shape[-1] != weight.shape[1]: + raise ValueError("Shared linear requires x[..., K] and weight[N, K]") + if x.dtype not in (torch.bfloat16, torch.float32) or weight.dtype != x.dtype: + raise ValueError("Shared linear operands must have one common BF16 or FP32 dtype") + if x.dtype == torch.float32: + import triton + + if triton.knobs.language.fp32_default != "ieee": + raise RuntimeError( + "FP32 shared linear requires TRITON_F32_DEFAULT=ieee at process startup" + ) + if min(weight.shape) < 1: + raise ValueError("Shared linear weight dimensions must be positive") + if bias is not None and (bias.shape != (weight.shape[0],) or bias.dtype != x.dtype): + raise ValueError("Shared linear bias must be [N] with the input dtype") + out = _SharedLinear.apply(x.reshape(-1, x.shape[-1]), weight, bias) + return out.reshape(*x.shape[:-1], weight.shape[0]) + + +def shared_router(x, weight): + """Compute the 512-expert FP32 router from BF16 inputs/parameter storage.""" + _cuda_tensors(x, weight) + if x.dtype != torch.bfloat16 or weight.dtype != torch.bfloat16: + raise ValueError("Qwen3-Next router input and stored weight must be BF16") + if x.ndim != 2 or weight.shape != (512, x.shape[-1]): + raise ValueError("Qwen3-Next router requires x[T, H] and weight[512, H]") + return shared_linear(x.float(), weight.float()) + + +@dataclass(frozen=True) +class Routing: + """Descending probability routes; equal scores prefer smaller expert IDs.""" + + weights: torch.Tensor + indices: torch.Tensor + + +def fixed_order_row_sum(values): + """Sum the last dimension by a pairwise tree of elementwise adds. + + ``torch.sum`` picks its reduction order from the tensor shape, so the same + row summed inside an 8-row and a 32-row tensor can differ by one ulp unless + vLLM's batch-invariant aten overrides are installed. Qualification runs + execute with ``VLLM_BATCH_INVARIANT=0``, where those overrides are absent. + Elementwise adds have no such freedom: every row is summed in one fixed + tree whatever the row count. Odd widths are padded with exact zeros. + """ + while values.shape[-1] > 1: + if values.shape[-1] % 2: + values = torch.cat((values, values.new_zeros((*values.shape[:-1], 1))), dim=-1) + values = values[..., 0::2] + values[..., 1::2] + return values + + +def fixed_order_softmax(logits): + """Row softmax from a max subtraction, exp and one fixed-order row sum.""" + shifted = logits - torch.amax(logits, dim=-1, keepdim=True) + exponentials = torch.exp(shifted) + return exponentials / fixed_order_row_sum(exponentials) + + +def stable_top10_routes(router_logits): + """Select ten distinct experts and normalize their FP32 probabilities. + + The full 512-way softmax precedes selection, preserving Qwen's normalized + top-k arithmetic. Stable sort fixes the otherwise ambiguous tie boundary. + Indices are discrete; gradients flow through the selected probabilities. + Both row sums use the fixed-order tree, so a token's route weights do not + depend on how many other tokens share its forward pass. + """ + _cuda_tensors(router_logits) + if router_logits.ndim != 2 or router_logits.shape[1] != 512: + raise ValueError("Qwen3-Next routing requires logits[T, 512]") + if router_logits.dtype != torch.float32: + raise ValueError("Qwen3-Next router logits must be FP32") + if not torch.isfinite(router_logits).all(): + raise ValueError("Qwen3-Next router logits must be finite") + probabilities = fixed_order_softmax(router_logits) + indices = torch.argsort(router_logits, dim=-1, descending=True, stable=True)[:, :10] + selected = probabilities.gather(1, indices) + return Routing(selected / fixed_order_row_sum(selected), indices) + + +def combine_routes(expert_outputs, route_weights): + """Combine [T, 10, H] BF16 outputs by ten ordered FP32 multiply-adds. + + There are no atomic sums. Each route's product and each addition is a + separate eager operation; the single BF16 cast follows the final route. + """ + _cuda_tensors(expert_outputs, route_weights) + if expert_outputs.ndim != 3 or expert_outputs.shape[1] != 10: + raise ValueError("Qwen3-Next expert outputs must have shape [T, 10, H]") + if route_weights.shape != expert_outputs.shape[:2]: + raise ValueError("Route weights must have shape [T, 10]") + if expert_outputs.dtype != torch.bfloat16 or route_weights.dtype != torch.float32: + raise ValueError("Combine requires BF16 expert outputs and FP32 route weights") + output = expert_outputs[:, 0].float() * route_weights[:, 0, None] + for slot in range(1, 10): + output = output + expert_outputs[:, slot].float() * route_weights[:, slot, None] + return output.to(torch.bfloat16) + + +def _expert_activation(gate_up_rows): + """SwiGLU in FP32 from the BF16 [gate, up] projection; returns its parts too.""" + gate, up = gate_up_rows.float().chunk(2, dim=-1) + silu_gate = F.silu(gate) + return silu_gate * up, silu_gate, gate, up + + +class _RoutedExperts(torch.autograd.Function): + """Grouped expert forward; per-expert backward into one dense gradient buffer.""" + + @staticmethod + def forward(ctx, x, gate_up, down, route_indices): + ctx.save_for_backward(x, gate_up, down, route_indices) + with torch.cuda.device(x.device): + projected = grouped_route_linear(x, gate_up, route_indices) + activated = _expert_activation(projected)[0] + activated = activated.to(x.dtype).reshape(-1, activated.shape[-1]) + return grouped_route_linear(activated, down, route_indices) + + @staticmethod + @once_differentiable + def backward(ctx, grad_output): + x, gate_up, down, route_indices = ctx.saved_tensors + dx = torch.zeros_like(x) if ctx.needs_input_grad[0] else None + dgate_up = torch.zeros_like(gate_up) if ctx.needs_input_grad[1] else None + ddown = torch.zeros_like(down) if ctx.needs_input_grad[2] else None + top_k = route_indices.shape[1] + slots_by_expert = [[] for _ in range(gate_up.shape[0])] + for slot, expert in enumerate(route_indices.flatten().tolist()): + slots_by_expert[expert].append(slot) + grad_flat = grad_output.reshape(-1, x.shape[1]) + with torch.cuda.device(x.device): + linear = _vllm_linear() + projected = grouped_route_linear(x, gate_up, route_indices) + projected = projected.reshape(-1, projected.shape[-1]) + for expert, slots in enumerate(slots_by_expert): + if not slots: + continue + slots = torch.tensor(slots, dtype=torch.long, device=x.device) + tokens = slots // top_k + activated, silu_gate, gate32, up32 = _expert_activation( + projected.index_select(0, slots) + ) + activated = activated.to(x.dtype) + grad = grad_flat.index_select(0, slots) + if ddown is not None: + ddown[expert].copy_(linear(grad.t(), activated.t())) + if dx is None and dgate_up is None: + continue + rows = x.index_select(0, tokens) + dactivated = linear(grad, down[expert].t()).float() + sigmoid = gate32.sigmoid() + dgate = dactivated * up32 * (sigmoid + gate32 * sigmoid * (1 - sigmoid)) + dup = dactivated * silu_gate + dprojected = torch.cat((dgate, dup), dim=-1).to(x.dtype) + if dgate_up is not None: + dgate_up[expert].copy_(linear(dprojected.t(), rows.t())) + if dx is not None: + # Top-k has distinct experts, so tokens are unique within this + # launch. Ascending expert order fixes each token's sum order. + partial = linear(dprojected, gate_up[expert].t()) + dx.index_copy_(0, tokens, dx.index_select(0, tokens) + partial) + return dx, dgate_up, ddown, None + + +def shared_moe(x, router_weight, gate_up_weights, down_weights): + """Evaluate TP-local routed experts; caller reduces the returned output. + + Weights are [512, 2*I_local, H] (gate then up) and [512, H, I_local]. + All experts belong to EP=1. Each (token, route) output row has exactly one + writer and the ten routes are combined in route order. Shared-expert and + TP-reduction ownership remains with the model adapter. The forward has no + host synchronisation; the backward builds per-expert row lists on the host. + """ + _cuda_tensors(x, router_weight, gate_up_weights, down_weights) + if x.ndim != 2 or x.dtype != torch.bfloat16: + raise ValueError("Qwen3-Next MoE input must be BF16 [T, H]") + if gate_up_weights.ndim != 3 or down_weights.ndim != 3: + raise ValueError("Qwen3-Next expert weights must have three dimensions") + local_intermediate = down_weights.shape[-1] + if local_intermediate < 1: + raise ValueError("Expert intermediate dimension must be positive") + if gate_up_weights.shape != (512, 2 * local_intermediate, x.shape[1]): + raise ValueError("gate_up_weights must have shape [512, 2*I_local, H]") + if down_weights.shape != (512, x.shape[1], local_intermediate): + raise ValueError("down_weights must have shape [512, H, I_local]") + if gate_up_weights.dtype != x.dtype or down_weights.dtype != x.dtype: + raise ValueError("Qwen3-Next expert weights must remain BF16") + routes = stable_top10_routes(shared_router(x, router_weight)) + outputs = _RoutedExperts.apply(x, gate_up_weights, down_weights, routes.indices) + return combine_routes(outputs, routes.weights), routes diff --git a/rl_engine/integrations/qwen3_next_tp.py b/rl_engine/integrations/qwen3_next_tp.py new file mode 100644 index 000000000..884a2d043 --- /dev/null +++ b/rl_engine/integrations/qwen3_next_tp.py @@ -0,0 +1,65 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Differentiable TP4 boundaries and parameter metadata shared by Qwen3-Next blocks. + +The forward copy and reduction follow Megatron's column/row-parallel autograd +pair. Reductions go through ``collective_for_group`` so a strict deployment +can pin the collective algorithm; nothing here selects one implicitly. +""" + +import torch +import torch.distributed as dist + + +def _reduce(value, group): + from rl_engine.distributed.collectives import collective_for_group + + collective = collective_for_group(group, min_size_bytes=value.numel() * value.element_size()) + return collective.all_reduce(value.contiguous()) + + +class _CopyToTP(torch.autograd.Function): + @staticmethod + def forward(ctx, value, group): + ctx.group = group + return value + + @staticmethod + def backward(ctx, gradient): + return _reduce(gradient, ctx.group), None + + +class _ReduceFromTP(torch.autograd.Function): + @staticmethod + def forward(ctx, value, group): + return _reduce(value, group) + + @staticmethod + def backward(ctx, gradient): + return gradient, None + + +def _rank(rank): + if isinstance(rank, bool) or not isinstance(rank, int) or rank not in range(4): + raise ValueError("TP4 rank must be an integer in [0, 4)") + + +def _weight(value, shape, name): + if value.dtype != torch.bfloat16 or value.shape != shape: + raise ValueError(f"{name} must be BF16 {shape}") + + +def _tp_group(group): + if not dist.is_initialized() or dist.get_world_size(group) != 4: + raise ValueError("Qwen3-Next blocks require an initialized four-rank TP group") + return dist.group.WORLD if group is None else group + + +def _parallel_parameter(parameter, dimension, *, stride=1, duplicate=False): + # MCore uses these attributes when computing the global optimizer gradient + # norm. A replicated copy updates normally but must not count twice. + parameter.tensor_model_parallel = True + parameter.partition_dim = dimension + parameter.partition_stride = stride + parameter.shared = duplicate diff --git a/rl_engine/integrations/qwen3_next_tp_blocks.py b/rl_engine/integrations/qwen3_next_tp_blocks.py new file mode 100644 index 000000000..1c80530d4 --- /dev/null +++ b/rl_engine/integrations/qwen3_next_tp_blocks.py @@ -0,0 +1,138 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Official Qwen3-Next TP4 MoE block for shared adapters. + +The block owns the local arithmetic and differentiable TP boundaries. It does +not register an engine backend or advertise full-model acceptance. +""" + +import torch +import torch.distributed as dist +import torch.nn.functional as F +from torch import nn + +from rl_engine.integrations.qwen3_next_forward import shared_linear, shared_moe +from rl_engine.integrations.qwen3_next_tp import ( + _CopyToTP, + _parallel_parameter, + _rank, + _ReduceFromTP, + _tp_group, + _weight, +) +from rl_engine.testing.tensor_identity import tensor_bitwise_equal + + +def moe_hf_shapes(): + result = { + "gate.weight": (512, 2048), + "shared_expert_gate.weight": (1, 2048), + } + for prefix in ("shared_expert", *(f"experts.{expert}" for expert in range(512))): + result[f"{prefix}.gate_proj.weight"] = (512, 2048) + result[f"{prefix}.up_proj.weight"] = (512, 2048) + result[f"{prefix}.down_proj.weight"] = (2048, 512) + return result + + +def shard_moe_weight(name, value, rank): + """Shard one official HF tensor without materializing all expert weights.""" + _rank(rank) + shapes = moe_hf_shapes() + if name not in shapes: + raise ValueError(f"Unknown Qwen3-Next MoE weight: {name}") + _weight(value, shapes[name], name) + if name in ("gate.weight", "shared_expert_gate.weight"): + return value + return value.chunk(4, dim=1 if name.endswith("down_proj.weight") else 0)[rank].contiguous() + + +def assemble_moe_weight(name, values): + if len(values) != 4: + raise ValueError("Exactly four MoE weight shards are required") + shapes = moe_hf_shapes() + if name not in shapes: + raise ValueError(f"Unknown Qwen3-Next MoE weight: {name}") + if name in ("gate.weight", "shared_expert_gate.weight"): + for value in values: + _weight(value, shapes[name], name) + if any(not tensor_bitwise_equal(value, values[0]) for value in values[1:]): + raise ValueError(f"Replicated MoE weight differs across TP: {name}") + return values[0] + axis = 1 if name.endswith("down_proj.weight") else 0 + shape = list(shapes[name]) + shape[axis] //= 4 + for value in values: + _weight(value, tuple(shape), name) + return torch.cat(tuple(values), dim=axis) + + +class TP4MoE(nn.Module): + """All 512 experts at EP1 with intermediate width 128 per TP rank.""" + + def __init__(self, *, group, device): + super().__init__() + self.group = _tp_group(group) + self.rank = dist.get_rank(self.group) + factory = {"device": device, "dtype": torch.bfloat16} + self.gate = nn.Linear(2048, 512, bias=False, **factory) + self.experts = nn.Module() + self.experts.register_parameter( + "gate_up", nn.Parameter(torch.empty(512, 256, 2048, **factory)) + ) + self.experts.register_parameter( + "down", nn.Parameter(torch.empty(512, 2048, 128, **factory)) + ) + self.shared_expert = nn.Module() + self.shared_expert.gate_proj = nn.Linear(2048, 128, bias=False, **factory) + self.shared_expert.up_proj = nn.Linear(2048, 128, bias=False, **factory) + self.shared_expert.down_proj = nn.Linear(128, 2048, bias=False, **factory) + self.shared_expert_gate = nn.Linear(2048, 1, bias=False, **factory) + _parallel_parameter(self.experts.gate_up, 1, stride=2) + _parallel_parameter(self.experts.down, 2) + _parallel_parameter(self.shared_expert.gate_proj.weight, 0) + _parallel_parameter(self.shared_expert.up_proj.weight, 0) + _parallel_parameter(self.shared_expert.down_proj.weight, 1) + + def _hf_tensor(self, name): + if name.startswith("experts."): + _, expert, projection, _ = name.split(".") + expert = int(expert) + if projection == "down_proj": + return self.experts.down[expert] + offset = 0 if projection == "gate_proj" else 128 + return self.experts.gate_up[expert, offset : offset + 128] + obj = self + for part in name.split("."): + obj = getattr(obj, part) + return obj + + def load_hf_weights(self, weights): + if set(weights) != set(moe_hf_shapes()): + raise ValueError("MoE weight names do not match the official HF contract") + with torch.no_grad(): + for name in moe_hf_shapes(): + self._hf_tensor(name).copy_(shard_moe_weight(name, weights[name], self.rank)) + + def export_local_hf_weights(self): + return {name: self._hf_tensor(name).detach() for name in moe_hf_shapes()} + + def forward(self, hidden): + if hidden.ndim != 2 or hidden.shape[1] != 2048 or hidden.dtype != torch.bfloat16: + raise ValueError("MoE hidden must be BF16 [tokens, 2048]") + copied = _CopyToTP.apply(hidden, self.group) + routed, _ = shared_moe( + copied, + _CopyToTP.apply(self.gate.weight, self.group), + self.experts.gate_up, + self.experts.down, + ) + gate = shared_linear(copied, self.shared_expert.gate_proj.weight) + up = shared_linear(copied, self.shared_expert.up_proj.weight) + activated = (F.silu(gate.float()) * up.float()).to(hidden.dtype) + shared = shared_linear(activated, self.shared_expert.down_proj.weight) + shared_gate = shared_linear( + copied, _CopyToTP.apply(self.shared_expert_gate.weight, self.group) + ).sigmoid() + return _ReduceFromTP.apply(routed + shared * shared_gate, self.group) diff --git a/rl_engine/testing/qwen3_next_moe_prior_art.py b/rl_engine/testing/qwen3_next_moe_prior_art.py new file mode 100644 index 000000000..d8ad92234 --- /dev/null +++ b/rl_engine/testing/qwen3_next_moe_prior_art.py @@ -0,0 +1,440 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Prior-art comparison for the Qwen3-Next routed MoE (RFC #428 ``moe_route_combine_contract``). + +Every candidate computes the routed half of ``Qwen3NextSparseMoeBlock`` at the +official TP1 shape (H=2048, 512 experts, top-10, expert width 512): router +logits, top-10 selection with renormalised weights, the selected SwiGLU +experts and the weighted combine. The shared expert is left out because every +candidate evaluates it as the same dense MLP. + +For each candidate the report records + +* **routing batch invariance** - the expert ids and weights of a fixed block + of probe tokens computed alone, and embedded first and last in larger + batches, must be bitwise equal; +* **output batch invariance** - the same for the routed output; +* **dx / dW batch invariance** (candidates with a backward) - the probe rows' + input gradient must not change when unrelated rows join the batch, and the + expert weight gradient must not change when rows whose output gradient is + zero join it (mathematically neither can); +* **repeatability** - two identical calls are bitwise equal; +* **accuracy** - error against an FP64 evaluation of the HF formula with FP64 + routing, plus the fraction of tokens whose selected expert set differs; +* **performance** - median CUDA-event latency, candidates interleaved. + +A candidate that cannot be imported or launched in the pinned environment is +recorded as ``unavailable`` with the reason instead of failing the run. +""" + +from __future__ import annotations + +import os +import statistics +from contextlib import contextmanager +from typing import Any, Callable + +import torch +import torch.nn.functional as F + +HIDDEN = 2048 +EXPERTS = 512 +TOPK = 10 +WIDTH = 512 +PROBE = 8 +BI_SIZES = (16, 64, 256, 1024) +PERF_TOKENS = (1, 8, 64, 256, 1024, 4096) +BACKWARD_TOKENS = (64, 1024) + + +# --------------------------------------------------------------------------- # +# Measurement helpers +# --------------------------------------------------------------------------- # + + +def _sample_us(fn: Callable[[], Any]) -> float: + torch.cuda.synchronize() + start = torch.cuda.Event(enable_timing=True) + end = torch.cuda.Event(enable_timing=True) + start.record() + fn() + end.record() + torch.cuda.synchronize() + return start.elapsed_time(end) * 1000.0 + + +def time_interleaved(calls: dict[str, Callable[[], Any]], warmup: int = 5, iters: int = 30): + """Median latency per candidate; the order alternates so none always runs first.""" + keys = list(calls) + orders = (keys, list(reversed(keys))) + for i in range(warmup): + for key in orders[i % 2]: + calls[key]() + samples = {key: [] for key in keys} + for i in range(iters): + for key in orders[i % 2]: + samples[key].append(_sample_us(calls[key])) + return {key: statistics.median(values) for key, values in samples.items()} + + +def _bitwise(a: torch.Tensor, b: torch.Tensor) -> bool: + return a.shape == b.shape and a.dtype == b.dtype and torch.equal(a, b) + + +def _rel(value: torch.Tensor, reference: torch.Tensor) -> float: + reference = reference.double() + return float((value.double() - reference).norm() / reference.norm().clamp_min(1e-300)) + + +def _guard(key: str, factory: Callable[[], dict[str, Any]]) -> dict[str, Any]: + try: + return {"key": key, **factory()} + except Exception as exc: # noqa: BLE001 - record and continue + return {"key": key, "unavailable": f"{type(exc).__name__}: {str(exc)[:300]}"} + + +@contextmanager +def _env(name: str, value: str | None): + old = os.environ.get(name) + if value is None: + os.environ.pop(name, None) + else: + os.environ[name] = value + try: + yield + finally: + if old is None: + os.environ.pop(name, None) + else: + os.environ[name] = old + + +# --------------------------------------------------------------------------- # +# Inputs and the FP64 reference +# --------------------------------------------------------------------------- # + + +def make_weights(seed: int = 0) -> dict[str, torch.Tensor]: + g = torch.Generator(device="cuda").manual_seed(seed) + + def randn(*shape, scale): + return (torch.randn(shape, device="cuda", generator=g) * scale).to(torch.bfloat16) + + return { + "router": randn(EXPERTS, HIDDEN, scale=0.02), + "gate_up": randn(EXPERTS, 2 * WIDTH, HIDDEN, scale=0.02), + "down": randn(EXPERTS, HIDDEN, WIDTH, scale=0.02), + } + + +def make_tokens(count: int, seed: int) -> torch.Tensor: + g = torch.Generator(device="cuda").manual_seed(seed) + return torch.randn(count, HIDDEN, device="cuda", generator=g).to(torch.bfloat16) + + +def fp64_reference(x: torch.Tensor, w: dict[str, torch.Tensor]): + """HF formula in FP64 with FP64 routing; returns (output, expert ids).""" + x64 = x.double() + probs = (x64 @ w["router"].double().T).softmax(-1) + weights, ids = probs.topk(TOPK, dim=-1) + weights = weights / weights.sum(-1, keepdim=True) + out = torch.zeros_like(x64) + gate_up, down = w["gate_up"], w["down"] + for expert in ids.unique().tolist(): + token, slot = torch.where(ids == expert) + gate, up = (x64[token] @ gate_up[expert].double().T).chunk(2, dim=-1) + y = (F.silu(gate) * up) @ down[expert].double().T + out.index_add_(0, token, y * weights[token, slot, None]) + return out, ids + + +# --------------------------------------------------------------------------- # +# Candidates +# +# ``route(x) -> (ids [T,10], weights [T,10])`` exposes the routing decision; +# ``fwd(x) -> [T, H]`` is the routed output; ``graph(x) -> (y, leaves)`` (when +# the candidate is differentiable) returns the output and [x, gate_up, down]. +# --------------------------------------------------------------------------- # + + +def _rl_kernel(w): + from rl_engine.integrations import qwen3_next_forward as provider + + def route(x): + routes = provider.stable_top10_routes(provider.shared_router(x, w["router"])) + return routes.indices, routes.weights + + def fwd(x): + with torch.no_grad(): + return provider.shared_moe(x, w["router"], w["gate_up"], w["down"])[0] + + gate_up = w["gate_up"].detach().clone().requires_grad_(True) + down = w["down"].detach().clone().requires_grad_(True) + + def graph(x): + leaf = x.detach().clone().requires_grad_(True) + y, _ = provider.shared_moe(leaf, w["router"], gate_up, down) + return y, [leaf, gate_up, down] + + return { + "name": "rl-kernel shared_moe", + "source": "rl_engine.integrations.qwen3_next_forward.shared_moe", + "route": route, + "fwd": fwd, + "graph": graph, + } + + +def _hf_modules(w, device="cuda"): + from transformers import Qwen3NextConfig + from transformers.models.qwen3_next import modeling_qwen3_next as hf + + config = Qwen3NextConfig( + hidden_size=HIDDEN, + num_experts=EXPERTS, + num_experts_per_tok=TOPK, + moe_intermediate_size=WIDTH, + norm_topk_prob=True, + ) + router = hf.Qwen3NextTopKRouter(config).to(device=device, dtype=torch.bfloat16) + experts = hf.Qwen3NextExperts(config).to(device=device, dtype=torch.bfloat16) + with torch.no_grad(): + router.weight.copy_(w["router"]) + experts.gate_up_proj.copy_(w["gate_up"]) + experts.down_proj.copy_(w["down"]) + return router, experts + + +def _hf(w): + import transformers + + router, experts = _hf_modules(w) + + def route(x): + _, weights, ids = router(x) + return ids, weights + + def call(x, mod): + _, weights, ids = router(x) + return mod(x, ids, weights) + + def fwd(x): + with torch.no_grad(): + return call(x, experts) + + def graph(x): + leaf = x.detach().clone().requires_grad_(True) + return call(leaf, experts), [leaf, experts.gate_up_proj, experts.down_proj] + + return { + "name": "HF transformers Qwen3NextExperts (eager)", + "source": f"transformers {transformers.__version__} modeling_qwen3_next", + "route": route, + "fwd": fwd, + "graph": graph, + } + + +def _vllm(w, batch_invariant: bool): + import vllm + from vllm.model_executor.layers.fused_moe.fused_moe import fused_experts + from vllm.model_executor.layers.fused_moe.router.fused_topk_router import fused_topk + + flag = "1" if batch_invariant else "0" + linear = F.linear + if batch_invariant: + from vllm.model_executor.determinism.batch_invariant import linear_batch_invariant + + linear = linear_batch_invariant + + def route(x): + with _env("VLLM_BATCH_INVARIANT", flag): + # vLLM's Qwen3-Next gate is a BF16 ReplicatedLinear; batch-invariant + # mode replaces its aten GEMM with vLLM's persistent Triton matmul. + logits = linear(x, w["router"]) + weights, ids, _ = fused_topk(x, logits, TOPK, renormalize=True) + return ids.long(), weights + + def fwd(x): + with torch.no_grad(), _env("VLLM_BATCH_INVARIANT", flag): + ids, weights = route(x) + return fused_experts(x, w["gate_up"], w["down"], weights, ids.int()) + + return { + "name": f"vLLM fused_topk + fused_experts (Triton), VLLM_BATCH_INVARIANT={flag}", + "source": f"vllm {vllm.__version__} model_executor/layers/fused_moe", + "route": route, + "fwd": fwd, + } + + +def _flashinfer(w): + import flashinfer + from flashinfer.fused_moe import cutlass_fused_moe + + # CUTLASS SwiGLU takes fc1 as [up; gate] (the opposite half order of HF). + gate, up = w["gate_up"].chunk(2, dim=1) + fc1 = torch.cat((up, gate), dim=1).contiguous() + + def route(x): + probs = F.linear(x, w["router"]).float().softmax(-1) + weights, ids = probs.topk(TOPK, dim=-1) + return ids, weights / weights.sum(-1, keepdim=True) + + def fwd(x): + with torch.no_grad(): + ids, weights = route(x) + out = cutlass_fused_moe( + x, ids.int(), weights, fc1, w["down"], torch.bfloat16, quant_scales=[] + ) + return out[0] if isinstance(out, (list, tuple)) else out + + return { + "name": "FlashInfer cutlass_fused_moe (routes from torch.topk)", + "source": f"flashinfer {flashinfer.__version__} fused_moe.cutlass_fused_moe", + "route": route, + "fwd": fwd, + } + + +def candidates(w) -> list[dict[str, Any]]: + return [ + _guard("rl_kernel_cuda", lambda: _rl_kernel(w)), + _guard("hf_transformers", lambda: _hf(w)), + _guard("vllm_bi0", lambda: _vllm(w, False)), + _guard("vllm_bi1", lambda: _vllm(w, True)), + _guard("flashinfer_cutlass", lambda: _flashinfer(w)), + ] + + +# --------------------------------------------------------------------------- # +# Checks +# --------------------------------------------------------------------------- # + + +def _embedded(x: torch.Tensor, size: int): + """Probe rows first in a batch of ``size``, and the same probe rows last.""" + first = x[:size] + last = x[:size].clone() + last[size - PROBE :] = x[:PROBE] + return first, last + + +def _rows_bi(fn, x) -> dict[str, bool]: + alone = fn(x[:PROBE]) + result = {} + for size in BI_SIZES: + first, last = _embedded(x, size) + a, b = fn(first), fn(last) + if isinstance(alone, tuple): + ok = all( + _bitwise(p[:PROBE], q) and _bitwise(r[size - PROBE :], q) + for p, r, q in zip(a, b, alone) + ) + else: + ok = _bitwise(a[:PROBE], alone) and _bitwise(b[size - PROBE :], alone) + result[str(size)] = bool(ok) + return result + + +def _grad_bi(cand, x) -> dict[str, Any]: + """dx of the probe rows, and dW with zero-gradient rows appended.""" + g = torch.Generator(device="cuda").manual_seed(7) + dy = torch.randn(x.shape, device="cuda", generator=g).to(torch.bfloat16) + + def grads(rows, dy_rows): + y, leaves = cand["graph"](rows) + return torch.autograd.grad(y, leaves, dy_rows) + + alone = grads(x[:PROBE], dy[:PROBE]) + dx, dw = {}, {} + for size in BI_SIZES: + full = grads(x[:size], dy[:size]) + dx[str(size)] = bool(_bitwise(full[0][:PROBE], alone[0])) + padded = dy[:size].clone() + padded[PROBE:] = 0 + masked = grads(x[:size], padded) + dw[str(size)] = bool(all(_bitwise(m, a) for m, a in zip(masked[1:], alone[1:]))) + return {"dx_rows_bitwise": dx, "dweight_zero_rows_bitwise": dw} + + +def _accuracy(cand, x, w) -> dict[str, Any]: + ref, ref_ids = fp64_reference(x, w) + ids, _ = cand["route"](x) + same = ids.long().sort(-1).values == ref_ids.sort(-1).values + out = cand["fwd"](x) + return { + "rel_l2_vs_fp64": _rel(out, ref), + "max_abs_vs_fp64": float((out.double() - ref).abs().max()), + "tokens_with_different_expert_set": int((~same.all(-1)).sum()), + "tokens": int(x.shape[0]), + } + + +def _one(cand, x, w) -> dict[str, Any]: + if "unavailable" in cand: + return cand + out = {"key": cand["key"], "name": cand["name"], "source": cand["source"]} + try: + out["route_rows_bitwise"] = _rows_bi(cand["route"], x) + out["output_rows_bitwise"] = _rows_bi(cand["fwd"], x) + out["repeatable"] = bool(_bitwise(cand["fwd"](x[:256]), cand["fwd"](x[:256]))) + if "graph" in cand: + out.update(_grad_bi(cand, x)) + out["accuracy"] = _accuracy(cand, x[:256], w) + except Exception as exc: # noqa: BLE001 - a crash is a result, not a harness failure + out["failed"] = f"{type(exc).__name__}: {str(exc)[:300]}" + out["batch_invariant"] = bool( + "failed" not in out + and all(out["route_rows_bitwise"].values()) + and all(out["output_rows_bitwise"].values()) + and all(out.get("dx_rows_bitwise", {"": True}).values()) + and all(out.get("dweight_zero_rows_bitwise", {"": True}).values()) + ) + return out + + +def _latency(cands, tokens) -> dict[str, Any]: + ready = [c for c in cands if "unavailable" not in c] + forward = {} + for count in tokens: + x = make_tokens(count, seed=100 + count) + calls = {} + for cand in ready: + try: + cand["fwd"](x) + calls[cand["key"]] = lambda c=cand: c["fwd"](x) + except Exception: # noqa: BLE001 - recorded by the BI section + continue + forward[str(count)] = time_interleaved(calls) + backward = {} + for count in BACKWARD_TOKENS: + x = make_tokens(count, seed=200 + count) + dy = torch.randn_like(x) + calls = {} + for cand in ready: + if "graph" not in cand: + continue + + def step(c=cand): + y, leaves = c["graph"](x) + torch.autograd.grad(y, leaves, dy) + + calls[cand["key"]] = step + backward[str(count)] = time_interleaved(calls, warmup=2, iters=10) + return {"forward_us": forward, "forward_plus_backward_us": backward} + + +def moe_report() -> dict[str, Any]: + torch.manual_seed(0) + w = make_weights() + x = make_tokens(max(BI_SIZES), seed=1) + cands = candidates(w) + return { + "op": "qwen3_next_routed_moe", + "shape": {"hidden": HIDDEN, "experts": EXPERTS, "top_k": TOPK, "expert_width": WIDTH}, + "probe_rows": PROBE, + "candidates": [_one(c, x, w) for c in cands], + "latency": _latency(cands, PERF_TOKENS), + } diff --git a/rl_engine/testing/tensor_identity.py b/rl_engine/testing/tensor_identity.py new file mode 100644 index 000000000..5d05c0fe9 --- /dev/null +++ b/rl_engine/testing/tensor_identity.py @@ -0,0 +1,38 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Finite tensor identity in the original storage dtype, including signed zero.""" + +import torch + + +def tensor_bitwise_equal(actual: torch.Tensor, expected: torch.Tensor) -> bool: + """Compare logical values by bytes without widening or accepting NaN/Inf. + + Strides need not match. A cross-device comparison copies expected bytes to + the actual tensor's device; it never converts either tensor's dtype. + """ + if actual.shape != expected.shape or actual.dtype != expected.dtype: + return False + for value in (actual, expected): + if (value.is_floating_point() or value.is_complex()) and not bool( + torch.isfinite(value).all() + ): + return False + actual_bytes = actual.detach().contiguous().reshape(-1).view(torch.uint8) + expected_bytes = expected.detach().contiguous().reshape(-1).view(torch.uint8) + if actual_bytes.device != expected_bytes.device: + expected_bytes = expected_bytes.to(actual_bytes.device) + return bool(torch.equal(actual_bytes, expected_bytes)) + + +def assert_tensor_bitwise_equal( + actual: torch.Tensor, expected: torch.Tensor, *, name: str = "tensor" +) -> None: + """Require finite, same-dtype, same-shape raw-bit identity.""" + if not tensor_bitwise_equal(actual, expected): + raise AssertionError( + f"{name}: finite raw-bit identity failed; " + f"actual={tuple(actual.shape)}/{actual.dtype}, " + f"expected={tuple(expected.shape)}/{expected.dtype}" + ) diff --git a/scripts/plot_qwen3_next_moe_prior_art.py b/scripts/plot_qwen3_next_moe_prior_art.py new file mode 100644 index 000000000..17a966b61 --- /dev/null +++ b/scripts/plot_qwen3_next_moe_prior_art.py @@ -0,0 +1,159 @@ +#!/usr/bin/env python +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Render the routed-MoE prior-art report (``scripts/qwen3_next_moe_prior_art.py``) as a PNG. + +Needs only the report JSON and matplotlib, so it runs anywhere: + + python scripts/plot_qwen3_next_moe_prior_art.py \\ + docs/usage/evidence/qwen3-next-moe-route-b200/report.json + +writes ``figure.png`` next to the report. Three panels: which batch-invariance +checks each implementation passes, accuracy against an FP64 evaluation with +FP64 routing, and forward latency. RL-Kernel is blue, existing libraries orange. +""" + +from __future__ import annotations + +import argparse +import json +from pathlib import Path + +import matplotlib + +matplotlib.use("Agg") +import matplotlib.pyplot as plt # noqa: E402 +from matplotlib.colors import ListedColormap # noqa: E402 + +RL_KERNEL = "#2a78d6" +INK = "#2b2b29" +MUTED = "#6f6e69" +GRID = "#e4e3dd" +SURFACE = "#fcfcfb" +PASS = "#1baf7a" +FAIL = "#d64545" +NA = "#e4e3dd" +EXISTING = ("#eb6834", "#b8501f", "#f29a62", "#8a3a15") + +LABELS = { + "rl_kernel_cuda": "RL-Kernel shared_moe", + "hf_transformers": "HF Qwen3NextExperts", + "vllm_bi0": "vLLM fused_moe (BI=0)", + "vllm_bi1": "vLLM fused_moe (BI=1)", + "flashinfer_cutlass": "FlashInfer cutlass_fused_moe", +} +CHECKS = ( + ("route_rows_bitwise", "routes"), + ("output_rows_bitwise", "output"), + ("dx_rows_bitwise", "dx"), + ("dweight_zero_rows_bitwise", "dW"), +) + + +def _colors(keys): + existing = iter(EXISTING) + return {k: RL_KERNEL if k == "rl_kernel_cuda" else next(existing) for k in keys} + + +def _style(ax): + ax.set_facecolor(SURFACE) + for side in ("top", "right"): + ax.spines[side].set_visible(False) + ax.tick_params(colors=INK, labelsize=8) + ax.grid(color=GRID, linewidth=0.6) + + +def plot(report: dict, out: Path) -> None: + cands = [c for c in report["candidates"] if "unavailable" not in c] + keys = [c["key"] for c in cands] + colors = _colors(keys) + sizes = list(next(iter(cands))["output_rows_bitwise"]) + fig, axes = plt.subplots(1, 3, figsize=(17, 4.6), gridspec_kw={"width_ratios": [1.5, 1, 1.4]}) + fig.patch.set_facecolor("white") + + # Panel 1: batch-invariance matrix; 1 = pass, 0 = fail, 0.5 = no backward. + ax = axes[0] + columns = [f"{label} {size}" for _, label in CHECKS for size in sizes] + grid = [] + for cand in cands: + row = [] + for field, _ in CHECKS: + values = cand.get(field) + row.extend(0.5 if values is None else float(values[s]) for s in sizes) + grid.append(row) + ax.imshow(grid, cmap=ListedColormap([FAIL, NA, PASS]), vmin=0, vmax=1, aspect="auto") + ax.set_xticks(range(len(columns)), columns, fontsize=7, rotation=90) + ax.set_yticks(range(len(cands)), [LABELS.get(k, k) for k in keys], fontsize=8) + for i, cand in enumerate(cands): + mark = "BI" if cand.get("batch_invariant") else "not BI" + ax.text(len(columns) - 0.4, i, f" {mark}", va="center", fontsize=8, color=INK) + ax.set_title( + f"Batch invariance: {report['probe_rows']} probe tokens alone vs. in a batch\n" + "(green bitwise equal, red differs, grey: no backward)", + fontsize=9, + color=INK, + ) + ax.tick_params(length=0) + + # Panel 2: accuracy. + ax = axes[1] + _style(ax) + rel = [c["accuracy"]["rel_l2_vs_fp64"] if "accuracy" in c else float("nan") for c in cands] + ax.barh(range(len(cands)), rel, color=[colors[k] for k in keys]) + for i, cand in enumerate(cands): + acc = cand.get("accuracy") + if acc: + ax.text( + rel[i], + i, + f" {rel[i]:.2e} ({acc['tokens_with_different_expert_set']}/{acc['tokens']}" + " tokens route differently)", + va="center", + fontsize=7, + color=MUTED, + ) + ax.set_yticks(range(len(cands)), [LABELS.get(k, k) for k in keys], fontsize=8) + ax.invert_yaxis() + ax.set_xlim(0, 2.2 * max(r for r in rel if r == r)) + ax.set_xlabel("relative L2 error vs. FP64 HF formula with FP64 routing", fontsize=8) + ax.set_title("Accuracy (256 tokens)", fontsize=9, color=INK) + + # Panel 3: forward latency. + ax = axes[2] + _style(ax) + forward = report["latency"]["forward_us"] + tokens = [int(t) for t in forward] + for key in keys: + ys = [forward[str(t)].get(key, float("nan")) / 1000.0 for t in tokens] + ax.plot(tokens, ys, marker="o", ms=3.5, color=colors[key], label=LABELS.get(key, key)) + ax.set_xscale("log", base=2) + ax.set_yscale("log") + ax.set_xlabel("tokens", fontsize=8) + ax.set_ylabel("forward latency (ms, median)", fontsize=8) + ax.set_title("Forward latency\n(H=2048, 512 experts, top-10, width 512)", fontsize=9) + ax.legend(fontsize=7, frameon=False) + + env = report["environment"] + fig.suptitle( + f"Qwen3-Next routed MoE prior art - {env['gpu']}, torch {env['torch']}, " + f"commit {report['rl_kernel_commit'][:7]}", + fontsize=10, + color=INK, + ) + fig.tight_layout() + fig.savefig(out, dpi=160) + + +def main() -> None: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("report", type=Path) + args = parser.parse_args() + report = json.loads(args.report.read_text()) + out = args.report.with_name("figure.png") + plot(report, out) + print(f"wrote {out}") + + +if __name__ == "__main__": + main() diff --git a/scripts/qwen3_next_moe_prior_art.py b/scripts/qwen3_next_moe_prior_art.py new file mode 100644 index 000000000..398245eee --- /dev/null +++ b/scripts/qwen3_next_moe_prior_art.py @@ -0,0 +1,87 @@ +#!/usr/bin/env python +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Write the Qwen3-Next routed-MoE prior-art report (BI + accuracy + latency) as JSON. + +Run it on a clean tree with ``TRITON_F32_DEFAULT=ieee`` (the FP32 router needs +IEEE Triton dots from process start). The report records the commit, whether +the tracked tree was dirty and the version of every library compared. +``scripts/plot_qwen3_next_moe_prior_art.py`` turns the report into a figure. + + TRITON_F32_DEFAULT=ieee python scripts/qwen3_next_moe_prior_art.py \\ + --out docs/usage/evidence/qwen3-next-moe-route-b200/report.json +""" + +from __future__ import annotations + +import argparse +import importlib.metadata as md +import json +import subprocess +import sys +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT)) + +import torch # noqa: E402 + +from rl_engine.testing.qwen3_next_moe_prior_art import moe_report # noqa: E402 + +LIBRARIES = ( + "vllm", + "flashinfer-python", + "transformers", + "triton", + "sglang", + "megatron-core", + "transformer_engine", + "vime", +) + + +def _git(*args: str) -> str: + return subprocess.run( + ["git", *args], cwd=ROOT, check=True, capture_output=True, text=True + ).stdout.strip() + + +def _version(name: str) -> str | None: + try: + return md.version(name) + except md.PackageNotFoundError: + return None + + +def main() -> None: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--out", type=Path, required=True) + args = parser.parse_args() + if not torch.cuda.is_available(): + raise SystemExit("needs a CUDA device") + torch.backends.cuda.matmul.allow_tf32 = False + torch.backends.cudnn.allow_tf32 = False + report = { + "kind": "qwen3_next_prior_art_report", + "rfc": 428, + "rl_kernel_commit": _git("rev-parse", "HEAD"), + "tracked_tree_dirty": bool(_git("status", "--porcelain", "--untracked-files=no")), + "environment": { + "gpu": torch.cuda.get_device_name(), + "torch": torch.__version__, + "cuda": torch.version.cuda, + "libraries": {name: _version(name) for name in LIBRARIES}, + }, + **moe_report(), + } + args.out.parent.mkdir(parents=True, exist_ok=True) + args.out.write_text(json.dumps(report, indent=2) + "\n") + print( + f"wrote {args.out} (commit {report['rl_kernel_commit'][:7]}, " + f"dirty={report['tracked_tree_dirty']})" + ) + + +if __name__ == "__main__": + main() diff --git a/scripts/qwen3_next_tp_moe_check.py b/scripts/qwen3_next_tp_moe_check.py new file mode 100644 index 000000000..817c07bcc --- /dev/null +++ b/scripts/qwen3_next_tp_moe_check.py @@ -0,0 +1,207 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""TP4 MoE gate on the official checkpoint's layer-0 weights; four GPUs, torchrun. + + TRITON_F32_DEFAULT=ieee torchrun --nproc-per-node 4 scripts/qwen3_next_tp_moe_check.py \\ + --checkpoint --output

+ +Each rank writes ``rank-.json``. The gate requires, bitwise: + +* the HF load -> local shard -> all-gather -> HF export round trip of all 512 experts; +* identical top-10 routes on every rank (the router is replicated); +* full batch == concatenated chunks, and reordered tokens == reordered output, + for 8, 64, 256 and 1024 tokens; +* the training forward (autograd on) == the no-grad forward; +* identical replicated router and shared-expert-gate gradients on every rank, + and a finite, nonzero gradient for every parameter. +""" + +import argparse +import json +import os +import subprocess +from collections.abc import Mapping +from contextlib import ExitStack +from datetime import timedelta +from importlib.metadata import version +from pathlib import Path + +import torch +import torch.distributed as dist +from safetensors import safe_open + +from rl_engine.integrations.qwen3_next_forward import ( + FORWARD_PROVIDER_ID, + shared_router, + stable_top10_routes, +) +from rl_engine.integrations.qwen3_next_tp_blocks import TP4MoE, assemble_moe_weight, moe_hf_shapes +from rl_engine.testing.tensor_identity import assert_tensor_bitwise_equal as exact + +ROOT = Path(__file__).resolve().parents[1] +TOKEN_COUNTS = (8, 64, 256, 1024) + + +class CheckpointWeights(Mapping): + """Keep shard headers open while reading only the requested layer's tensors.""" + + def __init__(self, checkpoint, prefix, names, stack): + self.root, self.prefix, self.names, self.stack = checkpoint, prefix, tuple(names), stack + self.index = json.loads((checkpoint / "model.safetensors.index.json").read_text())[ + "weight_map" + ] + self.readers = {} + + def __iter__(self): + return iter(self.names) + + def __len__(self): + return len(self.names) + + def __getitem__(self, name): + if name not in self.names: + raise KeyError(name) + key = self.prefix + name + shard = self.index[key] + if shard not in self.readers: + self.readers[shard] = self.stack.enter_context( + safe_open(self.root / shard, framework="pt", device="cpu") + ) + return self.readers[shard].get_tensor(key) + + +def atomic_json(path, payload): + temporary = path.with_suffix(path.suffix + ".partial") + temporary.write_text(json.dumps(payload, indent=2) + "\n") + temporary.replace(path) + + +def gather(value): + peers = [torch.empty_like(value) for _ in range(4)] + dist.all_gather(peers, value.contiguous()) + return peers + + +def check_gradients(module): + result = {} + for name, parameter in module.named_parameters(): + grad = parameter.grad + if grad is None or not torch.isfinite(grad).all() or not grad.count_nonzero(): + raise AssertionError(f"Missing finite nonzero gradient: {name}") + result[name] = float(grad.float().abs().max()) + return result + + +def timed(fn): + start, end = torch.cuda.Event(enable_timing=True), torch.cuda.Event(enable_timing=True) + start.record() + out = fn() + end.record() + torch.cuda.synchronize() + return out, start.elapsed_time(end) * 1000.0 + + +def moe_gate(checkpoint, generator): + module = TP4MoE(group=dist.group.WORLD, device="cuda") + with ExitStack() as stack: + weights = CheckpointWeights(checkpoint, "model.layers.0.mlp.", moe_hf_shapes(), stack) + module.load_hf_weights(weights) + for name, value in module.export_local_hf_weights().items(): + restored = assemble_moe_weight(name, [peer.cpu() for peer in gather(value)]) + exact(restored, weights[name], name=f"MoE HF {name}") + cases = ["hf-load-export-all512experts"] + forward_us = {} + with torch.no_grad(): + for length in TOKEN_COUNTS: + hidden = ( + torch.randn(length, 2048, device="cuda", dtype=torch.bfloat16, generator=generator) + * 0.1 + ) + # Every rank draws the same tokens from the same generator; verify it. + for peer in gather(hidden): + exact(peer, hidden, name="replicated input") + routes = stable_top10_routes(shared_router(hidden, module.gate.weight)) + for peer in gather(routes.indices): + exact(peer, routes.indices, name=f"routes across ranks {length}") + module(hidden) + whole, forward_us[str(length)] = timed(lambda: module(hidden)) + cut = min(65, length - 1) + exact( + torch.cat((module(hidden[:cut]), module(hidden[cut:]))), + whole, + name=f"MoE full/chunk {length}", + ) + order = torch.arange(length - 1, -1, -1, device="cuda") + exact(module(hidden[order]), whole[order], name=f"MoE reorder {length}") + cases.extend((f"routes-replicated-{length}", f"full-chunk-reorder-{length}")) + hidden = ( + torch.randn(16, 2048, device="cuda", dtype=torch.bfloat16, generator=generator) * 0.1 + ).requires_grad_() + with torch.no_grad(): + expected = module(hidden) + output = module(hidden) + exact(output, expected, name="MoE independent training forward") + output.float().square().mean().backward() + if ( + hidden.grad is None + or not torch.isfinite(hidden.grad).all() + or not hidden.grad.count_nonzero() + ): + raise AssertionError("MoE input gradient is missing") + gradients = check_gradients(module) + for parameter in (module.gate.weight, module.shared_expert_gate.weight): + for peer in gather(parameter.grad): + exact(peer, parameter.grad, name="MoE replicated router/gate gradient") + cases.extend(("training-forward", "all-parameter-gradient", "replicated-router-gradient")) + return {"cases": cases, "gradient_max_abs": gradients, "forward_us": forward_us} + + +def _git(*args): + return subprocess.run( + ["git", *args], cwd=ROOT, check=True, capture_output=True, text=True + ).stdout.strip() + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--checkpoint", required=True, type=Path) + parser.add_argument("--output", required=True, type=Path) + args = parser.parse_args() + rank = int(os.environ["LOCAL_RANK"]) + if int(os.environ["WORLD_SIZE"]) != 4 or torch.cuda.device_count() < 4: + raise RuntimeError("The TP4 MoE gate requires exactly four ranks on four GPUs") + torch.cuda.set_device(rank) + dist.init_process_group( + "nccl", timeout=timedelta(minutes=15), device_id=torch.device("cuda", rank) + ) + try: + generator = torch.Generator(device="cuda").manual_seed(1234) + moe = moe_gate(args.checkpoint, generator) + args.output.mkdir(parents=True, exist_ok=True) + atomic_json( + args.output / f"rank-{rank}.json", + { + "status": "passed", + "scope": "tp4_moe_block_layer0", + "rank": rank, + "rl_kernel_commit": _git("rev-parse", "HEAD"), + "tracked_tree_dirty": bool(_git("status", "--porcelain", "--untracked-files=no")), + "provider": FORWARD_PROVIDER_ID, + "environment": { + "gpu": torch.cuda.get_device_name(), + "torch": torch.__version__, + "vllm": version("vllm"), + "nccl": ".".join(map(str, torch.cuda.nccl.version())), + }, + "moe": moe, + }, + ) + dist.barrier() + finally: + dist.destroy_process_group() + + +if __name__ == "__main__": + main() diff --git a/tests/check_qwen3_next_forward.py b/tests/check_qwen3_next_forward.py new file mode 100644 index 000000000..ce4beb1f7 --- /dev/null +++ b/tests/check_qwen3_next_forward.py @@ -0,0 +1,238 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Mandatory shared CUDA GEMM and MoE checks; these do not claim model L2.""" + +import pytest +import torch +import torch.nn.functional as F + +from rl_engine.integrations.qwen3_next_forward import ( + combine_routes, + shared_linear, + shared_moe, + stable_top10_routes, +) +from rl_engine.testing.tensor_identity import assert_tensor_bitwise_equal as exact + + +def random(shape, seed=801, *, grad=False, dtype=torch.bfloat16): + assert torch.cuda.is_available(), "Mandatory shared-forward CUDA gates cannot skip" + gen = torch.Generator(device="cuda").manual_seed(seed) + return ( + torch.randn(shape, generator=gen, device="cuda", dtype=dtype) + .mul_(0.02) + .requires_grad_(grad) + ) + + +@pytest.mark.parametrize( + "k,n", [(2048, 3072), (2048, 16), (1024, 2048), (2048, 256), (128, 2048), (2048, 37984)] +) +@torch.no_grad() +def test_qwen_linear_shapes_batch_chunk_and_reorder(k, n): + x, weight = random((17, k)), random((n, k), seed=802) + output = shared_linear(x, weight) + exact( + torch.cat( + [ + shared_linear(x[:1], weight), + shared_linear(x[1:4], weight), + shared_linear(x[4:], weight), + ] + ), + output, + ) + order = torch.arange(16, -1, -1, device="cuda") + exact(shared_linear(x[order], weight), output[order]) + + +def test_shared_linear_vjp_and_empty_tokens(): + x, weight, bias = ( + random((4, 2048), grad=True), + random((16, 2048), 802, grad=True), + random((16,), 803, grad=True), + ) + output = shared_linear(x, weight, bias) + grad = random(output.shape, 804) + output.backward(grad) + refs = [value.detach().double().requires_grad_() for value in (x, weight, bias)] + F.linear(*refs).backward(grad.double()) + for value, ref in zip((x, weight, bias), refs): + torch.testing.assert_close(value.grad.float(), ref.grad.float(), atol=0.002, rtol=0.016) + assert (value.grad.double() - ref.grad).norm() / ref.grad.norm() < 0.016 + with torch.no_grad(): + exact(output, shared_linear(x, weight, bias)) + empty = random((0, 2048), grad=True) + weight.grad = bias.grad = None + shared_linear(empty, weight, bias).sum().backward() + assert empty.grad.shape == empty.shape + assert torch.count_nonzero(weight.grad) == 0 and torch.count_nonzero(bias.grad) == 0 + + +def test_stable_route_tie_boundary_and_router_gradient(): + logits = random((4, 512), dtype=torch.float32) + logits.zero_().requires_grad_() + routes = stable_top10_routes(logits) + assert torch.equal(routes.indices, torch.arange(10, device="cuda").expand(4, 10)) + exact(routes.weights, torch.full((4, 10), 0.1, device="cuda")) + (routes.weights * torch.arange(10, device="cuda")).sum().backward() + assert torch.isfinite(logits.grad).all() and logits.grad.abs().max() > 0 + bad = logits.detach().clone() + bad[0, 0] = torch.nan + with pytest.raises(ValueError, match="finite"): + stable_top10_routes(bad) + + +def test_combine_has_fixed_route_order_and_differentiable_weights(): + outputs = random((4, 10, 2048), grad=True) + weights = random((4, 10), 802, dtype=torch.float32, grad=True) + actual = combine_routes(outputs, weights) + exact( + torch.cat([combine_routes(outputs[i : i + 1], weights[i : i + 1]) for i in range(4)]), + actual, + ) + actual.float().square().sum().backward() + assert weights.grad.abs().max() > 0 and outputs.grad.abs().max() > 0 + refs = [value.detach().double().requires_grad_() for value in (outputs, weights)] + expected = (refs[0] * refs[1].unsqueeze(-1)).sum(dim=1) + expected.backward((2 * actual.float()).double()) + for value, reference in zip((outputs, weights), refs): + torch.testing.assert_close( + value.grad.float(), reference.grad.float(), atol=0.002, rtol=0.016 + ) + + +def test_qwen_moe_actual_tp4_shapes_and_independent_training_forward(): + x = random((4, 2048), grad=True) + router = random((512, 2048), 802, grad=True) + gate_up = random((512, 256, 2048), 803, grad=True) + down = random((512, 2048, 128), 804, grad=True) + output, routes = shared_moe(x, router, gate_up, down) + with torch.no_grad(): + row_output, row_routes = shared_moe(x[:1], router, gate_up, down) + exact(row_output, output[:1]) + exact(row_routes.weights, routes.weights[:1]) + assert torch.equal(row_routes.indices, routes.indices[:1]) + output.float().square().sum().backward() + for value in (x, router, gate_up, down): + assert value.grad is not None and torch.isfinite(value.grad).all() + assert value.grad.abs().max() > 0 + active = routes.indices.unique() + inactive = torch.ones(512, dtype=torch.bool, device="cuda") + inactive[active] = False + assert torch.count_nonzero(gate_up.grad[inactive]) == 0 + assert torch.count_nonzero(down.grad[inactive]) == 0 + + +def test_moe_vjp_matches_independent_double_formula(): + # A small hidden width isolates the derivative; the previous gate covers + # the unmodified official TP4 widths and expert count. + x = random((2, 32)).mul_(10).requires_grad_() + router = random((512, 32), 802).mul_(5).requires_grad_() + gate_up = random((512, 16, 32), 803).mul_(10).requires_grad_() + down = random((512, 32, 8), 804).mul_(10).requires_grad_() + actual, routes = shared_moe(x, router, gate_up, down) + grad = random(actual.shape, 805) + actual.backward(grad) + xr, rr, gu, dr = [v.detach().double().requires_grad_() for v in (x, router, gate_up, down)] + probability = (xr @ rr.t()).softmax(-1) + selected = probability.gather(1, routes.indices) + selected = selected / selected.sum(-1, keepdim=True) + rows = [] + for token in range(2): + slots = [] + for slot, expert in enumerate(routes.indices[token].tolist()): + gate, up = F.linear(xr[token], gu[expert]).chunk(2) + slots.append(F.linear(F.silu(gate) * up, dr[expert]) * selected[token, slot]) + rows.append(torch.stack(slots).sum(0)) + torch.stack(rows).backward(grad.double()) + for value, reference in zip((x, router, gate_up, down), (xr, rr, gu, dr)): + assert torch.isfinite(value.grad).all() + # BF16 intermediates are rounded by the actual provider; this compares + # derivative correctness, never the raw-bit L1/L2 acceptance criterion. + torch.testing.assert_close( + value.grad.float(), reference.grad.float(), atol=0.00002, rtol=0.016 + ) + assert (value.grad.double() - reference.grad).norm() / reference.grad.norm() < 0.016 + + +@torch.no_grad() +def test_route_weights_are_batch_invariant(): + logits = random((32, 512), 805, dtype=torch.float32).mul_(100) + whole = stable_top10_routes(logits) + for count in (1, 8, 17): + part = stable_top10_routes(logits[:count]) + assert torch.equal(part.indices, whole.indices[:count]) + exact(part.weights, whole.weights[:count]) + moe_x, router = random((32, 2048), 806), random((512, 2048), 807) + gate_up, down = random((512, 256, 2048), 808), random((512, 2048, 128), 809) + whole_out, _ = shared_moe(moe_x, router, gate_up, down) + part_out, _ = shared_moe(moe_x[:8], router, gate_up, down) + exact(part_out, whole_out[:8]) + + +class _PerExpertReference(torch.autograd.Function): + """The previous provider: one pinned vLLM GEMM pair per expert, in expert order.""" + + @staticmethod + def forward(ctx, x, gate_up, down, route_indices): + from rl_engine.integrations.qwen3_next_forward import _vllm_linear + + output = x.new_empty((x.shape[0] * 10, x.shape[1])) + flat = route_indices.flatten() + for expert in flat.unique().tolist(): + slots = (flat == expert).nonzero().squeeze(1) + rows = x.index_select(0, slots // 10) + gate, up = _vllm_linear()(rows, gate_up[expert]).chunk(2, dim=-1) + activated = (F.silu(gate.float()) * up.float()).to(x.dtype) + output.index_copy_(0, slots, _vllm_linear()(activated, down[expert])) + return output.reshape(x.shape[0], 10, x.shape[1]) + + +@torch.no_grad() +@pytest.mark.parametrize("width", [128, 512]) +@pytest.mark.parametrize("tokens", [1, 7, 13, 300]) +def test_grouped_experts_are_bitwise_the_per_expert_gemms(width, tokens): + from rl_engine.integrations.qwen3_next_forward import _RoutedExperts, shared_router + + x, router = random((tokens, 2048), 811), random((512, 2048), 812) + gate_up, down = random((512, 2 * width, 2048), 813), random((512, 2048, width), 814) + indices = stable_top10_routes(shared_router(x, router)).indices + exact( + _RoutedExperts.apply(x, gate_up, down, indices), + _PerExpertReference.apply(x, gate_up, down, indices), + ) + + +@torch.no_grad() +@pytest.mark.parametrize("width", [128, 512]) +def test_grouped_projection_is_bitwise_the_per_expert_gemm(width): + # The backward recomputes [gate, up] with the grouped kernel; equality here + # leaves every gradient bitwise what the per-expert backward produced. + from rl_engine.integrations.qwen3_next_forward import ( + _vllm_linear, + grouped_route_linear, + shared_router, + ) + + x, router = random((300, 2048), 817), random((512, 2048), 818) + gate_up = random((512, 2 * width, 2048), 819) + indices = stable_top10_routes(shared_router(x, router)).indices + grouped = grouped_route_linear(x, gate_up, indices).reshape(-1, 2 * width) + flat = indices.flatten() + for expert in flat.unique().tolist(): + slots = (flat == expert).nonzero().squeeze(1) + exact(grouped[slots], _vllm_linear()(x[slots // 10], gate_up[expert]), name=f"e{expert}") + + +def test_grouped_experts_fail_closed_on_the_tensor_descriptor_path(monkeypatch): + from rl_engine.integrations import qwen3_next_forward as provider + + prepare, dispatch, _ = provider._vllm_grouped() + monkeypatch.setattr(provider, "_vllm_grouped", lambda: (prepare, dispatch, lambda: True)) + x = random((4, 2048), 815) + with pytest.raises(RuntimeError, match="VLLM_TRITON_USE_TD"): + provider.grouped_route_linear( + x, random((512, 256, 2048), 816), torch.zeros(4, 10, device="cuda", dtype=torch.long) + ) diff --git a/tests/test_qwen3_next_forward_contract.py b/tests/test_qwen3_next_forward_contract.py new file mode 100644 index 000000000..76d6df183 --- /dev/null +++ b/tests/test_qwen3_next_forward_contract.py @@ -0,0 +1,62 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""CPU checks of the strict shared-forward boundary, without a CPU fallback.""" + +import pytest +import torch + +from rl_engine.integrations import qwen3_next_forward as provider + + +@pytest.mark.parametrize( + "call", + [ + lambda: provider.shared_linear(torch.zeros(1, 8), torch.zeros(8, 8)), + lambda: provider.stable_top10_routes(torch.zeros(1, 512)), + lambda: provider.combine_routes(torch.zeros(1, 10, 8), torch.zeros(1, 10)), + ], +) +def test_required_cuda_primitives_reject_cpu(call): + with pytest.raises(ValueError, match="no CPU fallback"): + call() + + +def test_shared_linear_rejects_an_unpinned_vllm(monkeypatch): + provider._vllm_linear.cache_clear() + monkeypatch.setattr(provider, "version", lambda package: "0.30.1") + with pytest.raises(RuntimeError, match="pinned vLLM 0.30.0"): + provider._vllm_linear() + provider._vllm_linear.cache_clear() + + +def _rows(count, width, seed): + generator = torch.Generator().manual_seed(seed) + return torch.randn((count, width), generator=generator, dtype=torch.float32) * 4 + + +@pytest.mark.parametrize("width", [1, 2, 7, 10, 512]) +def test_fixed_order_row_sum_matches_sequential_double_sum(width): + values = _rows(5, width, 901) + actual = provider.fixed_order_row_sum(values) + assert actual.shape == (5, 1) + reference = values.double().sum(-1, keepdim=True).float() + torch.testing.assert_close(actual, reference, rtol=1e-5, atol=1e-4) + + +@pytest.mark.parametrize("width", [10, 512]) +def test_fixed_order_row_sum_is_independent_of_row_count(width): + values = _rows(32, width, 902) + whole = provider.fixed_order_row_sum(values) + for count in (1, 8, 17): + assert torch.equal(provider.fixed_order_row_sum(values[:count]), whole[:count]) + + +def test_fixed_order_softmax_rows_do_not_depend_on_batch(): + logits = _rows(32, 512, 903) + whole = provider.fixed_order_softmax(logits) + torch.testing.assert_close(whole.double().sum(-1), torch.ones(32, dtype=torch.float64)) + for count in (1, 8): + assert torch.equal(provider.fixed_order_softmax(logits[:count]), whole[:count]) + # The row sum is a fixed sequential chain, so each result is a pure function of + # its own row and cannot depend on how many rows share the call. diff --git a/tests/test_qwen3_next_tp_blocks.py b/tests/test_qwen3_next_tp_blocks.py new file mode 100644 index 000000000..f2ac9c822 --- /dev/null +++ b/tests/test_qwen3_next_tp_blocks.py @@ -0,0 +1,93 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""HF mappings, replica checks and official Qwen3-Next MoE dimensions.""" + +import pytest +import torch + +from rl_engine.integrations import qwen3_next_tp +from rl_engine.integrations import qwen3_next_tp_blocks as blocks +from rl_engine.testing.tensor_identity import assert_tensor_bitwise_equal as exact + + +def pattern(shape): + return ( + torch.arange(torch.Size(shape).numel(), dtype=torch.int32) + .remainder(251) + .to(torch.bfloat16) + .reshape(shape) + ) + + +@pytest.mark.parametrize( + "name", + [ + "gate.weight", + "shared_expert_gate.weight", + "shared_expert.gate_proj.weight", + "shared_expert.up_proj.weight", + "shared_expert.down_proj.weight", + "experts.0.gate_proj.weight", + "experts.0.up_proj.weight", + "experts.511.down_proj.weight", + ], +) +def test_moe_hf_weight_roundtrip(name): + value = pattern(blocks.moe_hf_shapes()[name]) + shards = [blocks.shard_moe_weight(name, value, rank) for rank in range(4)] + exact(blocks.assemble_moe_weight(name, shards), value, name=name) + if name.endswith("down_proj.weight"): + assert shards[0].shape == (2048, 128) + elif name.endswith(("gate_proj.weight", "up_proj.weight")): + assert shards[0].shape == (128, 2048) + + +def test_moe_export_rejects_router_replica_drift(): + values = [pattern((512, 2048)) for _ in range(4)] + values[2][0, 0] = -1 + with pytest.raises(ValueError, match="Replicated MoE"): + blocks.assemble_moe_weight("gate.weight", values) + + +@pytest.mark.parametrize("rank", [-1, 4, True, 0.5]) +def test_invalid_shard_rank_rejected(rank): + with pytest.raises(ValueError, match="TP4 rank"): + blocks.shard_moe_weight("gate.weight", torch.empty(512, 2048, dtype=torch.bfloat16), rank) + + +def test_official_shared_expert_width_is_512_and_each_expert_has_three_weights(): + shapes = blocks.moe_hf_shapes() + assert len(shapes) == 512 * 3 + 5 + assert shapes["shared_expert.gate_proj.weight"] == (512, 2048) + assert shapes["shared_expert.down_proj.weight"] == (2048, 512) + + +def test_tp4_moe_rejects_a_missing_or_wrong_size_tp_group(monkeypatch): + monkeypatch.setattr(qwen3_next_tp.dist, "is_initialized", lambda: False) + with pytest.raises(ValueError, match="four-rank TP group"): + blocks.TP4MoE(group=None, device="meta") + monkeypatch.setattr(qwen3_next_tp.dist, "is_initialized", lambda: True) + monkeypatch.setattr(qwen3_next_tp.dist, "get_world_size", lambda group: 8) + with pytest.raises(ValueError, match="four-rank TP group"): + blocks.TP4MoE(group=None, device="meta") + + +def test_tp4_moe_parameter_ownership(monkeypatch): + group = object() + monkeypatch.setattr(qwen3_next_tp.dist, "is_initialized", lambda: True) + monkeypatch.setattr(qwen3_next_tp.dist, "get_world_size", lambda group: 4) + monkeypatch.setattr(blocks.dist, "get_rank", lambda group: 2) + module = blocks.TP4MoE(group=group, device="meta") + assert module.rank == 2 + assert module.experts.gate_up.shape == (512, 256, 2048) + assert module.experts.down.shape == (512, 2048, 128) + assert ( + module.experts.gate_up.partition_dim == 1 and module.experts.gate_up.partition_stride == 2 + ) + assert module.experts.down.partition_dim == 2 + assert module.shared_expert.down_proj.weight.partition_dim == 1 + # Router and shared-expert gate are replicated: no TP attributes, full shapes. + assert not getattr(module.gate.weight, "tensor_model_parallel", False) + assert not getattr(module.shared_expert_gate.weight, "tensor_model_parallel", False) + assert module.gate.weight.shape == (512, 2048) diff --git a/tests/test_tensor_identity.py b/tests/test_tensor_identity.py new file mode 100644 index 000000000..f85c0c4dd --- /dev/null +++ b/tests/test_tensor_identity.py @@ -0,0 +1,41 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""CPU regressions for the raw-bit identity used by Qwen3-Next acceptance checks.""" + +import pytest +import torch + +from rl_engine.testing.tensor_identity import assert_tensor_bitwise_equal, tensor_bitwise_equal + + +@pytest.mark.parametrize("dtype", [torch.float32, torch.bfloat16, torch.float16]) +def test_signed_zero_is_not_identical(dtype): + positive = torch.tensor([0.0], dtype=dtype) + negative = torch.tensor([-0.0], dtype=dtype) + assert not tensor_bitwise_equal(positive, negative) + with pytest.raises(AssertionError, match="raw-bit"): + assert_tensor_bitwise_equal(positive, negative) + + +@pytest.mark.parametrize("value", [float("nan"), float("inf"), -float("inf")]) +def test_identical_nonfinite_values_are_rejected(value): + tensor = torch.tensor([value]) + assert not tensor_bitwise_equal(tensor, tensor) + + +def test_same_numbers_in_different_dtypes_are_rejected(): + assert not tensor_bitwise_equal(torch.ones(2), torch.ones(2, dtype=torch.bfloat16)) + + +def test_adjacent_bfloat16_values_are_rejected(): + value = torch.ones(2, dtype=torch.bfloat16) + changed = (value.view(torch.int16) + 1).view(torch.bfloat16) + assert not tensor_bitwise_equal(value, changed) + + +@pytest.mark.parametrize( + "value", [torch.tensor(1.0), torch.empty(0), torch.arange(12).reshape(3, 4).T] +) +def test_logical_identity_does_not_require_matching_strides(value): + assert_tensor_bitwise_equal(value, value.contiguous().clone()) From 9e6c4f24ce4b5e8888650e1062922711dbe565e0 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Fri, 9 Oct 2026 01:58:09 +0000 Subject: [PATCH 46/70] feat(qwen3-next): TP4 GDN, convolution and D=256 attention mixers Prep for RFC #428 full_model_chain; serves the gdn_state_bridge row. - GDN: packed recurrent prefill/decode through the pinned vLLM 0.30.0 provider with an explicit state boundary (qwen3_next_gdn.py), the depthwise causal convolution with cache handoff (qwen3_next_conv.py), their combined shared core (qwen3_next_provider.py) and the TP4 block with HF GQA-interleaved weight mapping (qwen3_next_tp_gdn.py), now on the shared TP boundaries in qwen3_next_tp.py. - Attention: the deterministic CUDA attention kernel accepts head dim 256 (ROCm stays 128) and validates backward inputs; shared_attention and TP4FullAttention with the KV head replicated on each rank pair, partial RoPE at absolute positions and explicit per-slot KV state. - Real-weight TP4 gates for GDN (layer 0) and attention (layer 3), sharing scripts/qwen3_next_gate_common.py with the MoE gate. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- .github/workflows/ci.yml | 2 +- .github/workflows/qwen3-next-provider-gpu.yml | 11 +- .../cuda/attention/deterministic_attention.cu | 25 +- rl_engine/integrations/qwen3_next_conv.py | 133 ++++++++++ rl_engine/integrations/qwen3_next_forward.py | 26 ++ rl_engine/integrations/qwen3_next_gdn.py | 193 ++++++++++++++ rl_engine/integrations/qwen3_next_provider.py | 110 ++++++++ .../integrations/qwen3_next_tp_blocks.py | 241 +++++++++++++++++- rl_engine/integrations/qwen3_next_tp_gdn.py | 159 ++++++++++++ .../ops/cuda/attention/deterministic_attn.py | 12 +- scripts/qwen3_next_gate_common.py | 125 +++++++++ scripts/qwen3_next_tp_attention_check.py | 134 ++++++++++ scripts/qwen3_next_tp_gdn_check.py | 96 +++++++ scripts/qwen3_next_tp_moe_check.py | 127 +-------- tests/check_qwen3_next_attention.py | 110 ++++++++ tests/check_qwen3_next_conv_bridge.py | 96 +++++++ tests/check_qwen3_next_core_matrix.py | 97 +++++++ tests/check_qwen3_next_gdn_bridge.py | 112 ++++++++ tests/check_qwen3_next_gdn_sequence.py | 102 ++++++++ tests/check_qwen3_next_shared_core.py | 83 ++++++ tests/test_qwen3_next_forward_contract.py | 1 + tests/test_qwen3_next_tp_blocks.py | 71 +++++- tests/test_qwen3_next_tp_gdn.py | 65 +++++ 23 files changed, 1993 insertions(+), 138 deletions(-) create mode 100644 rl_engine/integrations/qwen3_next_conv.py create mode 100644 rl_engine/integrations/qwen3_next_gdn.py create mode 100644 rl_engine/integrations/qwen3_next_provider.py create mode 100644 rl_engine/integrations/qwen3_next_tp_gdn.py create mode 100644 scripts/qwen3_next_gate_common.py create mode 100644 scripts/qwen3_next_tp_attention_check.py create mode 100644 scripts/qwen3_next_tp_gdn_check.py create mode 100644 tests/check_qwen3_next_attention.py create mode 100644 tests/check_qwen3_next_conv_bridge.py create mode 100644 tests/check_qwen3_next_core_matrix.py create mode 100644 tests/check_qwen3_next_gdn_bridge.py create mode 100644 tests/check_qwen3_next_gdn_sequence.py create mode 100644 tests/check_qwen3_next_shared_core.py create mode 100644 tests/test_qwen3_next_tp_gdn.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2fb92d641..d2cef82de 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -67,7 +67,7 @@ jobs: run: | python -m pytest rl_engine/tests/test_dispatch.py -v PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 python -m pytest tests/test_attention_correctness.py -q -rs - python -m pytest tests/test_forward_invariance.py tests/test_tolerance_contract.py tests/test_ws1_workload.py tests/test_gradient_invariance.py tests/test_elementwise_inventory.py tests/test_four_judgment_matrix.py tests/test_op_checks.py tests/test_operator_inputs.py tests/test_profiler.py tests/test_kv_consistency.py tests/test_ws1_qwen3_dense.py tests/test_ws1_chain_integration.py tests/test_qwen3_next_norm.py tests/test_gdn_state_contract.py tests/test_tensor_identity.py tests/test_qwen3_next_forward_contract.py tests/test_qwen3_next_tp_blocks.py -q + python -m pytest tests/test_forward_invariance.py tests/test_tolerance_contract.py tests/test_ws1_workload.py tests/test_gradient_invariance.py tests/test_elementwise_inventory.py tests/test_four_judgment_matrix.py tests/test_op_checks.py tests/test_operator_inputs.py tests/test_profiler.py tests/test_kv_consistency.py tests/test_ws1_qwen3_dense.py tests/test_ws1_chain_integration.py tests/test_qwen3_next_norm.py tests/test_gdn_state_contract.py tests/test_tensor_identity.py tests/test_qwen3_next_forward_contract.py tests/test_qwen3_next_tp_blocks.py tests/test_qwen3_next_tp_gdn.py -q - name: Run Cross-Configuration Contract Tests (CPU-safe) run: | diff --git a/.github/workflows/qwen3-next-provider-gpu.yml b/.github/workflows/qwen3-next-provider-gpu.yml index 691489402..c045484bd 100644 --- a/.github/workflows/qwen3-next-provider-gpu.yml +++ b/.github/workflows/qwen3-next-provider-gpu.yml @@ -1,7 +1,7 @@ # SPDX-License-Identifier: Apache-2.0 # RFC #428 Qwen3-Next provider comparisons: the C1/C3/C4 norm providers, the C6 -# GDN decode-step goldens and the shared GEMM/MoE route-combine provider, each -# checked against the real vLLM 0.30.0 provider. +# GDN decode-step goldens, the shared GEMM/MoE route-combine provider and the TP4 +# GDN/convolution/attention mixers, each checked against the real vLLM 0.30.0 provider. # # These check_ files import vLLM, so the default pytest collection never runs them # (tests/test_framework_operator_integrations.py asserts vLLM is not imported). This @@ -20,6 +20,7 @@ on: branches: [main] paths: - "rl_engine/kernels/ops/**" + - "csrc/cuda/attention/**" - "rl_engine/integrations/qwen3_next*" - "rl_engine/testing/qwen3_next*" - "tests/check_*qwen3_next*.py" @@ -84,4 +85,8 @@ jobs: env: TRITON_F32_DEFAULT: ieee run: | - python3 -m pytest -q tests/check_qwen3_next_norm_providers.py tests/check_gdn_recurrent_golden.py tests/check_qwen3_next_forward.py + python3 -m pytest -q tests/check_qwen3_next_norm_providers.py tests/check_gdn_recurrent_golden.py \ + tests/check_qwen3_next_forward.py tests/check_qwen3_next_attention.py \ + tests/check_qwen3_next_gdn_bridge.py tests/check_qwen3_next_gdn_sequence.py \ + tests/check_qwen3_next_conv_bridge.py tests/check_qwen3_next_core_matrix.py \ + tests/check_qwen3_next_shared_core.py diff --git a/csrc/cuda/attention/deterministic_attention.cu b/csrc/cuda/attention/deterministic_attention.cu index 82ec824db..aeae9231c 100644 --- a/csrc/cuda/attention/deterministic_attention.cu +++ b/csrc/cuda/attention/deterministic_attention.cu @@ -17,7 +17,6 @@ namespace { -constexpr int64_t kDeterministicAttentionHeadDim = 128; constexpr int kSoftmaxThreads = 256; // --------------------------------------------------------------------------- @@ -220,15 +219,18 @@ void check_deterministic_attention_inputs( const int64_t Hkv = k.size(1); const int64_t Skv = k.size(2); - TORCH_CHECK(D == kDeterministicAttentionHeadDim, - "deterministic_attention: head dim D must be ", - kDeterministicAttentionHeadDim, - ", got ", - D); +#if defined(USE_ROCM) + TORCH_CHECK(D == 128, "deterministic_attention: ROCm head dim D must be 128, got ", D); +#else + TORCH_CHECK(D == 128 || D == 256, + "deterministic_attention: CUDA head dim D must be 128 or 256, got ", D); +#endif TORCH_CHECK(k.size(0) == B && v.size(0) == B, "deterministic_attention: batch size mismatch between q/k/v"); TORCH_CHECK(v.size(1) == Hkv && v.size(2) == Skv && k.size(3) == D && v.size(3) == D, "deterministic_attention: k/v shape mismatch"); + TORCH_CHECK(B > 0 && Hq > 0 && Hkv > 0, + "deterministic_attention: batch size and head counts must be positive"); TORCH_CHECK(Hq % Hkv == 0, "deterministic_attention: Hq (", Hq, @@ -573,6 +575,17 @@ std::vector deterministic_attention_backward( double scale, torch::optional key_padding_mask) { + check_deterministic_attention_inputs(q, k, v, key_padding_mask); + TORCH_CHECK(grad_output.device() == q.device() && grad_output.scalar_type() == q.scalar_type(), + "deterministic_attention_backward: grad_output must match q device and dtype"); + TORCH_CHECK(grad_output.sizes() == q.sizes(), + "deterministic_attention_backward: grad_output must have q shape"); + TORCH_CHECK(P.device() == q.device() && P.scalar_type() == at::kFloat, + "deterministic_attention_backward: P must be FP32 on the input device"); + TORCH_CHECK(P.dim() == 4 && P.size(0) == q.size(0) && P.size(1) == q.size(1) && + P.size(2) == q.size(2) && P.size(3) == k.size(2), + "deterministic_attention_backward: P must have shape [B, Hq, Sq, Skv]"); + const at::cuda::OptionalCUDAGuard device_guard(at::device_of(q)); auto dO = grad_output.contiguous(); diff --git a/rl_engine/integrations/qwen3_next_conv.py b/rl_engine/integrations/qwen3_next_conv.py new file mode 100644 index 000000000..39dd6ad1a --- /dev/null +++ b/rl_engine/integrations/qwen3_next_conv.py @@ -0,0 +1,133 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Differentiable, explicit-state bridge to the pinned vLLM causal-conv provider. + +Forward is the real vLLM update kernel for both prefill chunks and decode. +Backward recomputes the reference recurrence from training inputs. This module +does not install model hooks or advertise backend batch-invariance support. +""" + +from functools import lru_cache +from importlib.metadata import version + +import torch +from torch.autograd.function import once_differentiable + +from rl_engine.kernels.ops.pytorch.linear_attn.causal_conv1d import CausalConv1dUpdateOp +from rl_engine.kernels.ops.pytorch.linear_attn.gated_delta_rule import _validate_state_indices + + +@lru_cache(maxsize=1) +def _provider(): + if version("vllm") != "0.30.0": + raise RuntimeError("Qwen3-Next conv bridge requires the audited vLLM 0.30.0 provider") + from vllm.model_executor.layers.mamba.ops.causal_conv1d import causal_conv1d_update + + return causal_conv1d_update + + +def _lengths(x, state, weight, indices, cu_seqlens): + if x.ndim != 2 or not x.is_cuda or x.dtype != torch.bfloat16 or x.shape[1] == 0: + raise ValueError("x must be CUDA BF16 [tokens, dim] with positive dim") + if weight.shape != (x.shape[1], 4) or weight.dtype != x.dtype or weight.device != x.device: + raise ValueError("weight must be BF16 [dim, 4] on the input device") + if ( + state.ndim != 3 + or state.shape[1:] != (x.shape[1], 3) + or state.device != x.device + or state.dtype != x.dtype + ): + raise ValueError("conv state must be BF16 [blocks, dim, 3] on the input device") + if ( + cu_seqlens.ndim != 1 + or cu_seqlens.device.type != "cpu" + or cu_seqlens.dtype not in (torch.int32, torch.int64) + or cu_seqlens.numel() < 1 + ): + raise ValueError("cu_seqlens must be a nonempty CPU integer vector") + boundaries = cu_seqlens.tolist() + if boundaries[0] != 0 or boundaries[-1] != x.shape[0] or boundaries[-1] >= 2**31: + raise ValueError("cu_seqlens must cover all input tokens and fit int32") + lengths = [end - start for start, end in zip(boundaries, boundaries[1:])] + if any(length < 0 for length in lengths): + raise ValueError("cu_seqlens must be nondecreasing") + _validate_state_indices(indices, len(lengths), state.shape[0], x.device) + if bool((indices <= 0).any().item()): + raise ValueError("sequence cache indices must be positive; zero is reserved") + return lengths + + +class _CausalConvSequence(torch.autograd.Function): + @staticmethod + def forward(ctx, x, state, weight, indices, cu_seqlens): + lengths = _lengths(x, state, weight, indices, cu_seqlens) + ctx.save_for_backward(x, state, weight, indices, cu_seqlens) + new_state = state.contiguous().clone() + output = torch.zeros_like(x) + if x.shape[0]: + # The upstream varlen path subtracts (max_len - sequence_len) from + # its effective cache length, which is for speculative cache layouts. + # A width-1 ordinary cache must instead use the dense sequence path. + # Equal-length groups need neither padding nor a speculative cache. + boundaries = cu_seqlens.tolist() + for length in sorted(set(lengths) - {0}): + active = [i for i, size in enumerate(lengths) if size == length] + packed = torch.stack( + [x[boundaries[seq] : boundaries[seq + 1]].t() for seq in active] + ) + values = _provider()( + packed, + new_state, + weight.contiguous(), + activation="silu", + conv_state_indices=indices[active].to(torch.int32).contiguous(), + out=torch.empty_like(packed), + ) + for row, seq in enumerate(active): + output[boundaries[seq] : boundaries[seq + 1]] = values[row].t() + return output, new_state + + @staticmethod + @once_differentiable + def backward(ctx, grad_output, grad_state): + x, state, weight, indices, cu_seqlens = ctx.saved_tensors + with torch.enable_grad(): + inputs = [tensor.detach().requires_grad_(True) for tensor in (x, state, weight)] + x_ref, state_ref, weight_ref = inputs + pieces = [] + boundaries = cu_seqlens.tolist() + for seq, (start, end) in enumerate(zip(boundaries, boundaries[1:])): + for token in range(start, end): + out, state_ref = CausalConv1dUpdateOp()( + x_ref[token : token + 1], state_ref, weight_ref, indices[seq : seq + 1] + ) + pieces.append(out) + output = torch.cat(pieces) if pieces else x_ref[:0] + grads = torch.autograd.grad( + (output, state_ref), + inputs, + ( + torch.zeros_like(output) if grad_output is None else grad_output, + torch.zeros_like(state_ref) if grad_state is None else grad_state, + ), + allow_unused=True, + ) + return ( + *( + torch.zeros_like(value) if grad is None else grad + for value, grad in zip(inputs, grads) + ), + None, + None, + ) + + +def causal_conv_sequence(x, state, weight, indices, cu_seqlens): + """Return packed output and an independent cache; retain cache gradients. + + Qwen3-Next's width-four, bias-free SiLU convolution is the only contract. + All tensors except CPU ``cu_seqlens`` live on the input CUDA device. The + original cache and inputs are never mutated, including in inference mode. + """ + return _CausalConvSequence.apply(x, state, weight, indices, cu_seqlens) diff --git a/rl_engine/integrations/qwen3_next_forward.py b/rl_engine/integrations/qwen3_next_forward.py index b5a1e20e0..18c892261 100644 --- a/rl_engine/integrations/qwen3_next_forward.py +++ b/rl_engine/integrations/qwen3_next_forward.py @@ -336,3 +336,29 @@ def shared_moe(x, router_weight, gate_up_weights, down_weights): routes = stable_top10_routes(shared_router(x, router_weight)) outputs = _RoutedExperts.apply(x, gate_up_weights, down_weights, routes.indices) return combine_routes(outputs, routes.weights), routes + + +@lru_cache(maxsize=1) +def _attention_op(): + from rl_engine.kernels.ops.cuda.attention.deterministic_attn import DeterministicAttentionOp + + return DeterministicAttentionOp() + + +def shared_attention(q, k, v): + """Qwen TP4 GQA core: BF16 [B,4,Sq,256] over [B,1,Skv,256]. + + Queries must be the final Sq positions of the supplied KV prefix. This + covers full prefill, any contiguous prefill chunk, and one-token decode. + KV tensors can carry the prompt's gradient graph; no state is detached. + """ + _cuda_tensors(q, k, v) + if q.ndim != 4 or k.ndim != 4 or v.ndim != 4: + raise ValueError("Qwen3-Next attention requires four-dimensional Q/K/V") + if q.shape[1] != 4 or k.shape[1] != 1 or q.shape[-1] != 256: + raise ValueError("Qwen3-Next TP4 attention requires Q heads=4, KV heads=1, D=256") + if q.dtype != torch.bfloat16 or k.dtype != q.dtype or v.dtype != q.dtype: + raise ValueError("Qwen3-Next attention inputs must be BF16") + if q.shape[2] > k.shape[2]: + raise ValueError("Query tokens must fit within the supplied KV prefix") + return _attention_op()(q, k, v, causal=True, scale=1 / 16) diff --git a/rl_engine/integrations/qwen3_next_gdn.py b/rl_engine/integrations/qwen3_next_gdn.py new file mode 100644 index 000000000..e7d73c3c4 --- /dev/null +++ b/rl_engine/integrations/qwen3_next_gdn.py @@ -0,0 +1,193 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Experimental training bridge for the pinned vLLM GDN decode provider. + +Forward uses the real packed decode kernel, with a private cache copy. Backward +recomputes the mathematical recurrence from the training inputs and preserves +initial-state gradients. This is a single operator bridge, not a model installer, +prefill/decode equivalence claim, or permission to bypass vLLM's BI guard. +""" + +from functools import lru_cache +from importlib.metadata import version + +import torch +from torch.autograd.function import once_differentiable + +from rl_engine.kernels.ops.pytorch.linear_attn.gated_delta_rule import ( + GatedDeltaRuleRecurrentStepOp, + _validate_state_indices, +) + + +@lru_cache(maxsize=1) +def _provider(): + if version("vllm") != "0.30.0": + raise RuntimeError("Qwen3-Next GDN bridge requires the audited vLLM 0.30.0 provider") + from vllm.third_party.flash_linear_attention.ops import ( + fused_recurrent_gated_delta_rule_packed_decode, + ) + + return fused_recurrent_gated_delta_rule_packed_decode + + +def _validate(qkv, a, b, A_log, dt_bias, state, indices, num_k_heads): + if not qkv.is_cuda or qkv.ndim != 2 or qkv.dtype != torch.bfloat16: + raise ValueError("qkv must be CUDA BF16 [B, D]") + if state.ndim != 4 or state.dtype != torch.float32 or state.shape[-2:] != (128, 128): + raise ValueError("state must be FP32 [blocks, HV, 128, 128]") + if isinstance(num_k_heads, bool) or not isinstance(num_k_heads, int) or num_k_heads <= 0: + raise ValueError("num_k_heads must be a positive integer") + batch, hv = qkv.shape[0], state.shape[1] + if hv <= 0 or hv % num_k_heads or qkv.shape[1] != 2 * num_k_heads * 128 + hv * 128: + raise ValueError("packed qkv width and state heads are inconsistent") + for name, tensor, shape, dtype in ( + ("a", a, (batch, hv), qkv.dtype), + ("b", b, (batch, hv), qkv.dtype), + ("A_log", A_log, (hv,), torch.float32), + ("dt_bias", dt_bias, (hv,), torch.float32), + ): + if tensor.shape != shape or tensor.dtype != dtype or tensor.device != qkv.device: + raise ValueError(f"{name} has an incompatible shape, dtype or device") + if state.device != qkv.device: + raise ValueError("state must share the qkv device") + _validate_state_indices(indices, batch, state.shape[0], qkv.device) + + +class _PackedDecode(torch.autograd.Function): + @staticmethod + def forward(ctx, qkv, a, b, A_log, dt_bias, state, indices, scale, num_k_heads): + _validate(qkv, a, b, A_log, dt_bias, state, indices, num_k_heads) + ctx.save_for_backward(qkv, a, b, A_log, dt_bias, state, indices) + ctx.scale, ctx.num_k_heads = float(scale), num_k_heads + new_state = state.contiguous().clone() + out = torch.zeros(qkv.shape[0], 1, state.shape[1], 128, device=qkv.device, dtype=qkv.dtype) + if qkv.shape[0]: + _provider()( + qkv.contiguous(), + a.contiguous(), + b.contiguous(), + A_log.contiguous(), + dt_bias.contiguous(), + float(scale), + new_state, + out, + indices.contiguous(), + use_qk_l2norm_in_kernel=True, + ) + return out, new_state + + @staticmethod + @once_differentiable + def backward(ctx, grad_out, grad_state): + *saved, indices = ctx.saved_tensors + with torch.enable_grad(): + inputs = [tensor.detach().requires_grad_(True) for tensor in saved] + out, state = GatedDeltaRuleRecurrentStepOp()( + *inputs, + indices, + scale=ctx.scale, + num_k_heads=ctx.num_k_heads, + ) + outputs_and_grads = [ + (value, torch.zeros_like(value) if grad is None else grad) + for value, grad in ((out, grad_out), (state, grad_state)) + if value.requires_grad + ] + grads = torch.autograd.grad( + tuple(value for value, _ in outputs_and_grads), + inputs, + tuple(grad for _, grad in outputs_and_grads), + allow_unused=True, + ) + grads = tuple( + torch.zeros_like(value) if grad is None else grad + for value, grad in zip(inputs, grads) + ) + + return (*grads, None, None, None) + + +def packed_decode_training_step( + qkv, a, b, A_log, dt_bias, state, indices, *, num_k_heads, scale=None +): + """One train-side token; pass returned state onward without detaching it. + + Supports first-order gradients only. FP32 recurrent state and Qwen3-Next + 128-wide heads are mandatory. This function never reads rollout tensors. + """ + return _PackedDecode.apply( + qkv, + a, + b, + A_log, + dt_bias, + state, + indices, + 128**-0.5 if scale is None else float(scale), + num_k_heads, + ) + + +def packed_recurrent_sequence( + qkv, a, b, A_log, dt_bias, state, indices, cu_seqlens, *, num_k_heads, scale=None +): + """Apply the decode provider to packed, variable-length sequences. + + ``cu_seqlens`` is CPU int32/int64 metadata delimiting contiguous sequences + in ``qkv[T, D]``. ``indices[B]`` maps each sequence to a distinct positive + cache slot; slot zero remains reserved by the decode provider. Returning + the entire FP32 state bank makes chunk continuation and sequence reordering + explicit. Callers must pass that state onward without detaching it for + training. No rollout cache is read and no batch-invariance capability is + registered. This intentionally slow recurrence is an integration reference, + not equivalence evidence for the upstream chunk-prefill kernel. + """ + if ( + not isinstance(cu_seqlens, torch.Tensor) + or cu_seqlens.device.type != "cpu" + or cu_seqlens.dtype not in (torch.int32, torch.int64) + or cu_seqlens.ndim != 1 + or cu_seqlens.numel() < 1 + ): + raise ValueError("cu_seqlens must be a nonempty CPU int32/int64 vector") + boundaries = cu_seqlens.tolist() + if qkv.ndim != 2 or boundaries[0] != 0 or boundaries[-1] != qkv.shape[0]: + raise ValueError("cu_seqlens must span all packed qkv tokens, starting at zero") + lengths = [end - start for start, end in zip(boundaries, boundaries[1:])] + if any(length < 0 for length in lengths): + raise ValueError("cu_seqlens must be nondecreasing") + if a.ndim != 2 or b.ndim != 2 or a.shape[0] != qkv.shape[0] or b.shape[0] != qkv.shape[0]: + raise ValueError("a and b must have one row per packed token") + _validate(qkv[:0], a[:0], b[:0], A_log, dt_bias, state, indices[:0], num_k_heads) + _validate_state_indices(indices, len(lengths), state.shape[0], qkv.device) + if bool((indices <= 0).any().item()): + raise ValueError("sequence cache indices must be positive; zero is reserved") + outputs, positions = [], [] + for position in range(max(lengths, default=0)): + active = [seq for seq, length in enumerate(lengths) if position < length] + rows = [boundaries[seq] + position for seq in active] + row_ids = torch.tensor(rows, device=qkv.device, dtype=torch.int64) + seq_ids = torch.tensor(active, device=qkv.device, dtype=torch.int64) + out, state = packed_decode_training_step( + qkv.index_select(0, row_ids), + a.index_select(0, row_ids), + b.index_select(0, row_ids), + A_log, + dt_bias, + state, + indices.index_select(0, seq_ids), + num_k_heads=num_k_heads, + scale=scale, + ) + outputs.append(out[:, 0]) + positions.extend(rows) + if not outputs: + return qkv.new_empty((0, state.shape[1], 128)), state + # Restore packed sequence order after the time-major recurrent traversal. + inverse = [0] * len(positions) + for source, destination in enumerate(positions): + inverse[destination] = source + order = torch.tensor(inverse, device=qkv.device, dtype=torch.int64) + return torch.cat(outputs).index_select(0, order), state diff --git a/rl_engine/integrations/qwen3_next_provider.py b/rl_engine/integrations/qwen3_next_provider.py new file mode 100644 index 000000000..ea568a020 --- /dev/null +++ b/rl_engine/integrations/qwen3_next_provider.py @@ -0,0 +1,110 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Shared Qwen3-Next GDN core with explicit provider and state identities. + +This is the convolution/recurrence/gated-norm boundary, after the projections +and before the output projection. It is not a full attention or model adapter. +The same call can be made under inference_mode or with training autograd. +""" + +from dataclasses import asdict, dataclass + +import torch + +from rl_engine.integrations.qwen3_next_conv import causal_conv_sequence +from rl_engine.integrations.qwen3_next_gdn import packed_recurrent_sequence + + +@dataclass(frozen=True) +class GDNProviderConfig: + """The only implemented profile; other providers cannot silently substitute.""" + + version: str = "qwen3-next-gdn-core-v1" + convolution: str = "vllm-0.30.0-causal-conv-update-equal-length-groups" + recurrence: str = "vllm-0.30.0-packed-recurrent-decode" + gated_norm: str = "rl-engine-cuda-rmsnorm-gated" + recurrent_dtype: str = "float32" + activation_dtype: str = "bfloat16" + head_dim: int = 128 + + def validate(self): + if self != GDNProviderConfig(): + raise ValueError("Unsupported GDN provider configuration") + + def identity(self): + self.validate() + return asdict(self) + + +@dataclass(frozen=True) +class GDNState: + convolution: torch.Tensor + recurrent: torch.Tensor + + +def shared_gdn_core( + qkv, + a, + b, + z, + A_log, + dt_bias, + conv_weight, + norm_weight, + state, + indices, + cu_seqlens, + *, + config, + num_k_heads, + eps=1e-6, +): + """Independently recompute packed training inputs or execute rollout inputs. + + qkv is laid out as contiguous Q, K, V groups. z is [tokens, value_heads, 128]. + Both callers must explicitly supply the same GDNProviderConfig. State is + returned without detachment so a response loss can differentiate through + the prompt. No global vLLM batch-invariance capability is changed. + """ + if not isinstance(config, GDNProviderConfig): + raise ValueError("An explicit GDNProviderConfig is required") + config.validate() + if not isinstance(state, GDNState): + raise ValueError("An explicit convolution and recurrent GDNState is required") + if state.recurrent.ndim != 4: + raise ValueError("Recurrent state must have four dimensions") + if ( + z.shape != (qkv.shape[0], state.recurrent.shape[1], 128) + or z.dtype != torch.bfloat16 + or z.device != qkv.device + ): + raise ValueError("z must be BF16 [tokens, value_heads, 128] on the input device") + if ( + norm_weight.shape != (128,) + or norm_weight.dtype != torch.bfloat16 + or norm_weight.device != qkv.device + ): + raise ValueError("Gated norm weight must be BF16 [128] on the input device") + from rl_engine.kernels.ops.cuda.norm.rmsnorm import Qwen3NextRMSNormGatedCudaOp + + norm = Qwen3NextRMSNormGatedCudaOp() + + convolved, conv_state = causal_conv_sequence( + qkv, state.convolution, conv_weight, indices, cu_seqlens + ) + recurrent, recurrent_state = packed_recurrent_sequence( + convolved, + a, + b, + A_log, + dt_bias, + state.recurrent, + indices, + cu_seqlens, + num_k_heads=num_k_heads, + ) + normed = norm(recurrent.reshape(-1, 128), norm_weight, z.reshape(-1, 128), eps=eps).reshape_as( + z + ) + return normed, GDNState(conv_state, recurrent_state) diff --git a/rl_engine/integrations/qwen3_next_tp_blocks.py b/rl_engine/integrations/qwen3_next_tp_blocks.py index 1c80530d4..7a45c1ad2 100644 --- a/rl_engine/integrations/qwen3_next_tp_blocks.py +++ b/rl_engine/integrations/qwen3_next_tp_blocks.py @@ -1,18 +1,22 @@ # SPDX-License-Identifier: Apache-2.0 # Copyright (c) 2026 RL-Kernel Contributors -"""Official Qwen3-Next TP4 MoE block for shared adapters. +"""Official Qwen3-Next TP4 full-attention and MoE blocks for shared adapters. -The block owns the local arithmetic and differentiable TP boundaries. It does -not register an engine backend or advertise full-model acceptance. +These blocks own the local arithmetic and differentiable TP boundaries. They +do not register an engine backend or advertise full-model acceptance. """ +from collections.abc import Mapping, Sequence +from dataclasses import dataclass +from functools import lru_cache + import torch import torch.distributed as dist import torch.nn.functional as F from torch import nn -from rl_engine.integrations.qwen3_next_forward import shared_linear, shared_moe +from rl_engine.integrations.qwen3_next_forward import shared_attention, shared_linear, shared_moe from rl_engine.integrations.qwen3_next_tp import ( _CopyToTP, _parallel_parameter, @@ -23,6 +27,235 @@ ) from rl_engine.testing.tensor_identity import tensor_bitwise_equal +ATTENTION_HF_SHAPES = { + "q_proj.weight": (8192, 2048), + "k_proj.weight": (512, 2048), + "v_proj.weight": (512, 2048), + "o_proj.weight": (2048, 4096), + "q_norm.weight": (256,), + "k_norm.weight": (256,), +} + + +def shard_attention_weights(weights: Mapping[str, torch.Tensor], rank: int): + """Preserve Q/gate interleaving and replicate each KV head on a rank pair.""" + _rank(rank) + if set(weights) != set(ATTENTION_HF_SHAPES): + raise ValueError("Attention weight names do not match the official HF contract") + result = {} + for name, shape in ATTENTION_HF_SHAPES.items(): + value = weights[name] + _weight(value, shape, name) + if name.startswith(("q_norm.", "k_norm.")): + part = value + elif name in ("k_proj.weight", "v_proj.weight"): + part = value.chunk(2, dim=0)[rank // 2] + else: + part = value.chunk(4, dim=1 if name == "o_proj.weight" else 0)[rank] + result[name] = part.contiguous() + return result + + +def assemble_attention_weights(shards: Sequence[Mapping[str, torch.Tensor]]): + """Invert four local HF mappings and reject divergent replicated storage.""" + if len(shards) != 4 or any(set(shard) != set(ATTENTION_HF_SHAPES) for shard in shards): + raise ValueError("Exactly four complete attention HF shards are required") + result = {} + for name, shape in ATTENTION_HF_SHAPES.items(): + values = [shard[name] for shard in shards] + if name.startswith(("q_norm.", "k_norm.")): + for value in values: + _weight(value, shape, name) + if any(not tensor_bitwise_equal(value, values[0]) for value in values[1:]): + raise ValueError(f"Replicated attention norm differs: {name}") + result[name] = values[0] + elif name in ("k_proj.weight", "v_proj.weight"): + for value in values: + _weight(value, (256, 2048), name) + if not tensor_bitwise_equal(values[0], values[1]) or not tensor_bitwise_equal( + values[2], values[3] + ): + raise ValueError(f"Replicated KV head differs within its rank pair: {name}") + result[name] = torch.cat((values[0], values[2]), dim=0) + else: + axis = 1 if name == "o_proj.weight" else 0 + local_shape = list(shape) + local_shape[axis] //= 4 + for value in values: + _weight(value, tuple(local_shape), name) + result[name] = torch.cat(values, dim=axis) + return result + + +@lru_cache(maxsize=4) +def _kv_replica_groups(group): + ranks = dist.get_process_group_ranks(group) + # Every TP rank creates both groups in the same order. Only members use a + # group's collective, and the rank pairs follow the official KV layout. + return tuple( + dist.new_group(ranks[start : start + 2], use_local_synchronization=True) for start in (0, 2) + ) + + +def _norm_module(device): + module = nn.Module() + module.register_parameter( + "weight", nn.Parameter(torch.zeros(256, device=device, dtype=torch.bfloat16)) + ) + return module + + +@dataclass(frozen=True) +class KVState: + """Per-slot [1,1,length,256] KV tensors; length is the next absolute position.""" + + keys: tuple[torch.Tensor, ...] + values: tuple[torch.Tensor, ...] + + +def _packed_sequences(hidden, state, indices, cu_seqlens): + if ( + hidden.ndim != 2 + or hidden.shape[1] != 2048 + or hidden.dtype != torch.bfloat16 + or not hidden.is_cuda + ): + raise ValueError("Attention hidden must be CUDA BF16 [tokens, 2048]") + if hidden.shape[0] < 1: + raise ValueError("Attention requires at least one active token") + if ( + not isinstance(state, KVState) + or len(state.keys) < 2 + or len(state.keys) != len(state.values) + ): + raise ValueError("KVState requires a reserved slot and matching key/value slots") + if ( + indices.ndim != 1 + or indices.dtype not in (torch.int32, torch.int64) + or indices.device != hidden.device + ): + raise ValueError("State indices must be an integer vector on the input device") + if ( + cu_seqlens.device.type != "cpu" + or cu_seqlens.ndim != 1 + or cu_seqlens.dtype not in (torch.int32, torch.int64) + ): + raise ValueError("cu_seqlens must be a CPU integer vector") + slots, ends = indices.tolist(), cu_seqlens.tolist() + if len(ends) != len(slots) + 1 or ends[0] != 0 or ends[-1] != hidden.shape[0]: + raise ValueError("cu_seqlens must describe all packed tokens") + if any(left > right for left, right in zip(ends, ends[1:])): + raise ValueError("cu_seqlens must be nondecreasing") + if len(set(slots)) != len(slots) or any(slot <= 0 or slot >= len(state.keys) for slot in slots): + raise ValueError("Active state slots must be unique and exclude reserved slot zero") + for key, value in zip(state.keys, state.values): + if ( + key.ndim != 4 + or key.shape[:2] != (1, 1) + or key.shape[-1] != 256 + or key.shape != value.shape + ): + raise ValueError("KV slots must have matching [1,1,length,256] tensors") + if ( + key.dtype != hidden.dtype + or value.dtype != hidden.dtype + or key.device != hidden.device + or value.device != hidden.device + ): + raise ValueError("KV slots must have the input device and BF16 dtype") + return slots, ends + + +class TP4FullAttention(nn.Module): + """Four local query heads and one pair-replicated KV head, with explicit state.""" + + def __init__(self, *, group, device, eps=1e-6, rope_theta=10000000): + super().__init__() + self.group = _tp_group(group) + self.rank = dist.get_rank(self.group) + self.kv_group = _kv_replica_groups(self.group)[self.rank // 2] + if eps != 1e-6 or rope_theta != 10000000: + raise ValueError("Full attention requires official epsilon and RoPE theta") + self.eps = eps + factory = {"device": device, "dtype": torch.bfloat16} + self.q_proj = nn.Linear(2048, 2048, bias=False, **factory) + self.k_proj = nn.Linear(2048, 256, bias=False, **factory) + self.v_proj = nn.Linear(2048, 256, bias=False, **factory) + self.o_proj = nn.Linear(1024, 2048, bias=False, **factory) + self.q_norm, self.k_norm = _norm_module(device), _norm_module(device) + _parallel_parameter(self.q_proj.weight, 0) + _parallel_parameter(self.o_proj.weight, 1) + _parallel_parameter(self.k_proj.weight, 0, duplicate=self.rank % 2 == 1) + _parallel_parameter(self.v_proj.weight, 0, duplicate=self.rank % 2 == 1) + # Kept as a Python float, not a buffer: Megatron's Float16Module casts every + # floating-point buffer of the actor to BF16, and BF16-rounded inverse + # frequencies rotate keys differently from the rollout engine's FP32 ones. + self.rope_theta = float(rope_theta) + + def load_hf_weights(self, weights): + self.load_state_dict(shard_attention_weights(weights, self.rank), strict=True) + + def export_local_hf_weights(self): + return self.state_dict() + + def initial_state(self, blocks): + if isinstance(blocks, bool) or not isinstance(blocks, int) or blocks < 2: + raise ValueError("KV state requires a reserved slot and an active slot") + return KVState( + tuple(self.q_proj.weight.new_empty((1, 1, 0, 256)) for _ in range(blocks)), + tuple(self.q_proj.weight.new_empty((1, 1, 0, 256)) for _ in range(blocks)), + ) + + @staticmethod + def inverse_frequencies(rope_theta, device): + """FP32 inverse frequencies of the 64-wide rotary quarter, computed on demand.""" + exponents = torch.arange(0, 64, 2, dtype=torch.float32, device=device) / 64 + return 1.0 / (float(rope_theta) ** exponents) + + def _rotate(self, value, positions): + inv_freq = TP4FullAttention.inverse_frequencies(self.rope_theta, value.device) + angles = positions.float()[:, None] * inv_freq[None, :] + angles = torch.cat((angles, angles), dim=-1) + cos, sin = angles.cos().to(value.dtype)[:, None], angles.sin().to(value.dtype)[:, None] + rotary, tail = value[..., :64], value[..., 64:] + rotated = torch.cat((-rotary[..., 32:], rotary[..., :32]), dim=-1) + return torch.cat((rotary * cos + rotated * sin, tail), dim=-1) + + def forward(self, hidden, state, indices, cu_seqlens): + from rl_engine.kernels.ops.cuda.norm.rmsnorm import Qwen3NextRMSNormCudaOp + + slots, ends = _packed_sequences(hidden, state, indices, cu_seqlens) + copied = _CopyToTP.apply(hidden, self.group) + query, gate = shared_linear(copied, self.q_proj.weight).reshape(-1, 4, 512).chunk(2, dim=-1) + key = shared_linear(copied, _CopyToTP.apply(self.k_proj.weight, self.kv_group)).reshape( + -1, 1, 256 + ) + value = shared_linear(copied, _CopyToTP.apply(self.v_proj.weight, self.kv_group)).reshape( + -1, 1, 256 + ) + norm = Qwen3NextRMSNormCudaOp() + query = norm(query, _CopyToTP.apply(self.q_norm.weight, self.group), eps=self.eps) + key = norm(key, _CopyToTP.apply(self.k_norm.weight, self.group), eps=self.eps) + next_keys, next_values = list(state.keys), list(state.values) + outputs = [] + for slot, begin, end in zip(slots, ends[:-1], ends[1:]): + if begin == end: + continue + offset = state.keys[slot].shape[2] + if offset + end - begin > 262144: + raise ValueError("KV continuation exceeds the official maximum position") + positions = torch.arange(offset, offset + end - begin, device=hidden.device) + q = self._rotate(query[begin:end], positions).transpose(0, 1).unsqueeze(0) + k = self._rotate(key[begin:end], positions).transpose(0, 1).unsqueeze(0) + v = value[begin:end].transpose(0, 1).unsqueeze(0) + next_keys[slot] = torch.cat((state.keys[slot], k), dim=2) + next_values[slot] = torch.cat((state.values[slot], v), dim=2) + out = shared_attention(q, next_keys[slot], next_values[slot]) + outputs.append(out.squeeze(0).transpose(0, 1)) + attended = torch.cat(outputs, dim=0) * gate.sigmoid() + local = shared_linear(attended.reshape(-1, 1024), self.o_proj.weight) + return _ReduceFromTP.apply(local, self.group), KVState(tuple(next_keys), tuple(next_values)) + def moe_hf_shapes(): result = { diff --git a/rl_engine/integrations/qwen3_next_tp_gdn.py b/rl_engine/integrations/qwen3_next_tp_gdn.py new file mode 100644 index 000000000..a5b883d2b --- /dev/null +++ b/rl_engine/integrations/qwen3_next_tp_gdn.py @@ -0,0 +1,159 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""TP4 Qwen3-Next GDN projections, HF weight mapping and explicit recurrent state. + +The module is shared by engine adapters. It does not install a vLLM backend or +claim model-level acceptance. The process group must contain exactly four ranks. +""" + +from collections.abc import Mapping, Sequence + +import torch +import torch.distributed as dist +from torch import nn + +from rl_engine.integrations.qwen3_next_provider import GDNProviderConfig, GDNState, shared_gdn_core +from rl_engine.integrations.qwen3_next_tp import _CopyToTP, _rank, _ReduceFromTP +from rl_engine.testing.tensor_identity import tensor_bitwise_equal + +_GLOBAL_SHAPES = { + "in_proj_qkvz.weight": (12288, 2048), + "in_proj_ba.weight": (64, 2048), + "conv1d.weight": (8192, 1, 4), + "A_log": (32,), + "dt_bias": (32,), + "norm.weight": (128,), + "out_proj.weight": (2048, 4096), +} +_LOCAL_SHAPES = { + "in_proj_qkvz.weight": (3072, 2048), + "in_proj_ba.weight": (16, 2048), + "conv1d.weight": (2048, 1, 4), + "A_log": (8,), + "dt_bias": (8,), + "norm.weight": (128,), + "out_proj.weight": (2048, 1024), +} + + +def _validate_weights(weights, shapes): + if set(weights) != set(shapes): + raise ValueError("GDN weight names do not match the explicit HF contract") + device = weights["A_log"].device + for name, shape in shapes.items(): + value = weights[name] + if value.shape != shape or value.dtype != torch.bfloat16 or value.device != device: + raise ValueError(f"{name} must be BF16 {shape} on {device}") + + +def shard_gdn_weights(weights: Mapping[str, torch.Tensor], rank: int) -> dict[str, torch.Tensor]: + """Shard official HF GQA-interleaved projections and Q/K/V-segmented conv.""" + _rank(rank) + _validate_weights(weights, _GLOBAL_SHAPES) + result = {} + for name, value in weights.items(): + if name == "norm.weight": + shard = value + elif name == "out_proj.weight": + shard = value[:, rank * 1024 : (rank + 1) * 1024] + elif name == "conv1d.weight": + q, k, v = value.split((2048, 2048, 4096), dim=0) + shard = torch.cat([part.chunk(4, dim=0)[rank] for part in (q, k, v)]) + else: + shard = value.chunk(4, dim=0)[rank] + result[name] = shard.contiguous() + return result + + +def assemble_gdn_weights(shards: Sequence[Mapping[str, torch.Tensor]]) -> dict[str, torch.Tensor]: + """Inverse mapping; reject divergent replicated norm weights.""" + if len(shards) != 4: + raise ValueError("Exactly four ordered TP shards are required") + for shard in shards: + _validate_weights(shard, _LOCAL_SHAPES) + result = {} + for name in _GLOBAL_SHAPES: + values = [shard[name] for shard in shards] + if name == "norm.weight": + if any(not tensor_bitwise_equal(value, values[0]) for value in values[1:]): + raise ValueError("Replicated GDN norm weights differ across TP ranks") + result[name] = values[0] + elif name == "conv1d.weight": + segments = [value.split((512, 512, 1024), dim=0) for value in values] + result[name] = torch.cat( + [segments[rank][part] for part in range(3) for rank in range(4)] + ) + else: + result[name] = torch.cat(values, dim=1 if name == "out_proj.weight" else 0) + return result + + +class TP4GDN(nn.Module): + """Complete GDN projection/core/output block with differentiable TP semantics.""" + + def __init__(self, *, group, device, config: GDNProviderConfig, eps: float = 1e-6): + super().__init__() + if not dist.is_initialized() or dist.get_world_size(group) != 4: + raise ValueError("TP4GDN requires an initialized four-rank process group") + config.validate() + self.group = dist.group.WORLD if group is None else group + self.provider_config, self.eps = config, eps + self.rank = dist.get_rank(group) + factory = {"device": device, "dtype": torch.bfloat16} + self.in_proj_qkvz = nn.Linear(2048, 3072, bias=False, **factory) + self.in_proj_ba = nn.Linear(2048, 16, bias=False, **factory) + self.conv1d = nn.Conv1d(2048, 2048, 4, groups=2048, bias=False, **factory) + self.A_log = nn.Parameter(torch.zeros(8, **factory)) + self.dt_bias = nn.Parameter(torch.zeros(8, **factory)) + self.norm = nn.Module() + self.norm.register_parameter("weight", nn.Parameter(torch.ones(128, **factory))) + self.out_proj = nn.Linear(1024, 2048, bias=False, **factory) + + def load_hf_weights(self, weights: Mapping[str, torch.Tensor]): + self.load_state_dict(shard_gdn_weights(weights, self.rank), strict=True) + + def initial_state(self, blocks: int) -> GDNState: + if blocks < 2: + raise ValueError("State must include a reserved slot and at least one active slot") + return GDNState( + self.A_log.new_zeros((blocks, 2048, 3)), + torch.zeros(blocks, 8, 128, 128, dtype=torch.float32, device=self.A_log.device), + ) + + def forward(self, hidden, state, indices, cu_seqlens): + from rl_engine.integrations.qwen3_next_forward import shared_linear + + if hidden.ndim != 2 or hidden.shape[1] != 2048 or hidden.dtype != torch.bfloat16: + raise ValueError("GDN hidden states must be BF16 [tokens, 2048]") + copied = _CopyToTP.apply(hidden, self.group) + qkvz = shared_linear(copied, self.in_proj_qkvz.weight).reshape(-1, 4, 768) + ba = shared_linear(copied, self.in_proj_ba.weight).reshape(-1, 4, 4) + q, k, v, z = qkvz.split((128, 128, 256, 256), dim=-1) + b, a = ba.split(2, dim=-1) + tokens = hidden.shape[0] + packed = torch.cat( + [value.reshape(tokens, width) for value, width in ((q, 512), (k, 512), (v, 1024))], + dim=-1, + ) + # The norm weight is shared by heads on all four ranks; its gradient + # sums contributions from all local head partitions exactly once. + norm_weight = _CopyToTP.apply(self.norm.weight, self.group) + output, next_state = shared_gdn_core( + packed, + a.reshape(tokens, 8), + b.reshape(tokens, 8), + z.reshape(tokens, 8, 128), + self.A_log.float(), + self.dt_bias.float(), + self.conv1d.weight[:, 0], + norm_weight, + state, + indices, + cu_seqlens, + config=self.provider_config, + num_k_heads=4, + eps=self.eps, + ) + local = shared_linear(output.reshape(tokens, 1024), self.out_proj.weight) + return _ReduceFromTP.apply(local, self.group), next_state diff --git a/rl_engine/kernels/ops/cuda/attention/deterministic_attn.py b/rl_engine/kernels/ops/cuda/attention/deterministic_attn.py index 3a9084b18..5b5e636a4 100644 --- a/rl_engine/kernels/ops/cuda/attention/deterministic_attn.py +++ b/rl_engine/kernels/ops/cuda/attention/deterministic_attn.py @@ -27,8 +27,8 @@ from rl_engine.kernels.ops.base import _C, _EXT_AVAILABLE from rl_engine.utils.logger import logger -_HEAD_DIM = 128 _IS_ROCM = torch.version.hip is not None +_HEAD_DIMS = (128,) if _IS_ROCM else (128, 256) _GPU_PLATFORM = "ROCm" if _IS_ROCM else "CUDA" @@ -201,8 +201,10 @@ def _validate_inputs( f"k/v shape mismatch: k={tuple(k.shape)}, v={tuple(v.shape)}, " f"expected k/v [B={b}, Hkv, Skv, D={d}]" ) - if d != _HEAD_DIM: - raise ValueError(f"head dim D must be {_HEAD_DIM}, got {d}") + if d not in _HEAD_DIMS: + raise ValueError(f"head dim D must be one of {_HEAD_DIMS}, got {d}") + if b < 1 or hq < 1 or hkv < 1: + raise ValueError("batch size and query/key head counts must be positive") if hq % hkv != 0: raise ValueError(f"Hq={hq} not divisible by Hkv={hkv} (GQA group)") if q.dtype not in (torch.float16, torch.bfloat16): @@ -211,7 +213,11 @@ def _validate_inputs( raise ValueError("q, k, v must share the same dtype") if not (q.is_cuda and k.is_cuda and v.is_cuda): raise ValueError("q, k, v must be GPU tensors") + if not (q.device == k.device == v.device): + raise ValueError("q, k, v must be on the same device") if key_padding_mask is not None: + if key_padding_mask.device != q.device: + raise ValueError("key_padding_mask must be on the input device") if key_padding_mask.dtype != torch.bool: raise ValueError("key_padding_mask must be bool") if key_padding_mask.shape != (b, skv): diff --git a/scripts/qwen3_next_gate_common.py b/scripts/qwen3_next_gate_common.py new file mode 100644 index 000000000..00642c8de --- /dev/null +++ b/scripts/qwen3_next_gate_common.py @@ -0,0 +1,125 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Shared pieces of the Qwen3-Next TP4 real-weight gates (``scripts/qwen3_next_tp_*_check.py``). + +Each gate is launched as ``torchrun --nproc-per-node 4 scripts/.py +--checkpoint --output `` and writes one ``rank-.json``. +""" + +import argparse +import json +import os +import subprocess +from collections.abc import Mapping +from datetime import timedelta +from importlib.metadata import version +from pathlib import Path + +import torch +import torch.distributed as dist +from safetensors import safe_open + +ROOT = Path(__file__).resolve().parents[1] + + +class CheckpointWeights(Mapping): + """Keep shard headers open while reading only the requested layer's tensors.""" + + def __init__(self, checkpoint, prefix, names, stack): + self.root, self.prefix, self.names, self.stack = checkpoint, prefix, tuple(names), stack + self.index = json.loads((checkpoint / "model.safetensors.index.json").read_text())[ + "weight_map" + ] + self.readers = {} + + def __iter__(self): + return iter(self.names) + + def __len__(self): + return len(self.names) + + def __getitem__(self, name): + if name not in self.names: + raise KeyError(name) + key = self.prefix + name + shard = self.index[key] + if shard not in self.readers: + self.readers[shard] = self.stack.enter_context( + safe_open(self.root / shard, framework="pt", device="cpu") + ) + return self.readers[shard].get_tensor(key) + + +def gather(value): + peers = [torch.empty_like(value) for _ in range(4)] + dist.all_gather(peers, value.contiguous()) + return peers + + +def check_gradients(module): + result = {} + for name, parameter in module.named_parameters(): + grad = parameter.grad + if grad is None or not torch.isfinite(grad).all() or not grad.count_nonzero(): + raise AssertionError(f"Missing finite nonzero gradient: {name}") + result[name] = float(grad.float().abs().max()) + return result + + +def timed(fn): + start, end = torch.cuda.Event(enable_timing=True), torch.cuda.Event(enable_timing=True) + start.record() + out = fn() + end.record() + torch.cuda.synchronize() + return out, start.elapsed_time(end) * 1000.0 + + +def _git(*args): + return subprocess.run( + ["git", *args], cwd=ROOT, check=True, capture_output=True, text=True + ).stdout.strip() + + +def provenance(): + from rl_engine.integrations.qwen3_next_forward import FORWARD_PROVIDER_ID + + return { + "rl_kernel_commit": _git("rev-parse", "HEAD"), + "tracked_tree_dirty": bool(_git("status", "--porcelain", "--untracked-files=no")), + "provider": FORWARD_PROVIDER_ID, + "environment": { + "gpu": torch.cuda.get_device_name(), + "torch": torch.__version__, + "vllm": version("vllm"), + "nccl": ".".join(map(str, torch.cuda.nccl.version())), + }, + } + + +def run_gate(description, scope, gate): + """Parse ``--checkpoint/--output``, run ``gate(checkpoint, generator)`` on four ranks.""" + parser = argparse.ArgumentParser(description=description) + parser.add_argument("--checkpoint", required=True, type=Path) + parser.add_argument("--output", required=True, type=Path) + args = parser.parse_args() + rank = int(os.environ["LOCAL_RANK"]) + if int(os.environ["WORLD_SIZE"]) != 4 or torch.cuda.device_count() < 4: + raise RuntimeError(f"The {scope} gate requires exactly four ranks on four GPUs") + torch.cuda.set_device(rank) + dist.init_process_group( + "nccl", timeout=timedelta(minutes=15), device_id=torch.device("cuda", rank) + ) + try: + generator = torch.Generator(device="cuda").manual_seed(1234) + result = gate(args.checkpoint, generator) + args.output.mkdir(parents=True, exist_ok=True) + path = args.output / f"rank-{rank}.json" + partial = path.with_suffix(".json.partial") + payload = {"status": "passed", "scope": scope, "rank": rank, **provenance(), **result} + partial.write_text(json.dumps(payload, indent=2) + "\n") + partial.replace(path) + dist.barrier() + finally: + dist.destroy_process_group() diff --git a/scripts/qwen3_next_tp_attention_check.py b/scripts/qwen3_next_tp_attention_check.py new file mode 100644 index 000000000..00ded482b --- /dev/null +++ b/scripts/qwen3_next_tp_attention_check.py @@ -0,0 +1,134 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""TP4 full-attention gate on the official checkpoint's layer-3 weights; four GPUs, torchrun. + + torchrun --nproc-per-node 4 scripts/qwen3_next_tp_attention_check.py \\ + --checkpoint --output + +Requires, bitwise: the HF load/export round trip with the KV head replicated on +each rank pair; full prefill == chunked prefill (output and KV continuation) for +8-1024 tokens; a variable-length batch of four == each sequence alone, in any +order; a sixteen-token decode == the prefill rows; the training recompute == the +no-grad forward; and identical KV-pair and QK-norm gradients across replicas. +""" + +from contextlib import ExitStack + +import torch +import torch.distributed as dist +from qwen3_next_gate_common import CheckpointWeights, check_gradients, gather, run_gate + +from rl_engine.integrations.qwen3_next_tp_blocks import ( + ATTENTION_HF_SHAPES, + TP4FullAttention, + assemble_attention_weights, +) +from rl_engine.testing.tensor_identity import assert_tensor_bitwise_equal as exact + + +def attention_gate(checkpoint, generator): + module = TP4FullAttention(group=dist.group.WORLD, device="cuda") + with ExitStack() as stack: + weights = CheckpointWeights( + checkpoint, "model.layers.3.self_attn.", ATTENTION_HF_SHAPES, stack + ) + module.load_hf_weights(weights) + shards = [dict() for _ in range(4)] + for name, tensor in module.export_local_hf_weights().items(): + for rank, value in enumerate(gather(tensor)): + shards[rank][name] = value.cpu() + for name, tensor in assemble_attention_weights(shards).items(): + exact(tensor, weights[name], name=f"attention HF {name}") + del shards, weights + cases = ["hf-load-export"] + slots = torch.tensor([1], device="cuda", dtype=torch.int32) + with torch.no_grad(): + for length in (8, 64, 256, 1024): + hidden = ( + torch.randn(length, 2048, device="cuda", dtype=torch.bfloat16, generator=generator) + * 0.1 + ) + state = module.initial_state(2) + whole, expected = module(hidden, state, slots, torch.tensor([0, length])) + cut = min(65, length - 1) + first, state = module(hidden[:cut], state, slots, torch.tensor([0, cut])) + last, state = module(hidden[cut:], state, slots, torch.tensor([0, length - cut])) + exact(torch.cat((first, last)), whole, name=f"attention full/chunk {length}") + exact(state.keys[1], expected.keys[1], name="attention key continuation") + exact(state.values[1], expected.values[1], name="attention value continuation") + cases.append(f"full-chunk-{length}") + hidden = ( + torch.randn(88, 2048, device="cuda", dtype=torch.bfloat16, generator=generator) * 0.1 + ) + packed, state = module( + hidden, + module.initial_state(5), + torch.tensor([1, 2, 3, 4], device="cuda"), + torch.tensor([0, 8, 24, 48, 88]), + ) + order = [3, 1, 0, 2] + segments = [hidden[:8], hidden[8:24], hidden[24:48], hidden[48:]] + ends = [0] + for index in order: + ends.append(ends[-1] + segments[index].shape[0]) + reordered, _ = module( + torch.cat([segments[i] for i in order]), + module.initial_state(5), + torch.tensor([i + 1 for i in order], device="cuda"), + torch.tensor(ends), + ) + expected = packed.split((8, 16, 24, 40)) + exact( + reordered, + torch.cat([expected[i] for i in order]), + name="attention variable-length batch4 reorder", + ) + for index, segment in enumerate(segments): + single, _ = module( + segment, module.initial_state(2), slots, torch.tensor([0, segment.shape[0]]) + ) + exact(single, expected[index], name="attention batch4/single") + cases.append("batch4-varlen-reorder") + hidden = ( + torch.randn(80, 2048, device="cuda", dtype=torch.bfloat16, generator=generator) * 0.1 + ).requires_grad_() + with torch.no_grad(): + expected, _ = module(hidden, module.initial_state(2), slots, torch.tensor([0, 80])) + _, decode_state = module(hidden[:64], module.initial_state(2), slots, torch.tensor([0, 64])) + decoded = [] + for token in hidden[64:].split(1): + value, decode_state = module(token, decode_state, slots, torch.tensor([0, 1])) + decoded.append(value) + exact(torch.cat(decoded), expected[64:], name="attention sixteen-token decode") + _, state = module(hidden[:64], module.initial_state(2), slots, torch.tensor([0, 64])) + output, _ = module(hidden[64:], state, slots, torch.tensor([0, 16])) + exact(output, expected[64:], name="attention independent response recompute") + output.float().square().mean().backward() + if ( + hidden.grad is None + or not torch.isfinite(hidden.grad).all() + or not hidden.grad[:64].count_nonzero() + ): + raise AssertionError("Attention response gradient did not reach the prompt") + gradients = check_gradients(module) + for projection in (module.k_proj, module.v_proj): + peers = gather(projection.weight.grad) + exact(peers[0], peers[1], name="KV replica gradient pair0") + exact(peers[2], peers[3], name="KV replica gradient pair1") + for norm in (module.q_norm, module.k_norm): + for peer in gather(norm.weight.grad): + exact(peer, norm.weight.grad, name="QK norm replicated gradient") + cases.extend( + ("sixteen-token-decode", "prompt-gradient", "kv-pair-gradient", "qk-norm-gradient") + ) + return {"cases": cases, "gradient_max_abs": gradients} + + +if __name__ == "__main__": + run_gate( + __doc__, + "tp4_full_attention_layer3", + lambda checkpoint, generator: {"attention": attention_gate(checkpoint, generator)}, + ) diff --git a/scripts/qwen3_next_tp_gdn_check.py b/scripts/qwen3_next_tp_gdn_check.py new file mode 100644 index 000000000..e3aae3692 --- /dev/null +++ b/scripts/qwen3_next_tp_gdn_check.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""TP4 GDN gate on the official checkpoint's layer-0 weights; four GPUs, torchrun. + + torchrun --nproc-per-node 4 scripts/qwen3_next_tp_gdn_check.py \\ + --checkpoint --output + +A one-layer integration gate, not full-model evidence. Requires, bitwise: the +HF load/export round trip of the actual parameter storage; full prefill == +chunked prefill, output and convolution/recurrent state handoff, for 8-1024 +tokens; the training response recompute == the no-grad forward; a gradient that +reaches the prompt through the state; identical replicated norm gradients. +""" + +import json + +import torch +import torch.distributed as dist +from qwen3_next_gate_common import check_gradients, run_gate +from safetensors import safe_open + +from rl_engine.integrations.qwen3_next_provider import GDNProviderConfig +from rl_engine.integrations.qwen3_next_tp_gdn import _GLOBAL_SHAPES, TP4GDN, assemble_gdn_weights +from rl_engine.testing.tensor_identity import assert_tensor_bitwise_equal as exact + + +def load_first_gdn(checkpoint): + index = json.loads((checkpoint / "model.safetensors.index.json").read_text())["weight_map"] + result = {} + for name in _GLOBAL_SHAPES: + key = f"model.layers.0.linear_attn.{name}" + with safe_open(checkpoint / index[key], framework="pt", device="cpu") as reader: + result[name] = reader.get_tensor(key) + return result + + +def gdn_gate(checkpoint, generator): + weights = load_first_gdn(checkpoint) + module = TP4GDN(group=dist.group.WORLD, device="cuda", config=GDNProviderConfig()) + module.load_hf_weights(weights) + # Validate actual parameter storage, not just the pure conversion helper. + shards = [dict() for _ in range(4)] + for name, parameter in module.named_parameters(): + gathered = [torch.empty_like(parameter) for _ in range(4)] + dist.all_gather(gathered, parameter.detach()) + for peer, value in enumerate(gathered): + shards[peer][name] = value.cpu() + for name, restored in assemble_gdn_weights(shards).items(): + exact(restored, weights[name], name=f"loaded weight {name}") + del shards, weights + cases = [] + indices = torch.tensor([1], device="cuda", dtype=torch.int32) + with torch.no_grad(): + for length in (8, 64, 256, 1024): + hidden = ( + torch.randn(length, 2048, device="cuda", dtype=torch.bfloat16, generator=generator) + * 0.1 + ) + initial = module.initial_state(2) + whole, expected_state = module(hidden, initial, indices, torch.tensor([0, length])) + cut = min(65, length - 1) + first, state = module(hidden[:cut], initial, indices, torch.tensor([0, cut])) + last, state = module(hidden[cut:], state, indices, torch.tensor([0, length - cut])) + exact(torch.cat((first, last)), whole, name=f"TP4 layer length={length}") + exact(state.convolution, expected_state.convolution, name="convolution handoff") + exact(state.recurrent, expected_state.recurrent, name="recurrent handoff") + cases.append(f"full-chunk-{length}") + hidden = ( + torch.randn(80, 2048, device="cuda", dtype=torch.bfloat16, generator=generator) * 0.1 + ).requires_grad_() + initial = module.initial_state(2) + with torch.no_grad(): + expected, _ = module(hidden, initial, indices, torch.tensor([0, 80])) + _, prompt_state = module(hidden[:64], initial, indices, torch.tensor([0, 64])) + actual, _ = module(hidden[64:], prompt_state, indices, torch.tensor([0, 16])) + exact(actual, expected[64:], name="independent training response") + actual.float().square().mean().backward() + if ( + hidden.grad is None + or not torch.isfinite(hidden.grad).all() + or not hidden.grad[:64].count_nonzero() + ): + raise AssertionError("Response gradient did not reach prompt input") + grad_stats = check_gradients(module) + norm_grads = [torch.empty_like(module.norm.weight.grad) for _ in range(4)] + dist.all_gather(norm_grads, module.norm.weight.grad) + for other in norm_grads: + exact(other, module.norm.weight.grad, name="replicated norm gradient") + cases.extend(("prompt-gradient", "replicated-norm-gradient", "hf-load-export")) + return {"cases": cases, "gradient_max_abs": grad_stats} + + +if __name__ == "__main__": + run_gate(__doc__, "tp4_gdn_layer0", gdn_gate) diff --git a/scripts/qwen3_next_tp_moe_check.py b/scripts/qwen3_next_tp_moe_check.py index 817c07bcc..450f7fd51 100644 --- a/scripts/qwen3_next_tp_moe_check.py +++ b/scripts/qwen3_next_tp_moe_check.py @@ -18,91 +18,19 @@ and a finite, nonzero gradient for every parameter. """ -import argparse -import json -import os -import subprocess -from collections.abc import Mapping from contextlib import ExitStack -from datetime import timedelta -from importlib.metadata import version -from pathlib import Path import torch import torch.distributed as dist -from safetensors import safe_open +from qwen3_next_gate_common import CheckpointWeights, check_gradients, gather, run_gate, timed -from rl_engine.integrations.qwen3_next_forward import ( - FORWARD_PROVIDER_ID, - shared_router, - stable_top10_routes, -) +from rl_engine.integrations.qwen3_next_forward import shared_router, stable_top10_routes from rl_engine.integrations.qwen3_next_tp_blocks import TP4MoE, assemble_moe_weight, moe_hf_shapes from rl_engine.testing.tensor_identity import assert_tensor_bitwise_equal as exact -ROOT = Path(__file__).resolve().parents[1] TOKEN_COUNTS = (8, 64, 256, 1024) -class CheckpointWeights(Mapping): - """Keep shard headers open while reading only the requested layer's tensors.""" - - def __init__(self, checkpoint, prefix, names, stack): - self.root, self.prefix, self.names, self.stack = checkpoint, prefix, tuple(names), stack - self.index = json.loads((checkpoint / "model.safetensors.index.json").read_text())[ - "weight_map" - ] - self.readers = {} - - def __iter__(self): - return iter(self.names) - - def __len__(self): - return len(self.names) - - def __getitem__(self, name): - if name not in self.names: - raise KeyError(name) - key = self.prefix + name - shard = self.index[key] - if shard not in self.readers: - self.readers[shard] = self.stack.enter_context( - safe_open(self.root / shard, framework="pt", device="cpu") - ) - return self.readers[shard].get_tensor(key) - - -def atomic_json(path, payload): - temporary = path.with_suffix(path.suffix + ".partial") - temporary.write_text(json.dumps(payload, indent=2) + "\n") - temporary.replace(path) - - -def gather(value): - peers = [torch.empty_like(value) for _ in range(4)] - dist.all_gather(peers, value.contiguous()) - return peers - - -def check_gradients(module): - result = {} - for name, parameter in module.named_parameters(): - grad = parameter.grad - if grad is None or not torch.isfinite(grad).all() or not grad.count_nonzero(): - raise AssertionError(f"Missing finite nonzero gradient: {name}") - result[name] = float(grad.float().abs().max()) - return result - - -def timed(fn): - start, end = torch.cuda.Event(enable_timing=True), torch.cuda.Event(enable_timing=True) - start.record() - out = fn() - end.record() - torch.cuda.synchronize() - return out, start.elapsed_time(end) * 1000.0 - - def moe_gate(checkpoint, generator): module = TP4MoE(group=dist.group.WORLD, device="cuda") with ExitStack() as stack: @@ -158,50 +86,9 @@ def moe_gate(checkpoint, generator): return {"cases": cases, "gradient_max_abs": gradients, "forward_us": forward_us} -def _git(*args): - return subprocess.run( - ["git", *args], cwd=ROOT, check=True, capture_output=True, text=True - ).stdout.strip() - - -def main(): - parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument("--checkpoint", required=True, type=Path) - parser.add_argument("--output", required=True, type=Path) - args = parser.parse_args() - rank = int(os.environ["LOCAL_RANK"]) - if int(os.environ["WORLD_SIZE"]) != 4 or torch.cuda.device_count() < 4: - raise RuntimeError("The TP4 MoE gate requires exactly four ranks on four GPUs") - torch.cuda.set_device(rank) - dist.init_process_group( - "nccl", timeout=timedelta(minutes=15), device_id=torch.device("cuda", rank) - ) - try: - generator = torch.Generator(device="cuda").manual_seed(1234) - moe = moe_gate(args.checkpoint, generator) - args.output.mkdir(parents=True, exist_ok=True) - atomic_json( - args.output / f"rank-{rank}.json", - { - "status": "passed", - "scope": "tp4_moe_block_layer0", - "rank": rank, - "rl_kernel_commit": _git("rev-parse", "HEAD"), - "tracked_tree_dirty": bool(_git("status", "--porcelain", "--untracked-files=no")), - "provider": FORWARD_PROVIDER_ID, - "environment": { - "gpu": torch.cuda.get_device_name(), - "torch": torch.__version__, - "vllm": version("vllm"), - "nccl": ".".join(map(str, torch.cuda.nccl.version())), - }, - "moe": moe, - }, - ) - dist.barrier() - finally: - dist.destroy_process_group() - - if __name__ == "__main__": - main() + run_gate( + __doc__, + "tp4_moe_block_layer0", + lambda checkpoint, generator: {"moe": moe_gate(checkpoint, generator)}, + ) diff --git a/tests/check_qwen3_next_attention.py b/tests/check_qwen3_next_attention.py new file mode 100644 index 000000000..d184d5735 --- /dev/null +++ b/tests/check_qwen3_next_attention.py @@ -0,0 +1,110 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Required Qwen3-Next CUDA attention gates; unavailable CUDA is a failure.""" + +import pytest +import torch + +from rl_engine.kernels.ops.base import _C +from rl_engine.kernels.ops.cuda.attention.deterministic_attn import DeterministicAttentionOp +from rl_engine.testing.tensor_identity import assert_tensor_bitwise_equal as exact + + +def inputs(tokens, *, batch=1, query_tokens=None, device="cuda", grad=False): + assert torch.cuda.is_available(), "Mandatory attention CUDA gate cannot skip" + gen = torch.Generator(device=device).manual_seed(920) + query_tokens = tokens if query_tokens is None else query_tokens + return tuple( + torch.randn(batch, heads, length, 256, device=device, dtype=torch.bfloat16, generator=gen) + .mul_(0.25) + .requires_grad_(grad) + for heads, length in ((4, query_tokens), (1, tokens), (1, tokens)) + ) + + +@pytest.mark.parametrize("tokens", [8, 64, 256, 1024]) +@torch.no_grad() +def test_d256_full_chunk_decode_and_batch_are_raw_bit_equal(tokens): + q, k, v = inputs(tokens, batch=4) + op = DeterministicAttentionOp() + whole, lse = op.forward_with_lse(q, k, v) + order = torch.tensor([3, 1, 0, 2], device=q.device) + exact(op(q[order], k[order], v[order]), whole[order]) + for row in range(4): + exact(op(q[row : row + 1], k[row : row + 1], v[row : row + 1]), whole[row : row + 1]) + starts = [0, 1, 7, tokens - 1, tokens] + starts = sorted(set(starts)) + for start, end in zip(starts[:-1], starts[1:]): + out, part_lse = op.forward_with_lse(q[:, :, start:end], k[:, :, :end], v[:, :, :end]) + exact(out, whole[:, :, start:end]) + exact(part_lse, lse[:, :, start:end]) + + +def test_d256_backward_with_cached_prefix_matches_float64_formula(): + q, k, v = inputs(19, query_tokens=3, grad=True) + op = DeterministicAttentionOp() + out = op(q, k, v) + grad = torch.linspace(-1, 1, out.numel(), device=q.device).reshape_as(out).to(out.dtype) + out.backward(grad) + qr, kr, vr = (x.detach().double().requires_grad_() for x in (q, k, v)) + scores = qr @ kr.repeat_interleave(4, dim=1).transpose(-1, -2) / 16 + causal = ( + torch.arange(19, device=q.device)[None, :] <= torch.arange(16, 19, device=q.device)[:, None] + ) + expected = scores.masked_fill(~causal, -torch.inf).softmax(-1) @ vr.repeat_interleave(4, dim=1) + expected.backward(grad.double()) + # Formula accuracy is separate from the raw-bit provider comparisons above. + for actual, reference in zip((q, k, v), (qr, kr, vr)): + assert torch.isfinite(actual.grad).all() and actual.grad.abs().max() > 0 + torch.testing.assert_close( + actual.grad.float(), reference.grad.float(), atol=0.002, rtol=0.016 + ) + assert k.grad[:, :, :16].abs().max() > 0 + assert v.grad[:, :, :16].abs().max() > 0 + + +def test_native_backward_rejects_malformed_probability_and_gradient_buffers(): + q, k, v = inputs(8) + out, _, probabilities = _C.deterministic_attention_forward(q, k, v, True, 1 / 16, None) + with pytest.raises(RuntimeError, match="P must be FP32"): + _C.deterministic_attention_backward( + out, q, k, v, probabilities.to(q.dtype), True, 1 / 16, None + ) + with pytest.raises(RuntimeError, match="grad_output must have q shape"): + _C.deterministic_attention_backward( + out[:, :, :1], q, k, v, probabilities, True, 1 / 16, None + ) + with pytest.raises(RuntimeError, match="P must have shape"): + _C.deterministic_attention_backward( + out, q, k, v, probabilities[:, :, :1], True, 1 / 16, None + ) + + +def test_d256_input_device_guard_and_nondefault_stream(): + assert torch.cuda.device_count() >= 2, "Mandatory cross-device gate requires allocated GPUs" + previous = torch.cuda.current_device() + try: + q, k, v = inputs(8, device="cuda:1", grad=True) + op = DeterministicAttentionOp() + torch.cuda.set_device(1) + expected = op(q, k, v) + expected.sum().backward() + gradients = [x.grad.clone() for x in (q, k, v)] + for x in (q, k, v): + x.grad = None + torch.cuda.synchronize(1) + stream = torch.cuda.Stream(device=1) + with torch.cuda.stream(stream): + torch.cuda.set_device(0) + actual = op(q, k, v) + actual.sum().backward() + assert torch.cuda.current_device() == 0 + stream.synchronize() + exact(actual, expected) + for x, expected_grad in zip((q, k, v), gradients): + exact(x.grad, expected_grad) + with pytest.raises(ValueError, match="same device"): + op(q, k.to("cuda:0"), v) + finally: + torch.cuda.set_device(previous) diff --git a/tests/check_qwen3_next_conv_bridge.py b/tests/check_qwen3_next_conv_bridge.py new file mode 100644 index 000000000..fb6778a71 --- /dev/null +++ b/tests/check_qwen3_next_conv_bridge.py @@ -0,0 +1,96 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""The convolution provider must agree across batch, chunk and cache layouts.""" + +import pytest +import torch + +from rl_engine.integrations.qwen3_next_conv import _provider, causal_conv_sequence +from rl_engine.testing.tensor_identity import assert_tensor_bitwise_equal as exact + + +def inputs(lengths): + assert torch.cuda.is_available(), "Required provider tests cannot skip CUDA" + gen = torch.Generator(device="cuda").manual_seed(17) + + def rand(*shape): + return torch.randn(*shape, device="cuda", dtype=torch.bfloat16, generator=gen) + + return ( + rand(sum(lengths), 2048), + rand(len(lengths) + 1, 2048, 3), + rand(2048, 4), + torch.arange(1, len(lengths) + 1, device="cuda", dtype=torch.int32), + torch.tensor([0, *torch.tensor(lengths).cumsum(0).tolist()]), + ) + + +@torch.no_grad() +@pytest.mark.parametrize("lengths", [(1,), (64, 8, 0, 16), (1024, 256, 64, 8)]) +def test_varlen_matches_repeated_decode_and_preserves_inputs(lengths): + x, state, weight, indices, cu = inputs(lengths) + saved = [tensor.clone() for tensor in (x, state, weight)] + output, final_state = causal_conv_sequence(x, state, weight, indices, cu) + reference_state = state.clone() + reference_rows = [] + for seq in range(len(lengths)): + for token in range(cu[seq], cu[seq + 1]): + value = x[token : token + 1].clone() + reference_rows.append( + _provider()( + value, + reference_state, + weight, + activation="silu", + conv_state_indices=indices[seq : seq + 1], + ) + ) + exact(output, torch.cat(reference_rows)) + exact(final_state, reference_state) + for original, before in zip((x, state, weight), saved): + exact(original, before) + + +@torch.no_grad() +def test_chunked_and_reordered_sequences_match(): + x, state, weight, indices, cu = inputs((1024, 64)) + whole, whole_state = causal_conv_sequence(x, state, weight, indices, cu) + # Continue both sequences after 32 tokens, in the opposite batch order. + prompt = torch.cat((x[:32], x[1024:1056])) + first, next_state = causal_conv_sequence( + prompt, state, weight, indices, torch.tensor([0, 32, 64]) + ) + response = torch.cat((x[1056:], x[32:1024])) + second, next_state = causal_conv_sequence( + response, next_state, weight, indices.flip(0), torch.tensor([0, 32, 1024]) + ) + restored = torch.cat((first[:32], second[32:], first[32:], second[:32])) + exact(restored, whole) + exact(next_state, whole_state) + + +def test_response_gradient_reaches_prompt_and_convolution_weight(): + x, state, weight, indices, _ = inputs((8,)) + x.requires_grad_() + state.requires_grad_() + weight.requires_grad_() + _, prompt_state = causal_conv_sequence(x[:4], state, weight, indices, torch.tensor([0, 4])) + out, final_state = causal_conv_sequence( + x[4:], prompt_state, weight, indices, torch.tensor([0, 4]) + ) + (out.float().square().sum() + final_state.float().square().sum() * 0.01).backward() + for tensor in (x, weight): + assert tensor.grad is not None and torch.isfinite(tensor.grad).all() + assert tensor.grad.abs().max() > 0 + assert x.grad[:4].abs().max() > 0 + + +def test_empty_sequence_preserves_cache_and_gradients(): + x, state, weight, indices, cu = inputs((0,)) + state.requires_grad_() + out, next_state = causal_conv_sequence(x, state, weight, indices, cu) + assert out.shape == x.shape + exact(next_state, state) + next_state.float().sum().backward() + exact(state.grad, torch.ones_like(state)) diff --git a/tests/check_qwen3_next_core_matrix.py b/tests/check_qwen3_next_core_matrix.py new file mode 100644 index 000000000..8c299a87f --- /dev/null +++ b/tests/check_qwen3_next_core_matrix.py @@ -0,0 +1,97 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Mandatory TP4-shape GDN state tests; no full-model claim or optional skips.""" + +import pytest +import torch + +from rl_engine.integrations.qwen3_next_provider import GDNProviderConfig, GDNState, shared_gdn_core +from rl_engine.testing.tensor_identity import assert_tensor_bitwise_equal as exact + + +def _inputs(lengths): + assert torch.cuda.is_available(), "Required shared-provider CUDA tests cannot skip" + generator = torch.Generator(device="cuda").manual_seed(20261002) + + def rand(*shape, dtype=torch.bfloat16): + return torch.randn(*shape, device="cuda", dtype=dtype, generator=generator) * 0.1 + + tokens = sum(lengths) + values = [rand(tokens, 2048), rand(tokens, 8), rand(tokens, 8), rand(tokens, 8, 128)] + weights = [rand(8, dtype=torch.float32), rand(8, dtype=torch.float32), rand(2048, 4), rand(128)] + state = GDNState( + rand(len(lengths) + 2, 2048, 3), + rand(len(lengths) + 2, 8, 128, 128, dtype=torch.float32), + ) + indices = torch.arange(1, len(lengths) + 1, device="cuda", dtype=torch.int32) + return values, weights, state, indices + + +def _run(values, weights, state, indices, lengths): + boundaries = torch.tensor([0, *torch.tensor(lengths).cumsum(0).tolist()], dtype=torch.int64) + return shared_gdn_core( + *values, *weights, state, indices, boundaries, config=GDNProviderConfig(), num_k_heads=4 + ) + + +@pytest.mark.parametrize("batch", [1, 4]) +@pytest.mark.parametrize("length", [8, 64, 256, 1024]) +@torch.no_grad() +def test_full_chunked_reordered_shared_core(batch, length): + lengths = [length] * batch + values, weights, initial, indices = _inputs(lengths) + whole, final = _run(values, weights, initial, indices, lengths) + for cut in (1, 63, 64, 65, 100, 528, 576): + cut = min(cut, length) + state = initial + pieces = [[] for _ in lengths] + for start, end in ((0, cut), (cut, length)): + # Reorder the response-bearing step, preserving sequence/cache identity. + order = list(range(batch)) if start == 0 else list(reversed(range(batch))) + rows = [row for seq in order for row in range(seq * length + start, seq * length + end)] + row_ids = torch.tensor(rows, device="cuda", dtype=torch.int64) + chunk = [value.index_select(0, row_ids) for value in values] + part, state = _run(chunk, weights, state, indices[order], [end - start] * batch) + for position, seq in enumerate(order): + pieces[seq].append(part[position * (end - start) : (position + 1) * (end - start)]) + exact(torch.cat([torch.cat(seq) for seq in pieces]), whole, name=f"output cut={cut}") + exact(state.convolution, final.convolution, name=f"conv state cut={cut}") + exact(state.recurrent, final.recurrent, name=f"recurrent state cut={cut}") + exact(final.convolution[0], initial.convolution[0], name="reserved conv slot") + exact(final.recurrent[0], initial.recurrent[0], name="reserved recurrent slot") + + +@torch.no_grad() +def test_variable_lengths_empty_and_mixed_step_match_independent_sequences(): + lengths = [65, 1, 0, 17] + values, weights, initial, indices = _inputs(lengths) + mixed, mixed_state = _run(values, weights, initial, indices, lengths) + start = 0 + for seq, length in enumerate(lengths): + end = start + length + output, state = _run( + [value[start:end] for value in values], + weights, + initial, + indices[seq : seq + 1], + [length], + ) + exact(output, mixed[start:end], name=f"sequence {seq}") + exact(state.convolution[seq + 1], mixed_state.convolution[seq + 1], name="conv state") + exact(state.recurrent[seq + 1], mixed_state.recurrent[seq + 1], name="recurrent state") + start = end + exact(mixed_state.recurrent[3], initial.recurrent[3], name="empty sequence state") + + +@pytest.mark.parametrize("batch", [1, 4]) +@torch.no_grad() +def test_shared_core_one_hundred_repetitions(batch): + lengths = [8] * batch + values, weights, initial, indices = _inputs(lengths) + expected, expected_state = _run(values, weights, initial, indices, lengths) + for repeat in range(100): + output, state = _run(values, weights, initial, indices, lengths) + exact(output, expected, name=f"output repeat={repeat}") + exact(state.convolution, expected_state.convolution, name="conv state") + exact(state.recurrent, expected_state.recurrent, name="recurrent state") diff --git a/tests/check_qwen3_next_gdn_bridge.py b/tests/check_qwen3_next_gdn_bridge.py new file mode 100644 index 000000000..9e44cc9e0 --- /dev/null +++ b/tests/check_qwen3_next_gdn_bridge.py @@ -0,0 +1,112 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Explicit subprocess provider tests; never import vLLM into ordinary pytest.""" + +import pytest +import torch + +from rl_engine.integrations.qwen3_next_gdn import _provider, packed_decode_training_step +from rl_engine.kernels.ops.pytorch.linear_attn import GatedDeltaRuleRecurrentStepOp +from rl_engine.testing.tensor_identity import assert_tensor_bitwise_equal, tensor_bitwise_equal + +pytestmark = pytest.mark.skipif(not torch.cuda.is_available(), reason="CUDA required") + + +def _inputs(seed=1): + gen = torch.Generator(device="cuda").manual_seed(seed) + + def rand(*shape, dtype=torch.bfloat16): + return torch.randn(*shape, device="cuda", dtype=dtype, generator=gen) + + return [ + rand(2, 512), + rand(2, 2), + rand(2, 2), + rand(2, dtype=torch.float32), + rand(2, dtype=torch.float32), + rand(3, 2, 128, 128, dtype=torch.float32) * 0.01, + ] + + +def test_bridge_forward_is_provider_exact_and_does_not_mutate_inputs(): + inputs = _inputs() + state_before = inputs[-1].clone() + indices = torch.tensor([1, 2], device="cuda", dtype=torch.int32) + out, state = packed_decode_training_step(*inputs, indices, num_k_heads=1) + expected = torch.empty_like(out) + expected_state = state_before.clone() + _provider()( + *inputs[:-1], 128**-0.5, expected_state, expected, indices, use_qk_l2norm_in_kernel=True + ) + assert_tensor_bitwise_equal(out, expected) + assert_tensor_bitwise_equal(state, expected_state) + assert tensor_bitwise_equal(inputs[-1], state_before) + + +def test_bridge_keeps_prompt_state_gradient_through_response(): + inputs = [x.requires_grad_() for x in _inputs()] + indices = torch.tensor([1, 2], device="cuda", dtype=torch.int32) + _, prompt_state = packed_decode_training_step(*inputs, indices, num_k_heads=1) + prompt_state.retain_grad() + response = _inputs(seed=2)[0].requires_grad_() + out, final_state = packed_decode_training_step( + response, *inputs[1:5], prompt_state, indices, num_k_heads=1 + ) + (out.float().square().sum() + final_state.square().sum() * 0.01).backward() + assert prompt_state.grad is not None and prompt_state.grad.abs().max() > 0 + for tensor in [*inputs, response]: + assert tensor.grad is not None + assert torch.isfinite(tensor.grad).all() + assert tensor.grad.abs().max() > 0 + + +def test_bridge_backward_matches_recomputed_recurrence_vjp(): + inputs = [x.requires_grad_() for x in _inputs()] + indices = torch.tensor([1, 2], device="cuda", dtype=torch.int32) + out, state = packed_decode_training_step(*inputs, indices, num_k_heads=1) + grad_out = torch.ones_like(out) * 0.125 + grad_state = torch.ones_like(state) * 0.001 + torch.autograd.backward((out, state), (grad_out, grad_state)) + refs = [x.detach().clone().requires_grad_() for x in inputs] + ref_out, ref_state = GatedDeltaRuleRecurrentStepOp()( + *refs, indices, scale=128**-0.5, num_k_heads=1 + ) + torch.autograd.backward((ref_out, ref_state), (grad_out, grad_state)) + for actual, ref in zip(inputs, refs): + assert tensor_bitwise_equal(actual.grad, ref.grad) + + +def test_initial_state_vjp_matches_provider_directional_difference(): + inputs = _inputs() + inputs[-1].requires_grad_() + indices = torch.tensor([1, 2], device="cuda", dtype=torch.int32) + _, output = packed_decode_training_step(*inputs, indices, num_k_heads=1) + direction = torch.ones_like(inputs[-1]) * 0.03125 + probe = torch.linspace(-0.01, 0.01, output.numel(), device="cuda").reshape_as(output) + (output.double() * probe.double()).sum().backward() + analytic = (inputs[-1].grad.double() * direction.double()).sum() + eps = 0.01 + with torch.no_grad(): + _, plus = packed_decode_training_step( + *inputs[:-1], inputs[-1] + eps * direction, indices, num_k_heads=1 + ) + _, minus = packed_decode_training_step( + *inputs[:-1], inputs[-1] - eps * direction, indices, num_k_heads=1 + ) + numerical = ((plus.double() - minus.double()) * probe.double()).sum() / (2 * eps) + torch.testing.assert_close(analytic, numerical, rtol=1e-3, atol=1e-4) + + +@pytest.mark.parametrize("empty", [False, True]) +def test_inactive_state_is_identity_in_backward(empty): + inputs = _inputs() + if empty: + inputs[:3] = [x[:0] for x in inputs[:3]] + inputs = [x.requires_grad_() for x in inputs] + indices = torch.zeros(inputs[0].shape[0], device="cuda", dtype=torch.int32) + out, state = packed_decode_training_step(*inputs, indices, num_k_heads=1) + (out.float().sum() + state.sum()).backward() + assert tensor_bitwise_equal(inputs[-1].grad, torch.ones_like(state)) + for tensor in inputs[:-1]: + assert torch.count_nonzero(tensor.grad) == 0 diff --git a/tests/check_qwen3_next_gdn_sequence.py b/tests/check_qwen3_next_gdn_sequence.py new file mode 100644 index 000000000..fef317872 --- /dev/null +++ b/tests/check_qwen3_next_gdn_sequence.py @@ -0,0 +1,102 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Packed decode recurrence boundary checks; no complete-model L2 claim.""" + +import pytest +import torch + +from rl_engine.integrations.qwen3_next_gdn import packed_recurrent_sequence +from rl_engine.testing.tensor_identity import assert_tensor_bitwise_equal as exact + + +def inputs(lengths, seed=7): + assert torch.cuda.is_available(), "CUDA is required; this acceptance suite cannot skip" + generator = torch.Generator(device="cuda").manual_seed(seed) + + def rand(*shape, dtype=torch.bfloat16): + return torch.randn(*shape, device="cuda", dtype=dtype, generator=generator) + + tokens = sum(lengths) + # Actual TP4 shard: 16 / 4 key heads, 32 / 4 value heads, K=V=128. + tensors = [ + rand(tokens, 2048), + rand(tokens, 8), + rand(tokens, 8), + rand(8, dtype=torch.float32), + rand(8, dtype=torch.float32), + rand(len(lengths) + 1, 8, 128, 128, dtype=torch.float32) * 0.01, + ] + indices = torch.arange(1, len(lengths) + 1, device="cuda", dtype=torch.int32) + cu = torch.tensor([0, *torch.tensor(lengths).cumsum(0).tolist()], dtype=torch.int64) + return tensors, indices, cu + + +def run(tensors, indices, cu): + return packed_recurrent_sequence(*tensors, indices, cu, num_k_heads=4) + + +@torch.no_grad() +@pytest.mark.parametrize("lengths", [(8,), (64, 8, 0, 16), (1024, 256, 64, 8)]) +def test_packed_matches_independent_sequences_and_reordering(lengths): + tensors, indices, cu = inputs(lengths) + original_state = tensors[-1].clone() + output, state = run(tensors, indices, cu) + for seq, length in enumerate(lengths): + start, end = cu[seq : seq + 2].tolist() + one = [*(value[start:end] for value in tensors[:3]), *tensors[3:]] + expected, expected_state = run(one, indices[seq : seq + 1], torch.tensor([0, length])) + exact(output[start:end], expected) + exact(state[seq + 1], expected_state[seq + 1]) + permutation = list(reversed(range(len(lengths)))) + rows = torch.cat([torch.arange(cu[seq], cu[seq + 1], device="cuda") for seq in permutation]) + changed = [*(value.index_select(0, rows) for value in tensors[:3]), *tensors[3:]] + reordered_cu = torch.tensor([0, *torch.tensor([lengths[i] for i in permutation]).cumsum(0)]) + reordered, reordered_state = run(changed, indices[permutation], reordered_cu) + exact(reordered, output.index_select(0, rows)) + exact(reordered_state, state) + exact(tensors[-1], original_state) + + +@torch.no_grad() +def test_1024_token_chunk_continuation_is_bitwise_exact(): + tensors, indices, cu = inputs((1024,)) + whole, whole_state = run(tensors, indices, cu) + state, pieces = tensors[-1], [] + cuts = (0, 1, 8, 64, 256, 513, 1024) + for start, end in zip(cuts, cuts[1:]): + chunk = [*(value[start:end] for value in tensors[:3]), *tensors[3:5], state] + output, state = run(chunk, indices, torch.tensor([0, end - start])) + pieces.append(output) + exact(torch.cat(pieces), whole) + exact(state, whole_state) + + +def test_chunk_boundary_retains_prompt_and_initial_state_gradients(): + tensors, indices, cu = inputs((8,)) + tensors = [tensor.requires_grad_() for tensor in tensors] + prompt = [*(value[:4] for value in tensors[:3]), *tensors[3:]] + _, prompt_state = run(prompt, indices, torch.tensor([0, 4])) + prompt_state.retain_grad() + response = [*(value[4:] for value in tensors[:3]), *tensors[3:5], prompt_state] + out, state = run(response, indices, torch.tensor([0, 4])) + (out.float().square().sum() + state.square().sum() * 0.01).backward() + assert prompt_state.grad is not None and prompt_state.grad.abs().max() > 0 + for value in tensors: + assert value.grad is not None and torch.isfinite(value.grad).all() + assert value.grad.abs().max() > 0 + assert tensors[0].grad[:4].abs().max() > 0 + + +@pytest.mark.parametrize("bad", [[1, 8], [0, 9], [0, 6, 5, 8]]) +def test_bad_packing_is_rejected(bad): + tensors, indices, _ = inputs((8,)) + with pytest.raises(ValueError, match="cu_seqlens"): + run(tensors, indices, torch.tensor(bad)) + + +def test_reserved_and_duplicate_slots_are_rejected(): + tensors, indices, cu = inputs((4, 4)) + for bad in ([0, 1], [1, 1]): + with pytest.raises(ValueError): + run(tensors, torch.tensor(bad, device="cuda", dtype=torch.int32), cu) diff --git a/tests/check_qwen3_next_shared_core.py b/tests/check_qwen3_next_shared_core.py new file mode 100644 index 000000000..e65158d07 --- /dev/null +++ b/tests/check_qwen3_next_shared_core.py @@ -0,0 +1,83 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Combined provider contract; does not instantiate a complete Qwen model.""" + +from dataclasses import replace + +import pytest +import torch + +from rl_engine.integrations.qwen3_next_provider import GDNProviderConfig, GDNState, shared_gdn_core +from rl_engine.testing.tensor_identity import assert_tensor_bitwise_equal as exact + + +def inputs(tokens, grad=False): + assert torch.cuda.is_available(), "Required CUDA provider suite cannot skip" + gen = torch.Generator(device="cuda").manual_seed(73) + + def rand(*shape, dtype=torch.bfloat16): + return torch.randn(*shape, device="cuda", dtype=dtype, generator=gen).requires_grad_(grad) + + args = [ + rand(tokens, 2048), + rand(tokens, 8), + rand(tokens, 8), + rand(tokens, 8, 128), + rand(8, dtype=torch.float32), + rand(8, dtype=torch.float32), + rand(2048, 4), + rand(128), + GDNState(rand(2, 2048, 3), rand(2, 8, 128, 128, dtype=torch.float32)), + ] + return args, torch.tensor([1], device="cuda", dtype=torch.int32) + + +@pytest.mark.parametrize("tokens", [8, 1024]) +@torch.no_grad() +def test_shared_core_chunk_and_decode_state_match(tokens): + args, indices = inputs(tokens) + config = GDNProviderConfig() + output, state = shared_gdn_core( + *args, indices, torch.tensor([0, tokens]), config=config, num_k_heads=4 + ) + pieces, next_state = [], args[-1] + for start, end in ((0, 3), (3, tokens - 1), (tokens - 1, tokens)): + chunk = [*(value[start:end] for value in args[:4]), *args[4:8], next_state] + part, next_state = shared_gdn_core( + *chunk, indices, torch.tensor([0, end - start]), config=config, num_k_heads=4 + ) + pieces.append(part) + exact(torch.cat(pieces), output) + exact(next_state.convolution, state.convolution) + exact(next_state.recurrent, state.recurrent) + + +def test_independent_training_forward_matches_inference_and_retains_gradients(): + args, indices = inputs(8, grad=True) + config = GDNProviderConfig() + with torch.no_grad(): + reference, _ = shared_gdn_core( + *args, indices, torch.tensor([0, 8]), config=config, num_k_heads=4 + ) + prompt = [*(value[:4] for value in args[:4]), *args[4:]] + _, prompt_state = shared_gdn_core( + *prompt, indices, torch.tensor([0, 4]), config=config, num_k_heads=4 + ) + prompt_state.recurrent.retain_grad() + response = [*(value[4:] for value in args[:4]), *args[4:8], prompt_state] + actual, _ = shared_gdn_core( + *response, indices, torch.tensor([0, 4]), config=config, num_k_heads=4 + ) + exact(actual, reference[4:]) + actual.float().square().sum().backward() + for value in args[:8]: + assert value.grad is not None and torch.isfinite(value.grad).all() + assert value.grad.abs().max() > 0 + assert args[0].grad[:4].abs().max() > 0 + assert prompt_state.recurrent.grad.abs().max() > 0 + + +def test_unimplemented_provider_profile_is_rejected(): + with pytest.raises(ValueError, match="Unsupported"): + replace(GDNProviderConfig(), recurrence="unverified-prefill").validate() diff --git a/tests/test_qwen3_next_forward_contract.py b/tests/test_qwen3_next_forward_contract.py index 76d6df183..56d681b21 100644 --- a/tests/test_qwen3_next_forward_contract.py +++ b/tests/test_qwen3_next_forward_contract.py @@ -15,6 +15,7 @@ lambda: provider.shared_linear(torch.zeros(1, 8), torch.zeros(8, 8)), lambda: provider.stable_top10_routes(torch.zeros(1, 512)), lambda: provider.combine_routes(torch.zeros(1, 10, 8), torch.zeros(1, 10)), + lambda: provider.shared_attention(*(torch.zeros(1, 4, 8, 256) for _ in range(3))), ], ) def test_required_cuda_primitives_reject_cpu(call): diff --git a/tests/test_qwen3_next_tp_blocks.py b/tests/test_qwen3_next_tp_blocks.py index f2ac9c822..f97ad07a2 100644 --- a/tests/test_qwen3_next_tp_blocks.py +++ b/tests/test_qwen3_next_tp_blocks.py @@ -1,7 +1,7 @@ # SPDX-License-Identifier: Apache-2.0 # Copyright (c) 2026 RL-Kernel Contributors -"""HF mappings, replica checks and official Qwen3-Next MoE dimensions.""" +"""HF mappings, KV replica ownership and official Qwen3-Next attention/MoE dimensions.""" import pytest import torch @@ -20,6 +20,32 @@ def pattern(shape): ) +@pytest.fixture(scope="module") +def attention_weights(): + return {name: pattern(shape) for name, shape in blocks.ATTENTION_HF_SHAPES.items()} + + +def test_attention_hf_roundtrip_and_kv_pair_layout(attention_weights): + shards = [blocks.shard_attention_weights(attention_weights, rank) for rank in range(4)] + for name, value in blocks.assemble_attention_weights(shards).items(): + exact(value, attention_weights[name], name=name) + for rank, shard in enumerate(shards): + exact( + shard["q_proj.weight"], + attention_weights["q_proj.weight"][rank * 2048 : (rank + 1) * 2048], + ) + begin = rank // 2 * 256 + exact(shard["k_proj.weight"], attention_weights["k_proj.weight"][begin : begin + 256]) + + +def test_attention_export_rejects_disagreeing_kv_replica(attention_weights): + shards = [blocks.shard_attention_weights(attention_weights, rank) for rank in range(4)] + shards[1]["k_proj.weight"] = shards[1]["k_proj.weight"].clone() + shards[1]["k_proj.weight"][0, 0] = -1 + with pytest.raises(ValueError, match="Replicated KV"): + blocks.assemble_attention_weights(shards) + + @pytest.mark.parametrize( "name", [ @@ -91,3 +117,46 @@ def test_tp4_moe_parameter_ownership(monkeypatch): assert not getattr(module.gate.weight, "tensor_model_parallel", False) assert not getattr(module.shared_expert_gate.weight, "tensor_model_parallel", False) assert module.gate.weight.shape == (512, 2048) + + +@pytest.fixture +def fake_tp(monkeypatch): + group = object() + monkeypatch.setattr(blocks.dist, "is_initialized", lambda: True) + monkeypatch.setattr(blocks.dist, "get_world_size", lambda group: 4) + monkeypatch.setattr(blocks, "_kv_replica_groups", lambda group: (object(), object())) + return group + + +@pytest.mark.parametrize("rank", [0, 1, 2, 3]) +def test_attention_parameter_ownership_and_actual_hf_storage( + fake_tp, monkeypatch, rank, attention_weights +): + monkeypatch.setattr(blocks.dist, "get_rank", lambda group: rank) + module = blocks.TP4FullAttention(group=fake_tp, device="cpu") + module.load_hf_weights(attention_weights) + expected = blocks.shard_attention_weights(attention_weights, rank) + for name, value in module.export_local_hf_weights().items(): + exact(value, expected[name], name=name) + assert module.q_proj.weight.tensor_model_parallel + assert module.o_proj.weight.partition_dim == 1 + assert module.k_proj.weight.shared == (rank % 2 == 1) + assert module.v_proj.weight.shared == (rank % 2 == 1) + assert not getattr(module.q_norm.weight, "tensor_model_parallel", False) + state = module.initial_state(3) + assert len(state.keys) == len(state.values) == 3 + assert all(value.shape == (1, 1, 0, 256) for value in state.keys) + + +def test_rope_uses_absolute_positions_and_preserves_unrotated_tail(fake_tp, monkeypatch): + monkeypatch.setattr(blocks.dist, "get_rank", lambda group: 0) + module = blocks.TP4FullAttention(group=fake_tp, device="cpu") + x = torch.randn(8, 4, 256, dtype=torch.bfloat16) + positions = torch.arange(61, 69) + whole = module._rotate(x, positions) + exact(whole[..., 64:], x[..., 64:]) + exact( + torch.cat([module._rotate(x[:3], positions[:3]), module._rotate(x[3:], positions[3:])]), + whole, + ) + assert not torch.equal(module._rotate(x, torch.arange(8)), whole) diff --git a/tests/test_qwen3_next_tp_gdn.py b/tests/test_qwen3_next_tp_gdn.py new file mode 100644 index 000000000..69d047983 --- /dev/null +++ b/tests/test_qwen3_next_tp_gdn.py @@ -0,0 +1,65 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Official HF interleaving and TP shard round trips, without a GPU dependency.""" + +import pytest +import torch + +from rl_engine.integrations.qwen3_next_tp_gdn import ( + _GLOBAL_SHAPES, + assemble_gdn_weights, + shard_gdn_weights, +) +from rl_engine.testing.tensor_identity import assert_tensor_bitwise_equal + + +@pytest.fixture(scope="module") +def weights(): + return { + name: torch.arange(torch.Size(shape).numel(), dtype=torch.int32) + .remainder(251) + .to(torch.bfloat16) + .reshape(shape) + for name, shape in _GLOBAL_SHAPES.items() + } + + +def test_official_interleaving_survives_tp4_round_trip(weights): + shards = [shard_gdn_weights(weights, rank) for rank in range(4)] + restored = assemble_gdn_weights(shards) + for name, tensor in weights.items(): + assert_tensor_bitwise_equal(restored[name], tensor, name=name) + for rank, shard in enumerate(shards): + # Conv is Q/K/V segmented, unlike the GQA-interleaved qkvz projection. + assert_tensor_bitwise_equal( + shard["conv1d.weight"][:512], weights["conv1d.weight"][rank * 512 : (rank + 1) * 512] + ) + assert_tensor_bitwise_equal( + shard["conv1d.weight"][512:1024], + weights["conv1d.weight"][2048 + rank * 512 : 2048 + (rank + 1) * 512], + ) + assert_tensor_bitwise_equal( + shard["in_proj_qkvz.weight"], + weights["in_proj_qkvz.weight"][rank * 3072 : (rank + 1) * 3072], + ) + + +@pytest.mark.parametrize("rank", [-1, 4, True, 1.0]) +def test_invalid_tp_rank_is_rejected(weights, rank): + with pytest.raises(ValueError, match="TP4 rank"): + shard_gdn_weights(weights, rank) + + +def test_divergent_replicated_norm_is_not_silently_exported(weights): + shards = [shard_gdn_weights(weights, rank) for rank in range(4)] + shards[1]["norm.weight"] = shards[1]["norm.weight"].clone() + shards[1]["norm.weight"][0] = -1 + with pytest.raises(ValueError, match="Replicated"): + assemble_gdn_weights(shards) + + +def test_missing_hf_weight_is_rejected(weights): + incomplete = {name: value for name, value in weights.items() if name != "dt_bias"} + with pytest.raises(ValueError, match="weight names"): + shard_gdn_weights(incomplete, 0) From 3fe632d0a16af4bda824efb95eb13002ae451e80 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Fri, 9 Oct 2026 02:12:10 +0000 Subject: [PATCH 47/70] docs(qwen3-next): MoE route/combine contract, prior-art and TP4 evidence (B200, 2e950f3) Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- docs/operators/README.md | 1 + .../operators/qwen3-next-moe-route-combine.md | 137 ++++++++++ .../qwen3-next-moe-route-b200/README.md | 34 +++ .../qwen3-next-moe-route-b200/figure.png | Bin 0 -> 232121 bytes .../qwen3-next-moe-route-b200/report.json | 236 ++++++++++++++++++ .../tp4-moe/rank-0.json | 45 ++++ .../tp4-moe/rank-1.json | 45 ++++ .../tp4-moe/rank-2.json | 45 ++++ .../tp4-moe/rank-3.json | 45 ++++ 9 files changed, 588 insertions(+) create mode 100644 docs/operators/qwen3-next-moe-route-combine.md create mode 100644 docs/usage/evidence/qwen3-next-moe-route-b200/README.md create mode 100644 docs/usage/evidence/qwen3-next-moe-route-b200/figure.png create mode 100644 docs/usage/evidence/qwen3-next-moe-route-b200/report.json create mode 100644 docs/usage/evidence/qwen3-next-moe-route-b200/tp4-moe/rank-0.json create mode 100644 docs/usage/evidence/qwen3-next-moe-route-b200/tp4-moe/rank-1.json create mode 100644 docs/usage/evidence/qwen3-next-moe-route-b200/tp4-moe/rank-2.json create mode 100644 docs/usage/evidence/qwen3-next-moe-route-b200/tp4-moe/rank-3.json diff --git a/docs/operators/README.md b/docs/operators/README.md index 0b93b3d90..be74cb6d0 100644 --- a/docs/operators/README.md +++ b/docs/operators/README.md @@ -34,4 +34,5 @@ Every operator page should include: - [Token Embedding](embedding.md) - [Qwen3-Next RMSNorm (zero-centred)](qwen3-next-rms-norm.md) - [Qwen3-Next Gated RMSNorm](qwen3-next-rms-norm-gated.md) +- [Qwen3-Next MoE route / combine](qwen3-next-moe-route-combine.md) - [Operator Doc Template](../contributing/operator-doc-template.md) diff --git a/docs/operators/qwen3-next-moe-route-combine.md b/docs/operators/qwen3-next-moe-route-combine.md new file mode 100644 index 000000000..ed11301a0 --- /dev/null +++ b/docs/operators/qwen3-next-moe-route-combine.md @@ -0,0 +1,137 @@ +# Qwen3-Next MoE route / combine contract + +## Summary + +Qwen3-Next's sparse MoE block routes every token to 10 of 512 experts (expert +width 512, TP4-local width 128) and adds a gated shared expert. RFC #428 row +`moe_route_combine_contract` asks for a routed MoE whose output for a token is a +pure function of that token: the same bits whatever else is in the batch, in +training replay and in rollout. This page states the contract and how +`rl_engine.integrations.qwen3_next_forward.shared_moe` meets it. + +Upstream references: `transformers` `Qwen3NextSparseMoeBlock` (5.17.0) and vLLM +0.30.0 `fused_topk` + `fused_experts`. + +## Entry Point + +```python +from rl_engine.integrations.qwen3_next_forward import shared_moe, stable_top10_routes +from rl_engine.integrations.qwen3_next_tp_blocks import TP4MoE + +routed, routes = shared_moe(x, router_weight, gate_up, down) # TP-local, not reduced +block = TP4MoE(group=tp_group, device="cuda") # routed + shared, reduced +block.load_hf_weights(hf_layer_mlp_weights) +y = block(hidden) +``` + +`TRITON_F32_DEFAULT=ieee` must be set before the process starts: the FP32 router +GEMM refuses to run on TF32 Triton dots. + +## Contract + +| Stage | Order and dtype | Atomics | +| --- | --- | --- | +| Router | BF16 `x`, `W` upcast to FP32; one pinned vLLM batch-invariant GEMM (IEEE FP32) | none | +| Softmax | max subtraction, `exp`, row sum by a fixed pairwise tree (`fixed_order_row_sum`) | none | +| Selection | `argsort(logits, descending, stable)[:, :10]`: score descending, equal scores to the lower expert id | none | +| Weights | the ten selected FP32 probabilities divided by their fixed-tree sum | none | +| Experts | per (token, route) row: `gate_up` GEMM (BF16 in, FP32 accumulate, BF16 out), SwiGLU in FP32, BF16 cast, `down` GEMM | none: one writer per row | +| Combine | `out = e0*w0`, then `out += e_k*w_k` for k = 1..9 in route order, FP32; one BF16 cast | none | +| Shared expert (TP4 block) | `routed + shared * sigmoid(gate)` in BF16, then one TP all-reduce | collective as configured | + +Payload dtype between stages: BF16 expert outputs, FP32 route weights, BF16 +block output. The expert GEMMs are vLLM 0.30.0's `fused_moe` Triton kernel with +the tile vLLM itself uses under `VLLM_BATCH_INVARIANT=1` +(`BLOCK_SIZE_M/N/K = 64/64/32`, `GROUP_SIZE_M = 8`, `SPLIT_K = 1`), passed +explicitly so no environment variable, tuned-config file or token count can +change it. The routed weight is *not* multiplied inside the kernel and the +kernel does not sum over routes; that stays in the combine above. + +Fail-closed checks: CUDA tensors only (no CPU fallback, no ROCm), BF16 weights of +the exact `[512, 2*I, H]` / `[512, H, I]` shapes, finite FP32 router logits, +vLLM exactly 0.30.0, `VLLM_TRITON_USE_TD` off (the tensor-descriptor path is a +different instruction stream), and IEEE Triton FP32. + +### Backward + +`_RoutedExperts.backward` recomputes the `[gate, up]` projection with the same +grouped kernel, then visits experts in ascending id. Each expert's `dgate_up` +and `ddown` slice is one pinned GEMM written once into a dense buffer; `dx` is +accumulated per token in ascending expert order (a token's ten experts are +distinct, so each launch has unique rows). Router-weight gradients flow through +the selected probabilities; the indices are discrete. + +## Reuse decision + +| Implementation | Routes BI | Output BI | Backward | Why not reused as is | +| --- | --- | --- | --- | --- | +| vLLM `fused_topk` + `fused_experts`, `VLLM_BATCH_INVARIANT=0` | no | no | none | tuned configs and the BF16 router GEMM depend on the token count | +| vLLM, `VLLM_BATCH_INVARIANT=1` | yes | yes | none | no VJP for training; BF16 router logits (Qwen3-Next and VIME route in FP32); routed weight applied in the expert GEMM epilogue on the BF16 output, then routes summed by `moe_sum` | +| HF `Qwen3NextExperts` (eager) | yes | yes | autograd | `dx`/`dW` change with batch size (cuBLAS shape heuristics); BF16 router; `index_add_` combine in BF16 | +| FlashInfer `cutlass_fused_moe` | (torch routing) | no | none | output changes with batch size; no VJP | +| SGLang, Megatron-core, Transformer Engine | not measured | not measured | - | not installable next to the pinned vLLM 0.30.0 / torch 2.13 runtime | + +What RL-Kernel reuses: vLLM's batch-invariant GEMM for the router and the +backward, and vLLM's `fused_moe` Triton kernel for the forward expert GEMMs, +which is batch-invariant per route at the fixed tile. What it implements: the +FP32 fixed-order routing, the stable tie rule, the atomic-free FP32 combine, the +deterministic backward and the TP4 boundaries. The grouped kernel's per-route +output is bitwise equal to the per-expert pinned GEMM loop it replaced +(`tests/check_qwen3_next_forward.py::test_grouped_*`), so this is a speed change +with no change in bits. + +## Results + +Measured on B200 with `scripts/qwen3_next_moe_prior_art.py` and the TP4 gate +`scripts/qwen3_next_tp_moe_check.py`; the reports, the figure and the exact +commands are in +[`docs/usage/evidence/qwen3-next-moe-route-b200/`](../usage/evidence/qwen3-next-moe-route-b200/README.md). + +![Qwen3-Next routed MoE prior art](../usage/evidence/qwen3-next-moe-route-b200/figure.png) + +TP1 shape (H=2048, 512 experts, top-10, width 512), random weights, BF16: + +| | RL-Kernel `shared_moe` | vLLM BI=1 | vLLM BI=0 | FlashInfer CUTLASS | HF eager | +| --- | --- | --- | --- | --- | --- | +| routes / output BI (16-1024 tokens) | **yes / yes** | yes / yes | no / no (256+) | no / no (256+) | yes / yes | +| dx / dW BI | **yes / yes** | no backward | no backward | no backward | no / no (1024) | +| rel. L2 error vs FP64 | **3.9e-3** | 7.0e-2 | 7.0e-2 | 7.0e-2 | 7.0e-2 | +| tokens routed unlike FP64 (of 256) | **0** | 11 | 11 | 11 | 11 | +| forward, 1 / 64 / 1024 / 4096 tokens (ms) | 1.38 / 1.71 / 2.05 / 3.05 | 0.37 / 0.66 / 0.88 / 1.06 | 0.36 / 0.65 / 0.87 / 1.06 | 0.34 / 0.67 / 0.85 / 1.08 | 2.0 / 61 / 89 / 89 | +| forward + backward, 64 / 1024 tokens (ms) | 112 / 166 | - | - | - | 878 / 1283 | + +* The accuracy gap is the router: every other candidate computes BF16 router + logits, and 11 of 256 tokens then select a different expert set than FP64 + routing does. RL-Kernel routes in FP32 and selects the same experts. +* RL-Kernel's forward is 2-4x slower than vLLM's. About 0.5 ms of it, at any + token count, is the FP32 IEEE router GEMM, which is part of the contract. + The expert GEMMs themselves run in vLLM's kernel. The per-expert GEMM loop + they replace (same bits) took 47 / 66 / 71 ms at 64 / 1024 / 4096 tokens in + a local B200 run of the same runner; that run is not part of this evidence. +* The backward is still a per-expert loop of pinned GEMMs (512 experts x 4 + GEMMs) and dominates a training step's MoE time. + +TP4 gate on the real layer-0 weights (`tp4-moe/rank-*.json`): all twelve cases +pass on all four ranks, including the round trip of all 512 experts, identical +routes on every rank, full == chunked and reordered batches at 8-1024 tokens, +and identical replicated router gradients. The TP4 block forward (routed + +shared expert + all-reduce) takes 1.9-2.4 ms at 8-1024 tokens. + +## Tests + +| File | Device | Covers | +| --- | --- | --- | +| `tests/test_qwen3_next_forward_contract.py` | CPU | CPU rejection, vLLM pin, fixed-order sum/softmax row independence | +| `tests/test_qwen3_next_tp_blocks.py` | CPU | HF shard/assemble round trips, replica drift rejection, TP4 parameter ownership | +| `tests/test_tensor_identity.py` | CPU | raw-bit identity (signed zero, NaN/Inf, dtype) | +| `tests/check_qwen3_next_forward.py` | CUDA + vLLM | GEMM batch/chunk/reorder, route ties, combine order, MoE VJP vs FP64, route and output batch invariance, grouped == per-expert bitwise, fail-closed TD path | +| `scripts/qwen3_next_tp_moe_check.py` | 4 x CUDA | real layer-0 weights: HF round trip, replicated routes, chunk/reorder, training forward, gradients | + +The `check_` file imports vLLM, so it runs in the `Qwen3-Next-provider-GPU` +workflow rather than the default collection. + +## Scope + +TP4 with EP1 (all 512 experts on every rank) on CUDA B200. ROCm, EP > 1 and +other TP sizes are separate claims. Model-level parity uses this block but is +the `full_model_chain` row. diff --git a/docs/usage/evidence/qwen3-next-moe-route-b200/README.md b/docs/usage/evidence/qwen3-next-moe-route-b200/README.md new file mode 100644 index 000000000..52f528486 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-moe-route-b200/README.md @@ -0,0 +1,34 @@ +# Qwen3-Next routed MoE: prior art and TP4 gate (B200) + +Measured at commit `2e950f3` from a clean clone (`tracked_tree_dirty: false` in +every file), with that clone's own `rl_engine._C`, on one node with four B200 +GPUs (driver 580.126.20), torch 2.13.0+cu130, vLLM 0.30.0, Triton 3.7.1, +transformers 5.17.0, FlashInfer 0.6.18.post1, NCCL 2.29.7. + +| File | Produced by | +| --- | --- | +| `report.json` | `TRITON_F32_DEFAULT=ieee python scripts/qwen3_next_moe_prior_art.py --out report.json` (one GPU) | +| `figure.png` | `python scripts/plot_qwen3_next_moe_prior_art.py report.json` | +| `tp4-moe/rank-{0..3}.json` | `TRITON_F32_DEFAULT=ieee torchrun --nproc-per-node 4 scripts/qwen3_next_tp_moe_check.py --checkpoint --output tp4-moe` | + +The checkpoint is the official `Qwen/Qwen3-Next-80B-A3B-Instruct` revision +`9c7f2fbe84465e40164a94cc16cd30b6999b0cc7`; the TP4 gate reads layer 0's MoE. + +In the same job, `TRITON_F32_DEFAULT=ieee python -m pytest -q +tests/check_qwen3_next_forward.py tests/test_tensor_identity.py +tests/test_qwen3_next_forward_contract.py tests/test_qwen3_next_tp_blocks.py` +passed (65 tests). `tests/test_framework_operator_integrations.py` was collected +into that same process and failed, as it must once a `check_` file has imported +vLLM; run in its own process, as CI does, it passes. + +## Reading the report + +* Batch invariance: 8 probe tokens computed alone, and placed first and last in + batches of 16, 64, 256 and 1024 tokens; `true` means bitwise equal everywhere. + `dweight_zero_rows_bitwise` appends rows whose output gradient is zero. +* Accuracy: 256 tokens against the HF formula evaluated in FP64 with FP64 + routing; `tokens_with_different_expert_set` counts tokens whose ten selected + experts differ from the FP64 selection. +* Latency: CUDA-event medians, candidates interleaved with the order reversed + every iteration. Weights are random (scale 0.02), shape H=2048, 512 experts, + top-10, expert width 512 (TP1). diff --git a/docs/usage/evidence/qwen3-next-moe-route-b200/figure.png b/docs/usage/evidence/qwen3-next-moe-route-b200/figure.png new file mode 100644 index 0000000000000000000000000000000000000000..f4515650768420573d93ab951431906f2081e07a GIT binary patch literal 232121 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 z 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%0Aa zvYElhWr};&=PmcD$^w^8sq4EDON0@rpTsRVE`qIAZg}BxCyPDAz2WMLiC^&S$@067 zKA|V6&vm*ghvevjM|3>shR{QMQHy(*kH^D|z1nrI&lCHyO$Iri3eDi5S4Ij9IDUBT z9eJMetDjKI&pE}J9@`wbDXTAzL<_ZJZpNafb!E?fN6qFMwW-XlE!mjPR-CuQj6>95S`l%CLkYGNexMz9__X<=^zhpkdWhQPN5T1*Q$&2?KSszb(%A{k&9`m+LnWByD zws9@R5vF@1&yC%lXS6lvNe5+aVa{m7o@rW^D_wv1$w4v$hmS$emSNmP$vrsHzcb|! z8`-a4{p&k|@8ae}WWTL-e2-W98gu?5O! zdT5qbZRcwcUL?(I9~^lGW)Q#DCN_ciHSLYpa--<(^DB%zY+p}QsFB)7JM!QccObu zL8gEX_ZAw9vZ^X9C*dPvudsQCf zXks6}{rHbutuk4T!de(Ef)Az%32xOR+>V`$rgN`^MM(JO=pmxrx$s`m7X)JM!FcRE zu~ks0?lUtxcB`VBPhw1i3|wW4MGy~hMGH?sQRWpGgHb7Mk=f<#`}3a*63(h4=I6JA z;zQh1u`+^?`=-VM_heWc$}dKYm0~yRWt@8kTE(wwhNDl?GpF{QJ^9vq(YkyRN1cMh zrE+~(7bsF(gZkdc1@w$y15tpW_74hEa7b3Fr`qMAV^4O5JO|#+@{p zqo|YZF(aU(nrZwnxd^Cu|N7$p{dZX^onJqn^|kcFQFp~}Nt*J{EZsv*eyr?F{Ee3= zzErr!$A21!bZQScUpvlsxo^9Si-?H;eI=ESx&E@yakmcMZPm%!%>Gp?=YP_TQQA19>s;j1BB4^Q;cBCD=T zV+Zi*tZtwPkVzk(I6O;HtQxSD2V<6-T#hLHHD>8tBIrhBv{xFFZW*FVdKzut$h>ZA z@NmA0Cy@k)PyL^1vltCjg#T@daJ(5|K}|_->_Pr^t6TH!Rx(#X%;zr~V|DMzI(_Qh z;Sjb#eP-SFI>=@RA08QU1Ha;S!_8FcZqh3aTa9|{cbET~VEUgVx#;z-9j4;;&vEM} z^NVPb#WxCk7lIsop27FE`t6m&M|q)F25huf8_6S{ycQA8o2e&&jq<<$`sdx#``G#Y z$-QdAUyLOaMl4!Gm;B!cuZ~eD83)_UJS+;C72~T{O>@r=q&eI5NPo|tu-#)Qc4Kzz zf9>D0+SttA8^OQHJ~g0!6Iy$Yhl{ZlWF+GwESSDSYYX{p`9IGO`gjaH>bDKfX@cLns71Mb^gCL@1a!s;g|H002$n&6DVWt4*0KU?jW{vs-`nxu|8VEK5&O(&Qaoq9Efu4grf1x~eB|NYZqHXI z9Rm%0Iqc;UBVXaJ__zSB$~H0a>cQTDpsTThXwjOS0~EGNd3YF?$fqbGID;o|;0Bg8 z|9pzjH3=Mv^2|Ohn>{O2s3@_%|5=47Eg|K3?dmtRM^_a6ufciqa7vDx=pE#l zbLSq0ZK+-l2p-_f8ThV1Axqma10~s?X#cn%Aw`p6B`UIX>=uces=|#tGV$VSwHUG% zrP89khV_N4{)V?3>Oj&#Ql8Sy5AZyE&jA4{g40<^9n`)CDpBDwGaiKgepzKDQ7)x~oE}i-)5?{9j_{ULgva z$JYq$a$5f6W?O7b+YK`;YPA}%(Ia1}H0wM1{?T=WPUlu=Hbb>1AsSnV2N zN)ZS!wujnqdeY4u6ESgu$Nt*^hMki$kE%XgN4!*?*LaXpO`!}PQwRG!UsZ*lP(JXO z*;>PZO6Uz&V#Y*npL>M_b)8jBanYEUpH1)f)j!C4Bkcvy1Ndn4?@(SkZsuP@K>iSUd3HS`;u2vFN7ti;CkwVIbZX zDg&-;vj7c;&jh*~Kf|pLdscocysC4^YTo&9G5L)E=QAvIhvfl;`?$%~Jk5&F`zBbt zBzD3U-9s|fA`(eGhO#=`OsMuQxV!%f`y$&NK~c~2pBp9;ejKtffmA&}1*l`;E?83l zzmy9(%0WuHKvsuXNBIo19+YfscRqYT0kc#y?|bFR^36xNITK7%q0mHomL!u5I?qi; zZ{JN;Fh=;172W~v7C{}lJq9HXRt<7U+X%~gIT~rCoXzX|TX&#p18b?C=K9z7=Xd`a zg=zwWh!=Kt1oHH3EG&J!6_#@Q&a>^fo)Kx`!NFgUbV3-(1Xvo9aja2$`c=2%_ZMb( ztA)CI)Bw;!1z#rMD}$Ebp=JvY1`QV9kU5`Mm4a_DFLmuUF2b31zu|)`r^7ZvEB}o* zuu-hL1BBwMWTj3kxfv5-?mnYfpb@6gVdS$d&AR>9uLd9_!^|!TxMUmF`GryorM>1c zg@yyUVy^lv|CSrk>%Y&TiKx8(XK8+({IO)9yL&@5CLt2*?sj(Zi2tl!#e3E9E>VC; zYI-U@=7$KMH$3)ln?BkeABT3MAcnN_-*v@xZ-e#3S0KtG8iF7AAcsVOtqfe4onOV; zfV|qCDAxq)3lS-4f-gE)518}>o=hnkF?&kx2-`=PK7IJ2qH() zzbfTV9zzWmxIOlt0s~t?RR}|zLV(WW;#0(#Dlf7TaFw2P)Tf6z4uJVd|Fy&(Km)lE zxm*(YYkT&CBS2$&J2u?NN)x51hdip-Bxyh z5ddLQI78|UAoQQOT^zmGTwASh(eF<9(5WXB&n>H5cm~zv4s9?~_Pib-7U$NT@CG^H ze1q(wl2z*}siv!j5dK?x`uwHkJ*(3anOKS1x?z)$>+BSn;Naj>Bzv`qS8L z2@$;6yk^SB69`**W7J#3KE$@M&*i^lzqpOVxBQ=l6US|f3tCm$!=0bR>c8@x|Hrn( zo(12BXUp2Gs>KM2=QUHxVszh%hPsNRzAKjWIk4I?ya5&0|9|N+$hjtCOSRb{PFR?7`_K(M1%JpR9aPg z>x5pu)c;jbU@?$O0=(+dk5R!6PH`cg0?l^ylu9j-jRGhq_7BOhN_{lJ4%pWnEinwEir2*Jez z#K$!R_-tFP;${wIH0t3^Z*0IDYa1BAhoOgzt}MM`q7_3!8QMENE0{iS@Nj3LLks$z zw@- zb@1BDa&q^V!lHvesB1HxotxXz-9be$bmGflCxIbl%n4S28Ywdn03B&5K9rO=;K$C9 zfZJ!dHwKL?2N**;rk9qso+`mOkd@U9FiT*x;e+=9=nE*o2r@>dAV>9!bRR$fik%5# znW*!&@{GskEI54kz)`^L-k33VJcQ3VsTEqSV$E7!J|_=YDDNsXT}_f1PGpLa)O)C2 zjZ({x^+~l8XTO=%H)jY}%kYm~Ee)lU@_#BOT#yEFR%P6o-`J4bX^}^O6lHIzI|Vj1 z9B9(xZ*F~mnqErKn7JmiA1bLyQE{3H+a&oLu*Pof7?)A1x3U zr4_GtZK#1khZ8CPjUPXM#vC7W0*YLsLorvDwkZFJ-NEXe&!0c<(96EocZ_Dy9jUbD z0ewqUY^+>n$om)84<0;#f4#5u>t=vR6M%ldDc0(JVZKl@G&EGNvk6u-FGp$HD@=Wu zaeMceIbAP(czAdizjt>-f0G+R#;%`U~u2$_L<|O~u9*uGgss zT#|nMAICS`a#Y&)x864n3`kU;O@BvRxpKI>Q7&M0w0YldWBgVF5SmLdq=Y_xX#ktT z>1j03v47+#H`mtI7BVqG!bg&XS{b9MNBGwoy{*p*_3prgZ&XYS;AP*`qGp{QZL(M| zO1tdu=mTY-$hKojI&UvUy~aUfjFFrB6Sy3}b%6eC>it#tqQRfmOdVV2yGNx9=LsH6 z>;0T-4cw+xm58l)zdnp}R&GX3$A$4A97ilIq$|F9X6>lNV{5UV1NZDnl-Yz+k=7qv zcuX)zm~Pm=SYkLv3dVi4;E5iPnwnu*RZW;=UjKo+)n!hEyd#29Yy7y|HbkbsuP=&g zk47wfe{tgI1Vv^f9}^D4xy|@7{OAjGz zh5RM=ckWn?1ywIBSF_2Q7w{A{G^i}BtviY~;(5v)Ap$BZD|2uRZ}{~Keo(pj)FP;> z@R>C3VF$)#f4YVyFugixjMP7pki;^S*MsW~_yPi)B{(Vy;6pvAzkmN8wS!r3 z3K)R0w#NDy$&}AAv9fnsZN0>Pv^AAsv%)e;|9Aug6LS_QNW-I}ud~9+r7p|OCT3y0 z7DDNlfaVG${odH`plNaWf?$FCS%w(D;*6RV9K}uQq?&M^erG-Px`h6Un=WnOkOiWB1 z)^c;Q8?pwCKs+Yq;DFlI)fLA0hI`B_XPh+ucJkZtT4%IJj~*RvOfz-W zFkoCD&A{-ucwA9eM_5ZRd2)At{viOV{m`*n+ee~5-EpN;n)I_}xv|YHEi-d+%pL3_ z_dCekavFdC{_^eHt9$qE8II-gf#kR^4-OB|RJF`Bp&>sBJ-wJS-`!XpjqvvFe9TpO zHn1qtKiVAYfy3qMZ%4vUD za?ofHMY&Ro$bNHNZ~j}aG<{Kef!3eb1iunnhoxKJ?Mn=P15`R3d1RsW$GC9Rg-~Is zl-u0|GL}f%Yn;0d0id*JF*&B)*rEX_<^1SiHrGX+74U6b&gog-%`SQQ@HO_f`+@p$ z=hVaT_(U;%Y&ZcTX<$fClpbbR5Kh-%nIrY}L z(%{a{RXXl{l#1)lmT$*~#rB1iO9K2CN;_awPEgo^vvevqYwIbnYovqkmhZ077G2Nr1 zi8Nhy1V&4pePBkI#rSvrsI^?R-F+Yq=W@hvUYw&yM6-Cq@nsYV+wL=%ZpA?6wo=mB zv4cs0DP^M0051-A&ku8!}fpNxY4ts(}iVV8jK{G05YYPe?S5J?S#Kn}92SFF_ z9f8!p??yw7fIJFjfM6Boz8(CjtE{XHb6zj{(>v)@io(k3`JC;v^z;CWJyFu{KzOvD z3PjEIu_Ng(7~e4b{Gwu(m2R`JvAW`_2`-LNH5VJsB`T|_$z|J3W(>T)eGm03tF6QH zN{g9$Eqr{oxV(wsgN5JZMPMu}8fK2PO|%5TY-;WI`S(65EFxYVPTikjpeh4pOQQCA z2A+k*tNgNPOTK-wC$!znTVto#?CfPA+>zq(b^=REF6YIkm+K>Gk?vWd{UAOki{o|# zzwF7ST&o3?3b#wrrS41d?u0EPJeGiffR*vIM{*ewi)VlKDj0LLZrdx*Y|4hO3 z_5er*a!Xg(Z!yBP<*>g^0cuQczoxuAvx+Lc^KEgYlpnykB4R)Lr&Mm;Lw}a`y0@^u zpFVLgYiN4CULQ=4loD`dit!4z$l$tO9;^;5W66z;<&lhG*I$c}EODwfjli~EpD0IT zWn~4a>Nh?@$(W~0^X+(laL4?cm6CNtYnv@Db7M2*+m&KnFlEX$u7Wx1&pOx3p7Jfk z#;&ig#pHYElEd!_#B9dJx*bzzr(4ky`mftQ1qb7>84b)H@1&HN4r!>}IRxjoii#?@ z{Ek>n11v3U$Z40~Z=#7HFKVXRFfRwQ`=>q)?z!WXStK`c|aKmRzBcw!9v}NA4RGUJi4jf1MS7Z}F1N@ye83?&$Bm zy}_UE6z84Tg7*({1UfhO@j}PxS9$shKr%sDV6lU#^UvYf%4iwTgytdog>4|4B~PcN zJy+qlcO91LkoaqGljDXHKV7Tk6D$(&JV}62J#aY)Fu~)ou6C`oT7Y^LAe|n7ZEK27 z`~HfjsYy$mD+yI?49XD8D= zB}KbTlo`T^B)7}D=H}+N5cIW&qyf-u7RG2yMoVO4-DA`yCnv*T(i@J(*|jzQ+}wCO zN5$RKnuUdNJ*sN!5W-47DyF4lm<-Szujoeli8Q6$g{fq4#cczghN!sQ5?z_T>(PV_ z%!F?5WlMlVBPanE{h6ro?%ZjS7C3(e&JC6p7V}`H0kGI8;KTQ4E17Q`f@uLvUW)*K z_)}~w2{0{|;1(XQwhx3U@B*`m>rh19b*T~b^$6d&{Q}ABEtO0RnV6_WKUm|?0ok9I z7jM@tU#e`%k2o&ZkQRReAWQMci-@dGmI}oV>!pfa{)BM|=U*oWgi!Sns4Sn6F+C=z}x|B>a~ZJLVzNGb1KBl(S1txaZXDcrJ#WJSb$!$#v(zrbWN{{v0A&ZtStS# z=f}|@J-x;KRWZ3=bBpE^}C@iJoJpLf1NkBj_UhgJNgEE*cEE>;F zB-#h>_Zfy*1pNzDRbp$s?o_?pQ5cUTaCSzsdQfas4gpk}fh=|{=2DuNll7mz7r?Kz zu(0^0a5;jE5FvIGej$Q;hbZ$6e7#a)Vwez4{3_}*m+5ik{d8w26CX>aNQX{PNRVYB z{p*}FJI4J!GOd!Ps{?!R1?la1YO8i$1&a zKcPB>R|H%~XXoXs48}cQDXbTNby|_UeEAYav|oZ3Xy!R3CqMrenBFZgjTL}V_tvhi zTkfzCfa)trz;OH~_V_j#S@(|sx0Qp~pxfPWq0=cc)Xx6)!=t(Tzz*hj_!fCL;_aAR&F`tZ6Pn`3{A`FU%_(7BSIZdH&JX=;8MNcDYD*fbpUtw^yxYz<)k4MB z{*;aF8bV1)3E|;MX0TP?&C0={-|UM$Ojr=PF?J3qb=V`#gg)J$1=^?V(71rMvL0l~ z_?T3=lV*~tF)<}i*zI?$K!K9W`&IGRw2sN2Ze5bY3 zLlSpS&j%3^5dgzkz3(PrgCC@UaWG;_9Pm-#cMhC&&#LUVME!87Y<}y1e(~e7c>m!8 zRyt-BR@QUO97N`-{KjQ5kHAPN)~)x?Ak8taRgf}&Bh?zBF#h5b0oC$_tLfP1weKS> zFZ548ug%Ofy&a!WXSt7OE3%&1&OJs=MYR&Z=kAwD2R{#z!e76B$z=DFC4-)%p{?yM zo*Z7h>FjLZBN@{(z>@0nT<`M1u6t%c!Vqz@tNpFy{dD--kR^zj<=&>_KMFI=esi?=$c<221_qu{G41=6u&bK0X({OANPO&Y z?@o75gr3Uk?>T#hrxC%8O1HA|CA;{l*h2r*VsaxTy7OI+(K=44(rVc}5vKkdTNQ7<^+d1oojIO(tU#;8IK5QxNbcG8}ehc^z(tWo!Ro8ry;ZI{5{kg_RXG zIr%gFH*leHx}H2G4iJfLMguK$gF02>m3zDnutqtkB~R3O7MNiTUELU4Q*xn4|9g{R zshVlEcX08;d@#UVep4sv?H~PF(mcyR9r*6)V-PBh0)rhuayyfNGKy_Tj{luUBJe3H z0G`-&2xPqsgWlxPdAV282qF$}*RPT` z(SCkpz9yekW4%QEztWVVI?pRpX=`d$U^FGW2&w4~d3^4BCVwBoh=rcUF*wBs@gZ zW2c7f+OKZr9mPYM7UM{@s8~GW-B(QMt$`lMMaNF$|?OfoP)*8Ld0#aT4_%^o`6e?uxUosWvkRRSt?ANGZn<@z&* z44rg;$Bm4PzB4leQw?qF!3&kc!&^}4T7B$R_IkxFeCRmAEx((y97?B2P+9mxpky|f zsTQa!P6*BauEG=_h+(liBtq1oo<{e2|G?S(Iox6nZ(6+h7Eiu!pk6mwn2d%&WtDDn zZEe%%aDjjyWF#dr36O`CYKM_0@`?Jdr(@Kdz4%5;}J!N~LCzm@q zI*Ln1mS4`x%2eeF#}k;e!;QphHNVX;)&lH#L&HqhH^3@TZwU_xk$?pS9Z&A|jE@mh zOOKhB%Dyh(i)(ZNmk4e@=7IdFXXds3{#b{HhfMeMcV-i~^G!|rAB8wNIjxqK78X)b zFRqjn1G5vpS(!931=C%_>yS5yh0%V8JzZ+5IUmyn7o-Z!xRZkeG$t{Q%@_&;H}%K5 zV;g=BdVWlN&osC5dB{=XgrU=w#VH`h7H0LxzJJH217KH~-Iu#WM0@0%2>5d>FJ9OmwB?qw_wtdl6IMbErGWLcFa!*Q6U2N z^*5F^9fR&PP;u#0%UoiANXF=mY8n|~$_Bq1Wp4lEmq`VXK}vSU;9co2e;kwE1tXNl zhK*aP@;6}mL8wLSy;Fy^J;TWyT)JWw+d^k&Sq7)SDo7!XP72xTUs-3(^C>b9r=eqJ z>}R&Ly5)>p9p5FtxA61S;%rz}qBEzUNKATOTvT)h0{$?%Qv#{36>I@z)d`fZuVke^ z-XdvloLVY2o8X=#IHjxS?SUiZrsR1}CSP zd!a^6kcoWnVm#-T789F=w1xY${Z+D*Xm2jNT6;N*o0)Ql=hsswjG)X+x)F_R-6{H3 zV5Ngkde0^g7gsdkx^*fgHO?cC5jiSVG7%mYWd8vE&X*(ZG1TU z%0Ta=2+hhGSv1=X(|! z71eh3ryjv^fZGAcjOD$_80lA6wcpAaG;AXDkXpe)c<=%JpV4|9@$s|x}qx$z@;6em$z$AjcC z5+WjP9UU*oR{8nw6qy{k9DLJ%WVDce37Bp563NTe#Xkbm8EI)a_wUDNpX*Z9cdKc1 zZTPo!D9_{jS605r>qc&A`tVO}67=D)?pGgrFDfVw8JJ}S5fka&CrqWetN*aCW|{3g zS&M9fX7wUBj--y_?;B3b#3W>`?8_G^pgVqqDevUoRM|Y2Ymh^Bfpoy&ND3{-v@aXy zN3+*XN4G#-pb@oax5hropIA%E@c8l0KK=K> zN0FsNp5ftaqJEaqUqs>Hgs}Vz84pnX2jMiTsHy_P!$*v7Y8qx=)c3D$utP=naDCEG zBqixh_2KAy7TlXq31a3bf4f`|{Oi*67S>|7E>x#2tnAXE*K}6-?miU4!;UiD;akP_ z^yG5dzYVm}CZqg=&dOfX_>2Xj@de zo>GH?VLG&MuK07cRJ_wY-rEi4dwTt4rq0j@L`OgNDgPP1G+uwH=lrYkKy$XEC)b(j zef%F*>!n|*;2Hs45-17&{9}DNJ3lWRTjrSEqghiyb9(jAYIol96F%K1&{#=Hbw!tf z`X^bWbMy>6fd7h#*8~P^`JUWPd)=Ipe_RRvKt%E&oyn*9~pKbtk04&+S^p*7uVDC%( z{9%S`dcHlB*Cp!I@bhjKoOQe|$3Y;iSsG@4V1|tyNSHT`Gzy0rGPqFpCCW^Kyal{Z zoRaD=`+;bTbmwalavQ}HiYq_c&x#8LeFG9!0f4#&pu=JE-21zT)y%4{uD(3U$Cvap z#b^WwR!AUT{W*JNp|-%Id33BFKq7*Bs{#0;Hn>*-OGpY|Qh%M4s3-+HI}{R}e|2{5 z?CmvmcL#=0iL>amovu&T`T%bs9Ve6FgbzN@gXmt7(w8}jR_ZsgL%FCzT zS2uK>b4SC|>{Fz_GO57(&$+qx?~mFihvX+pUEaF&#pPrK^~&MKLeKYem_pauntpbP;<>$( z`OQ>cORI4kCxz2#9{n!tAVt=U}GC(oH`y#9L*e@ z7$4_yun<7Q-h@g;!VwyFr)@RXQn$9Tv3Q~W=BXoB1Q@VeEdHXCO5}RspiHZ`NC1pm zf3Wp>yQ5yZ0@26p@_h5o+)FOo)rWR=cB5->-f?v>7nIw7RodbQ4VxEKKfd-F+~qsb zhFkWJ#XimYShdeYwH?$KKE5o}vf1h-dD)ubmq0)eQBhf$B9kg`8=~i~prj_1LMfaPr35DmheSlW*O}GbnDzJwD@B1n}r3hnD%?% ztY*~U?FRQ1^qV)ok2iW`4Q8!T;RrAl*HQ4z*h5xJ6okMG}u*-gi+_kP%t3OJn{VX?AWpB$33eKDe?*kcuXZ0rZc>aT@)|@btr%r`@#)XAqfC`J$N4aC-#paqlEek<>}ED)!Qkg zectr)yabh|fQ#!RdeTSDsMmZS03_w* z_6g-XBwtAy`5c6KWwyf1o>$_$3=FoR1jY&I*ZY+Xez>sK;M5R* z*1!)h8O3G&8|!EaO3*(7PCtM5oXP-RhWs~~52>j-V1^FbumAi ze7-{kA9~`~E{?SWq&%*q(mcBghM!)5;gpcLF-J(>)= zKvIEJP=h(OTU7E9q`ek}=qeL#mAp}RwJ%Ix>RhrD8EwjrutSiquWJ7syuyvcgL8iO$3K|@So@^ z$GMYGv2UgOzr8qk|O@#_wu%kt~DH%SH2doL}PvcYL(KB?q*Tp<(;3J7HqfmR0WzDBJ#! zx!2f@?98=-REycEU!mM&CJdID@-S-FH3Jt~rP9i~tLk@d;zd%O%}QU* zxt(#D>7G6;hU&Np(QhYUN}1KFio%V)LyZM!+{&2E}Nor%BC z_Soz8M?D=KiPKy0P_=M(Iv`1wr{62R1ghkcv6~>eD+JmYSXjEPUrYyb#}JPmor{%2 zRDfLj_(%IJF7AT9k&SS^L)8R@9OU9@uj^kI-KM+*Un)`!{=L+`OaWQ!O`Q?NBzc*E z&ft)Q7u)okAH6FxyH3JVbs9cJ)@!>`@F*PkVjf{(v(9wAa1zfJWU?}Mafu27!RIY4;1>(2crK*w;q!&+Iz?r6A z=R))<|EU!`{?7pcrDM9j{{9aDbfvGqB=N|Qx4s^H^Pr|_lm4MYN>K0$^r0ZcUkzx1 zKpJXgKL!UC^c{g%giXfZ+}@4>G6y)&Uczrc`U!$l>NN?+u<$cpb4RZ7?vBm4 zc{>J;hY@jImLK;Gd4w!%Y|f+=6cXz7kgkRF;mQIWwz439hQtPniu1>5rhs^Xn7@+v z2r1q9YyCPNfE`9iP!Q5!%F@be7Rr~*Tr3`E$T*K4~$$ne!_fqo!6QX_o%&s1zNF7B?f8k<6{BDCJb zo;B2|E6F^TfG7(*pKmiU<(rIER#gGm7%Zjkmvn%%1YG2pK~e^%GbeNkkw-Q(kt}!T zMNM~eA@{4czifghg0xjQES7>x3G75F4`&A8Z6IF-uA2QrO*q9MpehRBVH$&mOCS8c zSa@H4$rHGHK-v4TzFq*-T9AfBK@k+x|9CDg35q{{nz@Y-@f@;3lG*a*{uljdM{sXIPY7uM#_70=nx3u)7g8K_*g?ITy5~4JFc7xTp;TnIK{j6J8XFddzj5^V zBd2+#VJOK+eCYV+7iM$bP90z)JXl1Iw*#T|S9)C6-l{Zkw z$AK&>70jia#*UAVx6fXhLp}nW?8eF3%L2E{_n<3>?>H3%<3tLmrkCH!#tLu^1L zmrvm>lG2O+yK4%1!s?Q`Q;=UvCGfTbc)7F#8BKs6P#c(pLwf}A6&~~%T-8nrY@mSY z0QUP&V6%c?3#1uHn;@j|5upCAJ_8F62dK3GZZ`#XAt)yW5Xc)FX==H&6lpqMIl*7d z(O;z7VFhX#(;R>jPeZW)+Jum=tNFet&C@M;ZI+Y6mT1T^r!QvQli(=;^vszOq)cpdlk(Hr*GO!SaR@2JH z9Jm{UIZ+4s(qj%&D`Zb@LwTMmVmv|Ho$USb2gCk!C=-7Gy$gK!450VIJWCYVjDw%U zSM~c3cx&}Q9{wE2@yII#0k|`5Fo=Sx{vKFm02=KcG`KA7?e*adDKSbDpz4B@>lldH zAa|k;N~qv*IkupdPWX%*4vCGNb4>sM`**+Iic5a_p;kJZjTr0X0wD)oHnN23m0mCY z%1w>9&SXdL`yRIi?+TZ$+Cmc!`p1_72YV2|!TR@rZ3NaQDGodPhR@lEZvsJY8d{e3 z1m45@z=HyD8?u+*`XxS!`#^kS$sOES`f8n(5YV9UfXo>_DHM_;LBYsux1Le?rFE!W zD?PCtc3#v|Ll&@x`E9IOwyu`*rh4;*&ohu^(t}?bbh*=?(n<}St9jp-N-92}eI84u zRD3X(z(Oir)1|%Jdx7RS2~lZuL5~mA9^XM7Y45r@f(Xx*g}Q2&o0NV~T-N6W1h{V7 zCf5dFFT!O3(iV*mTS}9jH-&zTJSig4w>82%>L#VIm{QCm8<%o%colK}?X$cCfo+mk z22TPhV^q{KLBi{dEDX1Mg7Ol$>AGvPiusS()6OS-Q{^fn;AJYO+wYQmOlqzCDnL?? zpIGDR;jvHuj+2K6F52h?c7e0)s}Q6LC&^6D&I&?79Exxmz{LZ9!Z0Y?BW~ZjCjn4t zIPsf){kj2JG#DK;gU1%_>r`~)$}EGnhA^Bj?GOM$#|pM+2)tZRovZVet5=zs+b_J9 z^qj#R1OS*&(QlZTxDQ{5>5HG8u^j!7utRV`O-(&KHin0b3nmHTNF54fA48&>9mAS$ z-@g4acWoOE@?KCM!XE`{k-ok@Tr~hIoBF1Z9l;*VQvQjMNeb)%AdCTXID<%irSqo( z$oikDT@epWW%!u#uGJTCPQ*D>^!E?H_ zzV?iekPre)lvJ8VxF=v@1_f!dxH(nd3LYj=Zs|sR5BJ$+3BkFr8 zf8Tb3cVnPW0d)yhn|WQkn-s#oUx$WPIIkigPOP-Fpz-U)Q7L0%Xa3ROhDg4)wwD2DK3o#)Ice3~*g556I! zIUK|skZ6IoRN7(WVGXjI3W&QoNGRcQ<53!$U;0ZAD5bdckjV-UIzX22A)wpbGCm#$ z=X5_9DIt&s31ERz%i9_W%4S~(N5RX)9mGFKO*5DnBmJ4x)YM>+2!VDAo(-&(5QtO@ z0k?W`Bn?K<{QLPdNt4a=bsh@a2k4Aorz_d0^$X7zD# zK>-3847x`}8OYOzciAiuv5-FV_w&2xE`;3f@8lDDP(XtX;Ih_(O+~Y@jwe_n3Qd@n zw%{gflXC6WJYE6(lOhMaFS5uL`qwhePajAX&LbP{%Jt-_aMa;ww`7JT!p7E89EFtz z8Z+A2R3&-($BzTP^;l3gYCoY@xf5A-m3CF`YMOi^p`b5EpSa}_lWNJg$$l{|g}r;M zdN+bDejI}A3y$1OpdCX@)i3q7F*onNbevP23JStJ$+}!Au^3EEEO8$Pb*S`PwaUHZ)kbGBE6ZWdugOZEJ)C5as>c^WiH<#WhH7BR?QfYB9D+mXEGBZ9?ODa(*)~htq zl-b=wO7I9u#+ySTt>c1oRKQfAmK}~-*BMSQaM}MsopNPhFI4sd)=jJNwf51tRr$P5&DShgxFe!s#Ac%%Si@;$J-DnF3GD7(Tb1M#`PZTstQp7ErbM2I$b-?^N?>(9 zm0?U(RZXt3$qx?3ib_rpL++0X`@F;@CH~M@%PSR7EjyXdFQ(n^!HdkH^P?guQP}d~ zGyx7R^Y`!H;hKQD^b=NAm_fcxOq>-t%n8>B5|a%FBhqOds*-xmzBtHr1YlX?F(MNE zbDfVODecU8mqo5W$OPWNf6l?tT@sLzlG0@ilNI;0e+J3EW9RTIp%2F_Rn0BurKVoP zU9XhAz4W+z>F~vZE`!x45H@noxllcPxLn$9qGG0NAD~ydIbzIFUBQx<`LH;ktp;fxc(%-zye=SdGf;1HsDo zZ+VbU*Z$L9_Pruln%9e>ekWY`k z?9@cASSmaj?EBopfb=7C*+u~youSOQ5twL&KrPiZ9@Lhg6NGXlGFJg&?;iM3K^$if zPg@KwDB#_CTi)e{gbvZr@ZoASyQylr>1(;-3n~g4etv#Lj%w*A7SMLCMK4r)wZ>l-fMt)Hoj=bV1;K6w*eeEC`i)?$ohv2_aGiQ z&(J<$LPqxuFp%92Kg;&F>2Lvx1F`dS&Hlf)@VqzF>FY1J{h75ztRb?8^db4pP~HR& zc%}(vxPl?!pM#-j7-_oY4vF483ksXppFOvJHP~%kuuGG3^Zqlo179Q)J@vz=wbOHq z8{0I?u z44I0Akj%;$GE|b8GLs<*smvi6BNQTJOq3y+GSA_+p1SwkbMNnbfB*i@>)vzD>%`~t z9-e1Ed#|2F>6msSxywkoadFkV0!04j^6R@NSfW7-g1ZCGSb$jd?G*U_`QmW zz>`qqVq{1suD-Rxivj{e?SaOmy!oHGf!r6?;KW2XPB~=i9w_!%St+@>pBD==B;m|d z%D1=1#27gf6CRw#fOmEg;S;97VvtG|PUXI~obgrD!@a$yF-Hx_^LLlEVnvmeUO1dn zF=`RXq7>=|il;CmMr^)1GxBZqRv~Ycn2pIAl{gwF=d6)PLgb2ofjRGtXy?I02@UTL zxl}Veo&{ynGV$yj7DxymhFBt~Swn2Anr|W9txT20NF%>@)2kIqpvCd3OQ)kVG`_L{!BUXS#~leLU}V!-mb1% zukuV;?{gN*Hesv#7*7YzKn`m^bFIQr<9GLCKD|)$Lg(Vf9Xs4IGp&6`@qQJrO~HtD zm2@zV1ZbRzt1OVTu;KD@j$ZmJ5+THI<>`N;L3p@V9noLC5&($*_%7+OYbucEr>Bd? z_YPC`x1}4W4%}sU__(=gP$u#ChXYwv3o?0FU@P(-(>}$ml_MiVt9Ghh<))#r4SS?X z;w^No{e?!nVq$ZSB?q4Qr-202oxBobhW9YGwiaUx$%tU`|NO~lhq3q0{m!#vJ(x&# z7l~O0JU1h)uN5w2O?60C9-+2uDH4 z*8O_O>*eNupP9cSQ1S2z@S5__;BKeUe3zBvb($})ZHQB)ib?%p)$q?FERVh%|M`SV>8Vl->}MzQ+hP zWOgu7_Tw#>xr2en+j)6;O+RA@mQt398d-LbvqGa@R$m{0LW!hyrXpY^(Cg_|(%ifS zg%H8s2#WK$wY9UaFY(aiV{n6TSmq@g5ZMs{-%tynZB8D;onRLs=R031=Ss&ogV2S_ zUJFCnd7(~1ZC?+LBhs+FGH`DRde}mROqtO{SB$Sl{9wQa#%#!hfaY0bt)pNwg-n`@ zkV#3MJzIZXeBY1p;Lny1x2gfl@s%*sg;vn4_AwQ5g)Y3b9?S>=*GHyd-U7^#2DIps z%4PfW=bOAUGX;V8qX6mSxd8Ig-oEq4kEa=VKyV{O?feOH0QwdxB59}=vFcZ#lx!d+ z{(of6|EgHisapmWln}ehYG`UKI0h@95T}jDuBx`}xr5>-HpQo1WwaVJQ z$6&n6D9fo$sjSNb@+`5|rJXgOQB-W)G`9{SD{miJi}tVdJ9Qt+mz}zxS$;Ckeh~LHkw)fs)Yf9ICcX+cXlWxg@iNl*G^mS*u_i3s_ z(RK>`_n*s9j^hAZE)lrY{WolnzNLCqq?gggNPLd_ot?B#J2M3_#|(3@B26En z?6<&lfd7xLv^GpkY+IUMd7E_{;NKz5rJ4e&iru+4JLvdqRSKmTB9UFZ2wuZ~m)r`D?e^GA1hd z=iKbyNwN*6>mnWszl+@Lx0MMSN+WqjtPZ?+%QhYug(e6n?%m~9WLQj^JLa;K9?e_T zzmD9X37TYVO=Z!sh0#R}|C=lR4n*W{ohlFf1B)WN=2xyB>HYpqgRN9jzoqe0#k~!T z+)8clBXqK)y?vC!vg)72t!LVF-0Bh?yI%j-y7Aqf_65We=V=L9^A-{t&bj`z`2X{s z?!J>eVYLEJ?5&%4S@9d!I(l_oGu^evEF89F`wp^S2eRw?lXVZPSfx|d(6+sO>WuQI z1w2)s@hR>VFvaq6U*pHdCA?mDIQ;O9#ap}LxX#oi;@(0$*&fmT?X>yV7k0*tBNo68 zgaWF0iNwISBHFgthPstb-?M?xjd!J*gU78lDM$8{m$ zl?#*ERjDm|DG%Oq8Z(qR#jyT?`Iexkp7kOp&AEr%PK4R{lMY3NW;RM-2!FfBKljZW ziJbg^UIoJt=(K?o-jaEVzWe4~OI8&&sV9@p9;YRq>Iw5!#*?RP4_0&*9L{7u){^}!=3L^~!0&gs?C+xN|2$sXKFqF&Kv-NxhEcmHA8TMM zePGjdm|c7A886N|@yhfJ@xfFDTH1$k_ua3yY>3@0a$Q=bzGBebcz zrt1`yq&#Kix5>Kuev;+%@n!34c~Ykz%uyy8qwsuOFnB{lzhcsB-YnX+2X-;n-ICcK z@^)rL@yX)aSAlN|%+}^{H%J(o_@|_iYq`hvH|6@@9#U-F;(&ZbU*Y71r%Ep?eHL1` z9Da7_q>;rgDTVc6=XZWEQIpg$R5Y>Dc1!MgvZj>pn`Zog|Avh~8+}`2R@exNC_T0~ zsmvZv?RySi!@1?}z2<+te)mJc?0fg;j~NOnR+~}n-pC*s|0wD1vyZdUn(xoL?()(L z%dd`!w9(@I_%lby^Tk|6zpX{B98}Z(foF6~4tk{Vv6V>%Fl>IfIQ+`MUq|<4W%QzW z_}fr}PkY}p2)iy*I%{0@!sI|k`kPO!)B?upoy8|vHF&49_K8>EM)=tr(rWNBeYLT%6$zX-wD^th>K|^b6;7(LSl%gFf-8C8rb5T{bd;0F5?2zAQBC$x_EBHpj5A z#L<8z`9^U=eH{~T#aV~P``9*F>&)uyF|xiGJbzGeFZvJUjHKzl`4ykZvM7DsFTya~ zv~9QL^E;v>VSN1Y@6CMw*;VbT;devyxu$_kgR5*oVi`Zfp42_* z-nPM<{_UB#PwePZyTaxxCd=MXAY>PQ%E-v*PTB)HSIyGK&H7i3P6SEE9WnoI6l}_M zflJm(W zHJ+W~sghEy!E*<(LrM9X)m`KDpTy_o7p#SOqpeU}osm@ui0}`W=rp+M5!W}MsMKJ$ z_3knq9g~TdyAtKne+V>4We!9wetvgGr8&k}B~h9AR(Yp$4Q%F+;z%i@AP1T9N4 z4YP~s2&DCYzRL5eBf2jXm1d_qW%JoeU>9*NPSMc8QQD$E`XsJ!ysc0&mQ{9nA~Sve zLHzHW@xdqYhUbjWXvIruC7X_STYr-`impDBcr5PRBSo&drKE+W0Bh+zk~J>`oW`78 zPt3~jCO(pLwcWX0@!b7oZ?7t(DnF2Tyq`jP4_#dUd*_-(_1h=(0t+-_9MY>f9cKlG zqRp0`_?(E-xOc+iL{NK(p#?*-T(I)wJ{LgNZLc@VIGot9>3e*jE&CBQL&IplSa8ZG z@`V36oL+nJHk4D2DuQi9)4g3dQ`l#te)0w;W?waFIwN}d4X2~o{KaOc$KO9ml=qiu zkPj|g%^(fCviL0zLv>8T7o$BAnaZwy4-F01)-k*75q6~P`=-!vbsZfuk3?6hva6do zeZ1=e1cJB%pG_=r2TC(=#p-W3Rv&OQ^L->&keUCFfGkn9c)7E?xrDdfJblPpRwg>@ zL%MTAz?MMHiL=$4+`Ch0*p`kk#Yww{CDQg(*!E{)>Rz+Z5AFLTP`Zcs{PPL*LC>gq zQpR6CI!MjJNSjY6`)yU({snR4d5)#*n^)D?Q%naB@CzPN?YwG+oGgH0Zr!TiIT@Wu zgiP4sO{~RjECbz0JUkBFC~tl9<(2|1_7LxXwbuO=0^e@s=GyyVMCl7RL#WzkZ6ni% zhUri3Bz5`(DrJ&}4rF9WO!~7M7bHjAlx4lruvwLTMZyJV$6c~X?A2{7y_!mNe8Oad zUjOe6x~pSC?e%nA(k0z9KxXf{iUp3^-t+eO{jIiYdrHd-Mu2+gexZA!ro2NiBdtlz z%*Zf6j3wW;Z!h4ajs<@_x>GDOE-zoL3=E!XZXEUv(tS|8MxHEn<^L;cxw@Q9ZdEZ_ z+OEf(d6PZo({^1;uMne)Hx;hSZ1eisrY)oGMq+ZF^8dA(ka=X>DC>P1urb3#_ll8Z z{+lkoj4Xjmmw%^Ryhjpy_x~sO{QKV!-E(}73U+J_GJVKA?CamHM83qm_YBp4`~`5? z|9awiwMJ7+^hIesh5gDWRKh|P#`6_gCx3r_=ia|JKmP3v$;O;J_k4JZgUD1@zxYGi zeCLfEe*S@`b!#lQ&i{EP>pJ89`G8w@3)d!QYQOHU#GOur?f3PC1gEDi|LaTseR+Rf zXv(I4yqJIeoSlwxGv!}D`}^wu{7rNiq8JQfra%ScshG&w?f&~W-ex@cTQ~N9zD!dX zMPCf85C|a*i5p~SC{xICJ>jnZ$L!&+C-<+f(-a0D+Y5^yw4+i&K92^(Rex@2<>>0z z;x#0R{@>f`wA;UbKga}%%U9U?=>NRTt%-lLh56rK89Vil;r`E$or?PBEBo`c?>7E_ zKDb@~n1}qi;9c_nyfFVf+HQ}3j23_X&|UOzZAX9p)8C%M0}eVL$=JPvXoJ`#0J`zX zQzeB~bw(S`6rSGZ?&3Ayf*5u56q{M|(z{>ZG^e|XRfSfl)tz{kP^S9_^c+QhuO
6 zRyYkH6w*O!F*@iJ(yvH?i}lUOu+(;o+r59kFI4Yd~7QE8pQPgQ;hL7LwfES1!(Utp&gg!<{FXpa}uRtJIRZjLUD9k>)jE zt>ni5dt&N3uUxd4EIQu-(8U4q0R+F<#y}Xo3h&Z%%Lx;PA7#M|lEE*zA!xUj4&su) zrJ7q=@eHO~LC%3$fYGCnH*L1z6ec6293Zc zLvZ=!@Me$&&p^+t1wJ@<00J*g^(-Dp#a6%-6{)n*(~lHeFq0mV)JGtrDbQ8n&U*45 z;_EZhSY@tRFaR@{lTFX84qr4VrPY#C;6VlRfhP9y@bK`*=Qvk0ZbwhT9#PQ(;Kx*liW1;>LVdDgoHRBI4eraO6g}MVX0r$$Xi8Eq2RWgZWx_;(5$KPk(jn+0 zLvDcA>gwyC#(Q?0pVEUAOn3+uP0g>Zxgq-ES2el6aFiF+G9I_Z!kqP^>p$(FYrYD8 z5JLFnw+IXN&22}2n=t@!Fy3f+?>J;&a^%Z6JpY>W>;(3l4PLR@x#pqBjs194ct{jP zTh*F;08JiwPY;}dIwgi3#f|%U5fcuQt5wt^M68b3E!nDFX(lO z@V@2Xf%lTu2n63{JVQ7Q)u7V?15s<>2V@B6Txg^!gx>Eel#rCvF*A$mafXWnHlm?c z?(5ggJVLkNp9{AAk*pX!9i2{ds`lzF2X1j+NWOpneh~UR3YuG5D2XznF-5BeQyguf>mXWiVQWwD6Lp{lO#;To zJ_C)+U=g`??HYLRmnmn1xb#w+cOI4c1yO5jcRkqW1E3ToeYZ(nzPuA_30DG2Wd`#H z-7GP0(537GLXb)MFfJVOIs>haSLP*`(Vfc9Z{4rl?l`Tn^Qgjn{&agRT#ATz6>?1| zTgVk+n5PbSdTKBFx{Wd!TXR7NAFv&{j9ciwags^gDX%)eGuBTGQS$5XFqRP;(8pg` zci05{pvhgzve3A0Qf`JsOLtnZhdkiJ`v8tajohr`I+agldcS=;4k&wqt6|TcJ!uG-xOduHIXOAUJ1ee3 z>xN;*$&UH@HQV7U5tHJT9)TuI+Q!9Uqf5 zM1~G_-FxBBgyw~8%a>PRf{zh4Y35y$F6Wh$IT_%8_S$Ah z8a`4Jjllek-OF8LpbX+E)KjV`PwC3mMNiS-DV-n1;pp?f8zc$jBC*UME z(D3{;)FzXSTHxP{ijK8rnXY1}ZpLFjJKu_j0sUT|jGqRGE^-i%=3y8Quim6v)=Wrj zxbgQT`T6+hK>*Q87tSOue$QfNMB8+1Z;>yH2$Z5s0#~a(?&nrZXCum{LuPH4ak60Y zbH(M+y$p1?sUM%Sc|n=l51^6h3|gWxyRKrTr8c91=@@PbxBRKV*UwKMqMcUNeLOr{ zgsnKiFPOBwdVu)I%p(SgxnklIq^I!W7)XLvM+Bj(zQ9f8>A5$T(IJd6+kus)FKcr#0HpbfF=l& zg=Y~XS8uA%un@7KfF@1oM>FLM)ifARQDX_$Kn!HiQIKCfhov$;TE1he=!2DY<@?## zR`^J|oQT;eCbk`*y6IS72A%F86pAt!4~yuaJ=XmmzbdI8K7-IP)~J5XFd&+KUstQ; z_3ISr1ygYTCNwDw(&Oq5NVJLA48B84To{a!uH{c|>TsG*5_->c8LI$Kbu?}%2RfTL z>>TR+DWn1w;8bUEh8=+{3C}D3QjSIIBveKEmBIUX8=8Y)N?4!eI%=7V(SewyO7v7S zP&Zp|Po`*oWxgBlt#V9E<36}cyI*L?v376}g*-8gy#oH0;Sd;Y;TI)J-&3bnkUJrY zD5%(gplIxXd>OV)Xk>{#-c@lK!h7&TnQK?Dv9VpT-@dBr^}v_hLruvVU7)_+fM|r9 z866}}LvuK^Bk^)Jwbms4&+A*)*`pIWNY8rrz`KX7x(q`0Jn5)%%E5o&hr+b5gw zC5Zb16vu3MFu}*W1~9Q6Rxyv^nx_2xybn(3bsIP8e%z9d>|-O*)gmlVk^#sdGI3d_ z5;SmkI7U87u?eieEN<+9vX3z*`)Xrpph4{d<3;Vm%8i38ju==Z4&da+QNIN(nzhEc zAfH|QA|Y5I{R}u9szUjei;Ih62*qmVlQuBKD8XPsD1a&JoXsx0P>pFa!(jza$kxm6 z6DW}V6KglHTO&Bo6hZf4*z{AM%+yT7`g_nv7zKPnSgOXmoa_{FUKGVni-qEu+9w5~ z3o@7;#hQboBkVM`AwH3-BrGakF=;#Cmv>hJ!R?`qi5S?=?cIIW5f9 zLMjO%`8x;@=$TKRuL$1fh1OU6^710Q7xip2b8!0kS+3?amJr=yMewMm-hzZzA?czZ zeCv$xK+$oywcyv-*`Wa#O6l3xU@e5bDX*@o@`e=65+P;Hw!_CDbP({7{afkuCzv1O z0+paC0JBCt5W-+z`HVhs;$uql?8XrX`JpH(Yj2N&s42~=PZ1aD9ugArM)zfQHe3@* zCk9&rNCJ(Kb9N_;AM^vMF1_!I~xFs-Wmr2NE3y$%4u&m^4#yNT}&(@p>P0=6) zm&+J@FtuOpyLawLqiaFflZnE9ert(T8f_zjwmdZt!64&#eubC;GhJPv(+*{q4IlZL zJFJ+dBLOu!?rardSvlk)I0LtIz-ADBz3(`p9ZukB^?k{mKC4h_hFy+S%LR!rA5KA{ zDuGO+1;g4Atly7i_e(pt6D z%akOi$NY9=0_Ko`KsP9f4;6^?&3kl2L?i=y8hm{fgrG#ifLQ(rZ=Kq&M-4HyE2BmX z?T8nNk`Vt;NWOFg+Lj`S5Z$1chMJOS4ryp;kbdZoY(dNPED|fIF9Z;XpP-u+JvO}# z6Sb%Dadt=;~Bh`!AG42QTx&(7u&q@AYa2eaC{hIEz5+I8;xGt zI1FWA6Ms&}u93Vfs2Pat$%UF;2M=mupve!PsgP@9inJcSzgI9G8`cU1=X4;o;liW7 zjN^Cpw!`J}g_0R`jU_F&E0FR2* z%m>}^Gm6-AM3ItlRW_zH0Ob=o2?UML$2UkoWJLl!l3_YYN!R&71?a6I!JsW%S`>lU zr3ckySiA9RLu@jc@Pi&-zh2I_hDa2->;dCO9vrE3tgjOw^e0p8Au=t7s0Kd+1H!1j zPebpFkTde98w!M2P-YX zdd~`U43Lfnlq!kq9@ksXj_Hx(h9qX#<3uTlnt^vP6)&(m0LUv`8&WefC1TDo*zTZe z5E7S=kU$ORnUiC8d-{RDKRCu^kWs5;;Z!n@kA6S_7&X-r(6{b1~W+PKkq=7T(Kk5J7N#JorPu z=@6Wcwk60#vK=|%O8P$g`!C`*#~^Gw1;<~Cy!^BJ;m+$B7~Wzrcs+l{H&;!1#EE{1{_z8eTJ(!qigfuk$m(!pgD?l~(CiMLBU=Ma9qlFK$uAZJN zge6dGm(|s!rn5|JfAm~(ibLxvT&f?Qdmf^i*alGk1QH4EwY9ili&J-LgW{T_CZ z1>7m2O(ZUa=;MQS-03`42_8o;ESY2? zg@cGKKom!h z9$t$_Jwb~#;p^**5D|jh^ZVRUPF_a_<xjr4J&Q1tRDTj5j~rMQp%!6kMXA@#{t2~wdlhUt{x2OZ8NGCatdNEuC|H={JQe%nuC zG%>!Ov~9$mo^t-Bkw3SV>->wA#~{i*V#hxocK&?wC5_8#@1hvvv;59$(wus`xmgt; zkU?|mdK|)44L43>HNgXpbQ>XvokgXH*3DF#q1Q`!g-gtzy~OxauPoSz+a#PS}FB%*FbElq*(HHz`3_xrXfDG8#e_LRZnCn{5CIsn!H4EdwHz825XU-D0HQRo}o{1+LdAG`CjY@ z>{; zcLuuveo~izw%N_Lo|atp45C>OuY_;>XkcqXuai3yt`GB!vkS~88Zr&vGW8C!g>>XXqo4HYyNLT)9amyE>E9Sdst z0qlr9>2~8seM0oq^ei@-blf`!A?tpIUAuSB^d)FfsAie$g;Sl! z=lz9(o#!yva*sMM**8bRUA7t zq-5-|QgGda1~F{q^&2)QHpk?R!L0LT5F_1Z6i~#pa~89VaIMj#4^G?d2?}c924)x& z^>kskr>!{}ez86oZMGm4OoyvDv6Nw#3B6TV=p3(fe{(!AcjQWeT`xm+>0>SPez;kV z<7gIrhvb7v*0grJDCgjPEATh~=5w%u&Q9OFg*VYu8F3^7$-!gC`8AOF-aYB&n`%3% z2>3+x)yNH$B7rHtqxS|z#`iFj+8Ae9-4gr zx-Vx=Cg8Ies>6qUvznOs18EZqpe8AflFOr046ng(;E5b)^I+sbfXAO%l$3s9YS|owb<{-hEIW{%$Z@F#c97fpCIh zOxNz-`~EBE9eV0D^X)SXYIWeQ7p^A)!+M-@2lT5iq5iCnIe8juWd&+Iny=Fxo3Gf* znzhYjw+kwsd!K;RiwZ>~oo=~P#nh0<==k#p-TAgQ-f?ar)CwulgH8z|SamS@R!)vs zbn1p3Q@UP9C(_w_bi+Pm+!esETY!d85xZ`wea?Y}M-~k;bGT_PF{;2%YQ0uFskNu& zivS)6+BHN`$LOHh8%h5?G&wRKc-?eTE;>^%{NOg0Xff};?(T`Yg%6{86Ix|I5af_& z);?32tJ;e591Y4TMFoC#K?@<~$qKRYLbD7-mCxUvU2@_iS=gaQBv&m3j=9IDbFhYy zf5bWh>^DW-hN()9GXSS%raoUY>?k;jYuL4afAym@4cKSEE#ZQ`8lnLyrE6;ejqgC9 zBefP9dIb$kn2=1$;piY02@1*{f_5I{tA&>lpz%#7?jD&(Zf^MHb>{Ku#99LY(%elc zT21>OirVo557!2oLO^$iU!&!4RlZlaI9K^7jq(>zB>VU0L6#&y#1BC+8mXD^wWPap z_4ch#E;NT7Hs3`MEU2^-a3K)etE7BExru`L2J5L%k>P^*{ZPaU{tyFPTLI(!%#;+( z{NLK&1D7ep7iV^NIE>Sqw!VzPMN`ZB=3Df5wmTAH^`+_O^EYcOZEWK4C(t~9e3Yg~ zT8V*?#R9q^U=W(;^uj}D2-ub|;?P1GzK~rrTSX(CM53d~kx2TG;sI*QM2Uu>vI_&I zOm4wtX*+y?X2#_gIIeBxQ6)`!aIB9(E(ruP!=#1Zr7V~gs|4Jd;%h5I(W6I6V>ITU zeKO8Q8{)myOo}VlLpwRci?JRp`8PMi08%FEmunW?WdH%BWd>oZ8U4crlfO^U0!K<< zQ%IiVnFWnj+=2&Sw9_1h&XuB7n-{6^Y~yL5L8$y{;ZfTtM>EvdSNcRMfYNq?bDU;V zKtKQ#%!l5U*f9m|MoTR>tT8kB9M=b$-dacbpe`-@qFUDJ6O#^alqA$4s4P*Q;yBJz)d1aT8f@_jnD5u9?}IV;{mZ zw;aB{4iy-B@i@wzFazZMUD}O_*aw>aqZ#l%MJAzz4sljciWCru!`1W*5V6x%RtITm z=ce~T^#}*8{X;^pp~&?)ok1arVv^nhV8mxx1eM5~zM=ePK8% zt(I4#yol!O=$Sv2;6nDP3+Yz`F0J3T?M3|*&Pv>39pE8E)Hkopqxp%Oir9ly*eN(2 zw1C9yCYNJB`ONBP+XFxV1CH%OO)26SXQDebs0KzfkZRR;z#XSu8D=X1Rv?_OC&oSq z;9b2JJYZNNVD;lND1fkp0$4(R{rc4%35bo_+`RU6A@zJFl-sJ=X8S-N#R6efP98jq zIWF+;zh*Ic&geXn9Plz<{uP>5Y9Avo34&2W!S*8-Y_MP-Y|Zp~`jiune`v84;;7;G!SR{ z?Sb$4>4n*nU>qoL5L5s}Dg_<_Lp&i6Suhp}BW)7syu>O62V4_% zR7%ci?zT2w4Js!$@T>4+(;7!WQcP6b14Qm3Cv7^q3|Ns*90kf9h(2nB85b1KbaJah9 zoV5>Ms|!2?spoHk4T)(zxD1yLB~;(Xk&VJ1c@s+5-G>i{qT>ND%_<~U)~yvs<(sgu zQnRz0VYzF2|oLGUm5V_7v<0fBRg#N>?_dAg2etB(Oua~l~FT|*06$1D{u`G$v2iA=ZPZc&=T8?k4De;=(gPSx6E?EFv1}*7F&Ia=| z&URgLdONjizedI3Li))@J)TO#!lg_ zRN3z9MCez5q#02sMqZ<)`4aP&BRj`+!PY7E<9L9vT2e<48c!UGmJeY!(1 z-viOwn#)bkpecDDq!_<9*Fd8y9>r$WZL{WD4(oGrv^JeL0js1bhKUy601yN4SO7lc z4}u=SgQUQqR0i^#;TYQY;n-yqtM9MmjP!&kk&ZmT2@mexT>-O|S56DUSX;|cf>%up z`+)fNW)a!6BYI3t?AD$rPcN^o=PB`+1z-pBC{FNiYu2nGQj9M*>Sq_{6P%s#=85?b z&QL{G$zMjT2qmaz&@SbMc+Y{<7R4C~ePqLtRvVho{0ZQ04O!PfI#!YF35V-5R37aVTXQUFR5b9{ z@MGi-uFo_M*&MZJ8lVP5#1$wV$BuOV()+D{JLPn-z`-t=TkERB>@`lD3WUl4DYNq^ ztsV|MJV~jCTUL?|JJMH&n1g=KLk8Y8!dOR8+mH#Ut$QUXBz>4&Q&M;lXJS#hQ+xG- z!cD*x0!iKuvj{9$()JXJR0J+Em+`@Hu=;d)RFoT92~^gC7fe^h`gej0#5r_tDic;X zL|%bIu2qlZE;t6hqihHAUH+AERrDn2>v1IP>Bs{ZJSW!Dk*J8ov0k5_6ad)6{nfw=5ZZHD;MB*&6Q%zJAOir1-e;!T%2m~aQHS8Df;uZj<9k5Y`xv08B0e_%Mp< zsH10*tdcAefW9s^F16Qbh_n`0(Ml~n7RXqUWayk+nHuw;2TId+h+(5m2QL?1S1f?R$%yo%AXI%%SNb3F{WV8vNu^|~4c`-gA* z+y*_v>{Qqu-gyBllUq}MXPDN$Ia*jVq5E#hc--#cp(R-;F2Ji>#t-0S0PWtx#pQ_& z%V$49BNIMx1g_;()2d@#?Q^>bNo#8ShT-aJ=;H^q2);#YbR0 zFu^Gp$}t^?v_RR03R}}bUvnAMmcwZ25(UyiOqmPLZkJxV8Gxx^gdRZnhK?+6onL1U z=u>kLY^Ojk6I2$3C?-@10F0O#Ui%e&`sm1Iyam6cbJ=DZraJA|yr|G?w;jH|QdhUD zSkyZN>e)x&yfA`ly?9{-@^*M_Rlo`k`3{SK{^ALo)Rqk)aI=DU4?2E_7LM@n$mqYG zITVBrMTC(!>wzp(G`f%xfP4z&?^%U{9}aO6QQQ+wOA9wp`h`n)1^+mjx|B||qi>D% zumkMuPn6u}=h}&eW+Yq3q^0exH=@HcKMP6%b}p`p```LVkVSs{YEAoVhD$!J_D zy4LH6`l7}n0vZA>PvdKVl+FczuyYwt9|5OKsJW-^Q(gerjgf>3j~X$)ss5-_;L zL_~(jKNUFVt3A-!4BCUB|JvHeLBAl!3tPPXOE0H4lhjMI439uzlX?N@5Ys`*Ngx@d zENnGY19=F!k0=i8C*Uec!hmO}H@98!BfMxICfwA#suD$~cy&6jw}$)4h3vg3Dr2;6 zVpyvlR=IE`105BBm`Au%YM&moaAO%8vNox(`VveE}|Hn#h9n3s%aYlpNe93 zqn2~zdu%Su#%n_LTt;FF&OQ4eF@Y=F(jI8lP2jNGLr^$8Uj@&^fM53uBq#;~?bmkH2YEtPb>tFzO;Px!`-X_;-7&lfa!p8lsQsSf9!La*wMdus zg)Ovo0A#e^+@WgqtVey?OYT!_=D|0ReuEu_OL6&A=<=%u){i_i0IJb30J6W;e&u^e z-*xCib&9?qw&=|}cA%BX?q6HiY|2=Bw4y50gJo6d+wd3SwC5d#u=5=$8;?ee-E1xEGpNm+B% zI333JWo;g{DjW^_Io={fRa=f~flzr!lqwItF>g-&h6SNA@3spf8;D%EN%uUayq-8Y zUg#eS-JsCV-lIpOeu-?hYl)80t!(DlvbY$ejge4DpE*Ht2O0_nVP)3CIMH-95;xfT z1QICxk3x0qX#B5N+22)w+q?e8?Jp4Z4V~+Wgq@O@%!FEqaku1ZNKE2jWD$r;*jWE4 zgI&mjOBbJgsyAQ!ncIgcCegrXGBB!Z>!HO`*d8*RcTaIe@eQQ_hTbf%b3WbQ;e2bV z5WoHH=TABK0MiLpUr;OSJ$P+cu~iR2uX`w4T>uCJPQ~}ot(>y3pi8>Q*luEy@;agG z*F;n;1U{gs!oXDMmU{M}o}&e|P*S{Wsc@?;3$%b>4@Sqv>ZHVuIxlV`mw}>*3{S(q z#zj7;#|uYkAmH@tFx;rBXm)rPLmPxIV{FvUn~;&IE1#M@p}x4-H*AU191L%|d6(AP z@&so&jZ7n49#6bR?v0fzo8blN48wq{F6B|16@LrB?cllD2hcG2+4`#vOonGjhKtWd zvG4%)BIC8EchsU(hYCgpa1TgbJsfff)f=6ion6Xd2PQ_;pG45x5l%XK#oZSArt)#tFU&=Ito5ObW0K`s9*SOy+Mi`k5i=VQ{spcbG$groC{-fe23tV z*(4zPgl@-!!?RO0)9;|wnUB_8Rcwf`aTeh6R!=c~O zQjZf^+z(b5*k;6w42Gb~T{!l>&dr5hvIIj2Eh4rT9QbL67!V796_TydH#9qt$u9@F zhVyI}GS{N_?>zvNr$VxYs@`~n*8>x&Uk+#9UvvYBB(H?jEYb$^ovEXXE1Q}^fCX9f zR-PlxY4tqY zQJLw1pHcIC?@f205=GNMgxgvdHB99LpJd6B0a_oh-U=F;Ui*h_{3sak0@br8YEB}L z0c-P7j#c%(BL&oW)Mugg<2-_M&SM8vv3qSC!yJSCW`=L7OJ zcTdkUNJW}Hf4`TT3x>4~=C`L(hH-T|Mn>T&jDch6z!`$m}m~I!wh+I^uzR;)D0Sm$@ zsc>d}!5p!g%QB%w)?6EQyBbd!=czexf+2obfh01|-f2u;a49M>Mj+&<6oMTq=lz=2 zYyNO=gKDGn=5XI4OW*U9f~#F+g|9Gp7EJm9yRjuUzA-9SH@A$dAB>m}naQAf%&erL zw~wxit3*?S0#H1>HJFhw7p!b~ZUiGIA`=Hduc<$ajgHde?$mf44CoMU>KBt7y5A`f zTnU+=0+2NnS6dTRBdJh3ASuLT#Yd<8qJ#%f3Ce;l8EVZh0mw*Zc%ljg4ZH#In+y;G zFq;{zBn!{={sDE;GnNvB6Q^rv=mY))lWDJHnc{hyjU;+O)Lsg?+!is1!$)t5Il7=U z5r64?4oip3LO8-c*?mYvM1%^qK6wne z{u~0%fXVfQ_Qz%@TuQ+$yi8%)wvD(1YA)+X7!Wu*P4ync7TI5La)BANUuI^e=0iNh zPPjBdDncK13vxXbBr4?D0FQ)|UBfd*XiWspUFjn!2DT!(XM*?b*Gki&;y(X^;t>?S zCLIM|zAE{M96r2m{rVWo8cc#9Y!m{NaR^A(P?U*Ve?}j7OK5=7iG9*Lsc%Z;bIO=&zuyo1xf!a5i4ED06 zV%)2^0*yQ1qa+OsIALnkY7PA~C@KI$p7kK0PIkB(fIYx)ipVe3{e zjL?LX6OH~0N?LX9FYeTKg5V4)Ay-t>MKhxt`6K(+*6p}eIcN*(SzOnO zqS8{8YYWanJEj}+-c>HteN02eW19)NrZ*CoaZDKDRCyLyEervg{nV$WZemnoF(}Feo;-Y#OU)Kd_ z>#Q1?n3!rYhx@fv-^DYv`P&~q-o+$rb)d0P2tZ+z{QzXsoX*c}DGB}1`IdI#=feIZ z^?^l}6xoMlT(eN6DJEtiqq>0gZsufpOp7*wc{r|dX* zw~|iJJRAOp?MDQl)8zbmhQAj(A890k_aV9dhT0Fcc|=46yuK7;WSeSJw8TMQh3Mu& z8G^cgh|3RprOIiq_?l{{Szs*C4Pl- zs5VKv57CAK(*h|OgyI2)q%Ubt*DTfPassEQQpp7%&n!y2?kll31myto=uoB6T}-Pf z0>}=4diiM@K#r9vxwy*BCOg$QwF*RW^n$(EN-7R)0m{Dj%{XFRr%KC4zLhYEIoSFR z!Gx7Gb|FotcJEKbcMyTxL1x)t=L1&e=Gr)&@s{(BEk2EigcRW;&Y^9egJ60JLV|hc zE)A$TX*aSTxLUP^RP)GXus<*sOA#H1NPPngPvo$6zD9wN+zPv<`$UCyYj@qD8$T~0 z5?3PWn&1*&D$Jkv_3SkHOyN}fgiGW8vs()5b9IzGAD3zBzG)ZPB;&o$$a7C)v#!q_ zW(Dtju!rjg1)nMudEQd)b1V>_32m~bJg!|HI&fnRhxT{vsn#zo<~Mqy=Jy_i(GQ$> z&(^7hxx0(``ulIdfp!}R2D%@lLixHxwlFhyA}oxIws?Uxe^(_8c_tY#`~$O>hutdD zeLR`fqwu!1A;d&oUQ}1N0Vu*rjNt>v;saKX2xP7@r=x=rnQx`ld7erkq&{AVr^nRP zn9vR7`ua6Bo^Yut@C7LzO}rm&5JN=$4v7^jFYgY>i%KDIy#Mf_7qHoo`7TNdbU2(k zRwMz)achUO_*xqqLG#{fQ;alNf%OD^V8UUc-Mg0qm%8oiyT;1OO3Yv@5dBjKmC*3) z4h;|AB_>7**!-?vjpoy*Pm4Yz4bhlp=iv`JF(C6THY`MMH?|zLU#+aHoQgpp@Qhsr z>LFyW9B}w!Ha0>KlW`SjaSaI3p^J{8udfeMmd718X{e~)R2p;GPyeLfx>eo4z+k7S z=xW^3Ne~VNztX9Yg)08^lLB*|hW&y(Vhy4saJ9Eyn`_bxYEMuctBJ~gn}+fQ?#nLF z9JNiaF*i?p_u)eTllqLk?M(+YvlJfPO0V>Eex$n8yeW~ui8mC?UZq}5PY>+H4QKXo zX#BoEaYl1wU46Ya7My_bDO@tr$+vt|OOCt6*j>vz0a(gJ|Ma+Z%L^Ys*VfirvF-G& zJ3qCbJ$q)mFek_^vxVlyG$p|+RZ^Ex8o+r8P*~%x|=&sfiq7gvCAPCbuq*#q7foDHX+A7fj@oXtNbl+#qo7d)*J`C z_vbH0UbI63vOi_}YEbzr)(gfA$MLhQahlbmg{smO(zOZ(`5?WmjDlIBv-8m<==^*T z9nG83h8*bT^xQE-u1k%t%uiwqp#C4<@zMupwa#$6xaS8t3(c*77Bw}IW3lzVkHFH3(%%=YnC9h^4r^WpK{mIR*Mzi@lG}X$3L%O@KfMueP zj}m>LmW(UJ(11s}<#L_r#a%_n9lmvU^Xy+sOIsGom#(x>kTjzDYvkMViN0}b4?BQ2 zYcO{QTCU;`NrIlj^iL8KJs^Ycs^nE?NOSeOu)VyIXde^gH#>eyiiu&}ugUWx@KR%! zo?80)^|igc92_*OHdU2_UrIA+p?i5vi*K|2LKETv18(soaF|rn&%<=ro{ebjT)8Zm zR}0F}Jicq~4(MCZ>OT`5hh>lDlD(3aHu2+h{gO4hj*ITnc4-?KdE!VshI$Y`<%(ZQ zbC~5vO+XECNsw^0{$AKIBWZnu?S+2XhkJ~VB^V6elExb6va_>$g&#&=tP3Qv-QT~T zxNre!=O`7y{(NG38StdkEL zcP)V8JI|j#XVVbvEBuB?w33dl7?BkNt*Ghg>0!5DQd^tWZ1(Zgsfl3>y3qs9Ob)fu zxUr#-FnrkglMt7ViJgU|u~(!>ei{(EyRJv?A?lLWAe5<^ z$-1#v8PAj-i1#V9nj%6;T$P@^k$=>B`bVwqWn*JE6bw6eb<*++2wc|I_5fPhiT;dx z;TPj{vd8%X0|S9&rl5)7=*YN;&&R!; z;~WJpN|)u<{mmGU-~>HJEzPxT(U#U$oenWA6Zj3Ia--b&$V`I<*s+}1GqdH(mjji= zfzjiVP00{pa#qgC1;F!WkySpRk@NCzbbX9*nZc=lKjIfPYTwcjtt>J~j_ajJ)f1`h zscC7Yx0lbaXPTw6x3>q4%!19wuJkqW*)uvkqaS_mH&0*;&2ABq+;>BT>J+N2pScH` z$B@)A4z@4QWSM=r135T4s!JLh*Pu*s0l(Eop04sUwwop@7cTIQ&YZL5Ij^L|ZNBZ? z$gAa4exrb6(@-Cf&RKUKM|wmpm;r2o_znqBk6YUp#l3#I&!eI=)21hN5iZ{&Tt;W( zV3m0&#E9eJEq377!NFbDPipE=g@66Vw;uTibb?!Xr=C)@w6q{%up>e6D)kC^q<*Nh zCV5f|#_KEB`oVJF9pOhE6G3zlD1*U2fWcq{wt;Clg?k;YHr6O;-+rB)4Yk7fTfE^X zz7uNp2>GBA-Cn&?{k1s12KxKc{b%S();z^@DNJQAMS*CJmX7Y;Uc%RgiaQsyh18-1 zE`<;^)uKn*^}C4Gk9CM`7fo)gwzjqgMA~SR{8O=#N1N(^X3B;N82I7N#k0(6knVaDy!B za(kW~It0V3UV+!z&CR_Eyk_i)@u7~w9Y8ToU%7JS!2tR#zxDNb0AEimmV2yNdKedo zE-s7?&@5_f+yqC<9}Q=1xISY485kSy77$R1X+bT@XV!KY0?t>>x|%pZQsIpX>reTZ z7ChBIe^s0X&WhvF4NQpkWWS(6tFn##CFtappDFWgc3cRF5FhqK&?W=~5<1Q%<>L|( zuDugtijtDl z4NvABFa=q=?N!>l_wU~zENkoPa%U`Bic6+a1i8DP0y}yKr8VH3`w8nTadbtmNH)_}~#V0Bs4%q*a)i;xFjHZ@I3HJLDnyMZ6B7sEXvC!!@oWRd!O zLq3Y`Q}-_P=at|()R$3TYt`70=doG?~>yrs#9 z4jz14>UEn=X2K5LdAvV6*6y=eKx-h{VsGF-&SE(gZqqPKf<(Bl_rkJvRGXn?VnV z2DZK!rgZMimcw!Z*LdCB{5G(HZ7eJ}kNI=A?(k#r~^g!_en$HmjH(YvWC*FN4R!q5X=sA9 z@#jeP?(k+SDJqigI&@~QheCS>7aRjVTPh3c95AU}IEyg`(6h}R0s!z@mthP-gb`qC zq4fD>5&G{?u;_?AAU$}!VpzTMG;$AVhlrMii7rEfrzPzLKW~;9aB+U7q?V#qjWt58o4Z3@?n2yOTD-D*XPG!DodWu*vWCJenC80Yw9{_pL_ztiK_VM~&*_M%oTj@Ou^ zBpryNXX5h9j0jMrQ5BG1(x zzuNL#1xF()?6uhTx=2j`hP`5AIfn@0g$NJ-{BQZX_&jrH&T^X8IfhS6POjg+egE`D zoH87cPrG0lc40)s$J$y2TbfTeaNfZ7H}^*25?vKy&o^u-EC82f{{P-izyDdA@N|ZY zV%KAgqxRVf9Ef{S>{`1hWV7_3bW0FF*kq`&L+EgkjLv?Zo+mKk2Fb}CKvt~W+-JXq zdA??kf#J_#D3zcyFr5{qp*>2AYZA z0%-EQG~NAvBL?(z;f>MBsqDm;pa|!+sqjW>TlC?B?3+Z-_F+7zQK-OUa0_VWVFSq< zJ96n*pPwBV6Zp{ZqbPlLOPLBUpAYZ>k$Qt#QE46uZbZ&Td`j?uX+W1MmOoHxn{EaRnuy5dZDt|6cFE|9Qrq=h&XdHH}ar z5ug@^Im;2R51!3kv1}T4@qHJ;@de+iRo$A>0*L{04J?5MfKvLdg)G04XKW z>Y(uNX+&(qsKKL;j8o(DID~%3OLBnU_w}TTV#)D@)`k>j3L{! zxC1wE)5QY8lJ@q(pFW9wnd(>UHf~O3h5T2sTNoXSM4yIZ0&|K^Xlh2C$PhHFTLEzK z6qKE*INUJDk_CJa1`-qT1etPxmGT%%?l6QaAfXaJI$RSF6qLaAkri>}>Q&E5O#gL3 z0tqGm8UUxkZ0hjoAo3-=^)7%9onsJQk|7}|GVghLd7TgtM5hzYnr)ovuT+ut;@^tU zcYMIK^`O-2Rvb}`2)(3Zfn->yQFkKU!L7n>hJZ!iYoh(YCF^1~4qfCLF8mpIH=_J` zl#;R*z9huZ0G!cD9i7L;77V@M+(OZxi41Bb;wllN0evn4<;&PA`||J}mT}=5KfOt) z$LqUpZLM;hzo?~!2`>%aPqg?RH(>XjKsq}4hC$R3Y6?I%RK9m0s^t{j{a-uIQ8;kL z-sdUq?pz-ch>%|_Csx=+khznS8%52rbt{OC5xG318*K0O0TLlyK!rgCgyR6Z%YeB5 zKkdDVU(frx{{M+0Whfd)pWG)nJ4+m&KKj&u&dkMP%EIY?ZR^!C`A;bd5wh0jkNe&nO%&oW`FpREIl~J(p}# zwn4Z%WXv5I%!EQ`dGx;9?bq_jNdq+@LRLjbt5ClvO9nYRpFs+b<5Hz> z$BtTbo$Bi9r%2(e;^S-k`T0@HHozFLc%{*?1A0dnRb{Si*Ri9^x4HHM2Gpin31!6x z@4E;uZs-xSF6*h*%BKYZ5kxfqfI}3{V%pKs(Hb4rAs)(MxGLiH_PPov=Nu61_IDPT zGC=>IudiLC)U+AJiSH*ZP4YHycFEn$>ep8Q8APF`>c>&m+0>32{^-%8zVX@QDF)mc z@>68L3WXH&6`??f$|oR`EeLJ=a_XoWd~-LFzIyiT$<1~feYD2kT{vv+3c^q84jmfs z{mP3YJIG?2XD?ouTQ^e3W#@1$C_M~6jEhEX4*Ce&omKDNz73f6bR^)Fl(+DP?h`wW znmV<;oPcM~o^6J<$cb7&@q!e)6Lthj{Q?zR<|~=igUMNpC}sPuU9u}pPA)*B&ZgAv z01N#`Hm>bBriN-?Tj?$qRV~ch_AV2JIkpWg<#SU2=R`5< z+?ZG%K_0Z|=p*H(AOwKyVJlWREL>O-W z(cSY<1_G3Zl)wRuH8WMPIVnknC1{AenxlD+8TX&J%%75nYHGTKKRZBNwPY$r98S=i z)?&MI1fzndm~B#s=&$_i*X#!mevJvFlkFbx)(}^aaPBT3+ALX25*+e;N!!8eWTm%L z%!>2vfqIC{vW6Kla0S2BxfNGgbg;XopPO4l6vDtd)=c>OvP{J4<#2a*;b-4oN^{Rt z?JEo6JCXuHuZ>8h5-nJ^sMFJ7!3-IEpZ&~*-5{qKzNS;UP0_(|F!t|aJ^*B1*7txL zMM=gYonfG~s;6FX$gOiAKg`Y9$o3XyYtS(-yVoiDr_31kVCC>O{XX7l3i*dvCm0aY zkT`^bS*w>j!t}ZXJpk3XabMU=7fBntncy$m?@&gV?5zM(k!{L(>E8=j&3fv}6_=!( zSlsaT@82KH3LFY&4JIv>_vcJ{_WU^*ZvzI0G(nS+Qd8Rk6AYofw6d~dfu3RB>ytkB zdfFSGak@1(TNDJe=0=2*l;CUd^*o+uYDsN&FCZ0yu|et1ju z16c>VxKQI+gV;@*qOdCkDjj5?{OMsCX9F&L^uplCoVuFwTS?%|;tnYuzJ9%eV@r@RFl?Ea?Hg{>68)`Ao-u@PeB?X5P%)S5?_`%#g7iRo>9<^6D%dSB zs2Z2qIHkt<#}=*`S9!IWX8}Vl=pq>J>`aN_T6D)oG=$ypb7GuIXXXMjc=zcKgFSD2 zp|Zm-k9n&)FsIY!%;^u^Wb$(RH>UR?ubw4m>u!Dmd%t=hI z2P&ty*6fT7fnXoFYProB7=KAxfRba821t)Y!{5%|@+$Wa2A(a+cSXEUp|NIn=T1Kr z4_BWqSK|QO;f2^^7Xe%?z+y5(BZ6YCTi28qxHW1SYa5HHiTS%+niCa;a5}Vi2eWKC z5hrN0XYV-cG<;lb#i2uoB;H*}Ct4yrsX>($42-(n4Y)4QM^)DdA;h${oQ%Ry7c!u=_Y%BJrM!L z|A;aX`B=)@%f!W|O`FC%sfeZCtcQ`tgdJy@7aH-(a_GOvit7JgHP|V{P~B~rq0vrL z#DgraZWJ9GtEv!0i)Gf~=rhFRCX3q7BtLG=8YS4lXmXF1s*2>)AykQz?;fm!E;G)u zF!gL!mI@$7N{dCzEYRJ$k4{df(wB8hY?Bd`z`uD9p&4+kB0iaT&G;-!Zjn})T3FCc zzGvEC3HBDT^8;COSM=!7u*Koyq~7S<`M`}w)CEa<_x`##ys|AR80WT>7W;szyo!8b zptykU#Q?dD`H!io_UH){mc4!Z)@|h?j2E~y<{hJtzj`&toj|MPa!mSxTn&cEC z`@?ulUafM!MBMADop%(lUTP=;EQTA|lmR^cH9c?EzJC4s60i&ot+Bt3tCv+uN=nw5 zGpbxynXb@X73DORHb9;W#uXnN7ydTj$7}kyW0>=&TH4X7@`h<_#!&Z(6)U8?(cWg* z2T?Xan;Lm#LT%{bbdinF=q=+T3I3pv;_GJO#74rr)#QS8p+B`LUxl9VeRP!Xqzh+QNhLkciZt0F*-9LTk6!w??TCkC?N^O*4$BJ&k?70LZ! z%CH~J71p+4WI7f>X+A?}0+b-mf%~1gUNY;#Lo#`N)2BK6X1n+78Tb21>8ZCy4eHlV z*AyPXS-X3qh`&xnTlB*#2nU} zw`>{qc%@S5koJheX$*&sdKx#F-RGth0xH=rt-F}TceJHTIqpRiBPLH!L2FNY#9j0| z+Cc0BW`4&Ok?&KJRo@Mcmgb-atH;}|fn1RgX~_5qsXgWVw;f+~qFR>D?>6k$Ut18G zh^?)q z!jsEdB5`(7XdHd1d+o}VU?vZyLao4XDJO8>L3d!5?0{r*E~P4^$Y#pH)OtjcaJ2NK z6w$R^reBllO4N&-1UVK5fB#E^5>+Fgz2}C4((&}>m3o4Hs~LZlRhcQ9JVt4NsU=R% zBoIG-{MhthuRr)9Ny*6}$SabNo0>$eN&e#%fp{hGNaRV@oU0M#`?LAVg~e`M$zq;@ z)Q>Eji(*jB%yK>P%6ZIhJX8R61)$u)srQ?L7z!G|sZxixvGQNnZW=iNm^T+=iT!`v zYEM?GX}UHl5LX3&$3N{Nbry$=-Ne+{*Uzsj9;79n?=+Om24Y)0bWFy5D(LXlx-P?p zt94AmKDJ>Yr8TMF*OhmrZHk$;RsUP z35#~^_S`l~D=!bot1>VfoOG2LKd~WA@JmZe6M;PSjz|L?J0ySIckaRk%g^8M7F4*p zKEewP98AW^6IgMN>SzQREa-BcHMF}T#Yqn>*@ zj+*gEGqMm4JmTB2A;NfVuA#?{>G+4mt#u@AT^EwxlH2SASLNwnLhckdUw)iZJ?R z%7t1AT3tI`cbsA&U zzIo$PQd1w%2+zz1bc9?SE~eAmn|MR7#dtVBqQ$ey2e(HPqXgP1262dSRz8O=fcSyW zI(_Tbh`nn&(`-=c2ZI6w>FTVT0)DMtw{GAxm7NTwQ7P!e?hIyXzr2e1)w3uX#Azxa zcUpF69dQL`lq!_K&q<}A<|(wUv>^uJ$m-PoG#RNQJ>wC(K!+DB0B-;5@i4-FGF2rY zz9ys4?0|f_1xMI&8UU9q{p%^mzrfm3uox=mv{eVXbA48iYx?Eew?Jelqc#-V(6U>O z?$)s*zfmJ<(06~0_|43^nTyMG*~r+bkdK^G|GceN40iM_lC$3OpSWcuzPp$bJFee z(gtS_&Xg?;wt&50eWxhGN$XI)F-8+Y z;5d9KKYx&vfBo`Q#{dRo^R06VLC7q`-r`#jI94{gm#tx+^T4OqDK?*L3AQ6%w07gi zZyWbT3e(9pNGQb7E#|Qs+;i6vMJtIc0wy@V|K5yw1ZS*fhNiuwXg8M=BgI(j*7jFu zXWzenAK|?SbCPP9YKRG21zn%rJ96OgWuS{eT)60-H`}<PXl*wF~_ByEH454@680 z8s8x_<9k=3h4IQn^`uTgsmEEk9$(Bw%p`u*l^GaQk;0=~RYF;owkPKXp2 zP&*E?DltC^=sz15k&;7O_U>(u0A=9#J7Dag(=xyG$2294ZqF1iyFs8*OQAF^qbTh6 zZsztXw0NUxQ>IMmOU;0_sCF*rM}sNFhA4yh%~cULCjmw|JV@l`Xx_bhmkLFHTwMI; zg*xyX{q`R^)c#X>#))|!`jZ|S;Sc2Wy<1A&`h)~Ch+|FaAYIP5As(dmcm(NEYMKG+ z*Y)Kf9fC7B+LW$+wN#5}XzbAUsM1ho0lI)-nZG~Km$Ry5#iSjWy)Jxh z8=zBrC=j#Hy-N}Nss;rGQE&B~>Vu6vrATWWs)l*%X=}HVFe9)60tMqPQ|`J8JC78= z^F{6pANiCDb$Wq{%`?#JXe-nOjfh`i(91(%$hNfOH+pbEO~J=BFlpBBGotXQ|1R%0 zr@=;571_j~{Eu@@I(6xyL+Ng;(4sq%2bo13>Rpvq;q2xXBTpE+P#+Ro)D=W~xFmWK z+BcOS>D{}xkBkb0Qe3FFY14+Ot=38sM#AeV2)7WD_5Se}n;t2E{>_x{@}bfPJITgf zC$GJ5`0d;2S=X-*LmCoY{ay)1YkSPvc5jOAQv`ak74@gmh0C{)N%Mpf7~F;j|NK)) z4>iDh8)phx%Mh;P;dvj%N9Wq|f_dz%OiUaUhKvU~ic%z$5QyQThb}|(p`e$)qOof? zd_16e*3Fxrm*h%GTtguvQ(RsM>8R1;$G1^v;cn=?vo3#y3`Cc_5K2_ex_9sRjoiP0 z0cTX<(WMJe*&Ypy1~KtZ4l?e>t717HCG>xeMfl!(^$E7~!Vf)^?c`BR})@?c3_GN|t{;vXlO$q!d1_`i=rLt-N~) zG=x`A4RzkE35qMFK{c|+9$hJRK={s3nw=?uEIJFe?Lt+Q@cfp}6pAeBl#VhXf}S)o zpVPEb`TUYDVPA$khV;P1bV{ApB((7ffEN(?W2Q`L_ht56 zGC2EFj$I)7{DR{OkJx*|{J~dIhPG0#L9d9_lliT8uAm3$dkXXCS^_i)E zXfZ^Q5y3#(G+Ku|5jKz3Qyo_lb}I;2qITC4vH)(6WV>h3DWmW7T!v zZ^ysFthVai+km2R0IBwHOZrmbgRS;eWvrZ(V^DMWaKE9ag+T^P0*F_0dFxZci;Rws zUxxS~er<;J@rtA37K1WP$(jwuX`JOq>?IZ^|I){BnkRMltgq_Dj?JpSU$#Ds)!3PK*;jGfcHiaH@%7gaAG zQgkegdpdZxfTttT7Ez!2P5@|WOuOdv$#5|nwMngmP^bI6Gk-v|6=*55r=0`;{^;Z@^L ze*e5)>Wm_igVo9+&We(7q)BsUH*(~%y;?MHZYd#>p__SFo= z!niCyd)J5#t!!+5Wo{}NLwhqA>G&P%Z!TIKTV=E6Z0e@cDd6=|IVcH8L&|XmR3oVL z6}Is1!5t5uKR25*wXKnn`5sF0@B_79p}wG@(;;w#(wA!B)X~t{*;y4&fFiCazM8Rb z$sZbkeRlkJ<9a6O{iX6J!iH?d7ec}3>QIbj^Awc~1E?!PxkSUXLPHiU)9m$)tTYh~KHyU{u_3 zVw$hMj4^4B*z2v$M6q)D^15R{^=l~l@*&H)2-P`IegBag)L#EA$)`}&1L*;6RTdmMs>uIS+Ky2OJ~pa2LRYxe(dDQ zlM35s_m5>v2RLlizWor+dYpJhjls0lZ(f+6&K#AXV}Fb(x=aWyIeX%MyN|FtcEbF9 zch%D9dAo)dfjg82N<(s-DCp&7l1SUVKNbbQtj>U<)}pE_^|w3RuT7be)_Lp<1DC?N zg^@9&t=-;7+!TiJHkt%`IUG=$BidIu7rksAdstSwA1&0Qg6H=8_GOgG@ z@C<#n!j^%na|;p^Q5@tq&n3(#0gN>0%o-`e_I;w#mEw{fA^1Y!$&F?mIt-OgK%ovA zwYpcW%z$%hN>hv^i*qjt96&RGwMiE)drxL$DIw(xcEy7lWVRAF3L zE>uI2MSIHWNm#2;r;Fb+9nb$H(5DcXIov7?zd`VT9xc7_`XuEk30w3|7Iz^4>BknP2DWE@b%HrgjnxNSMQAuewd z7BNg}wQm_!n`mUTLaY2+)kgwUmAQY=Zdg1~P!#c!vq{%VZkVPb6c#6ZtY*AF_7v5h zS6A0WdLy=k>MPWt?oIzyc3kF@DGV9Ad9~$Gwb0aLY;AX=uejyB&X|Z-qL^GjS=tXC zTrJ=sJ_yk@=@3xtBjUb@wy;U@I+K$l=^SaAJs&myUhmD;giC2l(Hq%w%&|vrHRp@a zh^X1JcAa@ZFHuvdco5|1RjYz2#__%&~$ zU08Uy*^Ii!T=k|<>H`k+gGGgHQ*fOGv?7yHt!Dumik8eP6VhGE2dcg{?6s$ESjiz1 zxfFT}e3xS_3-+C?j6mk<3&1R#FeWWIYNFhugSqnOA0w2ruYb*;CDZQpDHgeQPiDC- zI!5mXO%3x|<|ODx(mu>xzBT%ra5 zXXPWxt4wChoEbs|3ficoj19{_as0SKA%$`Lm-6z!kKfB1)7UQIt)UnUhTX}W`)%1{ zVs8!*cSK+xSv!>QCKd$QmPIAtsUfs@;rZ+kApX`3NY>M#QvIv-^ALqxJjs0jt7Q6Q326|*@me=Ig742G!#vvp~-mgfF5E`$Gnk3JY73sLu-U1|T~YPftE>D0WwD z6pEy%WxYy0_GaZw9fZ6r@O9kmy5A`Jz|}Q*%nDnY%;}h^04UUgxmdDd#l;1s8E>n6 z`bCbcJcJUblT;DX^VP=;r?0*`A*-w!3ujPTrQHXgMdvC zT|)T9xc4*tyxCt1Jz3~wki7@48lyMw9uw+h+=d=8AsTSH8P#i_e60nOQ8@ey1 zVr2Fq6V5p!z-XWbZBk9Vb5(h3GW7-;`QX6=aYf$GPAary{n966QBmxeT?`Qvc0K26 z)%Kk`eR-$wXCe=J3&||9DlSk?n09M{RVLZM>f>LdF0l@x_TAS{e~8SF;{s8;YwI2G zmT*e`B%X&={-;l$W;{Hl!d8e+CzMyKOn@3Da$a}jvW=~nDpyzknE`;8Z>tdn)DyC3#uKi^Zhspkn(;ntC2 z;J3D%10AV0oj1g7|F-=&aU%zf`*hkk_#dM_eOhAW*O%X6%(Q90?Jav`KM!jsFp;(F zFe9G0>^%8p)p0r+^UuDqa}#f67w08E7&`am&3ck2ofn(9xCF9q#(U>Cg+%e)KF2)1 zT~ODt)}xqh+-2gb?t6h;<>~Rbrn5yux?5UjTRy`1k{Sivt%&PB`sOcY6&2*HBZflU zpT#xBbm2i`BOTma6$~O__fbzQ> z(edlmqeq@j;x>3JBq3x7?Z}~;cM1yR+fS|9J+XA*XUb_MglV~T%C>Dr?D~LDwkk_` zJ1yl~Cz3!Fco!vVBC!>SE?mDldf%Tn9&kR6_tw- z%@INputh7zGB8MKzi^@H4OH!v49=6wRTZL|q@D%wHJr6L_0XZNv_2*a>*t?4XA8$F z@L|G~n_y_iT_VE<{%(EUv0vgIfIVTf95y{OyZALCmW{n!-PY`4UvksJ31yYYEoj?{ zB0FT-qGF2PxN!wE!I2Kbci8gZ0;XWeHcZZvb(WEO4Y|mqGGFw-*wM!se_?PtZF-TN zke<+Y+P!SWTA$GuCP}-XtHb2U#4!`LIsAV2;E>#QJWF1O5@24Iu5>6Z+`=T`%(h=` zbYHx9A$w|2T1Z}NZJM%NqQQB0=Zdu0HEXKX+G=V=^uS`- zfO^NWQfJOx0l*uZo14$7PrFju1*Di?%(e@%)ue$TxmO)W;)q$YKrpm^03a6VasJ`yCdEp2ycQz8bx>b zE%OXVNdm=;X3EQ6y!xcwyO-nV8FDxIw zlTbo@61f!GNlY5}am$#pK9Ug4tgniW&M9m#9+75CFM7m{ZR)arW#;$t*n?HaON*ae zGktJLf}9+bp$M#dNGHoi}vX4lzV`UJn~=SzrmE zSQ|oF@b&RsS7+R3{Pp;Bb0{6iU}PqgJ@P1N?=arg7(93|ZWn5l-axSk|YV_L2 zt27{miNPuulrUo0v(``u1coT)bar+P%7d5f zMEy%SXUAFh({Mv4u)jcp4K4EM_`8I!vcz z=sAsVucG5Uu{%nO1b-x5tDAi2^kaf~ydhj0%s*#(1vGVm)KBk{*JZDsM%em=(5?I4 z>rGJ3I`Xbihp6`-KN!1f=T18^#=W_knlBU~=D!iqAa3Md^;BhJ3U1lqgXu^Ttm!=Kpgsi~!HZ{(WDaL<%ZmWr5IE#hyQ_BU(Y zW3#^>x6C~i;l9r9FKDwc<>^v$>;5Oc9|h^x)qGWm7jB#Dy?0u|3&Jskp;Sf4G5AU6 zdn6VuJ-s%a^ZzQSSP5-&_!~9(Onqnf8y}cgU>3C|a$Li1-9|k5P>N8_=4*|5)l}hh zX}citX8`vJ3pce*7$7CggUlJ>q@fi*4H*`HkX#pGY5VEJ2Z_qUoJmf5^`P|W(`5{r zLg>hp%9fUu+;sNF9Cr!7-g)nXcTxuF3s25~Hmr3@_gUwu@p8&e z*=8+x9C27ZKJ1zO+xLTvzP@5!ibamK5mXmfo&5d*W!h*+MpTEZj*UE-T=Mv_2%%|H zbgHWEw*=%u{4u=f&Vx8|Bk@%P8**nUPL20s5)=$d8Q^QD0h)*3Q9}7PW-Ro%6>=`= zCXcP$RQYZ!wfw2uw-4W59fsz<lW5t=smb!cK7 zv;xi%={NdJ8@ecYA_=nH=f^L}0asvuF$6N}K729FfS|ZDb5d=y>U`sNj0JpYXl${c zX(cG#1LumpQ4WdF^nIyN32a&JIHS1VyWaU!T`~s7uOQnvIfLOB;vFNTK43^t3m~QB zW+y5Xn|g$cWmFqXeaIfGG($5g5PIupg(pvXP971P9b&-62HC^`pd|+$#M(DHXCB=# z`q!?!_dy#Oh)H5g;W9`9Q9BVe^Zj!xZdbVK;SeDRy6_|ToE^B3lNxcZ07<6ICy|{` z)3t}t*&B)`yFp7m&1aBEm01NHL}w$7AoB}cY)~UBuC7Vv@$~F6FT=n@s|Tr4v4Fye zHHEkLy#Y^6I}i+ODTElbj@IYMP~o*QGjrVF>I)+YI2c{gq}LqF;E?QMkewq@rxUFl zUUyFM1I(aj#zM6izjsgopfn;C2`1(YFn}T%^03VvJg%PWVbjM~t9frq7ynnwGNH8s{Lu^Q1q zejQmpEMQ0lDlV%6JeAh0@3a**SfSChP@y*1Rv}w?t)7OU8gNDI-{8ng`r4>!I_&@( z$VF)Ok&Yi9E)20j1BIJ;-$LtPpk~g61V{_ngVFDx)g(=`7G-RL(rwLuyiBX@ihZOeyg zr^Kb4rP%n`$z1tjuA7uT2+BwEBLy!V=k@2ogH(~r@$FY3VCkh+jKT>^WS7*mNpvYO z;|B5K+1DhJgjYAdkS48kH^pYqw)pn?pt$yQ0a}`E7aAy(6Bc}VZ$h%It+;}W4dz=W zR8X}Ll1z8!x7XHQa}vx#g4$Xr;s7H-3=zi_uZ_`|DWKAC3%`iphm77xQ3sO<`r^GI z``Z-yy;FSNBv$Xy#1bHwyE}SjIk18(Ea-&ph?k*zXUvDOrMW^=|N1ItE+!ewmmA}S zRUaUULdkWnf=s3h{BH7~|GX#dBG4{FWGx~2vhm?g@q(OevrGJ2zqRk&MQ%GaN-oEi zDI)0|&JR9O`Q&0VS_(Z10VPioMa7x2F~Z^&?jxY;iMj^Qp^j{?Sb6DlD;}R3QM$QJ zU}FNsQj{!f|AeIytU#e4)0?Na9#`}Dfo46gU)pvqL8tW?AKXUKLN_rFlRzN>jFPPT6Su@Se4`)rA z@nB=ZWytZV&P5AeWS7=Q#xDDTcaQv2gPtXH@nRKD8yffRZj1W2GTJ$@diL=WokrT< z!{Zzl2c~Go-K3;RmUFGM|M`m-0Mz;ehYaaYTQ5v?xBj$C@82|Go`pS2W71YeFI{@J z_R!SfEjUN*XT2{)%p(FLoF*a=B8ou~xd#eY<8oYVtkiL13EY51-DGBl2mg>%DE{%% z88GcGr$HeDfuim#8N?5ks6}BM`2Eu@L7)-9&49I$iC-ec(!|8X?wQbCF!)Qe-!l+5 z%=+DMQ?NvVXMjDg!rv-S&Pil2pL#@wk3hHIzIzwlj5pd0ZEy?Q#VO$K^BM27}Mp)D{lMDu7C^9qVXTf{tdVG-53M|qbr zB?^WHipDm9-O>5U`&XzbbpV4;v2j=iKAmFfDP;Dary(;LLbjB5N0n1cOzk1F6j;N8z~2?8aA5z?0KtN)?^iyMk^pA&W7V zCVe;Ulo8bf4H@&dEk!XBm5&txM47Yp-ejy!1jR;o(n5$8SQBVKO*9LqQD>ns@8H$d z!R3a{u#w997IVS#aUu~#H8ClN9^k>KU=Rrne#*Cx*N4KzE?c^^7JR@8+M+E~iGJsc zhz}G^0H@~zOI5dn^$X%VtsWDg?{YUpbr!!87FA z?fWYraKp(iV~L_r0adwTwNT@DP zerDo#E>Hvtk0g-i;#cjI8hr{G_s+as7EC%RsqOdu#jbsC(OqIt)__sJGXN+e!yH3} ziO%L)?J29nwp*LkDd}CPu6?zw5z0jvq{MOEBG3!LYSGKSgFcEtc+^4~TFOp2Ebz^~ zbXp3H%)pj}10rc_M;jU6xV>LRW($F*0W+#gUW673;Xepg48fUO7f`G*jC8eX9eG*n?~W+t*aStE~so=#kC1yfKFuRXpUBB3JV zshMKa${{gI1STY1(O*WtBnzOMZ~J9gIT1Pu%nElh+3U*m#}cF~1J~7&1rm|m%+@`6 zG@;EGCJa3dV&PyKh%pGzV&(+O;#g@a2{4#LHU-oPV9x>KJfx^M-A-iY52C6=IDrCH zG2`n7{%3-R`KG!K7?5k!Yl@=@oU>*BdOr=cB5&U1-LsZdae3#@)8RbD%lNT<`6yADU%%P2|S1$n$p~TiH@Y`ouwxv6j z`b_=I6N8}#LJVWOD>GtZuGRLh-N9^{m^ag;FBvk1~xz zph2P5;Hc+^*CF@If-Zv)LKH_{7+K!@kBJjwcW#y`S1J=6PR!r=p1Brf;RKwP@L&<( zfp`zy$oP~wS$Vni*vh=zdu<;sTIuh&sH#(iGv_?o#}~06Qj@l2U(e;|+cPi_Uh%FV zH$FSpiyTaDRh%!q?S5~{gz@9g-%sUtV(8f(=ZSMu*2M1EK6dnsm7^wY+LtkHn4{zK z6Z=Z!XM6po&u3M*yeKe#Go$=UbNCDwSJ&t}Bd9i4=YVr6B{e| z9Np8f@%QMg*fXXMO)fS7h#~q?Nc%llq!Cih=aPq+r5Sm|+M{2;mXEHV{1_MZtmY(K zevo9r4(CK&#k%ypW^u$eJ`LwAzPnlyO3-n`%rmAG=*i>-5lg_z8S{|X2$L#g5`Efg z<7Ns7nj(V5#GAXDpaxt{`b|@}fUY39$LOluWWt(AfnxO9CUvt8LhK;s^my^kFCl%e zHC$T$M)ke$RDf{CFYDgJB}1mwq>Ldcd#mjGp@P$`^mh9~NvR#F68RovCod{j$uBq^ ziiQdC)9{X>Ut@L>kFj=}Mz3}P8Wj$R^1CJkg5Zn7OVJ{U6?Dw_nw7VLCX$)xbAzFh zrNyNIGW|A>yt51&pbZ-~AcT?O5HYT~VQ^zBYSK_>L5Y8qcP7*+Q6#|DsL1%7Zn-4K zxePtWf9*Wg(P6!bu1Dsm?H+Dv(fpG44msUDv~JzVghwuPWB3+vKL)Pt8v+J-KVQepT$YiEpNq=6l@xP|>NZ zj_Lie-?;=cD(q)0+LE07{z1^Q*N+CduADW`V0}bIMe=(y3yb)*$F@2<7}Sg`@bLPz zSxUQwRjZ7?*!czd#D03${`I@92YWmSsvLB*wDip=hu&o-y<0lyZsHTQAeGwFNXc+K zkfR8}6<1*7-R{>GK*xNM@_==vjL=e{Y-U20);oy+D2?}!M4J`J_=_+1sp`i-piFap z<2oo@Ue(nm=)48mfrJpe3e0&k;&yo5UU)b!r}%h8bHSY8FXDUBq)9jk_Cs1o{0GcG zEO^R8W{Go4x`Y8ld>}xnlD>VJC2P7LwJ@IOd*=mc0vP~mTZU=WiIwvM!@|zjtR98e)zJ~9(|OB5SV(cCrpvD4^0B4K z(RuLTPK+@K@oSq^TRf|?SwkG-4YQhyf6feIqL=|$TU)!Z-Iuo#cxAo=a6Qq+0ajL) zezDgrkX2i{EF z+%d`b;QNAJhy)D-ajp2;m@|PVFs?g*;p@jfBX`Vx5H!uLA-Ju)A zz+M)x|Bs>QrMy@myUJhG4pzU{ei4#9EWOfIDa7adrml6y$k=nWg{qUb?Luftqz?42jnRFBgYr??`>Dk6bzPf@$r_Fb}tjjEc|a3RD~ z@{N)*IPapWZ9ijOz0D1;F1kijE8;j2KfN$@_=*tzA#zhr)S#Iaf?$!t(|j&I$f!K| zDoAY`I3wsq8(=4$4ZBZOXgK4g98UcuG_uAJ4}s!Xb=iywQw zAuH9$FA9IwhZTe4QOM?iNLRZMK023xzKMRJotMfBQ7fg*JNWJhMD;Gd#2fbF?QpLw*)SI0>91hR>&_+h5z*Sl^X3#$Ihkpy-yW{kS zw#ug#yuU6)riTO>>~(eG;rp727+bCdHam{#f5P`u!>sX&gX0Al6mtq32R6)EQn^uF z3h5gi4eT%Ru_JuICWK3B-KWoQi^HGU?*NZQyf*$0)q50ZR^*l?QX`aFfcF> z^gro~oC;pyBmRTXz?J~Ws3nSphWj4;czDUlY2~p$W;ZMU@Wf5D$`M>$Og_B5H{5WI z(9zZXlsCSnhK5;6rIkNjv*-TNDuh)P1sF_lW~Pmp12J7Ont@}Di;eKmx^8gb@Q?(V z;73-kt2^i;K;KxhTyZJT;HqZi&k&WGwKmi3Ml5fGvrPl4v=}oRwP3g$nS`eKVB#^x zxoWbXpPGfmE~8r)H}q&EojfhP?uH1P5yU0G7lB@U3=L=d5(h?+Ma;RVisV=H;zfka z4J`lg@#7h!9P*l#PuTZ+R$6DAAQ(LZ^fmljn+KE2jXx9OPT$U~rbQQs|9^Z1jr^B$ zue&y~e+GS754E-TEWEr(@K(IGo0+4#lOk*psJBk!jh4PjKfbX+h}@-r9!P zwY9OaD!SpBFQu>b^HVaPStsU%>;sn+&*Y->3)7EH*w$cAu-=i|hdWD$pu0BAJcJ>3 zo&r#%MMit%6}&+%YX{?jZ7g^u@Q95x-In}_UYN)NUpc)9_z_6|{=dfBn9O0@#ai(t z0JS`T1x$E~!T0KjCOZ zHJxucY{UqX^1SH#y1Gbr8=!r%$|upGqS9oopv8zd(WGi=QxMz*9hgamzo ziedtlQrVFq#628ehVI>kQ>)e>5|{DP>l-sQn5iq%vfo9_%88SXB7tUZ>Oz&)LR#73`RUhf7cx(Z87D8oeWY2 zqDEcD5^j2*TDFH2zgSy0r^$C9&tP||v*|TIA!klTyBq&;C7BlxAPXr?qP$r5N6DfS zJ1`EEiTcW^w@vHT_G2y|Sh;d&+QvmN_HQqCD;!PvW@Ruh{QMI1mG}y%2}*FQ8BPe~ zv>2b`wk-kMCP;HB*dXtLxd53%p;+t(H#8liMdh4~dUfh#G3_kn8Ol0^g3w=IUtj+) zliq**H9RJ=*N^c0_y2u%eXF@Y9)l5aiHR%89x{R>m>-1}4$|iSmabGPOxcH1i1XvN zz`Moh49Ohq<6{8Y5f&BIe$H}+*2d)w5yT6=Uwo&@dtv#fPoM6@j1`65fb?9M@%oXQ z@Vw`+3o7HA+kJ4RUOj01yD>TRyn1Vs?P1HqI<1BFz%d#_$w0KlZ8%I;~ck6D-2W>$vv z(kG+1g9MlmK9E7Bvk_(K3qfL0xl#998=UqXprR zEd{(9XfR+1&aUEsL&WM!4I3l7aqWQTBibFEUpPPc@>RUmB1z@4Y)KT~hrfZOilYa% zP}8wlt<&h*Q>2H9xkxMi@n!yt)N~UpC@jg4_8e2TfldT>6aB4J+hU|cbw@TC6gTbp zwG?JBZG?pb6wgMT4&x|>R|Jn`@CA9Z%iOmLXG>vVm5*nW4ChcMs?!B5<<4-&j2$!W zC<#U6F5!kb)6*m&D!1t4OC~!?^GP!#u)5m-vlyNL`mr#w5~U@MGQ=tK&piSQ=Q|8^ zb`FId5poXr3+kHP>zOjmF)rcRhd6wHsi7XC?nFh~mjJ-jXqe=?d-s~7rWGf%tx=AN zjNH%0)hl-Xanw2VtQH;rk)`=#(0RH4iF+Vu9`cFUBDmGN+de*D64shRjmu!KqYe1g zZqKwD9Q@c(8BDy0c!3r<#?UK|$Z-{~5Rv+(x8K6&rjc|_yFU2jv=gx~po)Q#a$Tbmv~yhZp9eu zfA6+|#irB_l0XIKfKnR+anD7L@7Xk{4b|>a9CTvmf0K#;98|;kAIF?OCRz>OQBzBM zczxTz=QnaFFjj3^i2Zka!nP=^=w`G@!TFlb#dgz|Ag&6<>6{`<4 z#h}3WG!t+js5NWXUPhZH0o*N3|4;Qs$yU@{22Z^2Es8T!YAf z*?YXPS)2E0;xNUahs6F^6yFJ-NE9+z2;pmDVIv}LMu$71A&@Scj>Gp5ad|AxbOx1;%a zuB3q1MzLD^inJ z5#oISG{=U&!B+VU<4U(Ex-fo^@ggDnV>q79#Fg3#2F_123r|?c=DoG*%x36JL2KkW z)p7gL%KZKDuBL`me=?S(HG}(JBE>cYo^Rh`!j+JmjI?g1?~ECTW~;v-KJ2xZwA*F? z8$jtaeJ0O!caYA2W7z(HB`_h=VPY{W=NbUi)cO_?2s@`x)F0B<%bbDV&8HV?W41YAEMs9&)Jl0J{N zPUcdumPO8zZhQygqu$V=myK>EtX=z%Prr<>kYOs6Pbd@H%~+02y!;lRCxbgBZTF@b zQAaNn%23k{*T(=l;yOF((B!^|Lj7*~jT&za$%I zC_E30Utu)%=a1AjwE8t4WAz$yaG|JU?TIRk>z(5Gxd4*v*dnu`KtowvJ*0olsQpCD zNjO*T+&O#j&fmz5w2=vZQu6=ui)f+8-N6W96(tb^G92Q1GNgZDKBi*)yFpetkpkfo z9+}`o)w+}p%<1d#%$FosA=u#Rp~++#+TU1uj-Y9SfqQgg`+IOEpc!QJ3brko7>g`I z252O^kixg{H^l+eJG8*=F}nf4#Ww^0Cd@X^Q0mCEr9v&IoLWAc2`v__v_gjEP`vf0 zAol~sm|#J}0-eL)!s?z8fW*xubP_`1d!9de4JKI(R8jvpQt)BvBEYC9oCIad$Kjbx z87IZ8xZ$>%;xNuLkkM4De0Bu{6VnHd+`x*D#UMKkb1A-Tp=SDqSLSlf+1ObW!4Lh%|Pf!OvEV#%HPrHz@ZSkZ}4jD3KCnB;&SJ zv!utEp63_z4*IGi%6m8`+BH{ztR1ZxBW*zhHHqqEWfil#;2D!xVyhuPn7WHD<}`%| zDCG(SxUCRfaJ}`JmHu_7tvn7#^6?||HvhKD<(3w0PTMm0l6gwmS z@zroFVJ=8mJW(2tfjp!*aN}1Lu2rVk$e;6p@|QMf8O86PX9-bQM`pKB&kT&M3w~$I z!lLl8)DgA$QZxCQh!%mfDo(OMIq{?V5K_f52Md#;I|`X26P+laS;^6`vuDn1<^|(8 z)#nQ80mt`i#?gm!G*96uiOC{7LM!@Kyyw4e{`8OEy84fajV6set*vb)-oY}<$-!pB zt?P^KGlef?g4&nsL;1I=XO!r71aKk2d!i^3%>bM(8?E~gmurd$6j_YeqQ*Q%aisJv zyG;uP1OJF@FH?4s8S_4aOpq&dy%2m+TGzih>_jjWpLdu58&1Xlw z%|m$qWS$t^&9zijAEIeM3i0KC`xMnx;vawsBGf}mAk!hF3}iB+#$S-qlS+ zv{JVhQ-TNpN`bqSPjeym9b+c9S%sK=KqZ(FFY#i+sf9iwGQZ&9q$MOfB(Qo?qE{2c znG~1klo5`h-aNx(gFs(uspgwOtK?}TW}UhS@W_@j+hm}JEkK13Q*(mYKaWYtj>EQo zTK|@K*^^Is++^@1YNj9FH~%Prjg%t84mw1cEb#A)rl08$j&zzdX;MU#n&RB$%d*s7 zaSEjbVIbh^#~l~eg1ik{wcD1zN3_vlSl~!ByqaW)h94IFF46(Iv`2_hW4B(p&W$Fb z_oFW%+SaL5p~PWBRiLM*C-Px^B)Jr=iz(3S)~jcde+#`1H$1Q1h`$Bv zkSEFs8VIT|BRx}SZ)X?L{1yYe3|o1)rv22H@(;!-#z;2()tT5hczogarc^rBf^vQw zt{@82wZ4ILsp7mW^KY;}jxinR#DN-UK{|IP9WJIpmjHtZ6|iX7EOl zXGY5B+&++|FxtM=&Tue6Z=f0J9K88*J#)5hUd+!{SAu^If3ijm+#P}gd zmY5a&lGIdvboTxBTh@+ev*JMlp{9U~{@XY;ENtLRG+ai>zHHoVETeHq11Uxua7Bff z63o8~6N(vF#)rX*Xv4^wanU^X5=%VcQ47&-X=G*AavjMaLk60sX19 zx#~**d4+uv3u1Dz2+R?w0!F-8UHZVuVHd2s43{9_I^vJ=L1Hw+bv8$W8Y(2s5GB~> z?dLWC^Z1{>c21WQW7LD{Q63}94itPa1Vtj{vKlLPEW~D~7^YJfim5%fz2v43dk3g- z#Q0L`^nn9fo+ivuKrTLT;K043C#x!(fuUyujTjI7ypVkCz&n%TX~z~3Q~dL5c=x|w zc3Ti;a1|O`g@TUU5Z{vV&QJw9KjzlaYCA>0lsPlT8Km^4Bh?tvzvV7UFp<@fb5y{# zW_%&^iFyLH1rEz%J0j*9ZT=fgjBV5WpT7lvjt)tyX|ApP{Uwdz7{qjqJNbs*J1Rv2 z&>9%O+!I5Cpyg8G!>Q8IghEnao*~0Hq+u+7^ck|*KJw3<#&`Zc~+Kv?i8|_>2 zmTZCf@nRFdVmJ?}F4Miax>&#@{Sy{rPiaiQe>rIW`^f36lo0fB-)h1QEpQQ(y_^?} z@1$1)KNTr2E4>$=IC0`eC&Y$7f7y(x4l;{O`f7<+ut2z62vkvv(J!NYsez(u$D^wg z-Vg&0<7&xwMrGnqF<;o)AF=#PY0Ovn^o#7(v z9LE#ku8H&C&b0r2l3Tm~_igKivjqjx_#$Ax%2@sxqe##RDSFR@zhZYC`7VIfv`*ja6Rpz?US6)AULF+N(`l z{r7n)HXURT92T~Hw)C2*y2_HPDxXVt#(YVU?Y$%})Ed zd*JV9%k~}NxJ9!F=Rn!Hs)>l~$+QDwSJ@1Zkp&hhQR~O9DcM(4hlZ5Fo_`ys{`*`1 z>$QIXbffE%idGRUJpKyQWp2~WzuxHNPRa1pI_UZ|NoEhugB$@ f@PEC9$5jfgXCJq{uA#D4!Iz`MkbZmZMu+@AfjZ)x literal 0 HcmV?d00001 diff --git a/docs/usage/evidence/qwen3-next-moe-route-b200/report.json b/docs/usage/evidence/qwen3-next-moe-route-b200/report.json new file mode 100644 index 000000000..271e69c8a --- /dev/null +++ b/docs/usage/evidence/qwen3-next-moe-route-b200/report.json @@ -0,0 +1,236 @@ +{ + "kind": "qwen3_next_prior_art_report", + "rfc": 428, + "rl_kernel_commit": "2e950f386bd3c4c2c07f41472f48878be94ea3b8", + "tracked_tree_dirty": false, + "environment": { + "gpu": "NVIDIA B200", + "torch": "2.13.0+cu130", + "cuda": "13.0", + "libraries": { + "vllm": "0.30.0", + "flashinfer-python": "0.6.18.post1", + "transformers": "5.17.0", + "triton": "3.7.1", + "sglang": null, + "megatron-core": null, + "transformer_engine": null, + "vime": null + } + }, + "op": "qwen3_next_routed_moe", + "shape": { + "hidden": 2048, + "experts": 512, + "top_k": 10, + "expert_width": 512 + }, + "probe_rows": 8, + "candidates": [ + { + "key": "rl_kernel_cuda", + "name": "rl-kernel shared_moe", + "source": "rl_engine.integrations.qwen3_next_forward.shared_moe", + "route_rows_bitwise": { + "16": true, + "64": true, + "256": true, + "1024": true + }, + "output_rows_bitwise": { + "16": true, + "64": true, + "256": true, + "1024": true + }, + "repeatable": true, + "dx_rows_bitwise": { + "16": true, + "64": true, + "256": true, + "1024": true + }, + "dweight_zero_rows_bitwise": { + "16": true, + "64": true, + "256": true, + "1024": true + }, + "accuracy": { + "rel_l2_vs_fp64": 0.0038748319159183277, + "max_abs_vs_fp64": 0.0021274995396960983, + "tokens_with_different_expert_set": 0, + "tokens": 256 + }, + "batch_invariant": true + }, + { + "key": "hf_transformers", + "name": "HF transformers Qwen3NextExperts (eager)", + "source": "transformers 5.17.0 modeling_qwen3_next", + "route_rows_bitwise": { + "16": true, + "64": true, + "256": true, + "1024": true + }, + "output_rows_bitwise": { + "16": true, + "64": true, + "256": true, + "1024": true + }, + "repeatable": true, + "dx_rows_bitwise": { + "16": true, + "64": true, + "256": true, + "1024": false + }, + "dweight_zero_rows_bitwise": { + "16": true, + "64": true, + "256": true, + "1024": false + }, + "accuracy": { + "rel_l2_vs_fp64": 0.0700071926559018, + "max_abs_vs_fp64": 0.10691143625663532, + "tokens_with_different_expert_set": 11, + "tokens": 256 + }, + "batch_invariant": false + }, + { + "key": "vllm_bi0", + "name": "vLLM fused_topk + fused_experts (Triton), VLLM_BATCH_INVARIANT=0", + "source": "vllm 0.30.0 model_executor/layers/fused_moe", + "route_rows_bitwise": { + "16": true, + "64": true, + "256": false, + "1024": false + }, + "output_rows_bitwise": { + "16": true, + "64": true, + "256": false, + "1024": false + }, + "repeatable": true, + "accuracy": { + "rel_l2_vs_fp64": 0.06987086350006304, + "max_abs_vs_fp64": 0.10691143625663532, + "tokens_with_different_expert_set": 11, + "tokens": 256 + }, + "batch_invariant": false + }, + { + "key": "vllm_bi1", + "name": "vLLM fused_topk + fused_experts (Triton), VLLM_BATCH_INVARIANT=1", + "source": "vllm 0.30.0 model_executor/layers/fused_moe", + "route_rows_bitwise": { + "16": true, + "64": true, + "256": true, + "1024": true + }, + "output_rows_bitwise": { + "16": true, + "64": true, + "256": true, + "1024": true + }, + "repeatable": true, + "accuracy": { + "rel_l2_vs_fp64": 0.06987086350006304, + "max_abs_vs_fp64": 0.10691143625663532, + "tokens_with_different_expert_set": 11, + "tokens": 256 + }, + "batch_invariant": true + }, + { + "key": "flashinfer_cutlass", + "name": "FlashInfer cutlass_fused_moe (routes from torch.topk)", + "source": "flashinfer 0.6.18.post1 fused_moe.cutlass_fused_moe", + "route_rows_bitwise": { + "16": true, + "64": true, + "256": false, + "1024": false + }, + "output_rows_bitwise": { + "16": true, + "64": true, + "256": false, + "1024": false + }, + "repeatable": true, + "accuracy": { + "rel_l2_vs_fp64": 0.06984271064260991, + "max_abs_vs_fp64": 0.10739971750663532, + "tokens_with_different_expert_set": 11, + "tokens": 256 + }, + "batch_invariant": false + } + ], + "latency": { + "forward_us": { + "1": { + "rl_kernel_cuda": 1376.3200044631958, + "hf_transformers": 2020.9439992904663, + "vllm_bi0": 356.7200005054474, + "vllm_bi1": 367.8240031003952, + "flashinfer_cutlass": 341.74399077892303 + }, + "8": { + "rl_kernel_cuda": 1379.8879981040955, + "hf_transformers": 12903.615951538086, + "vllm_bi0": 364.6879941225052, + "vllm_bi1": 366.5599972009659, + "flashinfer_cutlass": 385.2960020303726 + }, + "64": { + "rl_kernel_cuda": 1706.6399455070496, + "hf_transformers": 60610.20851135254, + "vllm_bi0": 653.984010219574, + "vllm_bi1": 660.3359878063202, + "flashinfer_cutlass": 672.1920073032379 + }, + "256": { + "rl_kernel_cuda": 1892.9439783096313, + "hf_transformers": 85160.57586669922, + "vllm_bi0": 778.6239981651306, + "vllm_bi1": 785.8560085296631, + "flashinfer_cutlass": 831.5519988536835 + }, + "1024": { + "rl_kernel_cuda": 2048.975944519043, + "hf_transformers": 88626.1100769043, + "vllm_bi0": 872.2079992294312, + "vllm_bi1": 881.5999925136566, + "flashinfer_cutlass": 850.0800132751465 + }, + "4096": { + "rl_kernel_cuda": 3047.216057777405, + "hf_transformers": 88805.53817749023, + "vllm_bi0": 1060.5120062828064, + "vllm_bi1": 1061.1519813537598, + "flashinfer_cutlass": 1079.200029373169 + } + }, + "forward_plus_backward_us": { + "64": { + "rl_kernel_cuda": 111661.79275512695, + "hf_transformers": 877700.2563476562 + }, + "1024": { + "rl_kernel_cuda": 166025.42114257812, + "hf_transformers": 1282811.6455078125 + } + } + } +} diff --git a/docs/usage/evidence/qwen3-next-moe-route-b200/tp4-moe/rank-0.json b/docs/usage/evidence/qwen3-next-moe-route-b200/tp4-moe/rank-0.json new file mode 100644 index 000000000..188c00b77 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-moe-route-b200/tp4-moe/rank-0.json @@ -0,0 +1,45 @@ +{ + "status": "passed", + "scope": "tp4_moe_block_layer0", + "rank": 0, + "rl_kernel_commit": "2e950f386bd3c4c2c07f41472f48878be94ea3b8", + "tracked_tree_dirty": false, + "provider": "qwen3-next-shared-cuda-forward-v1", + "environment": { + "gpu": "NVIDIA B200", + "torch": "2.13.0+cu130", + "vllm": "0.30.0", + "nccl": "2.29.7" + }, + "moe": { + "cases": [ + "hf-load-export-all512experts", + "routes-replicated-8", + "full-chunk-reorder-8", + "routes-replicated-64", + "full-chunk-reorder-64", + "routes-replicated-256", + "full-chunk-reorder-256", + "routes-replicated-1024", + "full-chunk-reorder-1024", + "training-forward", + "all-parameter-gradient", + "replicated-router-gradient" + ], + "gradient_max_abs": { + "gate.weight": 1.9354047253727913e-09, + "experts.gate_up": 4.598405212163925e-09, + "experts.down": 7.8580342233181e-09, + "shared_expert.gate_proj.weight": 2.5890767574310303e-07, + "shared_expert.up_proj.weight": 4.3585896492004395e-07, + "shared_expert.down_proj.weight": 2.9243528842926025e-07, + "shared_expert_gate.weight": 5.513429641723633e-07 + }, + "forward_us": { + "8": 2185.663938522339, + "64": 2399.2319107055664, + "256": 1903.6799669265747, + "1024": 1860.6079816818237 + } + } +} diff --git a/docs/usage/evidence/qwen3-next-moe-route-b200/tp4-moe/rank-1.json b/docs/usage/evidence/qwen3-next-moe-route-b200/tp4-moe/rank-1.json new file mode 100644 index 000000000..755bed167 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-moe-route-b200/tp4-moe/rank-1.json @@ -0,0 +1,45 @@ +{ + "status": "passed", + "scope": "tp4_moe_block_layer0", + "rank": 1, + "rl_kernel_commit": "2e950f386bd3c4c2c07f41472f48878be94ea3b8", + "tracked_tree_dirty": false, + "provider": "qwen3-next-shared-cuda-forward-v1", + "environment": { + "gpu": "NVIDIA B200", + "torch": "2.13.0+cu130", + "vllm": "0.30.0", + "nccl": "2.29.7" + }, + "moe": { + "cases": [ + "hf-load-export-all512experts", + "routes-replicated-8", + "full-chunk-reorder-8", + "routes-replicated-64", + "full-chunk-reorder-64", + "routes-replicated-256", + "full-chunk-reorder-256", + "routes-replicated-1024", + "full-chunk-reorder-1024", + "training-forward", + "all-parameter-gradient", + "replicated-router-gradient" + ], + "gradient_max_abs": { + "gate.weight": 1.9354047253727913e-09, + "experts.gate_up": 2.240994945168495e-09, + "experts.down": 5.558831617236137e-09, + "shared_expert.gate_proj.weight": 3.129243850708008e-07, + "shared_expert.up_proj.weight": 3.725290298461914e-07, + "shared_expert.down_proj.weight": 4.6938657760620117e-07, + "shared_expert_gate.weight": 5.513429641723633e-07 + }, + "forward_us": { + "8": 2204.67209815979, + "64": 2400.2881050109863, + "256": 1920.4479455947876, + "1024": 1854.464054107666 + } + } +} diff --git a/docs/usage/evidence/qwen3-next-moe-route-b200/tp4-moe/rank-2.json b/docs/usage/evidence/qwen3-next-moe-route-b200/tp4-moe/rank-2.json new file mode 100644 index 000000000..72343dc29 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-moe-route-b200/tp4-moe/rank-2.json @@ -0,0 +1,45 @@ +{ + "status": "passed", + "scope": "tp4_moe_block_layer0", + "rank": 2, + "rl_kernel_commit": "2e950f386bd3c4c2c07f41472f48878be94ea3b8", + "tracked_tree_dirty": false, + "provider": "qwen3-next-shared-cuda-forward-v1", + "environment": { + "gpu": "NVIDIA B200", + "torch": "2.13.0+cu130", + "vllm": "0.30.0", + "nccl": "2.29.7" + }, + "moe": { + "cases": [ + "hf-load-export-all512experts", + "routes-replicated-8", + "full-chunk-reorder-8", + "routes-replicated-64", + "full-chunk-reorder-64", + "routes-replicated-256", + "full-chunk-reorder-256", + "routes-replicated-1024", + "full-chunk-reorder-1024", + "training-forward", + "all-parameter-gradient", + "replicated-router-gradient" + ], + "gradient_max_abs": { + "gate.weight": 1.9354047253727913e-09, + "experts.gate_up": 2.0227162167429924e-09, + "experts.down": 5.122274160385132e-09, + "shared_expert.gate_proj.weight": 2.337619662284851e-07, + "shared_expert.up_proj.weight": 3.9674341678619385e-07, + "shared_expert.down_proj.weight": 2.384185791015625e-07, + "shared_expert_gate.weight": 5.513429641723633e-07 + }, + "forward_us": { + "8": 2204.67209815979, + "64": 2398.303985595703, + "256": 1881.0559511184692, + "1024": 1856.511950492859 + } + } +} diff --git a/docs/usage/evidence/qwen3-next-moe-route-b200/tp4-moe/rank-3.json b/docs/usage/evidence/qwen3-next-moe-route-b200/tp4-moe/rank-3.json new file mode 100644 index 000000000..2c4d8f376 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-moe-route-b200/tp4-moe/rank-3.json @@ -0,0 +1,45 @@ +{ + "status": "passed", + "scope": "tp4_moe_block_layer0", + "rank": 3, + "rl_kernel_commit": "2e950f386bd3c4c2c07f41472f48878be94ea3b8", + "tracked_tree_dirty": false, + "provider": "qwen3-next-shared-cuda-forward-v1", + "environment": { + "gpu": "NVIDIA B200", + "torch": "2.13.0+cu130", + "vllm": "0.30.0", + "nccl": "2.29.7" + }, + "moe": { + "cases": [ + "hf-load-export-all512experts", + "routes-replicated-8", + "full-chunk-reorder-8", + "routes-replicated-64", + "full-chunk-reorder-64", + "routes-replicated-256", + "full-chunk-reorder-256", + "routes-replicated-1024", + "full-chunk-reorder-1024", + "training-forward", + "all-parameter-gradient", + "replicated-router-gradient" + ], + "gradient_max_abs": { + "gate.weight": 1.9354047253727913e-09, + "experts.gate_up": 2.546585164964199e-09, + "experts.down": 5.296897143125534e-09, + "shared_expert.gate_proj.weight": 1.2665987014770508e-07, + "shared_expert.up_proj.weight": 2.644956111907959e-07, + "shared_expert.down_proj.weight": 2.998858690261841e-07, + "shared_expert_gate.weight": 5.513429641723633e-07 + }, + "forward_us": { + "8": 2206.4640522003174, + "64": 2399.104118347168, + "256": 1923.0719804763794, + "1024": 1855.455994606018 + } + } +} From 65170777576cb957fb5557ef13bb46ce695a9f1a Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Fri, 9 Oct 2026 02:19:35 +0000 Subject: [PATCH 48/70] test(qwen3-next): prior-art runner for the TP4 D=256 attention core Compares RL-Kernel's deterministic attention with torch SDPA, vLLM FlashAttention-2 (num_splits auto and 1), vLLM's Triton unified attention and FlashInfer's ragged prefill: batch, chunked-prefill and decode invariance, backward repeatability, accuracy against FP64 and latency. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- .../testing/qwen3_next_attention_prior_art.py | 404 ++++++++++++++++++ .../plot_qwen3_next_attention_prior_art.py | 138 ++++++ scripts/qwen3_next_attention_prior_art.py | 87 ++++ 3 files changed, 629 insertions(+) create mode 100644 rl_engine/testing/qwen3_next_attention_prior_art.py create mode 100644 scripts/plot_qwen3_next_attention_prior_art.py create mode 100644 scripts/qwen3_next_attention_prior_art.py diff --git a/rl_engine/testing/qwen3_next_attention_prior_art.py b/rl_engine/testing/qwen3_next_attention_prior_art.py new file mode 100644 index 000000000..8a089b84a --- /dev/null +++ b/rl_engine/testing/qwen3_next_attention_prior_art.py @@ -0,0 +1,404 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Prior-art comparison for the Qwen3-Next TP4 full-attention core (D=256, GQA 4:1). + +Every candidate computes causal attention for one rank of Qwen3-Next's TP4 +layout: 4 query heads over 1 KV head, head dim 256, scale 1/16, queries aligned +to the end of the KV sequence. For each candidate the report records + +* **batch invariance** - a target sequence's output computed alone, and inside + a batch with three other sequences (placed first and last), must be bitwise + equal; for candidates with a backward, the same for its dq/dk/dv; +* **prefill/decode invariance** - the last 64 query rows, and the last single + row, computed against the full KV must equal the same rows of the full + prefill. This is the replay-vs-rollout boundary of RFC #428; +* **repeatability** - two identical calls are bitwise equal; +* **accuracy** - error against an FP64 evaluation; +* **performance** - median CUDA-event latency of prefill, decode and backward. + +A candidate that cannot be imported or launched in the pinned environment is +recorded as ``unavailable`` with the reason instead of failing the run. +""" + +from __future__ import annotations + +import statistics +from typing import Any, Callable + +import torch +import torch.nn.functional as F + +HQ, HKV, D = 4, 1, 256 +SCALE = 1.0 / 16 +TARGET = 1000 +COMPANIONS = (777, 1500, 64) +CHUNK = 64 +PREFILL_TOKENS = (512, 2048, 8192) +DECODE_KV = 8192 +BACKWARD_TOKENS = 2048 + + +# --------------------------------------------------------------------------- # +# Measurement helpers +# --------------------------------------------------------------------------- # + + +def _sample_us(fn: Callable[[], Any]) -> float: + torch.cuda.synchronize() + start = torch.cuda.Event(enable_timing=True) + end = torch.cuda.Event(enable_timing=True) + start.record() + fn() + end.record() + torch.cuda.synchronize() + return start.elapsed_time(end) * 1000.0 + + +def time_interleaved(calls: dict[str, Callable[[], Any]], warmup: int = 5, iters: int = 30): + keys = list(calls) + orders = (keys, list(reversed(keys))) + for i in range(warmup): + for key in orders[i % 2]: + calls[key]() + samples = {key: [] for key in keys} + for i in range(iters): + for key in orders[i % 2]: + samples[key].append(_sample_us(calls[key])) + return {key: statistics.median(values) for key, values in samples.items()} + + +def _bitwise(a: torch.Tensor, b: torch.Tensor) -> bool: + return a.shape == b.shape and a.dtype == b.dtype and torch.equal(a, b) + + +def _guard(key: str, factory: Callable[[], dict[str, Any]]) -> dict[str, Any]: + try: + return {"key": key, **factory()} + except Exception as exc: # noqa: BLE001 - record and continue + return {"key": key, "unavailable": f"{type(exc).__name__}: {str(exc)[:300]}"} + + +def make_sequence(length: int, seed: int, *, kv_length: int | None = None): + """q [Lq, HQ, D], k/v [Lk, HKV, D] in BF16 (token-major, as engines store them).""" + kv_length = length if kv_length is None else kv_length + g = torch.Generator(device="cuda").manual_seed(seed) + + def randn(*shape): + return torch.randn(shape, device="cuda", generator=g).to(torch.bfloat16) + + return randn(length, HQ, D), randn(kv_length, HKV, D), randn(kv_length, HKV, D) + + +def fp64_reference(q, k, v): + lq, lk = q.shape[0], k.shape[0] + qd, kd, vd = (t.double().transpose(0, 1) for t in (q, k, v)) + kd, vd = kd.expand(HQ, -1, -1), vd.expand(HQ, -1, -1) + scores = qd @ kd.transpose(1, 2) * SCALE + rows = torch.arange(lq, device=q.device)[:, None] + (lk - lq) + scores = scores.masked_fill(torch.arange(lk, device=q.device)[None, :] > rows, float("-inf")) + return (scores.softmax(-1) @ vd).transpose(0, 1) + + +# --------------------------------------------------------------------------- # +# Candidates +# +# ``run(seqs) -> outputs``: ``seqs`` is a list of (q, k, v) with queries aligned +# to the end of each KV sequence; every candidate computes the whole list in the +# way its engine batches it (one varlen launch, or one launch per sequence). +# ``grad(q, k, v, dy) -> (dq, dk, dv)`` when the candidate has a backward. +# --------------------------------------------------------------------------- # + + +def _rl_kernel(): + from rl_engine.integrations.qwen3_next_forward import shared_attention + + def one(q, k, v): + out = shared_attention(*(t.transpose(0, 1).unsqueeze(0) for t in (q, k, v))) + return out.squeeze(0).transpose(0, 1) + + def run(seqs): + with torch.no_grad(): + return [one(*s) for s in seqs] + + def grad(q, k, v, dy): + leaves = [t.detach().clone().requires_grad_(True) for t in (q, k, v)] + return torch.autograd.grad(one(*leaves), leaves, dy) + + return { + "name": "RL-Kernel deterministic attention (one launch per sequence)", + "source": "rl_engine.integrations.qwen3_next_forward.shared_attention", + "run": run, + "grad": grad, + } + + +def _sdpa(): + def one(q, k, v): + lq, lk = q.shape[0], k.shape[0] + qh, kh, vh = (t.transpose(0, 1).unsqueeze(0) for t in (q, k, v)) + if lq == lk: + out = F.scaled_dot_product_attention( + qh, kh, vh, is_causal=True, scale=SCALE, enable_gqa=True + ) + else: + rows = torch.arange(lq, device=q.device)[:, None] + (lk - lq) + mask = torch.arange(lk, device=q.device)[None, :] <= rows + out = F.scaled_dot_product_attention( + qh, kh, vh, attn_mask=mask, scale=SCALE, enable_gqa=True + ) + return out.squeeze(0).transpose(0, 1) + + def run(seqs): + with torch.no_grad(): + return [one(*s) for s in seqs] + + def grad(q, k, v, dy): + leaves = [t.detach().clone().requires_grad_(True) for t in (q, k, v)] + return torch.autograd.grad(one(*leaves), leaves, dy) + + return { + "name": "torch SDPA (default backend, one launch per sequence)", + "source": f"torch {torch.__version__} scaled_dot_product_attention", + "run": run, + "grad": grad, + } + + +def _cu(lengths): + out = [0] + for n in lengths: + out.append(out[-1] + n) + return torch.tensor(out, device="cuda", dtype=torch.int32) + + +def _split(out, lengths): + return list(out.split(list(lengths))) + + +def _vllm_fa(num_splits: int): + import vllm + from vllm.vllm_flash_attn import flash_attn_varlen_func + + def run(seqs): + lq = [s[0].shape[0] for s in seqs] + lk = [s[1].shape[0] for s in seqs] + q, k, v = (torch.cat([s[i] for s in seqs]) for i in range(3)) + out = flash_attn_varlen_func( + q, + k, + v, + max_seqlen_q=max(lq), + cu_seqlens_q=_cu(lq), + max_seqlen_k=max(lk), + cu_seqlens_k=_cu(lk), + softmax_scale=SCALE, + causal=True, + num_splits=num_splits, + fa_version=2, + ) + return _split(out, lq) + + return { + "name": f"vLLM FlashAttention-2 varlen, num_splits={num_splits}", + "source": f"vllm {vllm.__version__} vllm_flash_attn.flash_attn_varlen_func", + "run": run, + } + + +def _vllm_triton(): + import vllm + from vllm.v1.attention.ops.triton_unified_attention import unified_attention + + block = 16 + + def run(seqs): + lq = [s[0].shape[0] for s in seqs] + lk = [s[1].shape[0] for s in seqs] + blocks = [(n + block - 1) // block for n in lk] + k_cache = torch.zeros(sum(blocks), block, HKV, D, device="cuda", dtype=torch.bfloat16) + v_cache = torch.zeros_like(k_cache) + table = torch.zeros(len(seqs), max(blocks), device="cuda", dtype=torch.int32) + first = 0 + for i, (s, n) in enumerate(zip(seqs, blocks)): + pad = n * block - s[1].shape[0] + k_cache[first : first + n] = F.pad(s[1], (0, 0, 0, 0, 0, pad)).view(n, block, HKV, D) + v_cache[first : first + n] = F.pad(s[2], (0, 0, 0, 0, 0, pad)).view(n, block, HKV, D) + table[i, :n] = torch.arange(first, first + n, device="cuda") + first += n + q = torch.cat([s[0] for s in seqs]) + out = torch.empty_like(q) + unified_attention( + q, + k_cache, + v_cache, + out, + cu_seqlens_q=_cu(lq), + max_seqlen_q=max(lq), + seqused_k=torch.tensor(lk, device="cuda", dtype=torch.int32), + max_seqlen_k=max(lk), + softmax_scale=SCALE, + causal=True, + window_size=(-1, -1), + block_table=table, + softcap=0, + q_descale=None, + k_descale=None, + v_descale=None, + ) + return _split(out, lq) + + return { + # Without split-softmax buffers the 2D kernel runs for every batch, which + # is also the only kernel vLLM's batch-invariant mode allows. + "name": "vLLM Triton unified attention (2D kernel)", + "source": f"vllm {vllm.__version__} v1/attention/ops/triton_unified_attention", + "run": run, + } + + +def _flashinfer(): + import flashinfer + + workspace = torch.empty(256 << 20, device="cuda", dtype=torch.uint8) + wrapper = flashinfer.BatchPrefillWithRaggedKVCacheWrapper(workspace, "NHD") + + def run(seqs): + lq = [s[0].shape[0] for s in seqs] + lk = [s[1].shape[0] for s in seqs] + wrapper.plan( + _cu(lq), + _cu(lk), + HQ, + HKV, + D, + causal=True, + sm_scale=SCALE, + q_data_type=torch.bfloat16, + ) + q, k, v = (torch.cat([s[i] for s in seqs]) for i in range(3)) + return _split(wrapper.run(q, k, v), lq) + + return { + "name": "FlashInfer BatchPrefillWithRaggedKVCache", + "source": f"flashinfer {flashinfer.__version__}", + "run": run, + } + + +def candidates() -> list[dict[str, Any]]: + return [ + _guard("rl_kernel_cuda", _rl_kernel), + _guard("torch_sdpa", _sdpa), + _guard("vllm_fa2_auto", lambda: _vllm_fa(0)), + _guard("vllm_fa2_split1", lambda: _vllm_fa(1)), + _guard("vllm_triton_2d", _vllm_triton), + _guard("flashinfer", _flashinfer), + ] + + +# --------------------------------------------------------------------------- # +# Checks +# --------------------------------------------------------------------------- # + + +def _batch_bi(cand, target, others) -> dict[str, bool]: + alone = cand["run"]([target])[0] + first = cand["run"]([target, *others])[0] + last = cand["run"]([*others, target])[-1] + return {"first": _bitwise(first, alone), "last": _bitwise(last, alone)} + + +def _prefill_decode(cand, target) -> dict[str, bool]: + q, k, v = target + full = cand["run"]([target])[0] + result = {} + for rows in (CHUNK, 1): + part = cand["run"]([(q[-rows:], k, v)])[0] + result[f"last_{rows}"] = _bitwise(part, full[-rows:]) + return result + + +def _grad_bi(cand, target, others) -> dict[str, bool]: + g = torch.Generator(device="cuda").manual_seed(5) + dy = torch.randn(target[0].shape, device="cuda", generator=g).to(torch.bfloat16) + alone = cand["grad"](*target, dy) + # A backward is per sequence in every engine here; what can change is the + # kernel the shape selects, so compare against a second target placed after + # other sequences have been differentiated. + for other in others: + cand["grad"](*other, torch.ones_like(other[0])) + again = cand["grad"](*target, dy) + return {name: _bitwise(a, b) for name, a, b in zip(("dq", "dk", "dv"), again, alone)} + + +def _one(cand, target, others) -> dict[str, Any]: + if "unavailable" in cand: + return cand + out = {"key": cand["key"], "name": cand["name"], "source": cand["source"]} + try: + out["batch_bitwise"] = _batch_bi(cand, target, others) + out["prefill_decode_bitwise"] = _prefill_decode(cand, target) + out["repeatable"] = _bitwise(cand["run"]([target])[0], cand["run"]([target])[0]) + if "grad" in cand: + out["backward_repeat_bitwise"] = _grad_bi(cand, target, others) + ref = fp64_reference(*target) + got = cand["run"]([target])[0].double() + out["accuracy"] = { + "rel_l2_vs_fp64": float((got - ref).norm() / ref.norm()), + "max_abs_vs_fp64": float((got - ref).abs().max()), + } + except Exception as exc: # noqa: BLE001 - a crash is a result, not a harness failure + out["failed"] = f"{type(exc).__name__}: {str(exc)[:300]}" + out["batch_invariant"] = bool( + "failed" not in out + and all(out["batch_bitwise"].values()) + and all(out["prefill_decode_bitwise"].values()) + and all(out.get("backward_repeat_bitwise", {"": True}).values()) + ) + return out + + +def _latency(cands) -> dict[str, Any]: + ready = [c for c in cands if "unavailable" not in c] + + def calls_for(seqs): + calls = {} + for cand in ready: + try: + cand["run"](seqs) + except Exception: # noqa: BLE001 - recorded by the BI section + continue + calls[cand["key"]] = lambda c=cand: c["run"](seqs) + return calls + + prefill = { + str(n): time_interleaved(calls_for([make_sequence(n, 300 + n)])) for n in PREFILL_TOKENS + } + decode = time_interleaved(calls_for([make_sequence(1, 401, kv_length=DECODE_KV)])) + q, k, v = make_sequence(BACKWARD_TOKENS, 402) + dy = torch.randn_like(q) + backward = time_interleaved( + {c["key"]: (lambda c=c: c["grad"](q, k, v, dy)) for c in ready if "grad" in c}, + warmup=3, + iters=15, + ) + return { + "prefill_us": prefill, + f"decode_us_kv{DECODE_KV}": decode, + f"forward_plus_backward_us_{BACKWARD_TOKENS}": backward, + } + + +def attention_report() -> dict[str, Any]: + target = make_sequence(TARGET, 1) + others = [make_sequence(n, 10 + i) for i, n in enumerate(COMPANIONS)] + cands = candidates() + return { + "op": "qwen3_next_tp4_attention", + "shape": {"q_heads": HQ, "kv_heads": HKV, "head_dim": D, "scale": SCALE}, + "target_tokens": TARGET, + "companion_tokens": list(COMPANIONS), + "candidates": [_one(c, target, others) for c in cands], + "latency": _latency(cands), + } diff --git a/scripts/plot_qwen3_next_attention_prior_art.py b/scripts/plot_qwen3_next_attention_prior_art.py new file mode 100644 index 000000000..8343c5851 --- /dev/null +++ b/scripts/plot_qwen3_next_attention_prior_art.py @@ -0,0 +1,138 @@ +#!/usr/bin/env python +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Render the TP4 attention prior-art report (``scripts/qwen3_next_attention_prior_art.py``). + + python scripts/plot_qwen3_next_attention_prior_art.py \\ + docs/usage/evidence/qwen3-next-tp4-mixers-b200/attention/report.json + +writes ``figure.png`` next to the report: which invariance checks each +implementation passes, accuracy against FP64, and prefill/decode latency. +""" + +from __future__ import annotations + +import argparse +import json +from pathlib import Path + +import matplotlib + +matplotlib.use("Agg") +import matplotlib.pyplot as plt # noqa: E402 +from matplotlib.colors import ListedColormap # noqa: E402 + +RL_KERNEL = "#2a78d6" +INK = "#2b2b29" +MUTED = "#6f6e69" +GRID = "#e4e3dd" +SURFACE = "#fcfcfb" +PASS = "#1baf7a" +FAIL = "#d64545" +NA = "#e4e3dd" +EXISTING = ("#eb6834", "#b8501f", "#f29a62", "#8a3a15", "#f6bd94", "#d9773f") + +LABELS = { + "rl_kernel_cuda": "RL-Kernel deterministic", + "torch_sdpa": "torch SDPA", + "vllm_fa2_auto": "vLLM FA2 (num_splits auto)", + "vllm_fa2_split1": "vLLM FA2 (num_splits=1)", + "vllm_triton_2d": "vLLM Triton unified (2D)", + "flashinfer": "FlashInfer ragged prefill", +} +COLUMNS = ( + ("batch_bitwise", "first", "batch: first"), + ("batch_bitwise", "last", "batch: last"), + ("prefill_decode_bitwise", "last_64", "chunk: last 64"), + ("prefill_decode_bitwise", "last_1", "decode: last 1"), + ("backward_repeat_bitwise", "dq", "bwd dq"), + ("backward_repeat_bitwise", "dk", "bwd dk"), + ("backward_repeat_bitwise", "dv", "bwd dv"), +) + + +def _style(ax): + ax.set_facecolor(SURFACE) + for side in ("top", "right"): + ax.spines[side].set_visible(False) + ax.tick_params(colors=INK, labelsize=8) + ax.grid(color=GRID, linewidth=0.6) + + +def plot(report: dict, out: Path) -> None: + cands = [c for c in report["candidates"] if "unavailable" not in c and "failed" not in c] + keys = [c["key"] for c in cands] + existing = iter(EXISTING) + colors = {k: RL_KERNEL if k == "rl_kernel_cuda" else next(existing) for k in keys} + labels = [LABELS.get(k, k) for k in keys] + fig, axes = plt.subplots(1, 3, figsize=(17, 4.6), gridspec_kw={"width_ratios": [1.3, 1, 1.4]}) + + ax = axes[0] + grid = [ + [0.5 if c.get(field) is None else float(c[field][item]) for field, item, _ in COLUMNS] + for c in cands + ] + ax.imshow(grid, cmap=ListedColormap([FAIL, NA, PASS]), vmin=0, vmax=1, aspect="auto") + ax.set_xticks(range(len(COLUMNS)), [c[2] for c in COLUMNS], fontsize=7, rotation=90) + ax.set_yticks(range(len(cands)), labels, fontsize=8) + for i, cand in enumerate(cands): + mark = "BI" if cand.get("batch_invariant") else "not BI" + ax.text(len(COLUMNS) - 0.4, i, f" {mark}", va="center", fontsize=8, color=INK) + ax.set_title( + f"Invariance: {report['target_tokens']}-token target alone vs. batched / chunked\n" + "(green bitwise equal, red differs, grey: no backward)", + fontsize=9, + color=INK, + ) + ax.tick_params(length=0) + + ax = axes[1] + _style(ax) + rel = [c["accuracy"]["rel_l2_vs_fp64"] for c in cands] + ax.barh(range(len(cands)), rel, color=[colors[k] for k in keys]) + for i, value in enumerate(rel): + ax.text(value, i, f" {value:.2e}", va="center", fontsize=7, color=MUTED) + ax.set_yticks(range(len(cands)), labels, fontsize=8) + ax.invert_yaxis() + ax.set_xlim(0, 1.35 * max(rel)) + ax.set_xlabel("relative L2 error vs. FP64", fontsize=8) + ax.set_title("Accuracy", fontsize=9, color=INK) + + ax = axes[2] + _style(ax) + prefill = report["latency"]["prefill_us"] + tokens = [int(t) for t in prefill] + for key in keys: + ys = [prefill[str(t)].get(key, float("nan")) / 1000.0 for t in tokens] + ax.plot(tokens, ys, marker="o", ms=3.5, color=colors[key], label=LABELS.get(key, key)) + ax.set_xscale("log", base=2) + ax.set_yscale("log") + ax.set_xlabel("prefill tokens", fontsize=8) + ax.set_ylabel("forward latency (ms, median)", fontsize=8) + ax.set_title("Prefill forward latency\n(4 Q heads, 1 KV head, D=256, causal)", fontsize=9) + ax.legend(fontsize=7, frameon=False) + + env = report["environment"] + fig.suptitle( + f"Qwen3-Next TP4 attention prior art - {env['gpu']}, torch {env['torch']}, " + f"commit {report['rl_kernel_commit'][:7]}", + fontsize=10, + color=INK, + ) + fig.tight_layout() + fig.savefig(out, dpi=160) + + +def main() -> None: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("report", type=Path) + args = parser.parse_args() + report = json.loads(args.report.read_text()) + out = args.report.with_name("figure.png") + plot(report, out) + print(f"wrote {out}") + + +if __name__ == "__main__": + main() diff --git a/scripts/qwen3_next_attention_prior_art.py b/scripts/qwen3_next_attention_prior_art.py new file mode 100644 index 000000000..2ded9d0ca --- /dev/null +++ b/scripts/qwen3_next_attention_prior_art.py @@ -0,0 +1,87 @@ +#!/usr/bin/env python +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Write the Qwen3-Next TP4 attention prior-art report (BI + accuracy + latency) as JSON. + +Run it on a clean tree with ``rl_engine._C`` built in place. The report records +the commit, whether the tracked tree was dirty and the version of every library +compared. +``scripts/plot_qwen3_next_attention_prior_art.py`` turns the report into a figure. + + python scripts/qwen3_next_attention_prior_art.py \\ + --out docs/usage/evidence/qwen3-next-tp4-mixers-b200/attention/report.json +""" + +from __future__ import annotations + +import argparse +import importlib.metadata as md +import json +import subprocess +import sys +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT)) + +import torch # noqa: E402 + +from rl_engine.testing.qwen3_next_attention_prior_art import attention_report # noqa: E402 + +LIBRARIES = ( + "vllm", + "flashinfer-python", + "transformers", + "triton", + "sglang", + "megatron-core", + "transformer_engine", + "vime", +) + + +def _git(*args: str) -> str: + return subprocess.run( + ["git", *args], cwd=ROOT, check=True, capture_output=True, text=True + ).stdout.strip() + + +def _version(name: str) -> str | None: + try: + return md.version(name) + except md.PackageNotFoundError: + return None + + +def main() -> None: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--out", type=Path, required=True) + args = parser.parse_args() + if not torch.cuda.is_available(): + raise SystemExit("needs a CUDA device") + torch.backends.cuda.matmul.allow_tf32 = False + torch.backends.cudnn.allow_tf32 = False + report = { + "kind": "qwen3_next_prior_art_report", + "rfc": 428, + "rl_kernel_commit": _git("rev-parse", "HEAD"), + "tracked_tree_dirty": bool(_git("status", "--porcelain", "--untracked-files=no")), + "environment": { + "gpu": torch.cuda.get_device_name(), + "torch": torch.__version__, + "cuda": torch.version.cuda, + "libraries": {name: _version(name) for name in LIBRARIES}, + }, + **attention_report(), + } + args.out.parent.mkdir(parents=True, exist_ok=True) + args.out.write_text(json.dumps(report, indent=2) + "\n") + print( + f"wrote {args.out} (commit {report['rl_kernel_commit'][:7]}, " + f"dirty={report['tracked_tree_dirty']})" + ) + + +if __name__ == "__main__": + main() From b6fddb358e5d73806f8afee1891828b1ce4e29c6 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Fri, 9 Oct 2026 02:31:53 +0000 Subject: [PATCH 49/70] docs(qwen3-next): TP4 mixer gates and D=256 attention prior-art evidence (B200, 9e6c4f2/6517077) Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- docs/operators/attention.md | 2 +- .../qwen3-next-tp4-mixers-b200/README.md | 36 ++++ .../attention/figure.png | Bin 0 -> 204631 bytes .../attention/report.json | 200 ++++++++++++++++++ .../tp4-attention/rank-0.json | 36 ++++ .../tp4-attention/rank-1.json | 36 ++++ .../tp4-attention/rank-2.json | 36 ++++ .../tp4-attention/rank-3.json | 36 ++++ .../tp4-gdn/rank-0.json | 32 +++ .../tp4-gdn/rank-1.json | 32 +++ .../tp4-gdn/rank-2.json | 32 +++ .../tp4-gdn/rank-3.json | 32 +++ .../tp4-moe/rank-0.json | 45 ++++ .../tp4-moe/rank-1.json | 45 ++++ .../tp4-moe/rank-2.json | 45 ++++ .../tp4-moe/rank-3.json | 45 ++++ 16 files changed, 689 insertions(+), 1 deletion(-) create mode 100644 docs/usage/evidence/qwen3-next-tp4-mixers-b200/README.md create mode 100644 docs/usage/evidence/qwen3-next-tp4-mixers-b200/attention/figure.png create mode 100644 docs/usage/evidence/qwen3-next-tp4-mixers-b200/attention/report.json create mode 100644 docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-attention/rank-0.json create mode 100644 docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-attention/rank-1.json create mode 100644 docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-attention/rank-2.json create mode 100644 docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-attention/rank-3.json create mode 100644 docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-gdn/rank-0.json create mode 100644 docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-gdn/rank-1.json create mode 100644 docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-gdn/rank-2.json create mode 100644 docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-gdn/rank-3.json create mode 100644 docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-moe/rank-0.json create mode 100644 docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-moe/rank-1.json create mode 100644 docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-moe/rank-2.json create mode 100644 docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-moe/rank-3.json diff --git a/docs/operators/attention.md b/docs/operators/attention.md index 074bf9046..95537707f 100644 --- a/docs/operators/attention.md +++ b/docs/operators/attention.md @@ -265,7 +265,7 @@ for measured peak memory at representative shapes. ## Known Limitations -- First version: `D=128` only (Qwen3-8B alignment). +- Head dim: `D=128` (Qwen3-8B) on CUDA and ROCm; `D=256` (Qwen3-Next full attention) on CUDA only. - Supported dtypes: BF16, FP16. - Full materialization of scores/P limits practical sequence length. - `Hq` must be divisible by `Hkv` (raises `ValueError` otherwise). diff --git a/docs/usage/evidence/qwen3-next-tp4-mixers-b200/README.md b/docs/usage/evidence/qwen3-next-tp4-mixers-b200/README.md new file mode 100644 index 000000000..40d824d59 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-tp4-mixers-b200/README.md @@ -0,0 +1,36 @@ +# Qwen3-Next TP4 mixers: real-weight gates and attention prior art (B200) + +| Directory | Measured at | Produced by | +| --- | --- | --- | +| `tp4-gdn/` | `9e6c4f2` | `torchrun --nproc-per-node 4 scripts/qwen3_next_tp_gdn_check.py --checkpoint --output tp4-gdn` | +| `tp4-attention/` | `9e6c4f2` | `torchrun --nproc-per-node 4 scripts/qwen3_next_tp_attention_check.py --checkpoint --output tp4-attention` | +| `tp4-moe/` | `9e6c4f2` | `TRITON_F32_DEFAULT=ieee torchrun --nproc-per-node 4 scripts/qwen3_next_tp_moe_check.py --checkpoint --output tp4-moe` | +| `attention/report.json`, `attention/figure.png` | `6517077` | `python scripts/qwen3_next_attention_prior_art.py --out attention/report.json`, then `scripts/plot_qwen3_next_attention_prior_art.py` | + +Every file records its commit and `tracked_tree_dirty: false`; each run used a +clean clone with its own `rl_engine._C` built in place, on B200 GPUs (driver +580.126.20), torch 2.13.0+cu130, vLLM 0.30.0, NCCL 2.29.7. `` is the +official `Qwen/Qwen3-Next-80B-A3B-Instruct` revision +`9c7f2fbe84465e40164a94cc16cd30b6999b0cc7`: the GDN and MoE gates read layer 0, +the attention gate layer 3. `6517077` adds only the attention prior-art runner +and plot on top of `9e6c4f2` (and the MoE evidence merge). + +In the job that ran the gates, the mixer GPU checks +(`tests/check_qwen3_next_{attention,gdn_bridge,gdn_sequence,conv_bridge,core_matrix,shared_core,forward}.py`) +and the CPU tests passed together (123 tests); `tests/test_framework_operator_integrations.py`, +collected into the same process after vLLM was imported, failed as it must and +passes in its own process. The existing attention suites +(`test_deterministic_attention_cuda`, `test_attention`, `test_attention_correctness`, +`test_kv_cache_attention`, `test_attention_contract`, `test_attention_dispatch`) +gave 766 passed and the two `test_attention_dispatch` failures that `main` also has. + +## Attention prior-art report + +One TP4 rank of Qwen3-Next full attention: 4 query heads, 1 KV head, D=256, +scale 1/16, causal. A 1000-token target sequence is computed alone and in a +batch with sequences of 777, 1500 and 64 tokens (first and last); +`prefill_decode_bitwise` compares the last 64 rows and the last row computed +against the full KV with the same rows of the full prefill; +`backward_repeat_bitwise` repeats the target's backward after the companions' +backwards ran. Accuracy is against FP64; latencies are CUDA-event medians with +the candidate order reversed every iteration. diff --git a/docs/usage/evidence/qwen3-next-tp4-mixers-b200/attention/figure.png b/docs/usage/evidence/qwen3-next-tp4-mixers-b200/attention/figure.png new file mode 100644 index 0000000000000000000000000000000000000000..b6ce6874180e516e153c3885f6b12a9af5c788fa GIT binary patch literal 204631 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 z%0A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 R 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 rzQ*dVK literal 0 HcmV?d00001 diff --git a/docs/usage/evidence/qwen3-next-tp4-mixers-b200/attention/report.json b/docs/usage/evidence/qwen3-next-tp4-mixers-b200/attention/report.json new file mode 100644 index 000000000..4a95898a2 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-tp4-mixers-b200/attention/report.json @@ -0,0 +1,200 @@ +{ + "kind": "qwen3_next_prior_art_report", + "rfc": 428, + "rl_kernel_commit": "65170777576cb957fb5557ef13bb46ce695a9f1a", + "tracked_tree_dirty": false, + "environment": { + "gpu": "NVIDIA B200", + "torch": "2.13.0+cu130", + "cuda": "13.0", + "libraries": { + "vllm": "0.30.0", + "flashinfer-python": "0.6.18.post1", + "transformers": "5.17.0", + "triton": "3.7.1", + "sglang": null, + "megatron-core": null, + "transformer_engine": null, + "vime": null + } + }, + "op": "qwen3_next_tp4_attention", + "shape": { + "q_heads": 4, + "kv_heads": 1, + "head_dim": 256, + "scale": 0.0625 + }, + "target_tokens": 1000, + "companion_tokens": [ + 777, + 1500, + 64 + ], + "candidates": [ + { + "key": "rl_kernel_cuda", + "name": "RL-Kernel deterministic attention (one launch per sequence)", + "source": "rl_engine.integrations.qwen3_next_forward.shared_attention", + "batch_bitwise": { + "first": true, + "last": true + }, + "prefill_decode_bitwise": { + "last_64": true, + "last_1": true + }, + "repeatable": true, + "backward_repeat_bitwise": { + "dq": true, + "dk": true, + "dv": true + }, + "accuracy": { + "rel_l2_vs_fp64": 0.0016090058011337504, + "max_abs_vs_fp64": 0.0066821561991154965 + }, + "batch_invariant": true + }, + { + "key": "torch_sdpa", + "name": "torch SDPA (default backend, one launch per sequence)", + "source": "torch 2.13.0+cu130 scaled_dot_product_attention", + "batch_bitwise": { + "first": true, + "last": true + }, + "prefill_decode_bitwise": { + "last_64": false, + "last_1": false + }, + "repeatable": true, + "backward_repeat_bitwise": { + "dq": false, + "dk": true, + "dv": true + }, + "accuracy": { + "rel_l2_vs_fp64": 0.0019992834566479067, + "max_abs_vs_fp64": 0.0066821561991154965 + }, + "batch_invariant": false + }, + { + "key": "vllm_fa2_auto", + "name": "vLLM FlashAttention-2 varlen, num_splits=0", + "source": "vllm 0.30.0 vllm_flash_attn.flash_attn_varlen_func", + "batch_bitwise": { + "first": true, + "last": true + }, + "prefill_decode_bitwise": { + "last_64": true, + "last_1": false + }, + "repeatable": true, + "accuracy": { + "rel_l2_vs_fp64": 0.0020096983122931318, + "max_abs_vs_fp64": 0.0066821561991154965 + }, + "batch_invariant": false + }, + { + "key": "vllm_fa2_split1", + "name": "vLLM FlashAttention-2 varlen, num_splits=1", + "source": "vllm 0.30.0 vllm_flash_attn.flash_attn_varlen_func", + "batch_bitwise": { + "first": true, + "last": true + }, + "prefill_decode_bitwise": { + "last_64": true, + "last_1": true + }, + "repeatable": true, + "accuracy": { + "rel_l2_vs_fp64": 0.0020096983122931318, + "max_abs_vs_fp64": 0.0066821561991154965 + }, + "batch_invariant": true + }, + { + "key": "vllm_triton_2d", + "name": "vLLM Triton unified attention (2D kernel)", + "source": "vllm 0.30.0 v1/attention/ops/triton_unified_attention", + "batch_bitwise": { + "first": true, + "last": true + }, + "prefill_decode_bitwise": { + "last_64": true, + "last_1": false + }, + "repeatable": true, + "accuracy": { + "rel_l2_vs_fp64": 0.002021002108737795, + "max_abs_vs_fp64": 0.0066821561991154965 + }, + "batch_invariant": false + }, + { + "key": "flashinfer", + "name": "FlashInfer BatchPrefillWithRaggedKVCache", + "source": "flashinfer 0.6.18.post1", + "batch_bitwise": { + "first": false, + "last": false + }, + "prefill_decode_bitwise": { + "last_64": false, + "last_1": false + }, + "repeatable": true, + "accuracy": { + "rel_l2_vs_fp64": 0.002146056864137061, + "max_abs_vs_fp64": 0.0066821561991154965 + }, + "batch_invariant": false + } + ], + "latency": { + "prefill_us": { + "512": { + "rl_kernel_cuda": 721.9359874725342, + "torch_sdpa": 68.30399855971336, + "vllm_fa2_auto": 112.91199922561646, + "vllm_fa2_split1": 116.35199934244156, + "vllm_triton_2d": 250.46399980783463, + "flashinfer": 220.7840010523796 + }, + "2048": { + "rl_kernel_cuda": 10143.984317779541, + "torch_sdpa": 112.11200058460236, + "vllm_fa2_auto": 151.32799744606018, + "vllm_fa2_split1": 151.32799744606018, + "vllm_triton_2d": 304.4160008430481, + "flashinfer": 277.18399465084076 + }, + "8192": { + "rl_kernel_cuda": 159744.88067626953, + "torch_sdpa": 618.4000074863434, + "vllm_fa2_auto": 647.5839912891388, + "vllm_fa2_split1": 660.783976316452, + "vllm_triton_2d": 1129.1040182113647, + "flashinfer": 758.1599950790405 + } + }, + "decode_us_kv8192": { + "rl_kernel_cuda": 769.6319818496704, + "torch_sdpa": 306.207999587059, + "vllm_fa2_auto": 154.52800691127777, + "vllm_fa2_split1": 332.96000957489014, + "vllm_triton_2d": 550.7360100746155, + "flashinfer": 225.21600127220154 + }, + "forward_plus_backward_us_2048": { + "rl_kernel_cuda": 25106.52732849121, + "torch_sdpa": 785.3440046310425 + } + } +} diff --git a/docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-attention/rank-0.json b/docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-attention/rank-0.json new file mode 100644 index 000000000..457309564 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-attention/rank-0.json @@ -0,0 +1,36 @@ +{ + "status": "passed", + "scope": "tp4_full_attention_layer3", + "rank": 0, + "rl_kernel_commit": "9e6c4f24ce4b5e8888650e1062922711dbe565e0", + "tracked_tree_dirty": false, + "provider": "qwen3-next-shared-cuda-forward-v1", + "environment": { + "gpu": "NVIDIA B200", + "torch": "2.13.0+cu130", + "vllm": "0.30.0", + "nccl": "2.29.7" + }, + "attention": { + "cases": [ + "hf-load-export", + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "batch4-varlen-reorder", + "sixteen-token-decode", + "prompt-gradient", + "kv-pair-gradient", + "qk-norm-gradient" + ], + "gradient_max_abs": { + "q_proj.weight": 7.748603820800781e-06, + "k_proj.weight": 1.52587890625e-05, + "v_proj.weight": 3.075599670410156e-05, + "o_proj.weight": 1.2099742889404297e-05, + "q_norm.weight": 1.8835067749023438e-05, + "k_norm.weight": 1.8715858459472656e-05 + } + } +} diff --git a/docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-attention/rank-1.json b/docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-attention/rank-1.json new file mode 100644 index 000000000..c8b9c07a5 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-attention/rank-1.json @@ -0,0 +1,36 @@ +{ + "status": "passed", + "scope": "tp4_full_attention_layer3", + "rank": 1, + "rl_kernel_commit": "9e6c4f24ce4b5e8888650e1062922711dbe565e0", + "tracked_tree_dirty": false, + "provider": "qwen3-next-shared-cuda-forward-v1", + "environment": { + "gpu": "NVIDIA B200", + "torch": "2.13.0+cu130", + "vllm": "0.30.0", + "nccl": "2.29.7" + }, + "attention": { + "cases": [ + "hf-load-export", + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "batch4-varlen-reorder", + "sixteen-token-decode", + "prompt-gradient", + "kv-pair-gradient", + "qk-norm-gradient" + ], + "gradient_max_abs": { + "q_proj.weight": 8.761882781982422e-06, + "k_proj.weight": 1.52587890625e-05, + "v_proj.weight": 3.075599670410156e-05, + "o_proj.weight": 1.2099742889404297e-05, + "q_norm.weight": 1.8835067749023438e-05, + "k_norm.weight": 1.8715858459472656e-05 + } + } +} diff --git a/docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-attention/rank-2.json b/docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-attention/rank-2.json new file mode 100644 index 000000000..db5ec61cb --- /dev/null +++ b/docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-attention/rank-2.json @@ -0,0 +1,36 @@ +{ + "status": "passed", + "scope": "tp4_full_attention_layer3", + "rank": 2, + "rl_kernel_commit": "9e6c4f24ce4b5e8888650e1062922711dbe565e0", + "tracked_tree_dirty": false, + "provider": "qwen3-next-shared-cuda-forward-v1", + "environment": { + "gpu": "NVIDIA B200", + "torch": "2.13.0+cu130", + "vllm": "0.30.0", + "nccl": "2.29.7" + }, + "attention": { + "cases": [ + "hf-load-export", + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "batch4-varlen-reorder", + "sixteen-token-decode", + "prompt-gradient", + "kv-pair-gradient", + "qk-norm-gradient" + ], + "gradient_max_abs": { + "q_proj.weight": 1.633167266845703e-05, + "k_proj.weight": 2.1338462829589844e-05, + "v_proj.weight": 2.3126602172851562e-05, + "o_proj.weight": 2.2292137145996094e-05, + "q_norm.weight": 1.8835067749023438e-05, + "k_norm.weight": 1.8715858459472656e-05 + } + } +} diff --git a/docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-attention/rank-3.json b/docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-attention/rank-3.json new file mode 100644 index 000000000..5ee714ab1 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-attention/rank-3.json @@ -0,0 +1,36 @@ +{ + "status": "passed", + "scope": "tp4_full_attention_layer3", + "rank": 3, + "rl_kernel_commit": "9e6c4f24ce4b5e8888650e1062922711dbe565e0", + "tracked_tree_dirty": false, + "provider": "qwen3-next-shared-cuda-forward-v1", + "environment": { + "gpu": "NVIDIA B200", + "torch": "2.13.0+cu130", + "vllm": "0.30.0", + "nccl": "2.29.7" + }, + "attention": { + "cases": [ + "hf-load-export", + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "batch4-varlen-reorder", + "sixteen-token-decode", + "prompt-gradient", + "kv-pair-gradient", + "qk-norm-gradient" + ], + "gradient_max_abs": { + "q_proj.weight": 1.2993812561035156e-05, + "k_proj.weight": 2.1338462829589844e-05, + "v_proj.weight": 2.3126602172851562e-05, + "o_proj.weight": 9.894371032714844e-06, + "q_norm.weight": 1.8835067749023438e-05, + "k_norm.weight": 1.8715858459472656e-05 + } + } +} diff --git a/docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-gdn/rank-0.json b/docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-gdn/rank-0.json new file mode 100644 index 000000000..2e2501dfb --- /dev/null +++ b/docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-gdn/rank-0.json @@ -0,0 +1,32 @@ +{ + "status": "passed", + "scope": "tp4_gdn_layer0", + "rank": 0, + "rl_kernel_commit": "9e6c4f24ce4b5e8888650e1062922711dbe565e0", + "tracked_tree_dirty": false, + "provider": "qwen3-next-shared-cuda-forward-v1", + "environment": { + "gpu": "NVIDIA B200", + "torch": "2.13.0+cu130", + "vllm": "0.30.0", + "nccl": "2.29.7" + }, + "cases": [ + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "prompt-gradient", + "replicated-norm-gradient", + "hf-load-export" + ], + "gradient_max_abs": { + "A_log": 4.462208380573429e-12, + "dt_bias": 3.595346242946107e-12, + "in_proj_qkvz.weight": 6.948539521545172e-10, + "in_proj_ba.weight": 3.6834535421803594e-11, + "conv1d.weight": 3.128661774098873e-09, + "norm.weight": 3.91155481338501e-08, + "out_proj.weight": 3.255991032347083e-10 + } +} diff --git a/docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-gdn/rank-1.json b/docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-gdn/rank-1.json new file mode 100644 index 000000000..33bda4b32 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-gdn/rank-1.json @@ -0,0 +1,32 @@ +{ + "status": "passed", + "scope": "tp4_gdn_layer0", + "rank": 1, + "rl_kernel_commit": "9e6c4f24ce4b5e8888650e1062922711dbe565e0", + "tracked_tree_dirty": false, + "provider": "qwen3-next-shared-cuda-forward-v1", + "environment": { + "gpu": "NVIDIA B200", + "torch": "2.13.0+cu130", + "vllm": "0.30.0", + "nccl": "2.29.7" + }, + "cases": [ + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "prompt-gradient", + "replicated-norm-gradient", + "hf-load-export" + ], + "gradient_max_abs": { + "A_log": 1.0550138540565968e-10, + "dt_bias": 9.458744898438454e-11, + "in_proj_qkvz.weight": 3.055902197957039e-10, + "in_proj_ba.weight": 3.296918293926865e-11, + "conv1d.weight": 9.19681042432785e-09, + "norm.weight": 3.91155481338501e-08, + "out_proj.weight": 1.8553691916167736e-10 + } +} diff --git a/docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-gdn/rank-2.json b/docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-gdn/rank-2.json new file mode 100644 index 000000000..c3d11374b --- /dev/null +++ b/docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-gdn/rank-2.json @@ -0,0 +1,32 @@ +{ + "status": "passed", + "scope": "tp4_gdn_layer0", + "rank": 2, + "rl_kernel_commit": "9e6c4f24ce4b5e8888650e1062922711dbe565e0", + "tracked_tree_dirty": false, + "provider": "qwen3-next-shared-cuda-forward-v1", + "environment": { + "gpu": "NVIDIA B200", + "torch": "2.13.0+cu130", + "vllm": "0.30.0", + "nccl": "2.29.7" + }, + "cases": [ + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "prompt-gradient", + "replicated-norm-gradient", + "hf-load-export" + ], + "gradient_max_abs": { + "A_log": 3.1377567211166024e-11, + "dt_bias": 3.069544618483633e-11, + "in_proj_qkvz.weight": 1.1714291758835316e-09, + "in_proj_ba.weight": 6.184563972055912e-11, + "conv1d.weight": 6.111804395914078e-09, + "norm.weight": 3.91155481338501e-08, + "out_proj.weight": 4.092726157978177e-10 + } +} diff --git a/docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-gdn/rank-3.json b/docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-gdn/rank-3.json new file mode 100644 index 000000000..c036f11fe --- /dev/null +++ b/docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-gdn/rank-3.json @@ -0,0 +1,32 @@ +{ + "status": "passed", + "scope": "tp4_gdn_layer0", + "rank": 3, + "rl_kernel_commit": "9e6c4f24ce4b5e8888650e1062922711dbe565e0", + "tracked_tree_dirty": false, + "provider": "qwen3-next-shared-cuda-forward-v1", + "environment": { + "gpu": "NVIDIA B200", + "torch": "2.13.0+cu130", + "vllm": "0.30.0", + "nccl": "2.29.7" + }, + "cases": [ + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "prompt-gradient", + "replicated-norm-gradient", + "hf-load-export" + ], + "gradient_max_abs": { + "A_log": 8.094502845779061e-11, + "dt_bias": 7.958078640513122e-11, + "in_proj_qkvz.weight": 5.784386303275824e-10, + "in_proj_ba.weight": 3.979039320256561e-11, + "conv1d.weight": 5.093170329928398e-09, + "norm.weight": 3.91155481338501e-08, + "out_proj.weight": 3.67435859516263e-10 + } +} diff --git a/docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-moe/rank-0.json b/docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-moe/rank-0.json new file mode 100644 index 000000000..0fd10fafa --- /dev/null +++ b/docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-moe/rank-0.json @@ -0,0 +1,45 @@ +{ + "status": "passed", + "scope": "tp4_moe_block_layer0", + "rank": 0, + "rl_kernel_commit": "9e6c4f24ce4b5e8888650e1062922711dbe565e0", + "tracked_tree_dirty": false, + "provider": "qwen3-next-shared-cuda-forward-v1", + "environment": { + "gpu": "NVIDIA B200", + "torch": "2.13.0+cu130", + "vllm": "0.30.0", + "nccl": "2.29.7" + }, + "moe": { + "cases": [ + "hf-load-export-all512experts", + "routes-replicated-8", + "full-chunk-reorder-8", + "routes-replicated-64", + "full-chunk-reorder-64", + "routes-replicated-256", + "full-chunk-reorder-256", + "routes-replicated-1024", + "full-chunk-reorder-1024", + "training-forward", + "all-parameter-gradient", + "replicated-router-gradient" + ], + "gradient_max_abs": { + "gate.weight": 1.9354047253727913e-09, + "experts.gate_up": 4.598405212163925e-09, + "experts.down": 7.8580342233181e-09, + "shared_expert.gate_proj.weight": 2.5890767574310303e-07, + "shared_expert.up_proj.weight": 4.3585896492004395e-07, + "shared_expert.down_proj.weight": 2.9243528842926025e-07, + "shared_expert_gate.weight": 5.513429641723633e-07 + }, + "forward_us": { + "8": 2407.167911529541, + "64": 2413.5360717773438, + "256": 1934.4639778137207, + "1024": 1961.6639614105225 + } + } +} diff --git a/docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-moe/rank-1.json b/docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-moe/rank-1.json new file mode 100644 index 000000000..651abe983 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-moe/rank-1.json @@ -0,0 +1,45 @@ +{ + "status": "passed", + "scope": "tp4_moe_block_layer0", + "rank": 1, + "rl_kernel_commit": "9e6c4f24ce4b5e8888650e1062922711dbe565e0", + "tracked_tree_dirty": false, + "provider": "qwen3-next-shared-cuda-forward-v1", + "environment": { + "gpu": "NVIDIA B200", + "torch": "2.13.0+cu130", + "vllm": "0.30.0", + "nccl": "2.29.7" + }, + "moe": { + "cases": [ + "hf-load-export-all512experts", + "routes-replicated-8", + "full-chunk-reorder-8", + "routes-replicated-64", + "full-chunk-reorder-64", + "routes-replicated-256", + "full-chunk-reorder-256", + "routes-replicated-1024", + "full-chunk-reorder-1024", + "training-forward", + "all-parameter-gradient", + "replicated-router-gradient" + ], + "gradient_max_abs": { + "gate.weight": 1.9354047253727913e-09, + "experts.gate_up": 2.240994945168495e-09, + "experts.down": 5.558831617236137e-09, + "shared_expert.gate_proj.weight": 3.129243850708008e-07, + "shared_expert.up_proj.weight": 3.725290298461914e-07, + "shared_expert.down_proj.weight": 4.6938657760620117e-07, + "shared_expert_gate.weight": 5.513429641723633e-07 + }, + "forward_us": { + "8": 2461.6639614105225, + "64": 2415.616035461426, + "256": 2299.391984939575, + "1024": 1961.9840383529663 + } + } +} diff --git a/docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-moe/rank-2.json b/docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-moe/rank-2.json new file mode 100644 index 000000000..012e811d9 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-moe/rank-2.json @@ -0,0 +1,45 @@ +{ + "status": "passed", + "scope": "tp4_moe_block_layer0", + "rank": 2, + "rl_kernel_commit": "9e6c4f24ce4b5e8888650e1062922711dbe565e0", + "tracked_tree_dirty": false, + "provider": "qwen3-next-shared-cuda-forward-v1", + "environment": { + "gpu": "NVIDIA B200", + "torch": "2.13.0+cu130", + "vllm": "0.30.0", + "nccl": "2.29.7" + }, + "moe": { + "cases": [ + "hf-load-export-all512experts", + "routes-replicated-8", + "full-chunk-reorder-8", + "routes-replicated-64", + "full-chunk-reorder-64", + "routes-replicated-256", + "full-chunk-reorder-256", + "routes-replicated-1024", + "full-chunk-reorder-1024", + "training-forward", + "all-parameter-gradient", + "replicated-router-gradient" + ], + "gradient_max_abs": { + "gate.weight": 1.9354047253727913e-09, + "experts.gate_up": 2.0227162167429924e-09, + "experts.down": 5.122274160385132e-09, + "shared_expert.gate_proj.weight": 2.337619662284851e-07, + "shared_expert.up_proj.weight": 3.9674341678619385e-07, + "shared_expert.down_proj.weight": 2.384185791015625e-07, + "shared_expert_gate.weight": 5.513429641723633e-07 + }, + "forward_us": { + "8": 2433.2799911499023, + "64": 2415.7440662384033, + "256": 2286.144018173218, + "1024": 1964.0640020370483 + } + } +} diff --git a/docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-moe/rank-3.json b/docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-moe/rank-3.json new file mode 100644 index 000000000..44189b0c3 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-tp4-mixers-b200/tp4-moe/rank-3.json @@ -0,0 +1,45 @@ +{ + "status": "passed", + "scope": "tp4_moe_block_layer0", + "rank": 3, + "rl_kernel_commit": "9e6c4f24ce4b5e8888650e1062922711dbe565e0", + "tracked_tree_dirty": false, + "provider": "qwen3-next-shared-cuda-forward-v1", + "environment": { + "gpu": "NVIDIA B200", + "torch": "2.13.0+cu130", + "vllm": "0.30.0", + "nccl": "2.29.7" + }, + "moe": { + "cases": [ + "hf-load-export-all512experts", + "routes-replicated-8", + "full-chunk-reorder-8", + "routes-replicated-64", + "full-chunk-reorder-64", + "routes-replicated-256", + "full-chunk-reorder-256", + "routes-replicated-1024", + "full-chunk-reorder-1024", + "training-forward", + "all-parameter-gradient", + "replicated-router-gradient" + ], + "gradient_max_abs": { + "gate.weight": 1.9354047253727913e-09, + "experts.gate_up": 2.546585164964199e-09, + "experts.down": 5.296897143125534e-09, + "shared_expert.gate_proj.weight": 1.2665987014770508e-07, + "shared_expert.up_proj.weight": 2.644956111907959e-07, + "shared_expert.down_proj.weight": 2.998858690261841e-07, + "shared_expert_gate.weight": 5.513429641723633e-07 + }, + "forward_us": { + "8": 2456.5439224243164, + "64": 2408.4479808807373, + "256": 2331.712007522583, + "1024": 1955.8720588684082 + } + } +} From c67ec14401b0847ac96441a24acfaac0b17b77ec Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Fri, 9 Oct 2026 02:52:30 +0000 Subject: [PATCH 50/70] feat(qwen3-next): full-model chain with first-drift localisation RFC #428 full_model_chain (CUDA). - Engine adapters: the native vLLM rollout (exact-prefill scheduler, paged KV, traced response rows), the VIME/Megatron replay and training actor, engine weight import/export and the logprob adapter, all on the shared TP4 providers. - Stage runners (preflight, layers, l2, train1, train2, train) with the validated acceptance contract (version 4) and scripts/qwen3_next_run.py, a launcher that works inside any four-GPU allocation: each stage gets a clean clone, an immutable run.json identified by a fresh execution_id, and refuses a predecessor that did not pass or pins another identity. Scheduler-independent helpers live in scripts/qwen3_next_runtime.py. - Sub-node digests: both engines observe the normed mixer input, the mixer output, the normed MLP input, the selected expert ids and the MoE output of every layer, plus the embedding; the first divergence names the layer and sub-node. - scripts/qwen3_next_chain_report.py writes a ChainGateReport-compatible report (schema qwen3-next-chain-v1, compatible with ws1-c10-c11-v5) with first_drift_family/layer/cell; scripts/qwen3_next_publish_evidence.py publishes a chain's records without site paths, hosts or users. - Native rollout caps raised to 64 sequences, 16384 batched tokens and a 4 GiB KV budget so the batch-invariance matrix runs under the same certified profile; the exact-prefill scheduler still fixes every chunk. - The operator-case registry is regenerated from collection by scripts/qwen3_next_operator_cases.py. - Packaging: transformers may be 5.13.1-5.17.0; a qwen3-next extra pins the audited runtime. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- .github/workflows/ci.yml | 25 + .github/workflows/qwen3-next-provider-gpu.yml | 3 +- ci/run_qwen3_next_chain_gate.sh | 27 + ci/run_qwen3_next_operator_gates.sh | 10 + docs/usage/qwen3-next-chain.md | 88 ++ pyproject.toml | 10 +- rl_engine/integrations/qwen3_next_binary.py | 71 ++ .../integrations/qwen3_next_embedding.py | 57 + .../integrations/qwen3_next_engine_weights.py | 88 ++ rl_engine/integrations/qwen3_next_forward.py | 45 + rl_engine/integrations/qwen3_next_logprob.py | 89 ++ .../qwen3_next_native_recompute.py | 318 +++++ .../integrations/qwen3_next_native_rollout.py | 777 ++++++++++++ .../qwen3_next_native_training.py | 386 ++++++ .../integrations/qwen3_next_native_workers.py | 49 + rl_engine/integrations/qwen3_next_profile.py | 143 +++ rl_engine/integrations/qwen3_next_subnode.py | 109 ++ .../integrations/qwen3_next_tp_blocks.py | 7 +- rl_engine/integrations/qwen3_next_training.py | 285 +++++ rl_engine/integrations/qwen3_next_vime.py | 402 ++++++ .../integrations/qwen3_next_vime_runtime.py | 178 +++ rl_engine/integrations/qwen3_next_vllm.py | 205 ++++ .../integrations/qwen3_next_vllm_attention.py | 238 ++++ .../integrations/qwen3_next_vllm_model.py | 365 ++++++ .../integrations/qwen3_next_vllm_worker.py | 51 + .../kernels/gtest/qwen3_next_chain_report.py | 268 ++++ rl_engine/testing/pytest_case_manifest.py | 80 ++ rl_engine/testing/qwen3_next_binary.py | 89 ++ rl_engine/testing/qwen3_next_cases.py | 69 ++ .../testing/qwen3_next_export_schema.json | 10 + rl_engine/testing/qwen3_next_l2.py | 1047 ++++++++++++++++ rl_engine/testing/qwen3_next_layer_cases.json | 122 ++ .../testing/qwen3_next_operator_cases.json | 293 +++++ rl_engine/testing/qwen3_next_rl_fixture.py | 150 +++ scripts/qwen3_next_adapter_check.py | 321 +++++ scripts/qwen3_next_chain_report.py | 99 ++ scripts/qwen3_next_checkpoint.py | 312 +++++ scripts/qwen3_next_contract.py | 371 ++++++ scripts/qwen3_next_gate_common.py | 12 +- scripts/qwen3_next_l2.py | 742 ++++++++++++ scripts/qwen3_next_layer_contract.py | 123 ++ scripts/qwen3_next_layers.py | 342 ++++++ scripts/qwen3_next_operator_cases.py | 103 ++ scripts/qwen3_next_operator_gates.py | 151 +++ scripts/qwen3_next_optimizer_checkpoint.py | 307 +++++ scripts/qwen3_next_preflight.py | 252 ++++ scripts/qwen3_next_publish_evidence.py | 142 +++ scripts/qwen3_next_rollout_smoke.py | 73 ++ scripts/qwen3_next_run.py | 337 ++++++ scripts/qwen3_next_runtime.py | 772 ++++++++++++ scripts/qwen3_next_tp_head_check.py | 141 +++ scripts/qwen3_next_tp_probe.py | 54 + scripts/qwen3_next_training.py | 1077 +++++++++++++++++ scripts/qwen3_next_training_checkpoint.py | 602 +++++++++ scripts/qwen3_next_training_export.py | 503 ++++++++ setup.py | 9 +- tests/check_qwen3_next_batch_invariance.py | 453 +++++++ tests/check_qwen3_next_engine_metadata.py | 118 ++ tests/check_qwen3_next_forward.py | 55 +- tests/check_qwen3_next_multigpu.py | 46 + tests/check_qwen3_next_native_rollout.py | 318 +++++ tests/check_qwen3_next_paged_attention.py | 83 ++ tests/check_qwen3_next_vime_weight_hooks.py | 92 ++ tests/check_qwen3_next_vllm_model_contract.py | 281 +++++ tests/test_qwen3_next_binary_evidence.py | 68 ++ tests/test_qwen3_next_case_manifest.py | 106 ++ tests/test_qwen3_next_chain_report.py | 149 +++ tests/test_qwen3_next_checkpoint.py | 222 ++++ tests/test_qwen3_next_engine_weights.py | 81 ++ tests/test_qwen3_next_environment_identity.py | 41 + tests/test_qwen3_next_evidence_redaction.py | 105 ++ tests/test_qwen3_next_failure.py | 136 +++ tests/test_qwen3_next_forward_contract.py | 3 + tests/test_qwen3_next_imported_binary.py | 107 ++ ..._qwen3_next_installed_provider_identity.py | 45 + tests/test_qwen3_next_l2.py | 719 +++++++++++ tests/test_qwen3_next_layers.py | 135 +++ tests/test_qwen3_next_logprob_adapter.py | 43 + tests/test_qwen3_next_native_recompute.py | 232 ++++ tests/test_qwen3_next_operator_gates.py | 50 + tests/test_qwen3_next_profile.py | 149 +++ tests/test_qwen3_next_rl_fixture.py | 58 + tests/test_qwen3_next_rotary_dtype.py | 58 + tests/test_qwen3_next_run.py | 118 ++ tests/test_qwen3_next_storage.py | 334 +++++ tests/test_qwen3_next_subnode.py | 52 + tests/test_qwen3_next_training_audit.py | 137 +++ tests/test_qwen3_next_training_checkpoint.py | 539 +++++++++ tests/test_qwen3_next_training_closeout.py | 430 +++++++ tests/test_qwen3_next_training_export.py | 288 +++++ ...test_qwen3_next_vllm_attention_metadata.py | 75 ++ 91 files changed, 18919 insertions(+), 6 deletions(-) create mode 100755 ci/run_qwen3_next_chain_gate.sh create mode 100644 ci/run_qwen3_next_operator_gates.sh create mode 100644 docs/usage/qwen3-next-chain.md create mode 100644 rl_engine/integrations/qwen3_next_binary.py create mode 100644 rl_engine/integrations/qwen3_next_embedding.py create mode 100644 rl_engine/integrations/qwen3_next_engine_weights.py create mode 100644 rl_engine/integrations/qwen3_next_logprob.py create mode 100644 rl_engine/integrations/qwen3_next_native_recompute.py create mode 100644 rl_engine/integrations/qwen3_next_native_rollout.py create mode 100644 rl_engine/integrations/qwen3_next_native_training.py create mode 100644 rl_engine/integrations/qwen3_next_native_workers.py create mode 100644 rl_engine/integrations/qwen3_next_profile.py create mode 100644 rl_engine/integrations/qwen3_next_subnode.py create mode 100644 rl_engine/integrations/qwen3_next_training.py create mode 100644 rl_engine/integrations/qwen3_next_vime.py create mode 100644 rl_engine/integrations/qwen3_next_vime_runtime.py create mode 100644 rl_engine/integrations/qwen3_next_vllm.py create mode 100644 rl_engine/integrations/qwen3_next_vllm_attention.py create mode 100644 rl_engine/integrations/qwen3_next_vllm_model.py create mode 100644 rl_engine/integrations/qwen3_next_vllm_worker.py create mode 100644 rl_engine/kernels/gtest/qwen3_next_chain_report.py create mode 100644 rl_engine/testing/pytest_case_manifest.py create mode 100644 rl_engine/testing/qwen3_next_binary.py create mode 100644 rl_engine/testing/qwen3_next_cases.py create mode 100644 rl_engine/testing/qwen3_next_export_schema.json create mode 100644 rl_engine/testing/qwen3_next_l2.py create mode 100644 rl_engine/testing/qwen3_next_layer_cases.json create mode 100644 rl_engine/testing/qwen3_next_operator_cases.json create mode 100644 rl_engine/testing/qwen3_next_rl_fixture.py create mode 100644 scripts/qwen3_next_adapter_check.py create mode 100644 scripts/qwen3_next_chain_report.py create mode 100644 scripts/qwen3_next_checkpoint.py create mode 100644 scripts/qwen3_next_contract.py create mode 100644 scripts/qwen3_next_l2.py create mode 100644 scripts/qwen3_next_layer_contract.py create mode 100644 scripts/qwen3_next_layers.py create mode 100644 scripts/qwen3_next_operator_cases.py create mode 100644 scripts/qwen3_next_operator_gates.py create mode 100644 scripts/qwen3_next_optimizer_checkpoint.py create mode 100644 scripts/qwen3_next_preflight.py create mode 100644 scripts/qwen3_next_publish_evidence.py create mode 100644 scripts/qwen3_next_rollout_smoke.py create mode 100644 scripts/qwen3_next_run.py create mode 100644 scripts/qwen3_next_runtime.py create mode 100644 scripts/qwen3_next_tp_head_check.py create mode 100644 scripts/qwen3_next_tp_probe.py create mode 100644 scripts/qwen3_next_training.py create mode 100644 scripts/qwen3_next_training_checkpoint.py create mode 100644 scripts/qwen3_next_training_export.py create mode 100644 tests/check_qwen3_next_batch_invariance.py create mode 100644 tests/check_qwen3_next_engine_metadata.py create mode 100644 tests/check_qwen3_next_multigpu.py create mode 100644 tests/check_qwen3_next_native_rollout.py create mode 100644 tests/check_qwen3_next_paged_attention.py create mode 100644 tests/check_qwen3_next_vime_weight_hooks.py create mode 100644 tests/check_qwen3_next_vllm_model_contract.py create mode 100644 tests/test_qwen3_next_binary_evidence.py create mode 100644 tests/test_qwen3_next_case_manifest.py create mode 100644 tests/test_qwen3_next_chain_report.py create mode 100644 tests/test_qwen3_next_checkpoint.py create mode 100644 tests/test_qwen3_next_engine_weights.py create mode 100644 tests/test_qwen3_next_environment_identity.py create mode 100644 tests/test_qwen3_next_evidence_redaction.py create mode 100644 tests/test_qwen3_next_failure.py create mode 100644 tests/test_qwen3_next_imported_binary.py create mode 100644 tests/test_qwen3_next_installed_provider_identity.py create mode 100644 tests/test_qwen3_next_l2.py create mode 100644 tests/test_qwen3_next_layers.py create mode 100644 tests/test_qwen3_next_logprob_adapter.py create mode 100644 tests/test_qwen3_next_native_recompute.py create mode 100644 tests/test_qwen3_next_operator_gates.py create mode 100644 tests/test_qwen3_next_profile.py create mode 100644 tests/test_qwen3_next_rl_fixture.py create mode 100644 tests/test_qwen3_next_rotary_dtype.py create mode 100644 tests/test_qwen3_next_run.py create mode 100644 tests/test_qwen3_next_storage.py create mode 100644 tests/test_qwen3_next_subnode.py create mode 100644 tests/test_qwen3_next_training_audit.py create mode 100644 tests/test_qwen3_next_training_checkpoint.py create mode 100644 tests/test_qwen3_next_training_closeout.py create mode 100644 tests/test_qwen3_next_training_export.py create mode 100644 tests/test_qwen3_next_vllm_attention_metadata.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d2cef82de..f50c73cef 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -68,6 +68,31 @@ jobs: python -m pytest rl_engine/tests/test_dispatch.py -v PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 python -m pytest tests/test_attention_correctness.py -q -rs python -m pytest tests/test_forward_invariance.py tests/test_tolerance_contract.py tests/test_ws1_workload.py tests/test_gradient_invariance.py tests/test_elementwise_inventory.py tests/test_four_judgment_matrix.py tests/test_op_checks.py tests/test_operator_inputs.py tests/test_profiler.py tests/test_kv_consistency.py tests/test_ws1_qwen3_dense.py tests/test_ws1_chain_integration.py tests/test_qwen3_next_norm.py tests/test_gdn_state_contract.py tests/test_tensor_identity.py tests/test_qwen3_next_forward_contract.py tests/test_qwen3_next_tp_blocks.py tests/test_qwen3_next_tp_gdn.py -q + python -m pytest -q \ + tests/test_qwen3_next_binary_evidence.py \ + tests/test_qwen3_next_case_manifest.py \ + tests/test_qwen3_next_checkpoint.py \ + tests/test_qwen3_next_engine_weights.py \ + tests/test_qwen3_next_environment_identity.py \ + tests/test_qwen3_next_failure.py \ + tests/test_qwen3_next_imported_binary.py \ + tests/test_qwen3_next_installed_provider_identity.py \ + tests/test_qwen3_next_l2.py \ + tests/test_qwen3_next_layers.py \ + tests/test_qwen3_next_logprob_adapter.py \ + tests/test_qwen3_next_native_recompute.py \ + tests/test_qwen3_next_operator_gates.py \ + tests/test_qwen3_next_profile.py \ + tests/test_qwen3_next_rl_fixture.py \ + tests/test_qwen3_next_rotary_dtype.py \ + tests/test_qwen3_next_storage.py \ + tests/test_qwen3_next_training_audit.py \ + tests/test_qwen3_next_training_closeout.py \ + tests/test_qwen3_next_training_export.py \ + tests/test_qwen3_next_subnode.py \ + tests/test_qwen3_next_chain_report.py \ + tests/test_qwen3_next_run.py \ + tests/test_qwen3_next_evidence_redaction.py - name: Run Cross-Configuration Contract Tests (CPU-safe) run: | diff --git a/.github/workflows/qwen3-next-provider-gpu.yml b/.github/workflows/qwen3-next-provider-gpu.yml index c045484bd..ca5bf6f4d 100644 --- a/.github/workflows/qwen3-next-provider-gpu.yml +++ b/.github/workflows/qwen3-next-provider-gpu.yml @@ -89,4 +89,5 @@ jobs: tests/check_qwen3_next_forward.py tests/check_qwen3_next_attention.py \ tests/check_qwen3_next_gdn_bridge.py tests/check_qwen3_next_gdn_sequence.py \ tests/check_qwen3_next_conv_bridge.py tests/check_qwen3_next_core_matrix.py \ - tests/check_qwen3_next_shared_core.py + tests/check_qwen3_next_shared_core.py \ + tests/check_qwen3_next_paged_attention.py tests/check_qwen3_next_batch_invariance.py diff --git a/ci/run_qwen3_next_chain_gate.sh b/ci/run_qwen3_next_chain_gate.sh new file mode 100755 index 000000000..ac7d8cec0 --- /dev/null +++ b/ci/run_qwen3_next_chain_gate.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: Apache-2.0 +# Qwen3-Next chain-report adapter checks; with a report path, also validate that report. +# bash ci/run_qwen3_next_chain_gate.sh [chain-report.json] +set -euo pipefail +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +cd "$ROOT" +PY="${PY:-python3}" +export PYTHONPATH="$ROOT${PYTHONPATH:+:$PYTHONPATH}" +"$PY" -m pytest -q tests/test_qwen3_next_chain_report.py +if [ "$#" -ge 1 ]; then + "$PY" - "$1" <<'PY' +import dataclasses, json, sys + +from rl_engine.kernels.gtest.chain_gate import ChainGateReport +from rl_engine.kernels.gtest.qwen3_next_chain_report import COMPATIBLE_SCHEMA, SCHEMA_VERSION + +report = json.load(open(sys.argv[1])) +missing = {f.name for f in dataclasses.fields(ChainGateReport)} - set(report) +assert not missing, f"chain report lacks ChainGateReport fields: {sorted(missing)}" +assert report["schema_version"] == SCHEMA_VERSION, report["schema_version"] +assert report["compatible_schema"] == COMPATIBLE_SCHEMA, report["compatible_schema"] +print(f"passed={report['passed']} first_drift={report['first_drift']} " + f"family={report['first_drift_family']} cells={len(report['cells'])}") +sys.exit(0 if report["passed"] else 1) +PY +fi diff --git a/ci/run_qwen3_next_operator_gates.sh b/ci/run_qwen3_next_operator_gates.sh new file mode 100644 index 000000000..1086730a6 --- /dev/null +++ b/ci/run_qwen3_next_operator_gates.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# Required operator acceptance and diagnostics use separate declared case sets. +set -euo pipefail +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +cd "$ROOT" +PY="${PY:-python3}" +OUT="${QWEN3_NEXT_EVIDENCE_DIR:?Set QWEN3_NEXT_EVIDENCE_DIR to an artifact directory}" +export PYTHONPATH="$ROOT${PYTHONPATH:+:$PYTHONPATH}" +exec "$PY" scripts/qwen3_next_operator_gates.py --out "$OUT" \ + --suite "${QWEN3_NEXT_OPERATOR_SUITE:-all}" diff --git a/docs/usage/qwen3-next-chain.md b/docs/usage/qwen3-next-chain.md new file mode 100644 index 000000000..01087fda9 --- /dev/null +++ b/docs/usage/qwen3-next-chain.md @@ -0,0 +1,88 @@ +# Qwen3-Next full-model chain (RFC #428 `full_model_chain`) + +The chain checks, bitwise, that Qwen3-Next-80B-A3B-Instruct gives the same +response tokens, BF16 logits and FP32 selected logprobs in rollout (native vLLM +prefill and decode) and in replay (VIME/Megatron recompute), on the pinned +weights and again after two optimizer updates and a checkpoint reload. When a +case differs, the report names the first layer, the sub-node inside it and its +layer family. + +## Requirements + +* One node with four B200 GPUs, TP4 x EP1 (all 512 experts on every rank). +* The audited runtime: CUDA 13.0.88, torch 2.13.0+cu130, vLLM 0.30.0, Triton + 3.7.1, transformers 5.17.0 (`pip install -e ".[qwen3-next]"`), plus VIME and + its patched Megatron-LM in the same virtual environment for the replay and + training stages. The environment is fingerprinted at the start of every run; + installing anything into it between stages invalidates the chain. +* The official checkpoint `Qwen/Qwen3-Next-80B-A3B-Instruct`, revision + `9c7f2fbe84465e40164a94cc16cd30b6999b0cc7`; every shard is hashed before the + first model load. +* Host memory: 256 GB for preflight, 512 GB for `layers`/`l2`, 1.28 TB for the + training stages (`--memory` declares what the allocation grants), and shared + storage for the training checkpoints (about 1.1 TB each) and HF exports. + +## Running + +Inside an allocation with four GPUs, from a clean checkout of the commit to measure: + +```bash +python scripts/qwen3_next_run.py --stage all \ + --runs-root --checkpoint --cuda-home \ + --python /bin/python --until l2 +python scripts/qwen3_next_run.py --stage all --from train1 --until train2 \ + --previous /<...-l2-...> \ + --runs-root --checkpoint --cuda-home --python /bin/python +python scripts/qwen3_next_run.py --stage train --previous /<...-train2-...> \ + --runs-root --checkpoint --cuda-home --python /bin/python +``` + +Each stage gets its own run directory with a clean clone of the commit, an +immutable `run.json` (identified by a fresh `execution_id`) and, once it +passes, a validated `result.json`; a later stage refuses a predecessor that +did not pass or that pins a different source, environment, checkpoint, +provider or topology identity. + +| Stage | What it checks | Typical time | +| --- | --- | --- | +| `preflight` | environment and versions, the mandatory operator cases (`rl_engine/testing/qwen3_next_operator_cases.json`) and norm C3/C4 gates, multi-GPU device guards, a four-rank TP probe, checkpoint hashes, a vLLM rollout smoke | 15 min | +| `layers` | the real-weight TP4 gates (GDN, attention, MoE, GDN engine adapters, embedding/LM head) and the native scheduler on 16 cases; certifies the shared provider profile | 25 min | +| `l2` | 16 cases (prompt 8/64/256/1024 x batch 1/4 x full/chunked prefill, 16 response tokens): rollout vs replay, raw bits, plus every layer and sub-node digest | 30 min | +| `train1`, `train2` | one optimizer update each, checkpoint, HF export, L2 on the exported weights | 3-4 h each | +| `train` | reload, L2, continuous and resumed step-3 controls, checkpoint fault injection | 4 h | + +## Reports + +```bash +python scripts/qwen3_next_chain_report.py --last /<...-train-...> --out chain-report.json +bash ci/run_qwen3_next_chain_gate.sh chain-report.json +python scripts/qwen3_next_publish_evidence.py --last /<...-train-...> \ + --chain-report chain-report.json --out docs/usage/evidence/qwen3-next-chain- +``` + +`chain-report.json` has every field of the Qwen3-8B chain gate's report +(`rl_engine.kernels.gtest.chain_gate.ChainGateReport`, schema `ws1-c10-c11-v5`) +with `schema_version: qwen3-next-chain-v1`; each case at each weight version is +a cell, and rollout/replay logits and logprobs are compared with +`atol = rtol = 0`. A failing chain reports `first_drift` in the dense form +`layer23.router:rollout->recompute`, plus `first_drift_layer`, +`first_drift_family` (`embedding`, `norm`, `gdn`, `full_attention`, `moe` or +`lm_head_logprob`) and `first_drift_cell`. + +The sub-nodes are observed at the same five points of every decoder layer in +both engines (`rl_engine/integrations/qwen3_next_subnode.py`): the normed +mixer input, the mixer output, the normed MLP input, the ten selected expert +ids and the MoE output, plus the embedding once per model. + +`scripts/qwen3_next_publish_evidence.py` copies the stage records and the +report, replaces site paths, host and user names with placeholders, refuses to +publish if any survive, and writes `SHA256SUMS`. + +## Checks outside the default CPU suite + +`tests/check_qwen3_next_*.py` import vLLM and run in the self-hosted +`Qwen3-Next-provider-GPU` workflow and in `preflight`. +`tests/check_qwen3_next_vime_weight_hooks.py`, +`tests/test_qwen3_next_training_checkpoint.py` and +`tests/test_qwen3_next_vllm_attention_metadata.py` need the training +environment (VIME, Megatron) and run there. diff --git a/pyproject.toml b/pyproject.toml index e4940c22f..461b28495 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,7 +18,7 @@ dependencies = [ "tabulate", "numpy", "accelerate", - "transformers==5.13.1", + "transformers>=5.13.1,<=5.17.0", ] [project.scripts] @@ -31,6 +31,14 @@ rl_kernel = "rl_engine.integrations.vllm_runtime:register_vllm_plugin" cuda = ["flashinfer-python>=0.6.0,<0.7", "nvidia-ml-py"] rocm = ["aiter"] vllm = ["vllm>=0.6.0"] +# The audited Qwen3-Next runtime (RFC #428): every provider check pins these. +qwen3-next = [ + "torch==2.13.0", + "transformers==5.17.0", + "vllm==0.30.0", + "triton==3.7.1", + "flashinfer-python==0.6.18.post1", +] drift-viewer = ["Pillow>=10", "PySide6>=6.6"] dev = ["pytest", "black", "isort", "ruff", "mypy", "pre-commit"] diff --git a/rl_engine/integrations/qwen3_next_binary.py b/rl_engine/integrations/qwen3_next_binary.py new file mode 100644 index 000000000..e883959af --- /dev/null +++ b/rl_engine/integrations/qwen3_next_binary.py @@ -0,0 +1,71 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Identity of the native provider actually imported by a model worker.""" + +import hashlib +import importlib +import importlib.machinery +import os +import re +from pathlib import Path + + +def validate_provider_identity(identity): + """Validate serialized execution evidence without importing GPU code.""" + if ( + not isinstance(identity, dict) + or set(identity) != {"module", "path", "sha256"} + or identity["module"] != "rl_engine._C" + or not isinstance(identity["path"], str) + or not Path(identity["path"]).is_absolute() + or not isinstance(identity["sha256"], str) + or re.fullmatch(r"[0-9a-f]{64}", identity["sha256"]) is None + ): + raise ValueError("Provider binary evidence must identify the actual native rl_engine._C") + return dict(identity) + + +def imported_provider_identity(): + """Really import the extension, hash its current bytes, and reject fallbacks. + + Call at worker initialization and on both sides of each case. No cached file + digest can hide a replacement made between cases or while a case executes. + """ + try: + module = importlib.import_module("rl_engine._C") + except (ImportError, OSError) as error: + raise RuntimeError( + "The required native rl_engine._C provider cannot be imported" + ) from error + spec = getattr(module, "__spec__", None) + filename = getattr(module, "__file__", None) + if ( + getattr(module, "__name__", None) != "rl_engine._C" + or not isinstance(getattr(spec, "loader", None), importlib.machinery.ExtensionFileLoader) + or not isinstance(filename, str) + or not isinstance(getattr(spec, "origin", None), str) + or not any(filename.endswith(suffix) for suffix in importlib.machinery.EXTENSION_SUFFIXES) + ): + raise RuntimeError( + "rl_engine._C is not an imported native extension; fallback is forbidden" + ) + path = Path(filename).resolve(strict=True) + if Path(spec.origin).resolve(strict=True) != path: + raise RuntimeError("Provider module file and import origin disagree") + digest = hashlib.sha256() + with path.open("rb") as stream: + before = os.fstat(stream.fileno()) + for chunk in iter(lambda: stream.read(8 * 1024 * 1024), b""): + digest.update(chunk) + after = os.fstat(stream.fileno()) + + # Detect replacement of the pathname as well as writes to the opened file. + def fingerprint(stat): + return (stat.st_dev, stat.st_ino, stat.st_size, stat.st_mtime_ns, stat.st_ctime_ns) + + if fingerprint(before) != fingerprint(after) or fingerprint(after) != fingerprint(path.stat()): + raise RuntimeError("Provider binary changed while its content identity was being recorded") + return validate_provider_identity( + {"module": "rl_engine._C", "path": str(path), "sha256": digest.hexdigest()} + ) diff --git a/rl_engine/integrations/qwen3_next_embedding.py b/rl_engine/integrations/qwen3_next_embedding.py new file mode 100644 index 000000000..a29ea5b1b --- /dev/null +++ b/rl_engine/integrations/qwen3_next_embedding.py @@ -0,0 +1,57 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Shared TP4 vocabulary embedding with a fixed-order, non-atomic VJP.""" + +import torch +import torch.distributed as dist + +from rl_engine.integrations.qwen3_next_tp import _reduce + + +class _Embedding(torch.autograd.Function): + @staticmethod + def forward(ctx, tokens, weight, rank, group): + flat = tokens.reshape(-1) + local = flat - rank * 37984 + valid = (local >= 0) & (local < 37984) + rows = local.clamp(0, 37983) + value = weight.index_select(0, rows) + value = torch.where(valid[:, None], value, torch.zeros_like(value)) + ctx.save_for_backward(local, valid) + ctx.weight_shape, ctx.weight_dtype = weight.shape, weight.dtype + return _reduce(value, group).reshape(*tokens.shape, 2048) + + @staticmethod + def backward(ctx, dy): + local, valid = ctx.saved_tensors + local = local[valid] + values = dy.reshape(-1, 2048)[valid] + gradient = torch.zeros(ctx.weight_shape, dtype=ctx.weight_dtype, device=dy.device) + order = torch.argsort(local, stable=True) + local, values = local[order], values[order] + unique, counts = torch.unique_consecutive(local, return_counts=True) + start = 0 + # Every row is written once. Pairwise FP32 additions use a fixed tree + # over source token order; there is no floating-point scatter/atomic. + for row, count in zip(unique.cpu().tolist(), counts.cpu().tolist(), strict=True): + part = values[start : start + count].float() + while part.shape[0] > 1: + pairs = part.shape[0] // 2 + merged = part[: 2 * pairs : 2] + part[1 : 2 * pairs : 2] + part = torch.cat((merged, part[-1:]), dim=0) if part.shape[0] % 2 else merged + gradient[row].copy_(part[0].to(ctx.weight_dtype)) + start += count + return None, gradient, None, None + + +def shared_embedding(tokens, weight, group): + if not dist.is_initialized() or group is None or dist.get_world_size(group) != 4: + raise ValueError("Shared Qwen embedding requires an explicit TP4 group") + if tokens.dtype != torch.int64 or tokens.device != weight.device: + raise ValueError("Embedding token IDs must be int64 on the weight device") + if weight.shape != (37984, 2048) or weight.dtype != torch.bfloat16: + raise ValueError("Each rank must own a BF16 [37984, 2048] embedding shard") + if weight.device.type != "cuda" or bool(((tokens < 0) | (tokens >= 151936)).any()): + raise ValueError("Embedding requires valid official vocabulary IDs on CUDA") + return _Embedding.apply(tokens, weight, dist.get_rank(group), group) diff --git a/rl_engine/integrations/qwen3_next_engine_weights.py b/rl_engine/integrations/qwen3_next_engine_weights.py new file mode 100644 index 000000000..a7a82e8ea --- /dev/null +++ b/rl_engine/integrations/qwen3_next_engine_weights.py @@ -0,0 +1,88 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Explicit TP metadata and convolution layout conversion at engine boundaries.""" + +import torch + + +def conv_hf_to_rank_major(weight): + """Arrange HF [Q(all ranks), K(all ranks), V(all ranks)] for a dim-0 TP split.""" + if weight.shape != (8192, 1, 4) or weight.dtype != torch.bfloat16: + raise ValueError("Qwen3-Next convolution must be BF16 [8192, 1, 4]") + q, k, v = weight.split((2048, 2048, 4096)) + return torch.cat([part.chunk(4)[rank] for rank in range(4) for part in (q, k, v)]) + + +def conv_rank_major_to_hf(weight): + """Undo VIME's rank-major TP gather before exporting the official HF layout.""" + if weight.shape != (8192, 1, 4) or weight.dtype != torch.bfloat16: + raise ValueError("Gathered Qwen3-Next convolution must be BF16 [8192, 1, 4]") + shards = [part.split((512, 512, 1024)) for part in weight.chunk(4)] + return torch.cat([shards[rank][segment] for segment in range(3) for rank in range(4)]) + + +def kv_hf_to_rank_major(weight): + if weight.shape != (512, 2048) or weight.dtype != torch.bfloat16: + raise ValueError("Official KV projection requires BF16 [512, 2048]") + first, second = weight.chunk(2) + return torch.cat((first, first, second, second)) + + +def kv_rank_major_to_hf(weight): + from rl_engine.testing.tensor_identity import assert_tensor_bitwise_equal + + if weight.shape != (1024, 2048) or weight.dtype != torch.bfloat16: + raise ValueError("Gathered pair-replicated KV requires BF16 [1024, 2048]") + parts = weight.chunk(4) + assert_tensor_bitwise_equal(parts[0], parts[1], name="KV replica pair 0") + assert_tensor_bitwise_equal(parts[2], parts[3], name="KV replica pair 1") + return torch.cat((parts[0], parts[2])) + + +def expert_hf_to_rank_major(gate, up): + if any(value.shape != (512, 2048) or value.dtype != torch.bfloat16 for value in (gate, up)): + raise ValueError("Official expert gate/up require BF16 [512, 2048]") + return torch.cat([value.chunk(4)[rank] for rank in range(4) for value in (gate, up)]) + + +def expert_rank_major_to_hf(weight): + if weight.shape != (1024, 2048) or weight.dtype != torch.bfloat16: + raise ValueError("Gathered fused expert requires BF16 [1024, 2048]") + ranks = [rank.chunk(2) for rank in weight.chunk(4)] + return tuple(torch.cat([ranks[rank][segment] for rank in range(4)]) for segment in range(2)) + + +def set_gdn_tp_metadata(module): + """Tell VIME/Megatron which weights are replicated and how TP gathers them. + + Convolution uses stride one because import/export hooks handle its unequal + Q/K/V segments. The shared norm's gradient is already reduced by TP4GDN. + """ + for name, parameter in module.named_parameters(): + replicated = name == "norm.weight" + parameter.tensor_model_parallel = not replicated + parameter.partition_dim = -1 if replicated else (1 if name == "out_proj.weight" else 0) + parameter.partition_stride = 1 + parameter.sequence_parallel = False + parameter.allreduce = True + + +def validate_training_topology(config, args): + for name, expected in ( + ("tensor_model_parallel_size", 4), + ("pipeline_model_parallel_size", 1), + ("context_parallel_size", 1), + ("expert_model_parallel_size", 1), + ): + if getattr(config, name, None) != expected: + raise ValueError(f"Shared Qwen3-Next requires {name}={expected}") + if getattr(config, "sequence_parallel", False) or getattr(args, "sequence_parallel", False): + raise ValueError("Shared Qwen3-Next requires sequence parallelism disabled") + if getattr(config, "fp32_residual_connection", False): + raise ValueError("Shared Qwen3-Next requires BF16 residual additions") + if any( + getattr(config, name, 0) + for name in ("attention_dropout", "hidden_dropout", "mtp_num_layers") + ): + raise ValueError("Shared Qwen3-Next requires dropout and MTP disabled") diff --git a/rl_engine/integrations/qwen3_next_forward.py b/rl_engine/integrations/qwen3_next_forward.py index 18c892261..872daed72 100644 --- a/rl_engine/integrations/qwen3_next_forward.py +++ b/rl_engine/integrations/qwen3_next_forward.py @@ -17,6 +17,8 @@ import torch.nn.functional as F from torch.autograd.function import once_differentiable +from rl_engine.kernels.logprob_contract import LogprobContract + FORWARD_PROVIDER_ID = "qwen3-next-shared-cuda-forward-v1" @@ -362,3 +364,46 @@ def shared_attention(q, k, v): if q.shape[2] > k.shape[2]: raise ValueError("Query tokens must fit within the supplied KV prefix") return _attention_op()(q, k, v, causal=True, scale=1 / 16) + + +def shared_logprob(local_logits, targets, *, contract, tp_group=None, with_entropy=True): + """Return FP32 (selected logprob, LSE, optional entropy) with 64 vocab tiles. + + The existing CUDA WS2 provider supplies forward and autograd. Native VIME + policy_loss requests entropy even with a zero regularization coefficient. + Both invocation modes therefore use its same entropy-capable path, keeping + selected-logprob forward/backward identical across training and rollout. + """ + _cuda_tensors(local_logits, targets) + if not isinstance(contract, LogprobContract): + raise ValueError("An explicit LogprobContract is required") + if contract.sharding.real_vocab_size != 151936 or contract.sharding.padded_vocab_size != 151936: + raise ValueError("Qwen3-Next logprob requires the full 151936-entry vocabulary") + if contract.sharding.cp_world_size != 1 or contract.sharding.tp_world_size not in (1, 4): + raise ValueError("Qwen3-Next logprob requires CP1 and TP4 (TP1 for component tests)") + if local_logits.dtype not in (torch.bfloat16, torch.float32): + raise ValueError("Qwen3-Next logits must be BF16 or FP32") + if targets.dtype not in (torch.int32, torch.int64): + raise ValueError("Qwen3-Next targets must have integer token IDs") + if not isinstance(with_entropy, bool): + raise ValueError("with_entropy must be a bool") + if not torch.isfinite(local_logits).all(): + raise ValueError("Qwen3-Next logits must be finite") + from rl_engine.kernels.ops.cuda.loss.vocab_parallel_logp import ( + CudaVocabParallelLogprobOp, + native_tile_stats_available, + ) + + if not native_tile_stats_available(): + raise RuntimeError("Qwen3-Next logprob requires rebuilt CUDA tile-stat kernels") + selected, lse, entropy = CudaVocabParallelLogprobOp().apply_with_entropy( + local_logits, + targets, + contract=contract, + tp_group=tp_group, + num_vocab_tiles=64, + validate=True, + with_entropy_grad=with_entropy, + deterministic=True, + ) + return selected, lse, entropy if with_entropy else None diff --git a/rl_engine/integrations/qwen3_next_logprob.py b/rl_engine/integrations/qwen3_next_logprob.py new file mode 100644 index 000000000..4848ec020 --- /dev/null +++ b/rl_engine/integrations/qwen3_next_logprob.py @@ -0,0 +1,89 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Explicit shared Qwen TP4 logprob/entropy boundary for native VIME policy loss.""" + +import torch +import torch.distributed as dist + +from rl_engine.integrations.qwen3_next_forward import shared_logprob +from rl_engine.kernels.logprob_contract import ( + LogprobContract, + LogprobDType, + LogprobRole, + MaskSpec, + ReductionSpec, + ShardingSpec, +) + + +def qwen_logprob_contract(logits, *, rank, world_size, role=LogprobRole.TRAIN): + if world_size != 4 or type(rank) is not int or not 0 <= rank < 4: + raise ValueError("Full Qwen logprob execution requires TP4") + if logits.ndim != 2 or logits.shape[1] != 37984: + raise ValueError("Each Qwen TP4 rank must own 37984 vocabulary columns") + dtype = {torch.bfloat16: LogprobDType.BF16, torch.float32: LogprobDType.FP32}.get(logits.dtype) + if dtype is None: + raise ValueError("Qwen LM head produces BF16 logits, optionally promoted by VIME") + return LogprobContract( + role=role, + dtype=dtype, + mask=MaskSpec(num_tokens=logits.shape[0], active_mask=(True,) * logits.shape[0]), + sharding=ShardingSpec( + tp_rank=rank, + tp_world_size=4, + vocab_shard_bounds=tuple((index * 37984, (index + 1) * 37984) for index in range(4)), + real_vocab_size=151936, + padded_vocab_size=151936, + cp_rank=0, + cp_world_size=1, + ), + reduction=ReductionSpec(), + ) + + +def calculate_log_probs_and_entropy( + logits, + tokens, + tp_group, + with_entropy=False, + chunk_size=-1, + log_prob_keep_mask=None, + with_entropy_grad=True, +): + """VIME's numerical callback; its policy loss and response alignment stay native.""" + if log_prob_keep_mask is not None: + raise ValueError("Fixed Qwen eager profile does not support top-p replay") + if not dist.is_initialized() or tp_group is None: + raise ValueError("Shared Qwen logprob requires an explicit initialized TP4 group") + if logits.device.type != "cuda" or tokens.device != logits.device: + raise ValueError("Logits and target IDs must share a CUDA device") + if tokens.shape != (logits.shape[0],): + raise ValueError("Logprob target IDs must match the token rows") + contract = qwen_logprob_contract( + logits, rank=dist.get_rank(tp_group), world_size=dist.get_world_size(tp_group) + ) + # Keep one fixed numerical path even when VIME requests chunking or metrics + # only. Its chunk_size is a memory hint; this explicit provider owns tiling. + selected, _lse, entropy = shared_logprob( + logits, tokens, contract=contract, tp_group=tp_group, with_entropy=True + ) + if not with_entropy_grad: + entropy = entropy.detach() + return selected.unsqueeze(-1), entropy if with_entropy else None + + +def install_vime_logprob_provider(): + """Install explicitly in each worker, without modifying the shared VIME checkout.""" + from megatron.core import mpu + from vime.backends.megatron_utils import loss + + topology = (mpu.get_context_parallel_world_size(), mpu.get_tensor_model_parallel_world_size()) + if topology != (1, 4): + raise ValueError("The Qwen native policy adapter supports TP4/CP1 only") + original = loss.calculate_log_probs_and_entropy + if original is calculate_log_probs_and_entropy: + return + if original.__module__ != "vime.utils.ppo_utils": + raise ValueError("Refusing to replace an unknown VIME logprob provider") + loss.calculate_log_probs_and_entropy = calculate_log_probs_and_entropy diff --git a/rl_engine/integrations/qwen3_next_native_recompute.py b/rl_engine/integrations/qwen3_next_native_recompute.py new file mode 100644 index 000000000..a59e89dc7 --- /dev/null +++ b/rl_engine/integrations/qwen3_next_native_recompute.py @@ -0,0 +1,318 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Independent native VIME full-model recomputation from frozen tokens only.""" + +import hashlib +import os +import sys +import traceback +from datetime import timedelta +from pathlib import Path +from uuid import uuid4 + +import torch +import torch.distributed as dist +import torch.multiprocessing as mp + +from rl_engine.integrations import qwen3_next_subnode as subnode +from rl_engine.testing.qwen3_next_l2 import ( + embedding_digest, + layer_digest, + load_tensor_artifact, + save_tensor_artifact, + validate_model_artifact, + validate_native_worker_traces, +) +from rl_engine.testing.tensor_identity import assert_tensor_bitwise_equal as exact + + +def response_rows(value, request): + """Keep original BF16 values at P-1..P+14 for every packed sample.""" + batch = len(request["prompt_tokens"]) + length = len(request["consumed_input_tokens"][0]) + if value.dtype not in (torch.bfloat16, torch.int64) or value.numel() == 0: + raise ValueError("Response traces must preserve nonempty original BF16/int64 storage") + value = value.reshape(-1, value.shape[-1]) + if value.shape[0] < batch * length: + raise ValueError("Packed model output does not cover every frozen sample") + positions = torch.tensor(request["prediction_positions"], device=value.device) + if positions.shape != (16,) or positions[-1] != length - 1: + raise ValueError("Response positions must end before consuming the last target token") + return torch.stack([value[index * length + positions] for index in range(batch)]) + + +def _rank_main(rank, cases, staging): + os.environ.update(LOCAL_RANK=str(rank), RANK=str(rank), WORLD_SIZE="4") + torch.cuda.set_device(rank) + dist.init_process_group( + "nccl", + init_method=f"file://{staging}/rendezvous", + rank=rank, + world_size=4, + timeout=timedelta(minutes=30), + device_id=torch.device("cuda", rank), + ) + try: + from megatron.core import mpu + from megatron.core.packed_seq_params import PackedSeqParams + from qwen3_next_contract import atomic_json + + from rl_engine.integrations.qwen3_next_binary import imported_provider_identity + from rl_engine.integrations.qwen3_next_forward import shared_logprob + from rl_engine.integrations.qwen3_next_logprob import qwen_logprob_contract + from rl_engine.integrations.qwen3_next_vime_runtime import create_actor + + first = cases[0][0] + args, model, optimizer, scheduler = create_actor( + first["identity"]["checkpoint"], training=False + ) + if optimizer is not None or scheduler is not None or len(model) != 1: + raise ValueError("L2 recompute requires one native actor without an optimizer") + raw = model[0] + while hasattr(raw, "module"): + raw = raw.module + if len(raw.decoder.layers) != 48: + raise ValueError("Native recompute must execute all 48 decoder layers") + model[0].eval() + provider_binary = imported_provider_identity() + group = mpu.get_tensor_model_parallel_group() + for case_index, (request, _output) in enumerate(cases): + if request["identity"] != first["identity"] or request["role"] != "recompute": + raise ValueError("A native actor batch cannot mix model identities or roles") + if rank == 0: + atomic_json( + Path(staging).parent / "active-case.json", + { + "case_id": request["case_id"], + "phase": "native_recompute", + "request": str(Path(_output).with_suffix(".request.json")), + }, + ) + consumed = torch.tensor( + request["consumed_input_tokens"], device="cuda", dtype=torch.long + ) + batch, length = consumed.shape + if length != request["state_position"] + 1: + raise ValueError("Recompute recurrent-state position is inconsistent") + cu = torch.arange(batch + 1, device="cuda", dtype=torch.int32) * length + packed = PackedSeqParams( + cu_seqlens_q=cu, + cu_seqlens_kv=cu, + max_seqlen_q=length, + max_seqlen_kv=length, + qkv_format="thd", + ) + traces, handles = {}, [] + local_logits = [] + + def capture_output(index): + def hook(_module, _inputs, output): + hidden = output[0] if isinstance(output, tuple) else output + traces.setdefault(index, {})["output"] = ( + response_rows(hidden, request).detach().cpu() + ) + + return hook + + def capture_state(index): + def hook(state, indices, _cu): + slots = indices[:batch].long() + if (index + 1) % 4: + values = { + "convolution": state.convolution[slots], + "recurrent_state": state.recurrent[slots], + } + else: + chosen = slots.cpu().tolist() + values = { + "key": torch.cat([state.keys[i] for i in chosen]), + "value": torch.cat([state.values[i] for i in chosen]), + } + traces.setdefault(index, {})["states"] = { + key: value.detach().cpu() for key, value in values.items() + } + + return hook + + def capture_logits(_module, _inputs, output): + if local_logits: + raise ValueError( + "Native L2 recompute must run exactly one full forward per case" + ) + local_logits.append(response_rows(output[0], request).detach()) + + def capture_subnode(index, name, value): + nodes = traces.setdefault(index, {}).setdefault("subnodes", {}) + if name in nodes: + raise ValueError(f"Sub-node {name} of layer {index} was observed twice") + nodes[name] = response_rows(value, request).detach().cpu() + + subnode.install(raw.decoder.layers, subnode.vime_modules, capture_subnode) + embedding = raw.embedding.word_embeddings + + def capture_embedding(_name, value): + if "embedding" in traces.setdefault("model", {}): + raise ValueError("The embedding was observed twice in one forward") + traces["model"]["embedding"] = response_rows(value, request).detach().cpu() + + embedding.subnode_hook = capture_embedding + for index, layer in enumerate(raw.decoder.layers): + layer.self_attention.trace_state_hook = capture_state(index) + handles.append(layer.register_forward_hook(capture_output(index))) + handles.append(raw.output_layer.register_forward_hook(capture_logits)) + try: + with torch.no_grad(): + model[0]( + input_ids=consumed.reshape(1, -1), + position_ids=None, + attention_mask=None, + labels=None, + packed_seq_params=packed, + ) + if len(local_logits) != 1 or len(traces) != 49: + raise ValueError("Native model omitted an output or diagnostic hook") + local = local_logits[0].reshape(-1, 37984) + targets = torch.tensor( + request["response_tokens"], device="cuda", dtype=torch.long + ).reshape(-1) + selected, _lse, _entropy = shared_logprob( + local, + targets, + contract=qwen_logprob_contract(local, rank=rank, world_size=4), + tp_group=group, + with_entropy=True, + ) + peers = [torch.empty_like(local) for _ in range(4)] + dist.all_gather(peers, local.contiguous(), group=group) + record = { + "rank": rank, + "request_sha256": request["request_sha256"], + "role": "recompute", + "execution": request["execution"], + "provider_binary": provider_binary, + "layers": traces, + "local_logits": local.reshape(batch, 16, 37984).cpu(), + "responses": targets.reshape(batch, 16).cpu(), + "logprobs": selected.reshape(batch, 16).cpu(), + } + if rank == 0: + record["logits"] = torch.cat(peers, dim=-1).reshape(batch, 16, 151936).cpu() + save_tensor_artifact(Path(staging) / f"case-{case_index}-rank-{rank}.pt", record) + del peers, local + local_logits.clear() + finally: + for handle in handles: + handle.remove() + for layer in raw.decoder.layers: + layer.self_attention.trace_state_hook = None + subnode.remove(raw.decoder.layers, subnode.vime_modules) + embedding.subnode_hook = None + dist.barrier() + except BaseException: + # One rank must not take the others down by deadlock: tearing down the + # process group while its peers sit in a collective can block forever. + # Report, then exit so the spawning parent terminates + # the sibling ranks and the stage fails instead of running out its budget. + traceback.print_exc() + sys.stderr.flush() + os._exit(3) + finally: + dist.destroy_process_group() + + +def _assemble(request, ranks, records): + if len(ranks) != 4 or [item.get("rank") for item in ranks] != list(range(4)): + raise ValueError("Recompute artifacts must cover all four distinct TP ranks") + result = { + "metadata": { + key: request[key] + for key in ("schema_version", "case_id", "role", "identity", "request_sha256") + }, + "execution": request["execution"], + "prompt_tokens": torch.tensor(request["prompt_tokens"], dtype=torch.int64), + "response_tokens": torch.tensor(request["response_tokens"], dtype=torch.int64), + "prediction_positions": torch.tensor(request["prediction_positions"], dtype=torch.int64), + "logits": ranks[0]["logits"], + "logprobs": ranks[0]["logprobs"], + "layer_digests": [], + "embedding_digest": embedding_digest(ranks[0]["layers"]["model"]["embedding"]), + "debug_tensors": {}, + "worker_traces": records, + "provider_binary": ranks[0]["provider_binary"], + } + for peer in ranks[1:]: + exact( + peer["layers"]["model"]["embedding"], + ranks[0]["layers"]["model"]["embedding"], + name="TP replicated embedding", + ) + for peer in ranks: + if peer.get("provider_binary") != result["provider_binary"]: + raise ValueError("Recompute TP ranks loaded different CUDA provider binaries") + if peer["request_sha256"] != request["request_sha256"]: + raise ValueError("Rank result belongs to a different request") + exact(peer["logprobs"], result["logprobs"], name="TP selected logprob replica") + for layer in range(48): + hidden = ranks[0]["layers"][layer]["output"] + states = {} + for rank, peer in enumerate(ranks): + exact(peer["layers"][layer]["output"], hidden, name=f"TP layer {layer} replica") + states.update( + { + f"tp{rank}.{name}": value + for name, value in peer["layers"][layer]["states"].items() + } + ) + nodes = ranks[0]["layers"][layer]["subnodes"] + for peer in ranks[1:]: + for name in subnode.SUBNODES: + exact(peer["layers"][layer]["subnodes"][name], nodes[name], name=f"TP {name}") + nodes = {name: nodes[name] for name in subnode.SUBNODES} + result["layer_digests"].append( + layer_digest(layer, hidden, states, request=request, subnodes=nodes) + ) + if layer in request["trace_layers"]: + result["debug_tensors"][f"layer.{layer}.output"] = hidden + result["debug_tensors"].update( + {f"layer.{layer}.subnode.{name}": value for name, value in nodes.items()} + ) + result["debug_tensors"].update( + {f"layer.{layer}.{name}": value for name, value in states.items()} + ) + validate_model_artifact(result, request) + return result + + +def run_recompute_cases(cases): + cases = [(request, str(output)) for request, output in cases] + if not cases: + raise ValueError("Native recompute batch cannot be empty") + staging = Path(cases[0][1]).parent / f"native-recompute-{uuid4().hex}" + staging.mkdir(parents=True, exist_ok=False) + # Spawn preserves the current isolated-venv interpreter. Each rank loads + # the real model once, and all ranks exit before another GPU role starts. + mp.spawn(_rank_main, args=(cases, str(staging)), nprocs=4, join=True) + for index, (request, output) in enumerate(cases): + files = [staging / f"case-{index}-rank-{rank}.pt" for rank in range(4)] + records = [] + for rank, path in enumerate(files): + with path.open("rb") as stream: + digest = hashlib.file_digest(stream, "sha256").hexdigest() + records.append( + { + "rank": rank, + "path": str(path.absolute()), + "sha256": digest, + "request_sha256": request["request_sha256"], + } + ) + artifact = _assemble(request, [load_tensor_artifact(path) for path in files], records) + validate_native_worker_traces(artifact, request, artifact_root=staging.parent) + # Retain original per-rank hidden/state tensors for historical validation + # and first-divergence diagnosis after old HF exports have been retired. + save_tensor_artifact(Path(output), artifact) + + +def run_recompute_case(request, output): + run_recompute_cases([(request, output)]) diff --git a/rl_engine/integrations/qwen3_next_native_rollout.py b/rl_engine/integrations/qwen3_next_native_rollout.py new file mode 100644 index 000000000..912354597 --- /dev/null +++ b/rl_engine/integrations/qwen3_next_native_rollout.py @@ -0,0 +1,777 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Actual vLLM scheduler rollout, with raw shared-provider L2 observations. + +Qualification leaves backend capabilities closed; certified execution requires +the source/environment-bound profile certificate. The scheduler audits actual decisions; +configuration hints alone are never reported as executed prefill chunks. +""" + +import gc +import hashlib +import os +from pathlib import Path + +import torch +from vllm.v1.core.sched.interface import PauseState +from vllm.v1.core.sched.scheduler import Scheduler +from vllm.v1.sample.logits_processor import AdapterLogitsProcessor + +from rl_engine.integrations import qwen3_next_subnode as subnode +from rl_engine.integrations.qwen3_next_binary import ( + imported_provider_identity, + validate_provider_identity, +) +from rl_engine.testing.qwen3_next_l2 import ( + embedding_digest, + json_digest, + layer_digest, + load_tensor_artifact, + save_tensor_artifact, + validate_debug_capture, + validate_model_artifact, +) +from rl_engine.testing.tensor_identity import assert_tensor_bitwise_equal as exact + +NATIVE_ROLLOUT_PROFILE = { + # Caps, not schedules: ExactPrefillScheduler fixes every step's chunks. They + # are sized so up to 64 concurrent requests fit one certified profile. + "kv_cache_memory_bytes_per_gpu": 4 << 30, + "max_model_len": 1040, + "max_num_seqs": 64, + "max_num_batched_tokens": 16384, + "scheduler": "rl_engine.integrations.qwen3_next_native_rollout.ExactPrefillScheduler", + "async_scheduling": False, + "prefix_caching": False, + "weights_dtype": "bfloat16", + "recurrent_state_dtype": "float32", + "model_runner": "v1", +} + + +def capabilities(): + return { + "rollout": True, + "debug_layers": True, + "architecture_layers": 48, + "tp": 4, + "batched_cases": True, + "native_scheduler": True, + "scheduler_batch_invariance_verified": False, + "full_model_l2_verified": False, + } + + +def runtime_profile(config): + scheduler = config.scheduler_config.scheduler_cls + if isinstance(scheduler, type): + scheduler = scheduler.__module__ + "." + scheduler.__qualname__ + actual = { + "kv_cache_memory_bytes_per_gpu": config.cache_config.kv_cache_memory_bytes, + "max_model_len": config.model_config.max_model_len, + "max_num_seqs": config.scheduler_config.max_num_seqs, + "max_num_batched_tokens": config.scheduler_config.max_num_batched_tokens, + "scheduler": scheduler, + "async_scheduling": config.scheduler_config.async_scheduling, + "prefix_caching": config.cache_config.enable_prefix_caching, + "weights_dtype": str(config.model_config.dtype).removeprefix("torch."), + "recurrent_state_dtype": config.cache_config.mamba_ssm_cache_dtype, + "model_runner": "v2" if config.use_v2_model_runner else "v1", + } + if actual != NATIVE_ROLLOUT_PROFILE: + raise ValueError(f"Native runtime changed the explicit rollout profile: {actual}") + return actual + + +def validate_request(request): + if request.get("role") != "rollout" or request.get("schema_version") != 1: + raise ValueError("A version1 rollout request is required") + digest_input = {key: value for key, value in request.items() if key != "request_sha256"} + if json_digest(digest_input) != request.get("request_sha256"): + raise ValueError("Rollout request identity mismatch") + prompts, samples = request["prompt_tokens"], request["sample_ids"] + batch = len(prompts) + if ( + batch not in (1, 4) + or len(samples) != batch + or any(type(sample) is not int for sample in samples) + or len(set(samples)) != batch + ): + raise ValueError("Rollout requires one or four uniquely identified samples") + length = len(prompts[0]) + if length not in (8, 64, 256, 1024) or any(len(row) != length for row in prompts): + raise ValueError("Rollout prompts must use one official matrix length") + responses = request["response_tokens"] + for rows in (prompts, responses or []): + if any(type(token) is not int or not 0 <= token < 151936 for row in rows for token in row): + raise ValueError("Rollout tokens must be integers in the official vocabulary") + if responses is not None and ( + len(responses) != batch or any(len(row) != 16 for row in responses) + ): + raise ValueError("Frozen responses must have exactly sixteen tokens per sample") + chunks = request["prefill_chunks"] + if ( + not chunks + or any(type(value) is not int or value <= 0 for value in chunks) + or sum(chunks) != length + ): + raise ValueError("Exact positive prefill chunks must cover the prompt") + expected_execution = { + "rollout_mode": "autoregressive", + "prefill_chunks": chunks, + "response_mode": "generate" if responses is None else "teacher_forced", + } + if ( + request["execution"] != expected_execution + or request["response_length"] != 16 + or request["vocab_size"] != 151936 + or request["logits_dtype"] != "bfloat16" + or request["logprobs_dtype"] != "float32" + or request["prediction_positions"] != list(range(length - 1, length + 15)) + or request["consumed_response_tokens"] != 15 + or request["state_position"] != length + 14 + or request["required_layer_digests"] != list(range(48)) + or request["generation"] + != {"temperature": 0.0, "top_p": 1.0, "top_k": -1, "seed": 1234, "ignore_eos": True} + ): + raise ValueError("Rollout execution or response offsets differ from the pinned contract") + if responses is None: + if batch != 4 or chunks != [length] or request["consumed_input_tokens"] is not None: + raise ValueError("Only baseline B4 full prefill may define frozen responses") + elif request["consumed_input_tokens"] != [ + prompt + response[:-1] for prompt, response in zip(prompts, responses, strict=True) + ]: + raise ValueError("Consumed input must end before response token sixteen") + if any(type(layer) is not int or layer not in range(48) for layer in request["trace_layers"]): + raise ValueError("Debug layer indices must be in [0,48)") + identity = request["identity"] + if identity["architecture_layers"] != 48 or identity["topology"] != { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1, + }: + raise ValueError("Rollout cannot change depth or topology") + if not Path(identity["checkpoint"]).is_absolute(): + raise ValueError("Checkpoint identity must use an absolute shared path") + if ( + identity["provider_config"].get("native_rollout_kv_cache_memory_bytes") + != NATIVE_ROLLOUT_PROFILE["kv_cache_memory_bytes_per_gpu"] + ): + raise ValueError("Provider identity must pin the native rollout cache budget") + return batch, length + + +def next_scheduled_tokens(computed, prompt_length, chunks): + boundary = 0 + for size in chunks: + if computed == boundary: + return size + boundary += size + if prompt_length <= computed < prompt_length + 15: + return 1 + raise ValueError("Native scheduler is not at an exact requested chunk/decode boundary") + + +class ExactPrefillScheduler(Scheduler): + """Use native cache allocation/scheduling while enforcing one frozen case at a time.""" + + def schedule(self, throttle_prefills=False): + active = [request for request in self.requests.values() if not request.is_finished()] + if not active: + return super().schedule(throttle_prefills) + descriptors = [ + (request.sampling_params.extra_args or {}).get("shared_l2") for request in active + ] + if any(item is None for item in descriptors): + raise ValueError("Exact Qwen scheduler accepts only identified L2 requests") + first = descriptors[0] + contract = ( + first["request_sha256"], + first["batch_size"], + first["prompt_length"], + first["prefill_chunks"], + ) + if any( + ( + item["request_sha256"], + item["batch_size"], + item["prompt_length"], + item["prefill_chunks"], + ) + != contract + for item in descriptors + ): + raise ValueError("Different L2 cases cannot share a scheduler batch") + if len(active) < first["batch_size"]: + # EngineCore may receive the four add-request messages separately. + # Its normal paused scheduler emits no work until all are admitted. + previous = self._pause_state + self._pause_state = PauseState.PAUSED_ALL + try: + result = super().schedule(throttle_prefills) + finally: + self._pause_state = previous + if result.total_num_scheduled_tokens: + raise RuntimeError("The native scheduler violated the input batch barrier") + return result + if len(active) != first["batch_size"] or len( + {item["sample_id"] for item in descriptors} + ) != len(active): + raise ValueError("L2 scheduler sample cardinality mismatch") + counts = {request.num_computed_tokens for request in active} + if len(counts) != 1: + raise RuntimeError("Native requests lost their synchronized exact-chunk boundary") + computed = counts.pop() + count = next_scheduled_tokens(computed, first["prompt_length"], first["prefill_chunks"]) + self.scheduler_config.long_prefill_token_threshold = count + result = super().schedule(throttle_prefills) + expected = {request.request_id: count for request in active} + if result.num_scheduled_tokens != expected or result.preempted_req_ids: + raise RuntimeError( + "exact_scheduler_mismatch: " + f"expected {expected}, actual {result.num_scheduled_tokens}" + ) + return result + + +class ForceFrozenTokens(AdapterLogitsProcessor): + """Sampling-only teacher forcing; raw model logits are observed beforehand.""" + + def is_argmax_invariant(self): + return False + + def new_req_logits_processor(self, params): + descriptor = (params.extra_args or {}).get("shared_l2") + if descriptor is None: + raise ValueError("L2 sampling requires explicit request metadata") + frozen = descriptor["response_tokens"] + if frozen is None: + return None + if len(frozen) != 16 or any( + type(token) is not int or not 0 <= token < 151936 for token in frozen + ): + raise ValueError("Teacher forcing requires sixteen frozen official token IDs") + + def force(output_ids, logits): + index = len(output_ids) + if index not in range(16): + raise ValueError("Teacher forcing exceeded the fixed response length") + selected = torch.full_like(logits, float("-inf")) + selected[frozen[index]] = 0 + return selected + + return force + + +def file_digest(path): + digest = hashlib.sha256() + with Path(path).open("rb") as stream: + for chunk in iter(lambda: stream.read(8 * 1024 * 1024), b""): + digest.update(chunk) + return digest.hexdigest() + + +class RolloutTrace: + """Worker-local observations of real engine buffers, keyed by immutable sample IDs.""" + + def __init__(self, worker, request, output_directory): + from rl_engine.integrations.qwen3_next_vllm_model import RLKernelQwen3NextForCausalLM + + self.batch, self.prompt_length = validate_request(request) + self.worker, self.request, self.directory = worker, request, Path(output_directory) + self.provider_binary = imported_provider_identity() + if self.provider_binary != worker.shared_provider_binary: + raise RuntimeError("Provider binary changed after native worker initialization") + self.rank = worker.rank + self.native_runtime_profile = runtime_profile(worker.vllm_config) + self.provider_execution_mode = worker.shared_provider_execution_mode + expected_mode = ( + "certified" + if request["identity"].get("scheduler_profile_certificate") + else "qualification" + ) + if self.provider_execution_mode != expected_mode: + raise ValueError("Worker provider certification differs from the immutable request") + self.model = worker.get_model() + if not isinstance(self.model, RLKernelQwen3NextForCausalLM) or worker.use_v2_model_runner: + raise ValueError( + "Trace requires the actual shared model and native V1 GPU model runner" + ) + self.row_by_sample = {sample: row for row, sample in enumerate(request["sample_ids"])} + self.request_rows, self.progress = {}, {} + self.current, self.schedule = [], [] + self.logits = torch.empty(self.batch, 16, 151936, dtype=torch.bfloat16) + self.local_logits = torch.empty(self.batch, 16, 37984, dtype=torch.bfloat16) + self.logprobs = torch.empty(self.batch, 16, dtype=torch.float32) + self.responses = torch.full((self.batch, 16), -1, dtype=torch.int64) + self.hidden = torch.empty(48, self.batch, 16, 2048, dtype=torch.bfloat16) + self.hidden_written = torch.zeros(48, self.batch, 16, dtype=torch.bool) + self.states = [ + ( + {"convolution": [None] * self.batch, "recurrent_state": [None] * self.batch} + if (layer + 1) % 4 + else {"key": [None] * self.batch, "value": [None] * self.batch} + ) + for layer in range(48) + ] + self.model.model.shared_forward_hook = self.begin_forward + self.model.model.shared_trace_hook = self.layer + self.model.shared_logits_hook = self.record_logits + self.subnodes = subnode.SubnodeBuffer(self.batch) + subnode.install(self.model.model.layers, subnode.vllm_modules, self.subnode) + self.model.model.subnode_hook = self.embedding + + def embedding(self, name, packed): + for row, begin, end, computed in self.current: + for offset in range(end - begin): + response = computed + offset - (self.prompt_length - 1) + if 0 <= response < 16: + self.subnodes.put_embedding(row, response, packed[begin + offset]) + + def subnode(self, layer_index, name, packed): + for row, begin, end, computed in self.current: + for offset in range(end - begin): + response = computed + offset - (self.prompt_length - 1) + if 0 <= response < 16: + self.subnodes.put(layer_index, name, row, response, packed[begin + offset]) + + def before_execute(self, scheduled): + for new in scheduled.scheduled_new_reqs: + descriptor = (new.sampling_params.extra_args or {}).get("shared_l2", {}) + if descriptor.get("request_sha256") != self.request["request_sha256"]: + raise ValueError("Scheduler request belongs to a different L2 case") + row = self.row_by_sample[descriptor["sample_id"]] + if ( + new.prompt_token_ids != self.request["prompt_tokens"][row] + or new.num_computed_tokens != 0 + ): + raise ValueError("Native prompt differs or prefix reuse was applied") + if new.req_id in self.request_rows or row in self.request_rows.values(): + raise ValueError("Native scheduler duplicated a sample") + self.request_rows[new.req_id], self.progress[new.req_id] = row, 0 + self.scheduled = scheduled + if not scheduled.total_num_scheduled_tokens: + return + if len(scheduled.num_scheduled_tokens) != self.batch or scheduled.preempted_req_ids: + raise RuntimeError("The actual native step did not preserve its required batch") + step = {} + for req_id, count in scheduled.num_scheduled_tokens.items(): + computed = self.progress[req_id] + expected = next_scheduled_tokens( + computed, self.prompt_length, self.request["prefill_chunks"] + ) + if count != expected: + raise RuntimeError( + "Observed worker tokens disagree with requested prefill/decode chunks" + ) + step[req_id] = (self.request_rows[req_id], computed, count) + self.step = step + + def begin_forward(self, input_ids, positions): + ids = list(self.worker.model_runner.input_batch.req_ids) + if set(ids) != set(self.step): + raise ValueError("Actual model input batch differs from SchedulerOutput") + self.current = [] + begin = 0 + for req_id in ids: + row, computed, count = self.step[req_id] + end = begin + count + if positions[begin:end].cpu().tolist() != list(range(computed, computed + count)): + raise ValueError("Native absolute positions differ from the scheduled offsets") + known = self.request["prompt_tokens"][row] + self.responses[row].tolist() + if input_ids[begin:end].cpu().tolist() != known[computed : computed + count]: + raise ValueError( + "Native engine consumed tokens other than the prompt/frozen response prefix" + ) + self.current.append((row, begin, end, computed)) + self.progress[req_id] = computed + count + begin = end + if begin != self.scheduled.total_num_scheduled_tokens: + raise ValueError("Packed model input does not cover actual scheduled tokens") + self.schedule.append( + { + "samples": [self.request["sample_ids"][row] for row, _, _, _ in self.current], + "computed_before": [computed for _, _, _, computed in self.current], + "token_counts": [end - begin for _, begin, end, _ in self.current], + } + ) + + def layer(self, layer_index, output, layer): + from vllm.forward_context import get_forward_context + from vllm.model_executor.layers.mamba.mamba_utils import is_conv_state_dim_first + + from rl_engine.integrations.qwen3_next_vllm import metadata_sequences + from rl_engine.integrations.qwen3_next_vllm_attention import SharedAttentionMetadata + + if output.dtype != torch.bfloat16 or output.shape[1:] != (2048,): + raise ValueError("Layer observation did not preserve original BF16 hidden states") + metadata = get_forward_context().attn_metadata + if not isinstance(metadata, dict): + raise ValueError("Native engine did not supply per-layer attention metadata") + for row, begin, end, computed in self.current: + for offset in range(end - begin): + response = computed + offset - (self.prompt_length - 1) + if 0 <= response < 16: + if self.hidden_written[layer_index, row, response]: + raise ValueError("A response hidden state was observed more than once") + self.hidden[layer_index, row, response].copy_( + output[begin + offset].detach().cpu() + ) + self.hidden_written[layer_index, row, response] = True + if not any( + computed + end - begin == self.prompt_length + 15 + for _, begin, end, computed in self.current + ): + return + if (layer_index + 1) % 4: + module = layer.linear_attn + meta = metadata[module.prefix] + indices, cu, _reset = metadata_sequences( + meta, self.scheduled.total_num_scheduled_tokens + ) + if cu.tolist() != [0] + [end for _, _, end, _ in self.current]: + raise ValueError("GDN metadata reordered sequences without matching model inputs") + conv, recurrent = module.kv_cache + if not is_conv_state_dim_first(): + conv = conv.transpose(-1, -2) + for (row, begin, end, computed), slot in zip( + self.current, indices.tolist(), strict=True + ): + if computed + end - begin == self.prompt_length + 15: + self.states[layer_index]["convolution"][row] = conv[slot].detach().cpu().clone() + self.states[layer_index]["recurrent_state"][row] = ( + recurrent[slot].detach().cpu().clone() + ) + else: + attention = layer.self_attn.attn + meta, cache = metadata[attention.layer_name], attention.kv_cache + if not isinstance(meta, SharedAttentionMetadata): + raise ValueError("Full attention did not use shared native paged-KV metadata") + if list(meta.query_start_loc) != [0] + [end for _, _, end, _ in self.current]: + raise ValueError("Full attention boundaries differ from actual packed input") + block_size = cache.shape[2] + for index, (row, begin, end, computed) in enumerate(self.current): + length = computed + end - begin + if length != self.prompt_length + 15: + continue + if meta.seq_lens[index] != length: + raise ValueError("Full attention prefix length differs from consumed inputs") + blocks = meta.block_table[index, : (length + block_size - 1) // block_size].long() + values = cache[blocks, 0].reshape(-1, 512)[:length] + self.states[layer_index]["key"][row] = ( + values[:, :256].reshape(1, length, 256).detach().cpu().clone() + ) + self.states[layer_index]["value"][row] = ( + values[:, 256:].reshape(1, length, 256).detach().cpu().clone() + ) + + def record_logits(self, hidden, local, full): + from rl_engine.integrations.qwen3_next_forward import shared_logprob + from rl_engine.integrations.qwen3_next_logprob import qwen_logprob_contract + from rl_engine.kernels.logprob_contract import LogprobRole + + if full.shape != (len(self.current), 151936) or local.shape != (len(self.current), 37984): + raise ValueError( + "Native sampling rows do not correspond one-to-one with active requests" + ) + eligible = [ + (index, row, computed + end - begin - self.prompt_length) + for index, (row, begin, end, computed) in enumerate(self.current) + if computed + end - begin >= self.prompt_length + ] + if not eligible: + return + rows = torch.tensor([index for index, _, _ in eligible], device=local.device) + targets = torch.tensor( + [ + ( + int(full[index].argmax()) + if self.request["response_tokens"] is None + else self.request["response_tokens"][row][position] + ) + for index, row, position in eligible + ], + device=local.device, + dtype=torch.int64, + ) + selected = local.index_select(0, rows) + contract = qwen_logprob_contract( + selected, rank=self.rank, world_size=4, role=LogprobRole.INFER + ) + logp, _, _ = shared_logprob( + selected, targets, contract=contract, tp_group=self.model.shared_tp_group + ) + for count, (index, row, position) in enumerate(eligible): + if position not in range(16) or self.responses[row, position] != -1: + raise ValueError("Sampling observation has a duplicate or invalid response offset") + self.logits[row, position].copy_(full[index].detach().cpu()) + self.local_logits[row, position].copy_(local[index].detach().cpu()) + self.logprobs[row, position].copy_(logp[count].detach().cpu()) + self.responses[row, position] = int(targets[count]) + + def finish(self): + if imported_provider_identity() != self.provider_binary: + raise RuntimeError("Provider binary changed during the rollout case") + if not self.hidden_written.all() or bool((self.responses < 0).any()): + raise RuntimeError("Rollout did not observe every response position in every layer") + for layer in range(48): + self.subnodes.layer(layer) + if len(self.schedule) != len(self.request["prefill_chunks"]) + 15: + raise RuntimeError("Actual scheduler step count differs from the exact chunk contract") + states = [] + for layer in self.states: + if any(value is None for values in layer.values() for value in values): + raise RuntimeError("A final convolution/recurrent/KV state was not observed") + states.append({name: torch.stack(values) for name, values in layer.items()}) + payload = { + "rank": self.rank, + "request_sha256": self.request["request_sha256"], + "logits": self.logits, + "local_logits": self.local_logits, + "logprobs": self.logprobs, + "responses": self.responses, + "hidden": self.hidden, + "states": states, + "subnodes": {name: self.subnodes.values[name] for name in subnode.SUBNODES}, + "embedding": self.subnodes.embedding_rows(), + "schedule": self.schedule, + "native_runtime_profile": self.native_runtime_profile, + "provider_execution_mode": self.provider_execution_mode, + "provider_binary": self.provider_binary, + } + self.directory.mkdir(parents=True, exist_ok=True) + path = self.directory / f"rank-{self.rank}.pt" + save_tensor_artifact(path, payload) + self.model.model.shared_forward_hook = self.model.model.shared_trace_hook = None + self.model.shared_logits_hook = None + subnode.remove(self.model.model.layers, subnode.vllm_modules) + self.model.model.subnode_hook = None + return { + "rank": self.rank, + "path": str(path), + "sha256": file_digest(path), + "request_sha256": self.request["request_sha256"], + } + + +def assemble_trace(request, records, sampled_responses): + if len(records) != 4 or sorted(record["rank"] for record in records) != list(range(4)): + raise ValueError("Rollout trace requires all four unique TP ranks") + shards = [] + for record in sorted(records, key=lambda value: value["rank"]): + if ( + record["request_sha256"] != request["request_sha256"] + or file_digest(record["path"]) != record["sha256"] + ): + raise ValueError("Worker trace identity/hash mismatch") + shard = load_tensor_artifact(record["path"]) + if shard["rank"] != record["rank"] or shard["request_sha256"] != request["request_sha256"]: + raise ValueError("Worker trace content identity mismatch") + shards.append(shard) + first = shards[0] + provider_binary = validate_provider_identity(first.get("provider_binary")) + for shard in shards[1:]: + if validate_provider_identity(shard.get("provider_binary")) != provider_binary: + raise ValueError("TP workers imported different provider binaries") + for shard in shards[1:]: + for name in ("logits", "logprobs", "responses", "hidden"): + exact(shard[name], first[name], name=f"TP replicated rollout {name}") + for name in subnode.SUBNODES: + exact(shard["subnodes"][name], first["subnodes"][name], name=f"TP replicated {name}") + exact(shard["embedding"], first["embedding"], name="TP replicated embedding") + if shard["schedule"] != first["schedule"]: + raise ValueError("TP workers observed different scheduler decisions") + if shard["native_runtime_profile"] != first["native_runtime_profile"]: + raise ValueError("TP workers use different native runtime profiles") + if shard["provider_execution_mode"] != first["provider_execution_mode"]: + raise ValueError("TP workers use different provider certification modes") + if first["native_runtime_profile"] != NATIVE_ROLLOUT_PROFILE: + raise ValueError("Worker artifacts do not identify the pinned native runtime") + expected_mode = ( + "certified" if request["identity"].get("scheduler_profile_certificate") else "qualification" + ) + if first["provider_execution_mode"] != expected_mode: + raise ValueError("Worker artifacts do not match the requested certification mode") + exact( + torch.cat([shard["local_logits"] for shard in shards], dim=-1), + first["logits"], + name="raw LM-head vocabulary gather", + ) + exact( + torch.tensor(sampled_responses, dtype=torch.int64), + first["responses"], + name="actual native sampled response", + ) + layers, debug = [], {} + for layer in range(48): + states = { + f"tp{rank}.{name}": value + for rank, shard in enumerate(shards) + for name, value in shard["states"][layer].items() + } + hidden = first["hidden"][layer] + nodes = {name: first["subnodes"][name][layer] for name in subnode.SUBNODES} + layers.append(layer_digest(layer, hidden, states, request=request, subnodes=nodes)) + if layer in request["trace_layers"]: + debug[f"layer.{layer}.output"] = hidden + debug.update({f"layer.{layer}.subnode.{name}": value for name, value in nodes.items()}) + debug.update({f"layer.{layer}.{name}": value for name, value in states.items()}) + artifact = { + "metadata": { + key: request[key] + for key in ("schema_version", "case_id", "role", "identity", "request_sha256") + }, + "execution": request["execution"], + "prompt_tokens": torch.tensor(request["prompt_tokens"], dtype=torch.int64), + "response_tokens": first["responses"], + "prediction_positions": torch.tensor(request["prediction_positions"], dtype=torch.int64), + "logits": first["logits"], + "logprobs": first["logprobs"], + "layer_digests": layers, + "embedding_digest": embedding_digest(first["embedding"]), + "debug_tensors": debug, + "native_scheduler_steps": first["schedule"], + "worker_traces": records, + "native_runtime_profile": first["native_runtime_profile"], + "provider_execution_mode": first["provider_execution_mode"], + "provider_binary": provider_binary, + } + validate_model_artifact(artifact, request) + validate_debug_capture(artifact, request) + return artifact + + +def _new_engine(identity): + from vllm import LLM + + from rl_engine.integrations.qwen3_next_profile import activate_for_identity + from rl_engine.integrations.qwen3_next_vllm_model import register_shared_model + + activate_for_identity(identity) + if os.environ.get("VLLM_USE_V2_MODEL_RUNNER") != "0": + raise RuntimeError( + "Set VLLM_USE_V2_MODEL_RUNNER=0 before importing the native rollout worker" + ) + if torch.cuda.device_count() != 4: + raise RuntimeError("Native rollout requires exactly four visible GPUs") + return LLM(**engine_arguments(identity, register_shared_model())) + + +def engine_arguments(identity, architecture): + """Keep explicit engine arguments independently checkable against pinned vLLM.""" + return dict( + model=identity["checkpoint"], + tokenizer=identity["checkpoint"], + skip_tokenizer_init=True, + trust_remote_code=False, + hf_overrides={"architectures": [architecture]}, + additional_config={"qwen3_next_shared_identity": identity, "gdn_prefill_backend": "triton"}, + tensor_parallel_size=4, + pipeline_parallel_size=1, + distributed_executor_backend="mp", + dtype="bfloat16", + seed=1234, + enforce_eager=True, + enable_prefix_caching=False, + enable_chunked_prefill=True, + max_model_len=1040, + max_num_seqs=NATIVE_ROLLOUT_PROFILE["max_num_seqs"], + max_num_batched_tokens=NATIVE_ROLLOUT_PROFILE["max_num_batched_tokens"], + long_prefill_token_threshold=1, + scheduler_cls="rl_engine.integrations.qwen3_next_native_rollout.ExactPrefillScheduler", + async_scheduling=False, + worker_cls="rl_engine.integrations.qwen3_next_vllm_worker.SharedQwenWorker", + logits_processors=["rl_engine.integrations.qwen3_next_native_rollout:ForceFrozenTokens"], + kv_cache_dtype="bfloat16", + mamba_cache_dtype="bfloat16", + mamba_ssm_cache_dtype="float32", + mamba_cache_mode="none", + generation_config="vllm", + gpu_memory_utilization=0.85, + kv_cache_memory_bytes=NATIVE_ROLLOUT_PROFILE["kv_cache_memory_bytes_per_gpu"], + attention_config={"backend": "CUSTOM"}, + kernel_config={ + "moe_backend": "triton", + "enable_flashinfer_autotune": False, + "enable_jit_warmup": False, + }, + compilation_config={"mode": 0, "cudagraph_mode": "NONE"}, + ) + + +def run_rollout_cases(cases): + from vllm import SamplingParams + + engine, identity = None, None + try: + for request, output in cases: + batch, length = validate_request(request) + if engine is None: + identity = request["identity"] + engine = _new_engine(identity) + elif request["identity"] != identity: + raise ValueError( + "One native rollout process cannot silently change weight/provider identity" + ) + output = Path(output).resolve() + records = engine.collective_rpc( + "configure_l2_trace", args=(request, str(output.with_suffix(".worker-traces"))) + ) + if len(records) != 4 or any( + record["request_sha256"] != request["request_sha256"] for record in records + ): + raise RuntimeError("All TP workers must acknowledge the exact trace request") + sampling = [] + for row, sample in enumerate(request["sample_ids"]): + descriptor = { + "request_sha256": request["request_sha256"], + "sample_id": sample, + "batch_size": batch, + "prompt_length": length, + "prefill_chunks": request["prefill_chunks"], + "response_tokens": ( + None + if request["response_tokens"] is None + else request["response_tokens"][row] + ), + } + sampling.append( + SamplingParams( + temperature=0, + top_p=1, + top_k=-1, + seed=1234, + ignore_eos=True, + max_tokens=16, + detokenize=False, + extra_args={"shared_l2": descriptor}, + ) + ) + generated = engine.generate( + [{"prompt_token_ids": row} for row in request["prompt_tokens"]], + sampling, + use_tqdm=False, + ) + if len(generated) != batch or any( + len(item.outputs) != 1 or item.prompt_token_ids != request["prompt_tokens"][row] + for row, item in enumerate(generated) + ): + raise RuntimeError( + "Native engine did not return one identified completion per prompt" + ) + responses = [list(item.outputs[0].token_ids) for item in generated] + if any(len(row) != 16 for row in responses): + raise RuntimeError("Native engine did not generate sixteen tokens") + records = engine.collective_rpc("collect_l2_trace") + save_tensor_artifact(output, assemble_trace(request, records, responses)) + finally: + if engine is not None: + engine.llm_engine.engine_core.shutdown() + del engine + gc.collect() + + +def run_rollout_case(request, output): + run_rollout_cases([(request, output)]) diff --git a/rl_engine/integrations/qwen3_next_native_training.py b/rl_engine/integrations/qwen3_next_native_training.py new file mode 100644 index 000000000..e252de3c7 --- /dev/null +++ b/rl_engine/integrations/qwen3_next_native_training.py @@ -0,0 +1,386 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Native four-rank RL updates and restart controls, separated from rollout GPUs.""" + +import json +import os +import re +import sys +import traceback +from datetime import timedelta +from pathlib import Path +from uuid import uuid4 + +import torch +import torch.distributed as dist +import torch.multiprocessing as mp + +from rl_engine.testing.qwen3_next_l2 import load_tensor_artifact, validate_fixture +from rl_engine.testing.qwen3_next_rl_fixture import PolicyFixture + + +def policy_fixture(path): + frozen = load_tensor_artifact(path) + validate_fixture(frozen) + return PolicyFixture.freeze( + torch.cat((frozen["prompts"]["64"], frozen["responses"]["64"]), dim=1), + frozen["old_logprobs"]["64"], + baseline_identity=frozen["baseline_identity"], + ) + + +def active_parameter_groups(model): + """Every parameter tensor in the full actor must participate in the update. + + Routed experts use one fused parameter per layer: unselected expert rows + may be zero, while at least one selected row must carry a real gradient. + """ + from rl_engine.integrations.qwen3_next_training import named_trainable_parameters + + parameters = named_trainable_parameters(model) + validate_active_parameter_names(parameters) + return {name: (name,) for name in parameters} + + +def validate_active_parameter_names(parameters): + layers = { + int(match.group(1)) + for name in parameters + for match in [re.search(r"(?:^|\.)decoder\.layers\.(\d+)\.", name)] + if match + } + if layers != set(range(48)): + raise ValueError("Active parameters must cover exactly the full 48 decoder layers") + for layer in range(48): + for component in ("self_attention.", "mlp.", "pre_mlp_layernorm."): + prefix = f"decoder.layers.{layer}.{component}" + if not any(prefix in name for name in parameters): + raise ValueError(f"Full actor omits an active parameter path: {prefix}") + for component in ("embedding.", "output_layer.", "final_layernorm."): + if not any(component in name for name in parameters): + raise ValueError(f"Full actor omits {component}") + + +def policy_step(args, model, optimizer, scheduler, fixture, *, step, required_groups): + """Track consumed samples only after native loss/backward/update/scheduler succeed.""" + from rl_engine.integrations.qwen3_next_training import native_policy_update + + before, after = (step - 1) * 4, step * 4 + if args.consumed_train_samples != before or scheduler.num_steps != before: + raise ValueError("Native update starts from inconsistent sample/scheduler progress") + audit = native_policy_update( + args, model, optimizer, scheduler, fixture, step=step, required_groups=required_groups + ) + if scheduler.num_steps != after or args.consumed_train_samples != before: + raise ValueError("Native VIME scheduler/sample-counter behavior differs from pinned API") + # Pinned VIME train_one_step advances the scheduler but owns no consumed + # sample counter. The controller advances that counter after its success. + args.consumed_train_samples = after + audit["progress"] = { + "consumed_before": before, + "consumed_after": after, + "scheduler_before": before, + "scheduler_after": after, + "sample_counter_owner": "qwen3_next_native_training.policy_step", + } + return audit + + +def retire_prior_checkpoints(checkpoint, root, identity): + """Called only after all-rank publication/load verifies the successor bytes.""" + from qwen3_next_runtime import retire_directory + + checkpoint, root = Path(checkpoint), Path(root) + if ( + root.is_symlink() + or checkpoint.is_symlink() + or checkpoint.resolve().parent != root.resolve() + ): + raise ValueError("Checkpoint retention is restricted to this run's direct directory") + checkpoint, root = checkpoint.resolve(), root.resolve() + owner = root / "RUN_OWNER.json" + if owner.is_symlink() or json.loads(owner.read_text()) != identity: + raise ValueError("Checkpoint retention lacks a matching run owner") + successor = json.loads((checkpoint / "COMPLETE.json").read_text()) + if successor.get("identity") != identity or successor.get("status") != "complete": + raise ValueError("Checkpoint successor is not a published state for this run") + retired = [] + for path in root.iterdir(): + if ( + not path.is_dir() + or path == checkpoint + or path.suffix == ".partial" + or path.name.startswith(".") + ): + continue + marker = path / "COMPLETE.json" + if path.is_symlink() or marker.is_symlink(): + raise ValueError("Checkpoint retention cannot follow symlinks") + previous = json.loads(marker.read_text()) + if ( + previous.get("identity") != identity + or previous.get("status") != "complete" + or previous.get("step", -1) >= successor["step"] + ): + raise ValueError("Checkpoint retention found an unrelated or ambiguous successor") + retirement = retire_directory( + path, + root, + identity, + proof={ + "complete": previous, + "successor": str(checkpoint), + "successor_complete": successor, + }, + ) + retired.append({"path": str(path), "complete": previous, "retirement": retirement}) + return retired + + +def _rank_main(rank, request, staging): + from qwen3_next_contract import atomic_json + + os.environ.update(RANK=str(rank), LOCAL_RANK=str(rank), WORLD_SIZE="4") + torch.cuda.set_device(rank) + dist.init_process_group( + "nccl", + init_method=f"file://{staging}/rendezvous", + rank=rank, + world_size=4, + timeout=timedelta(minutes=60), + device_id=torch.device("cuda", rank), + ) + try: + from megatron.core.tensor_parallel.random import get_cuda_rng_tracker + from qwen3_next_training_checkpoint import ( + _rank_zero_call, + load_training_checkpoint, + save_training_checkpoint, + training_state_identity, + ) + from qwen3_next_training_export import export_training_weights + + from rl_engine.integrations.qwen3_next_vime_runtime import create_actor + from rl_engine.testing.qwen3_next_binary import verify_imported_provider + + fixture = policy_fixture(request["fixture"]) + manifest = request["manifest"] + identity = request["identity"] + provider_binary = verify_imported_provider( + request["provider_binary"], source_tree=identity["source_tree"] + ) + if identity["fixture_sha256"] != fixture.content_sha256: + raise ValueError("Native RL worker fixture identity changed") + args, model, optimizer, scheduler = create_actor(manifest["checkpoint"], training=True) + if optimizer is None or scheduler is None or len(model) != 1: + raise ValueError("Native RL worker requires the actual optimizer and scheduler") + tracker = get_cuda_rng_tracker() + groups = active_parameter_groups(model) + phase = request["phase"] + record = { + "rank": rank, + "phase": phase, + "identity": identity, + "pid": os.getpid(), + "provider_binary": provider_binary, + "native_entrypoints": [ + "vime.backends.megatron_utils.model.setup_model_and_optimizer", + "vime.backends.megatron_utils.model.train_one_step", + "vime.backends.megatron_utils.loss.policy_loss_function", + ], + } + restored = None + if request.get("checkpoint"): + restored = load_training_checkpoint( + args, + model, + optimizer, + scheduler, + fixture, + request["checkpoint"], + identity=identity, + tracker=tracker, + ) + record["restored"] = restored + expected_previous = { + "update1": 0, + "update2": 1, + "reload": 2, + "continuous": 0, + "resumed": 2, + }[phase] + actual_previous = restored["step"] if restored else 0 + recover_published_update = phase in ("update1", "update2") and actual_previous == ( + 1 if phase == "update1" else 2 + ) + if actual_previous != expected_previous and not recover_published_update: + raise ValueError("Native RL update resumed from the wrong complete step") + if phase in ("continuous", "resumed"): + record["controls"] = {} + for step in (1, 2, 3) if phase == "continuous" else (3,): + audit = policy_step( + args, model, optimizer, scheduler, fixture, step=step, required_groups=groups + ) + state = training_state_identity( + args, + model, + optimizer, + scheduler, + fixture, + step=step, + sample_position=step * 4, + identity=identity, + tracker=tracker, + ) + expected = request["expected_states"][str(step)][rank] if step < 3 else None + if expected is not None and state != expected: + differing = sorted( + key + for key in expected.keys() | state.keys() + if expected.get(key) != state.get(key) + ) + atomic_json( + Path(staging) / f"divergence-rank-{rank}.json", + { + "rank": rank, + "step": step, + "differing": differing, + "expected": expected, + "actual": state, + "update": audit, + }, + ) + raise ValueError( + f"Continuous control diverged from original update {step} " + f"on rank {rank}: {', '.join(differing)}" + ) + record["controls"][str(step)] = {"update": audit, "state": state} + verify_imported_provider( + request["provider_binary"], source_tree=identity["source_tree"] + ) + atomic_json(Path(staging) / f"rank-{rank}.json", record) + dist.barrier() + return + step = 1 if phase == "update1" else 2 + if recover_published_update: + record["update"] = restored["rank_evidence"]["update_evidence"] + if record["update"].get("step") != step: + raise ValueError("Published checkpoint omits the committed update evidence") + record["recovered_committed_update"] = True + checkpoint = request["checkpoint"] + elif phase != "reload": + record["update"] = policy_step( + args, model, optimizer, scheduler, fixture, step=step, required_groups=groups + ) + saved = save_training_checkpoint( + args, + model, + optimizer, + scheduler, + fixture, + request["checkpoint_root"], + step=step, + sample_position=step * 4, + identity=identity, + tracker=tracker, + export_bytes=request["export_bytes"], + update_evidence=record["update"], + ) + record["saved"] = saved + checkpoint = saved["checkpoint"] + else: + checkpoint = request["checkpoint"] + record["retired_checkpoints"] = _rank_zero_call( + lambda: retire_prior_checkpoints(checkpoint, request["checkpoint_root"], identity), + "retire previous complete checkpoints after verified successor", + ) + checkpoint_bytes = sum( + path.stat().st_size for path in Path(checkpoint).rglob("*") if path.is_file() + ) + # Export must reflect the reloaded BF16 actor in the reload phase. Never + # reuse the update2 export as purported evidence that loading worked. + record["export"] = export_training_weights( + args, + model, + request["export_root"], + step=step, + weight_version={"update1": "update-1", "update2": "update-2", "reload": "reload-2"}[ + phase + ], + identity=identity, + base_checkpoint=manifest["checkpoint"], + base_checkpoint_identity=manifest["checkpoint_identity"], + checkpoint_bytes=checkpoint_bytes, + retained_complete_bytes=checkpoint_bytes, + ) + record["state"] = training_state_identity( + args, + model, + optimizer, + scheduler, + fixture, + step=step, + sample_position=step * 4, + identity=identity, + tracker=tracker, + ) + verify_imported_provider(request["provider_binary"], source_tree=identity["source_tree"]) + atomic_json(Path(staging) / f"rank-{rank}.json", record) + dist.barrier() + except BaseException: + # One rank must not take the others down by deadlock: tearing down the + # process group while its peers sit in a collective can block forever. + # Report, then exit so the spawning parent terminates + # the sibling ranks and the stage fails instead of running out its budget. + traceback.print_exc() + sys.stderr.flush() + os._exit(3) + finally: + dist.destroy_process_group() + + +def run_training_phase(request, output): + """One fresh native actor lifetime, then all CUDA processes exit.""" + from qwen3_next_contract import atomic_json + + if request["phase"] not in ("update1", "update2", "reload", "continuous", "resumed"): + raise ValueError("Unknown native RL phase") + if torch.cuda.device_count() != 4: + raise ValueError("Native training requires exactly four visible GPUs") + identity, manifest = request["identity"], request["manifest"] + if ( + identity.get("topology") != {"tp": 4, "pp": 1, "cp": 1, "ep": 1} + or identity.get("architecture_layers") != 48 + or identity.get("checkpoint") != manifest.get("checkpoint") + or identity.get("checkpoint_identity") != manifest.get("checkpoint_identity") + ): + raise ValueError("Native training request changed base checkpoint/depth/topology") + staging = Path(output).parent / f"native-training-{uuid4().hex}" + staging.mkdir(parents=True, exist_ok=False) + mp.spawn(_rank_main, args=(request, str(staging)), nprocs=4, join=True) + records = [json.loads((staging / f"rank-{rank}.json").read_text()) for rank in range(4)] + for rank, record in enumerate(records): + if (record["rank"], record["phase"], record["identity"]) != ( + rank, + request["phase"], + request["identity"], + ): + raise ValueError("Native RL rank record identity mismatch") + if record.get("export") != records[0].get("export"): + raise ValueError("Native RL ranks disagree on the published HF export") + if record.get("provider_binary") != records[0].get("provider_binary"): + raise ValueError("Native RL ranks imported different CUDA provider binaries") + result = { + "schema_version": 1, + "status": "passed", + "phase": request["phase"], + "identity": request["identity"], + "ranks": records, + "export": records[0].get("export"), + "checkpoint": records[0].get("saved", {}).get("checkpoint", request.get("checkpoint")), + "all_rank_processes_exited": True, + "provider_binary": request["provider_binary"], + } + atomic_json(output, result) + return result diff --git a/rl_engine/integrations/qwen3_next_native_workers.py b/rl_engine/integrations/qwen3_next_native_workers.py new file mode 100644 index 000000000..f101e1133 --- /dev/null +++ b/rl_engine/integrations/qwen3_next_native_workers.py @@ -0,0 +1,49 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Implemented native model entrypoints; availability is not acceptance evidence.""" + + +def capabilities(): + from rl_engine.integrations import qwen3_next_native_recompute as recompute + from rl_engine.integrations import qwen3_next_native_rollout as rollout + + ready = rollout.capabilities() + if any( + not callable(getattr(module, name, None)) + for module, names in ( + (rollout, ("run_rollout_case", "run_rollout_cases")), + (recompute, ("run_recompute_case", "run_recompute_cases")), + ) + for name in names + ): + raise RuntimeError("The native model worker implementation is incomplete") + return { + **ready, + "recompute": True, + "independent_processes_required": True, + "full_model_l2_verified": False, + "training_and_reload_verified": False, + } + + +def run_rollout_cases(cases): + from rl_engine.integrations.qwen3_next_native_rollout import run_rollout_cases as run + + # Preserve the lazy generator: baseline generation freezes response tokens + # before the subsequent teacher-forced cases are constructed. + return run(cases) + + +def run_rollout_case(request, output): + return run_rollout_cases([(request, output)]) + + +def run_recompute_cases(cases): + from rl_engine.integrations.qwen3_next_native_recompute import run_recompute_cases as run + + return run(cases) + + +def run_recompute_case(request, output): + return run_recompute_cases([(request, output)]) diff --git a/rl_engine/integrations/qwen3_next_profile.py b/rl_engine/integrations/qwen3_next_profile.py new file mode 100644 index 000000000..8a7ae2f63 --- /dev/null +++ b/rl_engine/integrations/qwen3_next_profile.py @@ -0,0 +1,143 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Activate only the bounded CUSTOM profile after verifying native layer evidence. + +Capability is process-local and false by default. Qualification runs use BI=0; +strict runs use BI=1 plus the immutable predecessor certificate in their model +identity. Generic vLLM GDN_ATTN registration is never modified. +""" + +import json +import os +import subprocess +import sys +from pathlib import Path + +_CERTIFIED = None +ROOT = Path(__file__).resolve().parents[2] + + +def profile_is_certified(): + return _CERTIFIED is not None and os.environ.get("VLLM_BATCH_INVARIANT") == "1" + + +def validate_certified_weights(identity, certified): + """The base certificate is not a certificate for newly updated weight bytes.""" + from rl_engine.testing.qwen3_next_l2 import validate_weight_identity + + validate_weight_identity(identity) + if identity.get("weight_version", "baseline") == "baseline": + if any( + identity.get(key) != certified.get(key) for key in ("checkpoint", "checkpoint_identity") + ): + raise ValueError("Baseline weights differ from the certified official checkpoint") + return + if any( + ( + identity.get("base_checkpoint") != certified.get("checkpoint"), + identity.get("base_checkpoint_identity") != certified.get("checkpoint_identity"), + ) + ): + raise ValueError("Updated export refers to a different certified official base") + from qwen3_next_training_export import validate_training_export + + verified = validate_training_export(identity["checkpoint"], identity["checkpoint_identity"]) + if verified != identity["checkpoint_identity"]: + raise ValueError("Actual updated weight files differ from the pinned export identity") + training = verified["training_identity"] + fields = ( + "source_commit", + "source_tree", + "environment_sha256", + "provider_config", + "topology", + "checkpoint", + "checkpoint_identity", + ) + if any(training.get(key) != certified.get(key) for key in fields): + raise ValueError( + "Updated export training provenance differs from the certified base profile" + ) + + +def activate_for_identity(identity): + global _CERTIFIED + certificate = identity.get("scheduler_profile_certificate") + mode = os.environ.get("VLLM_BATCH_INVARIANT") + if certificate is None: + if mode != "0" or _CERTIFIED is not None: + raise ValueError("Uncertified shared providers require explicit qualification BI=0") + return "qualification" + if mode != "1": + raise ValueError("A certified shared profile must execute strict BI=1") + sys.path.insert(0, str(ROOT / "scripts")) + from qwen3_next_contract import validate_result + from qwen3_next_l2 import model_identity + from qwen3_next_runtime import file_digest, identity_digest, verify_environment + + record_key = identity_digest({"certificate": certificate, "identity": identity}) + if _CERTIFIED == record_key: + return "certified" + if _CERTIFIED is not None: + raise ValueError("A process cannot switch its certified shared provider identity") + path = Path(certificate["path"]) + if ( + not path.is_absolute() + or path.name != "result.json" + or file_digest(path) != certificate["sha256"] + ): + raise ValueError("Shared profile certificate path/content identity mismatch") + if os.environ.get("QWEN_SHARED_PROFILE_RESULT", str(path)) != str(path): + raise ValueError("Scheduler certificate environment disagrees with the worker request") + manifest = json.loads((path.parent / "run.json").read_text()) + result = json.loads(path.read_text()) + if manifest.get("stage") != "layers": + raise ValueError("Only completed native layer/scheduler evidence can certify CUSTOM") + certified = model_identity(manifest) + fields = ( + "source_commit", + "source_tree", + "environment_sha256", + "provider_config", + "topology", + "architecture_layers", + "weights_dtype", + "recurrent_state_dtype", + ) + if any(identity.get(key) != certified.get(key) for key in fields): + raise ValueError( + "Scheduler certificate belongs to another source/environment/provider profile" + ) + validate_certified_weights(identity, certified) + provider = identity["provider_config"] + if provider.get("profile") != "qwen3_next_tp4_shared_eager_v1": + raise ValueError("Only the explicit Qwen3-Next TP4 eager profile can be certified") + if ( + subprocess.check_output(["git", "rev-parse", "HEAD^{tree}"], cwd=ROOT, text=True).strip() + != identity["source_tree"] + ): + raise ValueError("Current source tree differs from the certified provider") + if subprocess.run(["git", "diff", "--quiet", "HEAD"], cwd=ROOT).returncode: + raise ValueError("Current provider source has uncommitted changes") + for name, expected in provider["sources"].items(): + if file_digest(ROOT / name) != expected: + raise ValueError(f"Certified provider source changed: {name}") + for name, expected in provider["runtime_env"].items(): + if os.environ.get(name) != expected: + raise ValueError(f"Certified runtime setting differs: {name}") + cuda = manifest["cuda_identity"] + if ( + os.environ.get("CUDA_HOME") != cuda["home"] + or file_digest(Path(cuda["home"]) / "bin/nvcc") != cuda["nvcc_sha256"] + ): + raise ValueError("CUDA toolkit differs from the certified environment") + verify_environment(manifest["environment"], require_venv=True) + validate_result(manifest, result, run_dir=path.parent) + _CERTIFIED = record_key + return "certified" + + +def activate_profile_from_environment(identity): + """Compatibility spelling; a path without its pinned request digest is insufficient.""" + return activate_for_identity(identity) diff --git a/rl_engine/integrations/qwen3_next_subnode.py b/rl_engine/integrations/qwen3_next_subnode.py new file mode 100644 index 000000000..cc9fc79cd --- /dev/null +++ b/rl_engine/integrations/qwen3_next_subnode.py @@ -0,0 +1,109 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Sub-node observations inside each Qwen3-Next decoder layer, for first-drift localisation. + +Both the rollout model (vLLM) and the replay model (VIME) call a module's +``subnode_hook(name, packed_rows)`` at the same five points of every decoder +layer, in this order: + +* ``input_layernorm`` - the normed mixer input; +* ``mixer`` - the GDN or full-attention output after the TP reduction; +* ``post_attention_layernorm`` - the normed MLP input; +* ``router`` - the ten selected expert ids per token; +* ``mlp`` - the MoE output after the TP reduction. + +The embedding output is observed once per model as ``embedding`` (on the +embedding module itself) so a drift there is not attributed to layer 0's norm. + +A trace owner binds the layer index, maps packed token rows to the 16 +response positions of each sample, and stores them in :class:`SubnodeBuffer`. +Observing copies values and never changes one. +""" + +from functools import partial + +import torch + +SUBNODES = ("input_layernorm", "mixer", "post_attention_layernorm", "router", "mlp") +EMBEDDING = "embedding" +LAYERS, RESPONSE_LENGTH, HIDDEN, TOP_K = 48, 16, 2048, 10 + + +def subnode_layout(name): + if name == "router": + return TOP_K, torch.int64 + if name in SUBNODES or name == EMBEDDING: + return HIDDEN, torch.bfloat16 + raise ValueError(f"Unknown Qwen3-Next sub-node: {name}") + + +class SubnodeBuffer: + """[48, B, 16, width] host copies of every sub-node, each written exactly once.""" + + def __init__(self, batch): + self.batch = batch + self.values, self.written = {}, {} + for name in SUBNODES: + width, dtype = subnode_layout(name) + self.values[name] = torch.zeros(LAYERS, batch, RESPONSE_LENGTH, width, dtype=dtype) + self.written[name] = torch.zeros(LAYERS, batch, RESPONSE_LENGTH, dtype=torch.bool) + self.embedding = torch.zeros(batch, RESPONSE_LENGTH, HIDDEN, dtype=torch.bfloat16) + self.embedding_written = torch.zeros(batch, RESPONSE_LENGTH, dtype=torch.bool) + + def put_embedding(self, row, response, value): + if value.dtype != torch.bfloat16 or value.shape != (HIDDEN,): + raise ValueError("The embedding must keep its original BF16 [2048] storage") + if self.embedding_written[row, response]: + raise ValueError("The embedding of one response position was observed twice") + self.embedding[row, response].copy_(value.detach().cpu()) + self.embedding_written[row, response] = True + + def embedding_rows(self): + if not bool(self.embedding_written.all()): + raise ValueError("The embedding was not observed at every response position") + return self.embedding + + def put(self, layer, name, row, response, value): + width, dtype = subnode_layout(name) + if value.dtype != dtype or value.shape != (width,): + raise ValueError(f"Sub-node {name} must keep its original {dtype} [{width}] storage") + if self.written[name][layer, row, response]: + raise ValueError(f"Sub-node {name} of layer {layer} was observed twice") + self.values[name][layer, row, response].copy_(value.detach().cpu()) + self.written[name][layer, row, response] = True + + def put_rows(self, layer, name, values): + """Store a complete [B, 16, width] block, as the replay model produces it.""" + for row in range(self.batch): + for response in range(RESPONSE_LENGTH): + self.put(layer, name, row, response, values[row, response]) + + def layer(self, layer): + missing = [name for name in SUBNODES if not bool(self.written[name][layer].all())] + if missing: + raise ValueError(f"Layer {layer} sub-nodes were not all observed: {missing}") + return {name: self.values[name][layer] for name in SUBNODES} + + +def install(layers, modules_of, record): + """Bind ``record(layer_index, name, packed_rows)`` to every hook-bearing module.""" + for index, layer in enumerate(layers): + for module in modules_of(layer): + module.subnode_hook = partial(record, index) + + +def remove(layers, modules_of): + for layer in layers: + for module in modules_of(layer): + module.subnode_hook = None + + +def vllm_modules(layer): + """vLLM ``SharedVLLMDecoderLayer``: the layer itself and its MoE.""" + return (layer, layer.mlp) + + +def vime_modules(layer): + """MCore layer with the shared VIME providers: mixer, pre-MLP norm and MoE.""" + return (layer.self_attention, layer.pre_mlp_layernorm, layer.mlp) diff --git a/rl_engine/integrations/qwen3_next_tp_blocks.py b/rl_engine/integrations/qwen3_next_tp_blocks.py index 7a45c1ad2..ccb04d978 100644 --- a/rl_engine/integrations/qwen3_next_tp_blocks.py +++ b/rl_engine/integrations/qwen3_next_tp_blocks.py @@ -304,6 +304,9 @@ def assemble_moe_weight(name, values): class TP4MoE(nn.Module): """All 512 experts at EP1 with intermediate width 128 per TP rank.""" + # Set by a trace owner (see qwen3_next_subnode); receives the route indices. + subnode_hook = None + def __init__(self, *, group, device): super().__init__() self.group = _tp_group(group) @@ -355,12 +358,14 @@ def forward(self, hidden): if hidden.ndim != 2 or hidden.shape[1] != 2048 or hidden.dtype != torch.bfloat16: raise ValueError("MoE hidden must be BF16 [tokens, 2048]") copied = _CopyToTP.apply(hidden, self.group) - routed, _ = shared_moe( + routed, routes = shared_moe( copied, _CopyToTP.apply(self.gate.weight, self.group), self.experts.gate_up, self.experts.down, ) + if self.subnode_hook is not None: + self.subnode_hook("router", routes.indices) gate = shared_linear(copied, self.shared_expert.gate_proj.weight) up = shared_linear(copied, self.shared_expert.up_proj.weight) activated = (F.silu(gate.float()) * up.float()).to(hidden.dtype) diff --git a/rl_engine/integrations/qwen3_next_training.py b/rl_engine/integrations/qwen3_next_training.py new file mode 100644 index 000000000..753242ad8 --- /dev/null +++ b/rl_engine/integrations/qwen3_next_training.py @@ -0,0 +1,285 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Observe native VIME updates before its train_one_step clears gradients. + +This module does not implement an optimizer or loss. The native training entry +points remain responsible for both; this observer rejects missing evidence. +""" + +import hashlib +import math +import random +import struct +from contextlib import contextmanager + +import numpy as np +import torch + +from rl_engine.testing.qwen3_next_rl_fixture import require_policy_configuration + + +def tensor_digest(value, *, chunk_bytes=64 * 1024 * 1024): + """Hash original tensor bytes with bounded host memory, including dtype/shape.""" + if value.layout != torch.strided or value.device.type == "meta": + raise ValueError("Only materialized strided tensors have a state identity") + digest = hashlib.sha256() + digest.update(str((str(value.dtype), tuple(value.shape))).encode()) + flat = value.detach().contiguous().reshape(-1) + chunk_size = max(1, chunk_bytes // value.element_size()) + for start in range(0, flat.numel(), chunk_size): + part = flat[start : start + chunk_size].cpu() + if (part.is_floating_point() or part.is_complex()) and not torch.isfinite(part).all(): + raise ValueError("Nonfinite tensor in training state") + digest.update(part.view(torch.uint8).numpy().tobytes()) + return digest.hexdigest() + + +def state_digest(state): + """Canonical recursive identity for optimizer/scheduler/RNG state, without pickle.""" + digest = hashlib.sha256() + + def add(raw): + digest.update(struct.pack("!Q", len(raw))) + digest.update(raw) + + def visit(value): + add(type(value).__name__.encode()) + if isinstance(value, torch.Tensor): + add(tensor_digest(value).encode()) + elif isinstance(value, np.ndarray): + add(str((value.dtype.str, value.shape)).encode()) + if value.dtype.hasobject: + raise TypeError("Object arrays cannot identify recovery state") + add(value.tobytes(order="C")) + elif isinstance(value, dict): + if any(type(key) not in (str, int) for key in value): + raise TypeError("Recovery state keys must be strings or integers") + for key in sorted(value, key=lambda key: (type(key).__name__, str(key))): + visit(key) + visit(value[key]) + elif isinstance(value, (list, tuple)): + for item in value: + visit(item) + elif value is None or type(value) in (bool, int, str, bytes): + add(repr(value).encode()) + elif type(value) is float: + if not math.isfinite(value): + raise ValueError("Nonfinite scalar in training state") + add(struct.pack("!d", value)) + else: + raise TypeError(f"Unsupported recovery state type: {type(value)!r}") + + visit(state) + return digest.hexdigest() + + +def capture_rng_state(*, tracker=None): + return { + "python": random.getstate(), + "numpy": np.random.get_state(), + "torch_cpu": torch.get_rng_state().clone(), + "torch_cuda": [value.clone() for value in torch.cuda.get_rng_state_all()], + "megatron": ( + None + if tracker is None + else {name: value.clone() for name, value in tracker.get_states().items()} + ), + } + + +def restore_rng_state(state, *, tracker=None): + if len(state["torch_cuda"]) != torch.cuda.device_count(): + raise ValueError("RNG restore requires the original visible GPU topology") + if (state["megatron"] is None) != (tracker is None): + raise ValueError("Megatron RNG tracker must be restored explicitly") + random.setstate(state["python"]) + np.random.set_state(state["numpy"]) + torch.set_rng_state(state["torch_cpu"]) + torch.cuda.set_rng_state_all(state["torch_cuda"]) + if tracker is not None: + tracker.set_states({name: value.clone() for name, value in state["megatron"].items()}) + + +def named_trainable_parameters(model): + result = {} + seen = set() + for index, chunk in enumerate(model): + for name, parameter in chunk.named_parameters(): + if parameter.requires_grad and id(parameter) not in seen: + result[f"chunk{index}.{name}"] = parameter + seen.add(id(parameter)) + if not result: + raise ValueError("Native training model has no trainable parameters") + return result + + +def _any_rank_nonzero(flags): + """Combine per-rank nonzero flags across the tensor-parallel ranks (max).""" + import torch.distributed as dist + + if not dist.is_available() or not dist.is_initialized() or dist.get_world_size() == 1: + return flags + reduced = torch.tensor(flags, dtype=torch.int32, device=torch.cuda.current_device()) + dist.all_reduce(reduced, op=dist.ReduceOp.MAX) + return [bool(value) for value in reduced.tolist()] + + +def gradient_evidence(parameters, *, required_groups, reduce_flags=_any_rank_nonzero): + """Unselected experts may be zero; every declared active path must be nonzero. + + "Nonzero" is judged across the tensor-parallel group, not per rank: a + vocab-parallel shard such as the embedding of a rank whose vocabulary slice + contains none of the batch's tokens legitimately receives an all-zero + gradient while the full parameter does train. Every rank evaluates the same + parameter list in the same order, so the flag exchange is a fixed-order + collective that all ranks enter together. The per-rank value is kept as + ``nonzero_local``. + """ + if not required_groups or any(not prefixes for prefixes in required_groups.values()): + raise ValueError("Predeclare the active parameter groups before training") + matched = {group: [] for group in required_groups} + evidence = {} + names = [] + local_flags = [] + for name, parameter in parameters.items(): + gradient = getattr(parameter, "main_grad", None) + if gradient is None: + gradient = parameter.grad + if gradient is None: + evidence[name] = {"present": False, "nonzero": False, "nonzero_local": False} + continue + if gradient.shape != parameter.shape or not torch.isfinite(gradient).all(): + raise ValueError(f"Invalid/nonfinite gradient for {name}") + nonzero_local = bool(torch.count_nonzero(gradient)) + evidence[name] = { + "present": True, + "nonzero": nonzero_local, + "nonzero_local": nonzero_local, + "dtype": str(gradient.dtype), + } + names.append(name) + local_flags.append(nonzero_local) + group_flags = list(reduce_flags(local_flags)) if names else [] + if len(group_flags) != len(names): + raise ValueError("Nonzero-gradient flags did not come back one per parameter") + for name, nonzero in zip(names, group_flags, strict=True): + evidence[name]["nonzero"] = bool(nonzero) + for group, prefixes in required_groups.items(): + if nonzero and any(prefix in name for prefix in prefixes): + matched[group].append(name) + missing = [group for group, names_ in matched.items() if not names_] + if missing: + raise ValueError(f"Active paths have no finite nonzero gradient: {missing}") + return {"parameters": evidence, "active_groups": matched} + + +@contextmanager +def observe_native_optimizer_step(optimizer, model, *, required_groups, evidence): + """Wrap only step(), preserving the native loss, backward, clipping and update.""" + original = optimizer.step + had_own = "step" in vars(optimizer) + previous = vars(optimizer).get("step") + parameters = named_trainable_parameters(model) + calls = 0 + + def observed(*args, **kwargs): + nonlocal calls + calls += 1 + if calls != 1: + raise ValueError("One train_one_step call must perform exactly one optimizer step") + evidence["gradients"] = gradient_evidence(parameters, required_groups=required_groups) + before = {name: tensor_digest(value) for name, value in parameters.items()} + result = original(*args, **kwargs) + if not isinstance(result, tuple) or len(result) != 3 or not bool(result[0]): + raise ValueError("Native Megatron optimizer did not report a successful update") + norm = float(result[1]) + if not math.isfinite(norm) or norm <= 0: + raise ValueError("Native optimizer must report a finite nonzero gradient norm") + after = {name: tensor_digest(value) for name, value in parameters.items()} + changed = [name for name in before if before[name] != after[name]] + if not changed: + raise ValueError("Optimizer reported success without changing any model parameter") + evidence.update( + { + "grad_norm": norm, + "parameter_hashes_before": before, + "parameter_hashes_after": after, + "changed_parameters": changed, + } + ) + return result + + optimizer.step = observed + try: + yield + if calls != 1: + raise ValueError("Native training did not call the optimizer exactly once") + finally: + if had_own: + optimizer.step = previous + else: + del optimizer.step + + +def native_policy_update(args, model, optimizer, scheduler, fixture, *, step, required_groups): + """Execute the actual installed VIME train_one_step with its clipped policy loss.""" + require_policy_configuration(args) + fixture.validate() + if step not in (1, 2, 3): + raise ValueError("The fixed acceptance sequence uses updates 1, 2 and recovery control 3") + from megatron.core.distributed import finalize_model_grads + from megatron.core.utils import get_model_config + from vime.backends.megatron_utils import loss as native_loss + from vime.backends.megatron_utils.data import DataIterator + from vime.backends.megatron_utils.model import train_one_step + + if train_one_step.__module__ != "vime.backends.megatron_utils.model": + raise ValueError("Native VIME training entry point was replaced") + if native_loss.policy_loss_function.__module__ != "vime.backends.megatron_utils.loss": + raise ValueError("Native VIME policy loss was replaced") + for chunk in model: + chunk.train() + config = get_model_config(chunk) + if config.hidden_dropout != 0 or config.attention_dropout != 0: + raise ValueError("The fixed eager profile requires zero dropout") + config.grad_scale_func = optimizer.scale_loss + config.finalize_model_grads_func = finalize_model_grads + config.timers = None + batch = fixture.batch([0, 1, 2, 3], device=torch.cuda.current_device()) + batch["tokens"] = batch.pop("unconcat_tokens") + iterator = DataIterator(batch, [[0], [1], [2], [3]]) + original_policy_loss = native_loss.policy_loss_function + policy_calls = 0 + + def observed_loss(*loss_args, **loss_kwargs): + nonlocal policy_calls + policy_calls += 1 + return original_policy_loss(*loss_args, **loss_kwargs) + + evidence = {"step": step, "fixture": fixture.content_sha256, "sample_position": step * 4} + native_loss.policy_loss_function = observed_loss + try: + with observe_native_optimizer_step( + optimizer, model, required_groups=required_groups, evidence=evidence + ): + metrics, norm = train_one_step( + args, + rollout_id=0, + step_id=step - 1, + data_iterator=[iterator], + model=model, + optimizer=optimizer, + opt_param_scheduler=scheduler, + num_microbatches=4, + step_global_batch_size=4, + ) + finally: + native_loss.policy_loss_function = original_policy_loss + if policy_calls != 4 or iterator.offset != 4: + raise ValueError("Native policy loss must consume exactly the four fixed samples") + if not math.isfinite(float(norm)): + raise ValueError("Native training returned a nonfinite gradient norm") + evidence.update({"policy_loss_calls": policy_calls, "metrics": metrics}) + fixture.validate() + return evidence diff --git a/rl_engine/integrations/qwen3_next_vime.py b/rl_engine/integrations/qwen3_next_vime.py new file mode 100644 index 000000000..ff789dc8d --- /dev/null +++ b/rl_engine/integrations/qwen3_next_vime.py @@ -0,0 +1,402 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""VIME ModuleSpec and HF weight hooks for the explicit shared TP4 GDN provider. + + --spec rl_engine.integrations.qwen3_next_vime get_qwen3_next_shared_spec + +Installing this spec installs Qwen3-Next-only weight conversion hooks in this +training process. Other model families keep their existing conversion paths. +The decoder spec covers both attention families, routed/shared experts, and +decoder norms. Call install_vime_model_providers after constructing the GPT +model to replace its embedding, final norm and output layer as well. +""" + +import re + +import torch +from megatron.core import mpu +from megatron.core.tensor_parallel.layers import ( + set_defaults_if_not_set_tensor_model_parallel_attributes, +) +from megatron.core.transformer.identity_op import IdentityOp +from megatron.core.transformer.spec_utils import ModuleSpec +from torch import nn +from vime_plugins.models.hf_attention import HuggingfaceAttention + +from rl_engine.integrations.qwen3_next_engine_weights import ( + conv_hf_to_rank_major, + conv_rank_major_to_hf, + expert_hf_to_rank_major, + expert_rank_major_to_hf, + kv_hf_to_rank_major, + kv_rank_major_to_hf, + set_gdn_tp_metadata, + validate_training_topology, +) +from rl_engine.integrations.qwen3_next_provider import GDNProviderConfig +from rl_engine.integrations.qwen3_next_tp import _CopyToTP +from rl_engine.integrations.qwen3_next_tp_blocks import TP4FullAttention, TP4MoE +from rl_engine.integrations.qwen3_next_tp_gdn import TP4GDN + + +class SharedInputNorm(nn.Module): + def __init__(self, eps, device, weight=None): + super().__init__() + self.eps = eps + if weight is not None and not isinstance(weight, nn.Parameter): + raise ValueError("Shared decoder norm weight must be an existing Parameter") + if weight is not None and (weight.shape != (2048,) or weight.dtype != torch.bfloat16): + raise ValueError("Shared decoder norm requires a BF16 [2048] weight") + self.weight = ( + weight + if weight is not None + else nn.Parameter(torch.zeros(2048, dtype=torch.bfloat16, device=device)) + ) + self.weight.tensor_model_parallel = False + self.weight.partition_dim = -1 + self.weight.partition_stride = 1 + self.weight.sequence_parallel = False + + def forward(self, value): + from rl_engine.kernels.ops.cuda.norm.rmsnorm import Qwen3NextRMSNormCudaOp + + return Qwen3NextRMSNormCudaOp()(value, self.weight, eps=self.eps) + + +class SharedVIMELMHead(nn.Module): + """Megatron output-layer API with shared GEMM and the original weight name. + + A forward hook on this module observes BF16 logits before Float16Module + widens the model output for VIME's policy loss. + """ + + def __init__(self, weight, group): + super().__init__() + if not isinstance(weight, nn.Parameter): + raise ValueError("Shared TP4 LM head weight must be an existing Parameter") + if weight.shape != (37984, 2048) or weight.dtype != torch.bfloat16: + raise ValueError("Shared TP4 LM head requires BF16 [37984, 2048] weight") + if torch.distributed.get_world_size(group) != 4: + raise ValueError("Shared LM head requires TP4") + self.weight = weight + self.weight.tensor_model_parallel = True + self.weight.partition_dim = 0 + self.weight.partition_stride = 1 + self.group = group + self.gather_output = False + self.sequence_parallel = False + + def forward(self, input_, weight=None, runtime_gather_output=None): + from megatron.core.tensor_parallel.mappings import gather_from_tensor_model_parallel_region + + from rl_engine.integrations.qwen3_next_forward import shared_linear + + if self.sequence_parallel: + raise ValueError("Shared LM head requires sequence parallelism disabled") + selected = self.weight if weight is None else weight + if selected.shape != self.weight.shape or selected.dtype != torch.bfloat16: + raise ValueError("Shared LM head received an incompatible tied weight") + value = shared_linear(_CopyToTP.apply(input_, self.group), selected) + gather = self.gather_output if runtime_gather_output is None else runtime_gather_output + if gather: + value = gather_from_tensor_model_parallel_region(value, group=self.group) + return value, None + + +class SharedVIMEGDN(HuggingfaceAttention): + def __init__( + self, args, config, layer_number, cp_comm_type="p2p", pg_collection=None, name=None + ): + validate_training_topology(config, args) + super().__init__(args, config, layer_number, cp_comm_type, pg_collection) + if self.hf_config.hidden_size != 2048: + raise ValueError("Shared VIME GDN requires the pinned Qwen3-Next architecture") + group = ( + pg_collection.tp if pg_collection is not None else mpu.get_tensor_model_parallel_group() + ) + device = torch.device("cuda", torch.cuda.current_device()) + self.linear_attn = TP4GDN( + group=group, device=device, config=GDNProviderConfig(), eps=self.hf_config.rms_norm_eps + ) + set_gdn_tp_metadata(self.linear_attn) + self.input_layernorm = SharedInputNorm(self.hf_config.rms_norm_eps, device) + self.trace_state_hook = None + self.subnode_hook = None + + def hf_forward(self, hidden_states, packed_seq_params): + if hidden_states.ndim != 3 or hidden_states.shape[0] != 1: + raise ValueError("VIME packed GDN expects [1, tokens, 2048]") + if packed_seq_params is None: + raise ValueError("VIME GDN requires packed sequence boundaries") + cu = packed_seq_params.cu_seqlens_q.to(device="cpu") + hidden = self.input_layernorm(hidden_states[0]) + if self.subnode_hook is not None: + self.subnode_hook("input_layernorm", hidden) + indices = torch.arange(1, cu.numel(), device=hidden.device, dtype=torch.int32) + initial = self.linear_attn.initial_state(cu.numel()) + output, state = self.linear_attn(hidden, initial, indices, cu) + if self.trace_state_hook is not None: + self.trace_state_hook(state, indices, cu) + if self.subnode_hook is not None: + self.subnode_hook("mixer", output) + return output.unsqueeze(0) + + +class SharedVIMEFullAttention(HuggingfaceAttention): + def __init__( + self, args, config, layer_number, cp_comm_type="p2p", pg_collection=None, name=None + ): + validate_training_topology(config, args) + super().__init__(args, config, layer_number, cp_comm_type, pg_collection) + group = pg_collection.tp if pg_collection else mpu.get_tensor_model_parallel_group() + device = torch.device("cuda", torch.cuda.current_device()) + rope = getattr(self.hf_config, "rope_parameters", None) + if rope is None: + rope = {"rope_theta": self.hf_config.rope_theta, "partial_rotary_factor": 0.25} + if any( + ( + rope.get("partial_rotary_factor") != 0.25, + rope.get("rope_type", "default") != "default", + ) + ): + raise ValueError("Shared full attention requires default RoPE with rotary dimension 64") + self.self_attn = TP4FullAttention( + group=group, + device=device, + eps=self.hf_config.rms_norm_eps, + rope_theta=rope["rope_theta"], + ) + self.input_layernorm = SharedInputNorm(self.hf_config.rms_norm_eps, device) + self.trace_state_hook = None + self.subnode_hook = None + for parameter in self.parameters(): + set_defaults_if_not_set_tensor_model_parallel_attributes(parameter) + parameter.sequence_parallel = False + + def hf_forward(self, hidden_states, packed_seq_params): + if hidden_states.ndim != 3 or hidden_states.shape[0] != 1 or packed_seq_params is None: + raise ValueError("Shared VIME attention requires packed [1, tokens, 2048]") + hidden = self.input_layernorm(hidden_states[0]) + if self.subnode_hook is not None: + self.subnode_hook("input_layernorm", hidden) + cu = packed_seq_params.cu_seqlens_q.to(device="cpu") + indices = torch.arange(1, cu.numel(), device=hidden.device, dtype=torch.int32) + output, state = self.self_attn( + hidden, self.self_attn.initial_state(cu.numel()), indices, cu + ) + if self.trace_state_hook is not None: + self.trace_state_hook(state, indices, cu) + if self.subnode_hook is not None: + self.subnode_hook("mixer", output) + return output.unsqueeze(0) + + +class SharedVIMEMoE(TP4MoE): + def __init__(self, config, submodules=None): + validate_training_topology(config, config) + if config.expert_tensor_parallel_size != 4: + raise ValueError("Shared MoE requires expert tensor parallel size 4") + super().__init__( + group=mpu.get_tensor_model_parallel_group(), + device=torch.device("cuda", torch.cuda.current_device()), + ) + # Native VIME only recognizes stride-two FC1 names; our paired loader + # already packs complete per-rank gate/up blocks before the generic split. + self.experts.gate_up.partition_stride = 1 + for parameter in self.parameters(): + set_defaults_if_not_set_tensor_model_parallel_attributes(parameter) + parameter.sequence_parallel = False + + def forward(self, hidden_states, padding_mask=None): + if padding_mask is not None and bool(padding_mask.any()): + raise ValueError("Shared VIME MoE requires packed tokens without padding") + value = super().forward(hidden_states.reshape(-1, 2048)) + if self.subnode_hook is not None: + self.subnode_hook("mlp", value) + return value.reshape_as(hidden_states), None + + +class SharedDecoderNorm(SharedInputNorm): + def __init__(self, config, hidden_size, eps): + if hidden_size != 2048 or config.params_dtype != torch.bfloat16: + raise ValueError("Shared decoder norm requires the official BF16 architecture") + super().__init__(eps, torch.device("cuda", torch.cuda.current_device())) + # Set by a trace owner: this instance is a layer's pre-MLP norm. + self.subnode_hook = None + + def forward(self, value): + output = super().forward(value) + if self.subnode_hook is not None: + self.subnode_hook("post_attention_layernorm", output.reshape(-1, output.shape[-1])) + return output + + +class SharedVIMEEmbedding(nn.Module): + def __init__(self, weight, group): + super().__init__() + if weight.shape != (37984, 2048) or weight.dtype != torch.bfloat16: + raise ValueError("Shared embedding requires the official BF16 TP4 weight") + self.weight = weight + self.group = group + self.subnode_hook = None + + def forward(self, tokens): + from rl_engine.integrations.qwen3_next_embedding import shared_embedding + + output = shared_embedding(tokens, self.weight, self.group) + if self.subnode_hook is not None: + self.subnode_hook("embedding", output) + return output + + +def install_vime_model_providers(model): + """Replace outer GPT providers while retaining each original parameter object.""" + group = mpu.get_tensor_model_parallel_group() + validate_training_topology(model.config, model.config) + if len(model.decoder.layers) != 48: + raise ValueError("The complete provider requires all 48 decoder layers") + for layer in model.decoder.layers: + if not isinstance(layer.self_attention, (SharedVIMEGDN, SharedVIMEFullAttention)): + raise ValueError("Construct the model with get_qwen3_next_shared_spec first") + if not isinstance(layer.mlp, SharedVIMEMoE): + raise ValueError("Shared decoder MoE provider is missing") + model.embedding.word_embeddings = SharedVIMEEmbedding( + model.embedding.word_embeddings.weight, group + ) + previous = model.decoder.final_layernorm + model.decoder.final_layernorm = SharedInputNorm( + model.config.layernorm_epsilon, previous.weight.device, weight=previous.weight + ) + model.output_layer = SharedVIMELMHead(model.output_layer.weight, group) + return model + + +def install_vime_gdn_weight_hooks(): + """Install exact shared-model layouts in VIME's real load/export entrypoints.""" + import vime.backends.megatron_utils.hf_to_megatron as load_api + import vime.backends.megatron_utils.megatron_to_hf as export_api + from vime.backends.megatron_utils.hf_to_megatron.common import strip_mcore_wrappers + + original_load = load_api._LOADERS["qwen3_next"] + if getattr(original_load, "_rl_kernel_tp4_gdn", False): + return + original_export = export_api.convert_qwen3_next_to_hf + + def layer_parts(name): + match = re.fullmatch(r"decoder\.layers\.(\d+)\.(.+)", strip_mcore_wrappers(name)) + return match.groups() if match else (None, None) + + def direct_moe(rest): + return rest in { + "mlp.gate.weight", + "mlp.shared_expert_gate.weight", + "mlp.shared_expert.gate_proj.weight", + "mlp.shared_expert.up_proj.weight", + "mlp.shared_expert.down_proj.weight", + } + + def load(name, reader, config): + layer, rest = layer_parts(name) + prefix = f"model.layers.{layer}" + if rest == "mlp.experts.gate_up": + value = torch.empty((512, 1024, 2048), dtype=torch.bfloat16) + for expert in range(512): + gate, up = ( + reader.get_tensor(f"{prefix}.mlp.experts.{expert}.{part}_proj.weight") + for part in ("gate", "up") + ) + value[expert].copy_(expert_hf_to_rank_major(gate, up)) + return value + if rest == "mlp.experts.down": + value = torch.empty((512, 2048, 512), dtype=torch.bfloat16) + for expert in range(512): + weight = reader.get_tensor(f"{prefix}.mlp.experts.{expert}.down_proj.weight") + if weight.shape != (2048, 512) or weight.dtype != torch.bfloat16: + raise ValueError("Official expert down projection requires BF16 [2048, 512]") + value[expert].copy_(weight) + return value + if direct_moe(rest): + return reader.get_tensor(f"{prefix}.{rest}") + value = original_load(name, reader, config) + if name.endswith("self_attention.linear_attn.conv1d.weight"): + if mpu.get_tensor_model_parallel_world_size() != 4: + raise ValueError("The shared GDN weight loader requires TP4") + value = conv_hf_to_rank_major(value) + if rest in ( + "self_attention.self_attn.k_proj.weight", + "self_attention.self_attn.v_proj.weight", + ): + value = kv_hf_to_rank_major(value) + return value + + def export(args, name, value): + layer, rest = layer_parts(name) + prefix = f"model.layers.{layer}" + if rest == "mlp.experts.gate_up": + if value.shape != (512, 1024, 2048): + raise ValueError("Gathered routed gate/up shape is not the complete TP4 tensor") + return [ + (f"{prefix}.mlp.experts.{expert}.{part}_proj.weight", weight) + for expert in range(512) + for part, weight in zip(("gate", "up"), expert_rank_major_to_hf(value[expert])) + ] + if rest == "mlp.experts.down": + if value.shape != (512, 2048, 512) or value.dtype != torch.bfloat16: + raise ValueError("Gathered routed down shape is not the complete TP4 tensor") + return [ + (f"{prefix}.mlp.experts.{expert}.down_proj.weight", value[expert]) + for expert in range(512) + ] + if direct_moe(rest): + return [(f"{prefix}.{rest}", value)] + if name.endswith("self_attention.linear_attn.conv1d.weight"): + if mpu.get_tensor_model_parallel_world_size() != 4: + raise ValueError("The shared GDN weight exporter requires TP4") + value = conv_rank_major_to_hf(value) + if rest in ( + "self_attention.self_attn.k_proj.weight", + "self_attention.self_attn.v_proj.weight", + ): + value = kv_rank_major_to_hf(value) + return original_export(args, name, value) + + load._rl_kernel_tp4_gdn = True + load_api._LOADERS["qwen3_next"] = load + export_api.convert_qwen3_next_to_hf = export + + +def get_qwen3_next_shared_spec(args, config, vp_stage=None): + """Use the explicit provider for every decoder normalization and sublayer.""" + from vime_plugins.models.qwen3_next import Attention, get_qwen3_next_spec + + validate_training_topology(config, args) + if config.expert_tensor_parallel_size != 4: + raise ValueError("Shared model requires expert tensor parallel size 4") + if vp_stage is not None: + raise ValueError("The shared GDN profile does not use virtual pipeline stages") + spec = get_qwen3_next_spec(args, config, vp_stage) + replaced = 0 + for layer in spec.layer_specs: + if layer.submodules.self_attention.module is Attention: + layer.submodules.self_attention = ModuleSpec( + module=SharedVIMEGDN, params={"args": args} + ) + replaced += 1 + else: + layer.submodules.self_attention = ModuleSpec( + module=SharedVIMEFullAttention, params={"args": args} + ) + layer.submodules.input_layernorm = IdentityOp + layer.submodules.pre_mlp_layernorm = SharedDecoderNorm + layer.submodules.mlp = ModuleSpec(module=SharedVIMEMoE) + # The native TE sharded-state map refers to fused norm/projection names. + # Shared adapters retain explicit HF-compatible norm parameter names. + layer.submodules.sharded_state_dict_keys_map = {} + if replaced != 36: + raise ValueError(f"Pinned Qwen3-Next must contain 36 GDN layers, found {replaced}") + if len(spec.layer_specs) != 48: + raise ValueError("Pinned Qwen3-Next must contain all 48 decoder layers") + spec.layer_norm = SharedDecoderNorm + install_vime_gdn_weight_hooks() + return spec diff --git a/rl_engine/integrations/qwen3_next_vime_runtime.py b/rl_engine/integrations/qwen3_next_vime_runtime.py new file mode 100644 index 000000000..36df0bca7 --- /dev/null +++ b/rl_engine/integrations/qwen3_next_vime_runtime.py @@ -0,0 +1,178 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Construct the native VIME/Megatron actor for the fixed Qwen TP4 profile.""" + +import copy +import os +import sys +from pathlib import Path + +from rl_engine.testing.qwen3_next_rl_fixture import ( + OPTIMIZER_SETTINGS, + POLICY_SETTINGS, + require_policy_configuration, +) + + +def model_provider(pre_process=True, post_process=True, vp_stage=None): + """Native GPTModel construction, with providers installed before DDP/optimizer.""" + from megatron.training.global_vars import get_args + from vime.backends.megatron_utils.model_provider import get_model_provider_func + + from rl_engine.integrations.qwen3_next_vime import install_vime_model_providers + + args = copy.copy(get_args()) + args.custom_model_provider_path = None + factory = get_model_provider_func(args, "actor") + model = factory(pre_process=pre_process, post_process=post_process, vp_stage=vp_stage) + install_vime_model_providers(model) + return model + + +def runtime_argv(checkpoint, *, training): + """Use native argument parsing/validation; no precision-policy overrides.""" + checkpoint = str(Path(checkpoint).absolute()) + values = { + "hf-checkpoint": checkpoint, + "load": checkpoint, + "actor-num-nodes": 1, + "actor-num-gpus-per-node": 4, + "num-gpus-per-node": 4, + "tensor-model-parallel-size": 4, + "pipeline-model-parallel-size": 1, + "context-parallel-size": 1, + "expert-model-parallel-size": 1, + "expert-tensor-parallel-size": 4, + "num-attention-heads": 16, + "num-query-groups": 2, + "kv-channels": 256, + "num-layers": 48, + "hidden-size": 2048, + "ffn-hidden-size": 5120, + "normalization": "RMSNorm", + "position-embedding-type": "rope", + "norm-epsilon": 1e-6, + "rotary-percent": 0.25, + "rotary-base": 10000000, + "vocab-size": 151936, + "make-vocab-size-divisible-by": 1, + "padded-vocab-size": 151936, + "moe-ffn-hidden-size": 512, + "moe-shared-expert-intermediate-size": 512, + "moe-router-score-function": "softmax", + "moe-router-dtype": "fp32", + "moe-router-topk": 10, + "num-experts": 512, + "moe-layer-freq": "[" + ",".join(["1"] * 48) + "]", + "moe-aux-loss-coeff": 0, + "moe-token-dispatcher-type": "alltoall", + "hidden-dropout": 0, + "attention-dropout": 0, + "seq-length": 1040, + "max-position-embeddings": 262144, + "global-batch-size": 4, + "micro-batch-size": 1, + "data-pad-size-multiplier": 1, + "num-rollout": 3 if training else 0, + "rollout-batch-size": 4, + "n-samples-per-prompt": 1, + "rollout-num-gpus": 0, + "advantage-estimator": "grpo", + "eps-clip": 0.2, + "eps-clip-high": 0.2, + "kl-coef": 0, + "kl-loss-coef": 0, + "entropy-coef": 0, + "optimizer": "adam", + "lr": 1e-6, + "lr-decay-style": "constant", + "adam-beta1": 0.9, + "adam-beta2": 0.98, + "adam-eps": 1e-8, + "weight-decay": 0.1, + "clip-grad": 1.0, + "optimizer-offload-fraction": 1.0, + "custom-model-provider-path": ( + "rl_engine.integrations.qwen3_next_vime_runtime.model_provider" + ), + } + switches = [ + "debug-train-only", + "disable-bias-linear", + "qk-layernorm", + "group-query-attention", + "use-gated-attention", + "apply-layernorm-1p", + "swiglu", + "untie-embeddings-and-output-weights", + "attention-output-gate", + "moe-shared-expert-gate", + "moe-grouped-gemm", + "use-rollout-logprobs", + "disable-compute-advantages-and-returns", + "optimizer-cpu-offload", + "use-precision-aware-optimizer", + # Megatron's fused weight-gradient accumulation needs APEX's + # fused_weight_gradient_mlp_cuda, which the pinned environment does not + # ship; the unfused path accumulates the same GEMM result into main_grad. + "no-gradient-accumulation-fusion", + ] + argv = ["qwen3-next-native-actor"] + for name, value in values.items(): + argv.extend((f"--{name}", str(value))) + argv.extend(f"--{name}" for name in switches) + argv.extend(("--spec", "rl_engine.integrations.qwen3_next_vime", "get_qwen3_next_shared_spec")) + return argv + + +def create_actor(checkpoint, *, training): + """Call real native setup/load after the caller initializes Torch distributed.""" + import torch + import torch.distributed as dist + from vime.backends.megatron_utils.initialize import init + from vime.utils.arguments import parse_args + + if sys.prefix == sys.base_prefix: + raise RuntimeError("Native VIME actor must actually run inside the isolated venv") + if not dist.is_initialized() or dist.get_world_size() != 4 or torch.cuda.device_count() != 4: + raise ValueError("Native VIME actor requires four initialized ranks and visible GPUs") + saved_argv = sys.argv + try: + sys.argv = runtime_argv(checkpoint, training=training) + args = parse_args() + finally: + sys.argv = saved_argv + precision = {name: getattr(args, name, None) for name in ("optimization_dtype", "reduce_dtype")} + for name, value in {**POLICY_SETTINGS, **OPTIMIZER_SETTINGS}.items(): + setattr(args, name, value) + args.rank, args.local_rank = dist.get_rank(), int(os.environ["LOCAL_RANK"]) + args.world_size = 4 + args.num_rollout = 3 if training else 0 + args.sequence_parallel = False + args.fp32_residual_connection = False + args.overlap_grad_reduce = False + args.overlap_param_gather = False + args.recompute_granularity = None + args.use_critic = False + require_policy_configuration(args) + if any(getattr(args, name, None) != value for name, value in precision.items()): + raise ValueError("Optimizer/reduction precision changed during profile setup") + init(args) + # vime's actor bootstrap creates a gloo group next to the NCCL one; the HF weight + # exporter (HfWeightIteratorDirect) gathers its parameter metadata over it. + # This runtime bypasses that bootstrap, so create the group here on every rank. + from vime.utils.distributed_utils import init_gloo_group + + init_gloo_group() + if (args.vocab_size, args.padded_vocab_size) != (151936, 151936): + raise ValueError("Tokenizer initialization changed the official LM-head vocabulary") + from vime.backends.megatron_utils.checkpoint import load_checkpoint + from vime.backends.megatron_utils.model import setup_model_and_optimizer + + from rl_engine.integrations.qwen3_next_logprob import install_vime_logprob_provider + + model, optimizer, scheduler = setup_model_and_optimizer(args, role="actor") + load_checkpoint(model, optimizer, scheduler, checkpointing_context={}) + install_vime_logprob_provider() + return args, model, optimizer, scheduler diff --git a/rl_engine/integrations/qwen3_next_vllm.py b/rl_engine/integrations/qwen3_next_vllm.py new file mode 100644 index 000000000..e5b03afdb --- /dev/null +++ b/rl_engine/integrations/qwen3_next_vllm.py @@ -0,0 +1,205 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Actual vLLM GDN layer/cache adapter for the shared TP4 provider. + +The CUSTOM backend deliberately does not advertise batch invariance. Registering +this adapter cannot bypass vLLM's strict capability check. Real metadata/step +acceptance must pass before a separately reviewed capability registration. +""" + +import torch +from torch import nn +from vllm.distributed import get_tp_group +from vllm.forward_context import get_forward_context +from vllm.model_executor.layers.mamba.gdn.qwen_gdn_linear_attn import QwenGatedDeltaNetAttention +from vllm.model_executor.layers.mamba.mamba_utils import is_conv_state_dim_first +from vllm.v1.attention.backend import AttentionCGSupport +from vllm.v1.attention.backends.gdn_attn import ( + GDNAttentionBackend, + GDNAttentionMetadata, + GDNAttentionMetadataBuilder, +) +from vllm.v1.attention.backends.registry import MambaAttentionBackendEnum, register_backend + +from rl_engine.integrations.qwen3_next_provider import GDNProviderConfig, GDNState +from rl_engine.integrations.qwen3_next_tp import _ReduceFromTP +from rl_engine.integrations.qwen3_next_tp_gdn import TP4GDN + + +class SharedGDNMetadataBuilder(GDNAttentionMetadataBuilder): + """Use vLLM's scheduler ordering and record resets even for fresh one-token prompts.""" + + _cudagraph_support = AttentionCGSupport.NEVER + + def build(self, common_prefix_len, common_attn_metadata, **kwargs): + if common_prefix_len: + raise ValueError("Shared GDN does not enable prefix reuse") + metadata = super().build(common_prefix_len, common_attn_metadata, **kwargs) + if metadata.num_spec_decodes or metadata.spec_sequence_masks is not None: + raise ValueError("Shared GDN does not enable speculative decoding") + metadata.has_initial_state = common_attn_metadata.compute_num_computed_tokens() > 0 + return metadata + + +class SharedGDNBackend(GDNAttentionBackend): + @staticmethod + def get_name(): + return "RL_KERNEL_QWEN3_NEXT_GDN" + + @staticmethod + def get_builder_cls(): + return SharedGDNMetadataBuilder + + @staticmethod + def supports_batch_invariance(): + from rl_engine.integrations.qwen3_next_profile import profile_is_certified + + return profile_is_certified() + + +def metadata_sequences(metadata, tokens): + """Extract active packed sequences, excluding zero-token padding without touching null state.""" + if not isinstance(metadata, GDNAttentionMetadata): + raise ValueError("Shared GDN requires actual vLLM GDNAttentionMetadata") + if metadata.num_spec_decodes or metadata.spec_sequence_masks is not None: + raise ValueError("Speculative GDN metadata is outside the shared profile") + cu = metadata.non_spec_query_start_loc + indices = metadata.non_spec_state_indices_tensor + if cu is None or indices is None: + raise ValueError("GDN metadata lacks packed sequence boundaries or state slots") + cu = cu.to(device="cpu", dtype=torch.int64) + if cu.ndim != 1 or cu.numel() != indices.numel() + 1: + raise ValueError("GDN metadata boundaries and slot counts disagree") + lengths = cu.diff() + if cu[0] != 0 or cu[-1] != tokens or bool((lengths < 0).any()): + raise ValueError("GDN metadata boundaries must cover exactly the actual tokens") + active = torch.nonzero(lengths > 0, as_tuple=True)[0] + chosen = indices.index_select(0, active.to(indices.device)) + if bool((chosen <= 0).any()) or chosen.unique().numel() != chosen.numel(): + raise ValueError("Active GDN requests require distinct positive state slots") + compact_cu = torch.cat((torch.zeros(1, dtype=torch.int64), lengths[active].cumsum(0))) + has_initial = metadata.has_initial_state + if has_initial is None or has_initial.numel() != indices.numel(): + raise ValueError("Shared GDN metadata must declare initial state for every request") + reset = chosen[ + ~has_initial.to(device=indices.device, dtype=torch.bool)[active.to(indices.device)] + ] + return chosen, compact_cu, reset + + +def _register_backend(): + path = "rl_engine.integrations.qwen3_next_vllm.SharedGDNBackend" + try: + current = MambaAttentionBackendEnum.CUSTOM.get_path() + except ValueError: + current = None + if current is not None and current != path: + raise RuntimeError("A different custom Mamba backend is already registered") + register_backend(MambaAttentionBackendEnum.CUSTOM, path, is_mamba=True) + + +class SharedQwenGDN(QwenGatedDeltaNetAttention): + """Preserve real vLLM HF weight loaders and bind shared forward to its owned cache.""" + + def __init__(self, config, vllm_config, prefix="", **kwargs): + parallel = vllm_config.parallel_config + if parallel.tensor_parallel_size != 4 or parallel.pipeline_parallel_size != 1: + raise ValueError("Shared vLLM GDN requires TP4 and PP1") + if getattr(parallel, "decode_context_parallel_size", 1) != 1: + raise ValueError("Shared vLLM GDN requires CP1") + if getattr(parallel, "prefill_context_parallel_size", 1) != 1: + raise ValueError("Shared vLLM GDN requires prefill CP1") + if vllm_config.model_config.dtype != torch.bfloat16: + raise ValueError("Shared vLLM GDN requires BF16 weights") + if vllm_config.quant_config is not None or vllm_config.speculative_config is not None: + raise ValueError("Shared GDN requires unquantized weights and no speculation") + if vllm_config.cache_config.enable_prefix_caching: + raise ValueError("Shared GDN requires prefix reuse disabled") + if vllm_config.cache_config.mamba_cache_mode != "none": + raise ValueError("Shared GDN requires the non-reusing mamba cache mode") + if kwargs.get("reduce_results", True) is not True: + raise ValueError("Shared GDN performs its own TP output reduction") + if not vllm_config.model_config.enforce_eager: + raise ValueError("Shared GDN currently requires eager execution") + if not kwargs.get("gqa_interleaved_layout", False) or config.hidden_size != 2048: + raise ValueError("Shared GDN requires Qwen3-Next interleaved TP4 projections") + _register_backend() + super().__init__(config, vllm_config, prefix, **kwargs) + if self.get_state_dtype() != (torch.bfloat16, torch.float32): + raise ValueError("Shared GDN requires BF16 convolution and FP32 recurrent state") + # HF stores A_log and dt_bias in BF16; upstream widens A_log at allocation. + # Keep the checkpoint weight identity, widening only at the recurrence call. + for name in ("A_log", "dt_bias"): + original = getattr(self, name) + parameter = nn.Parameter(original.to(dtype=torch.bfloat16), requires_grad=False) + parameter.weight_loader = original.weight_loader + setattr(self, name, parameter) + self.group = get_tp_group().device_group + self.provider_config = GDNProviderConfig() + self.eps = config.rms_norm_eps + + @property + def mamba_type(self): + return MambaAttentionBackendEnum.CUSTOM + + @torch.no_grad() + def forward(self, hidden_states): + """Match the installed vLLM layer contract: one input, one returned tensor.""" + output = torch.empty_like(hidden_states) + self._forward_into(hidden_states, output) + return output + + @torch.no_grad() + def _forward_into(self, hidden_states, output): + context = get_forward_context() + metadata = context.attn_metadata + metadata = metadata.get(self.prefix) if isinstance(metadata, dict) else None + if metadata is None: + # vLLM's pre-cache memory profiling has no request or persistent state. + from rl_engine.integrations.qwen3_next_forward import shared_linear + + qkvz = shared_linear(hidden_states, self.in_proj_qkvz.weight) + ba = shared_linear(hidden_states, self.in_proj_ba.weight) + zeros = qkvz.new_zeros((ba.shape[0], 1024)) + projected = shared_linear(zeros, self.out_proj.weight) + output.copy_(_ReduceFromTP.apply(projected, self.group)) + del qkvz, ba + return + tokens = metadata.num_actual_tokens + if tokens > hidden_states.shape[0] or output.shape != hidden_states.shape: + raise ValueError("vLLM GDN buffers do not cover the actual tokens") + indices, cu, reset = metadata_sequences(metadata, tokens) + output.zero_() + if not tokens: + return + conv = self.kv_cache[0] + if not is_conv_state_dim_first(): + conv = conv.transpose(-1, -2) + recurrent = self.kv_cache[1] + if reset.numel(): + state = GDNState(conv.clone(), recurrent.clone()) + state.convolution.index_fill_(0, reset.long(), 0) + state.recurrent.index_fill_(0, reset.long(), 0) + else: + state = GDNState(conv, recurrent) + value, next_state = TP4GDN.forward(self, hidden_states[:tokens], state, indices, cu) + trace_state_hook = getattr(self, "trace_state_hook", None) + if trace_state_hook is not None: + trace_state_hook(next_state, indices, cu) + output[:tokens].copy_(value) + conv.copy_(next_state.convolution) + recurrent.copy_(next_state.recurrent) + + +def register_shared_gdn_adapter(): + """Opt in to the actual GDN layer adapter, without claiming strict capability.""" + from vllm.model_executor.custom_op import op_registry_oot + + _register_backend() + existing = op_registry_oot.get("QwenGatedDeltaNetAttention") + if existing is SharedQwenGDN: + return + if existing is not None: + raise RuntimeError("A different out-of-tree Qwen GDN layer is already registered") + QwenGatedDeltaNetAttention.register_oot(SharedQwenGDN) diff --git a/rl_engine/integrations/qwen3_next_vllm_attention.py b/rl_engine/integrations/qwen3_next_vllm_attention.py new file mode 100644 index 000000000..b6d872b42 --- /dev/null +++ b/rl_engine/integrations/qwen3_next_vllm_attention.py @@ -0,0 +1,238 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Eager vLLM paged-KV adapter for the shared D=256 causal attention core. + +The scheduler owns physical blocks and slot mappings. This backend neither +reconstructs request IDs nor retains a separate Python KV cache. Capability +registration remains conservative until the real scheduler matrix passes. +""" + +from dataclasses import dataclass + +import torch +from vllm.v1.attention.backend import ( + AttentionBackend, + AttentionImpl, + AttentionMetadata, + AttentionMetadataBuilder, + AttentionType, +) + +from rl_engine.integrations.qwen3_next_forward import shared_attention + + +@dataclass +class SharedAttentionMetadata(AttentionMetadata): + query_start_loc: tuple[int, ...] + seq_lens: tuple[int, ...] + block_table: torch.Tensor + slot_mapping: torch.Tensor + num_actual_tokens: int + + +def validate_boundaries(starts, lengths, num_actual_tokens): + if len(starts) != len(lengths) + 1 or not starts or starts[0] != 0: + raise ValueError("Attention boundaries must start at zero and cover every request") + if starts[-1] != num_actual_tokens or num_actual_tokens < 0: + raise ValueError("Attention boundaries must exactly cover actual scheduled tokens") + for start, end, length in zip(starts[:-1], starts[1:], lengths, strict=True): + if end < start or length < end - start or length > 1040: + raise ValueError("Invalid Qwen eager query/prefix length") + + +class SharedAttentionBuilder(AttentionMetadataBuilder[SharedAttentionMetadata]): + def __init__(self, kv_cache_spec, layer_names, vllm_config, device): + super().__init__(kv_cache_spec, layer_names, vllm_config, device) + parallel = vllm_config.parallel_config + topology = ( + parallel.tensor_parallel_size, + parallel.pipeline_parallel_size, + parallel.decode_context_parallel_size, + parallel.prefill_context_parallel_size, + ) + if topology != (4, 1, 1, 1): + raise ValueError("Shared Qwen attention requires TP4/PP1/CP1") + if not vllm_config.model_config.enforce_eager or vllm_config.speculative_config is not None: + raise ValueError("Shared Qwen attention requires eager execution without speculation") + if vllm_config.cache_config.enable_prefix_caching: + raise ValueError("Prefix reuse is outside the fixed Qwen eager profile") + + def build(self, common_prefix_len, common_attn_metadata, fast_build=False): + if common_prefix_len != 0: + raise ValueError("Shared-prefix attention is outside the validated profile") + common = common_attn_metadata + if isinstance(common.causal, torch.Tensor): + causal = bool(common.causal.all()) + else: + causal = common.causal is True + if not causal: + raise ValueError("Only causal Qwen attention is supported") + # Use exact device lengths, not optimistic CPU bounds from spec decode. + starts = tuple(common.query_start_loc[: common.num_reqs + 1].cpu().tolist()) + lengths = tuple(common.seq_lens[: common.num_reqs].cpu().tolist()) + validate_boundaries(starts, lengths, common.num_actual_tokens) + return SharedAttentionMetadata( + starts, + lengths, + common.block_table_tensor[: common.num_reqs], + common.slot_mapping[: common.num_actual_tokens], + common.num_actual_tokens, + ) + + +class SharedAttentionImpl(AttentionImpl[SharedAttentionMetadata]): + def __init__( + self, + num_heads, + head_size, + scale, + num_kv_heads=None, + alibi_slopes=None, + sliding_window=None, + kv_cache_dtype="auto", + logits_soft_cap=None, + attn_type=AttentionType.DECODER, + kv_sharing_target_layer_name=None, + **kwargs, + ): + if (num_heads, head_size, num_kv_heads, scale) != (4, 256, 1, 1 / 16): + raise ValueError("Shared Qwen attention requires four Q heads and one D256 KV head") + unsupported = ( + alibi_slopes is not None, + sliding_window is not None, + logits_soft_cap not in (None, 0), + attn_type != AttentionType.DECODER, + kv_sharing_target_layer_name is not None, + kv_cache_dtype not in ("auto", "bfloat16"), + ) + if any(unsupported) or kwargs: + raise ValueError("Unsupported extension to the fixed Qwen attention profile") + self.num_heads, self.head_size, self.num_kv_heads = 4, 256, 1 + self.scale, self.kv_cache_dtype = scale, kv_cache_dtype + + def forward( + self, + layer, + query, + key, + value, + kv_cache, + attn_metadata, + output, + output_scale=None, + output_block_scale=None, + ): + if output_scale is not None or output_block_scale is not None: + raise ValueError("Quantized output is outside the BF16 eager profile") + if attn_metadata is None: + # vLLM allocation profiling has no requests or valid cache to read. + return output.zero_() + metadata = attn_metadata + n = metadata.num_actual_tokens + validate_boundaries(metadata.query_start_loc, metadata.seq_lens, n) + if any( + t.dtype != torch.bfloat16 or t.device != query.device + for t in (query, key, value, kv_cache, output) + ): + raise ValueError("Q/K/V/cache/output must be BF16 on the same CUDA device") + if query.device.type != "cuda": + raise ValueError("Shared Qwen attention executes on CUDA") + if query.shape[1:] != (4, 256) or key.shape[1:] != (1, 256) or value.shape != key.shape: + raise ValueError("Invalid projected Q/K/V shape") + # vLLM 0.30 materializes logical cache [blocks, KV heads, tokens, K+V]. + if kv_cache.ndim != 4 or kv_cache.shape[1] != 1 or kv_cache.shape[-1] != 512: + raise ValueError("Unexpected vLLM cache layout; no layout guessing is permitted") + if min(query.shape[0], key.shape[0], output.shape[0]) < n: + raise ValueError("Projected tensors do not cover every scheduled token") + slots = metadata.slot_mapping.to(device=query.device, dtype=torch.long) + if slots.shape != (n,) or slots.unique().numel() != n: + raise ValueError("Active KV write slots must be unique and match scheduled tokens") + block_size = kv_cache.shape[2] + if bool(((slots < 0) | (slots >= kv_cache.shape[0] * block_size)).any()): + raise ValueError("Active KV write slot is null or outside the allocated cache") + plans = [] + for row, (start, end, length) in enumerate( + zip( + metadata.query_start_loc[:-1], + metadata.query_start_loc[1:], + metadata.seq_lens, + strict=True, + ) + ): + if start == end: + continue + needed = (length + block_size - 1) // block_size + physical = metadata.block_table[row, :needed].to(device=query.device, dtype=torch.long) + if physical.numel() != needed or physical.unique().numel() != needed: + raise ValueError("Request KV blocks are incomplete or repeated") + if bool(((physical < 0) | (physical >= kv_cache.shape[0])).any()): + raise ValueError("Request KV block is outside the allocated cache") + logical = torch.arange(length, device=query.device) + physical_slots = physical[logical // block_size] * block_size + logical % block_size + if not torch.equal(physical_slots[-(end - start) :], slots[start:end]): + raise ValueError("Block table and write slots disagree about absolute positions") + plans.append((start, end, length, physical)) + if any(not torch.isfinite(tensor[:n]).all() for tensor in (query, key, value)): + raise ValueError("Projected attention inputs must be finite") + # Validate every request before mutating any scheduler-owned cache slot. + blocks, offsets = slots // block_size, slots % block_size + kv_cache[blocks, 0, offsets, :256] = key[:n, 0] + kv_cache[blocks, 0, offsets, 256:] = value[:n, 0] + output.zero_() + for start, end, length, physical in plans: + cached = kv_cache[physical, 0].reshape(-1, 512)[:length] + if not torch.isfinite(cached).all(): + raise ValueError("Request KV prefix contains nonfinite values") + k = cached[:, :256].reshape(1, 1, length, 256).contiguous() + v = cached[:, 256:].reshape(1, 1, length, 256).contiguous() + q = query[start:end].transpose(0, 1).unsqueeze(0).contiguous() + attended = shared_attention(q, k, v) + output[start:end].copy_(attended.squeeze(0).transpose(0, 1)) + return output + + +class SharedAttentionBackend(AttentionBackend): + supported_dtypes = [torch.bfloat16] + supported_kv_cache_dtypes = ["auto", "bfloat16"] + forward_includes_kv_cache_update = True + + @staticmethod + def get_name(): + # Attention.__init__ indexes AttentionBackendEnum with this value. + return "CUSTOM" + + @staticmethod + def get_impl_cls(): + return SharedAttentionImpl + + @staticmethod + def get_builder_cls(): + return SharedAttentionBuilder + + @classmethod + def get_supported_head_sizes(cls): + return [256] + + @classmethod + def supports_kv_connector(cls): + return False + + @classmethod + def supports_device_cpu_query_lens_mismatch(cls): + return False + + @classmethod + def supports_batch_invariance(cls): + from rl_engine.integrations.qwen3_next_profile import profile_is_certified + + return profile_is_certified() + + +def register_shared_attention_backend(): + from vllm.v1.attention.backends.registry import AttentionBackendEnum, register_backend + + register_backend( + AttentionBackendEnum.CUSTOM, + "rl_engine.integrations.qwen3_next_vllm_attention.SharedAttentionBackend", + ) diff --git a/rl_engine/integrations/qwen3_next_vllm_model.py b/rl_engine/integrations/qwen3_next_vllm_model.py new file mode 100644 index 000000000..445c6ca5f --- /dev/null +++ b/rl_engine/integrations/qwen3_next_vllm_model.py @@ -0,0 +1,365 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Opt-in vLLM model using shared Qwen3-Next arithmetic and native weight loaders. + +Construction preserves every native Parameter and loader. The existing modules +are bound to subclasses before weights load; no second copy of the 80B model is +allocated. Only the selected eager profile is supported. Registering it does not +declare scheduler batch invariance or completion of full-model L2 acceptance. +""" + +from importlib.metadata import version + +import torch +import torch.nn.functional as F +from vllm.distributed import get_tp_group +from vllm.model_executor.layers.fused_moe.unquantized_fused_moe_method import ( + UnquantizedFusedMoEMethod, +) +from vllm.model_executor.models.qwen3_next import ( + Qwen3NextAttention, + Qwen3NextDecoderLayer, + Qwen3NextForCausalLM, + Qwen3NextModel, + Qwen3NextSparseMoeBlock, +) +from vllm.v1.attention.backends.registry import AttentionBackendEnum + +from rl_engine.distributed.collectives import collective_for_group +from rl_engine.integrations.qwen3_next_forward import ( + FORWARD_PROVIDER_ID, + shared_linear, + shared_logprob, + shared_moe, +) +from rl_engine.integrations.qwen3_next_logprob import qwen_logprob_contract +from rl_engine.integrations.qwen3_next_tp import _ReduceFromTP +from rl_engine.integrations.qwen3_next_tp_blocks import TP4FullAttention +from rl_engine.kernels.logprob_contract import LogprobRole + +ARCHITECTURE = "RLKernelQwen3NextForCausalLM" + + +def profile_capabilities(): + return { + "provider": FORWARD_PROVIDER_ID, + "architecture": ARCHITECTURE, + "layers": 48, + "tensor_parallel_size": 4, + "scheduler_batch_invariance_verified": False, + "full_model_l2_verified": False, + } + + +def validate_profile(vllm_config): + if version("vllm") != "0.30.0": + raise ValueError("Shared model requires pinned vLLM 0.30.0") + model, parallel = vllm_config.model_config, vllm_config.parallel_config + config = model.hf_text_config + required = { + "hidden_size": 2048, + "num_hidden_layers": 48, + "num_attention_heads": 16, + "num_key_value_heads": 2, + "head_dim": 256, + "vocab_size": 151936, + "num_experts": 512, + "num_experts_per_tok": 10, + "moe_intermediate_size": 512, + "shared_expert_intermediate_size": 512, + "rms_norm_eps": 1e-6, + "max_position_embeddings": 262144, + } + for name, expected in required.items(): + if getattr(config, name, None) != expected: + raise ValueError(f"Shared model requires official {name}={expected}") + expected_types = [ + "full_attention" if index % 4 == 3 else "linear_attention" for index in range(48) + ] + if list(config.layer_types) != expected_types: + raise ValueError("Shared model requires the official 36 GDN / 12 full-attention layers") + rope = config.rope_parameters + if ( + rope.get("rope_theta") != 10000000 + or rope.get("partial_rotary_factor") != 0.25 + or rope.get("rope_type", "default") != "default" + ): + raise ValueError("Shared model requires default theta=1e7 and rotary dimension 64") + topology = tuple( + getattr(parallel, name, 1) + for name in ( + "tensor_parallel_size", + "pipeline_parallel_size", + "data_parallel_size", + "decode_context_parallel_size", + "prefill_context_parallel_size", + ) + ) + if topology != (4, 1, 1, 1, 1): + raise ValueError("Shared model requires TP4/PP1/DP1/CP1") + unsupported = ( + model.dtype != torch.bfloat16, + not model.enforce_eager, + vllm_config.quant_config is not None, + vllm_config.speculative_config is not None, + vllm_config.lora_config is not None, + vllm_config.cache_config.enable_prefix_caching, + parallel.enable_expert_parallel, + parallel.enable_eplb, + parallel.use_sequence_parallel_moe, + parallel.enable_dbo, + getattr(config, "attention_dropout", 0) != 0, + getattr(config, "mlp_only_layers", []), + getattr(config, "decoder_sparse_step", 1) != 1, + getattr(config, "layer_scale", False), + not getattr(config, "norm_topk_prob", True), + getattr(config, "hidden_act", "silu") != "silu", + getattr(config, "qkv_bias", False), + not getattr(config, "attn_output_gate", True), + not getattr(config, "is_causal", True), + getattr(config, "tie_word_embeddings", False), + ) + if any(unsupported): + raise ValueError("Unsupported extension to the fixed BF16 eager shared model profile") + # This selects the native plain-weight allocation, not the execution path. + # The shared MoE below owns all forward arithmetic and prevents repacking. + if vllm_config.kernel_config.moe_backend != "triton": + raise ValueError("Set kernel_config.moe_backend='triton' for plain native BF16 allocation") + if vllm_config.attention_config.backend != AttentionBackendEnum.CUSTOM: + raise ValueError("Set attention_config.backend='CUSTOM' for the shared paged-KV backend") + + +def _rms(value, module): + from rl_engine.kernels.ops.cuda.norm.rmsnorm import Qwen3NextRMSNormCudaOp + + return Qwen3NextRMSNormCudaOp()(value, module.weight, eps=1e-6) + + +def _require_weight(value, shape, name): + if value.dtype != torch.bfloat16 or value.shape != shape or not value.is_contiguous(): + raise ValueError(f"{name} must remain contiguous BF16 {shape}") + + +class SharedPlainBF16MoEMethod(UnquantizedFusedMoEMethod): + """Retain HF-loaded plain tensors; the shared model never calls native MoE.""" + + def process_weights_after_loading(self, layer): + _require_weight(layer.w13_weight, (512, 256, 2048), "routed gate/up") + _require_weight(layer.w2_weight, (512, 2048, 128), "routed down") + self.moe_quant_config = self.get_fused_moe_quant_config(layer) + + def apply(self, *args, **kwargs): + raise RuntimeError("Use SharedVLLMMoE; native MoE arithmetic is outside this provider") + + def apply_monolithic(self, *args, **kwargs): + raise RuntimeError("Use SharedVLLMMoE; native MoE arithmetic is outside this provider") + + +class SharedVLLMAttention(Qwen3NextAttention): + def forward(self, positions, hidden_states): + if positions.ndim != 1 or positions.shape[0] != hidden_states.shape[0]: + raise ValueError("Shared text attention requires one absolute position per token") + if bool(((positions < 0) | (positions >= 262144)).any()): + raise ValueError("Attention positions exceed the official RoPE range") + # Keep the three GEMM invocations identical to the training TP4 module; + # native qkv_proj owns one packed allocation and all three HF loaders. + q_weight, k_weight, v_weight = self.qkv_proj.weight.split((2048, 256, 256)) + query, gate = shared_linear(hidden_states, q_weight).reshape(-1, 4, 512).chunk(2, -1) + key = shared_linear(hidden_states, k_weight).reshape(-1, 1, 256) + value = shared_linear(hidden_states, v_weight) + query, key = _rms(query, self.q_norm), _rms(key, self.k_norm) + query = TP4FullAttention._rotate(self, query, positions).reshape(-1, 1024) + key = TP4FullAttention._rotate(self, key, positions).reshape(-1, 256) + attended = self.attn(query, key, value).reshape(-1, 4, 256) * gate.sigmoid() + local = shared_linear(attended.reshape(-1, 1024), self.o_proj.weight) + return _ReduceFromTP.apply(local, self.shared_tp_group) + + +class SharedVLLMMoE(Qwen3NextSparseMoeBlock): + subnode_hook = None + + def forward(self, hidden_states, already_sequence_parallel=False): + if already_sequence_parallel: + raise ValueError("Shared MoE does not enable sequence parallelism") + routed = self.experts.routed_experts + output, routes = shared_moe( + hidden_states, self.gate.weight, routed.w13_weight, routed.w2_weight + ) + if self.subnode_hook is not None: + self.subnode_hook("router", routes.indices) + gate_weight, up_weight = self.shared_expert.gate_up_proj.weight.chunk(2, dim=0) + gate = shared_linear(hidden_states, gate_weight) + up = shared_linear(hidden_states, up_weight) + activated = (F.silu(gate.float()) * up.float()).to(torch.bfloat16) + shared = shared_linear(activated, self.shared_expert.down_proj.weight) + shared_gate = shared_linear(hidden_states, self.shared_expert_gate.weight).sigmoid() + return _ReduceFromTP.apply(output + shared * shared_gate, self.shared_tp_group) + + +class SharedVLLMDecoderLayer(Qwen3NextDecoderLayer): + # Set by a trace owner to observe the sub-node outputs named in + # qwen3_next_subnode.SUBNODES; observing never changes a value. + subnode_hook = None + + def forward(self, hidden_states, residual, positions, **kwargs): + trace = self.subnode_hook + residual = hidden_states if residual is None else hidden_states + residual + hidden_states = _rms(residual, self.input_layernorm) + if trace is not None: + trace("input_layernorm", hidden_states) + if self.layer_type == "linear_attention": + hidden_states = self.linear_attn(hidden_states=hidden_states) + else: + hidden_states = self.self_attn(positions, hidden_states) + if trace is not None: + trace("mixer", hidden_states) + residual = residual + hidden_states + hidden_states = _rms(residual, self.post_attention_layernorm) + if trace is not None: + trace("post_attention_layernorm", hidden_states) + hidden_states = self.mlp(hidden_states) + if trace is not None: + trace("mlp", hidden_states) + return hidden_states, residual + + +class SharedVLLMModel(Qwen3NextModel): + subnode_hook = None + + def embed_input_ids(self, input_ids): + from rl_engine.integrations.qwen3_next_embedding import shared_embedding + + if input_ids.ndim != 1 or input_ids.dtype not in (torch.int32, torch.int64): + raise ValueError("Shared embedding requires a packed integer token vector") + return shared_embedding(input_ids.long(), self.embed_tokens.weight, self.shared_tp_group) + + def forward(self, input_ids, positions, intermediate_tensors=None, inputs_embeds=None): + if intermediate_tensors is not None or inputs_embeds is not None: + raise ValueError("Shared text-only PP1 profile takes token IDs directly") + if self.shared_forward_hook is not None: + self.shared_forward_hook(input_ids, positions) + hidden_states = self.embed_input_ids(input_ids) + if self.subnode_hook is not None: + self.subnode_hook("embedding", hidden_states) + residual = None + for index, layer in enumerate(self.layers): + hidden_states, residual = layer(hidden_states, residual, positions) + if self.shared_trace_hook is not None: + self.shared_trace_hook(index, hidden_states + residual, layer) + return _rms(hidden_states + residual, self.norm) + + +def _bind_native_model(model, group): + """Attach shared behavior without replacing parameters or their HF loaders.""" + from rl_engine.integrations.qwen3_next_vllm import SharedQwenGDN + from rl_engine.integrations.qwen3_next_vllm_attention import SharedAttentionBackend + + if len(model.layers) != 48 or (model.start_layer, model.end_layer) != (0, 48): + raise ValueError("The native model must own all 48 layers under PP1") + _require_weight(model.embed_tokens.weight, (37984, 2048), "embedding") + _require_weight(model.norm.weight, (2048,), "final norm") + for layer in model.layers: + layer.__class__ = SharedVLLMDecoderLayer + if layer.layer_type == "linear_attention": + if not isinstance(layer.linear_attn, SharedQwenGDN): + raise ValueError("Native GDN was not constructed with the shared cache adapter") + else: + attention = layer.self_attn + if attention.attn.attn_backend is not SharedAttentionBackend: + raise ValueError("Full attention must use the explicit shared paged-KV backend") + _require_weight(attention.qkv_proj.weight, (2560, 2048), "attention QKV/gate") + _require_weight(attention.o_proj.weight, (2048, 1024), "attention output") + attention.__class__ = SharedVLLMAttention + attention.shared_tp_group = group + # TP4FullAttention._rotate derives FP32 inverse frequencies from this + # float on every call, so both engines rotate with identical tables. + attention.rope_theta = 10000000.0 + moe = layer.mlp + if ( + not isinstance(moe, Qwen3NextSparseMoeBlock) + or moe.shared_expert is None + or moe.is_fused_shared_expert_enabled + or moe.replicate_shared_expert + ): + raise ValueError( + "Every layer requires all512 unfused TP experts plus a sharded shared expert" + ) + routed = moe.experts.routed_experts + if type(routed.quant_method) is not UnquantizedFusedMoEMethod: + raise ValueError("Shared MoE requires native unquantized BF16 parameter loaders") + _require_weight(routed.w13_weight, (512, 256, 2048), "routed gate/up") + _require_weight(routed.w2_weight, (512, 2048, 128), "routed down") + _require_weight(moe.shared_expert.gate_up_proj.weight, (256, 2048), "shared gate/up") + _require_weight(moe.shared_expert.down_proj.weight, (2048, 128), "shared down") + routed.quant_method.__class__ = SharedPlainBF16MoEMethod + moe.__class__ = SharedVLLMMoE + moe.shared_tp_group = group + model.__class__ = SharedVLLMModel + model.shared_tp_group, model.shared_trace_hook = group, None + model.shared_forward_hook = None + + +class RLKernelQwen3NextForCausalLM(Qwen3NextForCausalLM): + def __init__(self, *, vllm_config, prefix=""): + validate_profile(vllm_config) + from rl_engine.integrations.qwen3_next_vllm import register_shared_gdn_adapter + from rl_engine.integrations.qwen3_next_vllm_attention import ( + register_shared_attention_backend, + ) + + register_shared_gdn_adapter() + register_shared_attention_backend() + super().__init__(vllm_config=vllm_config, prefix=prefix) + self.shared_tp_group = get_tp_group().device_group + _bind_native_model(self.model, self.shared_tp_group) + _require_weight(self.lm_head.weight, (37984, 2048), "LM head") + self.shared_logits_hook = None + + def forward( + self, input_ids, positions, intermediate_tensors=None, inputs_embeds=None, **kwargs + ): + # Call the explicit eager method instead of the native compile wrapper. + return self.model.forward(input_ids, positions, intermediate_tensors, inputs_embeds) + + def compute_local_logits(self, hidden_states): + return shared_linear(hidden_states, self.lm_head.weight) + + def compute_logits(self, hidden_states): + local = self.compute_local_logits(hidden_states) + if not torch.isfinite(local).all(): + raise ValueError("Shared model produced non-finite logits") + source = local.t().contiguous() + collective = collective_for_group( + self.shared_tp_group, min_size_bytes=source.numel() * source.element_size() + ) + logits = collective.all_gather(source).t().contiguous() + if self.shared_logits_hook is not None: + self.shared_logits_hook(hidden_states, local, logits) + return logits + + def compute_selected_logprobs(self, hidden_states, targets): + """The L2/fixture path; native sampler logprobs are not provider evidence.""" + local = self.compute_local_logits(hidden_states) + contract = qwen_logprob_contract( + local, + rank=get_tp_group().rank_in_group, + world_size=4, + role=LogprobRole.INFER, + ) + return shared_logprob(local, targets, contract=contract, tp_group=self.shared_tp_group)[0] + + +def register_shared_model(): + """Call in every vLLM process before constructing the explicit architecture.""" + from vllm.model_executor.models import ModelRegistry + + path = "rl_engine.integrations.qwen3_next_vllm_model:RLKernelQwen3NextForCausalLM" + if ARCHITECTURE in ModelRegistry.get_supported_archs(): + if ModelRegistry.models[ARCHITECTURE].load_model_cls() is not RLKernelQwen3NextForCausalLM: + raise ValueError( + "A different model is already registered under the shared architecture" + ) + else: + ModelRegistry.register_model(ARCHITECTURE, path) + return ARCHITECTURE diff --git a/rl_engine/integrations/qwen3_next_vllm_worker.py b/rl_engine/integrations/qwen3_next_vllm_worker.py new file mode 100644 index 000000000..9b854daec --- /dev/null +++ b/rl_engine/integrations/qwen3_next_vllm_worker.py @@ -0,0 +1,51 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""vLLM spawned-worker registration for the explicit shared Qwen architecture.""" + +from vllm.v1.worker.gpu_worker import Worker + +from rl_engine.integrations.qwen3_next_binary import imported_provider_identity +from rl_engine.integrations.qwen3_next_vllm_model import register_shared_model + + +class SharedQwenWorker(Worker): + """Select through LLM(worker_cls=...) so spawn never relies on parent globals.""" + + def __init__(self, *args, **kwargs): + config = kwargs.get("vllm_config", args[0] if args else None) + identity = ( + config.additional_config.get("qwen3_next_shared_identity") + if config is not None + else None + ) + mode = None + if identity is not None: + from rl_engine.integrations.qwen3_next_profile import activate_for_identity + + mode = activate_for_identity(identity) + register_shared_model() + self.shared_provider_binary = imported_provider_identity() + super().__init__(*args, **kwargs) + self.shared_l2_trace = None + self.shared_provider_execution_mode = mode + + def configure_l2_trace(self, request, output_directory): + from rl_engine.integrations.qwen3_next_native_rollout import RolloutTrace + + if self.shared_l2_trace is not None: + raise RuntimeError("The previous rollout trace has not been collected") + self.shared_l2_trace = RolloutTrace(self, request, output_directory) + return {"rank": self.rank, "request_sha256": request["request_sha256"]} + + def collect_l2_trace(self): + if self.shared_l2_trace is None: + raise RuntimeError("No active rollout trace") + result = self.shared_l2_trace.finish() + self.shared_l2_trace = None + return result + + def execute_model(self, scheduler_output): + if self.shared_l2_trace is not None: + self.shared_l2_trace.before_execute(scheduler_output) + return super().execute_model(scheduler_output) diff --git a/rl_engine/kernels/gtest/qwen3_next_chain_report.py b/rl_engine/kernels/gtest/qwen3_next_chain_report.py new file mode 100644 index 000000000..3326dd0af --- /dev/null +++ b/rl_engine/kernels/gtest/qwen3_next_chain_report.py @@ -0,0 +1,268 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Qwen3-Next full-model chain as a WS1 chain-gate report. + +The Qwen3-Next chain runs as stages (``scripts/qwen3_next_run.py``): L2 on the +pinned weights, then L2 again after each of two optimizer updates and after a +reload. Each L2 stage writes a 16-case raw-bit matrix comparing rollout +(native vLLM prefill + decode) with replay (VIME recompute). This module turns +those matrices into the same report shape as the Qwen3-8B chain gate +(:class:`rl_engine.kernels.gtest.chain_gate.ChainGateReport`), built from the +same dataclasses, so the two models' reports can be read side by side. + +Every case of every weight version becomes one cell. Bitwise rollout/replay +equality of logits and selected logprobs becomes one +:class:`TensorComparisonDetail` each, with ``atol = rtol = 0``. The first +divergence names a decoder layer and a sub-node (see +``rl_engine.integrations.qwen3_next_subnode``), which this report also maps to +a layer family. +""" + +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any + +import torch + +from rl_engine.kernels.gtest.chain_gate import CellOutput, ChainGateReport +from rl_engine.kernels.gtest.forward_invariance import TensorComparisonDetail +from rl_engine.kernels.gtest.tolerance import ( + BackendProvenance, + compute_logprob_aggregates, + default_clip_interval, + judge_logprob_aggregates, + resolve_comparison_roles, +) + +SCHEMA_VERSION = "qwen3-next-chain-v1" +COMPATIBLE_SCHEMA = "ws1-c10-c11-v5" +PROFILE = "qwen3_next_tp4_shared_eager_v1" +WEIGHT_VERSIONS = ("baseline", "update1", "update2", "reload") +FAMILIES = ("embedding", "norm", "gdn", "full_attention", "moe", "lm_head_logprob") +_TRAIN_INFER_KIND = "train_infer_logprob_parity" +DISCLAIMER = ( + "Qwen3-Next-80B-A3B-Instruct, TP4 x EP1, BF16, strict shared providers. Cells are the " + "16-case raw-bit L2 matrix (prompt 8/64/256/1024 x batch 1/4 x full/chunked prefill, 16 " + "response tokens) at each weight version; rollout is native vLLM prefill and decode, " + "replay is VIME recompute. Gradients are judged by the training stages (two updates, " + "reload and resumption), not by C11 gradient rows, so gradient fields are empty here." +) + + +def family_of(layer: int | None, node: str | None) -> str | None: + """Map a first divergence to the layer family that produced it.""" + if node is None: + return None + if node == "embedding": + return "embedding" + if node in ("logits", "logprobs", "response_tokens", "lm_head_logprob"): + return "lm_head_logprob" + if layer is None or layer not in range(48): + raise ValueError(f"Divergence node {node!r} needs a decoder layer, got {layer!r}") + if node in ("input_layernorm", "post_attention_layernorm"): + return "norm" + if node in ("router", "mlp"): + return "moe" + if node in ("mixer", "output", "state"): + return "full_attention" if (layer + 1) % 4 == 0 else "gdn" + raise ValueError(f"Unknown divergence node {node!r}") + + +def first_drift_of(record: Mapping[str, Any]) -> tuple[str | None, int | None, str | None]: + """``(dense first_drift, layer, family)`` of one L2 case record.""" + if record["passed"]: + return None, None, None + divergence = record.get("first_divergent_node") + if divergence is not None: + layer, node = divergence["layer"], divergence["node"] + label = "embedding" if node == "embedding" else f"layer{layer}.{node}" + else: + layer = None + difference = record.get("first_difference") or {} + node = difference.get("tensor", "lm_head_logprob") + label = node + return f"{label}:rollout->recompute", layer, family_of(layer, node) + + +def _detail(name, cell_id, rollout, recompute, roles) -> TensorComparisonDetail: + lhs, rhs = rollout.double(), recompute.double() + error = (lhs - rhs).abs() + return TensorComparisonDetail( + tensor_name=name, + config_pair=(f"{cell_id}/rollout", f"{cell_id}/recompute"), + shape=tuple(rollout.shape), + dtype=str(rollout.dtype).replace("torch.", ""), + max_abs_error=float(error.max()), + mean_abs_error=float(error.mean()), + max_rel_error=float((error / rhs.abs().clamp_min(1e-12)).max()), + atol=0.0, + rtol=0.0, + passed=bool(torch.equal(rollout, recompute)), + judgment="forward_invariance", + comparison_lhs_role=roles.comparison_lhs_role, + comparison_rhs_role=roles.comparison_rhs_role, + ) + + +def build_report( + matrices: Mapping[str, Mapping[str, Any]], + artifacts: Mapping[str, Mapping[str, Mapping[str, Any]]], + *, + contract: Mapping[str, Any], + measured_commit: str, + weight_source: str, + weight_hash: str, + device: str, + gpu_name: str | None, + compute_capability: str | None, +) -> dict[str, Any]: + """Build the chain report from L2 matrices and their loaded case artifacts. + + ``matrices[version]`` is an ``l2-matrix.json`` report; ``artifacts[version] + [case_id][role]`` is the loaded rollout/recompute artifact of that case. + """ + if not matrices or set(matrices) - set(WEIGHT_VERSIONS): + raise ValueError(f"Weight versions must be a subset of {WEIGHT_VERSIONS}") + roles = resolve_comparison_roles(contract, "forward_invariance") + train_roles = resolve_comparison_roles(contract, _TRAIN_INFER_KIND) + clip = default_clip_interval(contract) + cells, invariance, decode_prefill = {}, [], [] + lhs_all, rhs_all = [], [] + first = None + for version in WEIGHT_VERSIONS: + if version not in matrices: + continue + matrix = matrices[version] + for case_id in matrix["case_ids"]: + record = matrix["cases"][case_id] + rollout = artifacts[version][case_id]["rollout"] + recompute = artifacts[version][case_id]["recompute"] + cell_id = f"{version}/{case_id}" + drift, layer, family = first_drift_of(record) + if drift is not None and first is None: + first = (drift, layer, family, cell_id) + batch = rollout["logprobs"].shape[0] + cells[cell_id] = CellOutput( + cell_id=cell_id, + selected_logp={ + (f"sample{row}", position): rollout["logprobs"][row, position] + for row in range(batch) + for position in range(16) + }, + loss=None, + grads={}, + first_drift_node=drift, + node_digests={ + "embedding": rollout["embedding_digest"]["sha256"], + **{ + f"layer{item['layer']}": item["output_sha256"] + for item in rollout["layer_digests"] + }, + }, + requested_backend=PROFILE, + actual_backend=PROFILE, + ) + for name in ("logprobs", "logits"): + invariance.append(_detail(name, cell_id, rollout[name], recompute[name], roles)) + lhs_all.append(rollout["logprobs"].reshape(-1)) + rhs_all.append(recompute["logprobs"].reshape(-1)) + if case_id.endswith("-chunked"): + full = artifacts[version][case_id.replace("-chunked", "-full")]["rollout"] + verdict = judge_logprob_aggregates( + compute_logprob_aggregates( + rollout["logprobs"].reshape(-1), + full["logprobs"].reshape(-1), + torch.ones(rollout["logprobs"].numel(), dtype=torch.bool), + contract=contract, + report_kind=_TRAIN_INFER_KIND, + clip_interval=clip, + comparison_lhs_role=train_roles.comparison_lhs_role, + comparison_rhs_role=train_roles.comparison_rhs_role, + ), + contract, + execution_dtype="bf16", + ) + decode_prefill.append((cell_id, verdict)) + lhs, rhs = torch.cat(lhs_all), torch.cat(rhs_all) + train_infer = judge_logprob_aggregates( + compute_logprob_aggregates( + lhs, + rhs, + torch.ones(lhs.numel(), dtype=torch.bool), + contract=contract, + report_kind=_TRAIN_INFER_KIND, + clip_interval=clip, + comparison_lhs_role=train_roles.comparison_lhs_role, + comparison_rhs_role=train_roles.comparison_rhs_role, + ), + contract, + execution_dtype="bf16", + ) + passed = ( + first is None + and all(matrix["status"] == "passed" for matrix in matrices.values()) + and all(item.passed for item in invariance) + ) + report = ChainGateReport( + backend_profile=PROFILE, + workload_id="qwen3-next-l2-matrix-16", + fixture_hash=matrices[next(iter(matrices))]["fixture"]["content_sha256"], + config_fingerprint={"model": "Qwen3-Next-80B-A3B-Instruct", "tp": 4, "ep": 1, "pp": 1}, + weight_source=weight_source, + weight_hash=weight_hash, + seed=1234, + workload_seed=1234, + device=device, + gpu_name=gpu_name, + compute_capability=compute_capability, + backend_provenance=BackendProvenance( + backend_profile=PROFILE, + requested_backend=PROFILE, + actual_backend=PROFILE, + execution_dtype="bf16", + accumulation_dtype="fp32", + output_dtype="bf16", + reference_dtype="bf16", + candidate_tf32_enabled=False, + reference_tf32_enabled=False, + ), + runtime_backend_observations={}, + backward_runtime_observations={}, + cells=cells, + invariance=tuple(invariance), + gradient_invariance=(), + accuracy=(), + gradient_accuracy=(), + accuracy_aggregates=(), + train_infer=train_infer, + train_infer_bn=None, + decode_prefill=tuple(decode_prefill), + first_drift=None if first is None else first[0], + aggregates=train_infer, + gradient_scope="training_stage_reports", + required_grad_names=(), + all_parameter_gradients=False, + representative_case_ids=tuple(cells), + workflow_url=None, + c8_evidence_path="", + c8_source_commit=None, + passed=passed, + backward_executed="update1" in matrices, + train_infer_executed=True, + accuracy_executed=False, + gradient_accuracy_executed=False, + disclaimer=DISCLAIMER, + ) + payload = report.to_dict() + payload.update( + schema_version=SCHEMA_VERSION, + compatible_schema=COMPATIBLE_SCHEMA, + measured_commit=measured_commit, + weight_versions=[version for version in WEIGHT_VERSIONS if version in matrices], + first_drift_cell=None if first is None else first[3], + first_drift_layer=None if first is None else first[1], + first_drift_family=None if first is None else first[2], + ) + return payload diff --git a/rl_engine/testing/pytest_case_manifest.py b/rl_engine/testing/pytest_case_manifest.py new file mode 100644 index 000000000..7371727c7 --- /dev/null +++ b/rl_engine/testing/pytest_case_manifest.py @@ -0,0 +1,80 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Pytest plugin enforcing Qwen3-Next's declared mandatory case identities.""" + +import json +import time +from pathlib import Path + +from rl_engine.testing.qwen3_next_cases import execution_verdict, load_cases + + +def pytest_addoption(parser): + group = parser.getgroup("qwen3-next acceptance") + group.addoption("--case-manifest", required=True) + group.addoption("--case-suite", choices=("norm", "core", "all", "diagnostics"), required=True) + group.addoption("--case-report", required=True) + + +def pytest_configure(config): + plugin = CaseRecorder( + load_cases(Path(config.getoption("--case-manifest")), config.getoption("--case-suite")), + Path(config.getoption("--case-report")), + ) + config.pluginmanager.register(plugin, "qwen3-next-case-recorder") + + +class CaseRecorder: + def __init__(self, expected, output): + self.expected = expected + self.output = output + self.collected = [] + self.outcomes = {} + self.active = None + + def _progress(self, status="running"): + """Observable progress is separate from the final acceptance artifact.""" + self.output.parent.mkdir(parents=True, exist_ok=True) + target = self.output.with_suffix(".progress.json") + partial = target.with_suffix(".partial") + payload = json.dumps( + { + "status": status, + "active_case": self.active, + "observed_at": time.time(), + "collected": len(self.collected), + "required": len(self.expected), + "finished_calls": sum("call" in phases for phases in self.outcomes.values()), + "outcomes": self.outcomes, + }, + indent=2, + ) + partial.write_text(payload + "\n") + partial.replace(target) + + def pytest_collection_finish(self, session): + self.collected = [item.nodeid for item in session.items] + self._progress() + + def pytest_runtest_logstart(self, nodeid, location): + self.active = nodeid + self._progress() + + def pytest_runtest_logreport(self, report): + outcome = "skipped" if hasattr(report, "wasxfail") else report.outcome + self.outcomes.setdefault(report.nodeid, {})[report.when] = outcome + self._progress() + + def pytest_sessionfinish(self, session, exitstatus): + result = execution_verdict(self.expected, self.collected, self.outcomes) + result["pytest_exit_code"] = int(exitstatus) + result["passed"] = result["passed"] and exitstatus == 0 + self.output.parent.mkdir(parents=True, exist_ok=True) + partial = self.output.with_suffix(self.output.suffix + ".partial") + partial.write_text(json.dumps(result, indent=2) + "\n") + partial.replace(self.output) + self.active = None + self._progress("complete") + if not result["passed"] and exitstatus == 0: + session.exitstatus = 1 diff --git a/rl_engine/testing/qwen3_next_binary.py b/rl_engine/testing/qwen3_next_binary.py new file mode 100644 index 000000000..41ad8165b --- /dev/null +++ b/rl_engine/testing/qwen3_next_binary.py @@ -0,0 +1,89 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Bind each native model execution to its freshly built and archived CUDA binary.""" + +import hashlib +import json +import os +import shutil +from pathlib import Path + + +def _digest(path): + with Path(path).open("rb") as stream: + return hashlib.file_digest(stream, "sha256").hexdigest() + + +def archive_provider_binary(source, output, *, source_tree): + source, output = Path(source).absolute(), Path(output).absolute() + binaries = list((source / "rl_engine").glob("_C.cpython*.so")) + if len(binaries) != 1 or not source_tree: + raise ValueError("Expected one freshly built CUDA provider and its source tree") + binary = binaries[0] + digest = _digest(binary) + archive = output / "provider-binary.so" + temporary = archive.with_suffix(".partial") + shutil.copyfile(binary, temporary) + with temporary.open("rb") as stream: + os.fsync(stream.fileno()) + if _digest(temporary) != digest: + raise ValueError("CUDA provider changed while archiving its execution identity") + temporary.replace(archive) + payload = { + "schema_version": 1, + "source_tree": source_tree, + "actual": {"module": "rl_engine._C", "path": str(binary), "sha256": digest}, + "archive": {"path": str(archive), "sha256": digest}, + } + path = output / "provider-binary.json" + path.write_text(json.dumps(payload, indent=2) + "\n") + with path.open("rb") as stream: + os.fsync(stream.fileno()) + return {"path": str(path), "sha256": _digest(path)} + + +def validate_binary_record(record, *, source_tree=None, artifact_root=None): + """Check archived bytes, without depending on a subsequently rebuilt live file.""" + if not isinstance(record, dict) or set(record) != {"path", "sha256"}: + raise ValueError("Native execution requires a pinned CUDA binary evidence record") + + def checked(item): + path = Path(item["path"]) + if not path.is_absolute() or not path.is_file(): + raise ValueError("CUDA binary evidence requires an existing absolute path") + if artifact_root is not None and not path.resolve().is_relative_to( + Path(artifact_root).resolve() + ): + raise ValueError("CUDA binary evidence escaped its owning stage") + if _digest(path) != item["sha256"]: + raise ValueError("CUDA provider evidence content changed") + return path + + payload = json.loads(checked(record).read_text()) + if payload.get("schema_version") != 1 or not payload.get("source_tree"): + raise ValueError("Unsupported CUDA provider evidence") + if source_tree is not None and payload["source_tree"] != source_tree: + raise ValueError("CUDA provider belongs to another source tree") + actual = payload.get("actual", {}) + if set(actual) != {"module", "path", "sha256"} or actual["module"] != "rl_engine._C": + raise ValueError("The actual native CUDA extension identity is missing") + if not Path(actual["path"]).is_absolute() or not Path(actual["path"]).name.startswith( + "_C.cpython" + ): + raise ValueError("Provider identity does not name the actual native extension") + archive = payload.get("archive", {}) + if archive.get("sha256") != actual["sha256"]: + raise ValueError("Archived binary differs from the binary imported by workers") + checked(archive) + return actual + + +def verify_imported_provider(record, *, source_tree): + from rl_engine.integrations.qwen3_next_binary import imported_provider_identity + + expected = validate_binary_record(record, source_tree=source_tree) + actual = imported_provider_identity() + if actual != expected: + raise ValueError("Worker imported a different CUDA binary than its stage built") + return actual diff --git a/rl_engine/testing/qwen3_next_cases.py b/rl_engine/testing/qwen3_next_cases.py new file mode 100644 index 000000000..72e1794c7 --- /dev/null +++ b/rl_engine/testing/qwen3_next_cases.py @@ -0,0 +1,69 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Pinned operator case identities and complete execution verdicts.""" + +import hashlib +import json +from pathlib import Path + + +def load_cases(path: Path, suite: str) -> list[str]: + manifest = json.loads(path.read_text()) + if manifest.get("schema_version") != 1: + raise ValueError("Unsupported operator case manifest schema") + groups = manifest["suites"] + all_ids = [case for cases in groups.values() for case in cases] + if len(all_ids) != len(set(all_ids)): + raise ValueError("Operator case IDs must be unique across suites") + names = ("norm", "core") if suite == "all" else (suite,) + cases = sorted(case for name in names for case in groups[name]) + if not cases or any(not isinstance(case, str) or "::test_" not in case for case in cases): + raise ValueError("Operator suites must contain nonempty pytest case IDs") + return cases + + +def case_digest(cases: list[str]) -> str: + return hashlib.sha256(("\n".join(sorted(cases)) + "\n").encode()).hexdigest() + + +def execution_verdict(expected: list[str], collected: list[str], outcomes: dict) -> dict: + """Require the complete declared collection and successful setup/call/teardown.""" + missing = sorted(set(expected) - set(collected)) + unexpected = sorted(set(collected) - set(expected)) + duplicates = len(collected) != len(set(collected)) + counts = {"tests": len(expected), "failures": 0, "errors": 0, "skipped": 0} + incomplete = [] + for case in expected: + phases = outcomes.get(case, {}) + if any(value == "skipped" for value in phases.values()): + counts["skipped"] += 1 + elif phases.get("setup") == "failed" or phases.get("teardown") == "failed": + counts["errors"] += 1 + elif phases.get("call") == "failed": + counts["failures"] += 1 + elif phases != {"setup": "passed", "call": "passed", "teardown": "passed"}: + incomplete.append(case) + passed = not any( + ( + missing, + unexpected, + duplicates, + incomplete, + counts["failures"], + counts["errors"], + counts["skipped"], + ) + ) + return { + "passed": passed, + "expected_case_ids": expected, + "expected_case_ids_sha256": case_digest(expected), + "collected_case_ids": collected, + "missing": missing, + "unexpected": unexpected, + "duplicate_collection": duplicates, + "incomplete": incomplete, + "counts": counts, + "outcomes": outcomes, + } diff --git a/rl_engine/testing/qwen3_next_export_schema.json b/rl_engine/testing/qwen3_next_export_schema.json new file mode 100644 index 000000000..e1389c4f5 --- /dev/null +++ b/rl_engine/testing/qwen3_next_export_schema.json @@ -0,0 +1,10 @@ +{ + "schema_version": 1, + "checkpoint_revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "tensor_count": 75944, + "weight_schema_sha256": "babe9f7e7cf398ad6a8607ee03bb6549139b26fcdd919bb65e9d22b059536361", + "weights_dtype": "bfloat16", + "architecture_layers": 48, + "encoding": "sha256 of sorted compact JSON mapping every HF tensor name to dtype and shape", + "scope": "Official safetensors header schema only; no numerical or full-model L2 acceptance" +} diff --git a/rl_engine/testing/qwen3_next_l2.py b/rl_engine/testing/qwen3_next_l2.py new file mode 100644 index 000000000..7f8778072 --- /dev/null +++ b/rl_engine/testing/qwen3_next_l2.py @@ -0,0 +1,1047 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Frozen full-model Qwen3-Next inputs and original-dtype L2 artifacts. + +Native workers receive only JSON requests (tokens, weights and provider identity). +They write a weights_only-safe torch artifact with metadata, prompt_tokens, +response_tokens, prediction_positions, BF16 logits [B,16,151936], FP32 logprobs +[B,16], and layer_digests for all 48 layers. Recurrent debug states describe the +same prediction positions: P-1 through P+14, before consuming response token 16. +No rollout hidden tensor or recurrent state is a recompute input. +""" + +import hashlib +import json +import os +from dataclasses import dataclass +from pathlib import Path + +import torch + +from rl_engine.integrations.qwen3_next_subnode import SUBNODES, subnode_layout +from rl_engine.testing.tensor_identity import tensor_bitwise_equal + +VOCAB_SIZE = 151936 +RESPONSE_LENGTH = 16 +PROMPT_LENGTHS = (8, 64, 256, 1024) +FROZEN_TEXTS = ( + "The capital of France is Paris. Explain the route from the library to the river. ", + "Compute seven plus five, then describe a careful way to check the answer. ", + "A robot observes a red cup beside a blue plate on a wooden kitchen table. ", + "Write a precise explanation of how rain reaches a mountain stream in autumn. ", +) +NATIVE_WORKER_MODULE = "rl_engine.integrations.qwen3_next_native_workers" + + +# The native rollout cache budget every certified profile pins (4 GiB per GPU). +NATIVE_KV_CACHE_BYTES = 4 << 30 + + +def json_digest(value): + return hashlib.sha256( + json.dumps(value, sort_keys=True, separators=(",", ":")).encode() + ).hexdigest() + + +def tensor_digest(value): + value = value.detach().cpu().contiguous() + digest = hashlib.sha256(str((str(value.dtype), tuple(value.shape))).encode()) + digest.update(value.reshape(-1).view(torch.uint8).numpy().tobytes()) + return digest.hexdigest() + + +@dataclass(frozen=True) +class L2Case: + prompt_length: int + batch_size: int + prefill: str + + @property + def case_id(self): + return f"p{self.prompt_length:04d}-b{self.batch_size}-{self.prefill}" + + @property + def chunks(self): + if self.prefill == "full": + return [self.prompt_length] + remaining = self.prompt_length - 1 + chunks = [1, min(63, remaining)] + remaining -= chunks[-1] + while remaining: + size = min(64, remaining) + chunks.append(size) + remaining -= size + return chunks + + +def case_matrix(): + return [ + L2Case(length, batch, prefill) + for length in PROMPT_LENGTHS + for batch in (1, 4) + for prefill in ("full", "chunked") + ] + + +def prompt_fixture(tokenizer, tokenizer_identity): + encoded = [tokenizer.encode(text, add_special_tokens=False) for text in FROZEN_TEXTS] + if any( + not row or any(type(token) is not int or not 0 <= token < VOCAB_SIZE for token in row) + for row in encoded + ): + raise ValueError("Pinned tokenizer produced an empty or out-of-range prompt") + prompts = {} + for length in PROMPT_LENGTHS: + prompts[str(length)] = torch.tensor( + [(row * ((length + len(row) - 1) // len(row)))[:length] for row in encoded], + dtype=torch.int64, + ) + if torch.unique(prompts[str(length)], dim=0).shape[0] != 4: + raise ValueError("The four pinned prompt samples must be distinct") + identity = { + "texts": list(FROZEN_TEXTS), + "tokenizer": tokenizer_identity, + "prompt_hashes": {key: tensor_digest(value) for key, value in prompts.items()}, + } + return { + "schema_version": 1, + "prompts": prompts, + "prompt_identity": identity, + "prompt_sha256": json_digest(identity), + } + + +def freeze_responses(prompts, baseline_artifacts, *, baseline_identity, baseline_records): + responses, old_logprobs = {}, {} + for length in PROMPT_LENGTHS: + artifact = baseline_artifacts[str(length)] + response = artifact["response_tokens"] + selected = artifact["logprobs"] + if response.shape != (4, RESPONSE_LENGTH) or response.dtype != torch.int64: + raise ValueError( + "Baseline generation must produce sixteen real tokens for four samples" + ) + if ( + selected.shape != (4, RESPONSE_LENGTH) + or selected.dtype != torch.float32 + or not torch.isfinite(selected).all() + ): + raise ValueError("Baseline logprobs must be finite FP32 [4,16]") + if bool(((response < 0) | (response >= VOCAB_SIZE)).any()): + raise ValueError("Baseline response token is outside the official vocabulary") + responses[str(length)] = response.detach().cpu().clone() + old_logprobs[str(length)] = selected.detach().cpu().clone() + fixture = { + **prompts, + "responses": responses, + "old_logprobs": old_logprobs, + "baseline_identity": baseline_identity, + "baseline_artifacts": baseline_records, + } + fixture["content_sha256"] = fixture_digest(fixture) + return fixture + + +def fixture_digest(fixture): + identity = { + "prompt_sha256": fixture["prompt_sha256"], + "baseline_identity": fixture["baseline_identity"], + "baseline_artifacts": fixture["baseline_artifacts"], + "responses": {key: tensor_digest(value) for key, value in fixture["responses"].items()}, + "old_logprobs": { + key: tensor_digest(value) for key, value in fixture["old_logprobs"].items() + }, + } + return json_digest(identity) + + +def validate_fixture(fixture): + expected_keys = {str(length) for length in PROMPT_LENGTHS} + if fixture.get("schema_version") != 1 or any( + set(fixture[name]) != expected_keys + for name in ("prompts", "responses", "old_logprobs", "baseline_artifacts") + ): + raise ValueError("Incomplete frozen L2 input matrix") + for record in fixture["baseline_artifacts"].values(): + if ( + set(record) != {"path", "sha256"} + or not Path(record["path"]).is_absolute() + or len(record["sha256"]) != 64 + ): + raise ValueError("Baseline generation artifact identity is incomplete") + for length in PROMPT_LENGTHS: + key = str(length) + prompt, response, logprobs = ( + fixture[name][key] for name in ("prompts", "responses", "old_logprobs") + ) + if ( + prompt.shape != (4, length) + or prompt.dtype != torch.int64 + or tensor_digest(prompt) != fixture["prompt_identity"]["prompt_hashes"][key] + ): + raise ValueError("Frozen prompt was changed") + if ( + response.shape != (4, RESPONSE_LENGTH) + or response.dtype != torch.int64 + or bool(((response < 0) | (response >= VOCAB_SIZE)).any()) + ): + raise ValueError("Invalid frozen response") + if ( + logprobs.shape != (4, RESPONSE_LENGTH) + or logprobs.dtype != torch.float32 + or not torch.isfinite(logprobs).all() + ): + raise ValueError("Invalid frozen baseline logprobs") + if ( + json_digest(fixture["prompt_identity"]) != fixture["prompt_sha256"] + or fixture_digest(fixture) != fixture["content_sha256"] + ): + raise ValueError("Frozen L2 fixture content identity mismatch") + + +def save_tensor_artifact(path, payload): + path = Path(path) + path.parent.mkdir(parents=True, exist_ok=True) + temporary = path.with_suffix(path.suffix + ".partial") + with temporary.open("wb") as stream: + torch.save(payload, stream) + stream.flush() + os.fsync(stream.fileno()) + temporary.replace(path) + directory = os.open(path.parent, os.O_RDONLY | os.O_DIRECTORY) + try: + os.fsync(directory) + finally: + os.close(directory) + + +def load_tensor_artifact(path): + return torch.load(path, map_location="cpu", weights_only=True) + + +def validate_weight_identity(identity): + """Bind mutable export bytes separately from the fixed official model identity. + + This is the JSON boundary check. The native loaders and profile activation also + call validate_training_export to rehash and inspect the actual exported files. + """ + if identity.get("provider_config", {}).get("profile") != "qwen3_next_tp4_shared_eager_v1": + return + version = identity.get("weight_version") + if not isinstance(version, str) or not version: + raise ValueError("Official shared model identity requires an explicit weight version") + actual = identity.get("checkpoint_identity", {}) + if version == "baseline": + if actual.get("kind") == "qwen3_next_native_hf_export": + raise ValueError("An updated native export cannot masquerade as the official baseline") + if any(key in identity for key in ("base_checkpoint", "base_checkpoint_identity")) and any( + ( + identity.get("base_checkpoint") != identity.get("checkpoint"), + identity.get("base_checkpoint_identity") != actual, + ) + ): + raise ValueError("Baseline identity cannot redirect its official base checkpoint") + return + if any(key not in identity for key in ("base_checkpoint", "base_checkpoint_identity")): + raise ValueError("Updated weights require a separately pinned official base identity") + if any( + ( + not Path(identity["checkpoint"]).is_absolute(), + not Path(identity["base_checkpoint"]).is_absolute(), + identity["checkpoint"] == identity["base_checkpoint"], + actual.get("schema_version") != 1, + actual.get("kind") != "qwen3_next_native_hf_export", + actual.get("status") != "complete", + actual.get("weight_version") != version, + actual.get("base_checkpoint") != identity["base_checkpoint"], + actual.get("base_checkpoint_identity") != identity["base_checkpoint_identity"], + actual.get("architecture_layers") != 48, + actual.get("weights_dtype") != "bfloat16", + type(actual.get("step")) is not int, + actual.get("step", 0) < 1, + ) + ): + raise ValueError("Updated checkpoint identity differs from its published native export") + training = actual.get("training_identity", {}) + fields = ("source_commit", "source_tree", "environment_sha256", "provider_config", "topology") + if any(training.get(key) != identity.get(key) for key in fields) or any( + ( + training.get("checkpoint") != identity["base_checkpoint"], + training.get("checkpoint_identity") != identity["base_checkpoint_identity"], + ) + ): + raise ValueError("Native export training provenance differs from the model/base identity") + + +def worker_request(case, fixture, *, role, identity, generate=False, trace_layers=None): + if role not in ("rollout", "recompute"): + raise ValueError("Unknown native model role") + validate_weight_identity(identity) + if generate and (role != "rollout" or case.batch_size != 4 or case.prefill != "full"): + raise ValueError("Only initial B4 full-prefill rollout may define frozen responses") + if not generate: + validate_fixture(fixture) + prompt = fixture["prompts"][str(case.prompt_length)][: case.batch_size] + request = { + "schema_version": 1, + "case_id": case.case_id, + "role": role, + "identity": identity, + "sample_ids": list(range(case.batch_size)), + "prompt_tokens": prompt.tolist(), + "response_tokens": ( + None + if generate + else fixture["responses"][str(case.prompt_length)][: case.batch_size].tolist() + ), + "response_length": RESPONSE_LENGTH, + "prediction_positions": list( + range(case.prompt_length - 1, case.prompt_length + RESPONSE_LENGTH - 1) + ), + "consumed_response_tokens": RESPONSE_LENGTH - 1, + "rollout_prefill_chunks": case.chunks, + "prefill_chunks": case.chunks if role == "rollout" else None, + "consumed_input_tokens": ( + None + if generate + else [ + left + right[:-1] + for left, right in zip( + prompt.tolist(), + fixture["responses"][str(case.prompt_length)][: case.batch_size].tolist(), + ) + ] + ), + "state_position": case.prompt_length + RESPONSE_LENGTH - 2, + "execution": ( + { + "rollout_mode": "autoregressive", + "prefill_chunks": case.chunks, + "response_mode": "generate" if generate else "teacher_forced", + } + if role == "rollout" + else { + "recompute_mode": "full_from_tokens", + "input_sequence_length": case.prompt_length + RESPONSE_LENGTH - 1, + } + ), + "fixture_sha256": fixture["prompt_sha256"] if generate else fixture["content_sha256"], + "logits_dtype": "bfloat16", + "logprobs_dtype": "float32", + "vocab_size": VOCAB_SIZE, + "trace_layers": list(trace_layers or []), + "required_layer_digests": list(range(48)), + "generation": { + "temperature": 0.0, + "top_p": 1.0, + "top_k": -1, + "seed": 1234, + "ignore_eos": True, + }, + } + request["request_sha256"] = json_digest(request) + return request + + +def layer_state_names(layer): + kinds = ("convolution", "recurrent_state") if (layer + 1) % 4 else ("key", "value") + return sorted(f"tp{rank}.{kind}" for rank in range(4) for kind in kinds) + + +def layer_digest(layer, output, states, *, request=None, subnodes=None): + """Hash each sample's real layer outputs, sub-nodes and all TP-owned state tensors.""" + if ( + layer not in range(48) + or output.ndim != 3 + or output.shape[1:] != (16, 2048) + or output.dtype != torch.bfloat16 + ): + raise ValueError( + "Layer diagnostics require original BF16 response hidden states [B,16,2048]" + ) + batch = output.shape[0] + if sorted(states) != layer_state_names(layer) or any( + not isinstance(value, torch.Tensor) or value.shape[0] != batch or not value.numel() + for value in states.values() + ): + raise ValueError("Actual convolution/recurrent or KV state tensors are required") + shapes = ( + native_state_shapes(request) + if request is not None + and request["identity"].get("provider_config", {}).get("profile") + == "qwen3_next_tp4_shared_eager_v1" + else None + ) + for name, value in states.items(): + if shapes is not None: + validate_native_state_storage(value, name.rsplit(".", 1)[-1], shapes) + if "recurrent_state" in name and value.dtype != torch.float32: + raise ValueError("Recurrent diagnostic state must preserve FP32") + if not torch.isfinite(value).all(): + raise ValueError("Nonfinite recurrent/KV diagnostic state") + if not torch.isfinite(output).all(): + raise ValueError("Nonfinite layer diagnostic output") + if subnodes is None or tuple(subnodes) != SUBNODES: + raise ValueError(f"Layer diagnostics require the sub-nodes {SUBNODES} in order") + for name, value in subnodes.items(): + width, dtype = subnode_layout(name) + if value.dtype != dtype or tuple(value.shape) != (batch, 16, width): + raise ValueError(f"Sub-node {name} must be original {dtype} [B,16,{width}]") + subnode_hashes = { + name: [tensor_digest(value[index]) for index in range(batch)] + for name, value in subnodes.items() + } + outputs = [tensor_digest(output[index]) for index in range(batch)] + state_hashes = [ + json_digest({name: tensor_digest(value[index]) for name, value in sorted(states.items())}) + for index in range(batch) + ] + return { + "layer": layer, + "sample_output_sha256": outputs, + "sample_state_sha256": state_hashes, + "output_sha256": json_digest({"layer": layer, "samples": outputs}), + "state_sha256": json_digest({"layer": layer, "samples": state_hashes}), + "state_names": sorted(states), + "sample_subnode_sha256": subnode_hashes, + "subnode_sha256": json_digest({"layer": layer, "subnodes": subnode_hashes}), + } + + +def embedding_digest(values): + """Per-sample digests of the [B, 16, 2048] BF16 embedding rows at the response positions.""" + if values.dtype != torch.bfloat16 or values.ndim != 3 or values.shape[1:] != (16, 2048): + raise ValueError("Embedding diagnostics require original BF16 [B,16,2048] rows") + samples = [tensor_digest(values[index]) for index in range(values.shape[0])] + return {"sample_sha256": samples, "sha256": json_digest({"embedding": samples})} + + +def first_divergent_node(reference, candidate): + """The first (layer, sub-node) whose sample digests differ, in execution order. + + Within a layer the sub-nodes are compared in SUBNODES order, then the layer + output and the recurrent/KV state. Returns ``{"layer", "node"}`` or None. + """ + batch = candidate["logits"].shape[0] + left, right = reference["embedding_digest"], candidate["embedding_digest"] + if left["sample_sha256"][:batch] != right["sample_sha256"]: + return {"layer": 0, "node": "embedding"} + for left, right in zip(reference["layer_digests"], candidate["layer_digests"]): + for node in SUBNODES: + if left["sample_subnode_sha256"][node][:batch] != right["sample_subnode_sha256"][node]: + return {"layer": right["layer"], "node": node} + for node, name in (("output", "sample_output_sha256"), ("state", "sample_state_sha256")): + if left[name][:batch] != right[name]: + return {"layer": right["layer"], "node": node} + return None + + +def first_divergent_layer(reference, candidate): + batch = candidate["logits"].shape[0] + for left, right in zip(reference["layer_digests"], candidate["layer_digests"]): + for name in ("sample_output_sha256", "sample_state_sha256"): + if left[name][:batch] != right[name]: + return right["layer"] + return None + + +def validate_model_artifact(artifact, request): + validate_weight_identity(request["identity"]) + batch = len(request["prompt_tokens"]) + metadata = artifact.get("metadata", {}) + if metadata != { + key: request[key] + for key in ("schema_version", "case_id", "role", "identity", "request_sha256") + }: + raise ValueError("Model artifact provenance differs from its independent worker request") + if artifact.get("execution") != request["execution"]: + raise ValueError("Artifact execution mode does not match its rollout/recompute contract") + profile = request["identity"].get("provider_config", {}) + if profile.get("profile") == "qwen3_next_tp4_shared_eager_v1" and request["role"] == "rollout": + validate_native_scheduler_execution(artifact, request) + expected = { + "logits": ((batch, RESPONSE_LENGTH, VOCAB_SIZE), torch.bfloat16), + "logprobs": ((batch, RESPONSE_LENGTH), torch.float32), + "response_tokens": ((batch, RESPONSE_LENGTH), torch.int64), + "prompt_tokens": ((batch, len(request["prompt_tokens"][0])), torch.int64), + "prediction_positions": ((RESPONSE_LENGTH,), torch.int64), + } + for name, (shape, dtype) in expected.items(): + tensor = artifact.get(name) + if ( + not isinstance(tensor, torch.Tensor) + or tensor.device.type != "cpu" + or tensor.dtype != dtype + or tuple(tensor.shape) != shape + ): + raise ValueError(f"{name}: expected CPU {dtype} {shape}, preserving original storage") + if tensor.is_floating_point() and not torch.isfinite(tensor).all(): + raise ValueError(f"{name}: nonfinite full-model artifact") + if not torch.equal( + artifact["prompt_tokens"], torch.tensor(request["prompt_tokens"], dtype=torch.int64) + ) or not torch.equal( + artifact["prediction_positions"], + torch.tensor(request["prediction_positions"], dtype=torch.int64), + ): + raise ValueError("Prompt or response prediction offsets do not match") + if request["response_tokens"] is not None and not torch.equal( + artifact["response_tokens"], torch.tensor(request["response_tokens"], dtype=torch.int64) + ): + raise ValueError("Worker changed frozen response tokens") + if bool( + ((artifact["response_tokens"] < 0) | (artifact["response_tokens"] >= VOCAB_SIZE)).any() + ): + raise ValueError("Generated token is outside the official vocabulary") + embedding = artifact.get("embedding_digest", {}) + samples = embedding.get("sample_sha256", []) + if len(samples) != batch or embedding.get("sha256") != json_digest({"embedding": samples}): + raise ValueError("The artifact must identify every sample's embedding rows") + layers = artifact.get("layer_digests", []) + if [layer.get("layer") for layer in layers] != list(range(48)): + raise ValueError("Full 48-layer diagnostic identities are required") + for layer in layers: + if layer.get("state_names") != layer_state_names(layer["layer"]): + raise ValueError("Per-layer state identities must cover every TP rank") + for name in ("output", "state"): + values = layer.get(f"sample_{name}_sha256", []) + if len(values) != batch: + raise ValueError("Every layer must identify every sample's output and state") + if any( + not isinstance(value, str) + or len(value) != 64 + or any(char not in "0123456789abcdef" for char in value) + for value in values + ): + raise ValueError("Invalid per-sample layer tensor digest") + if layer.get(f"{name}_sha256") != json_digest( + {"layer": layer["layer"], "samples": values} + ): + raise ValueError("Layer digest is not bound to its sample tensor identities") + subnodes = layer.get("sample_subnode_sha256", {}) + if tuple(subnodes) != SUBNODES or any( + len(values) != batch or any(not isinstance(v, str) or len(v) != 64 for v in values) + for values in subnodes.values() + ): + raise ValueError("Every layer must identify every sample's sub-node outputs") + if layer.get("subnode_sha256") != json_digest( + {"layer": layer["layer"], "subnodes": subnodes} + ): + raise ValueError("Layer sub-node digest is not bound to its sample identities") + for name, value in artifact.get("debug_tensors", {}).items(): + if ( + not isinstance(value, torch.Tensor) + or value.device.type != "cpu" + or not torch.isfinite(value).all() + ): + raise ValueError("Debug layer/state tensors must be finite CPU tensors") + if "recurrent_state" in name and value.dtype != torch.float32: + raise ValueError("Recurrent state diagnostics must preserve FP32 storage") + + +def validate_debug_capture(artifact, request): + tensors = artifact.get("debug_tensors", {}) + for layer in request["trace_layers"]: + record = artifact["layer_digests"][layer] + prefix = f"layer.{layer}." + names = [prefix + "output"] + [prefix + name for name in record["state_names"]] + names += [f"{prefix}subnode.{name}" for name in SUBNODES] + if any(name not in tensors for name in names): + raise ValueError("First-divergence capture is missing layer output or state tensors") + actual = layer_digest( + layer, + tensors[prefix + "output"], + {name: tensors[prefix + name] for name in record["state_names"]}, + request=request, + subnodes={name: tensors[f"{prefix}subnode.{name}"] for name in SUBNODES}, + ) + if actual != record: + raise ValueError("Saved first-divergence tensors differ from their layer identities") + + +def validate_native_scheduler_execution(artifact, request): + expected = { + "kv_cache_memory_bytes_per_gpu": NATIVE_KV_CACHE_BYTES, + "max_model_len": 1040, + "max_num_seqs": 64, + "max_num_batched_tokens": 16384, + "scheduler": "rl_engine.integrations.qwen3_next_native_rollout.ExactPrefillScheduler", + "async_scheduling": False, + "prefix_caching": False, + "weights_dtype": "bfloat16", + "recurrent_state_dtype": "float32", + "model_runner": "v1", + } + if artifact.get("native_runtime_profile") != expected: + raise ValueError("Native rollout runtime differs from its fixed scheduler/cache profile") + mode = ( + "certified" if "scheduler_profile_certificate" in request["identity"] else "qualification" + ) + if artifact.get("provider_execution_mode") != mode: + raise ValueError("Native rollout execution mode differs from its certificate identity") + if ( + request["identity"]["provider_config"].get("native_rollout_kv_cache_memory_bytes") + != NATIVE_KV_CACHE_BYTES + ): + raise ValueError("The submitted profile did not pin the native cache budget") + sizes = [*request["prefill_chunks"], *([1] * request["consumed_response_tokens"])] + steps = artifact.get("native_scheduler_steps", []) + if len(steps) != len(sizes): + raise ValueError("Native scheduler did not execute every requested prefill/decode boundary") + samples = request["sample_ids"] + consumed = 0 + for step, size in zip(steps, sizes): + if set(step) != {"samples", "computed_before", "token_counts"} or any( + ( + sorted(step["samples"]) != sorted(samples), + len(set(step["samples"])) != len(samples), + step["computed_before"] != [consumed] * len(samples), + step["token_counts"] != [size] * len(samples), + ) + ): + raise ValueError("Native scheduler executed a different sample/chunk/offset matrix") + consumed += size + + +def compare_artifacts(rollout, recompute): + comparisons = { + name: tensor_bitwise_equal(rollout[name], recompute[name]) + for name in ("response_tokens", "logits", "logprobs") + } + first_layer = first_divergent_layer(rollout, recompute) + first_node = first_divergent_node(rollout, recompute) + comparisons["layer_states"] = first_node is None + first_difference = None + for name, passed in comparisons.items(): + if passed: + continue + if name == "layer_states": + break + left, right = rollout[name], recompute[name] + if left.shape == right.shape and left.dtype == right.dtype: + width = left.element_size() + changed = ( + left.contiguous().reshape(-1).view(torch.uint8) + != right.contiguous().reshape(-1).view(torch.uint8) + ).nonzero() + if changed.numel(): + flat = int(changed[0, 0]) // width + first_difference = { + "tensor": name, + "flat_element": flat, + "byte_offset": int(changed[0, 0]), + } + break + return { + "passed": all(comparisons.values()), + "comparisons": comparisons, + "first_divergent_layer": first_layer, + "first_divergent_node": first_node, + "first_difference": first_difference, + } + + +def native_state_shapes(request): + """Complete canonical per-rank state after P prompt plus 15 response inputs. + + TP4GDN owns 2048 convolution channels with three prior samples and eight + 128x128 recurrent heads. Full attention owns one 256-wide KV head per rank; + the paired replicas remain independently recorded and compared. + """ + prompts = request["prompt_tokens"] + batch = len(prompts) + if batch not in (1, 4) or any(len(row) != len(prompts[0]) for row in prompts): + raise ValueError("Native state evidence requires the fixed equal-length batch1/4 matrix") + prompt_length = len(prompts[0]) + consumed = prompt_length + RESPONSE_LENGTH - 1 + if ( + prompt_length not in PROMPT_LENGTHS + or request.get("consumed_response_tokens") != RESPONSE_LENGTH - 1 + or request.get("state_position") != consumed - 1 + ): + raise ValueError("Native state position must consume the prompt and exactly 15 responses") + return { + "convolution": (batch, 2048, 3), + "recurrent_state": (batch, 8, 128, 128), + "key": (batch, 1, consumed, 256), + "value": (batch, 1, consumed, 256), + } + + +def validate_native_state_storage(value, name, expected_shapes): + """One dtype/shape/finite boundary shared by assembly and stored trace audits.""" + if not isinstance(value, torch.Tensor) or tuple(value.shape) != expected_shapes[name]: + raise ValueError( + f"Original worker must retain complete {name} state shape " + f"{expected_shapes[name]} after the consumed prompt/response prefix" + ) + dtype = torch.float32 if name == "recurrent_state" else torch.bfloat16 + if value.dtype != dtype or not torch.isfinite(value).all(): + raise ValueError("Original worker state violates BF16/FP32 finite storage") + + +def validate_native_worker_traces(artifact, request, *, artifact_root=None): + """Rehash four actual traces and reconstruct every layer and state digest.""" + profile = request["identity"].get("provider_config", {}).get("profile") + if profile != "qwen3_next_tp4_shared_eager_v1": + return + records = artifact.get("worker_traces", []) + if len(records) != 4 or sorted(record.get("rank", -1) for record in records) != [0, 1, 2, 3]: + raise ValueError("Native model needs one original trace from each TP rank") + binary = artifact.get("provider_binary", {}) + digest = binary.get("sha256", "") + if ( + binary.get("module") != "rl_engine._C" + or not isinstance(binary.get("path"), str) + or not Path(binary["path"]).is_absolute() + or not isinstance(digest, str) + or len(digest) != 64 + or any(character not in "0123456789abcdef" for character in digest) + ): + raise ValueError("Native model must identify the actual imported CUDA provider binary") + batch = len(request["sample_ids"]) + expected_state_shapes = native_state_shapes(request) + state_hashes = [[{} for _ in range(batch)] for _ in range(48)] + for record in records: + rank = record["rank"] + if record.get("request_sha256") != request["request_sha256"]: + raise ValueError("Worker trace request identity mismatch") + trace = load_tensor_artifact(checked_artifact_path(record, artifact_root=artifact_root)) + provenance = { + "rank": rank, + "request_sha256": request["request_sha256"], + "provider_binary": binary, + } + if request["role"] == "rollout": + provenance.update( + native_runtime_profile=artifact["native_runtime_profile"], + provider_execution_mode=artifact["provider_execution_mode"], + schedule=artifact["native_scheduler_steps"], + ) + else: + provenance.update(role="recompute", execution=request["execution"]) + if any(trace.get(key) != value for key, value in provenance.items()): + raise ValueError("Worker trace rank/runtime/scheduler provenance mismatch") + tensors = { + "logprobs": artifact["logprobs"], + "responses": artifact["response_tokens"], + "local_logits": artifact["logits"][..., rank * 37984 : (rank + 1) * 37984], + } + # Recompute keeps the gathered full logits on rank zero, and every rank + # retains its original local shard and independently selected logprobs. + if request["role"] == "rollout" or rank == 0: + tensors["logits"] = artifact["logits"] + for key, expected in tensors.items(): + if not isinstance(trace.get(key), torch.Tensor) or not tensor_bitwise_equal( + trace[key], expected + ): + raise ValueError(f"Original worker {key} bytes contradict the assembled artifact") + if request["role"] == "recompute": + layers = trace.get("layers", {}) + if not isinstance(layers, dict) or set(layers) != {*range(48), "model"}: + raise ValueError("Original recompute worker must retain all 48 layer traces") + outputs = [layers[layer].get("output") for layer in range(48)] + if any( + not isinstance(value, torch.Tensor) + or value.shape != (batch, 16, 2048) + or value.dtype != torch.bfloat16 + for value in outputs + ): + raise ValueError("Original recompute worker must retain all 48 BF16 layer outputs") + hidden = torch.stack(outputs) + states = [layers[layer].get("states", {}) for layer in range(48)] + subnodes = { + name: torch.stack([layers[layer]["subnodes"][name] for layer in range(48)]) + for name in SUBNODES + } + embedding = layers["model"]["embedding"] + else: + hidden = trace.get("hidden") + states = trace.get("states", []) + subnodes, embedding = trace.get("subnodes", {}), trace.get("embedding") + if embedding_digest(embedding) != artifact["embedding_digest"]: + raise ValueError("Original worker embedding rows contradict the assembled artifact") + for name in SUBNODES: + for layer in range(48): + if [ + tensor_digest(subnodes[name][layer, sample]) for sample in range(batch) + ] != artifact["layer_digests"][layer]["sample_subnode_sha256"][name]: + raise ValueError( + f"Original worker {name} rows contradict the assembled artifact" + ) + if ( + not isinstance(hidden, torch.Tensor) + or hidden.shape != (48, batch, 16, 2048) + or hidden.dtype != torch.bfloat16 + ): + raise ValueError("Original worker must retain all 48 BF16 layer outputs") + if not torch.isfinite(hidden).all() or len(states) != 48: + raise ValueError("Original worker has nonfinite outputs or missing layer states") + for layer in range(48): + expected_names = ( + ("key", "value") if (layer + 1) % 4 == 0 else ("convolution", "recurrent_state") + ) + if set(states[layer]) != set(expected_names): + raise ValueError("Worker trace state types differ from the official layer layout") + for sample in range(batch): + if ( + tensor_digest(hidden[layer, sample]) + != artifact["layer_digests"][layer]["sample_output_sha256"][sample] + ): + raise ValueError("Original worker layer output contradicts its declared digest") + for name, value in states[layer].items(): + validate_native_state_storage(value, name, expected_state_shapes) + for sample in range(batch): + state_hashes[layer][sample][f"tp{rank}.{name}"] = tensor_digest(value[sample]) + for layer in range(48): + if [json_digest(values) for values in state_hashes[layer]] != artifact["layer_digests"][ + layer + ]["sample_state_sha256"]: + raise ValueError("Original TP state bytes contradict the assembled layer digests") + + +def compare_batch_prefill(reference, candidate): + batch = candidate["logits"].shape[0] + compared = { + name: tensor_bitwise_equal(reference[name][:batch], candidate[name]) + for name in ("response_tokens", "logits", "logprobs") + } + compared["layer_states"] = first_divergent_node(reference, candidate) is None + return compared + + +def validate_matrix_report(report, *, expected_identity=None, artifact_root=None): + """A passed label alone cannot close the full-model matrix.""" + expected_ids = [case.case_id for case in case_matrix()] + required = { + "schema_version": 1, + "status": "passed", + "scope": "qwen3_next_full_model_l2", + "raw_bit_comparison": True, + "logits_dtype": "bfloat16", + "logprobs_dtype": "float32", + "response_length": 16, + "vocab_size": 151936, + "case_ids": expected_ids, + } + if any(report.get(key) != value for key, value in required.items()) or set( + report.get("cases", {}) + ) != set(expected_ids): + raise ValueError("Full-model L2 requires the complete sixteen-case raw-bit matrix") + identity = report.get("identity", {}) + if identity.get("architecture_layers") != 48 or identity.get("topology") != { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1, + }: + raise ValueError("Full-model L2 cannot change model depth or topology") + processes = report.get("processes", {}) + if ( + set(processes) != {"rollout", "recompute"} + or any( + row.get("exit_code") != 0 + or row.get("gpu_release_verified") is not True + or type(row.get("pid")) is not int + or row["pid"] <= 0 + for row in processes.values() + ) + or processes["rollout"]["pid"] == processes["recompute"]["pid"] + ): + raise ValueError("Independent process completion and GPU release evidence are required") + checks = {"response_tokens", "logits", "logprobs", "layer_states"} + for case in report["cases"].values(): + compared = case.get("comparisons", {}) + if ( + case.get("passed") is not True + or set(compared) != checks + or any(value is not True for value in compared.values()) + ): + raise ValueError( + "Every response token, full logits, logprob and layer/state identity must pass" + ) + groups = [case.get("batch_prefill", {})] + if identity.get("weight_version") == "baseline": + groups.append(case.get("baseline_generation", {})) + for group in groups: + if set(group) != {"rollout", "recompute"} or any( + set(row) != checks or any(value is not True for value in row.values()) + for row in group.values() + ): + raise ValueError( + "Batch, chunk and actual baseline generation comparisons are mandatory" + ) + if set(case.get("artifacts", {})) != {"rollout", "recompute"}: + raise ValueError("Both independent full-vocabulary tensor artifacts are required") + _validate_report_artifacts( + report, + roles=("rollout", "recompute"), + expected_identity=expected_identity, + artifact_root=artifact_root, + ) + + +def checked_artifact_path(record, *, artifact_root=None): + """Rehash bytes before parsing; artifact paths cannot escape this attempt.""" + if not isinstance(record, dict) or not {"path", "sha256"} <= record.keys(): + raise ValueError("Tensor evidence requires a path and SHA256") + path = Path(record["path"]) + if not path.is_absolute(): + raise ValueError("Tensor artifact path must be absolute") + path = path.resolve(strict=True) + if artifact_root is not None and not path.is_relative_to(Path(artifact_root).resolve()): + raise ValueError("Tensor artifact escaped its current attempt") + with path.open("rb") as stream: + digest = hashlib.file_digest(stream, "sha256").hexdigest() + if digest != record["sha256"]: + raise ValueError("Tensor artifact content digest changed") + return path + + +def _validate_report_artifacts(report, *, roles, expected_identity, artifact_root): + identity = report["identity"] + if expected_identity is not None and identity != expected_identity: + raise ValueError("Model matrix source/environment/provider identity mismatch") + from rl_engine.testing.qwen3_next_binary import validate_binary_record + + binary = validate_binary_record( + report.get("provider_binary"), + source_tree=identity.get("source_tree"), + artifact_root=artifact_root, + ) + # Inputs may be the explicit frozen baseline shared by subsequent training + # runs. Their bytes are pinned separately; outputs must be in this attempt. + fixture = load_tensor_artifact(checked_artifact_path(report.get("fixture"))) + validate_fixture(fixture) + if fixture["content_sha256"] != report["fixture"].get("content_sha256"): + raise ValueError("Matrix frozen-input content identity mismatch") + baselines = {} + for length, record in fixture["baseline_artifacts"].items(): + baseline = load_tensor_artifact(checked_artifact_path(record)) + original_identity = baseline.get("metadata", {}).get("identity", {}) + if json_digest(original_identity) != fixture["baseline_identity"]: + raise ValueError("Baseline generation provenance changed") + if identity.get("weight_version") == "baseline" and original_identity != identity: + raise ValueError("Baseline weights/provider differ from the matrix") + baseline_request = worker_request( + L2Case(int(length), 4, "full"), + fixture, + role="rollout", + identity=original_identity, + generate=True, + ) + validate_model_artifact(baseline, baseline_request) + validate_native_worker_traces(baseline, baseline_request) + baselines[length] = baseline + worker_records = report.get("worker_results", {}) + if set(worker_records) != set(roles): + raise ValueError("Independent worker result artifacts are missing") + workers = {} + for role in roles: + worker = json.loads( + checked_artifact_path( + worker_records[role], + artifact_root=artifact_root, + ).read_text() + ) + if any( + worker.get(key) != value + for key, value in { + "status": "passed", + "role": role, + "identity": identity, + "fixture_sha256": fixture["content_sha256"], + "pid": report["processes"][role]["pid"], + "provider_binary": binary, + }.items() + ) or set(worker.get("cases", {})) != {case.case_id for case in case_matrix()}: + raise ValueError("Independent worker provenance or case inventory mismatch") + workers[role] = worker + for case in case_matrix(): + row = report["cases"][case.case_id] + outputs = {} + for role in roles: + record = row["artifacts"][role] + path = checked_artifact_path(record, artifact_root=artifact_root) + request = worker_request(case, fixture, role=role, identity=identity) + worker_record = workers[role]["cases"][case.case_id] + if worker_record != {**record, "request_sha256": request["request_sha256"]}: + raise ValueError("Worker and matrix refer to different model output artifacts") + outputs[role] = load_tensor_artifact(path) + if outputs[role].get("provider_binary") != binary: + raise ValueError("Model output used a different native CUDA provider") + validate_model_artifact(outputs[role], request) + validate_native_worker_traces(outputs[role], request, artifact_root=artifact_root) + reference_record = report["cases"][L2Case(case.prompt_length, 4, "full").case_id][ + "artifacts" + ][role] + reference = load_tensor_artifact( + checked_artifact_path(reference_record, artifact_root=artifact_root) + ) + actual = compare_batch_prefill(reference, outputs[role]) + if not all(actual.values()) or actual != row["batch_prefill"][role]: + raise ValueError("Batch/prefill tensor bytes contradict matrix acceptance") + if identity.get("weight_version") == "baseline": + actual = compare_batch_prefill(baselines[str(case.prompt_length)], outputs[role]) + if not all(actual.values()) or actual != row["baseline_generation"][role]: + raise ValueError("Generated baseline tensor bytes contradict matrix acceptance") + if len(roles) == 2: + actual = compare_artifacts(outputs["rollout"], outputs["recompute"]) + if not actual["passed"] or actual["comparisons"] != row["comparisons"]: + raise ValueError("Independent full-model tensor bytes contradict matrix acceptance") + + +def validate_scheduler_report(report, *, expected_identity=None, artifact_root=None): + expected_ids = [case.case_id for case in case_matrix()] + required = { + "schema_version": 1, + "status": "passed", + "raw_bit_comparison": True, + "scope": "qwen3_next_native_scheduler_only", + "case_ids": expected_ids, + "full_model_l2": "not_evaluated", + } + if any(report.get(key) != value for key, value in required.items()): + raise ValueError("Actual scheduler requires its complete native sixteen-case matrix") + if set(report.get("cases", {})) != set(expected_ids): + raise ValueError("Scheduler matrix omitted mandatory cases") + identity = report.get("identity", {}) + if identity.get("architecture_layers") != 48 or identity.get("topology") != { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1, + }: + raise ValueError("Scheduler gate must execute the complete TP4 model") + processes = report.get("processes", {}) + process = processes.get("rollout", {}) + if set(processes) != {"rollout"} or any( + ( + process.get("exit_code") != 0, + process.get("gpu_release_verified") is not True, + type(process.get("pid")) is not int, + process.get("pid", 0) <= 0, + ) + ): + raise ValueError("Scheduler process completion and memory release evidence missing") + checks = {"response_tokens", "logits", "logprobs", "layer_states"} + for row in report["cases"].values(): + if row.get("passed") is not True or set(row.get("artifacts", {})) != {"rollout"}: + raise ValueError("Scheduler case failed or has no native tensor artifact") + for field in ("batch_prefill", "baseline_generation"): + group = row.get(field, {}) + values = group.get("rollout", {}) + if any( + ( + set(group) != {"rollout"}, + set(values) != checks, + not all(value is True for value in values.values()), + ) + ): + raise ValueError("Scheduler batch/prefill/raw-bit comparisons are incomplete") + _validate_report_artifacts( + report, + roles=("rollout",), + expected_identity=expected_identity, + artifact_root=artifact_root, + ) diff --git a/rl_engine/testing/qwen3_next_layer_cases.json b/rl_engine/testing/qwen3_next_layer_cases.json new file mode 100644 index 000000000..7610bd7c4 --- /dev/null +++ b/rl_engine/testing/qwen3_next_layer_cases.json @@ -0,0 +1,122 @@ +{ + "schema_version": 1, + "gates": { + "gdn": { + "script": "scripts/qwen3_next_tp_gdn_check.py", + "output_option": "--output", + "scope": "tp4_gdn_layer0", + "groups": { + "cases": [ + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "prompt-gradient", + "replicated-norm-gradient", + "hf-load-export" + ] + } + }, + "attention": { + "script": "scripts/qwen3_next_tp_attention_check.py", + "output_option": "--output", + "scope": "tp4_full_attention_layer3", + "groups": { + "attention.cases": [ + "hf-load-export", + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "batch4-varlen-reorder", + "sixteen-token-decode", + "prompt-gradient", + "kv-pair-gradient", + "qk-norm-gradient" + ] + } + }, + "moe": { + "script": "scripts/qwen3_next_tp_moe_check.py", + "output_option": "--output", + "scope": "tp4_moe_block_layer0", + "groups": { + "moe.cases": [ + "hf-load-export-all512experts", + "routes-replicated-8", + "full-chunk-reorder-8", + "routes-replicated-64", + "full-chunk-reorder-64", + "routes-replicated-256", + "full-chunk-reorder-256", + "routes-replicated-1024", + "full-chunk-reorder-1024", + "training-forward", + "all-parameter-gradient", + "replicated-router-gradient" + ] + } + }, + "adapters": { + "script": "scripts/qwen3_next_adapter_check.py", + "output_option": "--out", + "scope": "gdn_engine_adapter_component", + "groups": { + "cases": [ + "batch1-length8", + "batch1-length64", + "batch1-length256", + "batch1-length1024", + "batch4-length8", + "batch4-length64", + "batch4-length256", + "batch4-length1024", + "mixed-prefill-decode16-reorder" + ] + }, + "fields": { + "prompt_gradient": "passed", + "hf_conv_roundtrip": "passed", + "batch_invariance_capability_registered": false + } + }, + "heads": { + "script": "scripts/qwen3_next_tp_head_check.py", + "output_option": "--output", + "scope": "tp4_embedding_lm_head_only", + "groups": { + "cases": [ + "hf-embedding-roundtrip", + "hf-lm-head-roundtrip", + "replicated-norm-gradient", + "nonzero-finite-embedding-head-gradient", + "embedding-repeat-100", + "batch-invariant-prompt8", + "batch-invariant-prompt64", + "batch-invariant-prompt256", + "batch-invariant-prompt1024", + "logprob-original-and-promoted-logits", + "entropy-interface" + ] + } + } + }, + "scheduler_case_ids": [ + "p0008-b1-full", + "p0008-b1-chunked", + "p0008-b4-full", + "p0008-b4-chunked", + "p0064-b1-full", + "p0064-b1-chunked", + "p0064-b4-full", + "p0064-b4-chunked", + "p0256-b1-full", + "p0256-b1-chunked", + "p0256-b4-full", + "p0256-b4-chunked", + "p1024-b1-full", + "p1024-b1-chunked", + "p1024-b4-full", + "p1024-b4-chunked" + ] +} diff --git a/rl_engine/testing/qwen3_next_operator_cases.json b/rl_engine/testing/qwen3_next_operator_cases.json new file mode 100644 index 000000000..5da204ee9 --- /dev/null +++ b/rl_engine/testing/qwen3_next_operator_cases.json @@ -0,0 +1,293 @@ +{ + "schema_version": 1, + "description": "Mandatory norm/core contracts; alternative-provider approximate comparisons are diagnostics only. Generated by scripts/qwen3_next_operator_cases.py; case changes require review before a frozen run.", + "suites": { + "norm": [ + "tests/check_qwen3_next_norm_providers.py::test_custom_op_has_distinct_native_and_cuda_paths", + "tests/check_qwen3_next_norm_providers.py::test_gdn_decode_provider_env_defaults_are_recorded", + "tests/check_qwen3_next_norm_providers.py::test_our_gated_op_is_batch_invariant", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_cuda]", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_native]", + "tests/test_qwen3_next_norm.py::test_bad_weight_shape_raises", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[16]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[1]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[2]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[32]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[48]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[64]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[8]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[128]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[2048]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_with_padding", + "tests/test_qwen3_next_norm.py::test_call_matches_forward", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[128]", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[2048]", + "tests/test_qwen3_next_norm.py::test_cuda_default_offset_preserves_plain_convention", + "tests/test_qwen3_next_norm.py::test_cuda_gated_backward_matches_autograd_golden", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_matches_golden_within_contract", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_bad_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_mismatched_gate", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_backward_uses_the_sigmoid_derivative", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_swish_is_an_alias_for_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_unit_weight_is_plain_norm_times_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_weight_offset_is_applied_in_fp32", + "tests/test_qwen3_next_norm.py::test_cuda_gated_wrapper_rejects_equal_numel_wrong_shape", + "tests/test_qwen3_next_norm.py::test_cuda_gated_zero_gate_zeroes_output", + "tests/test_qwen3_next_norm.py::test_cuda_offset_equals_explicit_fp32_weight", + "tests/test_qwen3_next_norm.py::test_cuda_offset_is_not_folded_through_bfloat16", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_backward_is_offset_aware", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_within_tolerance_of_golden", + "tests/test_qwen3_next_norm.py::test_deterministic_repeat", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype0]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype1]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype2]", + "tests/test_qwen3_next_norm.py::test_eps_inside_sqrt", + "tests/test_qwen3_next_norm.py::test_gated_batch_invariance_slice", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedHFOp]", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedOp]", + "tests/test_qwen3_next_norm.py::test_gated_conventions_diverge_in_low_precision", + "tests/test_qwen3_next_norm.py::test_gated_cuda_op_rejects_bad_activation_at_construction", + "tests/test_qwen3_next_norm.py::test_gated_extension_handles_empty_batch_and_nondefault_stream", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[dy_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[gate_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[rstd_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_shape]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_matches_hf_formula_fp32", + "tests/test_qwen3_next_norm.py::test_gated_shape_mismatch_raises", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_strict_matches_vllm_formula_fp32", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[128]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[2048]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_offset_applied_in_fp32_not_folded_into_bf16", + "tests/test_qwen3_next_norm.py::test_op_batch_invariance_on_device", + "tests/test_qwen3_next_norm.py::test_plain_reference_is_unchanged_by_the_offset_plumbing", + "tests/test_qwen3_next_norm.py::test_weight_offset_is_one", + "tests/test_qwen3_next_norm.py::test_zero_centred_cuda_constructor_rejects_missing_extension", + "tests/test_qwen3_next_norm.py::test_zero_centred_op_inherits_the_plain_reference", + "tests/test_qwen3_next_norm.py::test_zero_weight_is_identity_scaling" + ], + "core": [ + "tests/check_qwen3_next_attention.py::test_d256_backward_with_cached_prefix_matches_float64_formula", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[1024]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[256]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[64]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[8]", + "tests/check_qwen3_next_attention.py::test_d256_input_device_guard_and_nondefault_stream", + "tests/check_qwen3_next_attention.py::test_native_backward_rejects_malformed_probability_and_gradient_buffers", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[0]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[2]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_target_inputs_do_not_depend_on_companions", + "tests/check_qwen3_next_batch_invariance.py::test_triton_chunked_prefill_is_batch_invariant", + "tests/check_qwen3_next_conv_bridge.py::test_chunked_and_reordered_sequences_match", + "tests/check_qwen3_next_conv_bridge.py::test_empty_sequence_preserves_cache_and_gradients", + "tests/check_qwen3_next_conv_bridge.py::test_response_gradient_reaches_prompt_and_convolution_weight", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths0]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths1]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths2]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-4]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[1]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[4]", + "tests/check_qwen3_next_core_matrix.py::test_variable_lengths_empty_and_mixed_step_match_independent_sequences", + "tests/check_qwen3_next_forward.py::test_combine_has_fixed_route_order_and_differentiable_weights", + "tests/check_qwen3_next_forward.py::test_full_vocabulary_logprob_entropy_modes_and_gradient", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_fail_closed_on_the_tensor_descriptor_path", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[128]", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[512]", + "tests/check_qwen3_next_forward.py::test_logprob_nan_rejected_before_comparison", + "tests/check_qwen3_next_forward.py::test_moe_vjp_matches_independent_double_formula", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[1024-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[128-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-16]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-256]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-3072]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-37984]", + "tests/check_qwen3_next_forward.py::test_qwen_moe_actual_tp4_shapes_and_independent_training_forward", + "tests/check_qwen3_next_forward.py::test_route_weights_are_batch_invariant", + "tests/check_qwen3_next_forward.py::test_shared_linear_vjp_and_empty_tokens", + "tests/check_qwen3_next_forward.py::test_stable_route_tie_boundary_and_router_gradient", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_backward_matches_recomputed_recurrence_vjp", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_forward_is_provider_exact_and_does_not_mutate_inputs", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_keeps_prompt_state_gradient_through_response", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[False]", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[True]", + "tests/check_qwen3_next_gdn_bridge.py::test_initial_state_vjp_matches_provider_directional_difference", + "tests/check_qwen3_next_gdn_sequence.py::test_1024_token_chunk_continuation_is_bitwise_exact", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad0]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad1]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad2]", + "tests/check_qwen3_next_gdn_sequence.py::test_chunk_boundary_retains_prompt_and_initial_state_gradients", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths0]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths1]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths2]", + "tests/check_qwen3_next_gdn_sequence.py::test_reserved_and_duplicate_slots_are_rejected", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots0]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots2]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots3]", + "tests/check_qwen3_next_shared_core.py::test_independent_training_forward_matches_inference_and_retains_gradients", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[1024]", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[8]", + "tests/check_qwen3_next_shared_core.py::test_unimplemented_provider_profile_is_rejected" + ], + "diagnostics": [ + "tests/check_gdn_recurrent_golden.py::test_bf16_state_rounding_stays_within_fixed_fixture_bound", + "tests/check_gdn_recurrent_golden.py::test_conv_dim_first_false_matches_the_transposed_layout", + "tests/check_gdn_recurrent_golden.py::test_conv_forward_fp32_and_call_entry_points", + "tests/check_gdn_recurrent_golden.py::test_conv_golden_is_batch_invariant[False-None-state_dtype0]", + "tests/check_gdn_recurrent_golden.py::test_conv_golden_is_batch_invariant[False-None-state_dtype1]", + "tests/check_gdn_recurrent_golden.py::test_conv_golden_is_batch_invariant[False-silu-state_dtype0]", + "tests/check_gdn_recurrent_golden.py::test_conv_golden_is_batch_invariant[False-silu-state_dtype1]", + "tests/check_gdn_recurrent_golden.py::test_conv_golden_is_batch_invariant[True-None-state_dtype0]", + "tests/check_gdn_recurrent_golden.py::test_conv_golden_is_batch_invariant[True-None-state_dtype1]", + "tests/check_gdn_recurrent_golden.py::test_conv_golden_is_batch_invariant[True-silu-state_dtype0]", + "tests/check_gdn_recurrent_golden.py::test_conv_golden_is_batch_invariant[True-silu-state_dtype1]", + "tests/check_gdn_recurrent_golden.py::test_conv_null_block_id_is_skipped", + "tests/check_gdn_recurrent_golden.py::test_conv_output_bf16_cache_matches_rounded_product_path[17]", + "tests/check_gdn_recurrent_golden.py::test_conv_output_bf16_cache_matches_rounded_product_path[1]", + "tests/check_gdn_recurrent_golden.py::test_conv_output_matches_provider_with_fp32_cache[17]", + "tests/check_gdn_recurrent_golden.py::test_conv_output_matches_provider_with_fp32_cache[1]", + "tests/check_gdn_recurrent_golden.py::test_conv_output_matches_provider_with_fp32_cache[4]", + "tests/check_gdn_recurrent_golden.py::test_conv_output_matches_provider_with_fp32_cache[64]", + "tests/check_gdn_recurrent_golden.py::test_conv_provider_preserves_bf16_product_cancellation", + "tests/check_gdn_recurrent_golden.py::test_conv_rejects_unknown_activation_and_bad_shapes", + "tests/check_gdn_recurrent_golden.py::test_conv_state_update_is_bitwise_exact[17]", + "tests/check_gdn_recurrent_golden.py::test_conv_state_update_is_bitwise_exact[1]", + "tests/check_gdn_recurrent_golden.py::test_conv_state_update_is_bitwise_exact[4]", + "tests/check_gdn_recurrent_golden.py::test_conv_state_update_is_bitwise_exact[64]", + "tests/check_gdn_recurrent_golden.py::test_golden_is_batch_invariant[state_dtype0]", + "tests/check_gdn_recurrent_golden.py::test_golden_is_batch_invariant[state_dtype1]", + "tests/check_gdn_recurrent_golden.py::test_golden_matches_packed_decode_provider[bf16-17]", + "tests/check_gdn_recurrent_golden.py::test_golden_matches_packed_decode_provider[bf16-1]", + "tests/check_gdn_recurrent_golden.py::test_golden_matches_packed_decode_provider[bf16-4]", + "tests/check_gdn_recurrent_golden.py::test_golden_matches_packed_decode_provider[bf16-64]", + "tests/check_gdn_recurrent_golden.py::test_golden_matches_packed_decode_provider[fp32-17]", + "tests/check_gdn_recurrent_golden.py::test_golden_matches_packed_decode_provider[fp32-1]", + "tests/check_gdn_recurrent_golden.py::test_golden_matches_packed_decode_provider[fp32-4]", + "tests/check_gdn_recurrent_golden.py::test_golden_matches_packed_decode_provider[fp32-64]", + "tests/check_gdn_recurrent_golden.py::test_null_block_id_is_skipped_by_both", + "tests/check_gdn_recurrent_golden.py::test_recurrent_call_matches_forward", + "tests/check_gdn_recurrent_golden.py::test_recurrent_forward_fp32_widens_the_state[state_dtype0]", + "tests/check_gdn_recurrent_golden.py::test_recurrent_forward_fp32_widens_the_state[state_dtype1]", + "tests/check_gdn_recurrent_golden.py::test_recurrent_without_in_kernel_l2norm_differs", + "tests/check_qwen3_next_batch_invariance.py::test_flashinfer_chunked_prefill_deviation_stays_rounding_scale", + "tests/check_qwen3_next_batch_invariance.py::test_triton_chunked_prefill_split_matches_one_pass[100]", + "tests/check_qwen3_next_batch_invariance.py::test_triton_chunked_prefill_split_matches_one_pass[128]", + "tests/check_qwen3_next_batch_invariance.py::test_triton_chunked_prefill_split_matches_one_pass[192]", + "tests/check_qwen3_next_batch_invariance.py::test_triton_chunked_prefill_split_matches_one_pass[64]", + "tests/check_qwen3_next_norm_providers.py::test_ours_tracks_each_vllm_path_within_bounds[forward_cuda]", + "tests/check_qwen3_next_norm_providers.py::test_ours_tracks_each_vllm_path_within_bounds[forward_native]", + "tests/check_qwen3_next_norm_providers.py::test_vllm_paths_disagree_only_within_bounds[dtype0-0.02-0.05]", + "tests/check_qwen3_next_norm_providers.py::test_vllm_paths_disagree_only_within_bounds[dtype1-1e-05-1.0]" + ] + } +} diff --git a/rl_engine/testing/qwen3_next_rl_fixture.py b/rl_engine/testing/qwen3_next_rl_fixture.py new file mode 100644 index 000000000..3d9cbaba8 --- /dev/null +++ b/rl_engine/testing/qwen3_next_rl_fixture.py @@ -0,0 +1,150 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Frozen inputs for real VIME policy-loss/optimizer recovery acceptance.""" + +import hashlib +import json +from dataclasses import dataclass + +import torch + +from rl_engine.testing.tensor_identity import assert_tensor_bitwise_equal + +POLICY_SETTINGS = { + "loss_type": "policy_loss", + "advantage_estimator": "grpo", + "use_rollout_logprobs": True, + "disable_compute_advantages_and_returns": True, + "normalize_advantages": False, + "eps_clip": 0.2, + "eps_clip_high": 0.2, + "eps_clip_c": None, + "entropy_coef": 0.0, + "kl_coef": 0.0, + "kl_loss_coef": 0.0, + "opd_kl_coef": 0.0, + "use_kl_loss": False, + "use_tis": False, + "use_opsm": False, + "get_mismatch_metrics": False, + "custom_pg_loss_reducer_function_path": None, + "global_batch_size": 4, + "micro_batch_size": 1, + "use_dynamic_batch_size": False, + "rollout_temperature": 1.0, + "rollout_top_p": 1.0, + "rollout_top_k": -1, + "seed": 1234, +} +OPTIMIZER_SETTINGS = { + "optimizer": "adam", + "lr": 1e-6, + "lr_decay_style": "constant", + "weight_decay": 0.1, + "adam_beta1": 0.9, + "adam_beta2": 0.98, + "adam_eps": 1e-8, + "clip_grad": 1.0, + "optimizer_cpu_offload": True, + "optimizer_offload_fraction": 1.0, + "overlap_cpu_optimizer_d2h_h2d": False, + "use_precision_aware_optimizer": True, + "use_distributed_optimizer": True, + "use_stateless_adam": False, + "no_save_optim": False, + "no_save_rng": False, +} + + +def _tensor_digest(tensor): + value = tensor.detach().cpu().contiguous() + digest = hashlib.sha256() + digest.update(str((str(value.dtype), tuple(value.shape))).encode()) + digest.update(value.reshape(-1).view(torch.uint8).numpy().tobytes()) + return digest.hexdigest() + + +@dataclass(frozen=True) +class PolicyFixture: + tokens: torch.Tensor + old_logprobs: torch.Tensor + baseline_identity: str + content_sha256: str + + @classmethod + def freeze(cls, tokens, old_logprobs, *, baseline_identity): + if tokens.shape != (4, 80) or tokens.dtype != torch.int64: + raise ValueError("Policy fixture requires four int64 prompt64+response16 samples") + if old_logprobs.shape != (4, 16) or old_logprobs.dtype != torch.float32: + raise ValueError("Baseline selected logprobs must be FP32 [4, 16]") + if not torch.isfinite(old_logprobs).all() or old_logprobs.requires_grad: + raise ValueError("Baseline logprobs must be finite, frozen rollout values") + if not baseline_identity or not isinstance(baseline_identity, str): + raise ValueError("A verified baseline run/content identity is required") + if bool(((tokens < 0) | (tokens >= 151936)).any()): + raise ValueError("Token ID is outside the official Qwen3-Next vocabulary") + if torch.unique(tokens, dim=0).shape[0] != 4: + raise ValueError("The four policy samples must be distinct") + tokens = tokens.detach().cpu().clone() + old_logprobs = old_logprobs.detach().cpu().clone() + digest = cls._identity(tokens, old_logprobs, baseline_identity) + return cls(tokens, old_logprobs, baseline_identity, digest) + + @staticmethod + def _identity(tokens, old_logprobs, baseline_identity): + payload = { + "tokens": _tensor_digest(tokens), + "old_logprobs": _tensor_digest(old_logprobs), + "baseline": baseline_identity, + "advantages": [1.0, -0.5, 0.75, -0.25], + "response_mask": [1] * 16, + "sample_order": [[0], [1], [2], [3]], + "policy": POLICY_SETTINGS, + "optimizer": OPTIMIZER_SETTINGS, + } + return hashlib.sha256(json.dumps(payload, sort_keys=True).encode()).hexdigest() + + def validate(self): + if ( + self._identity(self.tokens, self.old_logprobs, self.baseline_identity) + != self.content_sha256 + ): + raise ValueError("Frozen policy fixture was modified") + + def verify_initial_recompute(self, logprobs): + self.validate() + assert_tensor_bitwise_equal( + logprobs.cpu(), self.old_logprobs, name="baseline policy logprobs" + ) + + def batch(self, sample_ids, *, device): + """Produce native VIME loss fields; no rollout hidden/state tensors are used.""" + self.validate() + if not sample_ids or any(type(i) is not int or i not in range(4) for i in sample_ids): + raise ValueError("Policy sample IDs must be nonempty integers in [0, 4)") + if len(set(sample_ids)) != len(sample_ids): + raise ValueError("A microbatch cannot duplicate policy samples") + advantages = [1.0, -0.5, 0.75, -0.25] + return { + "unconcat_tokens": [self.tokens[i].to(device=device) for i in sample_ids], + "rollout_log_probs": [self.old_logprobs[i].to(device=device) for i in sample_ids], + "advantages": [ + torch.full((16,), advantages[i], dtype=torch.float32, device=device) + for i in sample_ids + ], + "loss_masks": [torch.ones(16, dtype=torch.int32, device=device) for _ in sample_ids], + "rollout_mask_sums": torch.full( + (len(sample_ids),), 16, dtype=torch.float32, device=device + ), + "total_lengths": [80] * len(sample_ids), + "response_lengths": [16] * len(sample_ids), + "partition": list(sample_ids), + } + + +def require_policy_configuration(args): + """Reject drift rather than changing an already constructed training configuration.""" + for name, expected in {**POLICY_SETTINGS, **OPTIMIZER_SETTINGS}.items(): + if not hasattr(args, name) or getattr(args, name) != expected: + raise ValueError(f"Policy acceptance requires {name}={expected!r}") diff --git a/scripts/qwen3_next_adapter_check.py b/scripts/qwen3_next_adapter_check.py new file mode 100644 index 000000000..0705abf54 --- /dev/null +++ b/scripts/qwen3_next_adapter_check.py @@ -0,0 +1,321 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Four-rank real VIME/vLLM GDN adapter acceptance, scoped below complete-model L2.""" + +import argparse +import json +import os +from pathlib import Path +from types import SimpleNamespace + +import torch +import torch.distributed as dist + +from rl_engine.testing.tensor_identity import assert_tensor_bitwise_equal as exact + + +def run(checkpoint, output): + from megatron.core import mpu + from megatron.core.packed_seq_params import PackedSeqParams + from megatron.core.transformer.spec_utils import build_module + from megatron.core.transformer.transformer_config import TransformerConfig + from vime.backends.megatron_utils import hf_to_megatron as load_api + from vime.backends.megatron_utils import megatron_to_hf as export_api + from vime.backends.megatron_utils.hf_to_megatron.common import ( + SafetensorReader, + shard_mcore_tensor, + ) + from vime.backends.megatron_utils.update_weight.common import all_gather_param + from vllm.config.vllm import set_current_vllm_config + from vllm.distributed import init_distributed_environment, initialize_model_parallel + from vllm.engine.arg_utils import EngineArgs + from vllm.forward_context import set_forward_context + from vllm.model_executor.layers.mamba.mamba_utils import is_conv_state_dim_first + from vllm.model_executor.model_loader.weight_utils import default_weight_loader + from vllm.v1.attention.backend import CommonAttentionMetadata + + from rl_engine.integrations.qwen3_next_vime import get_qwen3_next_shared_spec + from rl_engine.integrations.qwen3_next_vllm import SharedGDNMetadataBuilder, SharedQwenGDN + + rank, local_rank = int(os.environ["RANK"]), int(os.environ["LOCAL_RANK"]) + torch.cuda.set_device(local_rank) + dist.init_process_group("nccl") + if dist.get_world_size() != 4: + raise ValueError("GDN engine adapters require exactly four ranks") + mpu.initialize_model_parallel(tensor_model_parallel_size=4) + # vLLM 0.30.0's initialize_model_parallel reads get_current_vllm_config(), so the + # engine config must exist before the vLLM process groups are created. + vconfig = EngineArgs( + model=str(checkpoint), + skip_tokenizer_init=True, + dtype="bfloat16", + tensor_parallel_size=4, + max_model_len=2048, + max_num_seqs=4, + enforce_eager=True, + enable_prefix_caching=False, + mamba_cache_dtype="bfloat16", + mamba_ssm_cache_dtype="float32", + distributed_executor_backend="external_launcher", + additional_config={"gdn_prefill_backend": "triton"}, + ).create_engine_config() + with set_current_vllm_config(vconfig): + init_distributed_environment(4, rank, "env://", local_rank, "nccl") + initialize_model_parallel(4) + args = SimpleNamespace( + hf_checkpoint=str(checkpoint), + num_experts=512, + sequence_parallel=False, + hidden_size=2048, + num_attention_heads=16, + num_query_groups=2, + kv_channels=256, + ) + config = TransformerConfig( + num_layers=48, + hidden_size=2048, + num_attention_heads=16, + num_query_groups=2, + kv_channels=256, + ffn_hidden_size=5120, + num_moe_experts=512, + moe_ffn_hidden_size=512, + moe_router_topk=10, + moe_shared_expert_intermediate_size=512, + tensor_model_parallel_size=4, + expert_tensor_parallel_size=4, + pipeline_model_parallel_size=1, + context_parallel_size=1, + expert_model_parallel_size=1, + sequence_parallel=False, + attention_dropout=0, + hidden_dropout=0, + params_dtype=torch.bfloat16, + bf16=True, + normalization="RMSNorm", + add_bias_linear=False, + ) + spec = get_qwen3_next_shared_spec(args, config) + training = build_module( + spec.layer_specs[0].submodules.self_attention, config=config, layer_number=1 + ) + reader = SafetensorReader(checkpoint) + prefix = "module.module.decoder.layers.0.self_attention." + with torch.no_grad(): + for name, parameter in training.named_parameters(): + full_name = prefix + name + full = load_api._LOADERS["qwen3_next"](full_name, reader, training.hf_config) + local = shard_mcore_tensor(full_name, full, parameter) + if local.shape != parameter.shape: + raise ValueError(f"Incorrect training shard shape: {full_name}") + parameter.copy_(local.to(device=parameter.device)) + conv_name = prefix + "linear_attn.conv1d.weight" + conv = all_gather_param(conv_name, training.linear_attn.conv1d.weight) + converted = export_api.convert_qwen3_next_to_hf(args, conv_name, conv) + exact(converted[0][1].cpu(), reader.get_tensor("model.layers.0.linear_attn.conv1d.weight")) + + with set_current_vllm_config(vconfig): + previous_dtype = torch.get_default_dtype() + torch.set_default_dtype(torch.bfloat16) + try: + rollout = SharedQwenGDN( + vconfig.model_config.hf_text_config, + vconfig, + prefix="model.layers.0.linear_attn", + gqa_interleaved_layout=True, + ).cuda() + finally: + torch.set_default_dtype(previous_dtype) + for name, parameter in rollout.named_parameters(): + value = reader.get_tensor(f"model.layers.0.linear_attn.{name}") + getattr(parameter, "weight_loader", default_weight_loader)(parameter, value) + exact(parameter, dict(training.linear_attn.named_parameters())[name], name=name) + cache_spec = rollout.get_kv_cache_spec(vconfig) + builder = SharedGDNMetadataBuilder( + cache_spec, [rollout.prefix], vconfig, torch.device("cuda") + ) + + def initial_cache(): + # Deliberately dirty slots prove the metadata resets a new prompt. + return tuple( + torch.full((8, *shape), 0.125, dtype=dtype, device="cuda") + for shape, dtype in zip(rollout.get_state_shape(), rollout.get_state_dtype()) + ) + + def step(hidden, lengths, computed, slots): + cu = torch.tensor([0, *torch.tensor(lengths).cumsum(0).tolist()], dtype=torch.int32) + seq = torch.tensor(lengths, dtype=torch.int32) + torch.tensor( + computed, dtype=torch.int32 + ) + common = CommonAttentionMetadata( + query_start_loc=cu.cuda(), + query_start_loc_cpu=cu, + seq_lens=seq.cuda(), + num_reqs=len(lengths), + num_actual_tokens=sum(lengths), + max_query_len=max(lengths), + max_seq_len=int(seq.max()), + block_table_tensor=torch.tensor(slots, dtype=torch.int32, device="cuda")[:, None], + slot_mapping=torch.zeros(sum(lengths), dtype=torch.int64, device="cuda"), + ) + metadata = builder.build(0, common) + with set_forward_context({rollout.prefix: metadata}, vconfig): + return rollout(hidden_states=training.input_layernorm(hidden)) + + checked = [] + generator = torch.Generator(device="cuda").manual_seed(713) + for batch in (1, 4): + for length in (8, 64, 256, 1024): + hidden = torch.randn( + batch * length, 2048, generator=generator, device="cuda", dtype=torch.bfloat16 + ) + cu = torch.arange(batch + 1, dtype=torch.int32, device="cuda") * length + packed = PackedSeqParams( + qkv_format="thd", + cu_seqlens_q=cu, + cu_seqlens_kv=cu, + max_seqlen_q=length, + max_seqlen_kv=length, + ) + with torch.no_grad(): + train_out, _ = training(hidden.unsqueeze(1), None, packed_seq_params=packed) + rollout.kv_cache = initial_cache() + whole = step( + hidden.clone(), [length] * batch, [0] * batch, list(range(1, batch + 1)) + ) + exact(whole, train_out[:, 0], name=f"VIME/vLLM B{batch} L{length}") + final = tuple(state.clone() for state in rollout.kv_cache) + for cut in (1, 63, 64, 65, 100, 528, 576): + if cut >= length: + continue + rollout.kv_cache = initial_cache() + pieces = [[] for _ in range(batch)] + for lo, hi in ((0, cut), (cut, length)): + order = list(range(batch)) if lo == 0 else list(reversed(range(batch))) + rows = [ + row + for seq in order + for row in range(seq * length + lo, seq * length + hi) + ] + part = step( + hidden[rows], + [hi - lo] * batch, + [lo] * batch, + [seq + 1 for seq in order], + ) + for position, seq in enumerate(order): + pieces[seq].append( + part[position * (hi - lo) : (position + 1) * (hi - lo)] + ) + exact( + torch.cat([torch.cat(parts) for parts in pieces]), + whole, + name=f"chunk cut={cut}", + ) + for current, expected in zip(rollout.kv_cache, final): + exact(current, expected, name="owned rollout cache") + checked.append(f"batch{batch}-length{length}") + + # Exercise a fresh one-token prompt in the same real scheduler batch as + # prefill requests, then sixteen reordered decode steps on owned caches. + prompt_lengths = [1, 64, 256, 1024] + lengths = [length + 16 for length in prompt_lengths] + sequences = [ + torch.randn(length, 2048, generator=generator, device="cuda", dtype=torch.bfloat16) + for length in lengths + ] + complete = torch.cat(sequences) + cu = torch.tensor( + [0, *torch.tensor(lengths).cumsum(0).tolist()], device="cuda", dtype=torch.int32 + ) + packed = PackedSeqParams( + qkv_format="thd", + cu_seqlens_q=cu, + cu_seqlens_kv=cu, + max_seqlen_q=max(lengths), + max_seqlen_kv=max(lengths), + ) + with torch.no_grad(): + training_complete, _ = training(complete.unsqueeze(1), None, packed_seq_params=packed) + rollout.kv_cache = initial_cache() + whole = step(complete, lengths, [0] * 4, [1, 2, 3, 4]) + exact(whole, training_complete[:, 0], name="mixed VIME/vLLM complete") + final = tuple(state.clone() for state in rollout.kv_cache) + rollout.kv_cache = initial_cache() + first = step( + torch.cat([value[:length] for value, length in zip(sequences, prompt_lengths)]), + prompt_lengths, + [0] * 4, + [1, 2, 3, 4], + ) + pieces = [[part] for part in first.split(prompt_lengths)] + for position in range(16): + order = [3, 1, 0, 2] if position % 2 else [2, 0, 3, 1] + positions = [length + position for length in prompt_lengths] + outputs = step( + torch.cat( + [ + sequences[index][positions[index] : positions[index] + 1] + for index in order + ] + ), + [1] * 4, + [prompt_lengths[index] + position for index in order], + [index + 1 for index in order], + ) + for index, value in zip(order, outputs.split(1)): + pieces[index].append(value) + exact( + torch.cat([torch.cat(parts) for parts in pieces]), + whole, + name="sixteen decode steps", + ) + for current, expected in zip(rollout.kv_cache, final): + exact(current, expected, name="mixed owned rollout cache") + checked.append("mixed-prefill-decode16-reorder") + + hidden = torch.randn( + 8, 1, 2048, generator=generator, device="cuda", dtype=torch.bfloat16 + ).requires_grad_() + cu = torch.tensor([0, 8], device="cuda", dtype=torch.int32) + packed = PackedSeqParams( + qkv_format="thd", cu_seqlens_q=cu, cu_seqlens_kv=cu, max_seqlen_q=8, max_seqlen_kv=8 + ) + value, _ = training(hidden, None, packed_seq_params=packed) + value[4:].float().square().sum().backward() + if hidden.grad is None or not all( + (torch.isfinite(hidden.grad).all(), bool(hidden.grad[:4].abs().max() > 0)) + ): + raise AssertionError("Actual VIME response loss lost finite nonzero prompt gradients") + grads = [ + parameter.grad for parameter in training.parameters() if parameter.grad is not None + ] + if not grads or any(not torch.isfinite(grad).all() for grad in grads): + raise AssertionError("Actual VIME GDN parameter gradients must be finite") + from rl_engine.integrations.qwen3_next_binary import imported_provider_identity + + result = { + "status": "passed", + "scope": "gdn_engine_adapter_component", + "rank": rank, + "provider_binary": imported_provider_identity(), + "cases": checked, + "prompt_gradient": "passed", + "hf_conv_roundtrip": "passed", + "full_model_l2": "not_evaluated", + "batch_invariance_capability_registered": False, + "conv_dim_first": is_conv_state_dim_first(), + } + output.mkdir(parents=True, exist_ok=True) + (output / f"rank-{rank}.json").write_text(json.dumps(result, indent=2) + "\n") + dist.barrier() + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--checkpoint", type=Path, required=True) + parser.add_argument("--out", type=Path, required=True) + args = parser.parse_args() + run(args.checkpoint, args.out) diff --git a/scripts/qwen3_next_chain_report.py b/scripts/qwen3_next_chain_report.py new file mode 100644 index 000000000..df01bee54 --- /dev/null +++ b/scripts/qwen3_next_chain_report.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Write the WS1 chain-gate report for a finished Qwen3-Next chain. + + python scripts/qwen3_next_chain_report.py --last --out chain-report.json + +Follows ``previous`` from the given run back to the ``l2`` stage, reads every +passed stage's L2 matrix (``baseline`` from ``l2``, ``update1``/``update2`` +from ``train1``/``train2``, ``reload`` from ``train``) and the hash-checked case +artifacts it names, and writes ``rl_engine.kernels.gtest.qwen3_next_chain_report``'s +report. Exits 1 when the chain did not pass. +""" + +import argparse +import json +import sys +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT)) + +from rl_engine.kernels.gtest.qwen3_next_chain_report import build_report # noqa: E402 +from rl_engine.kernels.gtest.tolerance import load_contract # noqa: E402 +from rl_engine.testing.qwen3_next_l2 import ( # noqa: E402 + checked_artifact_path, + load_tensor_artifact, +) + +VERSION_OF_STAGE = {"l2": "baseline", "train1": "update1", "train2": "update2", "train": "reload"} + + +def chain_runs(last): + runs, run = [], Path(last).resolve() + while run is not None: + manifest = json.loads((run / "run.json").read_text()) + if manifest["stage"] in VERSION_OF_STAGE: + runs.append((manifest, run)) + if manifest["stage"] == "l2": + break + run = Path(manifest["previous"]) if manifest.get("previous") else None + if not runs or runs[-1][0]["stage"] != "l2": + raise SystemExit("The chain does not lead back to an l2 run") + commits = {manifest["source_commit"] for manifest, _ in runs} + if len(commits) != 1: + raise SystemExit(f"The chain mixes source commits: {sorted(commits)}") + return list(reversed(runs)) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--last", type=Path, required=True, help="last passed stage run") + parser.add_argument("--out", type=Path, required=True) + args = parser.parse_args() + matrices, artifacts = {}, {} + gpu_name = None + for manifest, run in chain_runs(args.last): + result = json.loads((run / "result.json").read_text()) + if result.get("status") != "passed": + raise SystemExit(f"{manifest['stage']} did not pass") + attempt = run / "attempts" / result["attempt"] + matrix = json.loads((run / result["evidence"]["l2_matrix"]["path"]).read_text()) + version = VERSION_OF_STAGE[manifest["stage"]] + matrices[version] = matrix + artifacts[version] = { + case_id: { + role: load_tensor_artifact(checked_artifact_path(record, artifact_root=attempt)) + for role, record in matrix["cases"][case_id]["artifacts"].items() + } + for case_id in matrix["case_ids"] + } + environment = attempt / "environment.json" + if gpu_name is None and environment.is_file(): + gpu_name = json.loads(environment.read_text()).get("gpu_name") + identity = manifest["checkpoint_identity"] + report = build_report( + matrices, + artifacts, + contract=load_contract(), + measured_commit=manifest["source_commit"], + weight_source=f"Qwen/Qwen3-Next-80B-A3B-Instruct@{identity['revision']}", + weight_hash=identity["expected_content_hash"], + device="cuda", + gpu_name=gpu_name, + compute_capability=None, + ) + args.out.parent.mkdir(parents=True, exist_ok=True) + args.out.write_text(json.dumps(report, indent=2, sort_keys=True) + "\n") + print( + f"chain passed={report['passed']} first_drift={report['first_drift']} " + f"family={report['first_drift_family']} cells={len(report['cells'])}" + ) + if not report["passed"]: + raise SystemExit(1) + + +if __name__ == "__main__": + main() diff --git a/scripts/qwen3_next_checkpoint.py b/scripts/qwen3_next_checkpoint.py new file mode 100644 index 000000000..2d3e9036a --- /dev/null +++ b/scripts/qwen3_next_checkpoint.py @@ -0,0 +1,312 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Publish and recover complete all-rank checkpoints on the shared filesystem. + +Training owns serialization and barriers. This module never loads tensor files; +all four ranks must finish model, optimizer, RNG and progress before publishing. +""" + +import json +import os +import shutil +from pathlib import Path + +from qwen3_next_contract import atomic_json +from qwen3_next_runtime import file_digest + +ROLES = frozenset(("model", "optimizer", "rng", "progress")) + + +def _sync_directory(path): + fd = os.open(path, os.O_RDONLY | os.O_DIRECTORY) + try: + os.fsync(fd) + finally: + os.close(fd) + + +def _file(root, relative): + relative = Path(relative) + if relative.is_absolute() or ".." in relative.parts: + raise ValueError("Checkpoint file must be relative to its checkpoint directory") + path = root / relative + if path.is_symlink() or not path.resolve().is_relative_to(root.resolve()) or not path.is_file(): + raise ValueError(f"Missing or external checkpoint file: {relative}") + return path + + +def write_rank_manifest(staging, *, rank, world_size, identity, step, sample_position, files): + staging = Path(staging) + if world_size != 4 or not 0 <= rank < world_size or step < 0 or sample_position < 0: + raise ValueError("Checkpoint requires four ranks and nonnegative progress") + if staging.suffix != ".partial" or (staging / "COMPLETE.json").exists(): + raise ValueError("Rank output requires an unpublished .partial checkpoint") + if set(files) != ROLES or any(not paths for paths in files.values()): + raise ValueError("Every rank must save model, optimizer, RNG and progress") + records = {} + seen = set() + for role, paths in files.items(): + records[role] = [] + for relative in paths: + if str(relative) in seen: + raise ValueError("A checkpoint file cannot fulfill multiple state roles") + seen.add(str(relative)) + path = _file(staging, relative) + with path.open("rb") as stream: + os.fsync(stream.fileno()) + records[role].append( + { + "path": str(relative), + "size": path.stat().st_size, + "sha256": file_digest(path), + } + ) + manifest = { + "schema_version": 1, + "rank": rank, + "world_size": world_size, + "identity": identity, + "step": step, + "sample_position": sample_position, + "files": records, + } + atomic_json(staging / f"rank-{rank}.manifest.json", manifest) + return manifest + + +def _validate_ranks(root, *, world_size, identity, verify_files=True): + if world_size != 4: + raise ValueError("Checkpoint topology must use four ranks") + manifests = [] + used_paths = set() + progress = None + for rank in range(world_size): + manifest = json.loads((root / f"rank-{rank}.manifest.json").read_text()) + if (manifest.get("schema_version"), manifest.get("rank"), manifest.get("world_size")) != ( + 1, + rank, + world_size, + ): + raise ValueError("Checkpoint rank topology mismatch") + if manifest.get("identity") != identity: + raise ValueError("Checkpoint model/provider/environment identity mismatch") + current = (manifest.get("step"), manifest.get("sample_position")) + if any( + not isinstance(value, int) or isinstance(value, bool) or value < 0 for value in current + ): + raise ValueError("Invalid checkpoint progress") + if progress is not None and current != progress: + raise ValueError("Checkpoint ranks have different progress") + progress = current + files = manifest.get("files", {}) + if set(files) != ROLES or any(not paths for paths in files.values()): + raise ValueError("Checkpoint omits required optimizer/RNG/model/progress state") + for records in files.values(): + for record in records: + if record["path"] in used_paths: + raise ValueError("Checkpoint ranks must own distinct state files") + used_paths.add(record["path"]) + path = _file(root, record["path"]) + if path.stat().st_size != record["size"]: + raise ValueError(f"Checkpoint state size mismatch: {record['path']}") + if verify_files and file_digest(path) != record["sha256"]: + raise ValueError(f"Checkpoint state checksum mismatch: {record['path']}") + manifests.append(manifest) + return manifests + + +def publish_checkpoint(staging, destination, *, world_size, identity): + staging, destination = Path(staging), Path(destination) + if ( + staging.suffix != ".partial" + or destination.suffix == ".partial" + or destination.name.startswith(".") + ): + raise ValueError("Publish from a .partial directory to a visible completed directory") + if staging.parent.resolve() != destination.parent.resolve() or destination.exists(): + raise ValueError("Checkpoint publication needs a new sibling destination") + manifests = _validate_ranks(staging, world_size=world_size, identity=identity) + complete = { + "schema_version": 1, + "status": "complete", + "world_size": world_size, + "identity": identity, + "step": manifests[0]["step"], + "sample_position": manifests[0]["sample_position"], + "rank_manifests": { + str(rank): file_digest(staging / f"rank-{rank}.manifest.json") + for rank in range(world_size) + }, + } + atomic_json(staging / "COMPLETE.json", complete) + # Sync nested directory entries as well as file contents before publication. + directories = sorted( + (path for path in staging.rglob("*") if path.is_dir()), + key=lambda path: len(path.parts), + reverse=True, + ) + for directory in directories: + _sync_directory(directory) + _sync_directory(staging) + staging.rename(destination) + _sync_directory(destination.parent) + atomic_json( + destination.parent / "LATEST.json", + { + "path": destination.name, + "step": complete["step"], + "complete_sha256": file_digest(destination / "COMPLETE.json"), + }, + ) + return complete + + +def validate_checkpoint(path, expected_identity, *, verify_files=True): + """Validate a published checkpoint's markers, manifests and files. + + ``verify_files=False`` checks every state file's presence and size but not its + content digest; callers use it where the content is verified anyway when the + files are read (the native restore compares every loaded tensor against the + saved digests), so a 1.1 TB checkpoint is not rehashed before each phase. + """ + path = Path(path) + if path.suffix == ".partial" or path.name.startswith("."): + raise ValueError("Unpublished checkpoint cannot be loaded") + complete = json.loads((path / "COMPLETE.json").read_text()) + if complete.get("schema_version") != 1 or complete.get("status") != "complete": + raise ValueError("Checkpoint has no supported completion marker") + if complete.get("identity") != expected_identity: + raise ValueError("Checkpoint model/provider/environment identity mismatch") + manifests = _validate_ranks( + path, + world_size=complete["world_size"], + identity=expected_identity, + verify_files=verify_files, + ) + if complete.get("rank_manifests") != { + str(rank): file_digest(path / f"rank-{rank}.manifest.json") for rank in range(4) + }: + raise ValueError("Checkpoint rank manifest checksum mismatch") + if (complete.get("step"), complete.get("sample_position")) != ( + manifests[0]["step"], + manifests[0]["sample_position"], + ): + raise ValueError("Completion marker progress mismatch") + return complete + + +def resume_interrupted_publications(root, expected_identity): + """Publish every fully written ``.partial`` checkpoint a killed job left unpublished. + + A preempted job can die after all four ranks wrote their files and manifests + but before rank 0 validated and renamed the directory. Such a directory is + publishable as is: publication rehashes every file against the manifests, + so an incomplete or damaged one is left for the normal retirement path. + Returns journal recovery records. + """ + root = Path(root) + records = [] + for staging in sorted(root.glob("*.partial")): + if not staging.is_dir() or staging.is_symlink() or (staging / "COMPLETE.json").exists(): + continue + marker = staging / "STAGING.json" + if not marker.is_file(): + continue + metadata = json.loads(marker.read_text()) + if metadata.get("identity") != expected_identity or metadata.get("status") != "staging": + continue + if not all((staging / f"rank-{rank}.manifest.json").is_file() for rank in range(4)): + continue + destination = staging.with_suffix("") + if destination.exists(): + continue + try: + complete = publish_checkpoint( + staging, destination, world_size=4, identity=expected_identity + ) + except (OSError, ValueError, KeyError) as exc: + records.append( + { + "reason": "interrupted_publication_not_resumable", + "staging": staging.name, + "error": str(exc)[:300], + } + ) + continue + records.append( + { + "reason": "interrupted_publication_resumed", + "checkpoint": destination.name, + "step": complete["step"], + } + ) + return records + + +def newest_complete_checkpoint(root, expected_identity, *, verify_files=True): + """Return a recovery record, retaining rejected and interrupted candidates.""" + root = Path(root) + candidates, rejected, interrupted = [], [], [] + for path in sorted(root.iterdir()): + if not path.is_dir(): + continue + if path.suffix == ".partial" or path.name.startswith("."): + interrupted.append(path.name) + continue + try: + complete = validate_checkpoint(path, expected_identity, verify_files=verify_files) + except (OSError, ValueError, KeyError) as exc: + rejected.append({"path": path.name, "reason": str(exc)}) + else: + candidates.append((complete["step"], path, complete)) + if not candidates and rejected: + raise ValueError(f"No valid published checkpoint remains: {rejected}") + chosen = max(candidates, key=lambda item: (item[0], item[1].name)) if candidates else None + return { + "checkpoint": str(chosen[1]) if chosen else None, + "step": chosen[0] if chosen else None, + "sample_position": chosen[2]["sample_position"] if chosen else None, + "rejected": rejected, + "interrupted": interrupted, + } + + +def require_checkpoint_disk_space( + root, *, checkpoint_bytes, export_bytes, retained_complete_bytes=0, headroom_bytes=16 * 1024**3 +): + """Budget last+next checkpoint and exports before serializing, without deletion. + + checkpoint_bytes includes model, optimizer/master weights, RNG and progress. + retained_complete_bytes discounts only already retained complete checkpoint + bytes; unfinished directories are never counted as available or reusable. + """ + if ( + any( + type(value) is not int or value < 0 + for value in (checkpoint_bytes, export_bytes, retained_complete_bytes, headroom_bytes) + ) + or checkpoint_bytes == 0 + ): + raise ValueError("Checkpoint disk estimates must be nonnegative integer byte counts") + retained = min(retained_complete_bytes, checkpoint_bytes) + required = 2 * checkpoint_bytes + export_bytes + headroom_bytes - retained + usage = shutil.disk_usage(root) + record = { + "scope": "checkpoint_disk_budget", + "checkpoint_bytes": checkpoint_bytes, + "last_plus_next_bytes": 2 * checkpoint_bytes, + "export_bytes": export_bytes, + "retained_complete_bytes": retained, + "headroom_bytes": headroom_bytes, + "required_free_bytes": required, + "actual_free_bytes": usage.free, + "status": "passed" if usage.free >= required else "insufficient_disk", + } + atomic_json(Path(root) / "disk-budget.json", record) + if usage.free < required: + raise RuntimeError( + f"insufficient_disk: need {required} free bytes for last+next checkpoint " + f"and exports, have {usage.free}" + ) + return record diff --git a/scripts/qwen3_next_contract.py b/scripts/qwen3_next_contract.py new file mode 100644 index 000000000..88d55dd6c --- /dev/null +++ b/scripts/qwen3_next_contract.py @@ -0,0 +1,371 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Versioned acceptance checks shared by the stage runners and the launcher.""" + +import hashlib +import json +import re +from pathlib import Path + +from qwen3_next_runtime import atomic_json, file_digest, identity_digest # noqa: F401 + +CONTRACT_VERSION = 4 +SCOPES = { + "components": "qwen3_next_components_only", + "diagnostics": "qwen3_next_operator_diagnostics", + "preflight": "four_gpu_infrastructure_and_operators_only", + "layers": "qwen3_next_layer_and_scheduler_gates", + "l2": "qwen3_next_full_model_l2", + "train1": "qwen3_next_training_update1", + "train2": "qwen3_next_training_update2", + "train": "qwen3_next_training_and_reload", +} +# Stages that evaluate the full model against updated weights (an L2 matrix each). +TRAIN_STAGES = ("train1", "train2", "train") +IDENTITY_FIELDS = ( + "contract_version", + "source_tree", + "environment_sha256", + "cuda_identity", + "checkpoint_identity", + "provider_config", + "topology", + "operator_requirements", + "layer_requirements", +) + + +def checkpoint_identity(checkpoint): + checkpoint = Path(checkpoint) + metadata = { + str(path.relative_to(checkpoint)): file_digest(path) + for path in sorted(checkpoint.iterdir()) + if path.is_file() and path.suffix != ".safetensors" + } + index = json.loads((checkpoint / "model.safetensors.index.json").read_text()) + reference = json.loads( + ( + Path(__file__).resolve().parents[1] / "rl_engine/testing/qwen3_next_norm_manifest.json" + ).read_text() + )["model_identity"] + snapshot = reference["weight_snapshot"] + if ( + checkpoint.name != reference["revision"] + or metadata.get(snapshot["index_file"]) != snapshot["index_sha256"] + ): + raise ValueError("Checkpoint metadata does not match the official pinned revision") + expected_shards = {item["filename"]: item for item in snapshot["shards"]} + if set(index["weight_map"].values()) != expected_shards.keys(): + raise ValueError("Checkpoint shard inventory differs from the official revision") + shards = {} + for filename, expected in sorted(expected_shards.items()): + stat = (checkpoint / filename).stat() + if stat.st_size != expected["size_bytes"]: + raise ValueError(f"Checkpoint shard size mismatch: {filename}") + shards[filename] = { + "size": stat.st_size, + "mtime_ns": stat.st_mtime_ns, + "ctime_ns": stat.st_ctime_ns, + "expected_sha256": expected["sha256"], + } + return { + "revision": checkpoint.name, + "metadata": metadata, + "shards": shards, + "expected_content_hash": snapshot["content_hash"], + "full_hash_verification": "required_before_model_load", + } + + +def operator_requirements(root, suite): + registry = json.loads( + (Path(root) / "rl_engine/testing/qwen3_next_operator_cases.json").read_text() + ) + if registry.get("schema_version") != 1: + raise ValueError("Unsupported mandatory operator case registry") + suites = registry["suites"] + cases = sorted(suites["norm"] + suites["core"] if suite == "all" else suites[suite]) + if not cases or len(cases) != len(set(cases)): + raise ValueError("Mandatory operator case registry is empty or duplicated") + gates = ( + sorted( + f"{op}-{gate}.json" + for op in ("qwen3_next_rms_norm", "rms_norm_gated") + for gate in ("forward", "gradient") + ) + if suite in ("all", "norm") + else [] + ) + return { + "suite": suite, + "case_ids": cases, + "case_ids_sha256": hashlib.sha256(("\n".join(cases) + "\n").encode()).hexdigest(), + "norm_gates": gates, + } + + +def latest_attempt(run_dir, scheduler_attempt=None): + values = [ + int(path.name) + for path in (Path(run_dir) / "attempts").glob("*") + if path.is_dir() and path.name.isdigit() + ] + if scheduler_attempt is not None: + if not str(scheduler_attempt).isdigit(): + raise ValueError("Invalid scheduler attempt identity") + values.append(int(scheduler_attempt)) + return str(max(values)) if values else None + + +def acceptance_identity(manifest): + return {field: manifest[field] for field in IDENTITY_FIELDS} + + +def result_envelope(manifest, attempt, *, evidence): + return { + **acceptance_identity(manifest), + "source_commit": manifest["source_commit"], + "run_id": manifest["run_id"], + "stage": manifest["stage"], + "suite": manifest.get("suite", "all"), + "execution_id": manifest["execution_id"], + "attempt": str(attempt), + "status": "diagnostic_completed" if manifest["stage"] == "diagnostics" else "passed", + "phase": "complete", + "scope": SCOPES[manifest["stage"]], + "full_model_l2": "not_evaluated", + "evidence": evidence, + } + + +def evidence_record(path, root): + return {"path": str(Path(path).relative_to(root)), "sha256": file_digest(path)} + + +def validate_partial_training_evidence(manifest, root, evidence, *, attempt_root): + """train1/train2: the progress record, its last phase's worker export and L2 matrix agree. + + A training phase's L2 runs on that phase's exported weights, so its matrix + identity is the run's model identity with the export as the checkpoint (the + pinned base recorded as ``base_checkpoint``), exactly as the stage built it. + """ + from qwen3_next_l2 import model_identity + from qwen3_next_training import STAGE_LAST_PHASE, read_record, stage_phases + + from rl_engine.testing.qwen3_next_l2 import validate_matrix_report + + stage = manifest["stage"] + progress = json.loads((root / evidence["updates"]["path"]).read_text()) + phases = list(stage_phases(stage)) + last = STAGE_LAST_PHASE[stage] + if ( + progress.get("status") != "passed" + or progress.get("scope") != SCOPES[stage] + or progress.get("identity") != model_identity(manifest) + or progress.get("phases") != phases + or any(phase not in progress.get("workers", {}) for phase in phases) + ): + raise ValueError("Training progress identity, scope or phases mismatch") + matrix_record = progress.get("l2_reports", {}).get(last, {}) + if matrix_record.get("sha256") != evidence["l2_matrix"]["sha256"]: + raise ValueError("Training progress does not reference the accepted L2 matrix") + worker = read_record(progress["workers"][last]) + export = worker.get("export") or {} + if ( + export.get("weight_version") is None + or export.get("base_checkpoint") != manifest["checkpoint"] + ): + raise ValueError("Training phase export does not derive from the pinned base checkpoint") + report = json.loads((root / evidence["l2_matrix"]["path"]).read_text()) + validate_matrix_report( + report, + expected_identity=model_identity({**manifest, **export}), + artifact_root=attempt_root, + ) + + +def validate_result(manifest, result, *, run_dir=None, attempt=None): + if manifest.get("contract_version") != CONTRACT_VERSION: + raise ValueError("Historical acceptance contract cannot authorize a new stage") + expected = { + **acceptance_identity(manifest), + "source_commit": manifest["source_commit"], + "run_id": manifest["run_id"], + "stage": manifest["stage"], + "suite": manifest.get("suite", "all"), + "status": "diagnostic_completed" if manifest["stage"] == "diagnostics" else "passed", + "phase": "complete", + "scope": SCOPES[manifest["stage"]], + } + for field, value in expected.items(): + if result.get(field) != value: + raise ValueError(f"Acceptance identity mismatch: {field}") + if not re.fullmatch(r"[0-9a-f]{32}", str(manifest.get("execution_id", ""))): + raise ValueError("Run has no launcher execution identity") + if result.get("execution_id") != manifest["execution_id"]: + raise ValueError("Acceptance execution identity mismatch") + if not str(result.get("attempt", "")).isdigit(): + raise ValueError("Acceptance has no attempt identity") + if run_dir is not None: + attempt = latest_attempt(run_dir, attempt) + if attempt is not None and result["attempt"] != str(attempt): + raise ValueError("Acceptance belongs to a stale attempt") + if manifest["stage"] in ("l2", *TRAIN_STAGES) and result.get("full_model_l2") != "passed": + raise ValueError("Full-model L2 evidence is required") + if ( + manifest["stage"] not in ("l2", *TRAIN_STAGES) + and result.get("full_model_l2") != "not_evaluated" + ): + raise ValueError("Component and layer acceptance cannot claim full-model L2") + if manifest["stage"] == "train" and result.get("training_and_reload") != "passed": + raise ValueError("Two updates and reload evidence is required") + evidence = result.get("evidence", {}) + required = {"operators", "environment"} + if manifest["stage"] == "preflight": + required |= {"device_guards", "tp4", "checkpoint", "rollout_smoke"} + if manifest["stage"] == "components" and manifest.get("suite") in ("norm", "all"): + required.add("device_guards") + if manifest["stage"] in ("l2", *TRAIN_STAGES): + required |= {"l2_matrix"} + if manifest["stage"] == "l2": + required.add("provider_binary") + if manifest["stage"] == "layers": + required |= {"layers", "checkpoint", "provider_binary"} + if manifest["stage"] == "train": + required |= {"updates", "reload"} + if manifest["stage"] in ("train1", "train2"): + required |= {"updates"} + if not required <= evidence.keys(): + raise ValueError(f"Incomplete acceptance evidence: {sorted(required - evidence.keys())}") + if run_dir is not None: + root = Path(run_dir).resolve() + attempt_root = root / "attempts" / result["attempt"] + for record in evidence.values(): + path = (root / record["path"]).resolve() + if not path.is_relative_to(attempt_root) or file_digest(path) != record["sha256"]: + raise ValueError("Acceptance evidence content/attempt mismatch") + operators = json.loads((root / evidence["operators"]["path"]).read_text()) + if ( + operators.get("status") != expected["status"] + or operators.get("git_commit") != manifest["source_commit"] + ): + raise ValueError("Operator evidence must match the completed source run") + requirement = manifest["operator_requirements"] + if manifest["stage"] == "diagnostics": + if ( + operators.get("diagnostic_only") is not True + or operators.get("case_ids_sha256") != requirement["case_ids_sha256"] + ): + raise ValueError("Diagnostic evidence case identity mismatch") + return identity_digest(expected) + case_ids = operators.get("mandatory_case_ids", []) + if ( + case_ids != requirement["case_ids"] + or operators.get("case_ids_sha256") != requirement["case_ids_sha256"] + ): + raise ValueError("Evidence differs from the pinned mandatory case registry") + gates = operators.get("norm_gates", {}) + if sorted(gates) != requirement["norm_gates"] or any( + gate.get("passed") is not True for gate in gates.values() + ): + raise ValueError("Norm C3/C4 evidence is missing or failed") + expected_digest = hashlib.sha256(("\n".join(sorted(case_ids)) + "\n").encode()).hexdigest() + counts = operators.get("provider_tests", {}) + if ( + not case_ids + or len(case_ids) != len(set(case_ids)) + or len(case_ids) != counts.get("tests") + or operators.get("case_ids_sha256") != expected_digest + ): + raise ValueError("Mandatory operator case identities do not match the evidence") + if not counts.get("tests") or any( + counts.get(key, 0) for key in ("skipped", "errors", "failures") + ): + raise ValueError("Required operator tests must pass without skips") + if manifest["stage"] in ("layers", "l2", *TRAIN_STAGES): + from qwen3_next_l2 import model_identity + + if manifest["stage"] == "layers": + from qwen3_next_layer_contract import validate_layer_report + + checkpoint = json.loads((root / evidence["checkpoint"]["path"]).read_text()) + if any( + checkpoint.get(key) != value + for key, value in { + "revision": manifest["checkpoint_identity"]["revision"], + "content_hash": manifest["checkpoint_identity"]["expected_content_hash"], + "shards_verified": len(manifest["checkpoint_identity"]["shards"]), + }.items() + ): + raise ValueError( + "Layer checkpoint verification differs from the pinned snapshot" + ) + report = json.loads((root / evidence["layers"]["path"]).read_text()) + validate_layer_report( + report, + manifest["layer_requirements"], + model_identity(manifest), + root=attempt_root, + ) + else: + from rl_engine.testing.qwen3_next_l2 import validate_matrix_report + + certificate = manifest.get("scheduler_profile_certificate", {}) + certificate_path = Path(certificate.get("path", "")) + if not certificate_path.is_absolute() or file_digest( + certificate_path + ) != certificate.get("sha256"): + raise ValueError("Strict L2 requires its pinned native scheduler certificate") + certified_manifest = json.loads((certificate_path.parent / "run.json").read_text()) + certified_result = json.loads(certificate_path.read_text()) + if certified_manifest.get("stage") != "layers" or acceptance_identity( + certified_manifest + ) != acceptance_identity(manifest): + raise ValueError("Strict L2 certificate belongs to another provider identity") + validate_result( + certified_manifest, certified_result, run_dir=certificate_path.parent + ) + if manifest["stage"] == "train": + from qwen3_next_training import validate_training_report + + if evidence["updates"]["sha256"] != evidence["reload"]["sha256"]: + raise ValueError( + "Update and reload evidence must name the same complete report" + ) + report = json.loads((root / evidence["updates"]["path"]).read_text()) + sections = { + "baseline", + "update1", + "update2", + "reload", + "continuous_step3", + "resumed_step3", + "checkpoint", + "fault_injection", + } + if ( + report.get("identity") != model_identity(manifest) + or set(report.get("required_sections", [])) != sections + ): + raise ValueError("Training report identity or required sections mismatch") + if ( + report.get("l2_reports", {}).get("reload", {}).get("sha256") + != evidence["l2_matrix"]["sha256"] + ): + raise ValueError( + "Training reload does not reference the accepted full L2 matrix" + ) + validate_training_report(report, verify_files=True) + elif manifest["stage"] in ("train1", "train2"): + validate_partial_training_evidence( + manifest, root, evidence, attempt_root=attempt_root + ) + else: + report = json.loads((root / evidence["l2_matrix"]["path"]).read_text()) + validate_matrix_report( + report, + expected_identity=model_identity(manifest), + artifact_root=attempt_root, + ) + return identity_digest(expected) diff --git a/scripts/qwen3_next_gate_common.py b/scripts/qwen3_next_gate_common.py index 00642c8de..8280e2d6c 100644 --- a/scripts/qwen3_next_gate_common.py +++ b/scripts/qwen3_next_gate_common.py @@ -117,7 +117,17 @@ def run_gate(description, scope, gate): args.output.mkdir(parents=True, exist_ok=True) path = args.output / f"rank-{rank}.json" partial = path.with_suffix(".json.partial") - payload = {"status": "passed", "scope": scope, "rank": rank, **provenance(), **result} + from rl_engine.integrations.qwen3_next_binary import imported_provider_identity + + payload = { + "status": "passed", + "scope": scope, + "full_model_l2": "not_evaluated", + "rank": rank, + "provider_binary": imported_provider_identity(), + **provenance(), + **result, + } partial.write_text(json.dumps(payload, indent=2) + "\n") partial.replace(path) dist.barrier() diff --git a/scripts/qwen3_next_l2.py b/scripts/qwen3_next_l2.py new file mode 100644 index 000000000..b0a191c45 --- /dev/null +++ b/scripts/qwen3_next_l2.py @@ -0,0 +1,742 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Independent native rollout/recompute processes; no numerical fallback.""" + +import argparse +import importlib +import json +import os +import shutil +import subprocess +import sys +import time +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT)) + +from qwen3_next_contract import ( # noqa: E402 + atomic_json, + checkpoint_identity, + evidence_record, + result_envelope, + validate_result, +) +from qwen3_next_runtime import ( # noqa: E402 + failure_fields, + file_digest, + memory_limits, + parse_memory_request, + subprocess_failure, + verify_checkpoint, + verify_environment, +) + +from rl_engine.testing.qwen3_next_binary import ( # noqa: E402 + archive_provider_binary, + validate_binary_record, + verify_imported_provider, +) +from rl_engine.testing.qwen3_next_l2 import ( # noqa: E402 + NATIVE_WORKER_MODULE, + PROMPT_LENGTHS, + L2Case, + case_matrix, + compare_artifacts, + compare_batch_prefill, + first_divergent_layer, + first_divergent_node, + json_digest, + load_tensor_artifact, + prompt_fixture, + save_tensor_artifact, + validate_debug_capture, + validate_fixture, + validate_matrix_report, + validate_model_artifact, + worker_request, +) + + +def check_ready(): + try: + module = importlib.import_module(NATIVE_WORKER_MODULE) + except ModuleNotFoundError as exc: + raise RuntimeError(f"native_workers_not_ready: {exc}") from exc + required = { + "rollout": True, + "recompute": True, + "debug_layers": True, + "architecture_layers": 48, + "tp": 4, + "batched_cases": True, + } + actual = module.capabilities() + if any(actual.get(key) != value for key, value in required.items()): + raise RuntimeError(f"native_workers_not_ready: required {required}, received {actual}") + if any( + not callable(getattr(module, name, None)) + for name in ( + "run_rollout_case", + "run_recompute_case", + "run_rollout_cases", + "run_recompute_cases", + ) + ): + raise RuntimeError("native_workers_not_ready: actual model worker entrypoints missing") + return module, actual + + +def model_identity(manifest): + identity = { + **( + {"scheduler_profile_certificate": manifest["scheduler_profile_certificate"]} + if "scheduler_profile_certificate" in manifest + else {} + ), + "source_commit": manifest["source_commit"], + "source_tree": manifest["source_tree"], + "environment_sha256": manifest["environment_sha256"], + "checkpoint": manifest["checkpoint"], + "weight_version": manifest.get("weight_version", "baseline"), + "checkpoint_identity": manifest["checkpoint_identity"], + "provider_config": manifest["provider_config"], + "topology": manifest["topology"], + "architecture_layers": 48, + "weights_dtype": "bfloat16", + "recurrent_state_dtype": "float32", + } + if manifest.get("weight_version", "baseline") != "baseline": + identity.update( + base_checkpoint=manifest["base_checkpoint"], + base_checkpoint_identity=manifest["base_checkpoint_identity"], + ) + from rl_engine.testing.qwen3_next_l2 import validate_weight_identity + + validate_weight_identity(identity) + return identity + + +def verify_before_model_load(manifest, output): + if manifest.get("weight_version", "baseline") != "baseline": + verified = verify_updated_weights(manifest) + else: + if checkpoint_identity(manifest["checkpoint"]) != manifest["checkpoint_identity"]: + raise RuntimeError("checkpoint_mismatch: official weight snapshot changed") + reference = json.loads( + (ROOT / "rl_engine/testing/qwen3_next_norm_manifest.json").read_text() + )["model_identity"] + verified = verify_checkpoint(Path(manifest["checkpoint"]), reference) + atomic_json(output / "weight-verification.json", verified) + return verified + + +def verify_updated_weights(manifest): + from qwen3_next_training_export import validate_training_export + + verified = validate_training_export(manifest["checkpoint"], manifest["checkpoint_identity"]) + expected = { + "weight_version": manifest["weight_version"], + "base_checkpoint": manifest["base_checkpoint"], + "base_checkpoint_identity": manifest["base_checkpoint_identity"], + } + if any(verified.get(key) != value for key, value in expected.items()): + raise RuntimeError("checkpoint_mismatch: updated weights/base/version provenance differs") + for key in ( + "source_commit", + "source_tree", + "environment_sha256", + "provider_config", + "topology", + ): + if verified["training_identity"].get(key) != manifest[key]: + raise RuntimeError(f"checkpoint_mismatch: updated weights changed {key}") + return verified + + +def run_one(module, role, request, output): + output.parent.mkdir(parents=True, exist_ok=True) + atomic_json(output.with_suffix(".request.json"), request) + getattr(module, f"run_{role}_case")(request, output) + if not output.is_file(): + raise RuntimeError("Native worker did not produce a full-vocabulary tensor artifact") + artifact = load_tensor_artifact(output) + validate_model_artifact(artifact, request) + validate_debug_capture(artifact, request) + return artifact + + +def worker_batch( + manifest, + output, + role, + fixture_path, + *, + debug_request=None, + native_worker=None, + provider_binary=None, +): + if manifest.get("weight_version", "baseline") != "baseline" and not fixture_path.is_file(): + raise RuntimeError("Updated weights must reuse the already frozen baseline input fixture") + module, capabilities = check_ready() if native_worker is None else native_worker + verify_environment(manifest["environment"], require_venv=True) + output.mkdir(parents=True, exist_ok=debug_request is not None) + verify_before_model_load(manifest, output) + identity = model_identity(manifest) + actual_binary = None + if provider_binary is not None: + actual_binary = verify_imported_provider( + provider_binary, source_tree=manifest["source_tree"] + ) + elif manifest["provider_config"].get("profile") == "qwen3_next_tp4_shared_eager_v1": + raise RuntimeError("Native worker requires the stage's pinned CUDA binary evidence") + if debug_request is not None: + request = json.loads(debug_request.read_text()) + if request["identity"] != identity or request["role"] != role: + raise ValueError("Debug request identity mismatch") + artifact = run_one(module, role, request, output / "debug.pt") + if not artifact.get("debug_tensors"): + raise RuntimeError("First divergence rerun did not save layer/recurrent-state tensors") + return + fixture = None + if fixture_path.is_file(): + fixture = load_tensor_artifact(fixture_path) + validate_fixture(fixture) + elif role != "rollout": + raise RuntimeError("Recompute requires the already frozen baseline token fixture") + records, pending = {}, [] + + def cases(): + nonlocal fixture + if fixture is None: + from transformers import AutoTokenizer + + from rl_engine.testing.qwen3_next_l2 import freeze_responses + + tokenizer = AutoTokenizer.from_pretrained( + manifest["checkpoint"], local_files_only=True, trust_remote_code=False + ) + prompts = prompt_fixture(tokenizer, manifest["checkpoint_identity"]["metadata"]) + baseline, baseline_records = {}, {} + for length in PROMPT_LENGTHS: + case = L2Case(length, 4, "full") + request = worker_request(case, prompts, role=role, identity=identity, generate=True) + path = output / "baseline" / f"{case.case_id}.pt" + path.parent.mkdir(parents=True, exist_ok=True) + atomic_json(path.with_suffix(".request.json"), request) + atomic_json( + output / "active-case.json", + { + "case_id": case.case_id, + "phase": "baseline_generation", + "request": str(path.with_suffix(".request.json")), + }, + ) + yield request, path + artifact = load_tensor_artifact(path) + validate_model_artifact(artifact, request) + if actual_binary is not None and artifact.get("provider_binary") != actual_binary: + raise ValueError("Baseline generation used a different CUDA provider") + baseline[str(length)] = artifact + baseline_records[str(length)] = {"path": str(path), "sha256": file_digest(path)} + fixture = freeze_responses( + prompts, + baseline, + baseline_identity=json_digest(identity), + baseline_records=baseline_records, + ) + validate_fixture(fixture) + save_tensor_artifact(fixture_path, fixture) + tokenizer_identity = manifest.get( + "base_checkpoint_identity", manifest["checkpoint_identity"] + ) + if fixture["prompt_identity"]["tokenizer"] != tokenizer_identity["metadata"]: + raise RuntimeError("Frozen input tokenizer identity mismatch") + for case in case_matrix(): + request = worker_request(case, fixture, role=role, identity=identity) + path = output / f"{case.case_id}.pt" + atomic_json(path.with_suffix(".request.json"), request) + atomic_json( + output / "active-case.json", + { + "case_id": case.case_id, + "phase": ( + "preparing_recompute_requests" if role == "recompute" else "frozen_inputs" + ), + "request": str(path.with_suffix(".request.json")), + }, + ) + # Recompute materializes this iterator before one four-rank model + # lifetime. Its artifacts therefore exist only after the batch returns. + # Rollout's baseline loop above stays lazy to freeze generated tokens. + pending.append((request, path)) + yield request, path + + getattr(module, f"run_{role}_cases")(cases()) + if [request["case_id"] for request, _ in pending] != [case.case_id for case in case_matrix()]: + raise RuntimeError("Native batch worker did not consume every required case") + for request, path in pending: + artifact = load_tensor_artifact(path) + validate_model_artifact(artifact, request) + if actual_binary is not None and artifact.get("provider_binary") != actual_binary: + raise ValueError("Native rank traces used a different CUDA provider") + records[request["case_id"]] = { + "path": str(path), + "sha256": file_digest(path), + "request_sha256": request["request_sha256"], + } + if manifest.get("weight_version", "baseline") != "baseline": + verify_updated_weights(manifest) + elif checkpoint_identity(manifest["checkpoint"]) != manifest["checkpoint_identity"]: + raise RuntimeError("checkpoint_mismatch: weights changed during model execution") + if provider_binary is not None: + verify_imported_provider(provider_binary, source_tree=manifest["source_tree"]) + atomic_json( + output / "worker-result.json", + { + "status": "passed", + "role": role, + "pid": os.getpid(), + "identity": identity, + "capabilities": capabilities, + "fixture_sha256": fixture["content_sha256"], + "cases": records, + "provider_binary": actual_binary, + }, + ) + + +def run_process(command, *, log_path, timeout=4 * 3600, cleanup_grace_seconds=10): + with Path(log_path).open("w") as log: + child = subprocess.Popen( + command, stdout=log, stderr=subprocess.STDOUT, start_new_session=True + ) + try: + code = child.wait(timeout=timeout) + except BaseException: + from qwen3_next_runtime import wait_owned_child + + # The leader may exit on TERM while workers in its group ignore it. + # Finish the bounded group cleanup even after the leader has exited. + wait_owned_child(child, lambda: True, grace_seconds=cleanup_grace_seconds) + raise + if code: + raise subprocess_failure(code, log_path) + return {"pid": child.pid, "exit_code": code, "log": str(log_path)} + + +def gpu_probe(output): + import torch + + if torch.cuda.device_count() != 4 or any( + "B200" not in torch.cuda.get_device_name(index) for index in range(4) + ): + raise RuntimeError("topology_mismatch: four allocated B200 GPUs required") + atomic_json( + output, {"uuids": [str(torch.cuda.get_device_properties(index).uuid) for index in range(4)]} + ) + + +def wait_gpu_release(uuids, *, timeout=30): + wanted = {uuid.lower().removeprefix("gpu-") for uuid in uuids} + deadline = time.monotonic() + timeout + while True: + output = subprocess.check_output( + [ + "nvidia-smi", + "--query-compute-apps=pid,gpu_uuid,used_gpu_memory", + "--format=csv,noheader,nounits", + ], + text=True, + timeout=10, + ) + remaining = [ + line + for line in output.splitlines() + if len(line.split(",")) == 3 + and line.split(",")[1].strip().lower().removeprefix("gpu-") in wanted + ] + if not remaining: + return + if time.monotonic() >= deadline: + raise RuntimeError(f"gpu_memory_not_released: {remaining}") + time.sleep(0.25) + + +def run_matrix(manifest_path, output, fixture_path): + """Return evidence after two independent processes; never mark training complete.""" + manifest = json.loads(Path(manifest_path).read_text()) + output = Path(output) + output.mkdir(parents=True, exist_ok=True) + check_ready() + verify_environment(manifest["environment"], require_venv=True) + memory = memory_limits() + requested = parse_memory_request(manifest["memory"]) + if ( + memory["effective_bytes"] is None + or memory["effective_bytes"] < requested + or memory["available_bytes"] is None + or memory["available_bytes"] < requested + ): + raise RuntimeError("insufficient_memory: L2 allocation cannot satisfy its pinned budget") + prebuilt = manifest.get("prebuilt_provider_binary") + if prebuilt is None: + run_process( + [manifest["python"], str(ROOT / "setup.py"), "build_ext", "--inplace"], + log_path=output / "build.log", + timeout=1800, + ) + else: + expected = validate_binary_record(prebuilt, source_tree=manifest["source_tree"]) + path = Path(expected["path"]) + if path.parent != ROOT / "rl_engine" or file_digest(path) != expected["sha256"]: + raise ValueError("Training's prebuilt CUDA provider changed before L2") + provider_binary = archive_provider_binary(ROOT, output, source_tree=manifest["source_tree"]) + probe_path = output / "gpu-probe.json" + run_process( + [manifest["python"], str(Path(__file__)), "--gpu-probe", "--output", str(probe_path)], + log_path=output / "gpu-probe.log", + timeout=180, + ) + uuids = json.loads(probe_path.read_text())["uuids"] + wait_gpu_release(uuids) + atomic_json( + output / "environment.json", + { + "environment": manifest["environment"], + "memory": memory, + "gpu_uuids": uuids, + "execution_gpus": 4, + }, + ) + if manifest.get("input_fixture"): + if ( + not manifest.get("input_fixture_sha256") + or file_digest(fixture_path) != manifest["input_fixture_sha256"] + ): + raise RuntimeError( + "input_fixture_mismatch: external baseline fixture must be pinned by file SHA256" + ) + processes = {} + for role in ("rollout", "recompute"): + command = [ + manifest["python"], + str(Path(__file__)), + "--worker", + role, + "--manifest", + str(manifest_path), + "--output", + str(output / role), + "--fixture", + str(fixture_path), + "--provider-binary", + json.dumps(provider_binary), + ] + processes[role] = run_process(command, log_path=output / f"{role}.log") + wait_gpu_release(uuids) + processes[role]["gpu_release_verified"] = True + worker_result = json.loads((output / role / "worker-result.json").read_text()) + if ( + worker_result.get("pid") != processes[role]["pid"] + or worker_result.get("status") != "passed" + or worker_result.get("identity") != model_identity(manifest) + or sorted(worker_result.get("cases", {})) + != sorted(case.case_id for case in case_matrix()) + ): + raise RuntimeError("Independent native worker did not finish the required matrix") + atomic_json(output / "processes.json", processes) + fixture = load_tensor_artifact(fixture_path) + validate_fixture(fixture) + records, first_failure = {}, None + baseline_outputs = {} + for length, record in fixture["baseline_artifacts"].items(): + if file_digest(record["path"]) != record["sha256"]: + raise RuntimeError("Baseline generation artifact was changed") + baseline_outputs[length] = load_tensor_artifact(record["path"]) + original_identity = baseline_outputs[length]["metadata"]["identity"] + if json_digest(original_identity) != fixture["baseline_identity"]: + raise RuntimeError("Baseline generation provenance was changed") + baseline_request = worker_request( + L2Case(int(length), 4, "full"), + fixture, + role="rollout", + identity=original_identity, + generate=True, + ) + validate_model_artifact(baseline_outputs[length], baseline_request) + identity = model_identity(manifest) + for case in case_matrix(): + artifacts = {} + paths = {} + for role in ("rollout", "recompute"): + path = output / role / f"{case.case_id}.pt" + artifact = load_tensor_artifact(path) + validate_model_artifact( + artifact, worker_request(case, fixture, role=role, identity=identity) + ) + artifacts[role], paths[role] = artifact, str(path) + paired = compare_artifacts(artifacts["rollout"], artifacts["recompute"]) + invariance = {} + for role in ("rollout", "recompute"): + reference = load_tensor_artifact( + output / role / f"{L2Case(case.prompt_length, 4, 'full').case_id}.pt" + ) + invariance[role] = compare_batch_prefill(reference, artifacts[role]) + baseline_checks = {} + if identity.get("weight_version") == "baseline": + baseline_checks = { + role: compare_batch_prefill(baseline_outputs[str(case.prompt_length)], artifact) + for role, artifact in artifacts.items() + } + passed = ( + paired["passed"] + and all(all(checks.values()) for checks in invariance.values()) + and all(all(checks.values()) for checks in baseline_checks.values()) + ) + records[case.case_id] = { + **paired, + "passed": passed, + "batch_prefill": invariance, + "baseline_generation": baseline_checks, + "artifacts": { + role: {"path": path, "sha256": file_digest(path)} for role, path in paths.items() + }, + } + if not passed and first_failure is None: + if not paired["passed"]: + first_failure = { + "case": case, + "paired": paired, + "contexts": [("rollout", case, False), ("recompute", case, False)], + } + elif baseline_checks and not all( + all(checks.values()) for checks in baseline_checks.values() + ): + failed_role = next( + role + for role in ("rollout", "recompute") + if not all(baseline_checks[role].values()) + ) + reference_case = L2Case(case.prompt_length, 4, "full") + reference = baseline_outputs[str(case.prompt_length)] + first_failure = { + "case": case, + "paired": { + **paired, + "first_divergent_layer": first_divergent_layer( + reference, artifacts[failed_role] + ), + "first_divergent_node": first_divergent_node( + reference, artifacts[failed_role] + ), + }, + "contexts": [("rollout", reference_case, True), (failed_role, case, False)], + } + else: + failed_role = next( + role for role in ("rollout", "recompute") if not all(invariance[role].values()) + ) + reference_case = L2Case(case.prompt_length, 4, "full") + reference = load_tensor_artifact( + output / failed_role / f"{reference_case.case_id}.pt" + ) + first_failure = { + "case": case, + "paired": { + **paired, + "first_divergent_layer": first_divergent_layer( + reference, artifacts[failed_role] + ), + "first_divergent_node": first_divergent_node( + reference, artifacts[failed_role] + ), + }, + "contexts": [(failed_role, reference_case, False), (failed_role, case, False)], + } + report = { + "schema_version": 1, + "status": "passed" if first_failure is None else "failed", + "scope": "qwen3_next_full_model_l2", + "identity": identity, + "fixture": { + "path": str(fixture_path), + "sha256": file_digest(fixture_path), + "content_sha256": fixture["content_sha256"], + }, + "case_ids": [case.case_id for case in case_matrix()], + "cases": records, + "processes": processes, + "worker_results": { + role: { + "path": str(output / role / "worker-result.json"), + "sha256": file_digest(output / role / "worker-result.json"), + } + for role in ("rollout", "recompute") + }, + "raw_bit_comparison": True, + "logits_dtype": "bfloat16", + "logprobs_dtype": "float32", + "response_length": 16, + "vocab_size": 151936, + "provider_binary": provider_binary, + } + atomic_json(output / "l2-matrix.json", report) + if first_failure: + case = first_failure["case"] + layer = first_failure["paired"]["first_divergent_layer"] + capture = { + "case_id": case.case_id, + "first_divergent_layer": layer, + "first_divergent_node": first_failure["paired"].get("first_divergent_node"), + "first_divergent_component": "lm_head_or_logprob" if layer is None else "decoder_layer", + "first_difference": first_failure["paired"]["first_difference"], + "captures": {}, + } + for label, (role, context_case, generate) in zip( + ("reference", "candidate"), first_failure["contexts"] + ): + directory = output / "first-divergence" / label + directory.mkdir(parents=True, exist_ok=True) + request = worker_request( + context_case, + fixture, + role=role, + identity=identity, + trace_layers=[47] if layer is None else [layer], + generate=generate, + ) + request_path = directory / "request.json" + atomic_json(request_path, request) + try: + command = [ + manifest["python"], + str(Path(__file__)), + "--worker", + role, + "--manifest", + str(manifest_path), + "--output", + str(directory), + "--fixture", + str(fixture_path), + "--debug-request", + str(request_path), + "--provider-binary", + json.dumps(provider_binary), + ] + run_process(command, log_path=directory / "worker.log") + wait_gpu_release(uuids) + except (RuntimeError, subprocess.SubprocessError) as exc: + capture["captures"][label] = {"status": "failed", "error": str(exc)} + break + capture["captures"][label] = { + "status": "saved", + "role": role, + "case_id": context_case.case_id, + "path": str(directory / "debug.pt"), + "sha256": file_digest(directory / "debug.pt"), + } + atomic_json(output / "first-divergence.json", capture) + if report["status"] == "passed": + validate_matrix_report(report, expected_identity=identity, artifact_root=output) + return report + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--manifest", type=Path) + parser.add_argument("--output", type=Path) + parser.add_argument("--fixture", type=Path) + parser.add_argument("--worker", choices=("rollout", "recompute")) + parser.add_argument("--debug-request", type=Path) + parser.add_argument("--provider-binary", type=json.loads) + parser.add_argument("--check-ready", action="store_true") + parser.add_argument("--gpu-probe", action="store_true") + args = parser.parse_args() + if args.check_ready: + try: + _, capabilities = check_ready() + except (RuntimeError, AttributeError) as exc: + print(json.dumps({"status": "not_ready", "error": str(exc)})) + return 2 + print(json.dumps({"status": "ready", "capabilities": capabilities})) + return 0 + if args.gpu_probe: + gpu_probe(args.output) + return 0 + if args.manifest is None or args.output is None: + parser.error("--manifest and --output are required") + manifest = json.loads(args.manifest.read_text()) + fixture_path = args.fixture or Path( + manifest.get("input_fixture", args.manifest.parent / "inputs/frozen.pt") + ) + if args.worker: + worker_batch( + manifest, + args.output, + args.worker, + fixture_path, + debug_request=args.debug_request, + provider_binary=args.provider_binary, + ) + return 0 + args.output.mkdir(parents=True, exist_ok=True) + try: + if manifest["stage"] != "l2": + raise RuntimeError("Standalone L2 runner cannot close training acceptance") + from qwen3_next_runtime import require_predecessor + + previous = Path(manifest["previous"]) + require_predecessor("l2", previous, Path(manifest["checkpoint"]), manifest) + predecessor = json.loads((previous / "run.json").read_text()) + previous_result = json.loads((previous / "result.json").read_text()) + validate_result(predecessor, previous_result, run_dir=previous) + report = run_matrix(args.manifest, args.output, fixture_path) + if report["status"] != "passed": + raise RuntimeError("Full-model raw-bit L2 failed; first divergence artifacts retained") + prior_operators = previous / previous_result["evidence"]["operators"]["path"] + shutil.copyfile(prior_operators, args.output / "operators.json") + atomic_json( + args.output / "predecessor-evidence.json", + { + "run_id": predecessor["run_id"], + "execution_id": predecessor["execution_id"], + "result_sha256": file_digest(previous / "result.json"), + }, + ) + evidence = { + name: evidence_record(args.output / filename, args.manifest.parent) + for name, filename in { + "operators": "operators.json", + "environment": "environment.json", + "l2_matrix": "l2-matrix.json", + "predecessor": "predecessor-evidence.json", + "provider_binary": "provider-binary.json", + }.items() + } + result = result_envelope(manifest, os.environ["QWEN3_NEXT_ATTEMPT"], evidence=evidence) + result["full_model_l2"] = "passed" + validate_result( + manifest, result, run_dir=args.manifest.parent, attempt=os.environ["QWEN3_NEXT_ATTEMPT"] + ) + atomic_json(args.output / "result.json", result) + except Exception as exc: + atomic_json( + args.output / "result.json", + { + "run_id": manifest["run_id"], + "attempt": os.environ["QWEN3_NEXT_ATTEMPT"], + "status": "failed", + "full_model_l2": "not_passed", + **failure_fields(exc), + }, + ) + raise + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/qwen3_next_layer_contract.py b/scripts/qwen3_next_layer_contract.py new file mode 100644 index 000000000..685e0117e --- /dev/null +++ b/scripts/qwen3_next_layer_contract.py @@ -0,0 +1,123 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Pinned layer component inventory and original tensor scheduler acceptance.""" + +import hashlib +import json +from pathlib import Path + +from qwen3_next_runtime import file_digest, identity_digest + + +def layer_requirements(root): + root = Path(root) + path = root / "rl_engine/testing/qwen3_next_layer_cases.json" + registry = json.loads(path.read_text()) + if registry.get("schema_version") != 1 or set(registry.get("gates", {})) != { + "gdn", + "attention", + "moe", + "adapters", + "heads", + }: + raise ValueError("Incomplete layer gate registry") + for gate in registry["gates"].values(): + gate["script_sha256"] = file_digest(root / gate["script"]) + for cases in gate["groups"].values(): + if not cases or len(cases) != len(set(cases)): + raise ValueError("Mandatory layer case list is empty or duplicated") + cases = sorted( + f"{name}/{group}/{case}" + for name, gate in registry["gates"].items() + for group, values in gate["groups"].items() + for case in values + ) + return { + **registry, + "registry_sha256": file_digest(path), + "case_ids_per_rank": cases, + "case_ids_sha256": hashlib.sha256(("\n".join(cases) + "\n").encode()).hexdigest(), + } + + +def validate_rank_result(row, requirement, rank): + if any( + row.get(name) != value + for name, value in { + "status": "passed", + "rank": rank, + "scope": requirement["scope"], + "full_model_l2": "not_evaluated", + **requirement.get("fields", {}), + }.items() + ): + raise ValueError("Layer rank evidence has a wrong identity, scope or status") + if any(row.get(name, 0) for name in ("skipped", "failures", "errors")): + raise ValueError("Layer rank evidence includes skipped or failed checks") + for field, expected in requirement["groups"].items(): + value = row + for key in field.split("."): + value = value.get(key, {}) if isinstance(value, dict) else None + if not isinstance(value, list) or sorted(value) != sorted(expected): + raise ValueError(f"Layer rank evidence changed mandatory cases: {field}") + + +def checked_record(record, *, root=None): + if not isinstance(record, dict) or not {"path", "sha256"} <= record.keys(): + raise ValueError("Missing artifact path/content digest") + path = Path(record["path"]) + if not path.is_absolute(): + if root is None: + raise ValueError("Artifact path must be absolute without an evidence root") + path = Path(root) / path + path = path.resolve(strict=True) + if root is not None and not path.is_relative_to(Path(root).resolve()): + raise ValueError("Artifact escaped its current attempt") + if file_digest(path) != record["sha256"]: + raise ValueError("Artifact content digest changed") + return path + + +def validate_layer_report(report, requirement, identity, *, root): + if any( + report.get(key) != value + for key, value in { + "schema_version": 1, + "status": "passed", + "phase": "complete", + "scope": "qwen3_next_layer_and_scheduler_gates", + "identity": identity, + "requirements_sha256": identity_digest(requirement), + "full_model_l2": "not_evaluated", + }.items() + ): + raise ValueError("Layer acceptance identity or completeness mismatch") + if set(report.get("gates", {})) != set(requirement["gates"]): + raise ValueError("Layer acceptance omitted a mandatory gate") + from rl_engine.testing.qwen3_next_binary import validate_binary_record + + binary = validate_binary_record( + report.get("provider_binary"), source_tree=identity["source_tree"], artifact_root=root + ) + for name, expected in requirement["gates"].items(): + gate = report["gates"][name] + if gate.get("exit_code") != 0 or gate.get("gpu_release_verified") is not True: + raise ValueError("Layer process failed or did not release GPU memory") + ranks = gate.get("ranks", {}) + if set(ranks) != {"0", "1", "2", "3"}: + raise ValueError("Layer acceptance requires each of the four TP ranks") + for rank, record in ranks.items(): + row = json.loads(checked_record(record, root=root).read_text()) + validate_rank_result(row, expected, int(rank)) + if row.get("provider_binary") != binary: + raise ValueError("Layer ranks did not import the archived CUDA provider") + scheduler_path = checked_record(report.get("scheduler"), root=root) + scheduler = json.loads(scheduler_path.read_text()) + from rl_engine.testing.qwen3_next_l2 import validate_scheduler_report + + validate_scheduler_report(scheduler, expected_identity=identity, artifact_root=root) + if scheduler.get("provider_binary") != report["provider_binary"]: + raise ValueError("Layer and scheduler gates used different CUDA providers") + if scheduler["case_ids"] != requirement["scheduler_case_ids"]: + raise ValueError("Scheduler evidence differs from the pinned layer registry") diff --git a/scripts/qwen3_next_layers.py b/scripts/qwen3_next_layers.py new file mode 100644 index 000000000..07a047011 --- /dev/null +++ b/scripts/qwen3_next_layers.py @@ -0,0 +1,342 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""TP4 layer gates and actual native scheduler acceptance, before independent L2.""" + +import argparse +import importlib +import json +import os +import shutil +import sys +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT)) + +from qwen3_next_contract import ( # noqa: E402 + atomic_json, + checkpoint_identity, + evidence_record, + result_envelope, + validate_result, +) +from qwen3_next_l2 import ( # noqa: E402 + model_identity, + run_process, + verify_before_model_load, + wait_gpu_release, + worker_batch, +) +from qwen3_next_layer_contract import ( # noqa: E402 + layer_requirements, + validate_layer_report, + validate_rank_result, +) +from qwen3_next_runtime import failure_fields # noqa: E402 +from qwen3_next_runtime import ( # noqa: E402 + file_digest, + identity_digest, + memory_limits, + parse_memory_request, + verify_environment, +) + +from rl_engine.testing.qwen3_next_binary import ( # noqa: E402 + archive_provider_binary, + validate_binary_record, +) +from rl_engine.testing.qwen3_next_l2 import ( # noqa: E402 + L2Case, + case_matrix, + compare_batch_prefill, + first_divergent_layer, + load_tensor_artifact, + validate_fixture, + validate_scheduler_report, +) + +SCHEDULER_MODULE = "rl_engine.integrations.qwen3_next_native_rollout" + + +def check_scheduler_ready(): + try: + module = importlib.import_module(SCHEDULER_MODULE) + actual = module.capabilities() + except (ModuleNotFoundError, AttributeError) as exc: + raise RuntimeError(f"native_scheduler_not_ready: {exc}") from exc + required = { + "rollout": True, + "debug_layers": True, + "architecture_layers": 48, + "tp": 4, + "batched_cases": True, + "native_scheduler": True, + } + if any(actual.get(key) != value for key, value in required.items()) or not callable( + getattr(module, "run_rollout_cases", None) + ): + raise RuntimeError(f"native_scheduler_not_ready: required {required}, received {actual}") + return module, actual + + +def scheduler_report(manifest, output, fixture_path, process, provider_binary): + fixture = load_tensor_artifact(fixture_path) + validate_fixture(fixture) + records = {} + for case in case_matrix(): + path = output / "rollout" / f"{case.case_id}.pt" + candidate = load_tensor_artifact(path) + reference = load_tensor_artifact( + output / "rollout" / f"{L2Case(case.prompt_length, 4, 'full').case_id}.pt" + ) + baseline = load_tensor_artifact( + fixture["baseline_artifacts"][str(case.prompt_length)]["path"] + ) + batch = compare_batch_prefill(reference, candidate) + generated = compare_batch_prefill(baseline, candidate) + records[case.case_id] = { + "passed": all(batch.values()) and all(generated.values()), + "batch_prefill": {"rollout": batch}, + "baseline_generation": {"rollout": generated}, + "artifacts": {"rollout": {"path": str(path), "sha256": file_digest(path)}}, + } + if not records[case.case_id]["passed"] and not (output / "first-divergence.json").exists(): + divergent = reference if not all(batch.values()) else baseline + atomic_json( + output / "first-divergence.json", + { + "case_id": case.case_id, + "first_divergent_layer": first_divergent_layer(divergent, candidate), + "candidate_artifact": str(path), + "reference_worker_traces": divergent.get("worker_traces", []), + "candidate_worker_traces": candidate.get("worker_traces", []), + "capture": "all_48_layers_and_owned_states_in_original_worker_traces", + }, + ) + worker_path = output / "rollout/worker-result.json" + report = { + "schema_version": 1, + "status": "passed" if all(row["passed"] for row in records.values()) else "failed", + "scope": "qwen3_next_native_scheduler_only", + "full_model_l2": "not_evaluated", + "raw_bit_comparison": True, + "identity": model_identity(manifest), + "case_ids": [case.case_id for case in case_matrix()], + "cases": records, + "fixture": { + "path": str(fixture_path), + "sha256": file_digest(fixture_path), + "content_sha256": fixture["content_sha256"], + }, + "processes": {"rollout": process}, + "worker_results": { + "rollout": {"path": str(worker_path), "sha256": file_digest(worker_path)} + }, + "provider_binary": provider_binary, + } + atomic_json(output / "scheduler-report.json", report) + validate_scheduler_report( + report, expected_identity=model_identity(manifest), artifact_root=output + ) + return report + + +def run_layers(manifest_path, output): + from qwen3_next_runtime import require_predecessor + + manifest = json.loads(manifest_path.read_text()) + if manifest["stage"] != "layers": + raise ValueError("Layer runner can only close the layers stage") + previous = Path(manifest["previous"]) + require_predecessor("layers", previous, Path(manifest["checkpoint"]), manifest) + verify_environment(manifest["environment"], require_venv=True) + requirement = layer_requirements(ROOT) + if requirement != manifest["layer_requirements"]: + raise ValueError("Layer registry differs from the submitted source snapshot") + memory = memory_limits() + requested = parse_memory_request(manifest["memory"]) + if any( + value is None or value < requested + for value in (memory["effective_bytes"], memory["available_bytes"]) + ): + raise RuntimeError("insufficient_memory: layer allocation cannot satisfy its pinned budget") + output.mkdir(parents=True, exist_ok=True) + report = { + "schema_version": 1, + "status": "incomplete", + "phase": "build", + "scope": "qwen3_next_layer_and_scheduler_gates", + "full_model_l2": "not_evaluated", + "identity": model_identity(manifest), + "requirements_sha256": identity_digest(requirement), + "gates": {}, + } + + def progress(phase): + report["phase"] = phase + atomic_json(output / "layers.json", report) + + run_process( + [manifest["python"], str(ROOT / "setup.py"), "build_ext", "--inplace", "--force"], + log_path=output / "build.log", + timeout=1800, + ) + provider_binary = archive_provider_binary(ROOT, output, source_tree=manifest["source_tree"]) + report["provider_binary"] = provider_binary + actual_binary = validate_binary_record(provider_binary, source_tree=manifest["source_tree"]) + progress("checkpoint") + verify_before_model_load(manifest, output) + probe = output / "gpu-probe.json" + run_process( + [ + manifest["python"], + str(ROOT / "scripts/qwen3_next_l2.py"), + "--gpu-probe", + "--output", + str(probe), + ], + log_path=output / "gpu-probe.log", + timeout=180, + ) + uuids = json.loads(probe.read_text())["uuids"] + wait_gpu_release(uuids) + atomic_json( + output / "environment.json", + { + "environment": manifest["environment"], + "memory": memory, + "gpu_uuids": uuids, + "execution_gpus": 4, + }, + ) + for name, expected in requirement["gates"].items(): + progress(name) + directory = output / name + process = run_process( + [ + manifest["python"], + "-m", + "torch.distributed.run", + "--standalone", + "--nproc_per_node=4", + str(ROOT / expected["script"]), + "--checkpoint", + manifest["checkpoint"], + expected["output_option"], + str(directory), + ], + log_path=output / f"{name}.log", + ) + wait_gpu_release(uuids) + ranks = {} + for rank in range(4): + path = directory / f"rank-{rank}.json" + validate_rank_result(json.loads(path.read_text()), expected, rank) + if json.loads(path.read_text()).get("provider_binary") != actual_binary: + raise ValueError("Layer rank used a different CUDA provider than its build") + ranks[str(rank)] = {"path": str(path), "sha256": file_digest(path)} + report["gates"][name] = {**process, "gpu_release_verified": True, "ranks": ranks} + progress(name + "_passed") + progress("native_scheduler") + check_scheduler_ready() + fixture = output / "inputs/frozen.pt" + process = run_process( + [ + manifest["python"], + str(Path(__file__)), + "--scheduler-worker", + "--manifest", + str(manifest_path), + "--output", + str(output / "rollout"), + "--fixture", + str(fixture), + "--provider-binary", + json.dumps(provider_binary), + ], + log_path=output / "scheduler.log", + ) + wait_gpu_release(uuids) + process["gpu_release_verified"] = True + scheduler_report(manifest, output, fixture, process, provider_binary) + report["scheduler"] = { + "path": str(output / "scheduler-report.json"), + "sha256": file_digest(output / "scheduler-report.json"), + } + if checkpoint_identity(manifest["checkpoint"]) != manifest["checkpoint_identity"]: + raise RuntimeError("checkpoint_mismatch: official snapshot changed during layer execution") + report.update(status="passed", phase="complete") + validate_layer_report(report, requirement, model_identity(manifest), root=output) + atomic_json(output / "layers.json", report) + previous_result = json.loads((previous / "result.json").read_text()) + shutil.copyfile( + previous / previous_result["evidence"]["operators"]["path"], output / "operators.json" + ) + names = { + "operators": "operators.json", + "environment": "environment.json", + "layers": "layers.json", + "checkpoint": "weight-verification.json", + "provider_binary": "provider-binary.json", + } + evidence = { + name: evidence_record(output / filename, manifest_path.parent) + for name, filename in names.items() + } + result = result_envelope(manifest, os.environ["QWEN3_NEXT_ATTEMPT"], evidence=evidence) + validate_result(manifest, result, run_dir=manifest_path.parent) + atomic_json(output / "result.json", result) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--manifest", type=Path) + parser.add_argument("--output", type=Path) + parser.add_argument("--fixture", type=Path) + parser.add_argument("--scheduler-worker", action="store_true") + parser.add_argument("--check-ready", action="store_true") + parser.add_argument("--provider-binary", type=json.loads) + args = parser.parse_args() + if args.check_ready: + _, capabilities = check_scheduler_ready() + print(json.dumps({"status": "ready", "capabilities": capabilities})) + return 0 + if args.manifest is None or args.output is None: + parser.error("--manifest and --output are required") + manifest = json.loads(args.manifest.read_text()) + if args.scheduler_worker: + worker_batch( + manifest, + args.output, + "rollout", + args.fixture, + native_worker=check_scheduler_ready(), + provider_binary=args.provider_binary, + ) + return 0 + args.output.mkdir(parents=True, exist_ok=True) + try: + run_layers(args.manifest, args.output) + except Exception as exc: + kind = str(exc).split(":", 1)[0] + atomic_json( + args.output / "result.json", + { + "run_id": manifest["run_id"], + "attempt": os.environ["QWEN3_NEXT_ATTEMPT"], + "status": "incomplete" if kind == "native_scheduler_not_ready" else "failed", + "phase": ( + "native_scheduler" if kind == "native_scheduler_not_ready" else "layer_gate" + ), + **failure_fields(exc), + "full_model_l2": "not_evaluated", + }, + ) + raise + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/qwen3_next_operator_cases.py b/scripts/qwen3_next_operator_cases.py new file mode 100644 index 000000000..caf139e4c --- /dev/null +++ b/scripts/qwen3_next_operator_cases.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Regenerate ``rl_engine/testing/qwen3_next_operator_cases.json`` from pytest collection. + + python scripts/qwen3_next_operator_cases.py # check, exit 1 if stale + python scripts/qwen3_next_operator_cases.py --write + +The registry pins the exact test IDs the preflight operator gate must run. The +``norm`` and ``core`` suites are mandatory and must pass without skips; +``diagnostics`` holds the approximate cross-provider comparisons, which are +recorded but never gate. Which file and test belongs to which suite is declared +below; the IDs themselves come from collection, so a parametrisation change is +a reviewed registry diff, not a silent change in what the gate runs. +""" + +import argparse +import json +import subprocess +import sys +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +REGISTRY = ROOT / "rl_engine/testing/qwen3_next_operator_cases.json" +NORM_FILES = ("tests/test_qwen3_next_norm.py", "tests/check_qwen3_next_norm_providers.py") +CORE_FILES = ( + "tests/check_qwen3_next_attention.py", + "tests/check_qwen3_next_batch_invariance.py", + "tests/check_qwen3_next_conv_bridge.py", + "tests/check_qwen3_next_core_matrix.py", + "tests/check_qwen3_next_forward.py", + "tests/check_qwen3_next_gdn_bridge.py", + "tests/check_qwen3_next_gdn_sequence.py", + "tests/check_qwen3_next_paged_attention.py", + "tests/check_qwen3_next_shared_core.py", +) +DIAGNOSTIC_FILES = ("tests/check_gdn_recurrent_golden.py",) +# Approximate comparisons against alternative providers, collected from the +# mandatory files above but recorded as diagnostics. +DIAGNOSTIC_TESTS = { + "tests/check_qwen3_next_norm_providers.py": ( + "test_ours_tracks_each_vllm_path_within_bounds", + "test_vllm_paths_disagree_only_within_bounds", + ), + "tests/check_qwen3_next_batch_invariance.py": ( + "test_flashinfer_chunked_prefill_deviation_stays_rounding_scale", + "test_triton_chunked_prefill_split_matches_one_pass", + ), +} +DESCRIPTION = ( + "Mandatory norm/core contracts; alternative-provider approximate comparisons are " + "diagnostics only. Generated by scripts/qwen3_next_operator_cases.py; case changes " + "require review before a frozen run." +) + + +def collect(files): + out = subprocess.run( + [sys.executable, "-m", "pytest", "--collect-only", "-q", "-p", "no:cacheprovider", *files], + cwd=ROOT, + capture_output=True, + text=True, + ) + ids = [line for line in out.stdout.splitlines() if "::test_" in line] + if out.returncode or not ids: + raise SystemExit(f"collection failed:\n{out.stdout[-2000:]}\n{out.stderr[-2000:]}") + return ids + + +def _diagnostic(case): + path, name = case.split("::", 1) + return name.split("[", 1)[0] in DIAGNOSTIC_TESTS.get(path, ()) + + +def registry(): + norm, core = collect(NORM_FILES), collect(CORE_FILES) + diagnostics = collect(DIAGNOSTIC_FILES) + [c for c in norm + core if _diagnostic(c)] + return { + "schema_version": 1, + "description": DESCRIPTION, + "suites": { + "norm": sorted(c for c in norm if not _diagnostic(c)), + "core": sorted(c for c in core if not _diagnostic(c)), + "diagnostics": sorted(diagnostics), + }, + } + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--write", action="store_true") + args = parser.parse_args() + text = json.dumps(registry(), indent=2) + "\n" + if args.write: + REGISTRY.write_text(text) + print(f"wrote {REGISTRY.relative_to(ROOT)}") + elif not REGISTRY.is_file() or REGISTRY.read_text() != text: + raise SystemExit(f"{REGISTRY.relative_to(ROOT)} is stale; rerun with --write") + + +if __name__ == "__main__": + main() diff --git a/scripts/qwen3_next_operator_gates.py b/scripts/qwen3_next_operator_gates.py new file mode 100644 index 000000000..d1c45d558 --- /dev/null +++ b/scripts/qwen3_next_operator_gates.py @@ -0,0 +1,151 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Run declared operator acceptance or explicitly separate diagnostic cases.""" + +import argparse +import importlib.metadata +import json +import os +import subprocess +import sys +from pathlib import Path + +from rl_engine.testing.qwen3_next_cases import case_digest, execution_verdict, load_cases + +ROOT = Path(__file__).resolve().parents[1] +MANIFEST = ROOT / "rl_engine/testing/qwen3_next_operator_cases.json" + + +def run_suite(out: Path, suite: str) -> dict: + out.mkdir(parents=True, exist_ok=True) + cases = load_cases(MANIFEST, suite) + diagnostic = suite == "diagnostics" + case_path = out / "case-results.json" + case_path.unlink(missing_ok=True) + env = dict(os.environ) + env["QWEN3_NEXT_ROUTING_EVIDENCE"] = str(out / "gdn-step-routing.json") + env["QWEN3_NEXT_FLASHINFER_EVIDENCE"] = str(out) + proc = subprocess.run( + [ + sys.executable, + "-m", + "pytest", + "-q", + "-p", + "no:cacheprovider", + "-p", + "rl_engine.testing.pytest_case_manifest", + "--case-manifest", + str(MANIFEST), + "--case-suite", + suite, + "--case-report", + str(case_path), + "--junitxml", + str(out / "providers.xml"), + *cases, + ], + cwd=ROOT, + env=env, + check=False, + ) + try: + case_report = json.loads(case_path.read_text()) if case_path.exists() else {} + except json.JSONDecodeError: + case_report = {} + verified = execution_verdict( + cases, case_report.get("collected_case_ids", []), case_report.get("outcomes", {}) + ) + passed = proc.returncode == 0 and case_report.get("passed") is True + passed = passed and verified["passed"] and case_report.get("expected_case_ids") == cases + passed = passed and case_report.get("expected_case_ids_sha256") == case_digest(cases) + reports = {} + if suite in ("norm", "all"): + for op in ("qwen3_next_rms_norm", "rms_norm_gated"): + for gate in ("forward", "gradient"): + name = f"{op}-{gate}.json" + with (out / name).open("w") as stream: + norm = subprocess.run( + [ + sys.executable, + f"scripts/check_{gate}_invariance.py", + "--manifest", + "rl_engine/testing/qwen3_next_norm_manifest.json", + "--op", + op, + "--candidate", + "cuda", + "--backend-profile", + "cuda_bf16", + "--hidden", + "2048", + "--head-dim", + "128", + "--json", + ], + cwd=ROOT, + env=env, + stdout=stream, + check=False, + ) + try: + report = json.loads((out / name).read_text()) + except json.JSONDecodeError: + report = {} + valid = all( + ( + norm.returncode == 0, + report.get("passed") is True, + report.get("workload", {}).get("scope") == "qwen3_next_norm_operators", + ) + ) + reports[name] = { + "passed": valid, + "exit_code": norm.returncode, + "workload": report.get("workload"), + } + passed = passed and valid + status = "passed" if passed else "failed" + if diagnostic: + status = "diagnostic_completed" if passed else "diagnostic_failed" + return { + "scope": "qwen3_next_operator_diagnostics" if diagnostic else "qwen3_next_operators_only", + "status": status, + "suite": suite, + "diagnostic_only": diagnostic, + "full_model_l2": "not_evaluated", + "git_commit": subprocess.check_output( + ["git", "rev-parse", "HEAD"], cwd=ROOT, text=True + ).strip(), + "git_dirty": bool( + subprocess.check_output(["git", "status", "--porcelain"], cwd=ROOT, text=True).strip() + ), + "versions": { + name: importlib.metadata.version(name) + for name in ("torch", "vllm", "transformers", "triton") + }, + "mandatory_case_ids": [] if diagnostic else cases, + "case_ids_sha256": case_digest(cases), + "pytest_exit_code": proc.returncode, + "provider_tests": verified["counts"], + "norm_gates": reports, + } + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--out", type=Path, required=True) + parser.add_argument("--suite", choices=("norm", "core", "all", "diagnostics"), default="all") + args = parser.parse_args() + result = run_suite(args.out.resolve(), args.suite) + partial = args.out / "summary.json.partial" + partial.write_text(json.dumps(result, indent=2) + "\n") + partial.replace(args.out / "summary.json") + print(json.dumps(result, indent=2)) + return 0 if result["status"] in ("passed", "diagnostic_completed") else 1 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/qwen3_next_optimizer_checkpoint.py b/scripts/qwen3_next_optimizer_checkpoint.py new file mode 100644 index 000000000..df6c1c07e --- /dev/null +++ b/scripts/qwen3_next_optimizer_checkpoint.py @@ -0,0 +1,307 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Bounded native DistributedOptimizer parameter-state I/O for fixed TP4/DP1. + +The installed native DP-zero saver packs entire gradient buckets. With CPU Adam +offload and no communication overlap, a bucket can contain most of the model. +This adapter uses the native parameter getters/setters and verifies their exact +DP1 range coverage, while copying at most 64 MiB into each serialized block. +It never implements an optimizer, changes dtype, or changes native state layout. +""" + +import json +from pathlib import Path + +import torch +from qwen3_next_contract import atomic_json + +from rl_engine.integrations.qwen3_next_training import named_trainable_parameters, state_digest + +PARAMETER_KEYS = ("param", "exp_avg", "exp_avg_sq") + + +def _hdo_param_generator(cpu_optimizer): + from megatron.core.optimizer.cpu_offloading.hybrid_optimizer import _param_generator + + return _param_generator(cpu_optimizer) + + +def verify_hdo_optimizer_master_aliases(model, leaves): + """CPU Adam must update the same FP32 master tensors the checkpoint getter exposes. + + The distributed optimizer keys its HybridDeviceOptimizer by the DP-sharded + parameter (``optimizer.param_groups[group][order]`` found through + ``model_param_group_index_map``), not by the model parameter, and the + checkpoint getter returns that shard's ``state["master_param"]``. The FP32 + copy CPU Adam steps (``param_to_fp32_param[shard]``) is a separate tensor + that must hold the same values, and the CPU optimizer's state entry must be + the very dict the HDO keeps for the shard. + """ + try: + from megatron.core.optimizer.cpu_offloading.hybrid_optimizer import HybridDeviceOptimizer + except ModuleNotFoundError: + return + + for record in native_parameter_layout(model, leaves).values(): + leaf = record["leaf"] + hdo = leaf.optimizer + if not isinstance(hdo, HybridDeviceOptimizer): + continue + orig = record["parameter"] + group_index, group_order = leaf.model_param_group_index_map[orig] + shard = hdo.param_groups[group_index]["params"][group_order] + master = leaf._get_main_param_and_optimizer_states(orig)["param"] + hdo_state = hdo.state.get(shard) + if not isinstance(hdo_state, dict) or hdo_state.get("master_param") is not master: + raise ValueError("HDO state master_param is not the checkpoint-visible master") + if shard not in hdo.param_to_fp32_param: + raise ValueError("Native HDO must keep an FP32 copy for each sharded parameter") + fp32_inner = hdo.param_to_fp32_param[shard] + if hdo.param_to_inner_param.get(shard) is not fp32_inner: + raise ValueError("HDO inner optimizer parameter is not the FP32 master copy") + if fp32_inner.dtype != torch.float32 or not torch.equal(master, fp32_inner): + raise ValueError("HDO FP32 master copy diverged from checkpoint-visible master weights") + linked = False + for cpu_optimizer in hdo.cpu_optimizers: + for param in _hdo_param_generator(cpu_optimizer): + if param is not fp32_inner: + continue + if cpu_optimizer.state.get(param) is not hdo_state: + raise ValueError("CPU Adam state is not aliased to the HDO parameter state") + linked = True + if not linked: + raise ValueError("CPU Adam does not own the FP32 master for a model parameter") + + +BLOCK_BYTES = 64 * 1024 * 1024 + + +def native_parameter_layout(model, leaves): + names = {id(value): name for name, value in named_trainable_parameters(model).items()} + records = {} + for leaf_index, leaf in enumerate(leaves): + covered = set() + for buffer_index, dtype_maps in enumerate(leaf.gbuf_ranges): + for dtype, buckets in dtype_maps.items(): + for bucket_index, bucket in enumerate(buckets): + intervals = [] + capacity = leaf.buffers[buffer_index].buckets[bucket_index].grad_data.numel() + for parameter, ranges in bucket["param_map"].items(): + name = names.get(id(parameter)) + if name is None or name in records or parameter in covered: + raise ValueError( + "Native optimizer ranges must partition model parameters" + ) + local, relative = ranges["gbuf_local"], ranges["param"] + if ( + relative.start != 0 + or relative.end != parameter.numel() + or local.end - local.start != parameter.numel() + or not 0 <= local.start < local.end <= capacity + ): + raise ValueError("Native DP1 ranges must cover each complete parameter") + if parameter not in leaf.model_param_group_index_map: + raise ValueError( + "Native bucket parameter is absent from optimizer groups" + ) + intervals.append((local.start, local.end)) + covered.add(parameter) + records[name] = { + "parameter": parameter, + "leaf": leaf, + "layout": { + "leaf": leaf_index, + "buffer": buffer_index, + "dtype": [str(item) for item in dtype], + "bucket": bucket_index, + "bucket_numel": capacity, + "group_order": list(leaf.model_param_group_index_map[parameter]), + "param_range": [relative.start, relative.end], + "local_range": [local.start, local.end], + }, + } + intervals.sort() + if any(right[0] < left[1] for left, right in zip(intervals, intervals[1:])): + raise ValueError("Native optimizer bucket ranges overlap") + if covered != leaf.model_param_group_index_map.keys(): + raise ValueError("Native bucket ranges do not cover all optimizer parameters") + if set(records) != set(names.values()): + raise ValueError("Native optimizer state does not cover all model parameters") + return dict(sorted(records.items())) + + +def native_parameter_states(record): + parameter, leaf = record["parameter"], record["leaf"] + states = leaf._get_main_param_and_optimizer_states(parameter) + if not set(PARAMETER_KEYS).issubset(states) or set(states) - set(PARAMETER_KEYS) - {"step"}: + raise ValueError("Native master weights or Adam moments are missing or unsupported") + for key in PARAMETER_KEYS: + value = states[key] + if ( + not isinstance(value, torch.Tensor) + or value.dtype != torch.float32 + or value.device.type != "cpu" + or value.numel() != parameter.numel() + or not value.is_contiguous() + ): + raise ValueError(f"Invalid fully offloaded native {key}") + if "step" in states: + step = states["step"] + if isinstance(step, torch.Tensor): + if step.device.type != "cpu" or step.numel() != 1: + raise ValueError("Native Adam step must be a CPU scalar") + elif type(step) not in (int, float): + raise ValueError("Native Adam step must be a numeric scalar") + return states + + +def parameter_state_records(model, leaves): + records, byte_count = {}, 0 + for name, record in native_parameter_layout(model, leaves).items(): + states = native_parameter_states(record) + records[name] = {key: state_digest(value) for key, value in states.items()} + byte_count += sum( + value.numel() * value.element_size() + for value in states.values() + if isinstance(value, torch.Tensor) + ) + return records, byte_count + + +def save_bounded_parameter_state(model, leaves, rank_dir, save_tensor_file): + rank_dir = Path(rank_dir) + directory = rank_dir / "optimizer-state" + directory.mkdir() + index = { + "schema_version": 1, + "scope": "native_dp1_parameter_state", + "block_bytes": BLOCK_BYTES, + "parameters": {}, + } + extras = {} + width = BLOCK_BYTES // (len(PARAMETER_KEYS) * 4) + for parameter_index, (name, record) in enumerate( + native_parameter_layout(model, leaves).items() + ): + states = native_parameter_states(record) + entry = { + "layout": record["layout"], + "shapes": {key: list(states[key].shape) for key in PARAMETER_KEYS}, + "blocks": [], + } + count = record["parameter"].numel() + for block_index, start in enumerate(range(0, count, width)): + end = min(start + width, count) + filename = f"optimizer-state/p{parameter_index:05d}-b{block_index:05d}.pt" + # Clone bounded views: torch.save otherwise serializes their entire + # underlying native storage, which can itself be a whole buffer. + block = {key: states[key].reshape(-1)[start:end].clone() for key in PARAMETER_KEYS} + save_tensor_file(rank_dir / filename, block) + del block + entry["blocks"].append({"path": filename, "start": start, "end": end}) + extras[name] = { + key: value.clone() if isinstance(value, torch.Tensor) else value + for key, value in states.items() + if key not in PARAMETER_KEYS + } + index["parameters"][name] = entry + save_tensor_file(rank_dir / "optimizer-extra.pt", extras) + atomic_json(rank_dir / "optimizer-index.json", index) + return index + + +def parameter_state_files(rank_dir, index=None): + rank_dir = Path(rank_dir) + if index is None: + index = json.loads((rank_dir / "optimizer-index.json").read_text()) + if (index.get("schema_version"), index.get("scope"), index.get("block_bytes")) != ( + 1, + "native_dp1_parameter_state", + BLOCK_BYTES, + ): + raise ValueError("Unsupported native bounded optimizer checkpoint") + files = ["optimizer-header.pt", "optimizer-index.json", "optimizer-extra.pt"] + for entry in index["parameters"].values(): + for block in entry["blocks"]: + path = Path(block["path"]) + if len(path.parts) != 2 or path.parts[0] != "optimizer-state" or path.suffix != ".pt": + raise ValueError("Optimizer block path is outside its rank state directory") + files.append(str(path)) + if len(files) != len(set(files)): + raise ValueError("Native optimizer blocks cannot alias another parameter's state") + return files + + +def load_bounded_parameter_state(model, leaves, rank_dir): + rank_dir = Path(rank_dir) + index = json.loads((rank_dir / "optimizer-index.json").read_text()) + parameter_state_files(rank_dir, index) + current = native_parameter_layout(model, leaves) + if current.keys() != index["parameters"].keys(): + raise ValueError("Saved native optimizer parameter inventory differs") + extras = torch.load(rank_dir / "optimizer-extra.pt", map_location="cpu", weights_only=True) + if extras.keys() != current.keys(): + raise ValueError("Saved native optimizer extra-state inventory differs") + width = BLOCK_BYTES // (len(PARAMETER_KEYS) * 4) + touched_leaves = [] + with torch.no_grad(): + for name, record in current.items(): + entry = index["parameters"][name] + states = native_parameter_states(record) + shapes = {key: list(states[key].shape) for key in PARAMETER_KEYS} + if entry["layout"] != record["layout"] or entry["shapes"] != shapes: + raise ValueError("Saved native optimizer layout or state shapes differ") + position = 0 + for block in entry["blocks"]: + start, end = block["start"], block["end"] + if ( + type(start) is not int + or type(end) is not int + or start != position + or not start < end <= min(start + width, record["parameter"].numel()) + ): + raise ValueError( + "Native optimizer blocks must cover each parameter exactly once" + ) + payload = torch.load( + rank_dir / block["path"], map_location="cpu", weights_only=True + ) + if payload.keys() != set(PARAMETER_KEYS): + raise ValueError("Native optimizer block omits masters or moments") + for key in PARAMETER_KEYS: + value = payload[key] + if ( + value.dtype != torch.float32 + or value.shape != (end - start,) + or not torch.isfinite(value).all() + ): + raise ValueError("Native optimizer block shape/dtype/finite check failed") + states[key].reshape(-1)[start:end].copy_(value) + del payload + position = end + if position != record["parameter"].numel(): + raise ValueError("Native optimizer blocks do not cover the complete parameter") + if extras[name].keys() != states.keys() - set(PARAMETER_KEYS): + raise ValueError("Native optimizer extra-state schema differs") + for key, value in extras[name].items(): + if isinstance(states[key], torch.Tensor): + if not isinstance(value, torch.Tensor) or value.dtype != states[key].dtype: + raise ValueError("Native Adam scalar dtype differs") + states[key].copy_(value) + else: + if type(value) is not type(states[key]): + raise ValueError("Native Adam scalar type differs") + states[key] = value + record["leaf"]._set_main_param_and_optimizer_states(record["parameter"], states) + if record["leaf"] not in touched_leaves: + touched_leaves.append(record["leaf"]) + try: + from megatron.core.optimizer.cpu_offloading.hybrid_optimizer import HybridDeviceOptimizer + except ModuleNotFoundError: + return + + for leaf in touched_leaves: + hdo = leaf.optimizer + if isinstance(hdo, HybridDeviceOptimizer): + hdo._sync_hdo_state_to_sub_optimizers() diff --git a/scripts/qwen3_next_preflight.py b/scripts/qwen3_next_preflight.py new file mode 100644 index 000000000..2b46c266c --- /dev/null +++ b/scripts/qwen3_next_preflight.py @@ -0,0 +1,252 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Required four-GPU infrastructure checks, never full-model L2 acceptance.""" + +import argparse +import importlib.metadata +import json +import os +import platform +import subprocess +import sys +from pathlib import Path + +from qwen3_next_contract import checkpoint_identity, evidence_record, result_envelope +from qwen3_next_runtime import ( + atomic_json, + failure_fields, + memory_limits, + parse_memory_request, + subprocess_failure, + verify_checkpoint, + verify_environment, +) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--manifest", type=Path, required=True) + parser.add_argument("--output", type=Path, required=True) + args = parser.parse_args() + manifest = json.loads(args.manifest.read_text()) + output = args.output + output.mkdir(parents=True, exist_ok=True) + progress = { + "run_id": manifest["run_id"], + "attempt": os.environ["QWEN3_NEXT_ATTEMPT"], + "status": "running", + "phase": "inventory", + "full_model_l2": "not_evaluated", + } + + def run(name, command, env=None): + progress["phase"] = name + atomic_json(output / "progress.json", progress) + print(f"PREFLIGHT {name}: {command}", flush=True) + log_path = output / f"{name}.log" + with log_path.open("w") as log: + completed = subprocess.run(command, stdout=log, stderr=subprocess.STDOUT, env=env) + if completed.returncode: + raise subprocess_failure(completed.returncode, log_path) + + try: + verify_environment(manifest["environment"]) + if checkpoint_identity(manifest["checkpoint"]) != manifest["checkpoint_identity"]: + raise RuntimeError("checkpoint_mismatch: pinned metadata or shard inventory changed") + import torch + + versions = { + name: importlib.metadata.version(name) + for name in ( + "torch", + "vllm", + "triton", + "transformers", + "flashinfer-python", + "safetensors", + ) + } + nvcc = subprocess.check_output( + [f"{manifest['cuda_home']}/bin/nvcc", "--version"], text=True + ) + inventory = { + "source_commit": manifest["source_commit"], + "environment_sha256": manifest["environment_sha256"], + "visible_gpu_ids": os.environ.get("CUDA_VISIBLE_DEVICES"), + "execution_gpus": 4, + "python": sys.version, + "executable": sys.executable, + "platform": platform.platform(), + "versions": versions, + "torch_cuda": torch.version.cuda, + "nvcc": nvcc, + "compiler": subprocess.check_output(["g++", "--version"], text=True), + "nvidia_smi": subprocess.check_output(["nvidia-smi"], text=True), + "gpu_topology": subprocess.check_output(["nvidia-smi", "topo", "-m"], text=True), + "visible_gpus": [ + torch.cuda.get_device_properties(i).__repr__() + for i in range(torch.cuda.device_count()) + ], + "memory": memory_limits(), + "memory_requested": manifest.get("memory"), + } + atomic_json(output / "environment.json", inventory) + run("environment-lock", [sys.executable, "-m", "pip", "freeze", "--all"]) + if torch.cuda.device_count() != 4 or any( + "B200" not in torch.cuda.get_device_name(i) for i in range(4) + ): + raise RuntimeError( + "topology_mismatch: requires exactly four B200 GPUs in the execution step" + ) + if "V13.0.88" not in nvcc or torch.version.cuda != "13.0": + raise RuntimeError( + "environment_mismatch: requires CUDA toolkit 13.0.88 and a CUDA 13.0 torch runtime" + ) + for name, required in { + "torch": "2.13.0", + "vllm": "0.30.0", + "triton": "3.7.1", + "transformers": "5.17.0", + }.items(): + if versions[name].split("+", 1)[0] != required: + raise RuntimeError( + f"environment_mismatch: unverified runtime version: {name}={versions[name]}" + ) + memory = inventory["memory"] + quota = memory["effective_bytes"] + # Compare against what THIS run requested, recorded by the submitter, so + # the budget is not a second constant that has to be kept in sync -- and + # so a trimmed allocation fails loudly instead of passing a stale bound. + if "memory" not in manifest: + raise RuntimeError("Manifest does not record the memory request") + requested = parse_memory_request(manifest["memory"]) + if quota is None or quota < requested: + raise RuntimeError( + f"insufficient_memory: node granted less memory than this run requested " + f"({manifest['memory']} = {requested} bytes): " + f"effective={quota}, cgroup={memory['cgroup_bytes']}, " + f"declared={memory['declared_bytes']}" + ) + # A grant is not availability on a shared node. Fail in seconds rather + # than being OOM-killed minutes into a 162 GB model load. + available = memory["available_bytes"] + if available is None or available < requested: + raise RuntimeError( + f"insufficient_memory: node does not currently have the requested memory free " + f"({manifest['memory']} = {requested} bytes): " + f"MemAvailable={available}. Co-tenants can hold host RAM that an " + "allocation nominally grants; use an exclusive allocation or wait " + "for the node to drain." + ) + run("build", [sys.executable, "setup.py", "build_ext", "--inplace"]) + env = { + **os.environ, + "PY": sys.executable, + "QWEN3_NEXT_EVIDENCE_DIR": str(output / "operators"), + "QWEN3_NEXT_OPERATOR_SUITE": manifest.get("suite", "all"), + } + run("operators", ["bash", "ci/run_qwen3_next_operator_gates.sh"], env) + if manifest["stage"] == "preflight" or manifest.get("suite") in ("norm", "all"): + run( + "device-guards", + [ + sys.executable, + "-m", + "pytest", + "-q", + "tests/check_qwen3_next_multigpu.py", + f"--junitxml={output}/device-guards.xml", + ], + ) + from xml.etree import ElementTree + + suites = list( + ElementTree.parse(output / "device-guards.xml").getroot().iter("testsuite") + ) + if not suites or any( + int(s.get(k, 0)) for s in suites for k in ("skipped", "errors", "failures") + ): + raise RuntimeError("Device guards must pass without skips") + checkpoint = None + if manifest["stage"] == "preflight": + run( + "tp4", + [ + sys.executable, + "-m", + "torch.distributed.run", + "--standalone", + "--nproc_per_node=4", + "scripts/qwen3_next_tp_probe.py", + "--output", + str(output / "tp4"), + ], + ) + ranks = [ + json.loads((output / "tp4" / f"rank-{rank}.json").read_text()) for rank in range(4) + ] + if any( + row.get("status") != "passed" + or row.get("rank") != rank + or row.get("world_size") != 4 + for rank, row in enumerate(ranks) + ): + raise RuntimeError("All four TP ranks must pass") + atomic_json(output / "tp4.json", {"status": "passed", "ranks": ranks}) + progress["phase"] = "checkpoint-integrity" + atomic_json(output / "progress.json", progress) + identity = json.loads( + Path("rl_engine/testing/qwen3_next_norm_manifest.json").read_text() + ) + checkpoint = verify_checkpoint(Path(manifest["checkpoint"]), identity["model_identity"]) + atomic_json(output / "checkpoint.json", checkpoint) + run( + "rollout-smoke", + [ + sys.executable, + "scripts/qwen3_next_rollout_smoke.py", + "--model", + manifest["checkpoint"], + "--output", + str(output / "rollout-smoke.json"), + "--tensor-parallel-size", + "4", + "--non-strict-smoke", + ], + ) + import rl_engine._C + from rl_engine.integrations.qwen3_next_gdn import _provider + + provider = _provider() + names = {"operators": "operators/summary.json", "environment": "environment.json"} + if manifest["stage"] == "preflight" or manifest.get("suite") in ("norm", "all"): + names["device_guards"] = "device-guards.xml" + if manifest["stage"] == "preflight": + names.update( + tp4="tp4.json", checkpoint="checkpoint.json", rollout_smoke="rollout-smoke.json" + ) + evidence = { + name: evidence_record(output / filename, args.manifest.parent) + for name, filename in names.items() + } + result = result_envelope(manifest, os.environ["QWEN3_NEXT_ATTEMPT"], evidence=evidence) + result.update( + checkpoint=checkpoint, + provider_paths={ + "norm": rl_engine._C.__file__, + "gdn": f"{provider.__module__}.{provider.__name__}", + }, + ) + atomic_json(output / "result.json", result) + except Exception as exc: + progress.update( + status="failed", attempt=os.environ["QWEN3_NEXT_ATTEMPT"], **failure_fields(exc) + ) + atomic_json(output / "result.json", progress) + raise + + +if __name__ == "__main__": + main() diff --git a/scripts/qwen3_next_publish_evidence.py b/scripts/qwen3_next_publish_evidence.py new file mode 100644 index 000000000..1cb6cb2e7 --- /dev/null +++ b/scripts/qwen3_next_publish_evidence.py @@ -0,0 +1,142 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Copy a finished Qwen3-Next chain's evidence into the repository, without site details. + + python scripts/qwen3_next_publish_evidence.py --last \\ + --chain-report chain-report.json --out docs/usage/evidence/qwen3-next-chain- + +For every stage run on the chain (preflight -> ... -> the given run) this copies +``run.json``, ``result.json`` and every evidence file the result names (JSON +and XML only; tensor artifacts stay with the run), plus the chain report. Each +absolute root is replaced by a placeholder - ````, ````, +````, ````, ````, ```` - and host and user names +by ```` / ````. The copy fails if any file still contains a +site-specific path or name afterwards. ``redaction.json`` records what was +replaced and ``SHA256SUMS`` the published bytes; ``measured-commit.txt`` names +the commit the stages ran. +""" + +import argparse +import getpass +import hashlib +import json +import re +import shutil +import socket +from pathlib import Path + +FORBIDDEN = ( + r"/data/", + r"/home/", + r"/raid/", + r"/scratch", + r"\bdgx-", + r"SLURM_", +) +TEXT_SUFFIXES = (".json", ".xml", ".txt", ".log") + + +def chain_runs(last): + runs, run = [], Path(last).resolve() + while run is not None: + manifest = json.loads((run / "run.json").read_text()) + runs.append((manifest, run)) + run = Path(manifest["previous"]) if manifest.get("previous") else None + if runs[-1][0]["stage"] != "preflight": + raise SystemExit("The chain does not lead back to a preflight run") + if len({manifest["source_commit"] for manifest, _ in runs}) != 1: + raise SystemExit("The chain mixes source commits") + return list(reversed(runs)) + + +def replacements(runs): + """Longest-first (path, placeholder) pairs for every root the chain recorded.""" + pairs = {} + for manifest, run in runs: + pairs[str(run)] = "" + pairs[str(run.parent)] = "" + pairs[manifest["checkpoint"]] = "" + pairs[manifest["cuda_home"]] = "" + pairs[manifest["python"]] = "" + python_root = Path(manifest["python"]).parents[1] + pairs[str(python_root)] = "" + if manifest.get("training_storage"): + pairs[manifest["training_storage"]] = "" + pairs[str(Path.home())] = "" + return sorted(pairs.items(), key=lambda item: -len(item[0])) + + +def redact(text, pairs, counts): + for value, placeholder in pairs: + if value and value in text: + counts[placeholder] = counts.get(placeholder, 0) + text.count(value) + text = text.replace(value, placeholder) + for pattern, placeholder in ( + (r"/[^\s\"']*/site-packages", ""), + (r"\bdgx-[A-Za-z0-9-]+", ""), + (rf"\b{re.escape(socket.gethostname())}\b", ""), + (rf"\b{re.escape(getpass.getuser())}\b", ""), + ): + text, count = re.subn(pattern, placeholder, text) + if count: + counts[placeholder] = counts.get(placeholder, 0) + count + return text + + +def leftovers(text): + return [pattern for pattern in FORBIDDEN if re.search(pattern, text)] + + +def publish(runs, chain_report, out): + out.mkdir(parents=True, exist_ok=False) + pairs, counts, files = replacements(runs), {}, [] + for manifest, run in runs: + stage_dir = out / manifest["stage"] + stage_dir.mkdir() + result = json.loads((run / "result.json").read_text()) + sources = {"run.json": run / "run.json", "result.json": run / "result.json"} + for name, record in result.get("evidence", {}).items(): + path = run / record["path"] + if path.suffix in TEXT_SUFFIXES and path.is_file(): + sources[f"{name}{path.suffix}"] = path + for name, source in sources.items(): + target = stage_dir / name + target.write_text(redact(source.read_text(), pairs, counts)) + files.append(target) + if chain_report is not None: + target = out / "chain-report.json" + target.write_text(redact(Path(chain_report).read_text(), pairs, counts)) + files.append(target) + (out / "measured-commit.txt").write_text(runs[0][0]["source_commit"] + "\n") + (out / "redaction.json").write_text( + json.dumps({"placeholders": dict(sorted(counts.items()))}, indent=2) + "\n" + ) + files += [out / "measured-commit.txt", out / "redaction.json"] + dirty = {str(f.relative_to(out)): leftovers(f.read_text()) for f in files} + dirty = {name: found for name, found in dirty.items() if found} + if dirty: + shutil.rmtree(out) + raise SystemExit(f"Site-specific text survived redaction: {dirty}") + sums = [ + f"{hashlib.sha256(f.read_bytes()).hexdigest()} {f.relative_to(out)}" for f in sorted(files) + ] + (out / "SHA256SUMS").write_text("\n".join(sums) + "\n") + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--last", type=Path, required=True) + parser.add_argument("--chain-report", type=Path) + parser.add_argument("--out", type=Path, required=True) + args = parser.parse_args() + runs = chain_runs(args.last) + if any(not (run / "result.json").is_file() for _, run in runs): + raise SystemExit("Every stage on the chain must have finished") + publish(runs, args.chain_report, args.out) + print(f"published {len(runs)} stages to {args.out}") + + +if __name__ == "__main__": + main() diff --git a/scripts/qwen3_next_rollout_smoke.py b/scripts/qwen3_next_rollout_smoke.py new file mode 100644 index 000000000..8ebb72c84 --- /dev/null +++ b/scripts/qwen3_next_rollout_smoke.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Real-checkpoint rollout diagnostic. This does not perform VIME or L2 validation.""" + +import argparse +import json +import os +from pathlib import Path + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--model", type=Path, required=True) + parser.add_argument("--output", type=Path, required=True) + parser.add_argument("--tensor-parallel-size", type=int, default=1) + parser.add_argument("--non-strict-smoke", action="store_true") + args = parser.parse_args() + config = json.loads((args.model / "config.json").read_text()) + if config.get("model_type") != "qwen3_next" or config.get("num_hidden_layers") != 48: + raise SystemExit("Expected the full Qwen3-Next checkpoint") + os.environ["VLLM_BATCH_INVARIANT"] = "0" if args.non_strict_smoke else "1" + os.environ["VLLM_PLUGINS"] = "" + from vllm import LLM, SamplingParams + + model = LLM( + model=str(args.model.resolve()), + dtype="bfloat16", + tensor_parallel_size=args.tensor_parallel_size, + gpu_memory_utilization=0.93, + max_model_len=512, + max_num_seqs=2, + enforce_eager=True, + enable_prefix_caching=False, + seed=1234, + mamba_cache_dtype="bfloat16", + mamba_ssm_cache_dtype="float32", + kernel_config={"moe_backend": "triton", "enable_flashinfer_autotune": False}, + ) + outputs = model.generate( + ["The capital of France is", "Calculate 7 plus 5. The result is"], + SamplingParams(temperature=0.0, top_p=1.0, max_tokens=8, logprobs=1), + ) + results = [] + for output in outputs: + response = output.outputs[0] + results.append( + { + "prompt_token_ids": output.prompt_token_ids, + "response_token_ids": list(response.token_ids), + "selected_logprobs": [ + row[token].logprob for row, token in zip(response.logprobs, response.token_ids) + ], + "text": response.text, + } + ) + payload = { + "scope": "rollout_smoke_only", + "full_model_l2": "not_evaluated", + "batch_invariant_requested": not args.non_strict_smoke, + "moe_backend": "triton", + "model": str(args.model.resolve()), + "tensor_parallel_size": args.tensor_parallel_size, + "results": results, + } + args.output.parent.mkdir(parents=True, exist_ok=True) + args.output.write_text(json.dumps(payload, indent=2) + "\n") + print("REAL_CHECKPOINT_ROLLOUT_SMOKE_COMPLETE", flush=True) + + +if __name__ == "__main__": + main() diff --git a/scripts/qwen3_next_run.py b/scripts/qwen3_next_run.py new file mode 100644 index 000000000..db8133d94 --- /dev/null +++ b/scripts/qwen3_next_run.py @@ -0,0 +1,337 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Run the Qwen3-Next full-model chain inside any allocation with four B200 GPUs. + + python scripts/qwen3_next_run.py --stage all \\ + --runs-root --checkpoint --cuda-home + +Stages run in order, each in its own run directory and its own clean clone of +the current commit; ``--from``/``--until`` select a contiguous part. The stages +are ``preflight`` (environment, operator gates, device guards, TP4 probe, +checkpoint hashes, rollout smoke), ``layers`` (per-layer and +scheduler gates, which certify the shared provider), ``l2`` (full-model +train/prefill/decode raw-bit matrix), then ``train1``, ``train2`` and ``train`` +(two optimizer updates, export, L2 on the updated weights, reload and +resumption). A single stage takes ``--previous `` of its predecessor. + +Every run directory holds ``run.json`` (the immutable manifest, identified by a +fresh ``execution_id``), ``attempts//`` (the stage's output) and, once the +stage passes, ``result.json``. The launcher refuses a dirty tree and never +talks to a batch scheduler; wrap it in whatever allocation command the cluster +uses. +""" + +import argparse +import json +import os +import signal +import subprocess +import sys +from datetime import datetime, timezone +from pathlib import Path +from uuid import uuid4 + +from qwen3_next_contract import ( + CONTRACT_VERSION, + checkpoint_identity, + operator_requirements, + validate_result, +) +from qwen3_next_layer_contract import layer_requirements +from qwen3_next_runtime import ( + STAGES, + atomic_json, + failure_fields, + file_digest, + interpreter_path, + probe_environment, + require_predecessor, + verify_environment, + wait_owned_child, +) + +ROOT = Path(__file__).resolve().parents[1] +ORDER = ("preflight", "layers", "l2", "train1", "train2", "train") +PROVIDER_SOURCES = ( + "rl_engine/integrations/qwen3_next_provider.py", + "rl_engine/integrations/qwen3_next_conv.py", + "rl_engine/integrations/qwen3_next_gdn.py", + "rl_engine/integrations/qwen3_next_engine_weights.py", + "rl_engine/integrations/qwen3_next_profile.py", + "rl_engine/integrations/qwen3_next_tp.py", + "rl_engine/integrations/qwen3_next_tp_gdn.py", + "rl_engine/integrations/qwen3_next_tp_blocks.py", + "rl_engine/integrations/qwen3_next_forward.py", + "rl_engine/integrations/qwen3_next_embedding.py", + "rl_engine/integrations/qwen3_next_logprob.py", + "rl_engine/integrations/qwen3_next_vime.py", + "rl_engine/integrations/qwen3_next_vllm.py", + "rl_engine/integrations/qwen3_next_vllm_attention.py", + "rl_engine/integrations/qwen3_next_vllm_model.py", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py", + "csrc/cuda/rmsnorm.cu", +) + + +def _git(*args, cwd=ROOT): + return subprocess.check_output(["git", *args], cwd=cwd, text=True).strip() + + +def provider_config(): + return { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": False, + "sources": {name: file_digest(ROOT / name) for name in PROVIDER_SOURCES}, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": False, + "prefix_reuse": False, + "dropout": False, + "dynamic_tuning": False, + "cuda_graph": False, + "sequence_parallel": False, + "fp32_residual_connection": False, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + # Large enough that the batch-invariance matrix (up to 64 concurrent + # requests) runs under the same certified provider identity. + "native_rollout_kv_cache_memory_bytes": 4 << 30, + "runtime_env": {"TRITON_F32_DEFAULT": "ieee", "VLLM_USE_V2_MODEL_RUNNER": "0"}, + } + + +def prepare(stage, previous, args): + """Create the run directory, its clean source clone and its immutable manifest.""" + if _git("status", "--porcelain", "--untracked-files=no"): + raise SystemExit("Commit the source before starting an immutable run") + commit = _git("rev-parse", "HEAD") + checkpoint = args.checkpoint.resolve(strict=True) + stamp = datetime.now(timezone.utc).strftime("%Y%m%dT%H%M%SZ") + execution_id = uuid4().hex + run_id = f"{stamp}-{stage}-{commit[:8]}-{execution_id[:8]}" + run_dir = args.runs_root.resolve() / run_id + run_dir.mkdir(parents=True) + source = run_dir / "source" + subprocess.run( + ["git", "clone", "-q", "--shared", "--no-checkout", str(ROOT), str(source)], check=True + ) + subprocess.run(["git", "checkout", "-q", "--detach", commit], cwd=source, check=True) + python = interpreter_path(args.python) + manifest = { + "run_id": run_id, + "execution_id": execution_id, + "contract_version": CONTRACT_VERSION, + "suite": "all", + "execution_gpus": 4, + "source_tree": _git("rev-parse", "HEAD^{tree}"), + "stage": stage, + "source_commit": commit, + "source": str(source), + "python": python, + "cuda_home": str(args.cuda_home.resolve(strict=True)), + "checkpoint": str(checkpoint), + "memory": args.memory or STAGES[stage][0], + "previous": str(previous) if previous else None, + "status": "prepared", + "full_model_l2": "not_evaluated", + } + if args.training_storage_root and stage == "train1": + manifest["training_storage"] = str(args.training_storage_root.resolve(strict=True) / run_id) + environment = probe_environment(python) + manifest["environment"] = environment + manifest["environment_sha256"] = environment["sha256"] + manifest["cuda_identity"] = { + "home": manifest["cuda_home"], + "nvcc_sha256": file_digest(Path(manifest["cuda_home"]) / "bin/nvcc"), + } + manifest["checkpoint_identity"] = checkpoint_identity(checkpoint) + manifest["provider_config"] = provider_config() + manifest["operator_requirements"] = operator_requirements(ROOT, "all") + manifest["layer_requirements"] = layer_requirements(ROOT) + manifest["topology"] = {"tp": 4, "pp": 1, "cp": 1, "ep": 1} + require_predecessor(stage, previous, checkpoint, manifest) + if stage == "l2": + certificate = previous / "result.json" + manifest["scheduler_profile_certificate"] = { + "path": str(certificate), + "sha256": file_digest(certificate), + } + elif stage in ("train1", "train2", "train"): + manifest["scheduler_profile_certificate"] = json.loads((previous / "run.json").read_text())[ + "scheduler_profile_certificate" + ] + atomic_json(run_dir / "run.json", manifest) + return run_dir, manifest + + +def stage_environment(manifest, run_dir, attempt): + env = os.environ.copy() + env.pop("PYTHONHOME", None) + env.update( + CUDA_HOME=manifest["cuda_home"], + PYTHONUNBUFFERED="1", + VLLM_PLUGINS="", + MAX_JOBS="4", + KERNEL_ALIGN_DEV_RPATH="1", + QWEN3_NEXT_ATTEMPT=attempt, + QWEN3_NEXT_ALLOCATED_MEMORY=manifest["memory"], + # Four native ranks share the host. Left unpinned, each rank spins a + # thread per core on the ~50k small per-tensor loads of the HF import. + OMP_NUM_THREADS="16", + MKL_NUM_THREADS="16", + ) + # Layer gates qualify the providers without vLLM's aten overrides; the + # certified full-model stages run with them. + if manifest["stage"] in ("preflight", "layers"): + env["VLLM_BATCH_INVARIANT"] = "0" + else: + env["VLLM_BATCH_INVARIANT"] = "1" + env["QWEN_SHARED_PROFILE_RESULT"] = manifest["scheduler_profile_certificate"]["path"] + env.update(manifest["provider_config"]["runtime_env"]) + base_bin = Path(manifest["environment"]["identity"]["base_prefix"]) / "bin" + env["PATH"] = ( + f"{Path(manifest['python']).parent}:{manifest['cuda_home']}/bin:{base_bin}:{env['PATH']}" + ) + env["PYTHONPATH"] = manifest["source"] + env["TRITON_CACHE_DIR"] = str(run_dir / "cache/triton") + env["TORCH_EXTENSIONS_DIR"] = str(run_dir / "cache/torch") + return env + + +def execute(run_dir, manifest): + """Run one stage in its clone; on success write and validate ``result.json``.""" + attempt = "0" + output = run_dir / "attempts" / attempt + output.mkdir(parents=True) + status = { + "run_id": manifest["run_id"], + "execution_id": manifest["execution_id"], + "stage": manifest["stage"], + "attempt": attempt, + "status": "running", + "full_model_l2": "not_evaluated", + } + atomic_json(output / "status.json", status) + (run_dir / "RUNNING").touch() + received = None + + def stop(signum, frame): + nonlocal received + received = received or signum + + for sig in (signal.SIGUSR1, signal.SIGTERM, signal.SIGINT): + signal.signal(sig, stop) + child = None + try: + verify_environment(manifest["environment"], require_venv=manifest["stage"] != "preflight") + if manifest["environment"]["identity"]["build_tools"]["ninja"] is None: + raise RuntimeError("environment_mismatch: locked Ninja build tool is missing") + source = manifest["source"] + if _git("rev-parse", "HEAD^{tree}", cwd=source) != manifest["source_tree"] or _git( + "status", "--porcelain", "--untracked-files=no", cwd=source + ): + raise RuntimeError("source_mismatch: frozen tracked source changed") + if ( + file_digest(Path(manifest["cuda_home"]) / "bin/nvcc") + != manifest["cuda_identity"]["nvcc_sha256"] + ): + raise RuntimeError("environment_mismatch: CUDA toolkit changed") + atomic_json(output / "runtime-identity.json", manifest["environment"]) + command = [ + manifest["python"], + str(Path(source) / STAGES[manifest["stage"]][3]), + "--manifest", + str(run_dir / "run.json"), + "--output", + str(output), + ] + child = subprocess.Popen( + command, + cwd=source, + env=stage_environment(manifest, run_dir, attempt), + start_new_session=True, + ) + code = wait_owned_child(child, lambda: received is not None) + if received: + status.update(status="interrupted", signal=received, failure_kind="unknown") + elif code: + status.update( + status="failed", + exit_code=code, + **failure_fields(RuntimeError(f"Stage exited with code {code}")), + ) + failure = output / "result.json" + if failure.is_file(): + record = json.loads(failure.read_text()) + status.update({k: record[k] for k in ("failure_kind", "error") if k in record}) + else: + result = json.loads((output / "result.json").read_text()) + validate_result(manifest, result, run_dir=run_dir, attempt=attempt) + status.update(result) + atomic_json(run_dir / "result.json", result) + except Exception as exc: + status.update(status="interrupted" if received else "failed", **failure_fields(exc)) + raise + finally: + if child is not None and child.poll() is None: + wait_owned_child(child, lambda: True) + atomic_json(output / "status.json", status) + (run_dir / "RUNNING").unlink(missing_ok=True) + return status + + +def main(): + parser = argparse.ArgumentParser( + description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter + ) + parser.add_argument("--stage", choices=(*ORDER, "all"), required=True) + parser.add_argument("--runs-root", type=Path, required=True) + parser.add_argument("--checkpoint", type=Path, required=True) + parser.add_argument("--cuda-home", type=Path, required=True) + parser.add_argument("--python", type=Path, default=Path(sys.executable)) + parser.add_argument("--previous", type=Path, help="passed run directory of the predecessor") + parser.add_argument( + "--from", + dest="first", + choices=ORDER, + default="preflight", + help="with --stage all: first stage to run (later than preflight needs --previous)", + ) + parser.add_argument( + "--until", choices=ORDER, default="train", help="with --stage all: last stage to run" + ) + parser.add_argument( + "--memory", + help="host memory this allocation grants (e.g. 1280G); default: the stage's budget", + ) + parser.add_argument( + "--training-storage-root", + type=Path, + help="shared directory for training checkpoints and exports (default: in the run)", + ) + args = parser.parse_args() + if args.stage == "all": + stages = ORDER[ORDER.index(args.first) : ORDER.index(args.until) + 1] + if not stages: + raise SystemExit("--from must not come after --until") + else: + stages = (args.stage,) + if (stages[0] == "preflight") != (args.previous is None): + raise SystemExit("Every stage after preflight needs --previous ") + previous = args.previous.resolve(strict=True) if args.previous else None + for stage in stages: + run_dir, manifest = prepare(stage, previous, args) + print(f"[qwen3-next] {stage}: {run_dir}", flush=True) + status = execute(run_dir, manifest) + print(f"[qwen3-next] {stage}: {status['status']}", flush=True) + if status["status"] != "passed": + raise SystemExit(1) + previous = run_dir + + +if __name__ == "__main__": + main() diff --git a/scripts/qwen3_next_runtime.py b/scripts/qwen3_next_runtime.py new file mode 100644 index 000000000..321597ac5 --- /dev/null +++ b/scripts/qwen3_next_runtime.py @@ -0,0 +1,772 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Scheduler-independent runtime for the Qwen3-Next stage runners. + +Environment identity, failure classification, memory preconditions, owned child +processes, checkpoint verification, stage ordering and crash-recoverable +training storage. Nothing here talks to a batch scheduler: a run is identified +by the ``execution_id`` that ``scripts/qwen3_next_run.py`` writes into +``run.json``, and any allocation that provides four GPUs can host it. +""" + +import errno +import hashlib +import importlib.metadata +import json +import os +import re +import shutil +import signal +import site +import subprocess +import sys +import sysconfig +import time +from pathlib import Path +from urllib.parse import unquote, urlparse + +# --------------------------------------------------------------------------- # +# Environment identity +# --------------------------------------------------------------------------- # + + +def file_digest(path): + with Path(path).open("rb") as stream: + return hashlib.file_digest(stream, "sha256").hexdigest() + + +def identity_digest(value): + encoded = json.dumps(value, sort_keys=True, separators=(",", ":")).encode() + return hashlib.sha256(encoded).hexdigest() + + +def interpreter_path(path): + path = Path(os.path.abspath(os.path.expanduser(str(path)))) + if not path.is_file() or not os.access(path, os.X_OK): + raise ValueError(f"Python interpreter is not executable: {path}") + return str(path) + + +def source_identity(path): + path = Path(path) + result = subprocess.run( + ["git", "-C", str(path), "rev-parse", "--show-toplevel"], + capture_output=True, + text=True, + check=False, + ) + if result.returncode: + raise ValueError(f"Editable Python source has no auditable Git identity: {path}") + root = result.stdout.strip() + tree = subprocess.check_output( + ["git", "-C", root, "rev-parse", "HEAD^{tree}"], text=True + ).strip() + patch = subprocess.check_output(["git", "-C", root, "diff", "--binary", "HEAD"]) + return {"path": root, "tree": tree, "patch_sha256": hashlib.sha256(patch).hexdigest()} + + +def installed_provider_sources(distributions): + """Pin provider code inside a wheel too; unchanged metadata is insufficient. + + Editable frameworks are separately identified by Git tree and patch. vLLM + is an installed wheel in the shared environment, and local patches to its + numerical kernels or actual scheduler must invalidate the environment lock. + No framework import or GPU initialization is needed for this inventory. + """ + prefixes = ( + "vllm/model_executor/determinism/", + "vllm/model_executor/layers/mamba/", + "vllm/model_executor/layers/fused_moe/", + "vllm/model_executor/models/qwen3_next.py", + "vllm/third_party/flash_linear_attention/", + "vllm/v1/attention/", + "vllm/v1/core/sched/", + "vllm/v1/worker/", + "vllm/v1/sample/", + "vllm/config/", + "vllm/compilation/", + "vllm/distributed/", + ) + records = {} + for dist in distributions: + if dist.metadata.get("Name", "").lower().replace("_", "-") != "vllm": + continue + files = dist.files + if not files: + raise ValueError("Installed vLLM has no auditable provider file inventory") + selected = sorted( + str(path) + for path in files + if str(path).endswith(".py") and str(path).startswith(prefixes) + ) + required = "vllm/model_executor/determinism/batch_invariant.py" + if required not in selected: + raise ValueError("Installed vLLM omits the pinned shared GEMM provider") + for name in selected: + path = Path(dist.locate_file(name)) + records[name] = {"path": str(path.absolute()), "sha256": file_digest(path)} + return records + + +def installation_roots(): + """The interpreter's site directories, independent of what has been imported. + + ``sys.path`` grows at runtime: importing setuptools appends its ``_vendor`` + directory, after which ``importlib.metadata.distributions()`` also lists the + vendored packages. An identity read through ``sys.path`` therefore depends on + import order, and a worker that imports the model before verifying would + disagree with the manifest written by a fresh interpreter. Enumerate the fixed + site roots instead; in a fresh interpreter they are exactly the ``site-packages`` + entries of ``sys.path``. + """ + roots = {Path(sysconfig.get_path("purelib")), Path(sysconfig.get_path("platlib"))} + roots.update(Path(p) for p in site.getsitepackages()) + if site.ENABLE_USER_SITE: + roots.add(Path(site.getusersitepackages())) + return sorted(root for root in roots if root.is_dir()) + + +def current_identity(): + distributions = [] + sources = {} + roots = installation_roots() + installed = list(importlib.metadata.distributions(path=[str(root) for root in roots])) + for dist in installed: + if dist.metadata.get("Name", "").lower().replace("_", "-") in {"rl-engine", "rl-kernel"}: + continue + direct = dist.read_text("direct_url.json") + if direct: + direct_value = json.loads(direct) + if direct_value.get("dir_info", {}).get("editable"): + location = Path(unquote(urlparse(direct_value["url"]).path)) + # This project is loaded from the frozen source snapshot instead. + if dist.metadata.get("Name", "").lower().replace("_", "-") != "rl-engine": + sources[str(location)] = source_identity(location) + distributions.append( + { + "name": dist.metadata.get("Name"), + "version": dist.version, + "metadata_sha256": identity_digest(dist.read_text("METADATA")), + "direct_url": direct, + } + ) + pth = {} + for root in roots: + for path in sorted(root.glob("*.pth")): + pth[str(path)] = file_digest(path) + for line in path.read_text().splitlines(): + location = Path(line) + if ( + line + and not line.startswith(("#", "import ")) + and location.is_absolute() + and location.is_dir() + ): + if (location / ".git").exists(): + sources[str(location)] = source_identity(location) + config = Path(sys.prefix) / "pyvenv.cfg" + ninja = next( + ( + Path(prefix) / "bin/ninja" + for prefix in (sys.prefix, sys.base_prefix) + if (Path(prefix) / "bin/ninja").is_file() + ), + None, + ) + build_tools = {"ninja": {"path": str(ninja), "sha256": file_digest(ninja)} if ninja else None} + identity = { + "executable": sys.executable, + "binary": str(Path(sys.executable).resolve()), + "binary_sha256": file_digest(sys.executable), + "prefix": sys.prefix, + "base_prefix": sys.base_prefix, + "version": sys.version, + "pyvenv_cfg_sha256": file_digest(config) if config.is_file() else None, + "distributions": sorted( + distributions, key=lambda item: (item["name"] or "", item["version"]) + ), + "build_tools": build_tools, + "pth": pth, + "sources": sources, + "installed_provider_sources": installed_provider_sources(installed), + } + return {"sha256": identity_digest(identity), "identity": identity} + + +def probe_environment(python): + command = [interpreter_path(python), str(Path(__file__).absolute()), "--json"] + env = os.environ.copy() + env.pop("PYTHONHOME", None) + env.pop("PYTHONPATH", None) + output = subprocess.check_output(command, text=True, env=env, timeout=180) + return json.loads(output) + + +def verify_environment(expected, *, require_venv=False): + actual = current_identity() + if actual != expected: + raise RuntimeError( + "environment_mismatch: interpreter, dependencies or editable source changed" + ) + if require_venv and sys.prefix == sys.base_prefix: + raise RuntimeError("environment_mismatch: training/recompute requires the isolated venv") + return actual + + +if __name__ == "__main__": + print(json.dumps(current_identity(), sort_keys=True)) + + +# --------------------------------------------------------------------------- # +# Failure classification +# --------------------------------------------------------------------------- # + + +FAILURE_KINDS = frozenset( + { + "environment_mismatch", + "source_mismatch", + "checkpoint_mismatch", + "topology_mismatch", + "insufficient_memory", + "insufficient_disk", + "out_of_memory", + "time_limit", + "unknown", + } +) + + +class ProcessFailure(RuntimeError): + def __init__(self, message, *, failure_kind): + super().__init__(message) + self.failure_kind = failure_kind + + +def failure_kind(error=None, *, text=""): + explicit = getattr(error, "failure_kind", None) + if explicit in FAILURE_KINDS: + return explicit + if isinstance(error, (TimeoutError, subprocess.TimeoutExpired)): + return "time_limit" + if isinstance(error, OSError) and error.errno == errno.ENOSPC: + return "insufficient_disk" + if type(error).__name__ == "OutOfMemoryError": + return "out_of_memory" + if isinstance(error, (ImportError, ModuleNotFoundError)): + return "environment_mismatch" + detail = f"{type(error).__name__}: {error}\n{text}" if error is not None else text + for kind in sorted(FAILURE_KINDS - {"unknown", "out_of_memory", "time_limit"}): + if re.search(rf"\b{kind}\s*:", detail): + return kind + if re.search(r"\bOutOfMemoryError\s*:|CUDA out of memory", detail, re.IGNORECASE): + return "out_of_memory" + if re.search(r"\bENOSPC\b|\[Errno 28\]|No space left on device", detail): + return "insufficient_disk" + if re.search(r"\b(?:ModuleNotFoundError|ImportError)\s*:", detail): + return "environment_mismatch" + if re.search(r"\b(?:TimeoutExpired|TimeoutError|time_limit)\s*:", detail): + return "time_limit" + # Signals, exit 137, MemoryError and a bare 'Killed' are not proof of CUDA OOM. + return "unknown" + + +def failure_fields(error): + return {"failure_kind": failure_kind(error), "error": f"{type(error).__name__}: {error}"} + + +def subprocess_failure(code, log_path): + with Path(log_path).open("rb") as stream: + stream.seek(0, 2) + stream.seek(max(0, stream.tell() - 65536)) + tail = stream.read().decode("utf-8", errors="replace") + return ProcessFailure( + f"Native model process failed with exit {code}; see {log_path}\n{tail}", + failure_kind=failure_kind(text=tail), + ) + + +# --------------------------------------------------------------------------- # +# Memory, checkpoint and atomic files +# --------------------------------------------------------------------------- # + + +def atomic_json(path, payload): + path = Path(path) + temporary = path.with_suffix(path.suffix + ".partial") + with temporary.open("w") as stream: + stream.write(json.dumps(payload, indent=2) + "\n") + stream.flush() + os.fsync(stream.fileno()) + temporary.replace(path) + fd = os.open(path.parent, os.O_RDONLY | os.O_DIRECTORY) + try: + os.fsync(fd) + finally: + os.close(fd) + + +def digest(path): + with path.open("rb") as stream: + return hashlib.file_digest(stream, "sha256").hexdigest() + + +_MEMORY_SUFFIXES = {"K": 1024, "M": 1024**2, "G": 1024**3, "T": 1024**4} + + +def parse_memory_request(text): + """A memory size (e.g. ``1280G``) in bytes; a bare number is MB.""" + text = str(text).strip() + if not text: + raise RuntimeError("Empty memory request") + scale = _MEMORY_SUFFIXES.get(text[-1].upper()) + digits = text[:-1] if scale else text + if not digits.isdigit(): + raise RuntimeError(f"Unparseable memory request: {text!r}") + return int(digits) * (scale if scale else 1024**2) + + +def available_memory_bytes(): + """MemAvailable, i.e. what the kernel thinks can be had without swapping.""" + for line in Path("/proc/meminfo").read_text().splitlines(): + if line.startswith("MemAvailable:"): + return int(line.split()[1]) * 1024 + return None + + +def memory_limits(environ=None): + """Every known memory ceiling, and what is free right now. + + ``effective_bytes`` is the smallest of the cgroup limit and the allocation + the launcher declares in ``QWEN3_NEXT_ALLOCATED_MEMORY`` (``--memory``). + It is None only when neither is known, which the stages treat as a hard + failure: host free memory alone is never taken as a grant. + ``available_bytes`` is a snapshot of MemAvailable; on a shared node a grant + is not an availability guarantee, so both are checked. + """ + environ = os.environ if environ is None else environ + records = {} + for line in Path("/proc/self/cgroup").read_text().splitlines(): + _, controllers, relative = line.split(":", 2) + if controllers == "": + root, name = Path("/sys/fs/cgroup"), "memory.max" + elif "memory" in controllers.split(","): + root, name = Path("/sys/fs/cgroup/memory"), "memory.limit_in_bytes" + else: + continue + current = root / relative.lstrip("/") + while current.is_relative_to(root): + path = current / name + if path.is_file(): + records[str(path)] = path.read_text().strip() + if current == root: + break + current = current.parent + finite = [int(value) for value in records.values() if value.isdigit() and int(value) < 2**60] + declared = environ.get("QWEN3_NEXT_ALLOCATED_MEMORY") + sources = { + "cgroup_bytes": min(finite) if finite else None, + "declared_bytes": parse_memory_request(declared) if declared else None, + } + known = [value for value in sources.values() if value is not None] + return { + "limits": records, + **sources, + "effective_bytes": min(known) if known else None, + "available_bytes": available_memory_bytes(), + } + + +def verify_checkpoint(checkpoint, identity): + if checkpoint.name != identity["revision"]: + raise RuntimeError("Checkpoint revision does not match the pinned manifest") + config = json.loads((checkpoint / "config.json").read_text()) + for key, value in identity["config_fingerprint"].items(): + if config.get(key) != value: + raise RuntimeError(f"Checkpoint architecture mismatch: {key}") + snapshot = identity["weight_snapshot"] + if digest(checkpoint / snapshot["index_file"]) != snapshot["index_sha256"]: + raise RuntimeError("Checkpoint index checksum mismatch") + for shard in snapshot["shards"]: + path = checkpoint / shard["filename"] + if path.stat().st_size != shard["size_bytes"] or digest(path) != shard["sha256"]: + raise RuntimeError(f"Checkpoint shard checksum mismatch: {path.name}") + return { + "model_id": identity["model_id"], + "revision": identity["revision"], + "content_hash": snapshot["content_hash"], + "shards_verified": len(snapshot["shards"]), + "metadata_sha256": {p.name: digest(p) for p in sorted(checkpoint.glob("*.json"))}, + } + + +# --------------------------------------------------------------------------- # +# Owned child processes +# --------------------------------------------------------------------------- # + + +def signal_group(child, signum): + try: + os.killpg(child.pid, signum) + except ProcessLookupError: + pass + + +def wait_owned_child(child, interrupted, *, grace_seconds=10): + deadline = None + while True: + if interrupted() and deadline is None: + signal_group(child, signal.SIGTERM) + deadline = time.monotonic() + grace_seconds + if deadline is not None and time.monotonic() >= deadline: + # Kill the group even if its leader exited, so grandchildren cannot linger. + signal_group(child, signal.SIGKILL) + return child.wait(timeout=10) + code = child.poll() + if code is not None and deadline is None: + return code + time.sleep(0.05) + + +# --------------------------------------------------------------------------- # +# Stage order +# --------------------------------------------------------------------------- # + +STAGES = { + "preflight": ("256G", "01:00:00", None, "scripts/qwen3_next_preflight.py"), + "layers": ("512G", "04:00:00", "preflight", "scripts/qwen3_next_layers.py"), + "l2": ("512G", "04:00:00", "layers", "scripts/qwen3_next_l2.py"), + # The training acceptance is split so no single job holds a node for a day: + # train1 = update1 + export + L2, train2 = update2 + export + L2 (continues + # train1's durable state), train = reload + L2 + continuous/resumed controls. + "train1": ("1280G", "06:00:00", "l2", "scripts/qwen3_next_training.py"), + "train2": ("1280G", "07:00:00", "train1", "scripts/qwen3_next_training.py"), + "train": ("1280G", "09:00:00", "train2", "scripts/qwen3_next_training.py"), +} + + +def require_predecessor(stage, previous, checkpoint, expected=None): + """The previous stage's run passed, finished, and pinned the same identity.""" + from qwen3_next_contract import acceptance_identity, checkpoint_identity, validate_result + + predecessor = STAGES[stage][2] + if predecessor is None: + return + if previous is None: + raise ValueError(f"{stage} requires a passed {predecessor} run") + manifest = json.loads((previous / "run.json").read_text()) + result = json.loads((previous / "result.json").read_text()) + if manifest["stage"] != predecessor or result.get("status") != "passed": + raise ValueError("predecessor stage has not passed") + if (previous / "RUNNING").exists(): + raise ValueError("predecessor run is still executing") + validate_result(manifest, result, run_dir=previous) + if manifest["checkpoint_identity"] != checkpoint_identity(checkpoint): + raise ValueError("predecessor checkpoint identity mismatch") + if expected is not None and acceptance_identity(manifest) != acceptance_identity(expected): + raise ValueError("predecessor source/environment/provider/topology identity mismatch") + + +# --------------------------------------------------------------------------- # +# Training storage +# --------------------------------------------------------------------------- # + + +def _boundary(name): + """CPU fault-injection seam; production deliberately performs no action.""" + + +def _sync(path): + descriptor = os.open(path, os.O_RDONLY | os.O_DIRECTORY) + try: + os.fsync(descriptor) + finally: + os.close(descriptor) + + +def _read(path): + if path.is_symlink() or not path.is_file(): + raise ValueError(f"Missing or external storage ownership record: {path}") + return json.loads(path.read_text()) + + +def _write(path, value): + if path.is_symlink() or path.with_suffix(path.suffix + ".partial").is_symlink(): + raise ValueError("Storage intent cannot follow a symlink") + atomic_json(path, value) + + +def _root_record(root, identity): + return { + "schema_version": 1, + "scope": "qwen3_next_owned_storage", + "root": str(root), + "identity": identity, + } + + +def owned_root(root, identity): + root = Path(root).absolute() + if root.is_symlink(): + raise ValueError("Training storage root cannot be a symlink") + root = root.resolve() + root.parent.mkdir(parents=True, exist_ok=True) + parent_owner = root.parent / f".{root.name}.owner.json" + expected = _root_record(root, identity) + if parent_owner.exists(): + if _read(parent_owner) != expected: + raise ValueError("Training storage belongs to another run") + else: + # Existing deployments can migrate only with their original owner. + # An interrupted new creation has no directory until parent proof lands. + if root.exists() and any(root.iterdir()): + if _read(root / "RUN_OWNER.json") != identity: + raise ValueError("Existing training files lack a matching run owner") + _write(parent_owner, expected) + _boundary("root_owner_persisted") + root.mkdir(exist_ok=True) + _sync(root.parent) + _boundary("root_created") + owner = root / "RUN_OWNER.json" + if owner.exists() and _read(owner) != identity: + raise ValueError("Internal training owner disagrees with durable parent proof") + _write(owner, identity) + return root + + +def require_owner(root, identity): + root = Path(root).absolute() + if root.is_symlink() or not root.is_dir(): + raise ValueError("Training storage must be a direct owned directory") + root = root.resolve() + if _read(root.parent / f".{root.name}.owner.json") != _root_record(root, identity): + raise ValueError("Training storage lacks matching durable parent ownership") + return root + + +def _child(root, name): + if not isinstance(name, str) or not name or Path(name).name != name or name in (".", ".."): + raise ValueError("Storage intent must name one direct child") + path = root / name + if path.is_symlink(): + raise ValueError("Storage intents cannot follow target symlinks") + return path + + +def create_staging(root, destination_name, metadata): + if metadata.get("status") != "staging": + raise ValueError("Staging creation needs an explicit unpublished status") + root = require_owner(root, metadata["identity"]) + destination = _child(root, destination_name) + if destination.name.startswith(".") or destination.suffix: + raise ValueError("Published storage names must remain visible and have no suffix") + staging = destination.with_suffix(".partial") + if destination.exists() or staging.exists(): + raise ValueError("A staging intent cannot adopt an existing directory") + intent = root / f".{destination.name}.staging.json" + value = { + "schema_version": 1, + "scope": "qwen3_next_staging_intent", + "identity": metadata["identity"], + "staging": staging.name, + "published": destination.name, + "metadata": metadata, + } + if intent.exists(): + raise ValueError("Staging names cannot reuse an earlier durable intent") + _write(intent, value) + _boundary("staging_intent_persisted") + staging.mkdir() + _sync(root) + _boundary("staging_created") + _write(staging / "STAGING.json", metadata) + _boundary("staging_marker_persisted") + return staging, destination + + +def _finish_retirement(root, intent, record, *, recovering=False): + target, tombstone = _child(root, record["target"]), _child(root, record["tombstone"]) + if target.exists() and tombstone.exists(): + raise ValueError("Retirement has conflicting original and tombstone directories") + if record["status"] == "retired": + if target.exists() or tombstone.exists(): + raise ValueError("Retired storage name was unexpectedly reused") + return record + if "successor" in record["proof"]: + successor = Path(record["proof"]["successor"]) + if successor.parent != root or successor.is_symlink() or successor == target: + raise ValueError("Retirement successor escaped its owning run") + if recovering: + from qwen3_next_checkpoint import validate_checkpoint + + if ( + validate_checkpoint(successor, record["identity"]) + != record["proof"]["successor_complete"] + ): + raise ValueError("Retirement successor no longer matches its verified publication") + if target.exists(): + marker, expected, optional = _retirement_marker(record) + marker = target / marker + if marker.exists() or marker.is_symlink() or not optional: + if _read(marker) != expected: + raise ValueError("Retirement target differs from its durable ownership proof") + target.rename(tombstone) + _sync(root) + _boundary("retirement_renamed") + if tombstone.exists(): + shutil.rmtree(tombstone) + _sync(root) + _boundary("retirement_removed") + record = {**record, "status": "retired"} + _write(intent, record) + _boundary("retirement_committed") + return record + + +def retire_directory(path, root, identity, *, proof): + root = require_owner(root, identity) + path = Path(path).absolute() + if path.is_symlink(): + raise ValueError("Retirement cannot follow a target symlink") + path = path.resolve() + if path.parent != root or path.name.startswith("."): + raise ValueError("Retirement target must be a visible direct child of this run") + target = _child(root, path.name) + intent = root / f".{target.name}.delete.json" + recovering = intent.exists() + if recovering: + record = _read(intent) + _validate_retirement(record, target.name, identity) + if record["proof"] != proof: + raise ValueError("Retirement retry changed its original ownership proof") + else: + if not target.is_dir(): + raise ValueError("Cannot authorize retirement of an unknown directory") + record = { + "schema_version": 1, + "scope": "qwen3_next_retirement", + "identity": identity, + "target": target.name, + "tombstone": f".{target.name}.deleting", + "status": "retiring", + "proof": proof, + } + _validate_retirement(record, target.name, identity) + _write(intent, record) + _boundary("retirement_intent_persisted") + return _finish_retirement(root, intent, record, recovering=recovering) + + +def _validate_retirement(record, target, identity): + if ( + record.get("schema_version") != 1 + or record.get("scope") != "qwen3_next_retirement" + or record.get("identity") != identity + or record.get("target") != target + or target.startswith(".") + or record.get("tombstone") != f".{target}.deleting" + or record.get("status") not in ("retiring", "retired") + or not isinstance(record.get("proof"), dict) + ): + raise ValueError("Retirement intent belongs to another target/run or is malformed") + _retirement_marker(record) + + +def _retirement_marker(record): + """Bind a destructive intent to one of the supported ownership proofs.""" + proof, identity = record["proof"], record["identity"] + if proof.get("scope") == "qwen3_next_staging_intent": + metadata = proof.get("metadata", {}) + published = proof.get("published") + if ( + proof.get("schema_version") != 1 + or proof.get("identity") != identity + or proof.get("staging") != record["target"] + or not isinstance(published, str) + or Path(published).name != published + or published.startswith(".") + or Path(published).suffix + or str(Path(published).with_suffix(".partial")) != record["target"] + or metadata.get("identity") != identity + or metadata.get("status") != "staging" + ): + raise ValueError("Staging retirement proof does not own its target") + return "STAGING.json", metadata, True + if proof.get("status") == "staging" and proof.get("identity") == identity: + if Path(record["target"]).suffix != ".partial": + raise ValueError("Legacy staging proof cannot authorize a published directory") + return "STAGING.json", proof, False + complete, successor = proof.get("complete", {}), proof.get("successor_complete", {}) + if ( + complete.get("identity") == identity + and complete.get("status") == "complete" + and successor.get("identity") == identity + and successor.get("status") == "complete" + and type(complete.get("step")) is int + and type(successor.get("step")) is int + and complete["step"] < successor["step"] + and isinstance(proof.get("successor"), str) + ): + return "COMPLETE.json", complete, False + exported = proof.get("export", {}) + if exported.get("training_identity") == identity and exported.get("status") == "complete": + return "EXPORT_COMPLETE.json", exported, False + raise ValueError("Retirement lacks a supported same-run ownership proof") + + +def recover_storage(root, identity): + root = require_owner(root, identity) + recovered = [] + for intent in sorted(root.glob(".*.delete.json")): + record = _read(intent) + target = record.get("target") + _child(root, target) + _validate_retirement(record, target, identity) + if intent.name != f".{target}.delete.json": + raise ValueError("Retirement filename contradicts its target") + if record["status"] == "retiring": + recovered.append(_finish_retirement(root, intent, record, recovering=True)) + else: + _finish_retirement(root, intent, record) + for intent in sorted(root.glob(".*.staging.json")): + record = _read(intent) + if ( + record.get("schema_version") != 1 + or record.get("scope") != "qwen3_next_staging_intent" + or record.get("identity") != identity + or record.get("metadata", {}).get("identity") != identity + or record.get("metadata", {}).get("status") != "staging" + ): + raise ValueError("Staging intent belongs to another run or is malformed") + staging, published = _child(root, record["staging"]), _child(root, record["published"]) + if ( + published.name.startswith(".") + or published.suffix + or staging != published.with_suffix(".partial") + or intent.name != f".{published.name}.staging.json" + ): + raise ValueError("Staging intent paths do not describe one publication") + if staging.exists() and published.exists(): + raise ValueError("Staging and published copies cannot coexist") + if staging.exists(): + marker = staging / "STAGING.json" + if marker.exists() and _read(marker) != record["metadata"]: + raise ValueError("Staging marker differs from its durable parent intent") + recovered.append(retire_directory(staging, root, identity, proof=record)) + # A marker from the earlier protocol can prove ownership, but an arbitrary + # directory with neither marker nor parent intent must never be deleted. + for staging in sorted(root.glob("*.partial")): + if not staging.is_dir(): + continue + metadata = _read(staging / "STAGING.json") + if metadata.get("identity") != identity or metadata.get("status") != "staging": + raise ValueError("Interrupted state belongs to another run or lacks a matching owner") + recovered.append(retire_directory(staging, root, identity, proof=metadata)) + return recovered + + +def training_storage_root(manifest, run_root): + """The run's checkpoint and export root: ``--training-storage`` or ``/training-state``.""" + shared = manifest.get("training_storage") + return Path(shared) if shared else Path(run_root) / "training-state" diff --git a/scripts/qwen3_next_tp_head_check.py b/scripts/qwen3_next_tp_head_check.py new file mode 100644 index 000000000..6e65b6292 --- /dev/null +++ b/scripts/qwen3_next_tp_head_check.py @@ -0,0 +1,141 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Real-weight TP4 embedding, final norm, LM-head and logprob component gate.""" + +import argparse +import json +import os +from datetime import timedelta +from pathlib import Path + +import torch +import torch.distributed as dist +from qwen3_next_contract import atomic_json +from safetensors import safe_open + +from rl_engine.integrations.qwen3_next_embedding import shared_embedding +from rl_engine.integrations.qwen3_next_forward import shared_linear, shared_logprob +from rl_engine.integrations.qwen3_next_logprob import qwen_logprob_contract +from rl_engine.integrations.qwen3_next_tp import _CopyToTP +from rl_engine.kernels.ops.cuda.norm.rmsnorm import Qwen3NextRMSNormCudaOp +from rl_engine.testing.tensor_identity import assert_tensor_bitwise_equal as exact + +REQUIRED_CASES = [ + "hf-embedding-roundtrip", + "hf-lm-head-roundtrip", + "replicated-norm-gradient", + "nonzero-finite-embedding-head-gradient", + "embedding-repeat-100", + *[f"batch-invariant-prompt{length}" for length in (8, 64, 256, 1024)], + "logprob-original-and-promoted-logits", + "entropy-interface", +] + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--checkpoint", type=Path, required=True) + parser.add_argument("--output", type=Path, required=True) + args = parser.parse_args() + rank = int(os.environ["LOCAL_RANK"]) + if int(os.environ["WORLD_SIZE"]) != 4 or torch.cuda.device_count() != 4: + raise RuntimeError("Head acceptance requires four ranks and four visible GPUs") + torch.cuda.set_device(rank) + dist.init_process_group( + "nccl", timeout=timedelta(minutes=10), device_id=torch.device("cuda", rank) + ) + group = dist.group.WORLD + try: + index = json.loads((args.checkpoint / "model.safetensors.index.json").read_text())[ + "weight_map" + ] + + def load(name): + with safe_open(args.checkpoint / index[name], framework="pt", device="cpu") as reader: + value = reader.get_tensor(name) + if value.dtype != torch.bfloat16: + raise ValueError("Official component weight must be BF16") + return value + + weights = {} + for name in ("model.embed_tokens.weight", "lm_head.weight"): + original = load(name) + local = torch.nn.Parameter(original.chunk(4)[rank].cuda().contiguous()) + peers = [torch.empty_like(local) for _ in range(4)] + dist.all_gather(peers, local.detach()) + exact(torch.cat(peers).cpu(), original, name=f"loaded {name} HF roundtrip") + weights[name] = local + del original, peers + embedding, head = weights["model.embed_tokens.weight"], weights["lm_head.weight"] + norm = torch.nn.Parameter(load("model.norm.weight").cuda()) + norm_op = Qwen3NextRMSNormCudaOp() + + def forward(tokens): + hidden = shared_embedding(tokens, embedding, group) + normalized = norm_op(hidden, norm, eps=1e-6) + return shared_linear(_CopyToTP.apply(normalized, group), head) + + with torch.no_grad(): + for length in (8, 64, 256, 1024): + tokens = torch.arange(4 * (length + 16), device="cuda", dtype=torch.int64) + tokens = ((tokens * 2399 + 1) % 151936).reshape(4, length + 16) + batch = forward(tokens) + singleton = forward(tokens[:1]) + exact(batch[:1], singleton, name=f"embedding/norm/LM batch {length}") + repeated = torch.tensor([1, 37985, 75969, 113953, 1, 75969], device="cuda") + expected = shared_embedding(repeated, embedding, group) + for _ in range(100): + exact(shared_embedding(repeated, embedding, group), expected) + + tokens = torch.tensor([1, 37985, 75969, 113953] * 4, device="cuda") + logits = forward(tokens) + contract = qwen_logprob_contract(logits, rank=rank, world_size=4) + logp, lse, entropy = shared_logprob(logits, tokens, contract=contract, tp_group=group) + promoted = logits.float() + promoted_logp, _, _ = shared_logprob( + promoted, + tokens, + contract=qwen_logprob_contract(promoted, rank=rank, world_size=4), + tp_group=group, + ) + exact(logp, promoted_logp, name="native VIME loss input promotion") + without_entropy, _, no_entropy = shared_logprob( + logits, tokens, contract=contract, tp_group=group, with_entropy=False + ) + exact(logp, without_entropy, name="entropy request logprob identity") + if no_entropy is not None or not all(torch.isfinite(t).all() for t in (entropy, lse)): + raise AssertionError("Entropy/LSE interface is invalid") + (-logp.mean()).backward() + for name, parameter in (("embedding", embedding), ("lm_head", head), ("norm", norm)): + gradient = parameter.grad + valid = gradient is not None + valid = valid and bool(torch.isfinite(gradient).all() and gradient.count_nonzero()) + if not valid: + raise AssertionError(f"Missing finite nonzero {name} gradient") + peers = [torch.empty_like(norm.grad) for _ in range(4)] + dist.all_gather(peers, norm.grad) + for peer in peers: + exact(peer, norm.grad, name="replicated final norm gradient") + from rl_engine.integrations.qwen3_next_binary import imported_provider_identity + + args.output.mkdir(parents=True, exist_ok=True) + atomic_json( + args.output / f"rank-{rank}.json", + { + "status": "passed", + "scope": "tp4_embedding_lm_head_only", + "rank": rank, + "provider_binary": imported_provider_identity(), + "full_model_l2": "not_evaluated", + "cases": sorted(REQUIRED_CASES), + }, + ) + dist.barrier() + finally: + dist.destroy_process_group() + + +if __name__ == "__main__": + main() diff --git a/scripts/qwen3_next_tp_probe.py b/scripts/qwen3_next_tp_probe.py new file mode 100644 index 000000000..fd55d6d56 --- /dev/null +++ b/scripts/qwen3_next_tp_probe.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Four independent NCCL ranks must communicate exactly before model loading.""" + +import argparse +import os +from datetime import timedelta +from pathlib import Path + +import torch +import torch.distributed as dist +from qwen3_next_runtime import atomic_json + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--output", type=Path, required=True) + args = parser.parse_args() + rank = int(os.environ["LOCAL_RANK"]) + if int(os.environ["WORLD_SIZE"]) != 4: + raise RuntimeError("This probe requires TP=4") + torch.cuda.set_device(rank) + dist.init_process_group( + "nccl", timeout=timedelta(minutes=3), device_id=torch.device("cuda", rank) + ) + try: + value = torch.arange(1024, device="cuda", dtype=torch.int64) + rank + gathered = [torch.empty_like(value) for _ in range(4)] + dist.all_gather(gathered, value) + for peer, actual in enumerate(gathered): + assert torch.equal(actual, torch.arange(1024, device="cuda") + peer) + dist.all_reduce(value) + assert torch.equal(value, 4 * torch.arange(1024, device="cuda") + 6) + torch.cuda.synchronize() + args.output.mkdir(parents=True, exist_ok=True) + atomic_json( + args.output / f"rank-{rank}.json", + { + "status": "passed", + "rank": rank, + "world_size": 4, + "device": torch.cuda.get_device_name(), + "nccl": torch.cuda.nccl.version(), + }, + ) + dist.barrier() + finally: + dist.destroy_process_group() + + +if __name__ == "__main__": + main() diff --git a/scripts/qwen3_next_training.py b/scripts/qwen3_next_training.py new file mode 100644 index 000000000..21c52025a --- /dev/null +++ b/scripts/qwen3_next_training.py @@ -0,0 +1,1077 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Native RL update, full-model L2 and atomic restart acceptance on four GPUs.""" + +import argparse +import json +import math +import os +import re +import shutil +import signal +import subprocess +import sys +import time +from pathlib import Path +from uuid import uuid4 + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT)) + +from qwen3_next_checkpoint import ( # noqa: E402 + newest_complete_checkpoint, + publish_checkpoint, + resume_interrupted_publications, + validate_checkpoint, + write_rank_manifest, +) +from qwen3_next_contract import ( # noqa: E402 + SCOPES, + atomic_json, + evidence_record, + result_envelope, + validate_result, +) +from qwen3_next_l2 import check_ready as check_l2_ready # noqa: E402 +from qwen3_next_l2 import ( # noqa: E402 + model_identity, + run_matrix, + run_process, + verify_before_model_load, + wait_gpu_release, +) +from qwen3_next_runtime import failure_fields # noqa: E402 +from qwen3_next_runtime import ( # noqa: E402 + file_digest, + owned_root, + recover_storage, + retire_directory, + training_storage_root, + verify_environment, +) + +from rl_engine.integrations.qwen3_next_native_training import ( # noqa: E402 + policy_fixture, + run_training_phase, + validate_active_parameter_names, +) +from rl_engine.integrations.qwen3_next_training import state_digest # noqa: E402 +from rl_engine.testing.qwen3_next_binary import ( # noqa: E402 + archive_provider_binary, + validate_binary_record, +) +from rl_engine.testing.qwen3_next_l2 import ( # noqa: E402 + case_matrix, + checked_artifact_path, + compare_artifacts, + json_digest, + load_tensor_artifact, + validate_matrix_report, +) + +SECTIONS = ( + "baseline", + "update1", + "update2", + "reload", + "continuous_step3", + "resumed_step3", + "checkpoint", + "fault_injection", +) +FAULTS = ("interrupted_writer", "missing_rank", "hash_error", "unpublished_load") +PHASES = ("update1", "update2", "reload", "continuous", "resumed") +# Each training stage runs the phases up to its last one and leaves the durable +# state (checkpoints, journal) for the next stage to continue from. +STAGE_LAST_PHASE = {"train1": "update1", "train2": "update2", "train": "resumed"} + + +def stage_phases(stage): + """Phases a training stage executes, in order.""" + last = STAGE_LAST_PHASE[stage] + return PHASES[: PHASES.index(last) + 1] + + +def continued_training_storage(previous): + """Durable state a continuing stage resumes: the train1 run's, however many stages back. + + train2 continues train1's storage instead of creating its own, so the final + stage must follow the predecessor chain back to the run that owns the state. + """ + run = Path(previous) + for _ in range(len(STAGE_LAST_PHASE)): + manifest = json.loads((run / "run.json").read_text()) + if manifest.get("stage") == "train1": + return training_storage_root(manifest, run) + if manifest.get("stage") not in STAGE_LAST_PHASE or not manifest.get("previous"): + break + run = Path(manifest["previous"]) + raise ValueError("Training continuation does not lead back to a train1 run") + + +def continuation_identity_matches(journal_identity, model_identity_value, fixture_sha256): + """A later training stage continues a journal only for the same model/env/fixture.""" + expected = {**model_identity_value, "fixture_sha256": fixture_sha256} + actual = {k: v for k, v in journal_identity.items() if k not in ("run_id", "execution_id")} + return actual == expected + + +EVENTS = ( + "l2:baseline", + "worker:update1", + "l2:update1", + "worker:update2", + "l2:update2", + "worker:reload", + "l2:reload", + "worker:continuous", + "worker:resumed", +) + + +def record(path): + path = Path(path).absolute() + return {"path": str(path), "sha256": file_digest(path)} + + +def read_record(value): + path = Path(value["path"]) + if ( + not path.is_absolute() + or path.is_symlink() + or not path.is_file() + or file_digest(path) != value["sha256"] + ): + raise ValueError(f"Training evidence changed or is missing: {path}") + return json.loads(path.read_text()) + + +def require_digest(value): + if ( + not isinstance(value, str) + or len(value) != 64 + or any(char not in "0123456789abcdef" for char in value) + ): + raise ValueError("Training state contains an invalid original-byte digest") + + +def validate_state(state, *, rank, step, identity, parameters): + expected = { + "schema_version": 1, + "scope": "native_vime_training_state", + "rank": rank, + "identity": identity, + "step": step, + "sample_position": step * 4, + "consumed_train_samples": step * 4, + "fixture_sha256": identity["fixture_sha256"], + } + hash_fields = { + "model_sha256", + "optimizer_parameter_sha256", + "optimizer_header_sha256", + "scheduler_sha256", + "rng_sha256", + "state_sha256", + } + if set(state) != set(expected) | hash_fields or any( + state.get(key) != value for key, value in expected.items() + ): + raise ValueError("Native state omits or changes rank/step/sample/fixture identity") + if ( + state_digest({key: value for key, value in state.items() if key != "state_sha256"}) + != state["state_sha256"] + ): + raise ValueError("Native state digest does not bind the recorded recovery state") + if not isinstance(state["model_sha256"], list) or len(state["model_sha256"]) != 1: + raise ValueError("Native state requires the complete single PP1 model chunk") + for value in state["model_sha256"] + [ + state[key] for key in ("optimizer_header_sha256", "scheduler_sha256", "rng_sha256") + ]: + require_digest(value) + moments = state["optimizer_parameter_sha256"] + if set(moments) != set(parameters): + raise ValueError("Native optimizer state does not cover every trainable parameter") + for values in moments.values(): + if not {"param", "exp_avg", "exp_avg_sq"}.issubset(values): + raise ValueError("Native state omitted FP32 masters or Adam moments") + for value in values.values(): + require_digest(value) + + +def validate_journal(journal, identity, *, verify_files=True): + if journal.get("schema_version") != 1 or journal.get("identity") != identity: + raise ValueError("Training journal belongs to different source/environment/fixture") + events = journal.get("events", []) + if events != list(EVENTS[: len(events)]) or not events: + raise ValueError("Training journal did not preserve update/L2/reload/control order") + if set(journal.get("workers", {})) != { + event.split(":")[1] for event in events if event.startswith("worker:") + }: + raise ValueError("Training journal worker records disagree with durable phase order") + if set(journal.get("l2_reports", {})) != { + event.split(":")[1] for event in events if event.startswith("l2:") + }: + raise ValueError("Training journal L2 records disagree with durable phase order") + if verify_files: + for value in journal["workers"].values(): + read_record(value) + for value in journal["l2_reports"].values(): + validate_matrix_report(read_record(value)) + + +def repeat_reload_in_current_attempt(journal, attempt): + """Restore durable updates, but never pass with an older attempt's final reload.""" + if "reload" not in journal["workers"]: + return False + original = read_record(journal["workers"]["reload"]) + if original.get("attempt") == str(attempt): + return False + if not str(original.get("attempt", "")).isdigit(): + raise ValueError("Recovery source has no valid attempt identity") + cutoff = journal["events"].index("worker:reload") + retired = { + "reason": "repeat_final_reload_and_controls_in_current_attempt", + "from_attempt": original["attempt"], + "to_attempt": str(attempt), + "events": journal["events"][cutoff:], + "workers": { + phase: journal["workers"].pop(phase) + for phase in ("reload", "continuous", "resumed") + if phase in journal["workers"] + }, + "l2_report": journal["l2_reports"].pop("reload", None), + } + journal["events"] = journal["events"][:cutoff] + journal.setdefault("recovery", []).append(retired) + return True + + +def validate_update(audit, *, step, fixture): + if (audit.get("step"), audit.get("sample_position"), audit.get("fixture")) != ( + step, + step * 4, + fixture, + ): + raise ValueError("Native policy update progress/fixture mismatch") + norm = audit.get("grad_norm", float("nan")) + if audit.get("policy_loss_calls") != 4 or not math.isfinite(norm) or norm <= 0: + raise ValueError("Native policy update needs four losses and a finite nonzero norm") + before, after = ( + audit.get("parameter_hashes_before", {}), + audit.get("parameter_hashes_after", {}), + ) + if not before or before.keys() != after.keys(): + raise ValueError("Native update must hash every trainable parameter before and after") + validate_active_parameter_names(before) + for value in [*before.values(), *after.values()]: + require_digest(value) + if audit.get("progress") != { + "consumed_before": (step - 1) * 4, + "consumed_after": step * 4, + "scheduler_before": (step - 1) * 4, + "scheduler_after": step * 4, + "sample_counter_owner": "qwen3_next_native_training.policy_step", + }: + raise ValueError("Native update did not commit matching sample/scheduler progress") + changed = [name for name in before if before[name] != after[name]] + if not changed or sorted(changed) != sorted(audit.get("changed_parameters", [])): + raise ValueError("Native optimizer did not prove an actual parameter change") + gradients = audit.get("gradients", {}) + parameters, groups = gradients.get("parameters", {}), gradients.get("active_groups", {}) + if parameters.keys() != before.keys() or groups.keys() != before.keys(): + raise ValueError("Every active parameter tensor must have predeclared gradient evidence") + for name in before: + if ( + parameters[name].get("present") is not True + or parameters[name].get("nonzero") is not True + ): + raise ValueError(f"Active parameter tensor has no valid gradient: {name}") + if parameters[name].get("dtype") not in ("torch.float32", "torch.bfloat16"): + raise ValueError("Active gradient evidence omitted or changed its storage dtype") + if groups[name] != [name]: + raise ValueError("Active gradient group was substituted after execution") + metrics = audit.get("metrics", {}) + if not metrics or any( + type(value) not in (int, float) or not math.isfinite(value) for value in metrics.values() + ): + raise ValueError("Native policy loss must retain finite scalar training metrics") + return True + + +def validate_worker(value, *, phase, identity): + if ( + value.get("schema_version") != 1 + or value.get("status") != "passed" + or value.get("phase") != phase + or value.get("identity") != identity + or value.get("all_rank_processes_exited") is not True + or value.get("gpu_release_verified") is not True + or [rank.get("rank") for rank in value.get("ranks", [])] != list(range(4)) + ): + raise ValueError("Incomplete native four-rank worker evidence") + pids = [rank.get("pid") for rank in value["ranks"]] + if any(type(pid) is not int or pid <= 0 for pid in pids) or len(set(pids)) != 4: + raise ValueError("Native worker requires four distinct rank processes") + binary = validate_binary_record( + value.get("provider_binary"), source_tree=identity["source_tree"] + ) + for rank, row in enumerate(value["ranks"]): + if row.get("provider_binary") != binary: + raise ValueError("Native training rank differs from its archived CUDA provider") + if row.get("identity") != identity or row.get("phase") != phase: + raise ValueError("Native rank identity mismatch") + if row.get("native_entrypoints") != [ + "vime.backends.megatron_utils.model.setup_model_and_optimizer", + "vime.backends.megatron_utils.model.train_one_step", + "vime.backends.megatron_utils.loss.policy_loss_function", + ]: + raise ValueError("Worker did not identify the required native training entrypoints") + if phase in ("continuous", "resumed"): + controls = row.get("controls", {}) + if set(controls) != ({"1", "2", "3"} if phase == "continuous" else {"3"}): + raise ValueError("Native recovery controls omitted or added an update") + updates = [(int(step), control) for step, control in controls.items()] + elif phase == "reload": + restored = row.get("restored", {}) + audit = restored.get("rank_evidence", {}).get("update_evidence", {}) + updates = [(2, {"update": audit, "state": row.get("state", {})})] + else: + updates = [(1 if phase == "update1" else 2, row)] + for step, control in updates: + audit = control["update"] + validate_update(audit, step=step, fixture=identity["fixture_sha256"]) + validate_state( + control["state"], + rank=rank, + step=step, + identity=identity, + parameters=audit["parameter_hashes_after"], + ) + + +def validate_export_evidence(worker, identity): + from qwen3_next_training_export import validate_training_export_record + + evidence = worker["export_evidence"] + complete = read_record(evidence["complete"]) + checkpoint_identity = validate_training_export_record( + complete, worker["export"]["checkpoint_identity"] + ) + if checkpoint_identity != worker["export"]["checkpoint_identity"]: + raise ValueError("Archived export proof differs from the weights actually tested by L2") + if complete["training_identity"] != identity: + raise ValueError("Archived export belongs to another native training identity") + read_record(evidence["index"]) + # The original completion record binds the exact index bytes, including HF + # tensor-to-shard mapping. Historical proof never authorizes loading a file. + if complete["files"]["model.safetensors.index.json"]["sha256"] != evidence["index"]["sha256"]: + raise ValueError("Archived export index differs from its completion manifest") + audits = [ + ( + row["restored"]["rank_evidence"]["update_evidence"] + if worker["phase"] == "reload" + else row["update"] + ) + for row in worker["ranks"] + ] + if complete.get("model_identity_method") != "native_parameter_hashes_after" or complete[ + "model_rank_sha256" + ] != [state_digest(audit["parameter_hashes_after"]) for audit in audits]: + raise ValueError("HF export bytes do not belong to the actual optimizer-updated actor") + + +def archive_export(worker, directory, identity): + from qwen3_next_training_export import validate_training_export + + export = worker["export"] + root = Path(export["checkpoint"]) + validate_training_export(root, export["checkpoint_identity"]) + evidence = {} + for kind, name in ( + ("complete", "EXPORT_COMPLETE.json"), + ("index", "model.safetensors.index.json"), + ): + destination = Path(directory) / name + # Atomic JSON preserves the parsed content, while recording the index's + # original bytes is required for the completion manifest hash binding. + with destination.open("xb") as output, (root / name).open("rb") as source: + shutil.copyfileobj(source, output) + output.flush() + os.fsync(output.fileno()) + evidence[kind] = record(destination) + worker["export_evidence"] = evidence + validate_export_evidence(worker, identity) + + +def compare_reload_matrices(updated, reloaded): + """Reopen every original phase artifact; a saved passed boolean is insufficient.""" + ids = [case.case_id for case in case_matrix()] + if any( + matrix.get("case_ids") != ids or set(matrix.get("cases", {})) != set(ids) + for matrix in (updated, reloaded) + ): + raise ValueError("Reload comparison requires both complete sixteen-case matrices") + result = {"status": "passed", "raw_bit_comparison": True, "case_ids": ids, "cases": {}} + for case in ids: + result["cases"][case] = {} + for role in ("rollout", "recompute"): + left = load_tensor_artifact( + checked_artifact_path(updated["cases"][case]["artifacts"][role]) + ) + right = load_tensor_artifact( + checked_artifact_path(reloaded["cases"][case]["artifacts"][role]) + ) + compared = compare_artifacts(left, right) + if not compared["passed"]: + raise ValueError( + f"Reload changed original {role} tensor bits/state at {case}: {compared}" + ) + result["cases"][case][role] = compared["comparisons"] + return result + + +def validate_training_report(report, *, verify_files=True): + """No partial matrix, optimizer header or stale worker can close training.""" + if ( + report.get("schema_version") != 1 + or report.get("status") != "passed" + or report.get("scope") != "qwen3_next_training_and_reload" + or report.get("required_sections") != list(SECTIONS) + ): + raise ValueError("Incomplete/unsupported native training acceptance") + if not verify_files: + raise ValueError("Training acceptance requires verification of original evidence files") + if report.get("events") != list(EVENTS): + raise ValueError("Training acceptance omitted or reordered a required phase") + l2 = report.get("l2_reports", {}) + workers = report.get("workers", {}) + if set(l2) != {"baseline", "update1", "update2", "reload"} or set(workers) != { + "update1", + "update2", + "reload", + "continuous", + "resumed", + }: + raise ValueError("Training omitted an update, full L2 matrix or recovery control") + matrices = {} + versions = { + "baseline": "baseline", + "update1": "update-1", + "update2": "update-2", + "reload": "reload-2", + } + for phase, item in l2.items(): + matrices[phase] = matrix = read_record(item) + validate_matrix_report(matrix) + identity = matrix["identity"] + if identity.get("weight_version") != versions[phase]: + raise ValueError("Training phase used the wrong model weight version") + immutable = set(report["identity"]) - { + "checkpoint", + "checkpoint_identity", + "weight_version", + "base_checkpoint", + "base_checkpoint_identity", + } + if any(identity.get(key) != report["identity"][key] for key in immutable): + raise ValueError("Training phase changed source, environment, provider or topology") + if phase == "baseline": + if identity != report["identity"]: + raise ValueError("Training baseline must retain the exact original model identity") + elif (identity.get("base_checkpoint"), identity.get("base_checkpoint_identity")) != ( + report["identity"]["checkpoint"], + report["identity"]["checkpoint_identity"], + ): + raise ValueError("Updated actor export changed its official base checkpoint identity") + if matrix["fixture"]["content_sha256"] != report["l2_fixture_sha256"]: + raise ValueError("Training L2 changed its frozen input tokens") + identity = report["training_identity"] + if {key: identity.get(key) for key in report["identity"]} != report["identity"]: + raise ValueError("Training checkpoint is detached from the baseline model identity") + if report.get("reload_matches_update2") != compare_reload_matrices( + matrices["update2"], matrices["reload"] + ): + raise ValueError("Reload report does not match the reopened original phase artifacts") + phases = {} + for phase, item in workers.items(): + value = phases[phase] = read_record(item) + validate_worker(value, phase=phase, identity=identity) + if phase in ("update1", "update2", "reload"): + validate_export_evidence(value, identity) + export = value["export"] + if any(rank["export"] != export for rank in value["ranks"]): + raise ValueError("Native ranks disagree on exported weights") + for key in ("checkpoint", "checkpoint_identity", "weight_version"): + if export[key] != matrices[phase]["identity"][key]: + raise ValueError("L2 did not test the actual updated/reloaded actor export") + if phase in ("update1", "update2"): + step = 1 if phase == "update1" else 2 + for rank in value["ranks"]: + validate_update(rank["update"], step=step, fixture=identity["fixture_sha256"]) + for rank in range(4): + if ( + phases["update2"]["ranks"][rank]["update"]["parameter_hashes_before"] + != phases["update1"]["ranks"][rank]["update"]["parameter_hashes_after"] + ): + raise ValueError("Step2 did not start from the actual completed step1 parameters") + if phases["update2"]["ranks"][rank]["state"] != phases["reload"]["ranks"][rank]["state"]: + raise ValueError("Step2 model/optimizer/scheduler/RNG/progress changed on restart") + continuous = phases["continuous"]["ranks"][rank]["controls"] + resumed = phases["resumed"]["ranks"][rank]["controls"] + if set(continuous) != {"1", "2", "3"} or set(resumed) != {"3"}: + raise ValueError("Continuous/restarted controls omitted a required update") + for step in (1, 2, 3): + validate_update( + continuous[str(step)]["update"], step=step, fixture=identity["fixture_sha256"] + ) + if ( + step < 3 + and continuous[str(step)]["state"] + != phases[f"update{step}"]["ranks"][rank]["state"] + ): + raise ValueError("Continuous reference changed an earlier update") + validate_update(resumed["3"]["update"], step=3, fixture=identity["fixture_sha256"]) + if continuous["3"]["state"] != resumed["3"]["state"]: + raise ValueError("Continuous and restarted step3 states are not exactly equal") + checkpoint = report["checkpoint"] + complete = validate_checkpoint(checkpoint["path"], identity, verify_files=False) + if ( + complete["step"] != 2 + or file_digest(Path(checkpoint["path"]) / "COMPLETE.json") != checkpoint["sha256"] + ): + raise ValueError("Training acceptance requires the verified complete step2 checkpoint") + for rank in range(4): + progress = json.loads( + (Path(checkpoint["path"]) / f"rank-{rank}" / "progress.json").read_text() + ) + state = phases["update2"]["ranks"][rank]["state"] + for key in state.keys() - {"scope", "state_sha256"}: + if progress.get(key) != state[key]: + raise ValueError( + "Published checkpoint bytes contradict the step2 recovery identity" + ) + if progress.get("update_evidence") != phases["update2"]["ranks"][rank]["update"]: + raise ValueError("Published checkpoint detached the committed optimizer update") + validate_fault_evidence(read_record(report["fault_injection"]), identity) + return json_digest(report) + + +def validate_fault_evidence(faults, identity): + from qwen3_next_checkpoint import _validate_ranks + + if faults.get("identity") != identity or set(faults.get("cases", {})) != set(FAULTS): + raise ValueError("Checkpoint publication fault matrix is incomplete") + if any(value.get("passed") is not True for value in faults["cases"].values()): + raise ValueError("An interrupted/corrupted checkpoint was not rejected") + interrupted = faults["cases"]["interrupted_writer"] + if interrupted.get("exit_code") != -signal.SIGTERM: + raise ValueError("Interrupted writer did not record its actual termination") + checked_artifact_path(interrupted["writer_file"]) + for case in FAULTS: + path = Path(faults["cases"][case]["checkpoint"]) + if path.is_symlink() or path.suffix != ".partial" or not path.is_dir(): + raise ValueError("Fault evidence did not preserve its original unpublished directory") + try: + if case in ("missing_rank", "hash_error"): + _validate_ranks(path, world_size=4, identity=identity) + else: + validate_checkpoint(path, identity) + except (OSError, ValueError) as exc: + if case == "missing_rank" and not isinstance(exc, FileNotFoundError): + raise ValueError("Missing-rank fixture failed for an unrelated reason") from exc + if case == "hash_error" and not re.search("checksum mismatch|size mismatch", str(exc)): + raise ValueError("Corruption fixture failed for an unrelated reason") from exc + else: + raise ValueError(f"Fault fixture no longer reproduces its rejection: {case}") + + +def checkpoint_faults(output, identity): + """Kill a real writer and corrupt protocol files; never touch model checkpoints.""" + output = Path(output) + output.mkdir(parents=True, exist_ok=False) + partial = output / "interrupted.partial" + partial.mkdir() + code = ( + "import pathlib,sys,time; p=pathlib.Path(sys.argv[1]); " + "p.write_bytes(b'incomplete checkpoint'); time.sleep(300)" + ) + child = subprocess.Popen( + [sys.executable, "-c", code, str(partial / "writing")], start_new_session=True + ) + deadline = time.monotonic() + 10 + try: + while not (partial / "writing").exists(): + if child.poll() is not None or time.monotonic() > deadline: + raise RuntimeError("Fault injection writer did not start") + time.sleep(0.01) + os.killpg(child.pid, signal.SIGTERM) + code = child.wait(timeout=10) + finally: + if child.poll() is None: + os.killpg(child.pid, signal.SIGKILL) + child.wait(timeout=10) + recovery = newest_complete_checkpoint(output, identity) + cases = { + "interrupted_writer": { + "passed": code != 0 and recovery["checkpoint"] is None, + "exit_code": code, + "checkpoint": str(partial), + "writer_file": record(partial / "writing"), + } + } + try: + validate_checkpoint(partial, identity) + except (OSError, ValueError) as exc: + cases["unpublished_load"] = {"passed": True, "error": str(exc), "checkpoint": str(partial)} + partial = output / "missing.partial" + partial.mkdir() + for rank in range(4): + files = {} + for role in ("model", "optimizer", "rng", "progress"): + path = partial / f"rank-{rank}-{role}.bin" + path.write_bytes(f"{rank}:{role}".encode()) + files[role] = [path.name] + write_rank_manifest( + partial, + rank=rank, + world_size=4, + identity=identity, + step=2, + sample_position=8, + files=files, + ) + hidden = partial / "rank-3.manifest.json" + corrupted = output / "corrupted.partial" + shutil.copytree(partial, corrupted) + hidden.unlink() + try: + publish_checkpoint(partial, output / "missing", world_size=4, identity=identity) + except (OSError, ValueError) as exc: + cases["missing_rank"] = {"passed": True, "error": str(exc), "checkpoint": str(partial)} + (corrupted / "rank-2-optimizer.bin").write_bytes(b"corrupt optimizer bytes") + try: + publish_checkpoint(corrupted, output / "corrupted", world_size=4, identity=identity) + except (OSError, ValueError) as exc: + cases["hash_error"] = {"passed": True, "error": str(exc), "checkpoint": str(corrupted)} + result = { + "identity": identity, + "scope": "actual_checkpoint_publication_protocol", + "cases": cases, + } + if set(cases) != set(FAULTS) or not all(value["passed"] for value in cases.values()): + raise ValueError("Checkpoint fault injection accepted incomplete state") + validate_fault_evidence(result, identity) + atomic_json(output / "faults.json", result) + return record(output / "faults.json") + + +def _owned_remove(path, root, identity=None, *, proof=None): + path, root = Path(path), Path(root) + if path.is_symlink() or root.is_symlink() or not path.is_dir(): + raise ValueError("Cleanup target is not a directory owned by this training run") + path, root = path.resolve(), root.resolve() + if path.parent != root: + raise ValueError("Cleanup target is not a direct child of this training run") + if identity is None or proof is None: + raise ValueError("Cleanup requires explicit ownership and retirement proof") + return retire_directory(path, root, identity, proof=proof) + + +def remove_interrupted(root, identity): + return recover_storage(root, identity) + + +def retire_export(worker, root, identity): + validate_export_evidence(worker, identity) + path = Path(worker["export"]["checkpoint"]) + if not path.exists(): + return # A prior attempt may have retired it after durable L2 publication. + complete = path / "EXPORT_COMPLETE.json" + if ( + complete.is_symlink() + or json.loads(complete.read_text()) != worker["export"]["checkpoint_identity"] + ): + raise ValueError("Cleanup export is not the artifact whose complete L2 was retained") + _owned_remove( + path, + root, + identity, + proof={ + "export": worker["export"]["checkpoint_identity"], + "evidence": worker["export_evidence"], + }, + ) + + +def remove_uncommitted_exports(root, identity, journal): + """A crash after export publication cannot retain an unbounded extra copy.""" + from qwen3_next_training_export import validate_training_export_record + + keep = { + str(Path(read_record(item)["export"]["checkpoint"]).resolve()) + for phase, item in journal["workers"].items() + if phase in ("update1", "update2", "reload") and phase not in journal["l2_reports"] + } + removed = [] + for path in Path(root).iterdir(): + if ( + not path.is_dir() + or path.suffix == ".partial" + or path.name.startswith(".") + or str(path.resolve()) in keep + ): + continue + marker = path / "EXPORT_COMPLETE.json" + if path.is_symlink() or marker.is_symlink() or not marker.is_file(): + raise ValueError("Completed export cleanup has no safe ownership proof") + complete = json.loads(marker.read_text()) + validate_training_export_record(complete, complete) + if complete["training_identity"] != identity: + raise ValueError("Completed export belongs to another training run") + removed.append( + {"path": str(path.absolute()), "complete": complete, "action": "retire_unneeded_export"} + ) + _owned_remove(path, root, identity, proof={"export": complete}) + return removed + + +def execute(manifest_path, output): + from qwen3_next_runtime import require_predecessor + + manifest_path, output = Path(manifest_path).resolve(), Path(output).resolve() + manifest = json.loads(manifest_path.read_text()) + run_root = manifest_path.parent + stage = manifest["stage"] + if stage not in STAGE_LAST_PHASE: + raise ValueError("Native training runner requires a training stage") + previous = Path(manifest["previous"]) + require_predecessor(stage, previous, Path(manifest["checkpoint"]), manifest) + prior_result = json.loads((previous / "result.json").read_text()) + continuation = stage != "train1" + if continuation: + # Continue the predecessor training run's durable state under its own identity. + if manifest.get("training_storage"): + raise ValueError("A continuing training stage uses its predecessor's storage") + durable = continued_training_storage(previous) + journal_path = durable / "journal.json" + journal = json.loads(journal_path.read_text()) + baseline_path = Path(journal["l2_reports"]["baseline"]["path"]) + else: + baseline_path = previous / prior_result["evidence"]["l2_matrix"]["path"] + baseline = json.loads(baseline_path.read_text()) + validate_matrix_report(baseline, expected_identity=model_identity(manifest)) + fixture_path = Path(baseline["fixture"]["path"]) + if file_digest(fixture_path) != baseline["fixture"]["sha256"]: + raise ValueError("Baseline L2 fixture was changed") + fixture = policy_fixture(fixture_path) + if continuation: + identity = journal["identity"] + if not continuation_identity_matches( + identity, model_identity(manifest), fixture.content_sha256 + ): + raise ValueError("Training continuation identity differs from the journal") + if journal["l2_reports"]["baseline"] != record(baseline_path): + raise ValueError("Training continuation baseline L2 changed") + else: + identity = { + **model_identity(manifest), + "run_id": manifest["run_id"], + "execution_id": manifest["execution_id"], + "fixture_sha256": fixture.content_sha256, + } + durable = training_storage_root(manifest, run_root) + if not durable.is_absolute(): + raise ValueError("Training storage must be an absolute path") + durable.mkdir(parents=True, exist_ok=True) + checkpoint_root, export_root = durable / "checkpoints", durable / "exports" + owned_root(checkpoint_root, identity) + owned_root(export_root, identity) + journal_path = durable / "journal.json" + journal = { + "schema_version": 1, + "identity": identity, + "workers": {}, + "l2_reports": {"baseline": record(baseline_path)}, + "events": ["l2:baseline"], + "recovery": [], + } + if journal_path.exists(): + journal = json.loads(journal_path.read_text()) + validate_journal(journal, identity) + for phase, value in journal["workers"].items(): + worker = read_record(value) + validate_worker(worker, phase=phase, identity=identity) + if phase in ("update1", "update2", "reload"): + validate_export_evidence(worker, identity) + if repeat_reload_in_current_attempt(journal, os.environ["QWEN3_NEXT_ATTEMPT"]): + validate_journal(journal, identity, verify_files=False) + atomic_json(journal_path, journal) + verify_environment(manifest["environment"], require_venv=True) + check_l2_ready() + run_process( + [manifest["python"], str(ROOT / "setup.py"), "build_ext", "--inplace"], + log_path=output / "build.log", + timeout=1800, + ) + provider_binary = archive_provider_binary(ROOT, output, source_tree=manifest["source_tree"]) + probe = output / "gpu-probe.json" + run_process( + [ + manifest["python"], + str(ROOT / "scripts/qwen3_next_l2.py"), + "--gpu-probe", + "--output", + str(probe), + ], + log_path=output / "gpu-probe.log", + timeout=180, + ) + uuids = json.loads(probe.read_text())["uuids"] + wait_gpu_release(uuids) + # A preempted attempt may have written a whole checkpoint without publishing it: + # publish it (full validation) before interrupted state is retired. + journal["recovery"].extend(resume_interrupted_publications(checkpoint_root, identity)) + for root in (checkpoint_root, export_root): + journal["recovery"].extend(remove_interrupted(root, identity)) + journal["recovery"].extend(remove_uncommitted_exports(export_root, identity, journal)) + atomic_json(journal_path, journal) + export_bytes = sum( + value["size"] for value in manifest["checkpoint_identity"]["shards"].values() + ) + for phase in stage_phases(stage): + if phase not in journal["workers"]: + recovery = newest_complete_checkpoint(checkpoint_root, identity, verify_files=False) + checkpoint = None if phase == "continuous" else recovery["checkpoint"] + directory = output / f"{phase}-{uuid4().hex}" + directory.mkdir() + request = { + "manifest": manifest, + "phase": phase, + "identity": identity, + "fixture": str(fixture_path), + "checkpoint": checkpoint, + "checkpoint_root": str(checkpoint_root), + "export_root": str(export_root), + "export_bytes": export_bytes, + "provider_binary": provider_binary, + "expected_states": { + str(step): [ + rank["state"] + for rank in read_record(journal["workers"][f"update{step}"])["ranks"] + ] + for step in (1, 2) + if f"update{step}" in journal["workers"] + }, + } + request_path, worker_path = directory / "request.json", directory / "worker.json" + atomic_json(request_path, request) + process = run_process( + [ + manifest["python"], + str(Path(__file__)), + "--worker-request", + str(request_path), + "--output", + str(worker_path), + ], + log_path=directory / "worker.log", + timeout=8 * 3600, + ) + wait_gpu_release(uuids) + worker = json.loads(worker_path.read_text()) + worker.update( + { + "gpu_release_verified": True, + "process": process, + "attempt": os.environ["QWEN3_NEXT_ATTEMPT"], + } + ) + validate_worker(worker, phase=phase, identity=identity) + if phase in ("update1", "update2", "reload"): + archive_export(worker, directory, identity) + atomic_json(worker_path, worker) + journal["workers"][phase] = record(worker_path) + journal["events"].append(f"worker:{phase}") + validate_journal(journal, identity, verify_files=False) + atomic_json(journal_path, journal) + worker = read_record(journal["workers"][phase]) + if phase in ("update1", "update2", "reload") and phase not in journal["l2_reports"]: + directory = output / f"{phase}-l2-{uuid4().hex}" + directory.mkdir() + phase_manifest = { + **manifest, + **worker["export"], + "memory": "512G", + "input_fixture": str(fixture_path), + "input_fixture_sha256": file_digest(fixture_path), + "prebuilt_provider_binary": provider_binary, + } + phase_manifest_path = directory / "manifest.json" + atomic_json(phase_manifest_path, phase_manifest) + matrix = run_matrix(phase_manifest_path, directory, fixture_path) + validate_matrix_report(matrix, expected_identity=model_identity(phase_manifest)) + journal["l2_reports"][phase] = record(directory / "l2-matrix.json") + journal["events"].append(f"l2:{phase}") + validate_journal(journal, identity, verify_files=False) + atomic_json(journal_path, journal) + if phase == "reload": + journal["reload_matches_update2"] = compare_reload_matrices( + read_record(journal["l2_reports"]["update2"]), + read_record(journal["l2_reports"]["reload"]), + ) + atomic_json(journal_path, journal) + # Native workers retire the previous full checkpoint immediately after + # verified successor publication; export retirement waits for durable L2. + if phase in ("update1", "update2", "reload"): + retire_export(worker, export_root, identity) + if stage != "train": + _close_partial_training_stage( + manifest, output, run_root, previous, prior_result, journal, identity, baseline, uuids + ) + return + last = read_record(journal["workers"]["reload"])["checkpoint"] + report = { + "schema_version": 1, + "status": "passed", + "scope": "qwen3_next_training_and_reload", + "identity": model_identity(manifest), + "training_identity": identity, + "required_sections": list(SECTIONS), + "l2_fixture_sha256": baseline["fixture"]["content_sha256"], + "l2_reports": journal["l2_reports"], + "workers": journal["workers"], + "events": journal["events"], + "recovery": journal["recovery"], + "reload_matches_update2": journal["reload_matches_update2"], + "checkpoint": {"path": last, "sha256": file_digest(Path(last) / "COMPLETE.json")}, + "fault_injection": checkpoint_faults(output / "checkpoint-faults", identity), + "attempt": os.environ["QWEN3_NEXT_ATTEMPT"], + } + validate_training_report(report) + atomic_json(output / "training-report.json", report) + atomic_json(output / "reload.json", report) + shutil.copyfile(journal["l2_reports"]["reload"]["path"], output / "l2-matrix.json") + shutil.copyfile( + previous / prior_result["evidence"]["operators"]["path"], output / "operators.json" + ) + atomic_json( + output / "environment.json", + {"environment": manifest["environment"], "gpu_uuids": uuids, "execution_gpus": 4}, + ) + evidence = { + name: evidence_record(output / filename, run_root) + for name, filename in { + "updates": "training-report.json", + "reload": "reload.json", + "l2_matrix": "l2-matrix.json", + "operators": "operators.json", + "environment": "environment.json", + }.items() + } + result = result_envelope(manifest, os.environ["QWEN3_NEXT_ATTEMPT"], evidence=evidence) + result.update(full_model_l2="passed", training_and_reload="passed") + validate_result(manifest, result, run_dir=run_root, attempt=os.environ["QWEN3_NEXT_ATTEMPT"]) + atomic_json(output / "result.json", result) + + +def _close_partial_training_stage( + manifest, output, run_root, previous, prior_result, journal, identity, baseline, uuids +): + """Record a train1/train2 result: its phases, L2 matrix and the checkpoint left behind.""" + stage = manifest["stage"] + last_phase = STAGE_LAST_PHASE[stage] + checkpoint = read_record(journal["workers"][last_phase])["checkpoint"] + phases = list(stage_phases(stage)) + if any( + phase not in journal["workers"] or phase not in journal["l2_reports"] for phase in phases + ): + raise ValueError("Partial training stage closed before its phases completed") + progress = { + "schema_version": 1, + "status": "passed", + "scope": SCOPES[stage], + "identity": model_identity(manifest), + "training_identity": identity, + "phases": phases, + "l2_fixture_sha256": baseline["fixture"]["content_sha256"], + "l2_reports": journal["l2_reports"], + "workers": journal["workers"], + "events": journal["events"], + "recovery": journal["recovery"], + "checkpoint": { + "path": checkpoint, + "sha256": file_digest(Path(checkpoint) / "COMPLETE.json"), + }, + "attempt": os.environ["QWEN3_NEXT_ATTEMPT"], + } + atomic_json(output / "training-progress.json", progress) + shutil.copyfile(journal["l2_reports"][last_phase]["path"], output / "l2-matrix.json") + shutil.copyfile( + previous / prior_result["evidence"]["operators"]["path"], output / "operators.json" + ) + atomic_json( + output / "environment.json", + {"environment": manifest["environment"], "gpu_uuids": uuids, "execution_gpus": 4}, + ) + evidence = { + name: evidence_record(output / filename, run_root) + for name, filename in { + "updates": "training-progress.json", + "l2_matrix": "l2-matrix.json", + "operators": "operators.json", + "environment": "environment.json", + }.items() + } + result = result_envelope(manifest, os.environ["QWEN3_NEXT_ATTEMPT"], evidence=evidence) + result.update(full_model_l2="passed", training_phases=phases) + validate_result(manifest, result, run_dir=run_root, attempt=os.environ["QWEN3_NEXT_ATTEMPT"]) + atomic_json(output / "result.json", result) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--manifest", type=Path) + parser.add_argument("--output", type=Path) + parser.add_argument("--worker-request", type=Path) + parser.add_argument("--check-ready", action="store_true") + args = parser.parse_args() + if args.check_ready: + check_l2_ready() + from qwen3_next_training_checkpoint import save_training_checkpoint # noqa: F401 + from qwen3_next_training_export import export_training_weights # noqa: F401 + + print(json.dumps({"status": "ready", "native_training": True})) + return 0 + if args.output is None: + parser.error("--output is required") + if args.worker_request: + request = json.loads(args.worker_request.read_text()) + verify_environment(request["manifest"]["environment"], require_venv=True) + verify_before_model_load(request["manifest"], args.output.parent) + run_training_phase(request, args.output) + return 0 + if args.manifest is None: + parser.error("--manifest is required") + args.output.mkdir(parents=True, exist_ok=True) + try: + execute(args.manifest, args.output) + except Exception as exc: + atomic_json( + args.output / "result.json", + { + "run_id": json.loads(args.manifest.read_text())["run_id"], + "attempt": os.environ["QWEN3_NEXT_ATTEMPT"], + "status": "failed", + "training_and_reload": "not_passed", + **failure_fields(exc), + }, + ) + raise + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/qwen3_next_training_checkpoint.py b/scripts/qwen3_next_training_checkpoint.py new file mode 100644 index 000000000..75347aba4 --- /dev/null +++ b/scripts/qwen3_next_training_checkpoint.py @@ -0,0 +1,602 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Serialize the real native VIME/Megatron training state, one TP rank at a time. + +DistributedOptimizer.state_dict() deliberately omits master weights and Adam +moments. The bounded native parameter getter/setter adapter preserves all of +these states without allocating whole-bucket CPU packing copies. Publication +and recovery use the all-rank atomic protocol. +""" + +import gc +import json +import os +import uuid +from pathlib import Path + +import torch +import torch.distributed as dist +from qwen3_next_checkpoint import ( + newest_complete_checkpoint, + publish_checkpoint, + require_checkpoint_disk_space, + validate_checkpoint, + write_rank_manifest, +) +from qwen3_next_contract import atomic_json +from qwen3_next_optimizer_checkpoint import ( + load_bounded_parameter_state, + native_parameter_layout, + native_parameter_states, + parameter_state_files, +) +from qwen3_next_optimizer_checkpoint import parameter_state_records as _optimizer_parameter_records +from qwen3_next_optimizer_checkpoint import ( + save_bounded_parameter_state, + verify_hdo_optimizer_master_aliases, +) +from qwen3_next_runtime import create_staging, owned_root + +from rl_engine.integrations.qwen3_next_training import ( + capture_rng_state, + named_trainable_parameters, + restore_rng_state, + state_digest, +) +from rl_engine.testing.qwen3_next_rl_fixture import PolicyFixture, require_policy_configuration + +SCHEMA_VERSION = 1 +CLASS_TAG = "__qwen3_next_native_optimizer_class__" + + +def _native_leaves(args, model, optimizer, tracker): + """Reject an alternate optimizer/topology before any checkpoint work starts.""" + require_policy_configuration(args) + if tracker is None or not tracker.get_states(): + raise ValueError("Native checkpoint must include the initialized Megatron RNG tracker") + if type(getattr(args, "consumed_train_samples", None)) is not int: + raise ValueError("Native training sample progress must be explicit") + from megatron.core import parallel_state + from megatron.core.optimizer.cpu_offloading.hybrid_optimizer import HybridDeviceOptimizer + from megatron.core.optimizer.distrib_optimizer import DistributedOptimizer + from megatron.core.optimizer.optimizer import ChainedOptimizer + + if not dist.is_initialized() or dist.get_world_size() != 4: + raise ValueError("Native checkpoint requires an initialized four-rank process group") + topology = ( + parallel_state.get_tensor_model_parallel_world_size(), + parallel_state.get_pipeline_model_parallel_world_size(), + parallel_state.get_context_parallel_world_size(), + parallel_state.get_expert_model_parallel_world_size(), + parallel_state.get_data_parallel_world_size(), + ) + if topology != (4, 1, 1, 1, 1): + raise ValueError("Native checkpoint requires TP4 and PP/CP/EP/DP1") + if parallel_state.get_tensor_model_parallel_rank() != dist.get_rank(): + raise ValueError("Checkpoint rank order must equal tensor-parallel rank order") + leaves = ( + list(optimizer.chained_optimizers) + if isinstance(optimizer, ChainedOptimizer) + else [optimizer] + ) + if not leaves or any(not isinstance(leaf, DistributedOptimizer) for leaf in leaves): + raise TypeError("Checkpoint requires actual native DistributedOptimizer leaves") + for leaf in leaves: + if getattr(leaf, "is_stub_optimizer", False): + raise ValueError("Stub optimizers cannot provide complete training state") + if leaf.ddp_config.use_megatron_fsdp: + raise ValueError("The fixed TP4 checkpoint path does not use FSDP") + for group in (leaf.data_parallel_group, leaf.data_parallel_group_gloo): + if group is None or dist.get_world_size(group) != 1 or dist.get_rank(group) != 0: + raise ValueError("Serial native optimizer saving requires singleton DP groups") + native = leaf.optimizer + if not isinstance(native, HybridDeviceOptimizer): + raise TypeError("Native checkpoint requires Megatron CPU optimizer offload") + if ( + native.offload_fraction != 1.0 + or not native.param_update_in_fp32 + or native.overlap_cpu_optimizer_d2h_h2d + or native.gpu_optimizer is not None + ): + raise ValueError("Native optimizer must fully offload FP32 masters without overlap") + parameters = named_trainable_parameters(model) + if any(value.dtype != torch.bfloat16 or not value.is_cuda for value in parameters.values()): + raise ValueError("The complete native model must retain BF16 CUDA parameters") + return leaves + + +def _all_rank_call(action, label): + """Propagate a Python failure before another rank enters a later collective.""" + value, error = None, None + try: + value = action() + except Exception as exc: + error = f"{type(exc).__name__}: {exc}" + errors = [None] * 4 + dist.all_gather_object(errors, error) + if any(errors): + raise RuntimeError(f"{label} failed across ranks: {errors}") + return value + + +def _rank_zero_call(action, label): + value = _all_rank_call(lambda: action() if dist.get_rank() == 0 else None, label) + values = [value] + dist.broadcast_object_list(values, src=0) + return values[0] + + +def _serial_rank_call(action, label): + result = None + for owner in range(4): + dist.barrier() + current = _all_rank_call( + lambda: action() if dist.get_rank() == owner else None, f"{label} rank {owner}" + ) + if dist.get_rank() == owner: + result = current + gc.collect() + return result + + +def _native_class_allowlist(leaves): + allowed = {} + for leaf in leaves: + for name in ("cpu_optimizer_cls", "gpu_optimizer_cls"): + cls = getattr(leaf.optimizer, name) + if cls is not None: + key = f"{cls.__module__}.{cls.__qualname__}" + if not isinstance(cls, type) or (key in allowed and allowed[key] is not cls): + raise ValueError("Ambiguous native optimizer class identity") + allowed[key] = cls + return allowed + + +def _encode_header(value, allowed): + """Preserve native class-valued param-group defaults without unsafe unpickling.""" + if isinstance(value, type): + key = f"{value.__module__}.{value.__qualname__}" + if allowed.get(key) is not value: + raise TypeError(f"Unpinned class in native optimizer header: {key}") + return {CLASS_TAG: key} + if isinstance(value, dict): + if CLASS_TAG in value: + raise ValueError("Reserved native class tag in optimizer header") + return {key: _encode_header(item, allowed) for key, item in value.items()} + if isinstance(value, (list, tuple)): + return type(value)(_encode_header(item, allowed) for item in value) + if value is None or isinstance(value, torch.Tensor) or type(value) in (str, bool, int, float): + return value + raise TypeError(f"Unsupported native optimizer header value: {type(value)!r}") + + +def _decode_header(value, allowed): + if isinstance(value, dict): + if CLASS_TAG in value: + if set(value) != {CLASS_TAG} or value[CLASS_TAG] not in allowed: + raise ValueError( + "Saved optimizer class is absent from the running native optimizer" + ) + return allowed[value[CLASS_TAG]] + return {key: _decode_header(item, allowed) for key, item in value.items()} + if isinstance(value, (list, tuple)): + return type(value)(_decode_header(item, allowed) for item in value) + return value + + +def _model_states(model): + if not model: + raise ValueError("Cannot save an empty native model") + return [chunk.state_dict_for_save_checkpoint() for chunk in model] + + +def _state_signature(value): + if isinstance(value, torch.Tensor): + return {"dtype": str(value.dtype), "shape": list(value.shape)} + if isinstance(value, dict): + return {key: _state_signature(item) for key, item in value.items()} + if isinstance(value, (list, tuple)): + return type(value)(_state_signature(item) for item in value) + if value is None or type(value) in (str, bool, int, float): + return type(value).__name__ + raise TypeError(f"Unsupported native model state type: {type(value)!r}") + + +def _tensor_bytes(value, seen=None): + if seen is None: + seen = set() + if isinstance(value, torch.Tensor): + # A serialized view retains its underlying storage, including TP padding. + storage = value.untyped_storage() + key = (value.device, storage.data_ptr(), storage.nbytes()) + if key in seen: + return 0 + seen.add(key) + return storage.nbytes() + if isinstance(value, dict): + return sum(_tensor_bytes(item, seen) for item in value.values()) + if isinstance(value, (list, tuple)): + return sum(_tensor_bytes(item, seen) for item in value) + return 0 + + +def _encode_rng(state): + numpy_state = state["numpy"] + return { + **state, + "numpy": ( + numpy_state[0], + torch.from_numpy(numpy_state[1].copy()), + *numpy_state[2:], + ), + } + + +def _decode_rng(state): + numpy_state = state["numpy"] + if numpy_state[1].dtype != torch.uint32 or numpy_state[1].device.type != "cpu": + raise ValueError("Invalid saved NumPy RNG state") + return {**state, "numpy": (numpy_state[0], numpy_state[1].numpy().copy(), *numpy_state[2:])} + + +def _save_tensor_file(path, payload): + with Path(path).open("xb") as stream: + torch.save(payload, stream) + stream.flush() + os.fsync(stream.fileno()) + + +def _rank_files(rank, chunk_count, rank_dir): + return { + "model": [f"rank-{rank}/model-{index}.pt" for index in range(chunk_count)], + "optimizer": [f"rank-{rank}/{name}" for name in parameter_state_files(rank_dir)], + "rng": [f"rank-{rank}/rng.pt"], + "progress": [ + f"rank-{rank}/{name}" for name in ("progress.json", "scheduler.pt", "fixture.pt") + ], + } + + +def _validate_native_checkpoint(checkpoint, identity, chunk_count): + # Sizes and manifests only: _load_rank compares every loaded tensor's digest. + complete = validate_checkpoint(checkpoint, identity, verify_files=False) + for rank in range(4): + manifest = json.loads((checkpoint / f"rank-{rank}.manifest.json").read_text()) + files = { + role: sorted(record["path"] for record in records) + for role, records in manifest["files"].items() + } + expected = { + role: sorted(paths) + for role, paths in _rank_files(rank, chunk_count, checkpoint / f"rank-{rank}").items() + } + if files != expected: + raise ValueError( + "Native checkpoint manifest omits or substitutes a required state file" + ) + return complete + + +def _save_rank( + model, + optimizer, + scheduler, + fixture, + staging, + *, + leaves, + identity, + step, + sample_position, + tracker, + native_args, + update_evidence, +): + rank = dist.get_rank() + rank_dir = staging / f"rank-{rank}" + rank_dir.mkdir() + torch.cuda.synchronize() + rng = capture_rng_state(tracker=tracker) + states = _model_states(model) + model_hashes = [state_digest(state) for state in states] + native_records, _ = _optimizer_parameter_records(model, leaves) + header = _encode_header(optimizer.state_dict(), _native_class_allowlist(leaves)) + schedule = scheduler.state_dict() + for index, state in enumerate(states): + _save_tensor_file(rank_dir / f"model-{index}.pt", state) + del states + _save_tensor_file(rank_dir / "optimizer-header.pt", header) + save_bounded_parameter_state(model, leaves, rank_dir, _save_tensor_file) + verify_hdo_optimizer_master_aliases(model, leaves) + _save_tensor_file(rank_dir / "rng.pt", _encode_rng(rng)) + _save_tensor_file(rank_dir / "scheduler.pt", schedule) + _save_tensor_file( + rank_dir / "fixture.pt", + { + "tokens": fixture.tokens, + "old_logprobs": fixture.old_logprobs, + "baseline_identity": fixture.baseline_identity, + "content_sha256": fixture.content_sha256, + }, + ) + progress = { + "schema_version": SCHEMA_VERSION, + "scope": "native_vime_training_checkpoint", + "rank": rank, + "world_size": 4, + "identity": identity, + "step": step, + "sample_position": sample_position, + "consumed_train_samples": native_args.consumed_train_samples, + "update_evidence": update_evidence, + "fixture_sha256": fixture.content_sha256, + "model_sha256": model_hashes, + "optimizer_parameter_sha256": native_records, + "optimizer_header_sha256": state_digest(header), + "scheduler_sha256": state_digest(schedule), + "rng_sha256": state_digest(rng), + "serialization": "native_parameter_views_bounded_serial_tp_ranks", + } + atomic_json(rank_dir / "progress.json", progress) + if state_digest(capture_rng_state(tracker=tracker)) != progress["rng_sha256"]: + raise ValueError("Checkpoint serialization unexpectedly changed training RNG state") + write_rank_manifest( + staging, + rank=rank, + world_size=4, + identity=identity, + step=step, + sample_position=sample_position, + files=_rank_files(rank, len(model), rank_dir), + ) + return progress + + +def _load_rank( + model, + optimizer, + scheduler, + fixture, + checkpoint, + *, + leaves, + identity, + complete, + tracker, + native_args, +): + rank = dist.get_rank() + rank_dir = checkpoint / f"rank-{rank}" + progress = json.loads((rank_dir / "progress.json").read_text()) + expected = { + "schema_version": SCHEMA_VERSION, + "scope": "native_vime_training_checkpoint", + "rank": rank, + "world_size": 4, + "identity": identity, + "step": complete["step"], + "sample_position": complete["sample_position"], + "fixture_sha256": fixture.content_sha256, + "serialization": "native_parameter_views_bounded_serial_tp_ranks", + } + if any(progress.get(key) != value for key, value in expected.items()): + raise ValueError("Saved native training progress or fixture identity differs") + saved_fixture = PolicyFixture(**torch.load(rank_dir / "fixture.pt", weights_only=True)) + saved_fixture.validate() + if saved_fixture.content_sha256 != fixture.content_sha256: + raise ValueError("Recovery must reuse the frozen baseline policy samples/logprobs") + header = torch.load(rank_dir / "optimizer-header.pt", map_location="cpu", weights_only=True) + if state_digest(header) != progress["optimizer_header_sha256"]: + raise ValueError("Native optimizer header content mismatch") + # Native load_state_dict may initialize state with a dummy step. Load the + # saved BF16 model afterwards and restore RNG only after every other load. + optimizer.load_state_dict(_decode_header(header, _native_class_allowlist(leaves))) + load_bounded_parameter_state(model, leaves, rank_dir) + verify_hdo_optimizer_master_aliases(model, leaves) + if len(progress["model_sha256"]) != len(model): + raise ValueError("Saved model chunk count differs") + for index, chunk in enumerate(model): + saved = torch.load( + rank_dir / f"model-{index}.pt", map_location="cpu", weights_only=True, mmap=True + ) + current = chunk.state_dict_for_save_checkpoint() + if _state_signature(saved) != _state_signature(current): + raise ValueError("Model checkpoint would change tensor dtypes, shapes or state keys") + if state_digest(saved) != progress["model_sha256"][index]: + raise ValueError("Saved native model content mismatch") + del current + chunk.load_state_dict(saved, strict=True) + del saved + schedule = torch.load(rank_dir / "scheduler.pt", map_location="cpu", weights_only=True) + scheduler.load_state_dict(schedule) + torch.cuda.synchronize() + if [state_digest(value) for value in _model_states(model)] != progress["model_sha256"]: + raise ValueError("Native model reload changed original tensor bits") + restored, _ = _optimizer_parameter_records(model, leaves) + if restored != progress["optimizer_parameter_sha256"]: + raise ValueError("Native optimizer reload changed FP32 master weights or Adam moments") + current_header = _encode_header(optimizer.state_dict(), _native_class_allowlist(leaves)) + if state_digest(current_header) != progress["optimizer_header_sha256"]: + raise ValueError("Native optimizer reload changed optimizer metadata or step") + if state_digest(scheduler.state_dict()) != progress["scheduler_sha256"]: + raise ValueError("Native scheduler reload changed schedule progress") + if type(progress.get("consumed_train_samples")) is not int: + raise ValueError("Saved native consumed sample progress is absent") + native_args.consumed_train_samples = progress["consumed_train_samples"] + rng = _decode_rng(torch.load(rank_dir / "rng.pt", map_location="cpu", weights_only=True)) + if state_digest(rng) != progress["rng_sha256"]: + raise ValueError("Saved RNG content mismatch") + restore_rng_state(rng, tracker=tracker) + if state_digest(capture_rng_state(tracker=tracker)) != progress["rng_sha256"]: + raise ValueError("Native RNG restore changed original state") + return progress + + +def save_training_checkpoint( + args, + model, + optimizer, + scheduler, + fixture, + root, + *, + step, + sample_position, + identity, + tracker, + export_bytes, + update_evidence=None, +): + """Collectively save a complete native checkpoint; call on all four TP ranks.""" + if ( + type(step) is not int + or step not in (1, 2, 3) + or type(sample_position) is not int + or sample_position != step * 4 + ): + raise ValueError("Checkpoint progress must match complete four-sample native updates") + fixture.validate() + leaves = _all_rank_call( + lambda: _native_leaves(args, model, optimizer, tracker), "native topology" + ) + root = Path(root).absolute() + + def estimate(): + optimizer_bytes = sum( + value.numel() * value.element_size() + for record in native_parameter_layout(model, leaves).values() + for states in [native_parameter_states(record)] + for value in states.values() + if isinstance(value, torch.Tensor) + ) + # Four-rank allgather carries only byte counts, never parameter tensors. + model_bytes = sum(_tensor_bytes(state) for state in _model_states(model)) + # Native DP packing retains buffer padding, rather than only model numels. + return model_bytes + (optimizer_bytes * 105 // 100) + 64 * 1024**2 + + local_bytes = _all_rank_call(estimate, "checkpoint disk estimate") + estimates = [None] * 4 + dist.all_gather_object(estimates, local_bytes) + + def prepare(): + owned_root(root, identity) + recovery = newest_complete_checkpoint(root, identity, verify_files=False) + retained = 0 + if recovery["checkpoint"]: + retained = sum( + path.stat().st_size + for path in Path(recovery["checkpoint"]).rglob("*") + if path.is_file() + ) + require_checkpoint_disk_space( + root, + checkpoint_bytes=sum(estimates), + export_bytes=export_bytes, + retained_complete_bytes=retained, + ) + staging, destination = create_staging( + root, + f"step-{step:08d}-{uuid.uuid4().hex}", + { + "schema_version": 1, + "scope": "native_vime_training_checkpoint", + "status": "staging", + "identity": identity, + "step": step, + "sample_position": sample_position, + }, + ) + return {"staging": str(staging), "destination": str(destination), "recovery": recovery} + + paths = _rank_zero_call(prepare, "checkpoint disk budget and staging") + staging, destination = Path(paths["staging"]), Path(paths["destination"]) + _serial_rank_call( + lambda: _save_rank( + model, + optimizer, + scheduler, + fixture, + staging, + leaves=leaves, + identity=identity, + step=step, + sample_position=sample_position, + tracker=tracker, + native_args=args, + update_evidence=update_evidence, + ), + "native checkpoint save", + ) + complete = _rank_zero_call( + lambda: publish_checkpoint(staging, destination, world_size=4, identity=identity), + "checkpoint all-file validation and publication", + ) + return {"checkpoint": str(destination), "complete": complete, "recovery": paths["recovery"]} + + +def load_training_checkpoint( + args, model, optimizer, scheduler, fixture, checkpoint, *, identity, tracker +): + """Verify every rank's file before any load, then restore native state serially.""" + fixture.validate() + leaves = _all_rank_call( + lambda: _native_leaves(args, model, optimizer, tracker), "native topology" + ) + checkpoint = Path(checkpoint).resolve() + complete = _rank_zero_call( + lambda: _validate_native_checkpoint(checkpoint, identity, len(model)), + "checkpoint pre-load all-file validation", + ) + if complete["step"] not in (1, 2, 3) or complete["sample_position"] != complete["step"] * 4: + raise ValueError("Checkpoint progress differs from complete fixed native updates") + progress = _serial_rank_call( + lambda: _load_rank( + model, + optimizer, + scheduler, + fixture, + checkpoint, + leaves=leaves, + identity=identity, + complete=complete, + tracker=tracker, + native_args=args, + ), + "native checkpoint load", + ) + return { + "checkpoint": str(checkpoint), + "step": complete["step"], + "sample_position": complete["sample_position"], + "rank_evidence": progress, + } + + +def training_state_identity( + args, model, optimizer, scheduler, fixture, *, step, sample_position, identity, tracker +): + """Exact per-rank control/recovery state identity, with no PID or path fields.""" + fixture.validate() + if type(step) is not int or step not in (1, 2, 3) or sample_position != step * 4: + raise ValueError("State audit requires complete fixed native updates") + leaves = _native_leaves(args, model, optimizer, tracker) + torch.cuda.synchronize() + records, _ = _optimizer_parameter_records(model, leaves) + header = _encode_header(optimizer.state_dict(), _native_class_allowlist(leaves)) + result = { + "schema_version": SCHEMA_VERSION, + "scope": "native_vime_training_state", + "rank": dist.get_rank(), + "identity": identity, + "step": step, + "sample_position": sample_position, + "consumed_train_samples": args.consumed_train_samples, + "fixture_sha256": fixture.content_sha256, + "model_sha256": [state_digest(value) for value in _model_states(model)], + "optimizer_parameter_sha256": records, + "optimizer_header_sha256": state_digest(header), + "scheduler_sha256": state_digest(scheduler.state_dict()), + "rng_sha256": state_digest(capture_rng_state(tracker=tracker)), + } + return {**result, "state_sha256": state_digest(result)} diff --git a/scripts/qwen3_next_training_export.py b/scripts/qwen3_next_training_export.py new file mode 100644 index 000000000..60b43906a --- /dev/null +++ b/scripts/qwen3_next_training_export.py @@ -0,0 +1,503 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Publish fresh BF16 HF weights through the installed native VIME exporter. + +An export completion record preserves provenance after historical weights are +retired. Only validate_training_export, which rehashes every current file, can +authorize loading an export. A retained record alone cannot authorize a load. +""" + +import hashlib +import json +import math +import os +import re +import uuid +from pathlib import Path + +import torch +import torch.distributed as dist +from qwen3_next_checkpoint import require_checkpoint_disk_space +from qwen3_next_contract import atomic_json, checkpoint_identity +from qwen3_next_runtime import create_staging, file_digest, owned_root +from qwen3_next_training_checkpoint import _all_rank_call, _rank_zero_call + +from rl_engine.integrations.qwen3_next_training import ( + capture_rng_state, + named_trainable_parameters, + state_digest, + tensor_digest, +) + +COMPLETE_FILE = "EXPORT_COMPLETE.json" +INDEX_FILE = "model.safetensors.index.json" +KIND = "qwen3_next_native_hf_export" +# Official tensors the native trainer neither loads nor updates: the multi-token-prediction head. +# VIME's HF saver writes only Megatron-owned parameters, so these are carried from the pinned base. +PASSTHROUGH_PREFIXES = ("mtp.",) +PASSTHROUGH_SHARD = "model-base-passthrough-{idx:05d}-of-{total:05d}.safetensors" +IDENTITY_KEYS = ( + "source_commit", + "source_tree", + "environment_sha256", + "provider_config", + "topology", +) + + +def _json_digest(value): + return hashlib.sha256( + json.dumps(value, sort_keys=True, separators=(",", ":")).encode() + ).hexdigest() + + +def _reference(): + path = Path(__file__).resolve().parents[1] / "rl_engine/testing/qwen3_next_norm_manifest.json" + return json.loads(path.read_text())["model_identity"] + + +def _schema_reference(): + path = Path(__file__).resolve().parents[1] / "rl_engine/testing/qwen3_next_export_schema.json" + record = json.loads(path.read_text()) + if ( + record.get("schema_version") != 1 + or record.get("checkpoint_revision") != _reference()["revision"] + ): + raise ValueError("Pinned export schema must identify the official checkpoint revision") + return record + + +def _safe_file(root, name): + path = Path(name) + if len(path.parts) != 1 or path.is_absolute() or path.name in (".", ".."): + raise ValueError("HF export file must be directly inside its export directory") + candidate = root / path + if candidate.is_symlink() or not candidate.is_file(): + raise ValueError(f"Missing or external HF export file: {name}") + return candidate + + +def _weight_schema(root, *, check_finite): + from safetensors import safe_open + + root = Path(root) + index = json.loads((root / INDEX_FILE).read_text()) + weight_map = index["weight_map"] + if not weight_map or any(not isinstance(key, str) for key in weight_map): + raise ValueError("An HF export must contain the complete named model") + by_shard = {} + for name, shard in weight_map.items(): + if Path(shard).name != shard or not shard.endswith(".safetensors"): + raise ValueError("HF tensor index points outside safetensors shards") + by_shard.setdefault(shard, set()).add(name) + schema = {} + for shard, names in sorted(by_shard.items()): + with safe_open(root / shard, framework="pt", device="cpu") as reader: + if set(reader.keys()) != names: + raise ValueError("HF shard tensor inventory differs from its weight index") + for name in sorted(names): + view = reader.get_slice(name) + shape, dtype = view.get_shape(), view.get_dtype() + if dtype != "BF16" or not shape or any(value <= 0 for value in shape): + raise ValueError(f"HF export must preserve nonempty BF16 weights: {name}") + schema[name] = {"dtype": dtype, "shape": shape} + if check_finite: + # Keep verification memory bounded, including embedding/LM head. + row_size = max(1, math.prod(shape[1:])) + rows = max(1, (32 * 1024**2) // (row_size * 2)) + for start in range(0, shape[0], rows): + if not torch.isfinite(view[start : start + rows]).all(): + raise ValueError(f"Nonfinite exported model weight: {name}") + layers = { + int(match.group(1)) + for name in schema + if (match := re.match(r"model\.layers\.(\d+)\.", name)) + } + if layers != set(range(48)): + raise ValueError("HF export must retain all 48 real decoder layers") + if index.get("metadata", {}).get("total_size") != sum( + math.prod(record["shape"]) * 2 for record in schema.values() + ): + raise ValueError("HF tensor index total byte size differs from its tensors") + return schema + + +def validate_training_export_record(record, expected_identity): + """Validate a durable history record; this deliberately does not authorize loading.""" + if record != expected_identity: + raise ValueError("Published HF export identity differs from the requested weights") + if (record.get("schema_version"), record.get("kind"), record.get("status")) != ( + 1, + KIND, + "complete", + ): + raise ValueError("HF export has no supported completion record") + if (record.get("architecture_layers"), record.get("weights_dtype")) != (48, "bfloat16"): + raise ValueError("HF export architecture or precision differs") + expected_versions = {"update-1": 1, "update-2": 2, "reload-2": 2} + if ( + record.get("weight_version") not in expected_versions + or type(record.get("step")) is not int + or record.get("step") != expected_versions[record["weight_version"]] + ): + raise ValueError("HF export does not identify an accepted native update/reload phase") + training, base = record["training_identity"], record["base_checkpoint_identity"] + if ( + training.get("checkpoint") != record["base_checkpoint"] + or training.get("checkpoint_identity") != base + or any(key not in training for key in IDENTITY_KEYS) + ): + raise ValueError( + "Updated weights require explicit fixed baseline/source/environment provenance" + ) + if base.get("revision") != _reference()["revision"]: + raise ValueError("HF export base revision differs from the official pinned checkpoint") + hashes = record.get("model_rank_sha256") + if record.get("model_identity_method") != "native_parameter_hashes_after": + raise ValueError("HF export must bind directly to the native update parameter audit") + if not isinstance(hashes, list) or len(hashes) != 4: + raise ValueError("HF export requires four actual native model state hashes") + passthrough = record.get("base_passthrough") + if ( + not isinstance(passthrough, dict) + or passthrough.get("prefixes") != list(PASSTHROUGH_PREFIXES) + or type(passthrough.get("tensor_count")) is not int + or passthrough["tensor_count"] < 0 + or not isinstance(passthrough.get("shards"), dict) + ): + raise ValueError("HF export must state which untrained official tensors came from the base") + if any( + not isinstance(value, str) or not re.fullmatch("[0-9a-f]{64}", value) for value in hashes + ): + raise ValueError("HF export has an invalid native model state hash") + files = record.get("files", {}) + shards = {name: value for name, value in files.items() if name.endswith(".safetensors")} + if not shards or INDEX_FILE not in files or "config.json" not in files: + raise ValueError("HF export is missing model shards, index or configuration") + for name, item in files.items(): + if ( + Path(name).name != name + or type(item.get("size")) is not int + or item["size"] <= 0 + or not isinstance(item.get("sha256"), str) + or not re.fullmatch("[0-9a-f]{64}", item["sha256"]) + ): + raise ValueError("Invalid file identity in HF export record") + if record.get("weights_content_sha256") != _json_digest(shards): + raise ValueError("HF export shard content proof differs") + if record.get("metadata") != { + name: value["sha256"] + for name, value in files.items() + if not name.endswith(".safetensors") and name != "STAGING.json" + }: + raise ValueError("HF export metadata proof differs") + reference = _schema_reference() + if ( + record.get("weight_schema_sha256") != reference["weight_schema_sha256"] + or record.get("tensor_count") != reference["tensor_count"] + ): + raise ValueError("HF export omits the pinned complete official tensor schema proof") + return record + + +def validate_training_export(checkpoint, expected_identity): + """Rehash every current export file and exact full-model schema before loading.""" + checkpoint = Path(checkpoint) + if checkpoint.suffix == ".partial" or checkpoint.name.startswith("."): + raise ValueError("An unpublished HF export cannot be loaded") + record = json.loads((checkpoint / COMPLETE_FILE).read_text()) + validate_training_export_record(record, expected_identity) + present = {path.name for path in checkpoint.iterdir() if path.name != COMPLETE_FILE} + if present != record["files"].keys(): + raise ValueError("HF export file inventory changed after publication") + for name, expected in record["files"].items(): + path = _safe_file(checkpoint, name) + if path.stat().st_size != expected["size"] or file_digest(path) != expected["sha256"]: + raise ValueError(f"HF export file checksum mismatch: {name}") + base = Path(record["base_checkpoint"]) + if checkpoint_identity(base) != record["base_checkpoint_identity"]: + raise ValueError("HF export official base metadata or shard identity changed") + schema = _weight_schema(checkpoint, check_finite=True) + if ( + schema != _weight_schema(base, check_finite=False) + or _json_digest(schema) != record["weight_schema_sha256"] + or len(schema) != record["tensor_count"] + ): + raise ValueError("HF export differs from the complete official model tensor schema") + return record + + +def _carry_base_passthrough(staging, base_checkpoint): + """Copy the official tensors the native model does not own from the pinned base, byte for byte. + + Returns the passthrough record for publication. Any missing tensor outside + ``PASSTHROUGH_PREFIXES`` is a real omission by the saver and is rejected; the saver must + also not have written part of the passthrough head itself. + """ + from safetensors import safe_open + from safetensors.torch import save_file + + staging, base = Path(staging), Path(base_checkpoint) + index = json.loads((staging / INDEX_FILE).read_text()) + staged = index["weight_map"] + official = json.loads((base / INDEX_FILE).read_text())["weight_map"] + extra = sorted(set(staged) - set(official)) + if extra: + raise ValueError(f"Native HF saver wrote tensors outside the official schema: {extra[:5]}") + missing = sorted(set(official) - set(staged)) + foreign = [name for name in missing if not name.startswith(PASSTHROUGH_PREFIXES)] + if foreign: + raise ValueError(f"Native HF saver omitted trained official tensors: {foreign[:5]}") + if any(name.startswith(PASSTHROUGH_PREFIXES) for name in staged): + raise ValueError("Native HF saver wrote part of the base passthrough head itself") + record = {"prefixes": list(PASSTHROUGH_PREFIXES), "tensor_count": len(missing), "shards": {}} + if not missing: + return record + by_shard = {} + for name in missing: + by_shard.setdefault(official[name], []).append(name) + added = 0 + for idx, source in enumerate(sorted(by_shard), start=1): + if Path(source).name != source or not source.endswith(".safetensors"): + raise ValueError("Official tensor index points outside safetensors shards") + filename = PASSTHROUGH_SHARD.format(idx=idx, total=len(by_shard)) + if (staging / filename).exists(): + raise ValueError(f"Passthrough shard already present in the staging export: {filename}") + with safe_open(base / source, framework="pt", device="cpu") as reader: + tensors = {name: reader.get_tensor(name) for name in by_shard[source]} + for name, value in tensors.items(): + if ( + value.dtype != torch.bfloat16 + or value.numel() == 0 + or not torch.isfinite(value).all() + ): + raise ValueError(f"Official passthrough tensor is not finite BF16: {name}") + save_file(tensors, staging / filename, metadata={"format": "pt"}) + with safe_open(staging / filename, framework="pt", device="cpu") as reader: + if set(reader.keys()) != set(tensors) or any( + not torch.equal(reader.get_tensor(name), value) for name, value in tensors.items() + ): + raise ValueError( + f"Passthrough shard does not reproduce the base tensors: {filename}" + ) + for name, value in tensors.items(): + staged[name] = filename + added += value.numel() * value.element_size() + record["shards"][filename] = {"source": source, "tensor_count": len(tensors)} + metadata = index.setdefault("metadata", {}) + metadata["total_size"] = int(metadata.get("total_size", 0)) + added + atomic_json(staging / INDEX_FILE, index) + record["names_sha256"] = _json_digest(missing) + return record + + +def _publish_export( + staging, + destination, + *, + step, + weight_version, + identity, + base_checkpoint, + base_checkpoint_identity, + model_hashes, +): + staging, destination, base_checkpoint = Path(staging), Path(destination), Path(base_checkpoint) + if staging.suffix != ".partial" or staging.parent != destination.parent or destination.exists(): + raise ValueError("HF export publication requires a new sibling destination") + if checkpoint_identity(base_checkpoint) != base_checkpoint_identity: + raise ValueError("HF export official base identity changed") + passthrough = _carry_base_passthrough(staging, base_checkpoint) + schema = _weight_schema(staging, check_finite=True) + if schema != _weight_schema(base_checkpoint, check_finite=False): + raise ValueError("Native HF saver did not preserve the complete official tensor schema") + expected_assets = { + name: digest + for name, digest in base_checkpoint_identity["metadata"].items() + if name != INDEX_FILE + } + actual_assets = { + path.name: file_digest(path) + for path in staging.iterdir() + if path.name not in (INDEX_FILE, "STAGING.json") and path.suffix != ".safetensors" + } + if expected_assets != actual_assets: + raise ValueError("Native HF export changed tokenizer/configuration assets") + files = {} + for path in sorted(staging.iterdir()): + _safe_file(staging, path.name) + with path.open("rb") as stream: + os.fsync(stream.fileno()) + files[path.name] = {"size": path.stat().st_size, "sha256": file_digest(path)} + record = { + "schema_version": 1, + "kind": KIND, + "status": "complete", + "weight_version": weight_version, + "step": step, + "export_id": destination.name, + "base_checkpoint": str(base_checkpoint), + "base_checkpoint_identity": base_checkpoint_identity, + "training_identity": identity, + "architecture_layers": 48, + "weights_dtype": "bfloat16", + "model_rank_sha256": model_hashes, + "model_identity_method": "native_parameter_hashes_after", + "base_passthrough": passthrough, + "files": files, + "metadata": { + name: value["sha256"] + for name, value in files.items() + if not name.endswith(".safetensors") and name != "STAGING.json" + }, + "weight_schema_sha256": _json_digest(schema), + "tensor_count": len(schema), + "weights_content_sha256": _json_digest( + {name: value for name, value in files.items() if name.endswith(".safetensors")} + ), + } + validate_training_export_record(record, record) + atomic_json(staging / COMPLETE_FILE, record) + staging.rename(destination) + fd = os.open(destination.parent, os.O_RDONLY | os.O_DIRECTORY) + try: + os.fsync(fd) + finally: + os.close(fd) + return record + + +def export_training_weights( + args, + model, + root, + *, + step, + weight_version, + identity, + base_checkpoint, + base_checkpoint_identity, + checkpoint_bytes, + retained_complete_bytes=0, +): + """Collectively export the current native model; call on all four TP ranks.""" + from megatron.core import parallel_state + from megatron.core.tensor_parallel.random import get_cuda_rng_tracker + from vime.backends.megatron_utils.hf_checkpoint_saver import save_hf_model_to_path + + from rl_engine.integrations.qwen3_next_vime import install_vime_gdn_weight_hooks + + if ( + type(step) is not int + or {"update-1": 1, "update-2": 2, "reload-2": 2}.get(weight_version) != step + ): + raise ValueError("Native HF export requires an explicit accepted update/reload phase") + if ( + identity.get("checkpoint") != str(base_checkpoint) + or identity.get("checkpoint_identity") != base_checkpoint_identity + ): + raise ValueError("Native HF export provenance must retain the fixed official baseline") + if not dist.is_initialized() or dist.get_world_size() != 4: + raise ValueError("Native HF export requires four actual distributed ranks") + if ( + parallel_state.get_tensor_model_parallel_world_size(), + parallel_state.get_expert_tensor_parallel_world_size(), + parallel_state.get_pipeline_model_parallel_world_size(), + parallel_state.get_context_parallel_world_size(), + parallel_state.get_expert_model_parallel_world_size(), + ) != (4, 4, 1, 1, 1): + raise ValueError("Native HF export requires TP/ETP4 and PP/CP/EP1") + if Path(args.hf_checkpoint).resolve() != Path(base_checkpoint).resolve(): + raise ValueError("Native HF conversion metadata must come from the pinned official base") + if ( + getattr(args, "actor_num_nodes", None) != 1 + or getattr(args, "actor_num_gpus_per_node", None) != 4 + ): + raise ValueError("Native HF export requires one node writer for its four GPUs") + if not 0 < args.update_weight_buffer_size <= 4 * 1024**3: + raise ValueError("Native HF export must use a pinned bounded parameter gather size") + if save_hf_model_to_path.__module__ != "vime.backends.megatron_utils.hf_checkpoint_saver": + raise ValueError("Native VIME HF exporter was replaced") + install_vime_gdn_weight_hooks() + tracker = get_cuda_rng_tracker() + parameters = named_trainable_parameters(model) + if any(value.dtype != torch.bfloat16 for value in parameters.values()): + raise ValueError("Native HF export must retain BF16 model parameters") + torch.cuda.synchronize() + rng_before = state_digest(capture_rng_state(tracker=tracker)) + + def parameter_identity(): + return state_digest({name: tensor_digest(value) for name, value in parameters.items()}) + + model_before = _all_rank_call(parameter_identity, "native export model identity") + model_hashes = [None] * 4 + dist.all_gather_object(model_hashes, model_before) + root = Path(root).absolute() + + def prepare(): + owned_root(root, identity) + if checkpoint_identity(base_checkpoint) != base_checkpoint_identity: + raise ValueError("Native HF export official base identity changed before conversion") + export_bytes = sum(item["size"] for item in base_checkpoint_identity["shards"].values()) + require_checkpoint_disk_space( + root, + checkpoint_bytes=checkpoint_bytes, + export_bytes=export_bytes, + retained_complete_bytes=retained_complete_bytes, + ) + staging, destination = create_staging( + root, + f"{weight_version}-{uuid.uuid4().hex}", + { + "schema_version": 1, + "scope": KIND, + "status": "staging", + "identity": identity, + "step": step, + "weight_version": weight_version, + "base_checkpoint": str(base_checkpoint), + "base_checkpoint_identity": base_checkpoint_identity, + }, + ) + return {"staging": str(staging), "destination": str(destination)} + + paths = _rank_zero_call(prepare, "native HF export disk budget and staging") + save_hf_model_to_path( + args, + paths["staging"], + model, + model_name="qwen3_next", + quantization_config=None, + progress_desc=f"Native HF export {weight_version}", + ) + torch.cuda.synchronize() + + def verify_immutable(): + if ( + parameter_identity() != model_before + or state_digest(capture_rng_state(tracker=tracker)) != rng_before + ): + raise ValueError("Native HF export unexpectedly changed model parameters or RNG") + + _all_rank_call(verify_immutable, "native export model/RNG immutability") + record = _rank_zero_call( + lambda: _publish_export( + paths["staging"], + paths["destination"], + step=step, + weight_version=weight_version, + identity=identity, + base_checkpoint=base_checkpoint, + base_checkpoint_identity=base_checkpoint_identity, + model_hashes=model_hashes, + ), + "native HF all-file publication", + ) + return { + "checkpoint": paths["destination"], + "checkpoint_identity": record, + "weight_version": weight_version, + "base_checkpoint": str(base_checkpoint), + "base_checkpoint_identity": base_checkpoint_identity, + } diff --git a/setup.py b/setup.py index 9831c7022..59be67c20 100644 --- a/setup.py +++ b/setup.py @@ -472,7 +472,7 @@ def build_extension(self, ext): "tabulate", "numpy", "accelerate", - "transformers==5.13.1", + "transformers>=5.13.1,<=5.17.0", ], ext_modules=get_extensions(), cmdclass=get_cmdclass(), @@ -480,6 +480,13 @@ def build_extension(self, ext): "cuda": ["flashinfer"], "rocm": ["aiter"], "vllm": ["vllm>=0.6.0"], + "qwen3-next": [ + "torch==2.13.0", + "transformers==5.17.0", + "vllm==0.30.0", + "triton==3.7.1", + "flashinfer-python==0.6.18.post1", + ], "drift-viewer": ["Pillow>=10", "PySide6>=6.6"], }, entry_points={ diff --git a/tests/check_qwen3_next_batch_invariance.py b/tests/check_qwen3_next_batch_invariance.py new file mode 100644 index 000000000..7611da505 --- /dev/null +++ b/tests/check_qwen3_next_batch_invariance.py @@ -0,0 +1,453 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Which GDN components are batch-invariant, per component, measured. + +vLLM refuses strict mode for this model at engine init: + + VLLM batch_invariant mode is not supported for GDN_ATTN. + +The guard is a capability declaration -- `selector.py:235` raises when +`VLLM_BATCH_INVARIANT` is set and the mamba backend's +`supports_batch_invariance()` is False, which `gdn_attn` does not override. So the +question that decides whether full-model L2 is reachable is not "can the guard be +bypassed" (it must not be) but "are the components on the strict path actually +batch-invariant, and if not, which one is not". + +Measured on B200 (sm_100), vLLM 0.30.0, per component: + +========================================= ====================================== +component batch invariance +========================================= ====================================== +`causal_conv1d_update` bitwise (8 seeds x 4 positions, + fp32 and bf16 cache) +`fused_recurrent_..._packed_decode` bitwise (12 seeds x 4 positions, + fp32 and bf16 state) +FLA Triton `chunk_gated_delta_rule` bitwise w.r.t. batch composition +FlashInfer GDN prefill **not** bitwise +========================================= ====================================== + +FlashInfer is the *default* prefill backend on SM100 (`_resolve_gdn_prefill_backend` +returns "flashinfer" for compute capability 100 with `head_k_dim == 128` and CUDA +>= 13), so the default configuration is genuinely not batch-invariant and the +guard is correct rather than conservative. The deviation is rounding-scale, not +structural: adding a companion sequence moved 12149 of 262144 output elements, +`max|diff| = 2.44e-04` against a tensor of scale 7.18e-02 (3.4e-03 relative), and +left the final state within 5.7e-03 relative while almost no bit patterns matched +-- the signature of a pervasive small change in reduction order, consistent with +chunk tiling that depends on the batch's token count. + +**The actionable consequence**: pinning `gdn_prefill_backend="triton"` makes every +component measured here bitwise batch-invariant. That is the configuration a +full-model L2 attempt should use. It does not by itself justify flipping +`supports_batch_invariance()`, which is a statement about the whole backend -- +metadata construction, chunked-prefill splitting, CUDA graphs and the speculative +paths are outside this file's scope and remain unmeasured. + +These assertions therefore state what is true (the three invariant components) and +bound the deviation of the fourth. They deliberately do NOT assert that FlashInfer +*differs*: that would be asserting a defect persists, and would fail the day +upstream fixes it, which is the opposite of what we want to learn. + +Named ``check_`` rather than ``test_`` because it imports real vLLM; see +``tests/distributed/check_*.py``. Run via ``ci/run_qwen3_next_operator_gates.sh`` +or explicitly: + + CUDA_VISIBLE_DEVICES=1 pytest tests/check_qwen3_next_batch_invariance.py -v +""" + +from __future__ import annotations + +from functools import partial + +import pytest +import torch + +from rl_engine.testing.tensor_identity import tensor_bitwise_equal + +pytestmark = pytest.mark.skipif(not torch.cuda.is_available(), reason="CUDA is required") + +# Qwen3-Next-80B-A3B-Instruct GDN dimensions. +_H, _HV, _K, _V = 16, 32, 128, 128 +_SCALE = _K**-0.5 +_CONV_DIM, _CONV_WIDTH = 8192, 4 +_PACKED_DIM = _H * _K * 2 + _HV * _V + +#: Positions within the batch whose target sequence is re-run alone. +_POSITIONS = (0, 1, 31, 63) +_BATCH = 64 + + +def _randn(generator, *shape, dt=torch.bfloat16): + return torch.randn(*shape, device="cuda", dtype=dt, generator=generator) + + +def _l2_normalize(t: torch.Tensor) -> torch.Tensor: + """``t / sqrt(sum(t*t) + 1e-6)`` over the last dim. + + q/k arrive L2-normalized in the real path: prefill runs + ``fused_post_conv_prep(apply_l2norm=True)`` and then passes + ``use_qk_l2norm_in_kernel=False``. Feeding raw randn with that flag off leaves + them unnormalized and the delta-rule update diverges to NaN -- a property of + the inputs, not of the kernel. The division is by the norm cast to ``t``'s + dtype, which is what the measurements recorded in the execution doc used. + """ + norm = torch.sqrt((t.float() * t.float()).sum(-1, keepdim=True) + 1e-6) + return t / norm.to(t.dtype) + + +def _gen(seed: int) -> torch.Generator: + return torch.Generator(device="cuda").manual_seed(seed) + + +def _decay(hv: int, tokens: int, g: torch.Generator) -> torch.Tensor: + """``g = -exp(A_log) * softplus(a)``, which is always <= 0. + + Feeding a sign-free random tensor instead lets ``exp(g) > 1`` and the + recurrence diverges to NaN, which looks like a kernel fault and is not one. + """ + a_log = torch.randn(hv, device="cuda", dtype=torch.float32, generator=g) + a = torch.randn(1, tokens, hv, device="cuda", dtype=torch.float32, generator=g) + return -torch.exp(a_log) * torch.nn.functional.softplus(a) + + +# --------------------------------------------------------------------------- # +# 1. Causal conv1d state update -- bitwise +# --------------------------------------------------------------------------- # +@pytest.mark.parametrize("state_dtype", [torch.float32, torch.bfloat16]) +def test_causal_conv1d_update_is_batch_invariant(state_dtype): + pytest.importorskip("vllm") + from vllm.model_executor.layers.mamba.ops.causal_conv1d import causal_conv1d_update + + for seed in range(8): + g = _gen(seed) + x = torch.randn(_BATCH, _CONV_DIM, device="cuda", dtype=torch.bfloat16, generator=g) + # One cache line per sequence plus the null block. + state = torch.randn( + _BATCH + 2, _CONV_DIM, _CONV_WIDTH - 1, device="cuda", dtype=state_dtype, generator=g + ) + weight = torch.randn( + _CONV_DIM, _CONV_WIDTH, device="cuda", dtype=torch.bfloat16, generator=g + ) + bias = torch.randn(_CONV_DIM, device="cuda", dtype=torch.bfloat16, generator=g) + indices = torch.arange(1, _BATCH + 1, device="cuda", dtype=torch.int32) + + full_state, full_out = state.clone(), torch.empty_like(x) + causal_conv1d_update( + x, full_state, weight, bias, "silu", conv_state_indices=indices, out=full_out + ) + + for row in _POSITIONS: + lone_state = state.clone() + lone_out = torch.empty_like(x[row : row + 1]) + causal_conv1d_update( + x[row : row + 1], + lone_state, + weight, + bias, + "silu", + conv_state_indices=indices[row : row + 1].clone(), + out=lone_out, + ) + block = int(indices[row]) + assert tensor_bitwise_equal(lone_out[0], full_out[row]), f"out seed={seed} row={row}" + assert tensor_bitwise_equal(lone_state[block], full_state[block]), f"state row={row}" + + +# --------------------------------------------------------------------------- # +# 2. Packed recurrent decode -- bitwise. This is the rollout decode provider. +# --------------------------------------------------------------------------- # +@pytest.mark.parametrize("state_dtype", [torch.float32, torch.bfloat16]) +def test_packed_recurrent_decode_is_batch_invariant(state_dtype): + pytest.importorskip("vllm") + from vllm.third_party.flash_linear_attention.ops import ( + fused_recurrent_gated_delta_rule_packed_decode as decode, + ) + + def run(mixed, a, b, a_log, dt_bias, state, indices): + working = state.clone() + out = torch.empty(mixed.shape[0], 1, _HV, _V, device="cuda", dtype=mixed.dtype) + decode( + mixed, + a, + b, + a_log, + dt_bias, + _SCALE, + working, + out, + indices, + use_qk_l2norm_in_kernel=True, + ) + return out, working + + for seed in range(12): + g = _gen(seed) + mk = partial(_randn, g) + mixed, a, b = mk(_BATCH, _PACKED_DIM), mk(_BATCH, _HV), mk(_BATCH, _HV) + a_log, dt_bias = mk(_HV, dt=torch.float32), mk(_HV, dt=torch.float32) + state = mk(_BATCH + 2, _HV, _V, _K, dt=state_dtype) * 0.1 + indices = torch.arange(1, _BATCH + 1, device="cuda", dtype=torch.int32) + + full_out, full_state = run(mixed, a, b, a_log, dt_bias, state, indices) + for row in _POSITIONS: + lone_out, lone_state = run( + mixed[row : row + 1], + a[row : row + 1], + b[row : row + 1], + a_log, + dt_bias, + state, + indices[row : row + 1].clone(), + ) + block = int(indices[row]) + assert tensor_bitwise_equal(lone_out[0], full_out[row]), f"out seed={seed} row={row}" + assert tensor_bitwise_equal(lone_state[block], full_state[block]), f"state row={row}" + + +# --------------------------------------------------------------------------- # +# 3 & 4. Chunked prefill, per backend +# --------------------------------------------------------------------------- # +def _prefill_inputs(seqs, seed): + """Inputs for ``seqs`` packed into one varlen batch. + + Each sequence draws from its own generator (``seed + i``), so the first + sequence's tensors are identical whatever follows it. One generator shared + across the batch would make them depend on the total token count: the CUDA + RNG offset advances in rounded blocks, which hides that for short batches + and stops hiding it for longer ones, silently comparing different data. + """ + a_log = torch.randn(_HV, device="cuda", dtype=torch.float32, generator=_gen(seed + 10_000)) + parts = {name: [] for name in ("q", "k", "v", "g", "beta")} + for index, tokens in enumerate(seqs): + g = _gen(seed + index) + mk = partial(_randn, g) + parts["q"].append(_l2_normalize(mk(1, tokens, _HV, _K))) + parts["k"].append(_l2_normalize(mk(1, tokens, _HV, _K))) + parts["v"].append(mk(1, tokens, _HV, _V)) + a = torch.randn(1, tokens, _HV, device="cuda", dtype=torch.float32, generator=g) + parts["g"].append(-torch.exp(a_log) * torch.nn.functional.softplus(a)) + parts["beta"].append( + torch.rand(1, tokens, _HV, device="cuda", dtype=torch.float32, generator=g) + ) + cu = torch.tensor( + [0, *torch.cumsum(torch.tensor(seqs), 0).tolist()], device="cuda", dtype=torch.int32 + ) + return { + **{name: torch.cat(tensors, dim=1) for name, tensors in parts.items()}, + "cu_seqlens": cu, + "initial_state": torch.zeros(len(seqs), _HV, _V, _K, device="cuda", dtype=torch.float32), + } + + +#: The target sequence, then the companions appended after it. The long ones are +#: what a shared generator used to get wrong; see `_prefill_inputs`. +_COMPANIONS = ([], [64], [17, 95], [3], [1], [64, 64, 64, 64], [2048]) +_TARGET = 64 + + +def test_target_inputs_do_not_depend_on_companions(): + """Guards the comparisons below: they must compare the same target data.""" + alone = _prefill_inputs([_TARGET], seed=0) + for companions in _COMPANIONS: + batch = _prefill_inputs([_TARGET, *companions], seed=0) + for name in ("q", "k", "v", "g", "beta"): + assert tensor_bitwise_equal(batch[name][:, :_TARGET], alone[name]), (name, companions) + + +def test_triton_chunked_prefill_is_batch_invariant(): + """Supplementary native batch probe; shared full/chunk/decode uses packed recurrence.""" + pytest.importorskip("vllm") + from vllm.third_party.flash_linear_attention.ops import chunk_gated_delta_rule + + reference = None + for companions in _COMPANIONS: + inp = _prefill_inputs([_TARGET, *companions], seed=0) + out, final_state = chunk_gated_delta_rule( + inp["q"], + inp["k"], + inp["v"], + inp["g"], + inp["beta"], + scale=_SCALE, + initial_state=None, + output_final_state=True, + cu_seqlens=inp["cu_seqlens"], + use_qk_l2norm_in_kernel=False, + ) + target_out, target_state = out[0, :_TARGET], final_state[0] + assert not torch.isnan(target_out).any(), f"NaN with companions={companions}" + if reference is None: + reference = (target_out.clone(), target_state.clone()) + continue + assert tensor_bitwise_equal(target_out, reference[0]), f"out, companions={companions}" + assert tensor_bitwise_equal(target_state, reference[1]), f"state, companions={companions}" + + +def test_flashinfer_chunked_prefill_deviation_stays_rounding_scale(): + """The DEFAULT prefill backend on SM100, which is not batch-invariant. + + Only the magnitude is asserted. Asserting that it *differs* would be asserting + a defect persists, and would start failing the day upstream makes it + invariant -- which is the outcome we want. A structural regression (a + deviation well past rounding scale) still fails here. + """ + pytest.importorskip("vllm") + pytest.importorskip("flashinfer") + from vllm.model_executor.layers.mamba.gdn.qwen_gdn_linear_attn import fi_chunk_gated_delta_rule + + reference = None + for companions in _COMPANIONS: + inp = _prefill_inputs([_TARGET, *companions], seed=0) + out, final_state = fi_chunk_gated_delta_rule( + inp["q"], + inp["k"], + inp["v"], + inp["g"], + inp["beta"], + inp["initial_state"], + True, + cu_seqlens=inp["cu_seqlens"], + use_qk_l2norm_in_kernel=True, + ) + target_out, target_state = out[0, :_TARGET], final_state[0] + assert not torch.isnan(target_out).any(), f"NaN with companions={companions}" + if reference is None: + reference = (target_out.clone(), target_state.clone()) + continue + for name, got, want in ( + ("out", target_out, reference[0]), + ("state", target_state, reference[1]), + ): + scale = max(want.float().abs().max().item(), 1e-9) + relative = (got.float() - want.float()).abs().max().item() / scale + assert relative <= 5e-2, ( + f"{name} deviation {relative:.3e} relative with companions=" + f"{companions} is past rounding scale; measured baseline was " + "3.4e-03 (out) and 5.7e-03 (state)" + ) + + +# --------------------------------------------------------------------------- # +# 5. Metadata construction +# +# `GDNMetadataBuilder` derives the chunk partition from `cu_seqlens` via +# `prepare_chunk_indices` / `prepare_chunk_offsets`. Per-sequence chunk counts +# are `cdiv(own_length, FLA_CHUNK_SIZE)`, so a sequence's partition cannot depend +# on its companions -- only its sequence id and its offset into the flat chunk +# list shift. This is pure index arithmetic, so it is checked exactly, on CPU. +# --------------------------------------------------------------------------- # +def _chunk_metadata(seqs): + from vllm.third_party.flash_linear_attention.ops.index import ( + prepare_chunk_indices, + prepare_chunk_offsets, + ) + from vllm.third_party.flash_linear_attention.ops.utils import FLA_CHUNK_SIZE + + cu = torch.tensor([0, *torch.cumsum(torch.tensor(seqs), 0).tolist()], dtype=torch.int32) + return ( + prepare_chunk_indices(cu, FLA_CHUNK_SIZE), + prepare_chunk_offsets(cu, FLA_CHUNK_SIZE), + FLA_CHUNK_SIZE, + ) + + +@pytest.mark.parametrize("position", [0, 1, 2]) +def test_chunk_metadata_partition_is_batch_invariant(position): + """A sequence's own chunk partition must not move when the batch changes. + + The sequence id and the flat offset legitimately shift with position; what + must not change is how many chunks the sequence is cut into and which of its + own tokens each chunk covers. + """ + pytest.importorskip("vllm") + target = 150 # deliberately not a multiple of the chunk size + reference = None + for others in ([], [64], [17, 95], [3], [1, 1, 1]): + seqs = list(others) + seqs.insert(min(position, len(seqs)), target) + seq_id = min(position, len(others)) + + indices, offsets, chunk_size = _chunk_metadata(seqs) + mine = indices[indices[:, 0] == seq_id] + # Chunk ids within the sequence, and the flat span it occupies. + partition = ( + mine[:, 1].tolist(), + int(offsets[seq_id + 1] - offsets[seq_id]), + ) + expected_chunks = -(-target // chunk_size) # ceil div + assert partition[0] == list(range(expected_chunks)), f"others={others}" + assert partition[1] == expected_chunks, f"offset span, others={others}" + if reference is None: + reference = partition + else: + assert partition == reference, f"others={others}" + + +# --------------------------------------------------------------------------- # +# 6. Chunked-prefill splitting +# +# vLLM may process one prompt over several forward passes, handing the recurrent +# state between them. Whether that equals a single pass is the prefill analogue +# of the prefill-vs-decode question, and it is what decides L2 for prompts longer +# than `max_num_batched_tokens`. +# --------------------------------------------------------------------------- # +def _run_triton_prefill(inp, tokens, initial_state): + from vllm.third_party.flash_linear_attention.ops import chunk_gated_delta_rule + + lo, hi = tokens + cu = torch.tensor([0, hi - lo], device="cuda", dtype=torch.int32) + return chunk_gated_delta_rule( + inp["q"][:, lo:hi], + inp["k"][:, lo:hi], + inp["v"][:, lo:hi], + inp["g"][:, lo:hi], + inp["beta"][:, lo:hi], + scale=_SCALE, + initial_state=initial_state, + output_final_state=True, + cu_seqlens=cu, + use_qk_l2norm_in_kernel=False, + ) + + +@pytest.mark.parametrize("split", [128, 100, 64, 192]) +def test_triton_chunked_prefill_split_matches_one_pass(split): + """Splitting a prompt and handing over the state, versus one pass. + + `split=128` and `split=64` are multiples of FLA_CHUNK_SIZE; `split=100` and + `split=192` are not, which is the realistic case because an engine-step + boundary is set by the token budget, not by the kernel's chunk size. + """ + pytest.importorskip("vllm") + total = 256 + inp = _prefill_inputs([total], seed=0) + + zero = torch.zeros(1, _HV, _V, _K, device="cuda", dtype=torch.float32) + whole_out, whole_state = _run_triton_prefill(inp, (0, total), zero.clone()) + first_out, first_state = _run_triton_prefill(inp, (0, split), zero.clone()) + second_out, second_state = _run_triton_prefill(inp, (split, total), first_state) + + joined = torch.cat([first_out[0], second_out[0]], dim=0) + aligned = split % 64 == 0 + assert not torch.isnan(whole_out).any(), "degenerate inputs, not a kernel fault" + + out_rel = ( + (joined.float() - whole_out[0].float()).abs().max() + / max(whole_out[0].float().abs().max().item(), 1e-9) + ).item() + state_rel = ( + (second_state.float() - whole_state.float()).abs().max() + / max(whole_state.float().abs().max().item(), 1e-9) + ).item() + + if aligned: + # A chunk-aligned split must be bitwise: the kernel's own chunk + # boundaries already fall there, so no reduction order changes. + assert tensor_bitwise_equal(joined, whole_out[0]), f"split={split} out, rel={out_rel:.3e}" + assert tensor_bitwise_equal(second_state, whole_state), f"split={split} state" + else: + # An unaligned split re-cuts the sequence, so the reduction order moves. + # Bound it; do not assert equality, and do not assert inequality either. + assert out_rel <= 5e-2, f"split={split} out deviation {out_rel:.3e}" + assert state_rel <= 5e-2, f"split={split} state deviation {state_rel:.3e}" diff --git a/tests/check_qwen3_next_engine_metadata.py b/tests/check_qwen3_next_engine_metadata.py new file mode 100644 index 000000000..05c91d121 --- /dev/null +++ b/tests/check_qwen3_next_engine_metadata.py @@ -0,0 +1,118 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Real vLLM builder semantics; no GPU kernel or capability override is needed.""" + +from types import SimpleNamespace + +import pytest +import torch +from vllm.config import CompilationConfig +from vllm.config.compilation import CompilationMode, CUDAGraphMode +from vllm.v1.attention.backend import CommonAttentionMetadata +from vllm.v1.kv_cache_interface import MambaSpec + +from rl_engine.integrations.qwen3_next_vllm import ( + SharedGDNBackend, + SharedGDNMetadataBuilder, + metadata_sequences, +) + + +def build_metadata(lengths, computed, slots): + config = SimpleNamespace( + additional_config={"gdn_prefill_backend": "triton"}, + speculative_config=None, + compilation_config=CompilationConfig( + mode=CompilationMode.NONE, cudagraph_mode=CUDAGraphMode.NONE + ), + scheduler_config=SimpleNamespace(max_num_seqs=4), + parallel_config=SimpleNamespace(decode_context_parallel_size=1), + cache_config=SimpleNamespace(mamba_cache_mode="none"), + model_config=SimpleNamespace(hf_text_config=SimpleNamespace(linear_key_head_dim=128)), + ) + spec = MambaSpec( + block_size=64, + shapes=((3, 2048), (8, 128, 128)), + dtypes=(torch.bfloat16, torch.float32), + mamba_cache_mode="none", + ) + builder = SharedGDNMetadataBuilder( + spec, ["model.layers.0.linear_attn"], config, torch.device("cpu") + ) + cu = torch.tensor([0, *torch.tensor(lengths).cumsum(0).tolist()], dtype=torch.int32) + seq = torch.tensor(lengths, dtype=torch.int32) + torch.tensor(computed, dtype=torch.int32) + common = CommonAttentionMetadata( + query_start_loc=cu, + query_start_loc_cpu=cu, + seq_lens=seq, + num_reqs=len(lengths), + num_actual_tokens=sum(lengths), + max_query_len=max(lengths), + max_seq_len=int(seq.max()), + block_table_tensor=torch.tensor(slots, dtype=torch.int32)[:, None], + slot_mapping=torch.zeros(sum(lengths), dtype=torch.int64), + ) + return builder.build(0, common) + + +def test_fresh_single_token_prompt_resets_reused_slot(): + metadata = build_metadata([1], [0], [3]) + slots, cu, reset = metadata_sequences(metadata, 1) + assert slots.tolist() == [3] and cu.tolist() == [0, 1] and reset.tolist() == [3] + + +def test_mixed_step_resets_only_new_prefill_and_preserves_request_order(): + metadata = build_metadata([1, 8, 3], [64, 0, 7], [7, 3, 5]) + slots, cu, reset = metadata_sequences(metadata, 12) + assert slots.tolist() == [7, 3, 5] + assert cu.tolist() == [0, 1, 9, 12] + assert reset.tolist() == [3] + + +def test_null_padding_has_no_state_owner(): + metadata = build_metadata([1, 0], [64, 0], [7, 0]) + slots, cu, reset = metadata_sequences(metadata, 1) + assert slots.tolist() == [7] and cu.tolist() == [0, 1] and reset.numel() == 0 + + +@pytest.mark.parametrize("slots", [[0], [-1], [3, 3]]) +def test_active_null_negative_or_duplicate_slots_are_rejected(slots): + metadata = build_metadata([1] * len(slots), [2] * len(slots), slots) + with pytest.raises(ValueError, match="distinct positive"): + metadata_sequences(metadata, len(slots)) + + +def test_custom_backend_cannot_bypass_the_batch_invariance_guard(): + from vllm.v1.attention.backends.gdn_attn import GDNAttentionBackend + + assert SharedGDNBackend.supports_batch_invariance() is False + assert GDNAttentionBackend.supports_batch_invariance() is False + assert SharedGDNBackend.get_name() != GDNAttentionBackend.get_name() + + +def test_real_selector_rejects_the_unaccepted_custom_backend(monkeypatch): + from vllm import envs + from vllm.v1.attention.backends.registry import MambaAttentionBackendEnum, register_backend + from vllm.v1.attention.selector import _cached_get_mamba_attn_backend, get_mamba_attn_backend + + from rl_engine.integrations.qwen3_next_vllm import _register_backend + + try: + previous = MambaAttentionBackendEnum.CUSTOM.get_path() + except ValueError: + previous = None + monkeypatch.setattr(envs, "VLLM_BATCH_INVARIANT", True) + _cached_get_mamba_attn_backend.cache_clear() + try: + _register_backend() + with pytest.raises(RuntimeError, match="not supported for RL_KERNEL_QWEN3_NEXT_GDN"): + get_mamba_attn_backend(MambaAttentionBackendEnum.CUSTOM) + with pytest.raises(RuntimeError, match="not supported for GDN_ATTN"): + get_mamba_attn_backend(MambaAttentionBackendEnum.GDN_ATTN) + finally: + if previous is None: + MambaAttentionBackendEnum.CUSTOM.clear_override() + else: + register_backend(MambaAttentionBackendEnum.CUSTOM, previous, is_mamba=True) + _cached_get_mamba_attn_backend.cache_clear() diff --git a/tests/check_qwen3_next_forward.py b/tests/check_qwen3_next_forward.py index ce4beb1f7..5df5b9a9a 100644 --- a/tests/check_qwen3_next_forward.py +++ b/tests/check_qwen3_next_forward.py @@ -1,7 +1,9 @@ # SPDX-License-Identifier: Apache-2.0 # Copyright (c) 2026 RL-Kernel Contributors -"""Mandatory shared CUDA GEMM and MoE checks; these do not claim model L2.""" +"""Mandatory shared CUDA GEMM/MoE/logprob checks; these do not claim model L2.""" + +from dataclasses import replace import pytest import torch @@ -10,9 +12,18 @@ from rl_engine.integrations.qwen3_next_forward import ( combine_routes, shared_linear, + shared_logprob, shared_moe, stable_top10_routes, ) +from rl_engine.kernels.logprob_contract import ( + LogprobContract, + LogprobDType, + LogprobRole, + MaskSpec, + ReductionSpec, + ShardingSpec, +) from rl_engine.testing.tensor_identity import assert_tensor_bitwise_equal as exact @@ -157,6 +168,48 @@ def test_moe_vjp_matches_independent_double_formula(): assert (value.grad.double() - reference.grad).norm() / reference.grad.norm() < 0.016 +def logprob_contract(tokens): + return LogprobContract( + role=LogprobRole.TRAIN, + dtype=LogprobDType.FP32, + mask=MaskSpec(tokens, (True,) * tokens), + sharding=ShardingSpec(0, 1, ((0, 151936),), 151936, 151936), + reduction=ReductionSpec(), + ) + + +def test_full_vocabulary_logprob_entropy_modes_and_gradient(): + logits = random((4, 151936), dtype=torch.float32, grad=True) + targets = torch.tensor([0, 37984, 75968, 151935], device="cuda") + contract = logprob_contract(4) + logp, lse, entropy = shared_logprob(logits, targets, contract=contract) + infer_logp, infer_lse, empty = shared_logprob( + logits, targets, contract=replace(contract, role=LogprobRole.INFER), with_entropy=False + ) + exact(logp, infer_logp) + exact(lse, infer_lse) + assert empty is None + row_logp, _, row_entropy = shared_logprob(logits[:1], targets[:1], contract=logprob_contract(1)) + exact(row_logp, logp[:1]) + exact(row_entropy, entropy[:1]) + (-logp.sum() + 0.03 * entropy.sum()).backward() + reference = logits.detach().double().requires_grad_() + log_softmax = reference.log_softmax(-1) + expected_logp = log_softmax.gather(1, targets[:, None]).squeeze(1) + expected_entropy = -(log_softmax.exp() * log_softmax).sum(-1) + (-expected_logp.sum() + 0.03 * expected_entropy.sum()).backward() + torch.testing.assert_close(logp.double(), expected_logp, atol=0.00002, rtol=0) + torch.testing.assert_close(entropy.double(), expected_entropy, atol=0.00002, rtol=0) + torch.testing.assert_close(logits.grad.double(), reference.grad, atol=0.000002, rtol=0) + + +def test_logprob_nan_rejected_before_comparison(): + logits = random((1, 151936), dtype=torch.float32) + logits[0, 0] = torch.nan + with pytest.raises(ValueError, match="finite"): + shared_logprob(logits, torch.tensor([0], device="cuda"), contract=logprob_contract(1)) + + @torch.no_grad() def test_route_weights_are_batch_invariant(): logits = random((32, 512), 805, dtype=torch.float32).mul_(100) diff --git a/tests/check_qwen3_next_multigpu.py b/tests/check_qwen3_next_multigpu.py new file mode 100644 index 000000000..ede9df2f7 --- /dev/null +++ b/tests/check_qwen3_next_multigpu.py @@ -0,0 +1,46 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Required allocation-only checks. Missing GPUs fail instead of skipping.""" + +import pytest +import torch + + +@pytest.mark.parametrize("device", [1, 2, 3]) +@pytest.mark.parametrize("gated", [False, True]) +def test_norm_guard_restores_current_device_and_uses_input_stream(device, gated): + from rl_engine import _C + + assert torch.cuda.device_count() == 4, "Four allocated GPUs are required" + torch.cuda.set_device(device) + x = torch.randn(32, 128, device=f"cuda:{device}", dtype=torch.bfloat16) + weight = torch.randn(128, device=x.device, dtype=x.dtype) + gate = torch.randn_like(x) + dy = torch.randn_like(x) + + def invoke(w=weight): + if gated: + out, rstd = _C.rmsnorm_gated_forward(x, w, gate, 1e-6) + dx = _C.rmsnorm_gated_backward_dx(dy, x, w, gate, rstd) + else: + out, rstd = _C.rmsnorm_forward(x, w, 1e-6, 1.0) + dx = _C.rmsnorm_backward_dx(dy, x, w, rstd, 1.0) + return out, rstd, dx + + expected = invoke() + stream = torch.cuda.Stream(device=device) + stream.wait_stream(torch.cuda.current_stream(device)) + # set_stream changes the current device: deliberately switch back before C++ entry. + torch.cuda.set_stream(stream) + torch.cuda.set_device(0) + actual = invoke() + assert torch.cuda.current_device() == 0 + stream.synchronize() + for got, want in zip(actual, expected): + assert got.device == x.device + assert torch.isfinite(got).all() + assert torch.equal(got.contiguous().view(torch.uint8), want.contiguous().view(torch.uint8)) + with pytest.raises(RuntimeError, match="device"): + invoke(weight.to("cuda:0")) + assert torch.cuda.current_device() == 0 diff --git a/tests/check_qwen3_next_native_rollout.py b/tests/check_qwen3_next_native_rollout.py new file mode 100644 index 000000000..05ba3cdad --- /dev/null +++ b/tests/check_qwen3_next_native_rollout.py @@ -0,0 +1,318 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Native scheduler/sampler plumbing tests; these are not GPU model evidence.""" + +from types import SimpleNamespace as Namespace + +import pytest +import torch + +from rl_engine.integrations import qwen3_next_native_rollout as rollout +from rl_engine.testing.qwen3_next_l2 import L2Case, json_digest + + +def request(batch=4, length=8, chunked=False, frozen=False): + chunks = L2Case(length, batch, "chunked" if chunked else "full").chunks + prompts = [[row + 1] * length for row in range(batch)] + responses = [list(range(16)) for _ in range(batch)] if frozen else None + result = { + "schema_version": 1, + "role": "rollout", + "case_id": "cpu-plumbing", + "identity": { + "architecture_layers": 48, + "topology": {"tp": 4, "pp": 1, "cp": 1, "ep": 1}, + "checkpoint": "/explicit/test-only-checkpoint", + "provider_config": {"native_rollout_kv_cache_memory_bytes": 4 << 30}, + }, + "prompt_tokens": prompts, + "response_tokens": responses, + "sample_ids": list(range(batch)), + "prefill_chunks": chunks, + "execution": { + "rollout_mode": "autoregressive", + "prefill_chunks": chunks, + "response_mode": "teacher_forced" if frozen else "generate", + }, + "response_length": 16, + "vocab_size": 151936, + "logits_dtype": "bfloat16", + "logprobs_dtype": "float32", + "prediction_positions": list(range(length - 1, length + 15)), + "state_position": length + 14, + "consumed_response_tokens": 15, + "required_layer_digests": list(range(48)), + "trace_layers": [], + "consumed_input_tokens": ( + None + if responses is None + else [left + right[:-1] for left, right in zip(prompts, responses)] + ), + "generation": { + "temperature": 0.0, + "top_p": 1.0, + "top_k": -1, + "seed": 1234, + "ignore_eos": True, + }, + } + result["request_sha256"] = json_digest(result) + return result + + +def seal(value): + value["request_sha256"] = json_digest( + {key: item for key, item in value.items() if key != "request_sha256"} + ) + return value + + +@pytest.mark.parametrize("length", [8, 64, 256, 1024]) +@pytest.mark.parametrize("batch", [1, 4]) +@pytest.mark.parametrize("chunked", [False, True]) +def test_exact_boundaries_cover_every_prefill_and_fifteen_decode_inputs(length, batch, chunked): + value = request(batch, length, chunked, frozen=True) + assert rollout.validate_request(value) == (batch, length) + computed = 0 + for count in value["prefill_chunks"] + [1] * 15: + assert rollout.next_scheduled_tokens(computed, length, value["prefill_chunks"]) == count + computed += count + assert computed == length + 15 + with pytest.raises(ValueError, match="exact requested"): + rollout.next_scheduled_tokens(computed, length, value["prefill_chunks"]) + + +@pytest.mark.parametrize( + "field,value", + [ + ("prediction_positions", list(range(8, 24))), + ("consumed_response_tokens", 16), + ("prefill_chunks", [7]), + ("logits_dtype", "float32"), + ("trace_layers", [48]), + ], +) +def test_worker_rejects_even_resigned_requests_that_change_the_contract(field, value): + item = request() + item[field] = value + with pytest.raises(ValueError): + rollout.validate_request(seal(item)) + + +def scheduled_request(sample, computed=0, chunks=(1, 63), batch=4): + descriptor = { + "request_sha256": "same-case", + "sample_id": sample, + "batch_size": batch, + "prompt_length": sum(chunks), + "prefill_chunks": list(chunks), + } + return Namespace( + request_id=str(sample), + sampling_params=Namespace(extra_args={"shared_l2": descriptor}), + num_computed_tokens=computed, + is_finished=lambda: False, + ) + + +def scheduler(requests): + value = object.__new__(rollout.ExactPrefillScheduler) + value.requests = {row.request_id: row for row in requests} + value.scheduler_config = Namespace(long_prefill_token_threshold=0) + value._pause_state = rollout.PauseState.UNPAUSED + return value + + +def test_native_scheduler_barrier_waits_for_all_four_requests(monkeypatch): + item = scheduler([scheduled_request(0)]) + calls = [] + + def native(self, throttle): + calls.append(self._pause_state) + return Namespace(total_num_scheduled_tokens=0) + + monkeypatch.setattr(rollout.Scheduler, "schedule", native) + item.schedule() + assert calls == [rollout.PauseState.PAUSED_ALL] + assert item._pause_state == rollout.PauseState.UNPAUSED + + +def test_native_scheduler_caps_real_decisions_and_rejects_partial_batches(monkeypatch): + item = scheduler([scheduled_request(rank, computed=1) for rank in range(4)]) + + def native(self, throttle): + assert self.scheduler_config.long_prefill_token_threshold == 63 + return Namespace( + num_scheduled_tokens={str(rank): 63 for rank in range(4)}, preempted_req_ids=set() + ) + + monkeypatch.setattr(rollout.Scheduler, "schedule", native) + assert item.schedule().num_scheduled_tokens == {str(rank): 63 for rank in range(4)} + monkeypatch.setattr( + rollout.Scheduler, + "schedule", + lambda self, throttle: Namespace(num_scheduled_tokens={"0": 63}, preempted_req_ids=set()), + ) + with pytest.raises(RuntimeError, match="exact_scheduler_mismatch"): + item.schedule() + + +def test_native_scheduler_rejects_desynchronized_request_offsets(): + item = scheduler([scheduled_request(rank, computed=rank) for rank in range(4)]) + with pytest.raises(RuntimeError, match="synchronized"): + item.schedule() + + +def test_native_logits_processor_forces_frozen_tokens_without_mutating_raw_logits(): + processor = rollout.ForceFrozenTokens(None, torch.device("cpu"), False) + assert processor.is_argmax_invariant() is False + original = torch.arange(151936, dtype=torch.float32) + frozen = list(range(16)) + apply = processor.new_req_logits_processor( + Namespace(extra_args={"shared_l2": {"response_tokens": frozen}}) + ) + forced = apply(frozen[:7], original) + assert int(forced.argmax()) == 7 + assert int(original.argmax()) == 151935 + assert forced.data_ptr() != original.data_ptr() + assert ( + processor.new_req_logits_processor( + Namespace(extra_args={"shared_l2": {"response_tokens": None}}) + ) + is None + ) + + +def test_runtime_profile_reads_actual_config_and_rejects_changed_cache_budget(): + expected = rollout.NATIVE_ROLLOUT_PROFILE + config = Namespace( + scheduler_config=Namespace( + scheduler_cls=rollout.ExactPrefillScheduler, + max_num_seqs=64, + max_num_batched_tokens=16384, + async_scheduling=False, + ), + model_config=Namespace(max_model_len=1040, dtype=torch.bfloat16), + cache_config=Namespace( + kv_cache_memory_bytes=4 << 30, + enable_prefix_caching=False, + mamba_ssm_cache_dtype="float32", + ), + use_v2_model_runner=False, + ) + assert rollout.runtime_profile(config) == expected + config.cache_config.kv_cache_memory_bytes *= 2 + with pytest.raises(ValueError, match="changed the explicit"): + rollout.runtime_profile(config) + + +def test_implementation_readiness_does_not_claim_scheduler_or_model_acceptance(): + capabilities = rollout.capabilities() + assert capabilities["rollout"] and capabilities["native_scheduler"] + assert not capabilities["scheduler_batch_invariance_verified"] + assert not capabilities["full_model_l2_verified"] + + +def test_engine_arguments_are_accepted_by_the_installed_native_api(monkeypatch): + import huggingface_hub.constants + from vllm.engine.arg_utils import EngineArgs + + monkeypatch.setattr(huggingface_hub.constants, "HF_HUB_OFFLINE", False) + value = EngineArgs(**rollout.engine_arguments(request()["identity"], "ExplicitTestModel")) + assert value.tensor_parallel_size == 4 + assert value.kv_cache_memory_bytes == 4 << 30 + assert value.scheduler_cls.endswith(".ExactPrefillScheduler") + assert value.attention_config.backend.name == "CUSTOM" + assert value.compilation_config.mode == 0 + + +def trace_for_cpu_bookkeeping(): + value = object.__new__(rollout.RolloutTrace) + value.request = request(frozen=True) + value.worker = Namespace(model_runner=Namespace(input_batch=Namespace(req_ids=["r2", "r0"]))) + value.step = {"r0": (0, 7, 1), "r2": (2, 7, 1)} + value.responses = torch.tensor(value.request["response_tokens"], dtype=torch.int64) + value.progress = {"r0": 7, "r2": 7} + value.scheduled = Namespace(total_num_scheduled_tokens=2) + value.schedule = [] + return value + + +def test_trace_uses_actual_native_request_order_and_absolute_positions(): + value = trace_for_cpu_bookkeeping() + value.begin_forward(torch.tensor([3, 1]), torch.tensor([7, 7])) + assert value.current == [(2, 0, 1, 7), (0, 1, 2, 7)] + assert value.progress == {"r0": 8, "r2": 8} + assert value.schedule == [ + {"samples": [2, 0], "computed_before": [7, 7], "token_counts": [1, 1]} + ] + value.step = {"r0": (0, 8, 1), "r2": (2, 8, 1)} + value.begin_forward(torch.tensor([0, 0]), torch.tensor([8, 8])) + assert value.progress == {"r0": 9, "r2": 9} + + +@pytest.mark.parametrize("tokens,positions", [([2, 1], [7, 7]), ([3, 1], [8, 7])]) +def test_trace_rejects_wrong_consumed_tokens_or_prediction_offsets(tokens, positions): + value = trace_for_cpu_bookkeeping() + with pytest.raises(ValueError): + value.begin_forward(torch.tensor(tokens), torch.tensor(positions)) + + +@pytest.mark.parametrize("field,replacement", [("sha256", "b" * 64), ("path", "/other/_C.so")]) +def test_rollout_rejects_provider_binary_changed_during_case(monkeypatch, field, replacement): + value = object.__new__(rollout.RolloutTrace) + value.provider_binary = {"module": "rl_engine._C", "path": "/actual/_C.so", "sha256": "a" * 64} + changed = {**value.provider_binary, field: replacement} + monkeypatch.setattr(rollout, "imported_provider_identity", lambda: changed) + # This must fail before examining numerical observations or publishing a trace. + with pytest.raises(RuntimeError, match="binary changed during"): + value.finish() + + +def test_rollout_rejects_provider_replaced_between_worker_initialization_and_case(monkeypatch): + provider = {"module": "rl_engine._C", "path": "/actual/_C.so", "sha256": "a" * 64} + worker = Namespace(shared_provider_binary=provider) + monkeypatch.setattr( + rollout, "imported_provider_identity", lambda: {**provider, "sha256": "b" * 64} + ) + with pytest.raises(RuntimeError, match="binary changed after"): + rollout.RolloutTrace(worker, request(frozen=True), "/unused-cpu-test") + + +@pytest.mark.parametrize("tamper", ["missing", "module", "path", "sha256"]) +def test_assemble_rejects_different_binary_in_one_rehashed_rank_trace(tmp_path, tamper): + value = request(frozen=True) + provider = {"module": "rl_engine._C", "path": "/actual/_C.so", "sha256": "a" * 64} + records = [] + for rank in range(4): + observed = dict(provider) + if rank == 3: + if tamper == "missing": + observed = None + else: + observed[tamper] = { + "module": "fallback", + "path": "/other/_C.so", + "sha256": "b" * 64, + }[tamper] + path = tmp_path / f"rank-{rank}.pt" + rollout.save_tensor_artifact( + path, + { + "rank": rank, + "request_sha256": value["request_sha256"], + "provider_binary": observed, + }, + ) + records.append( + { + "rank": rank, + "path": str(path), + "sha256": rollout.file_digest(path), + "request_sha256": value["request_sha256"], + } + ) + # File SHA is valid: per-rank provenance must still reject the rewritten identity. + with pytest.raises(ValueError, match="binary evidence|different provider binaries"): + rollout.assemble_trace(value, records, value["response_tokens"]) diff --git a/tests/check_qwen3_next_paged_attention.py b/tests/check_qwen3_next_paged_attention.py new file mode 100644 index 000000000..89d0dd148 --- /dev/null +++ b/tests/check_qwen3_next_paged_attention.py @@ -0,0 +1,83 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Paged-KV component tests; a real vLLM scheduler gate is still required.""" + +import pytest +import torch + +from rl_engine.integrations.qwen3_next_vllm_attention import ( + SharedAttentionImpl, + SharedAttentionMetadata, +) +from rl_engine.testing.tensor_identity import assert_tensor_bitwise_equal + +pytestmark = pytest.mark.skipif(not torch.cuda.is_available(), reason="CUDA required") + + +@pytest.mark.parametrize("batch", [1, 4]) +@pytest.mark.parametrize("length", [8, 65, 1024]) +def test_paged_attention_full_chunk_reorder_and_cache_bits(batch, length): + torch.manual_seed(777) + q = torch.randn(batch, length, 4, 256, device="cuda", dtype=torch.bfloat16) + k = torch.randn(batch, length, 1, 256, device="cuda", dtype=torch.bfloat16) + v = torch.randn_like(k) + block = 64 + pages = (length + block - 1) // block + tables = torch.arange(1, batch * pages + 1, device="cuda").reshape(batch, pages) + full_cache = torch.zeros(batch * pages + 1, 1, block, 512, device="cuda", dtype=torch.bfloat16) + chunk_cache = full_cache.clone() + impl = SharedAttentionImpl(4, 256, 1 / 16, 1) + + def invoke(cache, start, end, order): + positions = torch.arange(start, end, device="cuda") + table = tables[order] + slots = (table[:, positions // block] * block + positions % block).reshape(-1) + metadata = SharedAttentionMetadata( + tuple(index * (end - start) for index in range(batch + 1)), + (end,) * batch, + table, + slots, + batch * (end - start), + ) + query = q[order, start:end].reshape(-1, 4, 256) + out = torch.empty_like(query) + impl.forward( + None, + query, + k[order, start:end].reshape(-1, 1, 256), + v[order, start:end].reshape(-1, 1, 256), + cache, + metadata, + out, + ) + return out.reshape(batch, end - start, 4, 256) + + expected = invoke(full_cache, 0, length, list(range(batch))) + actual = torch.empty_like(expected) + start = 0 + for end in sorted( + {1, length, *(point for point in (63, 64, 65, 100, 528, 576) if point < length)} + ): + order = list(reversed(range(batch))) if start else list(range(batch)) + result = invoke(chunk_cache, start, end, order) + actual[order, start:end] = result + start = end + assert_tensor_bitwise_equal(actual, expected, name="paged full/chunk/reorder outputs") + assert_tensor_bitwise_equal(chunk_cache, full_cache, name="complete scheduler-owned KV cache") + + +@pytest.mark.parametrize("bad_slots", [[-1, 1], [1, 1], [1, 99], [1, 0]]) +def test_paged_attention_invalid_indices_do_not_mutate_cache(bad_slots): + cache = torch.zeros(2, 1, 4, 512, device="cuda", dtype=torch.bfloat16) + original = cache.clone() + query = torch.zeros(2, 4, 256, device="cuda", dtype=torch.bfloat16) + key = torch.zeros(2, 1, 256, device="cuda", dtype=torch.bfloat16) + metadata = SharedAttentionMetadata( + (0, 2), (2,), torch.tensor([[0]], device="cuda"), torch.tensor(bad_slots, device="cuda"), 2 + ) + with pytest.raises(ValueError): + SharedAttentionImpl(4, 256, 1 / 16, 1).forward( + None, query, key, key, cache, metadata, query.clone() + ) + assert_tensor_bitwise_equal(cache, original) diff --git a/tests/check_qwen3_next_vime_weight_hooks.py b/tests/check_qwen3_next_vime_weight_hooks.py new file mode 100644 index 000000000..f8851eddc --- /dev/null +++ b/tests/check_qwen3_next_vime_weight_hooks.py @@ -0,0 +1,92 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""CPU checks through VIME's real parameter shard and HF export entrypoints.""" + +from types import SimpleNamespace + +import torch +from megatron.core import mpu +from vime.backends.megatron_utils import hf_to_megatron as load_api +from vime.backends.megatron_utils import megatron_to_hf as export_api +from vime.backends.megatron_utils.hf_to_megatron.common import shard_mcore_tensor + +from rl_engine.integrations.qwen3_next_vime import SharedInputNorm, install_vime_gdn_weight_hooks +from rl_engine.testing.tensor_identity import assert_tensor_bitwise_equal as exact + + +class Reader(dict): + def get_tensor(self, key): + return self[key] + + +def test_vime_hf_load_shard_gather_export_roundtrip(monkeypatch): + monkeypatch.setitem(load_api._LOADERS, "qwen3_next", load_api._LOADERS["qwen3_next"]) + monkeypatch.setattr(export_api, "convert_qwen3_next_to_hf", export_api.convert_qwen3_next_to_hf) + monkeypatch.setattr(mpu, "get_tensor_model_parallel_world_size", lambda: 4) + install_vime_gdn_weight_hooks() + generator = torch.Generator().manual_seed(42) + weight = torch.randn((8192, 1, 4), generator=generator).bfloat16() + name = "module.module.decoder.layers.0.self_attention.linear_attn.conv1d.weight" + reader = Reader({"model.layers.0.linear_attn.conv1d.weight": weight}) + packed = load_api._LOADERS["qwen3_next"](name, reader, SimpleNamespace()) + parameter = torch.nn.Parameter(torch.empty(2048, 1, 4, dtype=torch.bfloat16)) + parameter.tensor_model_parallel = True + parameter.partition_dim = 0 + parameter.partition_stride = 1 + local = [] + for rank in range(4): + monkeypatch.setattr(mpu, "get_tensor_model_parallel_rank", lambda rank=rank: rank) + shard = shard_mcore_tensor(name, packed, parameter) + exact(shard, torch.cat([part.chunk(4)[rank] for part in weight.split((2048, 2048, 4096))])) + local.append(shard) + args = SimpleNamespace( + hidden_size=2048, num_attention_heads=16, num_query_groups=2, kv_channels=256 + ) + converted = export_api.convert_qwen3_next_to_hf(args, name, torch.cat(local)) + assert converted[0][0] == "model.layers.0.linear_attn.conv1d.weight" + exact(converted[0][1], weight) + + +def test_shared_norm_keeps_existing_parameter_name_and_identity(): + weight = torch.nn.Parameter(torch.zeros(2048, dtype=torch.bfloat16)) + norm = SharedInputNorm(1e-6, torch.device("cpu"), weight=weight) + assert dict(norm.named_parameters()) == {"weight": weight} + assert norm.weight is weight + assert norm.weight.tensor_model_parallel is False + + +def test_vime_kv_load_shard_export_uses_two_replica_pairs(monkeypatch): + monkeypatch.setattr(mpu, "get_tensor_model_parallel_world_size", lambda: 4) + install_vime_gdn_weight_hooks() + weight = torch.randn(512, 2048).bfloat16() + name = "module.module.decoder.layers.3.self_attention.self_attn.k_proj.weight" + reader = Reader({"model.layers.3.self_attn.k_proj.weight": weight}) + packed = load_api._LOADERS["qwen3_next"](name, reader, SimpleNamespace()) + parameter = torch.nn.Parameter(torch.empty(256, 2048, dtype=torch.bfloat16)) + parameter.tensor_model_parallel = True + parameter.partition_dim = 0 + parameter.partition_stride = 1 + shards = [] + for rank in range(4): + monkeypatch.setattr(mpu, "get_tensor_model_parallel_rank", lambda rank=rank: rank) + shard = shard_mcore_tensor(name, packed, parameter) + exact(shard, weight.chunk(2)[rank // 2]) + shards.append(shard) + args = SimpleNamespace( + hidden_size=2048, num_attention_heads=16, num_query_groups=2, kv_channels=256 + ) + outputs = export_api.convert_qwen3_next_to_hf(args, name, torch.cat(shards)) + assert outputs[0][0] == "model.layers.3.self_attn.k_proj.weight" + exact(outputs[0][1], weight) + + +def test_vime_shared_expert_direct_names_roundtrip(monkeypatch): + install_vime_gdn_weight_hooks() + weight = torch.randn(512, 2048).bfloat16() + hf_name = "model.layers.0.mlp.shared_expert.gate_proj.weight" + name = "module.module.decoder.layers.0.mlp.shared_expert.gate_proj.weight" + loaded = load_api._LOADERS["qwen3_next"](name, Reader({hf_name: weight}), SimpleNamespace()) + outputs = export_api.convert_qwen3_next_to_hf(SimpleNamespace(), name, loaded) + assert outputs[0][0] == hf_name + exact(outputs[0][1], weight) diff --git a/tests/check_qwen3_next_vllm_model_contract.py b/tests/check_qwen3_next_vllm_model_contract.py new file mode 100644 index 000000000..e5ece2808 --- /dev/null +++ b/tests/check_qwen3_next_vllm_model_contract.py @@ -0,0 +1,281 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Actual vLLM imports/loaders and constructor contracts, without GPU execution.""" + +from types import SimpleNamespace as Namespace + +import pytest +import torch +from vllm.model_executor import parameter +from vllm.model_executor.layers import linear + +from rl_engine.integrations import qwen3_next_vllm_model as adapter +from rl_engine.integrations.qwen3_next_tp_blocks import shard_attention_weights +from rl_engine.testing.tensor_identity import assert_tensor_bitwise_equal as exact + + +def profile(): + config = Namespace( + hidden_size=2048, + num_hidden_layers=48, + num_attention_heads=16, + num_key_value_heads=2, + head_dim=256, + vocab_size=151936, + num_experts=512, + num_experts_per_tok=10, + moe_intermediate_size=512, + shared_expert_intermediate_size=512, + rms_norm_eps=1e-6, + max_position_embeddings=262144, + layer_types=[ + "full_attention" if index % 4 == 3 else "linear_attention" for index in range(48) + ], + rope_parameters={ + "rope_theta": 10000000, + "partial_rotary_factor": 0.25, + "rope_type": "default", + }, + ) + return Namespace( + model_config=Namespace(dtype=torch.bfloat16, enforce_eager=True, hf_text_config=config), + parallel_config=Namespace( + tensor_parallel_size=4, + pipeline_parallel_size=1, + enable_expert_parallel=False, + enable_eplb=False, + use_sequence_parallel_moe=False, + enable_dbo=False, + ), + quant_config=None, + speculative_config=None, + lora_config=None, + cache_config=Namespace(enable_prefix_caching=False), + kernel_config=Namespace(moe_backend="triton"), + attention_config=Namespace(backend=adapter.AttentionBackendEnum.CUSTOM), + ) + + +def test_profile_keeps_engine_and_model_acceptance_closed(): + adapter.validate_profile(profile()) + assert adapter.profile_capabilities()["scheduler_batch_invariance_verified"] is False + assert adapter.profile_capabilities()["full_model_l2_verified"] is False + + +@pytest.mark.parametrize( + "scope,name,value", + [ + ("model_config", "dtype", torch.float32), + ("model_config", "enforce_eager", False), + ("parallel_config", "tensor_parallel_size", 2), + ("parallel_config", "enable_expert_parallel", True), + ("cache_config", "enable_prefix_caching", True), + ("kernel_config", "moe_backend", "auto"), + ("attention_config", "backend", None), + ], +) +def test_real_wrapper_constructor_rejects_drift_before_allocating_model(scope, name, value): + config = profile() + setattr(getattr(config, scope), name, value) + with pytest.raises(ValueError): + adapter.RLKernelQwen3NextForCausalLM(vllm_config=config) + + +@pytest.mark.parametrize("rank", range(4)) +def test_actual_native_qkv_loader_preserves_gate_layout_and_kv_replication(monkeypatch, rank): + for module in (linear, parameter): + monkeypatch.setattr(module, "get_tensor_model_parallel_rank", lambda: rank) + monkeypatch.setattr(module, "get_tensor_model_parallel_world_size", lambda: 4) + # Construct the real native layer, then use its unchanged HF shard loader. + layer = linear.QKVParallelLinear( + 2048, + 256, + 32, + 2, + bias=False, + params_dtype=torch.bfloat16, + ) + weights = {} + for name, rows in (("q_proj.weight", 8192), ("k_proj.weight", 512), ("v_proj.weight", 512)): + weights[name] = ( + torch.arange(rows, dtype=torch.int32) + .remainder(251) + .to(torch.bfloat16)[:, None] + .expand(rows, 2048) + .contiguous() + ) + weights.update( + { + "o_proj.weight": torch.zeros(2048, 4096, dtype=torch.bfloat16), + "q_norm.weight": torch.zeros(256, dtype=torch.bfloat16), + "k_norm.weight": torch.zeros(256, dtype=torch.bfloat16), + } + ) + expected = shard_attention_weights(weights, rank) + for key, shard in (("q_proj.weight", "q"), ("k_proj.weight", "k"), ("v_proj.weight", "v")): + layer.weight.weight_loader(layer.weight, weights[key], shard) + for actual, key in zip( + layer.weight.split((2048, 256, 256)), ("q_proj.weight", "k_proj.weight", "v_proj.weight") + ): + exact(actual, expected[key], name=f"native rank{rank} {key}") + + +def test_shared_moe_postload_preserves_parameter_identity_and_loader(monkeypatch): + # Meta tensors verify 512-expert allocation shapes without allocating an + # unnecessary CPU model. Real data movement is covered by the TP4 GPU gate. + gate = torch.nn.Parameter(torch.empty(512, 256, 2048, device="meta", dtype=torch.bfloat16)) + down = torch.nn.Parameter(torch.empty(512, 2048, 128, device="meta", dtype=torch.bfloat16)) + loader = object() + gate.weight_loader = down.weight_loader = loader + layer = Namespace(w13_weight=gate, w2_weight=down) + method = object.__new__(adapter.SharedPlainBF16MoEMethod) + monkeypatch.setattr( + adapter.SharedPlainBF16MoEMethod, + "get_fused_moe_quant_config", + lambda self, layer: "plain-bf16", + ) + method.process_weights_after_loading(layer) + assert layer.w13_weight is gate and layer.w2_weight is down + assert gate.weight_loader is loader and down.weight_loader is loader + assert method.moe_quant_config == "plain-bf16" + with pytest.raises(RuntimeError, match="native MoE arithmetic"): + method.apply() + + +def test_shared_model_rejects_rope_or_layer_layout_changes(): + config = profile() + config.model_config.hf_text_config.rope_parameters["rope_theta"] = 10000 + with pytest.raises(ValueError, match="rotary dimension"): + adapter.validate_profile(config) + config = profile() + config.model_config.hf_text_config.layer_types[0] = "full_attention" + with pytest.raises(ValueError, match="36 GDN"): + adapter.validate_profile(config) + + +@pytest.mark.parametrize( + "decoder_class", [adapter.Qwen3NextDecoderLayer, adapter.SharedVLLMDecoderLayer] +) +def test_real_decoder_invokes_gdn_with_single_input_and_consumes_returned_tensor( + monkeypatch, decoder_class +): + from rl_engine.integrations.qwen3_next_vllm import SharedQwenGDN + + class ResidualNorm(torch.nn.Module): + def forward(self, hidden, residual=None): + if residual is None: + return hidden + return hidden + residual, hidden + residual + + gdn = object.__new__(SharedQwenGDN) + torch.nn.Module.__init__(gdn) + calls = [] + + def into(self, hidden, output): + assert output is not hidden and output.data_ptr() != hidden.data_ptr() + assert output.dtype == hidden.dtype and output.shape == hidden.shape + output.copy_(hidden + 2) + calls.append(output) + + monkeypatch.setattr(SharedQwenGDN, "_forward_into", into) + monkeypatch.setattr(adapter, "_rms", lambda value, module: value) + decoder = object.__new__(decoder_class) + torch.nn.Module.__init__(decoder) + decoder.layer_type = "linear_attention" + decoder.layer_scale = decoder.use_attn_reduce_scatter_for_moe = False + decoder.linear_attn = gdn + decoder.input_layernorm = decoder.post_attention_layernorm = ResidualNorm() + decoder.mlp = torch.nn.Identity() + hidden = torch.ones((2, 2048), dtype=torch.bfloat16) + output, residual = decoder(hidden_states=hidden, residual=None, positions=torch.arange(2)) + assert len(calls) == 1 + exact(calls[0], torch.full_like(hidden, 3), name="public GDN return") + exact(output, torch.full_like(hidden, 4), name="decoder consumed GDN output") + exact(residual, torch.full_like(hidden, 4), name="decoder residual") + + +def test_binding_all48_layers_preserves_parameter_identity_and_native_loaders(): + from rl_engine.integrations.qwen3_next_vllm import SharedQwenGDN + from rl_engine.integrations.qwen3_next_vllm_attention import SharedAttentionBackend + + def instance(cls): + value = object.__new__(cls) + torch.nn.Module.__init__(value) + return value + + loader = object() + + def weight_module(shape): + module = torch.nn.Module() + module.weight = torch.nn.Parameter(torch.empty(shape, device="meta", dtype=torch.bfloat16)) + module.weight.weight_loader = loader + return module + + # The binding operation does not run a native constructor or GPU kernel. + # Meta tensors make its 48-layer ownership contract affordable to test. + model = instance(adapter.Qwen3NextModel) + model.start_layer, model.end_layer = 0, 48 + model.embed_tokens = weight_module((37984, 2048)) + model.norm = weight_module((2048,)) + layers = [] + for index in range(48): + layer = instance(adapter.Qwen3NextDecoderLayer) + layer.layer_type = "full_attention" if index % 4 == 3 else "linear_attention" + if layer.layer_type == "linear_attention": + layer.linear_attn = instance(SharedQwenGDN) + else: + layer.self_attn = instance(adapter.Qwen3NextAttention) + layer.self_attn.attn = Namespace(attn_backend=SharedAttentionBackend) + layer.self_attn.qkv_proj = weight_module((2560, 2048)) + layer.self_attn.o_proj = weight_module((2048, 1024)) + layer.mlp = instance(adapter.Qwen3NextSparseMoeBlock) + layer.mlp.is_fused_shared_expert_enabled = False + layer.mlp.replicate_shared_expert = False + layer.mlp.shared_expert = torch.nn.Module() + layer.mlp.shared_expert.gate_up_proj = weight_module((256, 2048)) + layer.mlp.shared_expert.down_proj = weight_module((2048, 128)) + routed = torch.nn.Module() + routed.quant_method = instance(adapter.UnquantizedFusedMoEMethod) + routed.w13_weight = weight_module((512, 256, 2048)).weight + routed.w2_weight = weight_module((512, 2048, 128)).weight + layer.mlp.experts = torch.nn.Module() + layer.mlp.experts.routed_experts = routed + layers.append(layer) + model.layers = torch.nn.ModuleList(layers) + before = {name: id(value) for name, value in model.named_parameters()} + adapter._bind_native_model(model, object()) + assert isinstance(model, adapter.SharedVLLMModel) + assert {name: id(value) for name, value in model.named_parameters()} == before + assert all(value.weight_loader is loader for value in model.parameters()) + assert all(isinstance(layer, adapter.SharedVLLMDecoderLayer) for layer in model.layers) + assert all(isinstance(layer.mlp, adapter.SharedVLLMMoE) for layer in model.layers) + + +def test_spawn_worker_registers_model_before_native_worker_initialization(monkeypatch): + from rl_engine.integrations import qwen3_next_vllm_worker as worker + + calls = [] + monkeypatch.setattr(worker, "register_shared_model", lambda: calls.append("registered")) + monkeypatch.setattr( + worker, + "imported_provider_identity", + lambda: calls.append("native-binary") or {"test": True}, + ) + monkeypatch.setattr( + worker.Worker, "__init__", lambda self, *args, **kwargs: calls.append("native-init") + ) + worker.SharedQwenWorker() + assert calls == ["registered", "native-binary", "native-init"] + + +def test_architecture_registration_is_idempotent_and_rejects_another_model(monkeypatch): + from vllm.model_executor.models import ModelRegistry + + monkeypatch.setattr(ModelRegistry, "models", dict(ModelRegistry.models)) + ModelRegistry.models.pop(adapter.ARCHITECTURE, None) + assert adapter.register_shared_model() == adapter.ARCHITECTURE + assert adapter.register_shared_model() == adapter.ARCHITECTURE + ModelRegistry.models[adapter.ARCHITECTURE] = Namespace(load_model_cls=lambda: torch.nn.Linear) + with pytest.raises(ValueError, match="different model"): + adapter.register_shared_model() diff --git a/tests/test_qwen3_next_binary_evidence.py b/tests/test_qwen3_next_binary_evidence.py new file mode 100644 index 000000000..a86976fe3 --- /dev/null +++ b/tests/test_qwen3_next_binary_evidence.py @@ -0,0 +1,68 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Loaded provider identity must match immutable build evidence, including on reload.""" + +import json +import sys +from types import SimpleNamespace + +import pytest + +from rl_engine.testing.qwen3_next_binary import ( + archive_provider_binary, + validate_binary_record, + verify_imported_provider, +) + + +@pytest.fixture +def archived(tmp_path): + source, output = tmp_path / "source", tmp_path / "attempt" + (source / "rl_engine").mkdir(parents=True) + output.mkdir() + binary = source / "rl_engine/_C.cpython-test.so" + binary.write_bytes(b"built CUDA extension") + return binary, archive_provider_binary(source, output, source_tree="original-tree") + + +def test_archive_survives_later_live_binary_rebuild(archived): + binary, record = archived + actual = validate_binary_record(record, source_tree="original-tree") + binary.write_bytes(b"later build") + assert validate_binary_record(record) == actual + with pytest.raises(ValueError, match="source tree"): + validate_binary_record(record, source_tree="different-tree") + + +def test_imported_binary_cannot_substitute_another_provider(archived, monkeypatch): + _, record = archived + expected = validate_binary_record(record) + loaded = dict(expected) + monkeypatch.setitem( + sys.modules, + "rl_engine.integrations.qwen3_next_binary", + SimpleNamespace(imported_provider_identity=lambda: loaded), + ) + assert verify_imported_provider(record, source_tree="original-tree") == expected + loaded["sha256"] = "0" * 64 + with pytest.raises(ValueError, match="different CUDA binary"): + verify_imported_provider(record, source_tree="original-tree") + + +def test_archived_binary_corruption_and_attempt_escape_are_rejected(archived, tmp_path): + from pathlib import Path + + _, record = archived + with pytest.raises(ValueError, match="escaped"): + validate_binary_record(record, artifact_root=tmp_path / "different-attempt") + metadata = json.loads(Path(record["path"]).read_text()) + Path(metadata["archive"]["path"]).write_bytes(b"corrupted original binary") + with pytest.raises(ValueError, match="content changed"): + validate_binary_record(record) + + +@pytest.mark.parametrize("record", [None, {}, {"path": "/tmp/unpinned"}]) +def test_missing_binary_record_cannot_close_native_acceptance(record): + with pytest.raises(ValueError, match="pinned CUDA binary"): + validate_binary_record(record) diff --git a/tests/test_qwen3_next_case_manifest.py b/tests/test_qwen3_next_case_manifest.py new file mode 100644 index 000000000..9834c76a7 --- /dev/null +++ b/tests/test_qwen3_next_case_manifest.py @@ -0,0 +1,106 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Mandatory case completeness must not be inferred from an aggregate count.""" + +import json +import subprocess +import sys +from pathlib import Path + +import pytest + +from rl_engine.testing.qwen3_next_cases import case_digest, execution_verdict, load_cases + +CASE = "tests/example.py::test_required" +SUCCESS = {"setup": "passed", "call": "passed", "teardown": "passed"} + + +@pytest.mark.parametrize( + "fault", ["missing", "extra", "duplicate", "skipped", "teardown", "incomplete"] +) +def test_declared_case_must_complete_all_phases(fault): + collected = [CASE] + outcomes = {CASE: dict(SUCCESS)} + if fault == "missing": + collected = [] + elif fault == "extra": + collected.append("tests/example.py::test_undeclared") + elif fault == "duplicate": + collected.append(CASE) + elif fault == "skipped": + outcomes[CASE]["call"] = "skipped" + elif fault == "teardown": + outcomes[CASE]["teardown"] = "failed" + else: + del outcomes[CASE]["call"] + assert execution_verdict([CASE], collected, outcomes)["passed"] is False + + +def test_complete_report_records_exact_identity(): + result = execution_verdict([CASE], [CASE], {CASE: SUCCESS}) + assert result["passed"] is True + assert result["counts"] == {"tests": 1, "failures": 0, "errors": 0, "skipped": 0} + assert result["expected_case_ids_sha256"] == case_digest([CASE]) + + +def test_diagnostics_cannot_enter_required_case_set(tmp_path): + path = tmp_path / "cases.json" + path.write_text( + json.dumps( + { + "schema_version": 1, + "suites": { + "norm": [CASE], + "core": ["tests/example.py::test_core"], + "diagnostics": ["tests/example.py::test_approximate"], + }, + } + ) + ) + assert load_cases(path, "all") == sorted([CASE, "tests/example.py::test_core"]) + + +@pytest.mark.parametrize("outcome", ["pass", "skip", "xfail", "deselected"]) +def test_plugin_enforces_real_pytest_outcomes(tmp_path, outcome): + test_file = tmp_path / "test_acceptance.py" + body = "pass" + if outcome == "skip": + body = "pytest.skip('missing CUDA')" + elif outcome == "xfail": + body = "pytest.xfail('unimplemented')" + test_file.write_text(f"import pytest\ndef test_required():\n {body}\n") + case = "test_acceptance.py::test_required" + manifest = tmp_path / "cases.json" + manifest.write_text(json.dumps({"schema_version": 1, "suites": {"core": [case]}})) + report_path = tmp_path / "report.json" + args = [ + sys.executable, + "-m", + "pytest", + "-q", + "-p", + "no:cacheprovider", + "-p", + "rl_engine.testing.pytest_case_manifest", + "--case-manifest", + str(manifest), + "--case-suite", + "core", + "--case-report", + str(report_path), + str(test_file), + ] + if outcome == "deselected": + args.extend(["-k", "not required"]) + # Use this source tree even when a different RL-Kernel checkout is installed. + import os + + env = dict(os.environ, PYTHONPATH=str(Path(__file__).resolve().parents[1])) + result = subprocess.run(args, cwd=tmp_path, env=env, capture_output=True, text=True) + assert result.returncode == ( + 0 if outcome == "pass" else (5 if outcome == "deselected" else 1) + ), (result.stdout + result.stderr) + report = json.loads(report_path.read_text()) + assert report["passed"] is (outcome == "pass") + assert report["expected_case_ids"] == [case] diff --git a/tests/test_qwen3_next_chain_report.py b/tests/test_qwen3_next_chain_report.py new file mode 100644 index 000000000..71b0eacde --- /dev/null +++ b/tests/test_qwen3_next_chain_report.py @@ -0,0 +1,149 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""The Qwen3-Next chain report keeps the WS1 chain-gate shape and attributes first drift.""" + +import dataclasses + +import pytest +import torch + +from rl_engine.kernels.gtest import qwen3_next_chain_report as chain +from rl_engine.kernels.gtest.chain_gate import ChainGateReport +from rl_engine.kernels.gtest.tolerance import load_contract + +CASES = ("p0008-b1-full", "p0008-b1-chunked") + + +def artifact(seed): + g = torch.Generator().manual_seed(seed) + return { + "logprobs": -torch.rand((1, 16), generator=g), + "logits": torch.randn((1, 16, 64), generator=g).to(torch.bfloat16), + "embedding_digest": {"sha256": "a" * 64, "sample_sha256": ["a" * 64]}, + "layer_digests": [{"layer": layer, "output_sha256": "b" * 64} for layer in range(48)], + } + + +def record(passed=True, node=None, layer=None, tensor=None): + return { + "passed": passed, + "first_divergent_node": None if node is None else {"layer": layer, "node": node}, + "first_difference": None if tensor is None else {"tensor": tensor}, + "artifacts": {}, + } + + +def inputs(records=None, recompute_seed=1): + matrices, artifacts = {}, {} + for version in ("baseline", "update1"): + matrices[version] = { + "status": "passed", + "case_ids": list(CASES), + "cases": {case: record() for case in CASES}, + "fixture": {"content_sha256": "f" * 64}, + } + artifacts[version] = { + case: {"rollout": artifact(1), "recompute": artifact(recompute_seed)} for case in CASES + } + for (version, case), value in (records or {}).items(): + matrices[version]["cases"][case] = value + matrices[version]["status"] = "failed" + return matrices, artifacts + + +def build(matrices, artifacts): + return chain.build_report( + matrices, + artifacts, + contract=load_contract(), + measured_commit="c" * 40, + weight_source="Qwen/Qwen3-Next-80B-A3B-Instruct@rev", + weight_hash="h" * 64, + device="cuda", + gpu_name="NVIDIA B200", + compute_capability="10.0", + ) + + +def test_report_is_a_chain_gate_report_superset_and_passes_when_bitwise(): + report = build(*inputs()) + fields = {field.name for field in dataclasses.fields(ChainGateReport)} + assert fields <= set(report) + assert report["schema_version"] == "qwen3-next-chain-v1" + assert report["compatible_schema"] == "ws1-c10-c11-v5" + assert report["passed"] and report["first_drift"] is None + assert report["first_drift_family"] is None + assert len(report["cells"]) == 4 and len(report["invariance"]) == 8 + assert all(item["atol"] == 0 and item["passed"] for item in report["invariance"]) + assert report["weight_versions"] == ["baseline", "update1"] + assert [entry["case_id"] for entry in report["decode_prefill"]] == [ + "baseline/p0008-b1-chunked", + "update1/p0008-b1-chunked", + ] + + +def test_a_single_bit_in_the_replay_fails_the_report(): + matrices, artifacts = inputs() + replay = artifacts["update1"]["p0008-b1-full"]["recompute"] + replay["logprobs"] = replay["logprobs"].clone() + replay["logprobs"][0, 3] = torch.nextafter(replay["logprobs"][0, 3], torch.tensor(0.0)) + report = build(matrices, artifacts) + assert not report["passed"] + failing = [item for item in report["invariance"] if not item["passed"]] + assert [item["config_pair"][0] for item in failing] == ["update1/p0008-b1-full/rollout"] + + +@pytest.mark.parametrize( + "node,layer,family,label", + [ + ("embedding", 0, "embedding", "embedding"), + ("input_layernorm", 0, "norm", "layer0.input_layernorm"), + ("post_attention_layernorm", 5, "norm", "layer5.post_attention_layernorm"), + ("mixer", 2, "gdn", "layer2.mixer"), + ("state", 7, "full_attention", "layer7.state"), + ("mixer", 47, "full_attention", "layer47.mixer"), + ("router", 9, "moe", "layer9.router"), + ("mlp", 10, "moe", "layer10.mlp"), + ], +) +def test_fabricated_drift_resolves_to_its_layer_family(node, layer, family, label): + failing = record(passed=False, node=node, layer=layer) + report = build(*inputs({("update1", "p0008-b1-chunked"): failing})) + assert not report["passed"] + assert report["first_drift"] == f"{label}:rollout->recompute" + assert report["first_drift_family"] == family + assert report["first_drift_layer"] == layer + assert report["first_drift_cell"] == "update1/p0008-b1-chunked" + + +def test_drift_after_the_last_layer_is_the_lm_head_or_logprob(): + failing = record(passed=False, tensor="logprobs") + report = build(*inputs({("baseline", "p0008-b1-full"): failing})) + assert report["first_drift"] == "logprobs:rollout->recompute" + assert report["first_drift_family"] == "lm_head_logprob" + assert report["first_drift_layer"] is None + + +def test_the_earliest_weight_version_and_case_names_the_first_drift(): + report = build( + *inputs( + { + ("update1", "p0008-b1-full"): record(False, "router", 3), + ("baseline", "p0008-b1-chunked"): record(False, "mixer", 11), + } + ) + ) + assert report["first_drift_cell"] == "baseline/p0008-b1-chunked" + assert report["first_drift_family"] == "full_attention" + + +def test_unknown_nodes_and_versions_are_rejected(): + with pytest.raises(ValueError, match="Unknown divergence node"): + chain.family_of(3, "gate") + with pytest.raises(ValueError, match="needs a decoder layer"): + chain.family_of(None, "mixer") + matrices, artifacts = inputs() + matrices["update3"] = matrices["update1"] + with pytest.raises(ValueError, match="subset"): + build(matrices, artifacts) diff --git a/tests/test_qwen3_next_checkpoint.py b/tests/test_qwen3_next_checkpoint.py new file mode 100644 index 000000000..54113ea66 --- /dev/null +++ b/tests/test_qwen3_next_checkpoint.py @@ -0,0 +1,222 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Crash boundaries for four-rank atomic checkpoint publication.""" + +import json +import sys +from pathlib import Path + +import pytest + +sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "scripts")) +from qwen3_next_checkpoint import ( # noqa: E402 + newest_complete_checkpoint, + publish_checkpoint, + resume_interrupted_publications, + validate_checkpoint, + write_rank_manifest, +) + +IDENTITY = {"provider": "explicit", "tp": 4, "environment": "pinned", "weight_revision": "official"} + + +def staged(root, step=1): + directory = root / f"step-{step}.partial" + directory.mkdir() + for rank in range(4): + rank_dir = directory / f"rank-{rank}" + rank_dir.mkdir() + files = {} + for role in ("model", "optimizer", "rng", "progress"): + path = rank_dir / f"{role}.json" + path.write_text(json.dumps({"rank": rank, "role": role, "step": step})) + files[role] = [str(path.relative_to(directory))] + write_rank_manifest( + directory, + rank=rank, + world_size=4, + identity=IDENTITY, + step=step, + sample_position=step * 4, + files=files, + ) + return directory + + +def test_complete_publication_and_recovery(tmp_path): + partial = staged(tmp_path) + destination = tmp_path / "step-1" + publish_checkpoint(partial, destination, world_size=4, identity=IDENTITY) + assert not partial.exists() + assert validate_checkpoint(destination, IDENTITY)["step"] == 1 + assert json.loads((tmp_path / "LATEST.json").read_text())["path"] == "step-1" + recovery = newest_complete_checkpoint(tmp_path, IDENTITY) + assert recovery["checkpoint"] == str(destination) + assert recovery["sample_position"] == 4 + + +def test_missing_rank_prevents_completion_marker(tmp_path): + partial = staged(tmp_path) + (partial / "rank-3.manifest.json").unlink() + with pytest.raises(FileNotFoundError): + publish_checkpoint(partial, tmp_path / "step-1", world_size=4, identity=IDENTITY) + assert not (partial / "COMPLETE.json").exists() + assert not (tmp_path / "step-1").exists() + + +def test_corruption_prevents_publication(tmp_path): + partial = staged(tmp_path) + (partial / "rank-2/optimizer.json").write_text("damaged") + with pytest.raises(ValueError, match="checksum|size mismatch"): + publish_checkpoint(partial, tmp_path / "step-1", world_size=4, identity=IDENTITY) + assert not (partial / "COMPLETE.json").exists() + + +def test_only_completed_checkpoints_can_load(tmp_path): + partial = staged(tmp_path) + with pytest.raises(ValueError, match="Unpublished"): + validate_checkpoint(partial, IDENTITY) + assert newest_complete_checkpoint(tmp_path, IDENTITY)["checkpoint"] is None + + +def test_corrupt_latest_falls_back_and_records_reason(tmp_path): + for step in (1, 2): + partial = staged(tmp_path, step) + publish_checkpoint(partial, tmp_path / f"step-{step}", world_size=4, identity=IDENTITY) + (tmp_path / "step-2/rank-0/rng.json").write_text("corrupt") + staged(tmp_path, 3) + recovery = newest_complete_checkpoint(tmp_path, IDENTITY) + assert recovery["step"] == 1 + assert recovery["rejected"][0]["path"] == "step-2" + assert recovery["interrupted"] == ["step-3.partial"] + + +def test_identity_mismatch_never_resumes_fresh_silently(tmp_path): + partial = staged(tmp_path) + publish_checkpoint(partial, tmp_path / "step-1", world_size=4, identity=IDENTITY) + with pytest.raises(ValueError, match="No valid"): + newest_complete_checkpoint(tmp_path, {**IDENTITY, "tp": 2}) + + +def test_rank_progress_mismatch_prevents_publication(tmp_path): + partial = staged(tmp_path) + path = partial / "rank-3.manifest.json" + payload = json.loads(path.read_text()) + payload["step"] = 2 + path.write_text(json.dumps(payload)) + with pytest.raises(ValueError, match="different progress"): + publish_checkpoint(partial, tmp_path / "step-1", world_size=4, identity=IDENTITY) + + +def test_rank_cannot_omit_optimizer_or_reuse_rng_as_model(tmp_path): + partial = tmp_path / "new.partial" + partial.mkdir() + (partial / "state").write_text("state") + with pytest.raises(ValueError, match="Every rank"): + write_rank_manifest( + partial, + rank=0, + world_size=4, + identity=IDENTITY, + step=1, + sample_position=4, + files={"model": ["state"]}, + ) + with pytest.raises(ValueError, match="multiple state roles"): + write_rank_manifest( + partial, + rank=0, + world_size=4, + identity=IDENTITY, + step=1, + sample_position=4, + files={role: ["state"] for role in ("model", "optimizer", "rng", "progress")}, + ) + + +def test_crash_after_marker_before_rename_stays_unloadable(tmp_path, monkeypatch): + partial = staged(tmp_path) + + def crash(*args, **kwargs): + raise OSError("simulated interrupted rename") + + monkeypatch.setattr(Path, "rename", crash) + with pytest.raises(OSError): + publish_checkpoint(partial, tmp_path / "step-1", world_size=4, identity=IDENTITY) + assert (partial / "COMPLETE.json").exists() + assert newest_complete_checkpoint(tmp_path, IDENTITY)["checkpoint"] is None + + +def test_published_directory_cannot_be_overwritten(tmp_path): + partial = staged(tmp_path) + destination = tmp_path / "step-1" + destination.mkdir() + with pytest.raises(ValueError, match="new sibling"): + publish_checkpoint(partial, destination, world_size=4, identity=IDENTITY) + + +def test_disk_budget_counts_last_next_exports_and_records_failure(tmp_path, monkeypatch): + from collections import namedtuple + + import qwen3_next_checkpoint as checkpoint + + usage = namedtuple("Usage", "total used free") + monkeypatch.setattr(checkpoint.shutil, "disk_usage", lambda path: usage(1000, 750, 250)) + with pytest.raises(RuntimeError, match="insufficient_disk"): + checkpoint.require_checkpoint_disk_space( + tmp_path, checkpoint_bytes=100, export_bytes=40, headroom_bytes=20 + ) + record = json.loads((tmp_path / "disk-budget.json").read_text()) + assert record["required_free_bytes"] == 260 and record["status"] == "insufficient_disk" + record = checkpoint.require_checkpoint_disk_space( + tmp_path, + checkpoint_bytes=100, + export_bytes=40, + retained_complete_bytes=100, + headroom_bytes=20, + ) + assert record["required_free_bytes"] == 160 and record["status"] == "passed" + + +def test_discovery_without_hashing_checks_sizes_and_defers_content_to_the_loader(tmp_path): + partial = staged(tmp_path) + publish_checkpoint(partial, tmp_path / "step-1", world_size=4, identity=IDENTITY) + target = tmp_path / "step-1/rank-0/rng.json" + original = target.read_text() + target.write_text("X" * len(original)) # same size, different bytes + fast = newest_complete_checkpoint(tmp_path, IDENTITY, verify_files=False) + assert fast["checkpoint"] == str(tmp_path / "step-1") and fast["rejected"] == [] + with pytest.raises(ValueError, match="checksum mismatch"): + newest_complete_checkpoint(tmp_path, IDENTITY) # hashed discovery still rejects it + target.write_text(original + "!") # size change is still caught without hashing + with pytest.raises(ValueError, match="size mismatch"): + newest_complete_checkpoint(tmp_path, IDENTITY, verify_files=False) + + +def test_interrupted_but_complete_partial_is_published_on_resume(tmp_path): + partial = staged(tmp_path, 1) # all four ranks and manifests written, never published + (partial / "STAGING.json").write_text(json.dumps({"identity": IDENTITY, "status": "staging"})) + records = resume_interrupted_publications(tmp_path, IDENTITY) + assert records == [ + {"reason": "interrupted_publication_resumed", "checkpoint": "step-1", "step": 1} + ] + assert not partial.exists() + assert newest_complete_checkpoint(tmp_path, IDENTITY)["checkpoint"] == str(tmp_path / "step-1") + + +def test_incomplete_or_corrupt_partial_is_not_resumed(tmp_path): + missing = staged(tmp_path, 1) + (missing / "rank-3.manifest.json").unlink() + corrupt = staged(tmp_path, 2) + (corrupt / "rank-0/rng.json").write_text("corrupt") + for partial in (missing, corrupt): + (partial / "STAGING.json").write_text( + json.dumps({"identity": IDENTITY, "status": "staging"}) + ) + records = resume_interrupted_publications(tmp_path, IDENTITY) + assert [r["reason"] for r in records] == ["interrupted_publication_not_resumable"] + assert records[0]["staging"] == "step-2.partial" + assert missing.exists() and corrupt.exists() + assert not (corrupt / "COMPLETE.json").exists() + assert newest_complete_checkpoint(tmp_path, IDENTITY)["checkpoint"] is None diff --git a/tests/test_qwen3_next_engine_weights.py b/tests/test_qwen3_next_engine_weights.py new file mode 100644 index 000000000..862d8a15e --- /dev/null +++ b/tests/test_qwen3_next_engine_weights.py @@ -0,0 +1,81 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Segmented convolution must survive the engines' actual rank-major TP layout.""" + +from types import SimpleNamespace + +import pytest +import torch + +from rl_engine.integrations.qwen3_next_engine_weights import ( + conv_hf_to_rank_major, + conv_rank_major_to_hf, + expert_hf_to_rank_major, + expert_rank_major_to_hf, + kv_hf_to_rank_major, + kv_rank_major_to_hf, + validate_training_topology, +) +from rl_engine.testing.tensor_identity import assert_tensor_bitwise_equal + + +def test_conv_rank_major_shards_preserve_q_k_v_segments(): + generator = torch.Generator().manual_seed(27) + weight = torch.randn((8192, 1, 4), generator=generator).bfloat16() + rank_major = conv_hf_to_rank_major(weight) + segments = weight.split((2048, 2048, 4096)) + for rank, shard in enumerate(rank_major.chunk(4)): + assert_tensor_bitwise_equal(shard, torch.cat([part.chunk(4)[rank] for part in segments])) + assert_tensor_bitwise_equal(conv_rank_major_to_hf(rank_major), weight) + + +@pytest.mark.parametrize( + "field", + [ + "tensor_model_parallel_size", + "context_parallel_size", + "pipeline_model_parallel_size", + "expert_model_parallel_size", + "sequence_parallel", + "fp32_residual_connection", + "hidden_dropout", + "mtp_num_layers", + ], +) +def test_training_adapter_rejects_unsupported_topology(field): + values = dict( + tensor_model_parallel_size=4, + context_parallel_size=1, + pipeline_model_parallel_size=1, + expert_model_parallel_size=1, + sequence_parallel=False, + fp32_residual_connection=False, + hidden_dropout=0, + mtp_num_layers=0, + ) + values[field] = 2 if field.endswith("size") else 1 + with pytest.raises(ValueError): + validate_training_topology( + SimpleNamespace(**values), SimpleNamespace(sequence_parallel=False) + ) + + +def test_kv_export_rejects_diverged_replica(): + weight = torch.randn(512, 2048).bfloat16() + packed = kv_hf_to_rank_major(weight) + assert_tensor_bitwise_equal(kv_rank_major_to_hf(packed), weight) + packed[256, 0] = packed[256, 0] + 1 + with pytest.raises(AssertionError, match="KV replica pair 0"): + kv_rank_major_to_hf(packed) + + +def test_expert_gather_restores_separate_hf_gate_and_up(): + gate, up = (torch.randn(512, 2048).bfloat16() for _ in range(2)) + packed = expert_hf_to_rank_major(gate, up) + for rank, shard in enumerate(packed.chunk(4)): + assert_tensor_bitwise_equal(shard[:128], gate.chunk(4)[rank]) + assert_tensor_bitwise_equal(shard[128:], up.chunk(4)[rank]) + restored = expert_rank_major_to_hf(packed) + assert_tensor_bitwise_equal(restored[0], gate) + assert_tensor_bitwise_equal(restored[1], up) diff --git a/tests/test_qwen3_next_environment_identity.py b/tests/test_qwen3_next_environment_identity.py new file mode 100644 index 000000000..35e4606ef --- /dev/null +++ b/tests/test_qwen3_next_environment_identity.py @@ -0,0 +1,41 @@ +# SPDX-License-Identifier: Apache-2.0 +"""The environment identity must not depend on what the process has imported.""" + +import sys +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "scripts")) + +from qwen3_next_runtime import current_identity, installation_roots # noqa: E402 + + +def _fake_distribution(root: Path, name: str, version: str) -> None: + info = root / f"{name}-{version}.dist-info" + info.mkdir(parents=True) + (info / "METADATA").write_text(f"Metadata-Version: 2.1\nName: {name}\nVersion: {version}\n") + + +def test_identity_ignores_sys_path_entries_added_after_startup(tmp_path, monkeypatch): + before = current_identity() + extra = tmp_path / "late-site-packages" + _fake_distribution(extra, "late_arrival", "1.0") + monkeypatch.syspath_prepend(str(extra)) + after = current_identity() + assert after["sha256"] == before["sha256"] + assert all(item["name"] != "late_arrival" for item in after["identity"]["distributions"]) + + +def test_identity_survives_importing_setuptools(): + before = current_identity() + import setuptools # noqa: F401 # appends setuptools/_vendor to sys.path + + after = current_identity() + assert after["sha256"] == before["sha256"] + assert all(item["name"] != "typeguard" for item in after["identity"]["distributions"]) + + +def test_installation_roots_are_site_directories_only(): + roots = installation_roots() + assert roots + assert all(root.is_dir() for root in roots) + assert not any("_vendor" in str(root) for root in roots) diff --git a/tests/test_qwen3_next_evidence_redaction.py b/tests/test_qwen3_next_evidence_redaction.py new file mode 100644 index 000000000..5f045e8ab --- /dev/null +++ b/tests/test_qwen3_next_evidence_redaction.py @@ -0,0 +1,105 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Published Qwen3-Next evidence carries no site paths, hosts, users or scheduler details.""" + +import json +import re +import sys +from pathlib import Path + +import pytest + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT / "scripts")) + +import qwen3_next_publish_evidence as publisher # noqa: E402 + +PATTERNS = ( + r"/data/", + r"/home/", + r"/raid/", + r"/scratch", + r"\bdgx-", + r"SLURM_", + r"\bsbatch\b", + r"\bsrun\b", + r"\bwrd\b", + r"\boverflow\b", + r"\bjob_id\b", +) + + +def published_files(): + roots = [ + *ROOT.glob("docs/usage/evidence/qwen3-next-*"), + *ROOT.glob("docs/operators/qwen3-next-*.md"), + *ROOT.glob("docs/usage/qwen3-next-*.md"), + ] + for root in roots: + paths = [root] if root.is_file() else root.rglob("*") + for path in paths: + if path.is_file() and path.suffix in (".md", ".json", ".txt", ".xml", ""): + yield path + + +@pytest.mark.parametrize("path", sorted(published_files()), ids=lambda p: str(p.relative_to(ROOT))) +def test_published_qwen3_next_evidence_is_redacted(path): + text = path.read_text(errors="replace") + assert not [pattern for pattern in PATTERNS if re.search(pattern, text)] + + +def chain(tmp_path): + runs_root = tmp_path / "data" / "runs" + checkpoint = tmp_path / "data" / "ckpt" / "rev" + previous = None + for stage in ("preflight", "layers"): + run = runs_root / f"20261009T000000Z-{stage}" + (run / "attempts" / "0").mkdir(parents=True) + manifest = { + "stage": stage, + "source_commit": "c" * 40, + "checkpoint": str(checkpoint), + "cuda_home": "/usr/local/cuda-13.0", + "python": str(tmp_path / "data" / "env" / "bin" / "python"), + "previous": str(previous) if previous else None, + } + (run / "run.json").write_text(json.dumps(manifest)) + evidence = run / "attempts" / "0" / "environment.json" + evidence.write_text( + json.dumps( + { + "checkpoint": str(checkpoint / "config.json"), + "executable": manifest["python"], + "host": "dgx-1a-02-03", + "site": "/usr/lib/python3/site-packages/vllm/__init__.py", + } + ) + ) + result = { + "status": "passed", + "evidence": {"environment": {"path": "attempts/0/environment.json"}}, + } + (run / "result.json").write_text(json.dumps(result)) + previous = run + return previous + + +def test_publisher_replaces_every_recorded_root(tmp_path): + out = tmp_path / "published" + publisher.publish(publisher.chain_runs(chain(tmp_path)), None, out) + text = (out / "layers" / "environment.json").read_text() + assert "/config.json" in text and "" in text + assert "" in text and "" in text and str(tmp_path) not in text + assert (out / "measured-commit.txt").read_text() == "c" * 40 + "\n" + sums = (out / "SHA256SUMS").read_text().splitlines() + assert any(line.endswith("preflight/run.json") for line in sums) + + +def test_publisher_refuses_text_that_survives_redaction(tmp_path): + last = chain(tmp_path) + leak = last / "attempts" / "0" / "environment.json" + leak.write_text(json.dumps({"note": "copied from /scratch/elsewhere"})) + with pytest.raises(SystemExit, match="survived redaction"): + publisher.publish(publisher.chain_runs(last), None, tmp_path / "published") + assert not (tmp_path / "published").exists() diff --git a/tests/test_qwen3_next_failure.py b/tests/test_qwen3_next_failure.py new file mode 100644 index 000000000..235f68606 --- /dev/null +++ b/tests/test_qwen3_next_failure.py @@ -0,0 +1,136 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Failure classification must retain evidence and never guess from signals.""" + +import errno +import json +import subprocess +import sys +from pathlib import Path + +import pytest + +sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "scripts")) +from qwen3_next_runtime import failure_kind, subprocess_failure # noqa: E402 + + +@pytest.mark.parametrize( + "text,expected", + [ + ("Killed", "unknown"), + ("exit 137", "unknown"), + ("MemoryError: allocation failed", "unknown"), + ("torch.OutOfMemoryError: allocation failed", "out_of_memory"), + ("RuntimeError: CUDA out of memory", "out_of_memory"), + ("OSError: [Errno 28] No space left on device", "insufficient_disk"), + ("RuntimeError: insufficient_disk: budget", "insufficient_disk"), + ("ModuleNotFoundError: No module named 'vime'", "environment_mismatch"), + ("RuntimeError: environment_mismatch: changed", "environment_mismatch"), + ("RuntimeError: source_mismatch: changed", "source_mismatch"), + ("RuntimeError: checkpoint_mismatch: changed", "checkpoint_mismatch"), + ("subprocess.TimeoutExpired: command exceeded timeout", "time_limit"), + ], +) +def test_tail_classification_is_explicit(tmp_path, text, expected): + log = tmp_path / "worker.log" + log.write_text(text) + failure = subprocess_failure(-9, log) + assert failure_kind(failure) == expected + assert text in str(failure) + assert str(log) in str(failure) + + +def test_exception_classification_and_actual_sigkill(tmp_path): + from qwen3_next_l2 import run_process + + assert failure_kind(OSError(errno.ENOSPC, "disk full")) == "insufficient_disk" + assert failure_kind(subprocess.TimeoutExpired("worker", 1)) == "time_limit" + with pytest.raises(RuntimeError) as caught: + run_process( + [sys.executable, "-c", "import os, signal; os.kill(os.getpid(), signal.SIGKILL)"], + log_path=tmp_path / "killed.log", + ) + assert failure_kind(caught.value) == "unknown" + with pytest.raises(subprocess.TimeoutExpired) as caught: + run_process( + [sys.executable, "-c", "import time; time.sleep(30)"], + log_path=tmp_path / "timeout.log", + timeout=0.02, + cleanup_grace_seconds=0.05, + ) + assert failure_kind(caught.value) == "time_limit" + + +def test_timeout_kills_ignoring_grandchild_even_after_leader_exits(tmp_path): + import os + import signal + import time + + from qwen3_next_l2 import run_process + + pid_file = tmp_path / "grandchild.pid" + grandchild = ( + "import os,pathlib,signal,time; " + "signal.signal(signal.SIGTERM, signal.SIG_IGN); " + f"pathlib.Path({str(pid_file)!r}).write_text(str(os.getpid())); time.sleep(60)" + ) + leader = ( + "import subprocess,sys,time; " + f"subprocess.Popen([sys.executable, '-c', {grandchild!r}]); time.sleep(60)" + ) + pid = None + try: + with pytest.raises(subprocess.TimeoutExpired) as caught: + run_process( + [sys.executable, "-c", leader], + log_path=tmp_path / "family.log", + timeout=0.5, + cleanup_grace_seconds=0.15, + ) + assert failure_kind(caught.value) == "time_limit" + pid = int(pid_file.read_text()) + stat = Path(f"/proc/{pid}/stat") + # An orphan may briefly remain as a zombie until init reaps it, but must + # exit once the kernel schedules its pending SIGKILL. We cannot waitpid + # an orphan that has already been adopted by init. + deadline = time.monotonic() + 2 + while stat.exists() and stat.read_text().split(") ", 1)[1].split()[0] != "Z": + if time.monotonic() >= deadline: + break + time.sleep(0.01) + assert not stat.exists() or stat.read_text().split(") ", 1)[1].split()[0] == "Z" + finally: + if pid is None and pid_file.exists(): + pid = int(pid_file.read_text()) + if pid is not None: + try: + os.kill(pid, signal.SIGKILL) + except ProcessLookupError: + pass + + +def test_training_failure_binds_run_attempt_and_error(tmp_path, monkeypatch): + import qwen3_next_training as training + + manifest = tmp_path / "run.json" + manifest.write_text(json.dumps({"run_id": "controlled-run"})) + output = tmp_path / "attempts/2" + monkeypatch.setenv("QWEN3_NEXT_ATTEMPT", "2") + monkeypatch.setattr( + sys, "argv", ["training", "--manifest", str(manifest), "--output", str(output)] + ) + + def fail(*args): + raise OSError(errno.ENOSPC, "controlled full disk") + + monkeypatch.setattr(training, "execute", fail) + with pytest.raises(OSError): + training.main() + result = json.loads((output / "result.json").read_text()) + assert (result["run_id"], result["attempt"], result["failure_kind"]) == ( + "controlled-run", + "2", + "insufficient_disk", + ) + assert "controlled full disk" in result["error"] diff --git a/tests/test_qwen3_next_forward_contract.py b/tests/test_qwen3_next_forward_contract.py index 56d681b21..62ea492f9 100644 --- a/tests/test_qwen3_next_forward_contract.py +++ b/tests/test_qwen3_next_forward_contract.py @@ -16,6 +16,9 @@ lambda: provider.stable_top10_routes(torch.zeros(1, 512)), lambda: provider.combine_routes(torch.zeros(1, 10, 8), torch.zeros(1, 10)), lambda: provider.shared_attention(*(torch.zeros(1, 4, 8, 256) for _ in range(3))), + lambda: provider.shared_logprob( + torch.zeros(1, 151936), torch.zeros(1, dtype=torch.long), contract=None + ), ], ) def test_required_cuda_primitives_reject_cpu(call): diff --git a/tests/test_qwen3_next_imported_binary.py b/tests/test_qwen3_next_imported_binary.py new file mode 100644 index 000000000..9ac370fc2 --- /dev/null +++ b/tests/test_qwen3_next_imported_binary.py @@ -0,0 +1,107 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""CPU integrity checks; stub loader metadata does not claim CUDA execution.""" + +import hashlib +import importlib.machinery +from types import SimpleNamespace as Namespace + +import pytest + +from rl_engine.integrations import qwen3_next_binary as binary + + +def extension_metadata(tmp_path, monkeypatch): + path = tmp_path / ("_C" + importlib.machinery.EXTENSION_SUFFIXES[0]) + path.write_bytes(b"controlled-native-loader-metadata") + loader = importlib.machinery.ExtensionFileLoader("rl_engine._C", str(path)) + module = Namespace( + __name__="rl_engine._C", + __file__=str(path), + __spec__=Namespace(loader=loader, origin=str(path)), + ) + imports = [] + + def import_module(name): + imports.append(name) + return module + + monkeypatch.setattr(binary.importlib, "import_module", import_module) + return path, module, imports + + +def test_import_is_required_and_content_is_rehashed_after_same_size_replacement( + tmp_path, monkeypatch +): + path, _module, imports = extension_metadata(tmp_path, monkeypatch) + first = binary.imported_provider_identity() + assert first == { + "module": "rl_engine._C", + "path": str(path.resolve()), + "sha256": hashlib.sha256(path.read_bytes()).hexdigest(), + } + path.write_bytes(b"X" * path.stat().st_size) + second = binary.imported_provider_identity() + assert first["sha256"] != second["sha256"] + assert imports == ["rl_engine._C", "rl_engine._C"] + + +def test_extension_import_failure_does_not_use_python_fallback(monkeypatch): + def unavailable(name): + raise ImportError("controlled missing extension") + + monkeypatch.setattr(binary.importlib, "import_module", unavailable) + with pytest.raises(RuntimeError, match="cannot be imported"): + binary.imported_provider_identity() + + +@pytest.mark.parametrize("drift", ["name", "loader", "suffix", "origin"]) +def test_native_identity_rejects_fallback_or_disagreeing_import_metadata( + tmp_path, monkeypatch, drift +): + path, module, _imports = extension_metadata(tmp_path, monkeypatch) + if drift == "name": + module.__name__ = "fallback" + elif drift == "loader": + module.__spec__.loader = importlib.machinery.SourceFileLoader("rl_engine._C", str(path)) + elif drift == "suffix": + module.__file__ = str(tmp_path / "fallback.py") + else: + other = tmp_path / "other.so" + other.write_bytes(path.read_bytes()) + module.__spec__.origin = str(other) + with pytest.raises(RuntimeError, match="native extension|import origin"): + binary.imported_provider_identity() + + +def test_file_write_during_hash_is_rejected(tmp_path, monkeypatch): + path, _module, _imports = extension_metadata(tmp_path, monkeypatch) + original = binary.os.fstat + calls = 0 + + def modified_fstat(fd): + nonlocal calls + calls += 1 + if calls == 2: + path.write_bytes(b"changed-during-read") + return original(fd) + + monkeypatch.setattr(binary.os, "fstat", modified_fstat) + with pytest.raises(RuntimeError, match="changed while"): + binary.imported_provider_identity() + + +@pytest.mark.parametrize( + "value", + [ + None, + {}, + {"module": "fallback", "path": "/a.so", "sha256": "a" * 64}, + {"module": "rl_engine._C", "path": "relative.so", "sha256": "a" * 64}, + {"module": "rl_engine._C", "path": "/a.so", "sha256": "unknown"}, + ], +) +def test_serialized_binary_identity_is_mandatory_and_complete(value): + with pytest.raises(ValueError, match="binary evidence"): + binary.validate_provider_identity(value) diff --git a/tests/test_qwen3_next_installed_provider_identity.py b/tests/test_qwen3_next_installed_provider_identity.py new file mode 100644 index 000000000..5b37860ce --- /dev/null +++ b/tests/test_qwen3_next_installed_provider_identity.py @@ -0,0 +1,45 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Wheel metadata alone cannot detect a locally patched numerical provider.""" + +import sys +from pathlib import Path +from types import SimpleNamespace + +import pytest + +sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "scripts")) +from qwen3_next_runtime import installed_provider_sources # noqa: E402 + + +def test_same_version_provider_patch_changes_content_identity(tmp_path): + name = "vllm/model_executor/determinism/batch_invariant.py" + path = tmp_path / name + path.parent.mkdir(parents=True) + path.write_text("KERNEL = 'original'\n") + dist = SimpleNamespace( + metadata={"Name": "vllm"}, files=[name], locate_file=lambda name: tmp_path / name + ) + first = installed_provider_sources([dist]) + path.write_text("KERNEL = 'patched'\n") + second = installed_provider_sources([dist]) + assert first[name]["sha256"] != second[name]["sha256"] + assert first[name]["path"] == second[name]["path"] + + +@pytest.mark.parametrize("files", [None, [], ["vllm/unrelated.py"]]) +def test_missing_provider_inventory_is_rejected(files): + dist = SimpleNamespace(metadata={"Name": "vllm"}, files=files) + with pytest.raises(ValueError): + installed_provider_sources([dist]) + + +def test_provider_file_deleted_after_install_is_rejected(tmp_path): + dist = SimpleNamespace( + metadata={"Name": "vllm"}, + files=["vllm/model_executor/determinism/batch_invariant.py"], + locate_file=lambda name: tmp_path / name, + ) + with pytest.raises(FileNotFoundError): + installed_provider_sources([dist]) diff --git a/tests/test_qwen3_next_l2.py b/tests/test_qwen3_next_l2.py new file mode 100644 index 000000000..de4b29119 --- /dev/null +++ b/tests/test_qwen3_next_l2.py @@ -0,0 +1,719 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""CPU artifact and matrix contracts, never real-model acceptance evidence.""" + +import copy +import sys +from pathlib import Path + +import pytest +import torch + +from rl_engine.testing.qwen3_next_l2 import ( + PROMPT_LENGTHS, + RESPONSE_LENGTH, + VOCAB_SIZE, + L2Case, + case_matrix, + compare_artifacts, + compare_batch_prefill, + embedding_digest, + first_divergent_layer, + freeze_responses, + layer_digest, + layer_state_names, + load_tensor_artifact, + prompt_fixture, + save_tensor_artifact, + validate_fixture, + validate_model_artifact, + worker_request, +) + + +class UnitTokenizer: + def encode(self, text, *, add_special_tokens): + assert not add_special_tokens + return [ord(char) for char in text] + + +@pytest.fixture(scope="module") +def frozen(): + prompts = prompt_fixture(UnitTokenizer(), {"tokenizer.json": "test-tokenizer-hash"}) + baseline = { + str(length): { + "response_tokens": torch.arange(64, dtype=torch.int64).view(4, 16), + "logprobs": torch.full((4, 16), -1.0), + } + for length in PROMPT_LENGTHS + } + return freeze_responses( + prompts, + baseline, + baseline_identity="unit-test-only", + baseline_records={ + str(length): {"path": f"/unit-test-only/{length}.pt", "sha256": "1" * 64} + for length in PROMPT_LENGTHS + }, + ) + + +@pytest.fixture(scope="module") +def small_artifact(frozen): + request = worker_request( + L2Case(8, 1, "full"), frozen, role="rollout", identity={"test_only": True} + ) + return request, make_artifact(request) + + +def subnode_values(batch): + from rl_engine.integrations.qwen3_next_subnode import SUBNODES, subnode_layout + + return { + name: torch.zeros((batch, 16, subnode_layout(name)[0]), dtype=subnode_layout(name)[1]) + for name in SUBNODES + } + + +def make_artifact(request): + batch = len(request["prompt_tokens"]) + output = torch.zeros((batch, 16, 2048), dtype=torch.bfloat16) + + def states(layer): + return { + name: torch.ones( + (batch, 1, 2, 2), + dtype=torch.float32 if "recurrent_state" in name else torch.bfloat16, + ) + for name in layer_state_names(layer) + } + + return { + "metadata": { + key: request[key] + for key in ("schema_version", "case_id", "role", "identity", "request_sha256") + }, + "execution": request["execution"], + "prompt_tokens": torch.tensor(request["prompt_tokens"], dtype=torch.int64), + "response_tokens": torch.tensor(request["response_tokens"], dtype=torch.int64), + "prediction_positions": torch.tensor(request["prediction_positions"], dtype=torch.int64), + "logits": torch.zeros((batch, RESPONSE_LENGTH, VOCAB_SIZE), dtype=torch.bfloat16), + "logprobs": torch.full((batch, RESPONSE_LENGTH), -1.0, dtype=torch.float32), + "layer_digests": [ + layer_digest(layer, output, states(layer), subnodes=subnode_values(batch)) + for layer in range(48) + ], + "embedding_digest": embedding_digest(torch.zeros((batch, 16, 2048), dtype=torch.bfloat16)), + } + + +def test_exact_sixteen_case_matrix(): + cases = case_matrix() + assert len(cases) == 16 and len({case.case_id for case in cases}) == 16 + assert {case.prompt_length for case in cases} == {8, 64, 256, 1024} + assert {case.batch_size for case in cases} == {1, 4} + assert {case.prefill for case in cases} == {"full", "chunked"} + assert all( + sum(case.chunks) == case.prompt_length and all(size > 0 for size in case.chunks) + for case in cases + ) + assert L2Case(1024, 4, "chunked").chunks[:2] == [1, 63] + + +def test_offsets_and_batch_one_reuse_frozen_first_sample(frozen): + validate_fixture(frozen) + one = worker_request(L2Case(64, 1, "chunked"), frozen, role="recompute", identity={}) + four = worker_request(L2Case(64, 4, "full"), frozen, role="rollout", identity={}) + assert one["prompt_tokens"][0] == four["prompt_tokens"][0] + assert one["response_tokens"][0] == four["response_tokens"][0] + assert one["prediction_positions"] == list(range(63, 79)) + assert one["consumed_response_tokens"] == 15 + assert len(one["consumed_input_tokens"][0]) == 79 + assert one["state_position"] == 78 + assert one["execution"] == {"recompute_mode": "full_from_tokens", "input_sequence_length": 79} + assert one["prefill_chunks"] is None + assert one["rollout_prefill_chunks"] == [1, 63] + assert not any(key in one for key in ("hidden_states", "recurrent_state", "rollout_state")) + + +def test_frozen_tokens_and_old_logprobs_cannot_change(frozen): + for field in ("prompts", "responses", "old_logprobs"): + changed = copy.deepcopy(frozen) + changed[field]["64"][0, 0] += 1 + with pytest.raises(ValueError): + validate_fixture(changed) + + +def test_weights_only_tensor_serialization_roundtrip(tmp_path, frozen): + path = tmp_path / "input.pt" + save_tensor_artifact(path, frozen) + restored = load_tensor_artifact(path) + validate_fixture(restored) + assert restored["content_sha256"] == frozen["content_sha256"] + assert not path.with_suffix(".pt.partial").exists() + + +def test_valid_original_bf16_artifact(small_artifact): + request, artifact = small_artifact + validate_model_artifact(artifact, request) + report = compare_artifacts(artifact, artifact) + assert report["passed"] and report["first_divergent_layer"] is None + + +@pytest.mark.parametrize("field", ["logits", "logprobs"]) +def test_signed_zero_is_a_real_full_model_difference(small_artifact, field): + _, artifact = small_artifact + candidate = {**artifact, field: artifact[field].clone()} + reference = {**artifact, field: artifact[field].clone()} + reference[field].reshape(-1)[0] = 0.0 + candidate[field].reshape(-1)[0] = -0.0 + report = compare_artifacts(reference, candidate) + assert not report["passed"] + assert report["first_difference"]["tensor"] == field + assert report["first_difference"]["flat_element"] == 0 + + +@pytest.mark.parametrize("value", [float("nan"), float("inf"), float("-inf")]) +def test_nonfinite_logits_never_pass(small_artifact, value): + request, artifact = small_artifact + changed = {**artifact, "logits": artifact["logits"].clone()} + changed["logits"][0, 0, 0] = value + with pytest.raises(ValueError, match="nonfinite"): + validate_model_artifact(changed, request) + + +def test_widening_logits_or_truncating_vocab_is_rejected(small_artifact): + request, artifact = small_artifact + for logits in (artifact["logits"].float(), artifact["logits"][..., :1024]): + with pytest.raises(ValueError, match="original storage"): + validate_model_artifact({**artifact, "logits": logits}, request) + + +def test_wrong_response_offset_and_changed_tokens_are_rejected(small_artifact): + request, artifact = small_artifact + with pytest.raises(ValueError, match="offsets"): + validate_model_artifact( + {**artifact, "prediction_positions": artifact["prediction_positions"] + 1}, request + ) + with pytest.raises(ValueError, match="frozen response"): + validate_model_artifact( + {**artifact, "response_tokens": artifact["response_tokens"] + 1}, request + ) + + +def test_missing_layers_and_placeholder_hashes_are_rejected(small_artifact): + request, artifact = small_artifact + with pytest.raises(ValueError, match="48-layer"): + validate_model_artifact( + {**artifact, "layer_digests": artifact["layer_digests"][:-1]}, request + ) + changed = copy.deepcopy(artifact["layer_digests"]) + changed[0]["sample_output_sha256"] = [] + with pytest.raises(ValueError, match="Every layer"): + validate_model_artifact({**artifact, "layer_digests": changed}, request) + changed = copy.deepcopy(artifact["layer_digests"]) + changed[0]["output_sha256"] = "0" * 64 + with pytest.raises(ValueError, match="bound"): + validate_model_artifact({**artifact, "layer_digests": changed}, request) + + +def test_first_divergence_tracks_state_even_when_final_logits_match(small_artifact): + _, artifact = small_artifact + changed = copy.deepcopy(artifact["layer_digests"]) + changed[11]["sample_state_sha256"] = ["e" * 64] + candidate = {**artifact, "layer_digests": changed} + result = compare_artifacts(artifact, candidate) + assert not result["passed"] and result["first_divergent_layer"] == 11 + + +@pytest.mark.parametrize( + "node", ["input_layernorm", "mixer", "post_attention_layernorm", "router", "mlp"] +) +def test_first_divergent_node_names_the_sub_node(small_artifact, node): + from rl_engine.testing.qwen3_next_l2 import first_divergent_node + + _, artifact = small_artifact + changed = copy.deepcopy(artifact["layer_digests"]) + changed[23]["sample_subnode_sha256"][node] = ["e" * 64] + changed[30]["sample_output_sha256"] = ["e" * 64] + candidate = {**artifact, "layer_digests": changed} + assert first_divergent_node(artifact, candidate) == {"layer": 23, "node": node} + assert compare_artifacts(artifact, candidate)["first_divergent_node"]["node"] == node + + +def test_first_divergent_node_starts_at_the_embedding(small_artifact): + from rl_engine.testing.qwen3_next_l2 import first_divergent_node + + _, artifact = small_artifact + changed = copy.deepcopy(artifact["layer_digests"]) + changed[0]["sample_subnode_sha256"]["input_layernorm"] = ["e" * 64] + candidate = { + **artifact, + "layer_digests": changed, + "embedding_digest": {"sample_sha256": ["e" * 64], "sha256": "x"}, + } + assert first_divergent_node(artifact, candidate) == {"layer": 0, "node": "embedding"} + + +def test_first_divergent_node_falls_back_to_layer_output_and_state(small_artifact): + from rl_engine.testing.qwen3_next_l2 import first_divergent_node + + _, artifact = small_artifact + assert first_divergent_node(artifact, artifact) is None + changed = copy.deepcopy(artifact["layer_digests"]) + changed[5]["sample_state_sha256"] = ["e" * 64] + assert first_divergent_node(artifact, {**artifact, "layer_digests": changed}) == { + "layer": 5, + "node": "state", + } + + +def test_layer_digest_requires_every_sub_node_in_order(small_artifact): + request, artifact = small_artifact + output = torch.zeros((1, 16, 2048), dtype=torch.bfloat16) + states = { + name: torch.ones( + (1, 1, 2, 2), dtype=torch.float32 if "recurrent_state" in name else torch.bfloat16 + ) + for name in layer_state_names(0) + } + nodes = subnode_values(1) + with pytest.raises(ValueError, match="sub-nodes"): + layer_digest(0, output, states, subnodes=dict(reversed(list(nodes.items())))) + nodes["router"] = nodes["router"].int() + with pytest.raises(ValueError, match="router"): + layer_digest(0, output, states, subnodes=nodes) + + +def test_batch_invariance_selects_first_samples(frozen, small_artifact): + _, candidate = small_artifact + request = worker_request( + L2Case(8, 4, "full"), frozen, role="rollout", identity={"test_only": True} + ) + reference = make_artifact(request) + assert all(compare_batch_prefill(reference, candidate).values()) + reference["logits"][3, 0, 0] = 3.0 + assert all(compare_batch_prefill(reference, candidate).values()) + reference["logits"][0, 0, 0] = 3.0 + assert not compare_batch_prefill(reference, candidate)["logits"] + reference["layer_digests"][7]["sample_state_sha256"][0] = "f" * 64 + assert first_divergent_layer(reference, candidate) == 7 + + +def test_only_initial_rollout_can_generate_fixture(frozen): + for role, case in ( + ("recompute", L2Case(64, 4, "full")), + ("rollout", L2Case(64, 1, "full")), + ("rollout", L2Case(64, 4, "chunked")), + ): + with pytest.raises(ValueError, match="Only initial"): + worker_request(case, frozen, role=role, identity={}, generate=True) + + +def test_native_worker_absence_fails_readiness(monkeypatch): + sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "scripts")) + import qwen3_next_l2 as runner + + def absent(name): + raise ModuleNotFoundError(name) + + monkeypatch.setattr(runner.importlib, "import_module", absent) + with pytest.raises(RuntimeError, match="native_workers_not_ready"): + runner.check_ready() + + +def test_gpu_release_never_cancels_an_unrelated_process(monkeypatch): + sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "scripts")) + import qwen3_next_l2 as runner + + commands = [] + + def output(command, **kwargs): + commands.append(command) + return "99, GPU-owned, 10\\n123, GPU-other, 20\\n".replace("\\n", "\n") + + monkeypatch.setattr(runner.subprocess, "check_output", output) + with pytest.raises(RuntimeError, match="gpu_memory_not_released"): + runner.wait_gpu_release(["GPU-owned"], timeout=0) + runner.wait_gpu_release(["GPU-free"], timeout=0) + assert all(command[0] == "nvidia-smi" for command in commands) + + +def test_batch_callback_loads_once_and_freezes_before_recompute_cases(tmp_path, monkeypatch): + import json + from types import SimpleNamespace + + sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "scripts")) + import qwen3_next_l2 as runner + + calls = [] + + def native_batch(cases): + calls.append([]) + for request, path in cases: + calls[-1].append(request) + responses = request["response_tokens"] + batch = len(request["prompt_tokens"]) + if responses is None: + responses = torch.arange(batch * 16).view(batch, 16).tolist() + save_tensor_artifact( + path, + { + "response_tokens": torch.tensor(responses), + "logprobs": torch.full((batch, 16), -1.0), + }, + ) + + def eager_recompute(cases): + # The actual recompute worker must collect requests before spawning its + # single actor lifetime; none of these outputs exist during collection. + requests = list(cases) + assert len(requests) == 16 + assert all(not path.exists() for _, path in requests) + native_batch(requests) + + module = SimpleNamespace(run_rollout_cases=native_batch, run_recompute_cases=eager_recompute) + monkeypatch.setattr(runner, "check_ready", lambda: (module, {"batched_cases": True})) + monkeypatch.setattr(runner, "verify_environment", lambda *a, **k: None) + monkeypatch.setattr(runner, "verify_before_model_load", lambda *a, **k: None) + monkeypatch.setattr(runner, "validate_model_artifact", lambda *a: None) + monkeypatch.setitem( + sys.modules, + "transformers", + SimpleNamespace( + AutoTokenizer=SimpleNamespace(from_pretrained=lambda *a, **k: UnitTokenizer()) + ), + ) + checkpoint = {"metadata": {"tokenizer": "pinned"}} + manifest = { + "source_commit": "unit", + "source_tree": "unit", + "environment_sha256": "unit", + "checkpoint": "/unit", + "checkpoint_identity": checkpoint, + "provider_config": {}, + "topology": {"tp": 4, "pp": 1, "cp": 1, "ep": 1}, + "environment": {}, + } + monkeypatch.setattr(runner, "checkpoint_identity", lambda path: checkpoint) + fixture = tmp_path / "inputs/frozen.pt" + runner.worker_batch(manifest, tmp_path / "rollout", "rollout", fixture) + assert len(calls) == 1 and len(calls[0]) == 20 + assert all(row["response_tokens"] is None for row in calls[0][:4]) + assert all(row["response_tokens"] is not None for row in calls[0][4:]) + frozen_inputs = load_tensor_artifact(fixture) + validate_fixture(frozen_inputs) + runner.worker_batch(manifest, tmp_path / "recompute", "recompute", fixture) + assert len(calls) == 2 and len(calls[1]) == 16 + assert all(row["response_tokens"] is not None for row in calls[1]) + result = json.loads((tmp_path / "recompute/worker-result.json").read_text()) + assert len(result["cases"]) == 16 + updated = { + **manifest, + "weight_version": "update-1", + "base_checkpoint": "/unit", + "base_checkpoint_identity": checkpoint, + "checkpoint": "/updated-unit", + "checkpoint_identity": {"metadata": {"tokenizer": "pinned", "index": "new"}}, + } + monkeypatch.setattr(runner, "verify_updated_weights", lambda manifest: {}) + runner.worker_batch(updated, tmp_path / "updated", "rollout", fixture) + assert len(calls) == 3 and len(calls[2]) == 16 + assert all(row["response_tokens"] is not None for row in calls[2]) + + +def test_passed_flag_cannot_replace_full_matrix(): + from rl_engine.testing.qwen3_next_l2 import validate_matrix_report + + with pytest.raises(ValueError, match="sixteen-case"): + validate_matrix_report({"status": "passed", "raw_bit_comparison": True}) + + +def test_updated_weights_require_existing_baseline_fixture_before_worker(tmp_path, monkeypatch): + import qwen3_next_l2 as runner + + def unexpected(): + raise AssertionError("A missing frozen fixture must fail before loading native workers") + + monkeypatch.setattr(runner, "check_ready", unexpected) + with pytest.raises(RuntimeError, match="already frozen baseline"): + runner.worker_batch( + {"weight_version": "update-1"}, tmp_path / "out", "rollout", tmp_path / "missing.pt" + ) + + +def test_updated_preload_binds_actual_export_to_baseline_source_and_version(tmp_path, monkeypatch): + import qwen3_next_l2 as runner + import qwen3_next_training_export as export + + identity = { + "source_commit": "source", + "source_tree": "tree", + "environment_sha256": "env", + "provider_config": {"provider": "strict"}, + "topology": {"tp": 4}, + } + record = { + "weight_version": "update-1", + "base_checkpoint": "/official", + "base_checkpoint_identity": {"revision": "pinned"}, + "training_identity": identity, + } + manifest = { + **identity, + **{ + key: record[key] + for key in ("weight_version", "base_checkpoint", "base_checkpoint_identity") + }, + "checkpoint": "/updated", + "checkpoint_identity": record, + } + calls = [] + + def deep_verify(path, expected): + calls.append((path, expected)) + return record + + monkeypatch.setattr(export, "validate_training_export", deep_verify) + assert runner.verify_before_model_load(manifest, tmp_path) == record + assert calls == [("/updated", record)] + manifest["source_commit"] = "different" + with pytest.raises(RuntimeError, match="changed source_commit"): + runner.verify_updated_weights(manifest) + + +def test_debug_capture_must_contain_matching_layer_state(small_artifact): + from rl_engine.testing.qwen3_next_l2 import validate_debug_capture + + request, artifact = small_artifact + request = {**request, "trace_layers": [2]} + with pytest.raises(ValueError, match="missing"): + validate_debug_capture(artifact, request) + capture = { + "layer.2.output": torch.zeros((1, 16, 2048), dtype=torch.bfloat16), + **{ + f"layer.2.{name}": torch.ones( + (1, 1, 2, 2), dtype=torch.float32 if "recurrent_state" in name else torch.bfloat16 + ) + for name in layer_state_names(2) + }, + **{f"layer.2.subnode.{name}": value for name, value in subnode_values(1).items()}, + } + validate_debug_capture({**artifact, "debug_tensors": capture}, request) + capture["layer.2.tp0.recurrent_state"].zero_() + with pytest.raises(ValueError, match="differ"): + validate_debug_capture({**artifact, "debug_tensors": capture}, request) + + +def test_model_artifact_hash_is_rechecked_before_deserialization(tmp_path): + from qwen3_next_runtime import file_digest + + from rl_engine.testing.qwen3_next_l2 import checked_artifact_path + + artifact = tmp_path / "output.pt" + save_tensor_artifact(artifact, {"logits": torch.zeros(2, dtype=torch.bfloat16)}) + record = {"path": str(artifact), "sha256": file_digest(artifact)} + checked_artifact_path(record, artifact_root=tmp_path) + save_tensor_artifact(artifact, {"logits": torch.ones(2, dtype=torch.bfloat16)}) + with pytest.raises(ValueError, match="digest changed"): + checked_artifact_path(record, artifact_root=tmp_path) + + +def scheduler_request_and_audit(frozen): + identity = { + "weight_version": "baseline", + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "native_rollout_kv_cache_memory_bytes": 4 << 30, + }, + } + request = worker_request(L2Case(64, 4, "chunked"), frozen, role="rollout", identity=identity) + computed = 0 + steps = [] + for count in [*request["prefill_chunks"], *([1] * 15)]: + steps.append( + { + "samples": [3, 1, 0, 2], + "computed_before": [computed] * 4, + "token_counts": [count] * 4, + } + ) + computed += count + return request, { + "provider_execution_mode": "qualification", + "native_runtime_profile": { + "kv_cache_memory_bytes_per_gpu": 4 << 30, + "max_model_len": 1040, + "max_num_seqs": 64, + "max_num_batched_tokens": 16384, + "scheduler": "rl_engine.integrations.qwen3_next_native_rollout.ExactPrefillScheduler", + "async_scheduling": False, + "prefix_caching": False, + "weights_dtype": "bfloat16", + "recurrent_state_dtype": "float32", + "model_runner": "v1", + }, + "native_scheduler_steps": steps, + } + + +def test_actual_scheduler_must_follow_requested_chunks_and_offsets(frozen): + from rl_engine.testing.qwen3_next_l2 import validate_native_scheduler_execution + + request, artifact = scheduler_request_and_audit(frozen) + validate_native_scheduler_execution(artifact, request) + for key in ("token_counts", "computed_before", "samples"): + changed = copy.deepcopy(artifact) + changed["native_scheduler_steps"][0][key][0] += 1 + with pytest.raises(ValueError, match="sample/chunk/offset"): + validate_native_scheduler_execution(changed, request) + changed = {**artifact, "native_scheduler_steps": artifact["native_scheduler_steps"][:-1]} + with pytest.raises(ValueError, match="boundary"): + validate_native_scheduler_execution(changed, request) + + +def test_scheduler_cannot_shrink_cache_or_claim_certified_execution(frozen): + from rl_engine.testing.qwen3_next_l2 import validate_native_scheduler_execution + + request, artifact = scheduler_request_and_audit(frozen) + artifact["native_runtime_profile"]["kv_cache_memory_bytes_per_gpu"] //= 2 + with pytest.raises(ValueError, match="runtime"): + validate_native_scheduler_execution(artifact, request) + request, artifact = scheduler_request_and_audit(frozen) + artifact["provider_execution_mode"] = "certified" + with pytest.raises(ValueError, match="certificate identity"): + validate_native_scheduler_execution(artifact, request) + + +def test_layer_hashes_cannot_replace_four_original_worker_traces(frozen): + from rl_engine.testing.qwen3_next_l2 import validate_native_worker_traces + + request, artifact = scheduler_request_and_audit(frozen) + with pytest.raises(ValueError, match="each TP rank"): + validate_native_worker_traces(artifact, request) + + +def test_matrix_recomputes_tensor_comparisons_even_after_reports_are_rehashed(tmp_path, frozen): + import json + + from qwen3_next_runtime import file_digest + + from rl_engine.testing.qwen3_next_binary import archive_provider_binary, validate_binary_record + from rl_engine.testing.qwen3_next_l2 import json_digest, validate_matrix_report + + source = tmp_path / "source" + (source / "rl_engine").mkdir(parents=True) + (source / "rl_engine/_C.cpython-unit.so").write_bytes(b"unit native binary") + provider_binary = archive_provider_binary(source, tmp_path, source_tree="unit") + actual_binary = validate_binary_record(provider_binary) + + identity = { + "architecture_layers": 48, + "weight_version": "baseline", + "topology": {"tp": 4, "pp": 1, "cp": 1, "ep": 1}, + "test_only": True, + "source_tree": "unit", + } + + def record(path): + return {"path": str(path), "sha256": file_digest(path)} + + def compact_artifact(request): + result = make_artifact(request) + result["provider_binary"] = actual_binary + result["logits"] = torch.zeros((), dtype=torch.bfloat16).expand(result["logits"].shape) + return result + + baselines, baseline_records = {}, {} + for length in PROMPT_LENGTHS: + request = worker_request( + L2Case(length, 4, "full"), frozen, role="rollout", identity=identity, generate=True + ) + value = compact_artifact( + {**request, "response_tokens": frozen["responses"][str(length)].tolist()} + ) + path = tmp_path / f"baseline-{length}.pt" + save_tensor_artifact(path, value) + baselines[str(length)] = value + baseline_records[str(length)] = record(path) + fixture = freeze_responses( + frozen, + baselines, + baseline_identity=json_digest(identity), + baseline_records=baseline_records, + ) + fixture_path = tmp_path / "fixture.pt" + save_tensor_artifact(fixture_path, fixture) + checks = {name: True for name in ("response_tokens", "logits", "logprobs", "layer_states")} + processes = { + role: {"exit_code": 0, "pid": index + 1, "gpu_release_verified": True} + for index, role in enumerate(("rollout", "recompute")) + } + workers = { + role: { + "status": "passed", + "role": role, + "identity": identity, + "fixture_sha256": fixture["content_sha256"], + "pid": processes[role]["pid"], + "cases": {}, + "provider_binary": actual_binary, + } + for role in processes + } + cases = {} + for case in case_matrix(): + records = {} + for role in processes: + request = worker_request(case, fixture, role=role, identity=identity) + path = tmp_path / f"{role}-{case.case_id}.pt" + save_tensor_artifact(path, compact_artifact(request)) + records[role] = record(path) + workers[role]["cases"][case.case_id] = { + **records[role], + "request_sha256": request["request_sha256"], + } + cases[case.case_id] = { + "passed": True, + "comparisons": checks, + "batch_prefill": {role: checks for role in processes}, + "baseline_generation": {role: checks for role in processes}, + "artifacts": records, + } + worker_records = {} + for role in processes: + path = tmp_path / f"{role}-worker.json" + path.write_text(json.dumps(workers[role])) + worker_records[role] = record(path) + report = { + "schema_version": 1, + "status": "passed", + "scope": "qwen3_next_full_model_l2", + "raw_bit_comparison": True, + "logits_dtype": "bfloat16", + "logprobs_dtype": "float32", + "response_length": 16, + "vocab_size": 151936, + "identity": identity, + "case_ids": [case.case_id for case in case_matrix()], + "cases": cases, + "processes": processes, + "worker_results": worker_records, + "fixture": {**record(fixture_path), "content_sha256": fixture["content_sha256"]}, + "provider_binary": provider_binary, + } + validate_matrix_report(report, expected_identity=identity, artifact_root=tmp_path) + case_id = L2Case(8, 1, "full").case_id + path = Path(cases[case_id]["artifacts"]["recompute"]["path"]) + changed = load_tensor_artifact(path) + changed["logits"] = changed["logits"].clone() + changed["logits"][0, 0, 0] = -0.0 + save_tensor_artifact(path, changed) + cases[case_id]["artifacts"]["recompute"] = record(path) + workers["recompute"]["cases"][case_id].update(record(path)) + worker_path = Path(worker_records["recompute"]["path"]) + worker_path.write_text(json.dumps(workers["recompute"])) + report["worker_results"]["recompute"] = record(worker_path) + with pytest.raises(ValueError, match="tensor bytes contradict"): + validate_matrix_report(report, expected_identity=identity, artifact_root=tmp_path) diff --git a/tests/test_qwen3_next_layers.py b/tests/test_qwen3_next_layers.py new file mode 100644 index 000000000..7f9cec000 --- /dev/null +++ b/tests/test_qwen3_next_layers.py @@ -0,0 +1,135 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""CPU failure-injection tests; none constitutes native model evidence.""" + +import copy +import json +import sys +from pathlib import Path + +import pytest + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT / "scripts")) + +from qwen3_next_layer_contract import ( # noqa: E402 + checked_record, + layer_requirements, + validate_layer_report, + validate_rank_result, +) +from qwen3_next_runtime import STAGES # noqa: E402 +from qwen3_next_runtime import identity_digest # noqa: E402 + + +def rank_row(requirement, rank): + row = { + "status": "passed", + "rank": rank, + "scope": requirement["scope"], + "full_model_l2": "not_evaluated", + **requirement.get("fields", {}), + } + for path, cases in requirement["groups"].items(): + target = row + parts = path.split(".") + for part in parts[:-1]: + target = target.setdefault(part, {}) + target[parts[-1]] = list(cases) + return row + + +def test_layers_are_required_between_preflight_and_l2(): + assert STAGES["layers"][:3] == ("512G", "04:00:00", "preflight") + assert STAGES["l2"][2] == "layers" + + +@pytest.mark.parametrize("gate", ["gdn", "attention", "moe", "adapters", "heads"]) +def test_rank_gate_requires_complete_unduplicated_inventory(gate): + requirement = layer_requirements(ROOT)["gates"][gate] + row = rank_row(requirement, 2) + validate_rank_result(row, requirement, 2) + for field in ("rank", "scope", "status", "full_model_l2"): + altered = {**row, field: "changed"} + with pytest.raises(ValueError, match="identity"): + validate_rank_result(altered, requirement, 2) + for skipped in (1, 3): + with pytest.raises(ValueError, match="skipped"): + validate_rank_result({**row, "skipped": skipped}, requirement, 2) + for path in requirement["groups"]: + for duplicate in (False, True): + changed = copy.deepcopy(row) + value = changed + for part in path.split("."): + value = value[part] + value.append(value[0]) if duplicate else value.pop() + with pytest.raises(ValueError, match="mandatory"): + validate_rank_result(changed, requirement, 2) + + +def test_artifact_hash_and_attempt_escape_are_rejected(tmp_path): + from qwen3_next_runtime import file_digest + + attempt = tmp_path / "attempt" + attempt.mkdir() + path = attempt / "rank.json" + path.write_text("{}") + record = {"path": str(path), "sha256": file_digest(path)} + assert checked_record(record, root=attempt) == path + path.write_text('{"changed": true}') + with pytest.raises(ValueError, match="digest"): + checked_record(record, root=attempt) + record["sha256"] = file_digest(path) + with pytest.raises(ValueError, match="escaped"): + checked_record(record, root=attempt / "different") + + +def test_complete_component_flags_cannot_replace_native_scheduler(tmp_path): + from rl_engine.testing.qwen3_next_binary import archive_provider_binary, validate_binary_record + + source = tmp_path / "source" + (source / "rl_engine").mkdir(parents=True) + (source / "rl_engine/_C.cpython-unit.so").write_bytes(b"unit native binary") + provider_binary = archive_provider_binary(source, tmp_path, source_tree="unit") + actual_binary = validate_binary_record(provider_binary) + identity = {"source_tree": "unit"} + requirement = layer_requirements(ROOT) + report = { + "schema_version": 1, + "status": "passed", + "phase": "complete", + "scope": "qwen3_next_layer_and_scheduler_gates", + "identity": identity, + "requirements_sha256": identity_digest(requirement), + "full_model_l2": "not_evaluated", + "gates": {}, + "provider_binary": provider_binary, + } + from qwen3_next_runtime import file_digest + + for name, expected in requirement["gates"].items(): + records = {} + for rank in range(4): + path = tmp_path / f"{name}-{rank}.json" + path.write_text( + json.dumps({**rank_row(expected, rank), "provider_binary": actual_binary}) + ) + records[str(rank)] = {"path": str(path), "sha256": file_digest(path)} + report["gates"][name] = {"exit_code": 0, "gpu_release_verified": True, "ranks": records} + with pytest.raises(ValueError, match="artifact path"): + validate_layer_report(report, requirement, identity, root=tmp_path) + report["phase"] = "native_scheduler" + with pytest.raises(ValueError, match="completeness"): + validate_layer_report(report, requirement, identity, root=tmp_path) + + +def test_missing_native_scheduler_is_explicitly_incomplete(monkeypatch): + import qwen3_next_layers as runner + + def missing(_): + raise ModuleNotFoundError("native scheduler missing") + + monkeypatch.setattr(runner.importlib, "import_module", missing) + with pytest.raises(RuntimeError, match="native_scheduler_not_ready"): + runner.check_scheduler_ready() diff --git a/tests/test_qwen3_next_logprob_adapter.py b/tests/test_qwen3_next_logprob_adapter.py new file mode 100644 index 000000000..74236b7cd --- /dev/null +++ b/tests/test_qwen3_next_logprob_adapter.py @@ -0,0 +1,43 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +import pytest +import torch + +from rl_engine.integrations.qwen3_next_logprob import ( + calculate_log_probs_and_entropy, + qwen_logprob_contract, +) + + +def test_contract_pins_complete_tp4_vocab_and_original_dtype(): + for rank in range(4): + contract = qwen_logprob_contract( + torch.empty(2, 37984, dtype=torch.bfloat16), rank=rank, world_size=4 + ) + assert contract.sharding.vocab_shard_bounds[rank] == (rank * 37984, (rank + 1) * 37984) + assert contract.sharding.padded_vocab_size == 151936 + assert contract.sharding.cp_world_size == 1 + assert contract.dtype.value == "bf16" + + +@pytest.mark.parametrize( + "rank,world,width,dtype", + [ + (0, 1, 151936, torch.bfloat16), + (4, 4, 37984, torch.bfloat16), + (0, 4, 38016, torch.bfloat16), + (0, 4, 37984, torch.float16), + ], +) +def test_contract_rejects_profile_drift(rank, world, width, dtype): + with pytest.raises(ValueError): + qwen_logprob_contract(torch.empty(0, width, dtype=dtype), rank=rank, world_size=world) + + +def test_numerical_callback_has_no_fallback_for_mask_or_absent_group(): + logits, tokens = torch.empty(0, 37984), torch.empty(0, dtype=torch.long) + with pytest.raises(ValueError, match="top-p"): + calculate_log_probs_and_entropy(logits, tokens, None, log_prob_keep_mask=torch.empty(0)) + with pytest.raises(ValueError, match="explicit initialized"): + calculate_log_probs_and_entropy(logits, tokens, None) diff --git a/tests/test_qwen3_next_native_recompute.py b/tests/test_qwen3_next_native_recompute.py new file mode 100644 index 000000000..bde75df74 --- /dev/null +++ b/tests/test_qwen3_next_native_recompute.py @@ -0,0 +1,232 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +from pathlib import Path + +import pytest +import torch + +from rl_engine.integrations.qwen3_next_native_recompute import response_rows +from rl_engine.integrations.qwen3_next_subnode import SUBNODES, subnode_layout +from rl_engine.integrations.qwen3_next_vime_runtime import runtime_argv + + +@pytest.mark.parametrize("batch", [1, 4]) +def test_response_rows_start_at_last_prompt_and_do_not_consume_last_target(batch): + request = { + "prompt_tokens": [[1] * 8 for _ in range(batch)], + "consumed_input_tokens": [[1] * 23 for _ in range(batch)], + "prediction_positions": list(range(7, 23)), + } + hidden = torch.arange(batch * 23 * 2).reshape(batch * 23, 1, 2).to(torch.bfloat16) + selected = response_rows(hidden, request) + assert selected.dtype == torch.bfloat16 and selected.shape == (batch, 16, 2) + for index in range(batch): + assert torch.equal(selected[index], hidden[index * 23 + 7 : (index + 1) * 23, 0]) + with pytest.raises(ValueError, match="BF16"): + response_rows(hidden.float(), request) + request["prediction_positions"] = list(range(8, 24)) + with pytest.raises(ValueError, match="last target"): + response_rows(hidden, request) + + +def test_native_cli_has_full_model_vocabulary_topology_and_no_precision_override(): + argv = runtime_argv("/checkpoint", training=True) + for name, value in { + "num-layers": 48, + "tensor-model-parallel-size": 4, + "expert-tensor-parallel-size": 4, + "pipeline-model-parallel-size": 1, + "context-parallel-size": 1, + "padded-vocab-size": 151936, + }.items(): + assert argv[argv.index("--" + name) + 1] == str(value) + assert "--optimization-dtype" not in argv and "--reduce-dtype" not in argv + assert "--sequence-parallel" not in argv + assert "--use-rollout-logprobs" in argv + + +def test_recompute_batch_loads_once_and_keeps_verifiable_original_rank_traces( + tmp_path, monkeypatch +): + import copy + import hashlib + + from rl_engine.integrations import qwen3_next_native_recompute as recompute + from rl_engine.testing.qwen3_next_l2 import ( + load_tensor_artifact, + save_tensor_artifact, + validate_native_worker_traces, + ) + + request = { + "schema_version": 1, + "case_id": "cpu-contract-only", + "role": "recompute", + "identity": { + "provider_config": {"profile": "qwen3_next_tp4_shared_eager_v1"}, + "weight_version": "baseline", + }, + "request_sha256": "a" * 64, + "execution": {"recompute_mode": "full_from_tokens", "input_sequence_length": 23}, + "prompt_tokens": [[1] * 8], + "response_tokens": [[2] * 16], + "prediction_positions": list(range(7, 23)), + "sample_ids": [0], + "consumed_response_tokens": 15, + "state_position": 22, + "trace_layers": [], + } + second = {**request, "case_id": "second-cpu-case", "request_sha256": "b" * 64} + calls = [] + + def spawn(target, *, args, nprocs, join): + cases, staging = args + calls.append((target, nprocs, join)) + assert len(cases) == 2 + for index, (current, _output) in enumerate(cases): + for rank in range(4): + layers = {} + for layer in range(48): + names = ( + ("key", "value") + if (layer + 1) % 4 == 0 + else ("convolution", "recurrent_state") + ) + layers[layer] = { + "output": torch.zeros((1, 16, 2048), dtype=torch.bfloat16), + "subnodes": { + name: torch.zeros( + (1, 16, subnode_layout(name)[0]), dtype=subnode_layout(name)[1] + ) + for name in SUBNODES + }, + "states": { + name: torch.zeros( + (), + dtype=( + torch.float32 if name == "recurrent_state" else torch.bfloat16 + ), + ).expand( + { + "convolution": (1, 2048, 3), + "recurrent_state": (1, 8, 128, 128), + "key": (1, 1, 23, 256), + "value": (1, 1, 23, 256), + }[name] + ) + for name in names + }, + } + layers["model"] = {"embedding": torch.zeros((1, 16, 2048), dtype=torch.bfloat16)} + trace = { + "rank": rank, + "request_sha256": current["request_sha256"], + "role": "recompute", + "execution": current["execution"], + "provider_binary": { + "module": "rl_engine._C", + "path": "/cpu-test-only/_C.so", + "sha256": "c" * 64, + }, + "layers": layers, + "local_logits": torch.zeros((), dtype=torch.bfloat16).expand(1, 16, 37984), + "logprobs": torch.zeros((1, 16)), + "responses": torch.tensor(current["response_tokens"], dtype=torch.int64), + } + if rank == 0: + trace["logits"] = torch.zeros((), dtype=torch.bfloat16).expand(1, 16, 151936) + save_tensor_artifact(Path(staging) / f"case-{index}-rank-{rank}.pt", trace) + + monkeypatch.setattr(recompute.mp, "spawn", spawn) + outputs = [(request, tmp_path / "first.pt"), (second, tmp_path / "second.pt")] + recompute.run_recompute_cases(iter(outputs)) + assert calls == [(recompute._rank_main, 4, True)] + for current, path in outputs: + artifact = load_tensor_artifact(path) + assert len(artifact["worker_traces"]) == 4 + validate_native_worker_traces(artifact, current, artifact_root=tmp_path) + artifact = load_tensor_artifact(outputs[0][1]) + for record in artifact["worker_traces"]: + assert Path(record["path"]).is_file() + + missing_binary = copy.deepcopy(artifact) + missing_binary.pop("provider_binary") + with pytest.raises(ValueError, match="imported CUDA provider binary"): + validate_native_worker_traces(missing_binary, request, artifact_root=tmp_path) + + # Merely retaining files is insufficient: even after rehashing the record, + # original hidden/state/local-logit bytes must reproduce the declared result. + record = artifact["worker_traces"][1] + original = load_tensor_artifact(record["path"]) + for field, message in ( + ("state", "state bytes"), + ("hidden", "layer output"), + ("local_logits", "local_logits bytes"), + ("binary", "provenance mismatch"), + ("convolution_truncated", "complete convolution state shape"), + ("convolution_transposed", "complete convolution state shape"), + ("recurrent_truncated", "complete recurrent_state state shape"), + ("key_short", "complete key state shape"), + ("key_long", "complete key state shape"), + ("value_truncated", "complete value state shape"), + ): + trace = copy.deepcopy(original) + if field == "state": + value = trace["layers"][0]["states"]["recurrent_state"].clone() + value[0, 0, 0, 0] = -0.0 + trace["layers"][0]["states"]["recurrent_state"] = value + elif field == "convolution_truncated": + trace["layers"][0]["states"]["convolution"] = torch.zeros((1, 1), dtype=torch.bfloat16) + elif field == "convolution_transposed": + value = trace["layers"][0]["states"]["convolution"] + trace["layers"][0]["states"]["convolution"] = value.transpose(1, 2) + elif field == "recurrent_truncated": + value = trace["layers"][0]["states"]["recurrent_state"] + trace["layers"][0]["states"]["recurrent_state"] = value[:, :7] + elif field in ("key_short", "key_long"): + length = 22 if field == "key_short" else 24 + trace["layers"][3]["states"]["key"] = torch.zeros( + (1, 1, length, 256), dtype=torch.bfloat16 + ) + elif field == "value_truncated": + value = trace["layers"][3]["states"]["value"] + trace["layers"][3]["states"]["value"] = value[..., :255] + elif field == "hidden": + trace["layers"][0]["output"][0, 0, 0] = -0.0 + elif field == "binary": + trace["provider_binary"]["sha256"] = "d" * 64 + else: + trace["local_logits"] = trace["local_logits"].clone() + trace["local_logits"][0, 0, 0] = -0.0 + save_tensor_artifact(record["path"], trace) + with open(record["path"], "rb") as stream: + record["sha256"] = hashlib.file_digest(stream, "sha256").hexdigest() + with pytest.raises(ValueError, match=message): + validate_native_worker_traces(artifact, request, artifact_root=tmp_path) + if "complete " in message: + ranks = [load_tensor_artifact(item["path"]) for item in artifact["worker_traces"]] + with pytest.raises(ValueError, match=message): + recompute._assemble(request, ranks, artifact["worker_traces"]) + + +@pytest.mark.parametrize("batch", [1, 4]) +@pytest.mark.parametrize("prompt_length", [8, 64, 256, 1024]) +def test_complete_native_state_shapes_bind_every_consumed_token(batch, prompt_length): + from rl_engine.testing.qwen3_next_l2 import native_state_shapes + + request = { + "prompt_tokens": [[1] * prompt_length for _ in range(batch)], + "consumed_response_tokens": 15, + "state_position": prompt_length + 14, + } + assert native_state_shapes(request) == { + "convolution": (batch, 2048, 3), + "recurrent_state": (batch, 8, 128, 128), + "key": (batch, 1, prompt_length + 15, 256), + "value": (batch, 1, prompt_length + 15, 256), + } + with pytest.raises(ValueError, match="exactly 15 responses"): + native_state_shapes({**request, "state_position": prompt_length + 15}) + with pytest.raises(ValueError, match="exactly 15 responses"): + native_state_shapes({**request, "consumed_response_tokens": 16}) diff --git a/tests/test_qwen3_next_operator_gates.py b/tests/test_qwen3_next_operator_gates.py new file mode 100644 index 000000000..d991a7c43 --- /dev/null +++ b/tests/test_qwen3_next_operator_gates.py @@ -0,0 +1,50 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Runner failures cannot reuse stale evidence or promote diagnostics.""" + +import json +from types import SimpleNamespace + +import pytest + +from rl_engine.testing.qwen3_next_cases import execution_verdict +from scripts import qwen3_next_operator_gates as gates + +CASE = "tests/example.py::test_required" + + +@pytest.mark.parametrize("mode", ["passed", "missing", "forged", "exit_failed", "diagnostics"]) +def test_run_suite_requires_current_complete_evidence(tmp_path, monkeypatch, mode): + suite = "diagnostics" if mode == "diagnostics" else "core" + manifest = tmp_path / "manifest.json" + manifest.write_text(json.dumps({"schema_version": 1, "suites": {suite: [CASE]}})) + monkeypatch.setattr(gates, "MANIFEST", manifest) + monkeypatch.setattr(gates.importlib.metadata, "version", lambda _: "test-version") + monkeypatch.setattr(gates.subprocess, "check_output", lambda *args, **kwargs: "") + out = tmp_path / "output" + out.mkdir() + complete = execution_verdict( + [CASE], [CASE], {CASE: {"setup": "passed", "call": "passed", "teardown": "passed"}} + ) + # This must be removed before invoking pytest, even if pytest writes nothing. + (out / "case-results.json").write_text(json.dumps(complete)) + + def run(*args, **kwargs): + if mode != "missing": + report = dict(complete) + if mode == "forged": + report["outcomes"] = {} + (out / "case-results.json").write_text(json.dumps(report)) + return SimpleNamespace(returncode=1 if mode == "exit_failed" else 0) + + monkeypatch.setattr(gates.subprocess, "run", run) + result = gates.run_suite(out, suite) + if mode == "diagnostics": + assert result["status"] == "diagnostic_completed" + assert result["diagnostic_only"] is True + assert result["mandatory_case_ids"] == [] + else: + assert result["status"] == ("passed" if mode == "passed" else "failed") + assert result["mandatory_case_ids"] == [CASE] + assert result["full_model_l2"] == "not_evaluated" diff --git a/tests/test_qwen3_next_profile.py b/tests/test_qwen3_next_profile.py new file mode 100644 index 000000000..670c8e0b2 --- /dev/null +++ b/tests/test_qwen3_next_profile.py @@ -0,0 +1,149 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""A label or environment flag cannot certify the CUSTOM provider.""" + +import copy +import sys +from types import SimpleNamespace + +import pytest + +from rl_engine.integrations import qwen3_next_profile as profile + + +def test_qualification_never_advertises_batch_invariance(monkeypatch): + monkeypatch.setenv("VLLM_BATCH_INVARIANT", "0") + assert profile.activate_for_identity({}) == "qualification" + assert not profile.profile_is_certified() + + +@pytest.mark.parametrize("mode", ["1", "", "true"]) +def test_strict_flag_without_certificate_is_rejected(monkeypatch, mode): + monkeypatch.setenv("VLLM_BATCH_INVARIANT", mode) + with pytest.raises(ValueError, match="Uncertified"): + profile.activate_for_identity({}) + assert not profile.profile_is_certified() + + +def test_passed_label_without_matching_certificate_bytes_is_rejected(tmp_path, monkeypatch): + monkeypatch.setenv("VLLM_BATCH_INVARIANT", "1") + result = tmp_path / "result.json" + result.write_text('{"status": "passed"}') + identity = {"scheduler_profile_certificate": {"path": str(result), "sha256": "0" * 64}} + with pytest.raises(ValueError, match="content identity"): + profile.activate_for_identity(identity) + assert not profile.profile_is_certified() + + +@pytest.fixture +def updated_identity(): + certified = { + "checkpoint": "/official/revision", + "checkpoint_identity": {"revision": "official", "metadata": {"tokenizer": "pinned"}}, + "source_commit": "commit", + "source_tree": "tree", + "environment_sha256": "environment", + "provider_config": {"profile": "qwen3_next_tp4_shared_eager_v1"}, + "topology": {"tp": 4, "pp": 1, "cp": 1, "ep": 1}, + "weight_version": "baseline", + "architecture_layers": 48, + "weights_dtype": "bfloat16", + "recurrent_state_dtype": "float32", + } + record = { + "schema_version": 1, + "kind": "qwen3_next_native_hf_export", + "status": "complete", + "weight_version": "update1", + "step": 1, + "export_id": "unit-test-only", + "base_checkpoint": certified["checkpoint"], + "base_checkpoint_identity": certified["checkpoint_identity"], + "training_identity": copy.deepcopy(certified), + "architecture_layers": 48, + "weights_dtype": "bfloat16", + "weights_content_sha256": "new-weight-content", + } + identity = { + **copy.deepcopy(certified), + "weight_version": "update1", + "checkpoint": "/run/current-export", + "checkpoint_identity": record, + "base_checkpoint": certified["checkpoint"], + "base_checkpoint_identity": certified["checkpoint_identity"], + } + return identity, certified + + +def test_certificate_rehashes_actual_updated_export_not_old_base(updated_identity, monkeypatch): + identity, certified = updated_identity + calls = [] + + def check(path, expected): + calls.append((path, expected)) + return expected + + monkeypatch.setitem( + sys.modules, "qwen3_next_training_export", SimpleNamespace(validate_training_export=check) + ) + profile.validate_certified_weights(identity, certified) + assert calls == [(identity["checkpoint"], identity["checkpoint_identity"])] + assert calls[0][1] != certified["checkpoint_identity"] + assert not profile.profile_is_certified() # A JSON-boundary unit check cannot activate BI. + + +@pytest.mark.parametrize( + "field", ["base_checkpoint", "base_checkpoint_identity", "weight_version", "source_tree"] +) +def test_updated_identity_cannot_rebind_base_version_or_source(updated_identity, field): + identity, certified = updated_identity + identity[field] = "changed" + with pytest.raises(ValueError): + profile.validate_certified_weights(identity, certified) + + +def test_changed_actual_export_bytes_are_rejected(updated_identity, monkeypatch): + identity, certified = updated_identity + monkeypatch.setitem( + sys.modules, + "qwen3_next_training_export", + SimpleNamespace( + validate_training_export=lambda path, expected: { + **expected, + "weights_content_sha256": "different", + }, + ), + ) + with pytest.raises(ValueError, match="Actual updated weight files"): + profile.validate_certified_weights(identity, certified) + + +def test_updated_export_cannot_be_labeled_as_baseline(updated_identity): + identity, certified = updated_identity + identity["weight_version"] = "baseline" + with pytest.raises(ValueError, match="masquerade"): + profile.validate_certified_weights(identity, certified) + + +def test_historical_export_identity_checks_do_not_open_deleted_shards(updated_identity): + from rl_engine.testing.qwen3_next_l2 import validate_weight_identity + + identity, _ = updated_identity + validate_weight_identity(identity) + # No export files exist in this unit test; this verifies structural history + # only. Actual profile activation always invokes the deep file validator. + + +def test_updated_model_identity_carries_actual_and_base_checkpoint(updated_identity): + from qwen3_next_l2 import model_identity + + identity, _ = updated_identity + model = model_identity(identity) + assert model["checkpoint"] == "/run/current-export" + assert model["checkpoint_identity"]["weights_content_sha256"] == "new-weight-content" + assert model["base_checkpoint"] == "/official/revision" + assert model["base_checkpoint_identity"] == { + "revision": "official", + "metadata": {"tokenizer": "pinned"}, + } diff --git a/tests/test_qwen3_next_rl_fixture.py b/tests/test_qwen3_next_rl_fixture.py new file mode 100644 index 000000000..c33578f1f --- /dev/null +++ b/tests/test_qwen3_next_rl_fixture.py @@ -0,0 +1,58 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +from argparse import Namespace + +import pytest +import torch + +from rl_engine.testing.qwen3_next_rl_fixture import ( + OPTIMIZER_SETTINGS, + POLICY_SETTINGS, + PolicyFixture, + require_policy_configuration, +) + + +def fixture(): + return PolicyFixture.freeze( + torch.arange(320).reshape(4, 80), + torch.full((4, 16), -3.0), + baseline_identity="test-baseline", + ) + + +def test_policy_fixture_preserves_old_policy_and_native_loss_fields(): + value = fixture() + batch = value.batch([2], device="cpu") + assert batch["partition"] == [2] + assert batch["total_lengths"] == [80] + assert batch["response_lengths"] == [16] + assert torch.equal(batch["advantages"][0], torch.full((16,), 0.75)) + value.verify_initial_recompute(torch.full((4, 16), -3.0)) + with pytest.raises(AssertionError): + value.verify_initial_recompute(torch.full((4, 16), -3.01)) + + +def test_policy_fixture_rejects_mutation_and_unfrozen_baseline(): + value = fixture() + value.old_logprobs[0, 0] = -4 + with pytest.raises(ValueError, match="modified"): + value.batch([0], device="cpu") + with pytest.raises(ValueError, match="frozen"): + PolicyFixture.freeze( + torch.arange(320).reshape(4, 80), + torch.zeros(4, 16, requires_grad=True), + baseline_identity="run", + ) + + +@pytest.mark.parametrize( + "changed", ["loss_type", "use_rollout_logprobs", "use_stateless_adam", "optimizer_cpu_offload"] +) +def test_policy_configuration_cannot_fall_back_or_substitute_optimizer(changed): + settings = {**POLICY_SETTINGS, **OPTIMIZER_SETTINGS} + require_policy_configuration(Namespace(**settings)) + settings[changed] = "unexpected" + with pytest.raises(ValueError, match=changed): + require_policy_configuration(Namespace(**settings)) diff --git a/tests/test_qwen3_next_rotary_dtype.py b/tests/test_qwen3_next_rotary_dtype.py new file mode 100644 index 000000000..4a9848ed4 --- /dev/null +++ b/tests/test_qwen3_next_rotary_dtype.py @@ -0,0 +1,58 @@ +# SPDX-License-Identifier: Apache-2.0 +"""The rotary tables must not depend on how the owning module was cast.""" + +from types import SimpleNamespace + +import torch + +from rl_engine.integrations.qwen3_next_tp_blocks import TP4FullAttention + + +def _reference_rotate(value, positions, rope_theta=10000000.0): + inv_freq = 1.0 / (rope_theta ** (torch.arange(0, 64, 2, dtype=torch.float32) / 64)) + angles = positions.float()[:, None] * inv_freq[None, :] + angles = torch.cat((angles, angles), dim=-1) + cos, sin = angles.cos().to(value.dtype)[:, None], angles.sin().to(value.dtype)[:, None] + rotary, tail = value[..., :64], value[..., 64:] + rotated = torch.cat((-rotary[..., 32:], rotary[..., :32]), dim=-1) + return torch.cat((rotary * cos + rotated * sin, tail), dim=-1) + + +def test_inverse_frequencies_are_fp32_and_exact_at_dim_zero(): + inv_freq = TP4FullAttention.inverse_frequencies(10000000.0, torch.device("cpu")) + assert inv_freq.dtype == torch.float32 and inv_freq.shape == (32,) + assert inv_freq[0].item() == 1.0 + assert torch.equal( + inv_freq, 1.0 / (10000000.0 ** (torch.arange(0, 64, 2, dtype=torch.float32) / 64)) + ) + + +def test_rotate_matches_fp32_reference_for_any_module_dtype(): + generator = torch.Generator().manual_seed(7) + value = (torch.randn((23, 1, 256), generator=generator) * 1.5).to(torch.bfloat16) + positions = torch.arange(23) + module = SimpleNamespace(rope_theta=10000000.0) + actual = TP4FullAttention._rotate(module, value, positions) + assert torch.equal(actual, _reference_rotate(value, positions)) + + +def test_bf16_rounded_frequencies_would_change_rotated_keys(): + """A BF16-cast rotary table flips rotated dims 1..~47 at positions >= 1; keep it FP32.""" + generator = torch.Generator().manual_seed(8) + value = (torch.randn((23, 1, 256), generator=generator) * 1.5).to(torch.bfloat16) + positions = torch.arange(23) + exact = _reference_rotate(value, positions) + rounded_theta = SimpleNamespace(rope_theta=10000000.0) + inv_freq = TP4FullAttention.inverse_frequencies(rounded_theta.rope_theta, value.device) + rounded = inv_freq.to(torch.bfloat16).float() + angles = positions.float()[:, None] * rounded[None, :] + angles = torch.cat((angles, angles), dim=-1) + cos, sin = angles.cos().to(value.dtype)[:, None], angles.sin().to(value.dtype)[:, None] + rotary, tail = value[..., :64], value[..., 64:] + rotated = torch.cat((-rotary[..., 32:], rotary[..., :32]), dim=-1) + with_rounded = torch.cat((rotary * cos + rotated * sin, tail), dim=-1) + differing = (with_rounded != exact)[:, 0] + assert differing.any() + assert not differing[0].any() # position 0 has angle 0 + assert not differing[:, 64:].any() # the unrotated tail is untouched + assert not differing[:, 0].any() and not differing[:, 32].any() # dim 0 is exact in BF16 diff --git a/tests/test_qwen3_next_run.py b/tests/test_qwen3_next_run.py new file mode 100644 index 000000000..6a3fd3e82 --- /dev/null +++ b/tests/test_qwen3_next_run.py @@ -0,0 +1,118 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""The scheduler-independent Qwen3-Next chain launcher.""" + +import json +import sys +from pathlib import Path + +import pytest + +sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "scripts")) + +import qwen3_next_run as run # noqa: E402 + + +def manifest(tmp_path, stage="layers", script=None): + source = tmp_path / "source" + (source / "scripts").mkdir(parents=True, exist_ok=True) + if script is not None: + (source / run.STAGES[stage][3]).write_text(script) + return { + "run_id": "r", + "execution_id": "e" * 32, + "stage": stage, + "source": str(source), + "source_tree": "tree", + "python": sys.executable, + "cuda_home": str(tmp_path), + "cuda_identity": {"nvcc_sha256": "nvcc"}, + "memory": "512G", + "environment": {"identity": {"base_prefix": sys.prefix, "build_tools": {"ninja": "1"}}}, + "provider_config": {"runtime_env": {"TRITON_F32_DEFAULT": "ieee"}}, + "scheduler_profile_certificate": {"path": "/certificate"}, + } + + +@pytest.fixture +def frozen(monkeypatch): + monkeypatch.setattr(run, "verify_environment", lambda *args, **kwargs: None) + monkeypatch.setattr(run, "file_digest", lambda path: "nvcc") + monkeypatch.setattr(run, "_git", lambda *args, cwd=None: "tree" if "rev-parse" in args else "") + + +def test_prepare_refuses_a_dirty_tree(monkeypatch, tmp_path): + monkeypatch.setattr(run, "_git", lambda *args, cwd=None: " M scripts/qwen3_next_run.py") + with pytest.raises(SystemExit, match="Commit the source"): + run.prepare("preflight", None, None) + + +@pytest.mark.parametrize( + "stage,bi", [("preflight", "0"), ("layers", "0"), ("l2", "1"), ("train", "1")] +) +def test_stage_environment_pins_batch_invariance_and_the_declared_memory(tmp_path, stage, bi): + env = run.stage_environment(manifest(tmp_path, stage), tmp_path, "0") + assert env["VLLM_BATCH_INVARIANT"] == bi + assert env["QWEN3_NEXT_ALLOCATED_MEMORY"] == "512G" + assert env["QWEN3_NEXT_ATTEMPT"] == "0" + assert env["TRITON_F32_DEFAULT"] == "ieee" + assert env["PYTHONPATH"].endswith("source") + assert ("QWEN_SHARED_PROFILE_RESULT" in env) == (bi == "1") + + +def test_execute_validates_and_publishes_a_passed_result(tmp_path, frozen, monkeypatch): + script = ( + "import json, sys\n" + "out = sys.argv[sys.argv.index('--output') + 1]\n" + "json.dump({'status': 'passed', 'attempt': '0'}, open(out + '/result.json', 'w'))\n" + ) + current = manifest(tmp_path, script=script) + seen = [] + monkeypatch.setattr(run, "validate_result", lambda *args, **kwargs: seen.append(args)) + status = run.execute(tmp_path, current) + assert status["status"] == "passed" and len(seen) == 1 + assert json.loads((tmp_path / "result.json").read_text())["status"] == "passed" + assert not (tmp_path / "RUNNING").exists() + + +def test_execute_keeps_the_stage_failure_kind(tmp_path, frozen): + script = ( + "import json, sys\n" + "out = sys.argv[sys.argv.index('--output') + 1]\n" + "json.dump({'failure_kind': 'insufficient_disk', 'error': 'full'}," + " open(out + '/result.json', 'w'))\n" + "sys.exit(3)\n" + ) + status = run.execute(tmp_path, manifest(tmp_path, script=script)) + assert status["status"] == "failed" and status["exit_code"] == 3 + assert status["failure_kind"] == "insufficient_disk" + assert not (tmp_path / "result.json").exists() + assert not (tmp_path / "RUNNING").exists() + + +def test_execute_refuses_a_changed_source(tmp_path, monkeypatch, frozen): + monkeypatch.setattr(run, "_git", lambda *args, cwd=None: "other-tree") + with pytest.raises(RuntimeError, match="source_mismatch"): + run.execute(tmp_path, manifest(tmp_path, script="raise SystemExit(0)\n")) + + +@pytest.mark.parametrize( + "arguments,message", + [ + (["--stage", "all", "--from", "layers"], "needs --previous"), + (["--stage", "l2"], "needs --previous"), + (["--stage", "preflight", "--previous", "."], "needs --previous"), + (["--stage", "all", "--from", "train", "--until", "l2", "--previous", "."], "--from"), + ], +) +def test_stage_selection_requires_a_predecessor_exactly_after_preflight( + monkeypatch, tmp_path, arguments, message +): + monkeypatch.setattr( + sys, + "argv", + ["run", "--runs-root", str(tmp_path), "--checkpoint", ".", "--cuda-home", ".", *arguments], + ) + with pytest.raises(SystemExit, match=message): + run.main() diff --git a/tests/test_qwen3_next_storage.py b/tests/test_qwen3_next_storage.py new file mode 100644 index 000000000..024453a43 --- /dev/null +++ b/tests/test_qwen3_next_storage.py @@ -0,0 +1,334 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Faults at persistent filesystem boundaries, including an actual SIGKILL.""" + +import json +import os +import signal +import subprocess +import sys +from pathlib import Path + +import pytest + +sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "scripts")) +import qwen3_next_runtime as storage # noqa: E402 +from qwen3_next_checkpoint import ( # noqa: E402 + newest_complete_checkpoint, + publish_checkpoint, + validate_checkpoint, + write_rank_manifest, +) + +IDENTITY = {"run_id": "storage-fault-test"} + + +class Preempted(BaseException): + pass + + +def fail_at(monkeypatch, boundary): + def crash(name): + if name == boundary: + raise Preempted(name) + + monkeypatch.setattr(storage, "_boundary", crash) + + +def metadata(): + return {"identity": IDENTITY, "status": "staging", "step": 1} + + +def complete(root, name="step-2", step=2): + staging, destination = storage.create_staging(root, name, metadata()) + for rank in range(4): + files = {} + for role in ("model", "optimizer", "rng", "progress"): + relative = f"rank-{rank}-{role}.bin" + (staging / relative).write_bytes(f"{rank}:{role}".encode()) + files[role] = [relative] + write_rank_manifest( + staging, + rank=rank, + world_size=4, + identity=IDENTITY, + step=step, + sample_position=step * 4, + files=files, + ) + marker = publish_checkpoint(staging, destination, world_size=4, identity=IDENTITY) + return destination, marker + + +@pytest.mark.parametrize("boundary", ["root_owner_persisted", "root_created"]) +def test_root_creation_recovers_without_internal_owner(monkeypatch, tmp_path, boundary): + root = tmp_path / "checkpoints" + fail_at(monkeypatch, boundary) + with pytest.raises(Preempted): + storage.owned_root(root, IDENTITY) + monkeypatch.setattr(storage, "_boundary", lambda name: None) + storage.owned_root(root, IDENTITY) + assert json.loads((root / "RUN_OWNER.json").read_text()) == IDENTITY + storage.recover_storage(root, IDENTITY) + + +@pytest.mark.parametrize( + "boundary", ["staging_intent_persisted", "staging_created", "staging_marker_persisted"] +) +def test_staging_creation_recovers_every_window_without_loading_partial( + monkeypatch, tmp_path, boundary +): + root = storage.owned_root(tmp_path / "checkpoints", IDENTITY) + retained, marker = complete(root) + fail_at(monkeypatch, boundary) + with pytest.raises(Preempted): + storage.create_staging(root, "next-step", metadata()) + monkeypatch.setattr(storage, "_boundary", lambda name: None) + with pytest.raises((ValueError, FileNotFoundError)): + validate_checkpoint(root / "next-step.partial", IDENTITY) + storage.recover_storage(root, IDENTITY) + assert not (root / "next-step.partial").exists() + assert validate_checkpoint(retained, IDENTITY) == marker + assert newest_complete_checkpoint(root, IDENTITY)["checkpoint"] == str(retained) + assert storage.recover_storage(root, IDENTITY) == [] + + +@pytest.mark.parametrize( + "boundary", + [ + "retirement_intent_persisted", + "retirement_renamed", + "retirement_removed", + "retirement_committed", + ], +) +def test_retirement_resumes_each_window_and_preserves_successor(monkeypatch, tmp_path, boundary): + root = storage.owned_root(tmp_path / "checkpoints", IDENTITY) + prior, old_marker = complete(root, "step-1", 1) + retained, marker = complete(root) + proof = {"complete": old_marker, "successor": str(retained), "successor_complete": marker} + fail_at(monkeypatch, boundary) + with pytest.raises(Preempted): + storage.retire_directory(prior, root, IDENTITY, proof=proof) + monkeypatch.setattr(storage, "_boundary", lambda name: None) + with pytest.raises(ValueError, match="Unpublished"): + validate_checkpoint(root / ".step-1.deleting", IDENTITY) + storage.recover_storage(root, IDENTITY) + assert not prior.exists() and not (root / ".step-1.deleting").exists() + assert validate_checkpoint(retained, IDENTITY) == marker + assert storage.recover_storage(root, IDENTITY) == [] + + +def test_preemption_after_internal_marker_deleted_does_not_strand_cleanup(monkeypatch, tmp_path): + root = storage.owned_root(tmp_path / "exports", IDENTITY) + stage, _ = storage.create_staging(root, "update-1", metadata()) + (stage / "unfinished-weights").write_bytes(b"never load this") + remove = storage.shutil.rmtree + + def interrupted(path): + (path / "STAGING.json").unlink() + raise Preempted("during rmtree") + + monkeypatch.setattr(storage.shutil, "rmtree", interrupted) + with pytest.raises(Preempted): + storage.recover_storage(root, IDENTITY) + assert not stage.exists() + assert (root / ".update-1.partial.deleting" / "unfinished-weights").is_file() + monkeypatch.setattr(storage.shutil, "rmtree", remove) + storage.recover_storage(root, IDENTITY) + assert not (root / ".update-1.partial.deleting").exists() + + +def test_pending_retirement_rechecks_successor_before_deleting_last_good_state( + monkeypatch, tmp_path +): + root = storage.owned_root(tmp_path / "checkpoints", IDENTITY) + prior, marker = complete(root, "step-1", 1) + successor, next_marker = complete(root) + fail_at(monkeypatch, "retirement_intent_persisted") + with pytest.raises(Preempted): + storage.retire_directory( + prior, + root, + IDENTITY, + proof={ + "complete": marker, + "successor": str(successor), + "successor_complete": next_marker, + }, + ) + monkeypatch.setattr(storage, "_boundary", lambda name: None) + (successor / "rank-0-model.bin").write_bytes(b"corrupt") + with pytest.raises(ValueError, match="checksum|size mismatch"): + storage.recover_storage(root, IDENTITY) + assert validate_checkpoint(prior, IDENTITY) == marker + + +@pytest.mark.parametrize("foreign", ["missing_owner", "wrong_owner", "symlink"]) +def test_unrelated_partial_directories_are_never_deleted(tmp_path, foreign): + root = storage.owned_root(tmp_path / "exports", IDENTITY) + target = root / "unrelated.partial" + if foreign == "symlink": + outside = tmp_path / "outside" + outside.mkdir() + (outside / "STAGING.json").write_text(json.dumps(metadata())) + target.symlink_to(outside, target_is_directory=True) + else: + target.mkdir() + if foreign == "wrong_owner": + (target / "STAGING.json").write_text( + json.dumps({"status": "staging", "identity": {"run_id": "other"}}) + ) + with pytest.raises(ValueError): + storage.recover_storage(root, IDENTITY) + assert target.exists() + + +def test_real_sigkill_between_mkdir_and_internal_marker_is_recoverable(tmp_path): + root = tmp_path / "exports" + script = """ +import os, signal, sys +import qwen3_next_runtime as storage +identity = {'run_id': 'storage-fault-test'} +root = storage.owned_root(sys.argv[1], identity) +def stop(name): + if name == 'staging_created': + os.kill(os.getpid(), signal.SIGKILL) +storage._boundary = stop +storage.create_staging( + root, 'crashed-export', {'identity': identity, 'status': 'staging', 'step': 1} +) +""" + environment = {**os.environ, "PYTHONPATH": str(Path(storage.__file__).parent)} + child = subprocess.run([sys.executable, "-c", script, str(root)], env=environment, timeout=30) + assert child.returncode == -signal.SIGKILL + assert (root / "crashed-export.partial").is_dir() + assert not (root / "crashed-export.partial" / "STAGING.json").exists() + storage.owned_root(root, IDENTITY) + storage.recover_storage(root, IDENTITY) + assert not (root / "crashed-export.partial").exists() + + +@pytest.mark.parametrize("changed", ["identity", "target", "filename", "published", "status"]) +def test_malformed_parent_staging_intent_never_deletes_its_target(tmp_path, changed): + root = storage.owned_root(tmp_path / "exports", IDENTITY) + staging, _ = storage.create_staging(root, "unfinished", metadata()) + intent = root / ".unfinished.staging.json" + record = json.loads(intent.read_text()) + if changed == "identity": + record["identity"] = {"run_id": "another"} + elif changed == "target": + record["staging"] = "../outside.partial" + elif changed == "filename": + intent.rename(root / ".wrong-name.staging.json") + intent = root / ".wrong-name.staging.json" + elif changed == "published": + record["published"] = ".unfinished" + record["staging"] = ".unfinished.partial" + else: + record["metadata"]["status"] = "complete" + intent.write_text(json.dumps(record)) + with pytest.raises(ValueError): + storage.recover_storage(root, IDENTITY) + assert staging.is_dir() + + +def test_replaced_target_marker_stops_pending_retirement(monkeypatch, tmp_path): + root = storage.owned_root(tmp_path / "checkpoints", IDENTITY) + prior, previous = complete(root, "step-1", 1) + successor, current = complete(root) + fail_at(monkeypatch, "retirement_intent_persisted") + with pytest.raises(Preempted): + storage.retire_directory( + prior, + root, + IDENTITY, + proof={ + "complete": previous, + "successor": str(successor), + "successor_complete": current, + }, + ) + monkeypatch.setattr(storage, "_boundary", lambda name: None) + (prior / "COMPLETE.json").write_text(json.dumps({**previous, "step": 99})) + with pytest.raises(ValueError, match="differs from its durable ownership"): + storage.recover_storage(root, IDENTITY) + assert prior.is_dir() + + +@pytest.mark.parametrize("proof", [{}, {"status": "staging", "identity": IDENTITY}]) +def test_unsupported_proof_cannot_retire_unrelated_published_directory(tmp_path, proof): + root = storage.owned_root(tmp_path / "checkpoints", IDENTITY) + unrelated = root / "unrelated" + unrelated.mkdir() + with pytest.raises(ValueError): + storage.retire_directory(unrelated, root, IDENTITY, proof=proof) + assert unrelated.is_dir() + assert not (root / ".unrelated.delete.json").exists() + + +@pytest.mark.parametrize("record_name", ["parent_owner", "root_owner", "intent", "marker"]) +def test_interrupted_atomic_creation_record_does_not_strand_recovery( + monkeypatch, tmp_path, record_name +): + root = tmp_path / "exports" + atomic = storage.atomic_json + targets = { + "parent_owner": root.parent / ".exports.owner.json", + "root_owner": root / "RUN_OWNER.json", + "intent": root / ".unfinished.staging.json", + "marker": root / "unfinished.partial" / "STAGING.json", + } + + def interrupted(path, value): + if path == targets[record_name]: + path.with_suffix(path.suffix + ".partial").write_text('{"interrupted":') + raise Preempted("during atomic record write") + atomic(path, value) + + monkeypatch.setattr(storage, "atomic_json", interrupted) + with pytest.raises(Preempted): + storage.owned_root(root, IDENTITY) + storage.create_staging(root, "unfinished", metadata()) + monkeypatch.setattr(storage, "atomic_json", atomic) + storage.owned_root(root, IDENTITY) + storage.recover_storage(root, IDENTITY) + assert not (root / "unfinished.partial").exists() + assert storage.recover_storage(root, IDENTITY) == [] + + +@pytest.mark.parametrize("status", ["retiring", "retired"]) +def test_interrupted_atomic_retirement_record_is_recoverable(monkeypatch, tmp_path, status): + root = storage.owned_root(tmp_path / "exports", IDENTITY) + staging, _ = storage.create_staging(root, "unfinished", metadata()) + atomic = storage.atomic_json + + def interrupted(path, value): + if path.name.endswith(".delete.json") and value["status"] == status: + path.with_suffix(path.suffix + ".partial").write_text('{"interrupted":') + raise Preempted("during atomic retirement record") + atomic(path, value) + + monkeypatch.setattr(storage, "atomic_json", interrupted) + with pytest.raises(Preempted): + storage.recover_storage(root, IDENTITY) + monkeypatch.setattr(storage, "atomic_json", atomic) + storage.recover_storage(root, IDENTITY) + assert not staging.exists() + assert not (root / ".unfinished.partial.deleting").exists() + assert storage.recover_storage(root, IDENTITY) == [] + + +@pytest.mark.parametrize("name", ["foo.a", "foo.b", "foo.partial", ".hidden"]) +def test_published_names_cannot_alias_one_staging_directory(tmp_path, name): + root = storage.owned_root(tmp_path / "exports", IDENTITY) + with pytest.raises(ValueError, match="visible and have no suffix"): + storage.create_staging(root, name, metadata()) + assert list(root.iterdir()) == [root / "RUN_OWNER.json"] + + +def test_training_storage_root_is_the_declared_root_or_inside_the_run(tmp_path): + assert storage.training_storage_root({}, tmp_path) == tmp_path / "training-state" + shared = tmp_path / "shared" / "run-1" + assert storage.training_storage_root({"training_storage": str(shared)}, tmp_path) == shared diff --git a/tests/test_qwen3_next_subnode.py b/tests/test_qwen3_next_subnode.py new file mode 100644 index 000000000..672d18717 --- /dev/null +++ b/tests/test_qwen3_next_subnode.py @@ -0,0 +1,52 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""The sub-node recorder used for first-drift localisation inside a decoder layer.""" + +from types import SimpleNamespace + +import pytest +import torch + +from rl_engine.integrations import qwen3_next_subnode as subnode + + +def test_buffer_requires_each_sub_node_once_with_its_original_storage(): + buffer = subnode.SubnodeBuffer(batch=2) + row = torch.arange(2048, dtype=torch.float32).to(torch.bfloat16) + buffer.put(3, "mixer", 1, 15, row) + assert torch.equal(buffer.values["mixer"][3, 1, 15], row) + with pytest.raises(ValueError, match="twice"): + buffer.put(3, "mixer", 1, 15, row) + with pytest.raises(ValueError, match="int64"): + buffer.put(3, "router", 1, 15, torch.zeros(10, dtype=torch.int32)) + with pytest.raises(ValueError, match="bfloat16"): + buffer.put(4, "mlp", 0, 0, row.float()) + with pytest.raises(ValueError, match="not all observed"): + buffer.layer(3) + with pytest.raises(ValueError, match="Unknown"): + subnode.subnode_layout("gate") + + +def test_complete_layer_and_embedding_are_returned_in_order(): + buffer = subnode.SubnodeBuffer(batch=1) + for name in subnode.SUBNODES: + width, dtype = subnode.subnode_layout(name) + buffer.put_rows(0, name, torch.zeros(1, 16, width, dtype=dtype)) + assert tuple(buffer.layer(0)) == subnode.SUBNODES + with pytest.raises(ValueError, match="every response position"): + buffer.embedding_rows() + for response in range(16): + buffer.put_embedding(0, response, torch.zeros(2048, dtype=torch.bfloat16)) + assert buffer.embedding_rows().shape == (1, 16, 2048) + + +def test_install_binds_the_layer_index_and_remove_clears_every_hook(): + layers = [SimpleNamespace(mlp=SimpleNamespace()) for _ in range(3)] + seen = [] + subnode.install(layers, subnode.vllm_modules, lambda *args: seen.append(args)) + layers[2].subnode_hook("mixer", "rows") + layers[1].mlp.subnode_hook("router", "ids") + assert seen == [(2, "mixer", "rows"), (1, "router", "ids")] + subnode.remove(layers, subnode.vllm_modules) + assert all(layer.subnode_hook is None and layer.mlp.subnode_hook is None for layer in layers) diff --git a/tests/test_qwen3_next_training_audit.py b/tests/test_qwen3_next_training_audit.py new file mode 100644 index 000000000..b08508fa6 --- /dev/null +++ b/tests/test_qwen3_next_training_audit.py @@ -0,0 +1,137 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""CPU regression of observations; these are not native model training acceptance.""" + +import random + +import numpy as np +import pytest +import torch + +from rl_engine.integrations.qwen3_next_training import ( + capture_rng_state, + gradient_evidence, + observe_native_optimizer_step, + restore_rng_state, + state_digest, + tensor_digest, +) + + +def test_state_identity_preserves_bits_dtype_structure_and_key_order(): + assert tensor_digest(torch.tensor(0.0)) != tensor_digest(torch.tensor(-0.0)) + assert tensor_digest(torch.ones(2)) != tensor_digest(torch.ones(2, dtype=torch.bfloat16)) + assert state_digest({"a": [1], "b": 2}) == state_digest({"b": 2, "a": [1]}) + assert state_digest([1, 2]) != state_digest((1, 2)) + assert state_digest({1: "a"}) != state_digest({"1": "a"}) + value = torch.arange(12).reshape(3, 4).T + assert tensor_digest(value, chunk_bytes=3) == tensor_digest(value.contiguous()) + + +@pytest.mark.parametrize("value", [torch.tensor(float("nan")), float("inf"), object()]) +def test_state_identity_rejects_unknown_or_nonfinite_state(value): + with pytest.raises((ValueError, TypeError)): + state_digest(value) + + +def test_rng_restores_python_numpy_torch_exactly(): + state = capture_rng_state() + first = (random.random(), np.random.random(), torch.rand(4)) + restore_rng_state(state) + second = (random.random(), np.random.random(), torch.rand(4)) + assert first[:2] == second[:2] + assert torch.equal(first[2], second[2]) + + +def test_gradients_observe_main_grad_and_allow_inactive_expert(): + active, inactive = torch.nn.Parameter(torch.ones(2)), torch.nn.Parameter(torch.ones(2)) + active.main_grad = torch.ones(2) + inactive.grad = torch.zeros(2) + evidence = gradient_evidence( + {"layer.router": active, "layer.expert42": inactive}, + required_groups={"routing": ["router"]}, + ) + assert evidence["active_groups"] == {"routing": ["layer.router"]} + assert not evidence["parameters"]["layer.expert42"]["nonzero"] + with pytest.raises(ValueError, match="Active paths"): + gradient_evidence({"expert": inactive}, required_groups={"experts": ["expert"]}) + inactive.grad[0] = float("nan") + with pytest.raises(ValueError, match="nonfinite"): + gradient_evidence({"expert": inactive}, required_groups={"experts": ["expert"]}) + + +class _Optimizer: + """Test double only: exercise observer timing and cleanup, never acceptance.""" + + def __init__(self, parameter, change=True): + self.parameter, self.change = parameter, change + + def step(self): + if self.change: + with torch.no_grad(): + self.parameter.add_(1) + self.parameter.grad = None + return True, 1.0, 0 + + +def test_observer_captures_before_native_clear_and_restores_method(): + model = torch.nn.Linear(2, 1, bias=False) + model.weight.grad = torch.ones_like(model.weight) + optimizer, evidence = _Optimizer(model.weight), {} + with observe_native_optimizer_step( + optimizer, [model], required_groups={"output": ["weight"]}, evidence=evidence + ): + optimizer.step() + assert model.weight.grad is None + assert "step" not in vars(optimizer) + assert evidence["changed_parameters"] == ["chunk0.weight"] + assert evidence["gradients"]["parameters"]["chunk0.weight"]["nonzero"] + + +@pytest.mark.parametrize("mode", ["no_call", "no_change", "double_call"]) +def test_observer_rejects_incomplete_or_fake_update(mode): + model = torch.nn.Linear(2, 1, bias=False) + model.weight.grad = torch.ones_like(model.weight) + optimizer = _Optimizer(model.weight, change=mode != "no_change") + with pytest.raises(ValueError): + with observe_native_optimizer_step( + optimizer, [model], required_groups={"output": ["weight"]}, evidence={} + ): + if mode != "no_call": + optimizer.step() + if mode == "double_call": + optimizer.step() + assert "step" not in vars(optimizer) + + +def test_gradient_nonzero_is_judged_across_tensor_parallel_ranks(): + """A vocab-parallel shard with no tokens is all-zero locally yet trains as a whole.""" + embedding, router = torch.nn.Parameter(torch.ones(4, 2)), torch.nn.Parameter(torch.ones(2)) + embedding.main_grad = torch.zeros(4, 2) + router.main_grad = torch.ones(2) + groups = {"embedding": ["embedding"], "router": ["router"]} + + def other_rank_saw_tokens(flags): + return [True for _ in flags] + + evidence = gradient_evidence( + {"chunk0.embedding.word_embeddings.weight": embedding, "layer.router": router}, + required_groups=groups, + reduce_flags=other_rank_saw_tokens, + ) + record = evidence["parameters"]["chunk0.embedding.word_embeddings.weight"] + assert record["nonzero"] is True and record["nonzero_local"] is False + assert evidence["active_groups"]["embedding"] == ["chunk0.embedding.word_embeddings.weight"] + with pytest.raises(ValueError, match="Active paths.*embedding"): + gradient_evidence( + {"chunk0.embedding.word_embeddings.weight": embedding, "layer.router": router}, + required_groups=groups, + reduce_flags=lambda flags: list(flags), + ) + with pytest.raises(ValueError, match="one per parameter"): + gradient_evidence( + {"layer.router": router}, + required_groups={"router": ["router"]}, + reduce_flags=lambda flags: [], + ) diff --git a/tests/test_qwen3_next_training_checkpoint.py b/tests/test_qwen3_next_training_checkpoint.py new file mode 100644 index 000000000..884b4e42a --- /dev/null +++ b/tests/test_qwen3_next_training_checkpoint.py @@ -0,0 +1,539 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""CPU serialization/protocol regressions; these do not certify native GPU training.""" + +import json +import random +import sys +from datetime import timedelta +from pathlib import Path +from types import SimpleNamespace + +import numpy as np +import pytest +import torch +import torch.distributed as dist +import torch.multiprocessing as mp + +sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "scripts")) +import qwen3_next_optimizer_checkpoint as optimizer_checkpoint # noqa: E402 +import qwen3_next_training_checkpoint as checkpoint # noqa: E402 +from qwen3_next_checkpoint import publish_checkpoint # noqa: E402 + +from rl_engine.integrations.qwen3_next_training import capture_rng_state, state_digest # noqa: E402 +from rl_engine.testing.qwen3_next_rl_fixture import PolicyFixture # noqa: E402 + +IDENTITY = {"source": "pinned", "provider": "strict", "checkpoint": "official", "tp": 4} + + +class ProtocolModel(torch.nn.Module): + def __init__(self): + super().__init__() + self.weight = torch.nn.Parameter(torch.arange(8, dtype=torch.bfloat16).reshape(2, 4)) + self.register_buffer("counter", torch.tensor(12, dtype=torch.int64)) + + def state_dict_for_save_checkpoint(self): + return self.state_dict() + + +class ProtocolOptimizer: + """Tiny CPU stand-in only for exercising serialization and corruption paths.""" + + def __init__(self, model): + self.model = model + self.calls = [] + self.model_param_group_index_map = {model.weight: (0, 0)} + self.gbuf_ranges = [ + { + (torch.bfloat16, torch.float32): [ + { + "param_map": { + model.weight: { + "param": SimpleNamespace(start=0, end=8), + "gbuf_local": SimpleNamespace(start=0, end=8), + } + } + } + ] + } + ] + self.buffers = [SimpleNamespace(buckets=[SimpleNamespace(grad_data=torch.empty(8))])] + self.optimizer = SimpleNamespace( + cpu_optimizer_cls=torch.optim.AdamW, gpu_optimizer_cls=None + ) + self.states = { + "param": model.weight.detach().float().clone(), + "exp_avg": torch.full_like(model.weight, 0.125, dtype=torch.float32), + "exp_avg_sq": torch.full_like(model.weight, 0.0625, dtype=torch.float32), + "step": torch.tensor(2.0), + } + self.step = 2 + self.corrupt_load = False + + def _get_main_param_and_optimizer_states(self, parameter): + assert parameter is self.model.weight + return self.states + + def state_dict(self): + return {"step": self.step, "cpu_optimizer_cls": torch.optim.AdamW} + + def load_state_dict(self, header): + self.calls.append("header") + assert header["cpu_optimizer_cls"] is torch.optim.AdamW + self.step = header["step"] + # Emulate native HybridDeviceOptimizer's RNG-consuming dummy initialization. + with torch.no_grad(): + self.model.weight.copy_(torch.randn_like(self.model.weight)) + + def save_parameter_state(self, path): + raise AssertionError("Whole-bucket packing must never be called") + + def load_parameter_state(self, path): + raise AssertionError("Whole-bucket unpacking must never be called") + + def _set_main_param_and_optimizer_states(self, parameter, states): + assert parameter is self.model.weight + self.calls.append("native_set") + assert states is self.states + if self.corrupt_load: + self.states["exp_avg"][0, 0] = -0.125 + + +class ProtocolScheduler: + def __init__(self): + self.num_steps = 8 + + def state_dict(self): + return {"num_steps": self.num_steps, "lr": 1e-6} + + def load_state_dict(self, state): + self.num_steps = state["num_steps"] + + +@pytest.fixture +def runtime(monkeypatch): + monkeypatch.setattr(torch.cuda, "synchronize", lambda: None) + monkeypatch.setattr(torch.cuda, "get_rng_state_all", lambda: []) + monkeypatch.setattr(torch.cuda, "set_rng_state_all", lambda values: None) + monkeypatch.setattr(torch.cuda, "device_count", lambda: 0) + monkeypatch.setattr(checkpoint.dist, "get_rank", lambda: 0) + model = ProtocolModel() + optimizer = ProtocolOptimizer(model) + scheduler = ProtocolScheduler() + fixture = PolicyFixture.freeze( + torch.arange(320, dtype=torch.int64).reshape(4, 80), + torch.full((4, 16), -2.0, dtype=torch.float32), + baseline_identity="real-worker-baseline-required-in-production", + ) + return [model], optimizer, scheduler, fixture + + +def save_rank(tmp_path, runtime): + model, optimizer, scheduler, fixture = runtime + staging = tmp_path / "step-2.partial" + staging.mkdir() + record = checkpoint._save_rank( + model, + optimizer, + scheduler, + fixture, + staging, + leaves=[optimizer], + identity=IDENTITY, + step=2, + sample_position=8, + tracker=None, + native_args=SimpleNamespace(consumed_train_samples=8), + update_evidence={"native_step": 2, "gradient_norm": 1.0}, + ) + return staging, record + + +def load_rank(staging, runtime): + model, optimizer, scheduler, fixture = runtime + return checkpoint._load_rank( + model, + optimizer, + scheduler, + fixture, + staging, + leaves=[optimizer], + identity=IDENTITY, + complete={"step": 2, "sample_position": 8}, + tracker=None, + native_args=SimpleNamespace(consumed_train_samples=0), + ) + + +def test_bounded_load_calls_hdo_sync(tmp_path, runtime, monkeypatch): + pytest.importorskip("megatron") + staging, _ = save_rank(tmp_path, runtime) + model, optimizer, _, _ = runtime + calls = [] + + class FakeHDO: + def _sync_hdo_state_to_sub_optimizers(self): + calls.append("sync") + + optimizer.optimizer = FakeHDO() + monkeypatch.setattr( + "megatron.core.optimizer.cpu_offloading.hybrid_optimizer.HybridDeviceOptimizer", + FakeHDO, + ) + optimizer_checkpoint.load_bounded_parameter_state(model, [optimizer], staging / "rank-0") + assert calls == ["sync"] + + +def test_load_rank_fails_when_hdo_sync_skipped(tmp_path, runtime, monkeypatch): + staging, _ = save_rank(tmp_path, runtime) + model, optimizer, scheduler, fixture = runtime + + def load_without_sync(model, leaves, rank_dir): + rank_dir = Path(rank_dir) + touched = [] + index = json.loads((rank_dir / "optimizer-index.json").read_text()) + current = optimizer_checkpoint.native_parameter_layout(model, leaves) + extras = torch.load(rank_dir / "optimizer-extra.pt", map_location="cpu", weights_only=True) + with torch.no_grad(): + for name, record in current.items(): + entry = index["parameters"][name] + states = optimizer_checkpoint.native_parameter_states(record) + for block in entry["blocks"]: + start, end = block["start"], block["end"] + payload = torch.load( + rank_dir / block["path"], map_location="cpu", weights_only=True + ) + for key in optimizer_checkpoint.PARAMETER_KEYS: + states[key].reshape(-1)[start:end].copy_(payload[key]) + for key, value in extras[name].items(): + if isinstance(states[key], torch.Tensor): + states[key].copy_(value) + else: + states[key] = value + record["leaf"]._set_main_param_and_optimizer_states(record["parameter"], states) + if record["leaf"] not in touched: + touched.append(record["leaf"]) + + monkeypatch.setattr(checkpoint, "load_bounded_parameter_state", load_without_sync) + monkeypatch.setattr( + checkpoint, + "verify_hdo_optimizer_master_aliases", + lambda model, leaves: (_ for _ in ()).throw( + ValueError("HDO FP32 master copy diverged from checkpoint-visible master weights") + ), + ) + with pytest.raises(ValueError, match="FP32 master copy diverged"): + checkpoint._load_rank( + model, + optimizer, + scheduler, + fixture, + staging, + leaves=[optimizer], + identity=IDENTITY, + complete={"step": 2, "sample_position": 8}, + tracker=None, + native_args=SimpleNamespace(consumed_train_samples=0), + ) + + +def test_rank_roundtrip_uses_parameter_state_and_restores_rng_last(tmp_path, runtime): + model, optimizer, scheduler, _ = runtime + original_rng = state_digest(capture_rng_state()) + original_model = state_digest(model[0].state_dict()) + staging, record = save_rank(tmp_path, runtime) + with torch.no_grad(): + model[0].weight.fill_(-3) + model[0].counter.fill_(42) + optimizer.states["param"].fill_(5) + optimizer.states["exp_avg"].fill_(0) + optimizer.step = 100 + scheduler.num_steps = 400 + random.random() + np.random.rand() + torch.rand(3) + assert load_rank(staging, runtime) == record + assert optimizer.calls == ["header", "native_set"] + assert optimizer.step == 2 and scheduler.num_steps == 8 + assert state_digest(model[0].state_dict()) == original_model + assert state_digest(capture_rng_state()) == original_rng + + +def test_all_small_state_files_are_weights_only_safe(tmp_path, runtime): + staging, _ = save_rank(tmp_path, runtime) + for path in (staging / "rank-0").glob("*.pt"): + assert torch.load(path, map_location="cpu", weights_only=True) is not None + + +def test_native_parameter_load_corruption_is_rejected(tmp_path, runtime): + staging, _ = save_rank(tmp_path, runtime) + runtime[1].corrupt_load = True + with pytest.raises(ValueError, match="master weights or Adam moments"): + load_rank(staging, runtime) + + +def test_header_only_optimizer_is_not_a_complete_checkpoint(runtime): + del runtime[1].states["exp_avg_sq"] + with pytest.raises(ValueError, match="Adam moments are missing"): + checkpoint._optimizer_parameter_records(runtime[0], [runtime[1]]) + + +def test_optimizer_must_cover_each_model_parameter_exactly_once(runtime): + model, optimizer, _, _ = runtime + with pytest.raises(ValueError, match="partition model parameters"): + checkpoint._optimizer_parameter_records(model, [optimizer, optimizer]) + optimizer.model_param_group_index_map = {} + with pytest.raises(ValueError, match="absent from optimizer groups"): + checkpoint._optimizer_parameter_records(model, [optimizer]) + + +def test_optimizer_master_dtype_is_never_silently_cast(runtime): + runtime[1].states["param"] = runtime[1].states["param"].bfloat16() + with pytest.raises(ValueError, match="Invalid fully offloaded native param"): + checkpoint._optimizer_parameter_records(runtime[0], [runtime[1]]) + + +def test_native_class_header_uses_only_running_optimizer_allowlist(runtime): + allowed = checkpoint._native_class_allowlist([runtime[1]]) + header = {"group": {"cls": torch.optim.AdamW, "options": (1, True)}} + encoded = checkpoint._encode_header(header, allowed) + assert checkpoint._decode_header(encoded, allowed) == header + with pytest.raises(TypeError, match="Unpinned class"): + checkpoint._encode_header({"cls": ProtocolOptimizer}, allowed) + with pytest.raises(ValueError, match="absent from the running"): + checkpoint._decode_header({checkpoint.CLASS_TAG: "untrusted.arbitrary.Class"}, allowed) + + +def test_saved_fixture_identity_cannot_change(tmp_path, runtime): + staging, _ = save_rank(tmp_path, runtime) + runtime[3].tokens[0, 0] += 1 + with pytest.raises(ValueError, match="Frozen policy fixture"): + checkpoint.load_training_checkpoint( + None, *runtime, staging, identity=IDENTITY, tracker=None + ) + + +def test_model_schema_rejects_dtype_change(tmp_path, runtime): + staging, record = save_rank(tmp_path, runtime) + path = staging / "rank-0/model-0.pt" + value = torch.load(path, weights_only=True) + value["weight"] = value["weight"].float() + torch.save(value, path) + record["model_sha256"][0] = state_digest(value) + (staging / "rank-0/progress.json").write_text(json.dumps(record)) + with pytest.raises(ValueError, match="dtypes, shapes or state keys"): + load_rank(staging, runtime) + + +def test_numpy_rng_roundtrip_preserves_all_bits(runtime): + state = capture_rng_state() + assert state_digest(checkpoint._decode_rng(checkpoint._encode_rng(state))) == state_digest( + state + ) + + +def test_shared_storage_disk_estimate_counts_padding_once(): + buffer = torch.arange(1024, dtype=torch.bfloat16) + assert checkpoint._tensor_bytes({"one": buffer[:8], "two": buffer[8:16]}) == 2048 + + +def test_bounded_blocks_do_not_serialize_underlying_bucket(tmp_path, runtime, monkeypatch): + import qwen3_next_optimizer_checkpoint as bounded + + monkeypatch.setattr(bounded, "BLOCK_BYTES", 48) + optimizer = runtime[1] + for key in bounded.PARAMETER_KEYS: + backing = torch.arange(1024 * 1024, dtype=torch.float32) + optimizer.states[key] = backing[100:108].view(2, 4) + staging, _ = save_rank(tmp_path, runtime) + blocks = sorted((staging / "rank-0/optimizer-state").glob("*.pt")) + assert len(blocks) == 2 + for path in blocks: + assert path.stat().st_size < 4096 + payload = torch.load(path, weights_only=True) + assert sum(value.numel() * value.element_size() for value in payload.values()) == 48 + load_rank(staging, runtime) + + +@pytest.mark.parametrize("change", ["gap", "overlap", "truncated"]) +def test_bounded_block_ranges_must_cover_parameter_once(tmp_path, runtime, monkeypatch, change): + import qwen3_next_optimizer_checkpoint as bounded + + monkeypatch.setattr(bounded, "BLOCK_BYTES", 48) + staging, _ = save_rank(tmp_path, runtime) + path = staging / "rank-0/optimizer-index.json" + index = json.loads(path.read_text()) + blocks = index["parameters"]["chunk0.weight"]["blocks"] + if change == "gap": + blocks[1]["start"] += 1 + elif change == "overlap": + blocks[1]["start"] -= 1 + else: + blocks.pop() + path.write_text(json.dumps(index)) + with pytest.raises(ValueError, match="cover each parameter exactly once|complete parameter"): + load_rank(staging, runtime) + + +def test_native_dp_range_cannot_describe_partial_parameter(runtime): + optimizer = runtime[1] + ranges = next(iter(optimizer.gbuf_ranges[0].values()))[0]["param_map"][runtime[0][0].weight] + ranges["param"].start = 1 + with pytest.raises(ValueError, match="cover each complete parameter"): + checkpoint._optimizer_parameter_records(runtime[0], [optimizer]) + + +def test_state_identity_includes_native_consumed_samples_and_rng(runtime, monkeypatch): + monkeypatch.setattr(checkpoint, "_native_leaves", lambda *args: [runtime[1]]) + args = SimpleNamespace(consumed_train_samples=8) + first = checkpoint.training_state_identity( + args, *runtime, step=2, sample_position=8, identity=IDENTITY, tracker=None + ) + args.consumed_train_samples = 12 + second = checkpoint.training_state_identity( + args, *runtime, step=2, sample_position=8, identity=IDENTITY, tracker=None + ) + assert first["state_sha256"] != second["state_sha256"] + args.consumed_train_samples = 8 + torch.rand(1) + third = checkpoint.training_state_identity( + args, *runtime, step=2, sample_position=8, identity=IDENTITY, tracker=None + ) + assert first["rng_sha256"] != third["rng_sha256"] + + +def test_native_required_files_are_bound_to_checked_manifest(tmp_path, runtime, monkeypatch): + model, optimizer, scheduler, fixture = runtime + staging = tmp_path / "all.partial" + staging.mkdir() + for rank in range(4): + monkeypatch.setattr(checkpoint.dist, "get_rank", lambda rank=rank: rank) + checkpoint._save_rank( + model, + optimizer, + scheduler, + fixture, + staging, + leaves=[optimizer], + identity=IDENTITY, + step=2, + sample_position=8, + tracker=None, + native_args=SimpleNamespace(consumed_train_samples=8), + update_evidence={"native_step": 2, "gradient_norm": 1.0}, + ) + complete = tmp_path / "all" + publish_checkpoint(staging, complete, world_size=4, identity=IDENTITY) + assert checkpoint._validate_native_checkpoint(complete, IDENTITY, 1)["step"] == 2 + with pytest.raises(ValueError, match="omits or substitutes"): + checkpoint._validate_native_checkpoint(complete, IDENTITY, 2) + (complete / "rank-3/optimizer-state/p00000-b00000.pt").write_bytes(b"corrupt") + monkeypatch.setattr(checkpoint.dist, "get_rank", lambda: 0) + monkeypatch.setattr(checkpoint, "_all_rank_call", lambda action, label: action()) + monkeypatch.setattr(checkpoint, "_rank_zero_call", lambda action, label: action()) + monkeypatch.setattr(checkpoint, "_native_leaves", lambda *args: [optimizer]) + optimizer.calls.clear() + with pytest.raises(ValueError, match="checksum|size mismatch"): + checkpoint.load_training_checkpoint( + None, *runtime, complete, identity=IDENTITY, tracker=None + ) + assert not optimizer.calls + + +def _serial_worker(rank, root, fail_owner): + dist.init_process_group( + "gloo", + rank=rank, + world_size=4, + init_method=f"file://{root}/init-{fail_owner}", + timeout=timedelta(seconds=30), + ) + try: + + def action(): + lock = Path(root) / f"lock-{fail_owner}" + with lock.open("x"): + path = Path(root) / f"visited-{fail_owner}" + with path.open("a") as stream: + stream.write(f"{rank}\n") + if rank == fail_owner: + raise ValueError("simulated native serialization failure") + lock.unlink() + return rank + + try: + result = checkpoint._serial_rank_call(action, "protocol test") + except RuntimeError as exc: + result = str(exc) + (Path(root) / f"result-{fail_owner}-{rank}.json").write_text(json.dumps(result)) + finally: + dist.destroy_process_group() + + +@pytest.mark.parametrize("fail_owner", [-1, 2]) +def test_real_four_process_serial_protocol_propagates_failures(tmp_path, fail_owner): + mp.spawn(_serial_worker, args=(str(tmp_path), fail_owner), nprocs=4, join=True) + visited = (tmp_path / f"visited-{fail_owner}").read_text().splitlines() + assert visited == (["0", "1", "2", "3"] if fail_owner == -1 else ["0", "1", "2"]) + for rank in range(4): + result = json.loads((tmp_path / f"result-{fail_owner}-{rank}.json").read_text()) + if fail_owner == -1: + assert result == rank + else: + assert "simulated native serialization failure" in result + + +def _wire_sharded_hdo(optimizer, monkeypatch, *, break_alias=False, diverge=False): + """Emulate Megatron: the HDO is keyed by the DP shard, the getter returns the shard's master.""" + pytest.importorskip("megatron") + model_weight = optimizer.model.weight + shard = torch.nn.Parameter(model_weight.detach().clone().reshape(-1)) + master = model_weight.detach().float().clone().reshape(-1) + fp32_inner = master.clone() + if diverge: + fp32_inner[0] += 1.0 + hdo_state = {"master_param": master, "exp_avg": torch.zeros(8), "exp_avg_sq": torch.zeros(8)} + + class FakeHDO: + pass + + hdo = FakeHDO() + hdo.param_groups = [{"params": [shard]}] + hdo.state = {shard: hdo_state} + hdo.param_to_fp32_param = {shard: fp32_inner} + hdo.param_to_inner_param = {shard: fp32_inner} + cpu_state = {fp32_inner: {} if break_alias else hdo_state} + hdo.cpu_optimizers = [SimpleNamespace(param_groups=[{"params": [fp32_inner]}], state=cpu_state)] + monkeypatch.setattr( + "megatron.core.optimizer.cpu_offloading.hybrid_optimizer.HybridDeviceOptimizer", FakeHDO + ) + monkeypatch.setattr( + optimizer_checkpoint, + "_hdo_param_generator", + lambda cpu_optimizer: [p for g in cpu_optimizer.param_groups for p in g["params"]], + ) + optimizer.optimizer = hdo + optimizer.states["param"] = master # the real getter returns state["master_param"] + return hdo + + +def test_hdo_alias_check_uses_the_sharded_parameter_not_the_model_parameter(runtime, monkeypatch): + model, optimizer, _, _ = runtime + hdo = _wire_sharded_hdo(optimizer, monkeypatch) + assert model[0].weight not in hdo.param_to_fp32_param # keyed by the shard, as in Megatron + optimizer_checkpoint.verify_hdo_optimizer_master_aliases(model, [optimizer]) + + +@pytest.mark.parametrize( + "kwargs, message", + [ + ({"break_alias": True}, "not aliased"), + ({"diverge": True}, "diverged"), + ], +) +def test_hdo_alias_check_rejects_broken_wiring(runtime, monkeypatch, kwargs, message): + model, optimizer, _, _ = runtime + _wire_sharded_hdo(optimizer, monkeypatch, **kwargs) + with pytest.raises(ValueError, match=message): + optimizer_checkpoint.verify_hdo_optimizer_master_aliases(model, [optimizer]) diff --git a/tests/test_qwen3_next_training_closeout.py b/tests/test_qwen3_next_training_closeout.py new file mode 100644 index 000000000..fbd59b087 --- /dev/null +++ b/tests/test_qwen3_next_training_closeout.py @@ -0,0 +1,430 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""CPU recovery/audit regressions; these never substitute for native GPU updates.""" + +import copy +import json +import sys +from pathlib import Path +from types import SimpleNamespace + +import pytest +import torch + +from rl_engine.integrations.qwen3_next_subnode import SUBNODES + + +def test_requeue_repeats_final_reload_without_reusing_stale_attempt(monkeypatch): + import qwen3_next_training as runner + + journal = { + "schema_version": 1, + "identity": {}, + "events": list(runner.EVENTS), + "recovery": [], + "workers": {phase: {"path": phase} for phase in runner.PHASES}, + "l2_reports": { + phase: {"path": phase} for phase in ("baseline", "update1", "update2", "reload") + }, + } + monkeypatch.setattr(runner, "read_record", lambda record: {"attempt": "0"}) + assert runner.repeat_reload_in_current_attempt(journal, "1") + runner.validate_journal(journal, {}, verify_files=False) + assert set(journal["workers"]) == {"update1", "update2"} + assert set(journal["l2_reports"]) == {"baseline", "update1", "update2"} + retired = journal["recovery"][0] + assert retired["from_attempt"] == "0" and retired["to_attempt"] == "1" + assert set(retired["workers"]) == {"reload", "continuous", "resumed"} + assert not runner.repeat_reload_in_current_attempt(journal, "1") + + +sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "scripts")) +import qwen3_next_training as runner # noqa: E402 + +from rl_engine.integrations import qwen3_next_native_training as native # noqa: E402 +from rl_engine.integrations import qwen3_next_training as observer # noqa: E402 + + +def parameter_names(): + return [ + f"chunk0.decoder.layers.{layer}.{component}.weight" + for layer in range(48) + for component in ("self_attention", "mlp", "pre_mlp_layernorm") + ] + [ + f"chunk0.{component}.weight" + for component in ("embedding", "output_layer", "final_layernorm") + ] + + +def audit(step=1): + names = parameter_names() + before = {name: "1" * 64 for name in names} + after = {name: "2" * 64 for name in names} + return { + "step": step, + "sample_position": step * 4, + "fixture": "a" * 64, + "policy_loss_calls": 4, + "grad_norm": 0.25, + "metrics": {"loss": -0.25}, + "parameter_hashes_before": before, + "parameter_hashes_after": after, + "changed_parameters": names, + "gradients": { + "parameters": { + name: {"present": True, "nonzero": True, "dtype": "torch.float32"} for name in names + }, + "active_groups": {name: [name] for name in names}, + }, + "progress": { + "consumed_before": (step - 1) * 4, + "consumed_after": step * 4, + "scheduler_before": (step - 1) * 4, + "scheduler_after": step * 4, + "sample_counter_owner": "qwen3_next_native_training.policy_step", + }, + } + + +def state(): + value = { + "schema_version": 1, + "scope": "native_vime_training_state", + "rank": 0, + "identity": {"fixture_sha256": "a" * 64}, + "step": 1, + "sample_position": 4, + "consumed_train_samples": 4, + "fixture_sha256": "a" * 64, + "model_sha256": ["b" * 64], + "optimizer_parameter_sha256": { + name: {kind: "c" * 64 for kind in ("param", "exp_avg", "exp_avg_sq")} + for name in parameter_names() + }, + "optimizer_header_sha256": "d" * 64, + "scheduler_sha256": "e" * 64, + "rng_sha256": "f" * 64, + } + return seal_state(value) + + +def seal_state(value): + value["state_sha256"] = observer.state_digest( + {key: item for key, item in value.items() if key != "state_sha256"} + ) + return value + + +def validate_state(value): + runner.validate_state( + value, rank=0, step=1, identity={"fixture_sha256": "a" * 64}, parameters=parameter_names() + ) + + +def test_full_actor_update_and_recovery_state_contract(): + runner.validate_update(audit(), step=1, fixture="a" * 64) + validate_state(state()) + + +@pytest.mark.parametrize( + "damage", ["no_change", "zero_gradient", "missing_layer", "nan_loss", "bad_progress"] +) +def test_update_rejects_fake_or_incomplete_actor_evidence(damage): + value = audit() + name = parameter_names()[0] + if damage == "no_change": + value["parameter_hashes_after"] = dict(value["parameter_hashes_before"]) + value["changed_parameters"] = [] + elif damage == "zero_gradient": + value["gradients"]["parameters"][name]["nonzero"] = False + elif damage == "missing_layer": + for key in ("parameter_hashes_before", "parameter_hashes_after"): + value[key] = { + name: digest for name, digest in value[key].items() if ".layers.47." not in name + } + elif damage == "nan_loss": + value["metrics"]["loss"] = float("nan") + else: + value["progress"]["consumed_after"] = 0 + with pytest.raises(ValueError): + runner.validate_update(value, step=1, fixture="a" * 64) + + +@pytest.mark.parametrize("field", ["rng_sha256", "scheduler_sha256", "optimizer_header_sha256"]) +def test_state_rejects_tampering_even_when_comparison_peer_was_copied(field): + value = state() + value[field] = "0" * 64 + copied_peer = copy.deepcopy(value) + assert value == copied_peer + with pytest.raises(ValueError, match="digest"): + validate_state(value) + + +@pytest.mark.parametrize("damage", ["consumed", "missing_master", "missing_parameter"]) +def test_resigned_state_still_requires_complete_progress_and_optimizer(damage): + value = state() + if damage == "consumed": + value["consumed_train_samples"] = 0 + elif damage == "missing_master": + del value["optimizer_parameter_sha256"][parameter_names()[0]]["param"] + else: + del value["optimizer_parameter_sha256"][parameter_names()[0]] + with pytest.raises(ValueError): + validate_state(seal_state(value)) + + +@pytest.mark.parametrize("behavior", ["success", "native_failure", "missing_scheduler_step"]) +def test_controller_advances_samples_only_after_successful_native_scheduler_step( + monkeypatch, behavior +): + args, scheduler = SimpleNamespace(consumed_train_samples=4), SimpleNamespace(num_steps=4) + + def update(*unused, **kwargs): + if behavior == "native_failure": + raise RuntimeError("injected native optimizer failure") + if behavior == "success": + scheduler.num_steps += 4 + return audit(step=2) + + monkeypatch.setattr(observer, "native_policy_update", update) + + def invoke(): + return native.policy_step(args, [], None, scheduler, None, step=2, required_groups={}) + + if behavior == "success": + result = invoke() + assert args.consumed_train_samples == scheduler.num_steps == 8 + assert result["progress"]["consumed_before"] == 4 + else: + with pytest.raises((RuntimeError, ValueError)): + invoke() + assert args.consumed_train_samples == 4 + + +def test_journal_requires_l2_between_updates_and_before_reload_controls(): + journal = { + "schema_version": 1, + "identity": {}, + "events": list(runner.EVENTS[:3]), + "workers": {"update1": {}}, + "l2_reports": {"baseline": {}, "update1": {}}, + } + runner.validate_journal(journal, {}, verify_files=False) + journal["events"] = ["l2:baseline", "worker:update1", "worker:update2"] + with pytest.raises(ValueError, match="order"): + runner.validate_journal(journal, {}, verify_files=False) + + +@pytest.mark.parametrize("missing", ["update2", "reload", "continuous", "resumed"]) +def test_final_acceptance_rejects_missing_phases_before_reading_evidence(missing): + report = { + "schema_version": 1, + "status": "passed", + "scope": "qwen3_next_training_and_reload", + "required_sections": list(runner.SECTIONS), + "events": list(runner.EVENTS), + "l2_reports": dict.fromkeys(("baseline", "update1", "update2", "reload"), {}), + "workers": dict.fromkeys(runner.PHASES, {}), + } + del report["workers"][missing] + with pytest.raises(ValueError, match="omitted"): + runner.validate_training_report(report) + + +def test_cleanup_rejects_symlink_to_another_directory_in_same_run(tmp_path): + retained = tmp_path / "retained" + retained.mkdir() + (retained / "state").write_text("must survive") + alias = tmp_path / "alias" + alias.symlink_to(retained, target_is_directory=True) + with pytest.raises(ValueError, match="owned"): + runner._owned_remove(alias, tmp_path) + assert (retained / "state").read_text() == "must survive" + + +def test_interrupted_cleanup_requires_matching_run_identity(tmp_path): + root = tmp_path / "checkpoints" + identity = {"run_id": "this-run"} + runner.owned_root(root, identity) + own = root / "step-1.partial" + own.mkdir() + (own / "STAGING.json").write_text(json.dumps({"identity": identity, "status": "staging"})) + assert len(runner.remove_interrupted(root, identity)) == 1 + assert not own.exists() + foreign = root / "foreign.partial" + foreign.mkdir() + (foreign / "STAGING.json").write_text( + json.dumps({"identity": {"run_id": "other"}, "status": "staging"}) + ) + with pytest.raises(ValueError, match="another run"): + runner.remove_interrupted(root, identity) + assert foreign.exists() + + +def test_actual_fault_injection_kills_writer_and_rejects_partial_or_corrupt_protocol(tmp_path): + result = runner.checkpoint_faults(tmp_path / "faults", {"run_id": "cpu-protocol-only"}) + evidence = runner.read_record(result) + assert set(evidence["cases"]) == set(runner.FAULTS) + assert all(case["passed"] for case in evidence["cases"].values()) + assert evidence["cases"]["interrupted_writer"]["exit_code"] < 0 + # A passed label cannot survive repair/substitution of the rejected bytes. + corrupt = Path(evidence["cases"]["hash_error"]["checkpoint"]) / "rank-2-optimizer.bin" + corrupt.write_bytes(b"2:optimizer") + with pytest.raises(ValueError, match="no longer reproduces"): + runner.validate_fault_evidence(evidence, {"run_id": "cpu-protocol-only"}) + + +def test_checkpoint_retention_keeps_successor_and_only_removes_older_owned_state(tmp_path): + identity = {"run_id": "retention-unit-contract"} + runner.owned_root(tmp_path, identity) + checkpoints = [] + for step in (1, 2): + path = tmp_path / f"step-{step}" + path.mkdir() + (path / "COMPLETE.json").write_text( + json.dumps({"identity": identity, "status": "complete", "step": step}) + ) + checkpoints.append(path) + retired = native.retire_prior_checkpoints(checkpoints[1], tmp_path, identity) + assert retired[0]["complete"]["step"] == 1 + assert not checkpoints[0].exists() + assert checkpoints[1].is_dir() + + +def test_checkpoint_retention_cannot_delete_a_foreign_run(tmp_path): + identity = {"run_id": "this-run"} + runner.owned_root(tmp_path, identity) + successor, foreign = tmp_path / "step-2", tmp_path / "other-run" + for path, owner, step in ((successor, identity, 2), (foreign, {"run_id": "other"}, 1)): + path.mkdir() + (path / "COMPLETE.json").write_text( + json.dumps({"identity": owner, "status": "complete", "step": step}) + ) + with pytest.raises(ValueError, match="unrelated"): + native.retire_prior_checkpoints(successor, tmp_path, identity) + assert successor.exists() and foreign.exists() + + +@pytest.mark.parametrize("difference", [None, "signed_zero", "state"]) +def test_reload_comparison_reopens_original_tensors_and_rejects_cross_phase_drift( + tmp_path, difference +): + # Small tensors test the raw comparison plumbing. Full matrix shape and + # provenance remain the independent validate_matrix_report prerequisite. + payload = { + "response_tokens": torch.ones((1, 16), dtype=torch.int64), + "logits": torch.zeros((1, 16, 2), dtype=torch.bfloat16), + "logprobs": torch.zeros((1, 16), dtype=torch.float32), + "embedding_digest": {"sample_sha256": ["d" * 64], "sha256": "e" * 64}, + "layer_digests": [ + { + "layer": index, + "sample_output_sha256": ["a" * 64], + "sample_state_sha256": ["b" * 64], + "sample_subnode_sha256": {name: ["f" * 64] for name in SUBNODES}, + } + for index in range(48) + ], + } + left, right = tmp_path / "update.pt", tmp_path / "reload.pt" + torch.save(payload, left) + if difference == "signed_zero": + payload["logits"][0, 0, 0] = -0.0 + elif difference == "state": + payload["layer_digests"][3]["sample_state_sha256"] = ["c" * 64] + torch.save(payload, right) + ids = [case.case_id for case in runner.case_matrix()] + + def matrix(path): + return { + "case_ids": ids, + "cases": { + name: { + "artifacts": {role: runner.record(path) for role in ("rollout", "recompute")} + } + for name in ids + }, + } + + if difference is None: + result = runner.compare_reload_matrices(matrix(left), matrix(right)) + assert result["status"] == "passed" and len(result["cases"]) == 16 + else: + with pytest.raises(ValueError, match="original.*tensor bits/state"): + runner.compare_reload_matrices(matrix(left), matrix(right)) + + +def test_stage_phase_ranges_and_continuation_identity(): + assert runner.stage_phases("train1") == ("update1",) + assert runner.stage_phases("train2") == ("update1", "update2") + assert runner.stage_phases("train") == runner.PHASES + model = {"source_tree": "t", "environment_sha256": "e"} + journal_identity = {**model, "run_id": "r1", "execution_id": "1", "fixture_sha256": "f"} + assert runner.continuation_identity_matches(journal_identity, model, "f") + assert not runner.continuation_identity_matches(journal_identity, model, "g") + assert not runner.continuation_identity_matches( + journal_identity, {**model, "environment_sha256": "x"}, "f" + ) + + +def test_partial_training_evidence_uses_the_phase_export_identity(tmp_path, monkeypatch): + import qwen3_next_contract as contract + import qwen3_next_l2 + + from rl_engine.testing import qwen3_next_l2 as l2_testing + + manifest = {"stage": "train1", "checkpoint": "/official"} + export = {"checkpoint": "/export", "weight_version": "update-1", "base_checkpoint": "/official"} + monkeypatch.setattr(qwen3_next_l2, "model_identity", lambda m: {"ckpt": m["checkpoint"]}) + monkeypatch.setattr(runner, "read_record", lambda value: {"export": export}) + seen = [] + monkeypatch.setattr( + l2_testing, + "validate_matrix_report", + lambda report, expected_identity, artifact_root: seen.append(expected_identity), + ) + matrix = tmp_path / "l2-matrix.json" + matrix.write_text("{}") + progress = { + "status": "passed", + "scope": contract.SCOPES["train1"], + "identity": {"ckpt": "/official"}, + "phases": ["update1"], + "workers": {"update1": {"path": "w"}}, + "l2_reports": {"update1": {"sha256": "abc"}}, + } + path = tmp_path / "progress.json" + path.write_text(json.dumps(progress)) + evidence = {"updates": {"path": str(path)}, "l2_matrix": {"path": str(matrix), "sha256": "abc"}} + contract.validate_partial_training_evidence(manifest, tmp_path, evidence, attempt_root=tmp_path) + assert seen == [{"ckpt": "/export"}] # not the base model identity + with pytest.raises(ValueError, match="does not reference"): + contract.validate_partial_training_evidence( + manifest, + tmp_path, + {**evidence, "l2_matrix": {**evidence["l2_matrix"], "sha256": "x"}}, + attempt_root=tmp_path, + ) + export["base_checkpoint"] = "/elsewhere" + with pytest.raises(ValueError, match="pinned base"): + contract.validate_partial_training_evidence( + manifest, tmp_path, evidence, attempt_root=tmp_path + ) + + +def test_continued_storage_follows_the_chain_back_to_train1(tmp_path): + def run(name, stage, previous=None): + directory = tmp_path / name + directory.mkdir() + manifest = {"stage": stage, "previous": str(previous) if previous else None} + (directory / "run.json").write_text(json.dumps(manifest)) + return directory + + l2 = run("l2", "l2") + train1 = run("train1", "train1", l2) + train2 = run("train2", "train2", train1) + assert runner.continued_training_storage(train1) == train1 / "training-state" + assert runner.continued_training_storage(train2) == train1 / "training-state" + with pytest.raises(ValueError, match="back to a train1 run"): + runner.continued_training_storage(l2) diff --git a/tests/test_qwen3_next_training_export.py b/tests/test_qwen3_next_training_export.py new file mode 100644 index 000000000..18a6bad55 --- /dev/null +++ b/tests/test_qwen3_next_training_export.py @@ -0,0 +1,288 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Tiny CPU export-publication regressions, not full-model numerical acceptance.""" + +import copy +import json +import shutil +import sys +from pathlib import Path + +import pytest +import torch +from safetensors.torch import save_file + +sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "scripts")) +import qwen3_next_training_export as export # noqa: E402 +from qwen3_next_runtime import file_digest # noqa: E402 + + +def write_weights(root, values, filename): + save_file(values, root / filename) + index = { + "metadata": { + "total_size": sum(value.numel() * value.element_size() for value in values.values()) + }, + "weight_map": {name: filename for name in values}, + } + (root / export.INDEX_FILE).write_text(json.dumps(index)) + + +@pytest.fixture +def staged(tmp_path, monkeypatch): + base = tmp_path / "unit-official" + base.mkdir() + (base / "config.json").write_text( + json.dumps({"model_type": "qwen3_next", "num_hidden_layers": 48}) + ) + (base / "tokenizer.json").write_text(json.dumps({"unit_fixture": "not a real tokenizer"})) + values = { + f"model.layers.{layer}.input_layernorm.weight": torch.ones(2, dtype=torch.bfloat16) + for layer in range(48) + } + values.update( + { + "model.embed_tokens.weight": torch.ones((4, 2), dtype=torch.bfloat16), + "model.norm.weight": torch.ones(2, dtype=torch.bfloat16), + "lm_head.weight": torch.ones((4, 2), dtype=torch.bfloat16), + } + ) + write_weights(base, values, "base.safetensors") + base_identity = { + "revision": base.name, + "metadata": { + path.name: file_digest(path) for path in base.iterdir() if path.suffix != ".safetensors" + }, + "shards": {"base.safetensors": {"size": (base / "base.safetensors").stat().st_size}}, + } + monkeypatch.setattr(export, "_reference", lambda: {"revision": base.name}) + schema_reference = { + "tensor_count": len(values), + "weight_schema_sha256": export._json_digest( + export._weight_schema(base, check_finite=False) + ), + } + monkeypatch.setattr(export, "_schema_reference", lambda: schema_reference) + + def identity(path): + assert Path(path) == base + return copy.deepcopy(base_identity) + + monkeypatch.setattr(export, "checkpoint_identity", identity) + staging, destination = tmp_path / "export.partial", tmp_path / "export-complete" + staging.mkdir() + for name in ("config.json", "tokenizer.json"): + shutil.copy2(base / name, staging / name) + write_weights( + staging, {name: value + 1 for name, value in values.items()}, "updated.safetensors" + ) + (staging / "STAGING.json").write_text(json.dumps({"scope": export.KIND, "status": "staging"})) + training = { + "source_commit": "unit-source", + "source_tree": "unit-tree", + "environment_sha256": "unit-env", + "provider_config": {"provider": "strict"}, + "topology": {"tp": 4, "pp": 1, "cp": 1, "ep": 1}, + "checkpoint": str(base), + "checkpoint_identity": base_identity, + } + return { + "staging": staging, + "destination": destination, + "step": 1, + "weight_version": "update-1", + "identity": training, + "base_checkpoint": base, + "base_checkpoint_identity": base_identity, + "model_hashes": [str(rank) * 64 for rank in range(4)], + } + + +def publish(staged): + return export._publish_export(**staged) + + +def test_atomic_native_export_identity_and_all_file_verification(staged): + record = publish(staged) + assert not staged["staging"].exists() + assert ( + record["metadata"][export.INDEX_FILE] + != staged["base_checkpoint_identity"]["metadata"][export.INDEX_FILE] + ) + assert export.validate_training_export(staged["destination"], record) == record + assert record["tensor_count"] == 51 + assert record["model_identity_method"] == "native_parameter_hashes_after" + + +def test_history_record_survives_weight_retirement_but_cannot_load(staged): + record = publish(staged) + (staged["destination"] / "updated.safetensors").unlink() + assert export.validate_training_export_record(record, record) == record + with pytest.raises(ValueError, match="file inventory changed"): + export.validate_training_export(staged["destination"], record) + + +def test_same_size_weight_corruption_is_rejected(staged): + record = publish(staged) + path = staged["destination"] / "updated.safetensors" + payload = bytearray(path.read_bytes()) + payload[-1] ^= 1 + path.write_bytes(payload) + with pytest.raises(ValueError, match="checksum"): + export.validate_training_export(staged["destination"], record) + + +def test_export_requires_completion_publication(staged): + with pytest.raises(ValueError, match="unpublished"): + export.validate_training_export(staged["staging"], {}) + + +@pytest.mark.parametrize("missing", ["model.layers.47.input_layernorm.weight", "lm_head.weight"]) +def test_reduced_model_or_missing_head_cannot_publish(staged, missing): + from safetensors.torch import load_file + + values = load_file(staged["staging"] / "updated.safetensors") + del values[missing] + write_weights(staged["staging"], values, "updated.safetensors") + with pytest.raises(ValueError, match="omitted trained official tensors"): + publish(staged) + assert not (staged["staging"] / export.COMPLETE_FILE).exists() + + +@pytest.mark.parametrize("mutation", ["dtype", "nonfinite", "shape"]) +def test_export_preserves_finite_original_weight_schema(staged, mutation): + from safetensors.torch import load_file + + values = load_file(staged["staging"] / "updated.safetensors") + key = "lm_head.weight" + if mutation == "dtype": + values[key] = values[key].float() + elif mutation == "nonfinite": + values[key][0, 0] = float("nan") + else: + values[key] = values[key][:2].contiguous() + write_weights(staged["staging"], values, "updated.safetensors") + with pytest.raises(ValueError, match="BF16|Nonfinite|complete official tensor schema"): + publish(staged) + + +def test_modified_tokenizer_cannot_publish(staged): + (staged["staging"] / "tokenizer.json").write_text("changed") + with pytest.raises(ValueError, match="tokenizer/configuration assets"): + publish(staged) + + +def test_different_requested_export_identity_is_rejected(staged): + record = publish(staged) + expected = {**record, "weight_version": "reload-2", "step": 2} + with pytest.raises(ValueError, match="requested weights"): + export.validate_training_export(staged["destination"], expected) + + +@pytest.mark.parametrize("field", ["weights_content_sha256", "metadata", "model_identity_method"]) +def test_self_consistent_expected_record_cannot_bypass_required_proofs(staged, field): + record = publish(staged) + record[field] = {} if field == "metadata" else "wrong" + with pytest.raises(ValueError, match="proof|parameter audit"): + export.validate_training_export_record(record, record) + + +def test_export_base_and_native_training_provenance_must_match(staged): + record = publish(staged) + record["training_identity"]["checkpoint"] = "/different-base" + with pytest.raises(ValueError, match="baseline/source/environment provenance"): + export.validate_training_export_record(record, record) + + +def test_no_unmanifested_file_or_symlink_is_accepted(staged): + record = publish(staged) + destination = staged["destination"] + (destination / "extra").write_text("unmanifested") + with pytest.raises(ValueError, match="file inventory changed"): + export.validate_training_export(destination, record) + (destination / "extra").unlink() + (destination / "tokenizer.json").unlink() + (destination / "tokenizer.json").symlink_to(staged["base_checkpoint"] / "tokenizer.json") + with pytest.raises(ValueError, match="external HF export"): + export.validate_training_export(destination, record) + + +def _add_mtp_head_to_base(staged, monkeypatch, n_tensors=3): + """Give the official base an untrained MTP head the native saver never writes.""" + from safetensors.torch import load_file + + base = staged["base_checkpoint"] + values = load_file(base / "base.safetensors") + mtp = { + f"mtp.layers.0.mlp.experts.{i}.down_proj.weight": torch.full( + (2, 2), float(i + 1), dtype=torch.bfloat16 + ) + for i in range(n_tensors) + } + values.update(mtp) + write_weights(base, values, "base.safetensors") + staged["base_checkpoint_identity"]["metadata"][export.INDEX_FILE] = file_digest( + base / export.INDEX_FILE + ) + staged["identity"]["checkpoint_identity"] = staged["base_checkpoint_identity"] + schema_reference = { + "tensor_count": len(values), + "weight_schema_sha256": export._json_digest( + export._weight_schema(base, check_finite=False) + ), + } + monkeypatch.setattr(export, "_schema_reference", lambda: schema_reference) + return mtp + + +def test_untrained_mtp_head_is_carried_from_the_base(staged, monkeypatch): + from safetensors.torch import load_file + + mtp = _add_mtp_head_to_base(staged, monkeypatch) + record = publish(staged) + passthrough = record["base_passthrough"] + assert passthrough["tensor_count"] == len(mtp) and passthrough["prefixes"] == ["mtp."] + (shard,) = passthrough["shards"] + assert passthrough["shards"][shard] == {"source": "base.safetensors", "tensor_count": len(mtp)} + index = json.loads((staged["destination"] / export.INDEX_FILE).read_text()) + assert {name: index["weight_map"][name] for name in mtp} == {name: shard for name in mtp} + carried = load_file(staged["destination"] / shard) + assert all(torch.equal(carried[name], value) for name, value in mtp.items()) + assert record["tensor_count"] == 51 + len(mtp) + assert export.validate_training_export(staged["destination"], record) == record + + +def test_passthrough_is_limited_to_the_mtp_head(staged, monkeypatch): + from safetensors.torch import load_file + + _add_mtp_head_to_base(staged, monkeypatch) + values = load_file(staged["staging"] / "updated.safetensors") + del values["model.norm.weight"] + write_weights(staged["staging"], values, "updated.safetensors") + with pytest.raises( + ValueError, match="omitted trained official tensors: \\['model.norm.weight'\\]" + ): + publish(staged) + assert not (staged["staging"] / export.COMPLETE_FILE).exists() + + +def test_saver_must_not_write_part_of_the_passthrough_head(staged, monkeypatch): + from safetensors.torch import load_file + + mtp = _add_mtp_head_to_base(staged, monkeypatch) + values = load_file(staged["staging"] / "updated.safetensors") + name = next(iter(mtp)) + values[name] = mtp[name] + write_weights(staged["staging"], values, "updated.safetensors") + with pytest.raises(ValueError, match="part of the base passthrough head"): + publish(staged) + + +def test_record_must_declare_the_base_passthrough(staged): + record = publish(staged) + assert record["base_passthrough"] == {"prefixes": ["mtp."], "tensor_count": 0, "shards": {}} + broken = copy.deepcopy(record) + del broken["base_passthrough"] + with pytest.raises(ValueError, match="came from the base"): + export.validate_training_export_record(broken, broken) diff --git a/tests/test_qwen3_next_vllm_attention_metadata.py b/tests/test_qwen3_next_vllm_attention_metadata.py new file mode 100644 index 000000000..02150f052 --- /dev/null +++ b/tests/test_qwen3_next_vllm_attention_metadata.py @@ -0,0 +1,75 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +from types import SimpleNamespace + +import pytest +import torch + +from rl_engine.integrations.qwen3_next_vllm_attention import ( + SharedAttentionBackend, + SharedAttentionBuilder, + SharedAttentionImpl, + validate_boundaries, +) + + +def _config(): + return SimpleNamespace( + parallel_config=SimpleNamespace( + tensor_parallel_size=4, + pipeline_parallel_size=1, + decode_context_parallel_size=1, + prefill_context_parallel_size=1, + ), + model_config=SimpleNamespace(enforce_eager=True), + cache_config=SimpleNamespace(enable_prefix_caching=False), + speculative_config=None, + ) + + +def test_real_builder_preserves_mixed_absolute_prefixes_and_ignores_optimistic_bounds(): + builder = SharedAttentionBuilder(None, ["layer3"], _config(), torch.device("cpu")) + metadata = builder.build( + 0, + SimpleNamespace( + num_reqs=3, + num_actual_tokens=5, + query_start_loc=torch.tensor([0, 1, 1, 5]), + seq_lens=torch.tensor([65, 0, 4]), + seq_lens_cpu_upper_bound=torch.tensor([100, 0, 999]), + block_table_tensor=torch.tensor([[3, 4], [0, 0], [8, 0]]), + slot_mapping=torch.tensor([128, 256, 257, 258, 259, -1]), + causal=True, + ), + ) + assert metadata.seq_lens == (65, 0, 4) + assert metadata.query_start_loc == (0, 1, 1, 5) + assert metadata.slot_mapping.numel() == 5 + assert not SharedAttentionBackend.supports_batch_invariance() + + +@pytest.mark.parametrize( + "starts,lengths,n", + [ + ((0, 2), (1,), 2), + ((0, 1), (1,), 2), + ((1, 2), (2,), 2), + ((0, 1), (1041,), 1), + ((0, 2, 1), (2, 1), 1), + ], +) +def test_invalid_scheduler_boundaries_fail(starts, lengths, n): + with pytest.raises(ValueError): + validate_boundaries(starts, lengths, n) + + +def test_empty_batch_and_profile_guards(): + validate_boundaries((0,), (), 0) + config = _config() + config.cache_config.enable_prefix_caching = True + with pytest.raises(ValueError, match="Prefix reuse"): + SharedAttentionBuilder(None, [], config, torch.device("cpu")) + with pytest.raises(ValueError, match="four Q heads"): + SharedAttentionImpl(8, 256, 1 / 16, 1) + SharedAttentionImpl(4, 256, 1 / 16, 1) From 5ca3022371a833cb4b338f9c225647648695b347 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Fri, 9 Oct 2026 03:11:51 +0000 Subject: [PATCH 51/70] feat(qwen3-next): batch-invariance matrix for the full model RFC #428 batch_invariance_ci (CUDA). - Stage bi (after a passed l2, same certified profile): 97 pinned cells in rl_engine/testing/qwen3_next_bi_cases.py / qwen3_next_bi_manifest.json. concurrency (1-64 requests, target first or last), interference (companion content, lengths, arrival during prefill/decode, generation lengths), chunk boundaries (prompts 63-1024 around 64/128/528/1024, chunk 64/128, first chunk 1/63/65, compared with the replay recompute) and replay THD packing (1-7 neighbours, target first or last). A quick CI subset runs one cell per family plus 64 concurrent requests. - Native rollout: version 2 requests run one traced target next to untraced companions; the exact-prefill scheduler admits each request at its arrival step, pins the target's planned chunk at every step and fails on any preemption; the trace records only the target. - Replay: packed_layout() packs variable-length neighbours with the traced target in one THD batch. - bi-matrix.json names each failing cell's first divergent layer, sub-node and layer family; the chain report gains a batch_invariance section, and the evidence publisher takes the bi run with --also. - gtest: bitwise judgments compare raw bits (signed zero, NaN/Inf and dtype now count), not allclose with zero tolerance. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- .github/workflows/ci.yml | 3 +- .github/workflows/qwen3-next-provider-gpu.yml | 3 +- docs/usage/qwen3-next-batch-invariance.md | 55 + .../qwen3_next_native_recompute.py | 53 +- .../integrations/qwen3_next_native_rollout.py | 305 +- rl_engine/kernels/gtest/forward_invariance.py | 6 +- .../kernels/gtest/qwen3_next_chain_report.py | 25 + rl_engine/testing/qwen3_next_bi_cases.py | 370 ++ rl_engine/testing/qwen3_next_bi_manifest.json | 3857 +++++++++++++++++ scripts/qwen3_next_batch_invariance.py | 337 ++ scripts/qwen3_next_chain_report.py | 12 + scripts/qwen3_next_contract.py | 17 + scripts/qwen3_next_publish_evidence.py | 14 + scripts/qwen3_next_run.py | 15 +- scripts/qwen3_next_runtime.py | 2 + tests/check_qwen3_next_bi_requests.py | 44 + tests/test_qwen3_next_bi_cases.py | 94 + tests/test_qwen3_next_chain_report.py | 38 + tests/test_tensor_identity.py | 37 + 19 files changed, 5251 insertions(+), 36 deletions(-) create mode 100644 docs/usage/qwen3-next-batch-invariance.md create mode 100644 rl_engine/testing/qwen3_next_bi_cases.py create mode 100644 rl_engine/testing/qwen3_next_bi_manifest.json create mode 100644 scripts/qwen3_next_batch_invariance.py create mode 100644 tests/check_qwen3_next_bi_requests.py create mode 100644 tests/test_qwen3_next_bi_cases.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f50c73cef..e6e1f2aa7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -92,7 +92,8 @@ jobs: tests/test_qwen3_next_subnode.py \ tests/test_qwen3_next_chain_report.py \ tests/test_qwen3_next_run.py \ - tests/test_qwen3_next_evidence_redaction.py + tests/test_qwen3_next_evidence_redaction.py \ + tests/test_qwen3_next_bi_cases.py - name: Run Cross-Configuration Contract Tests (CPU-safe) run: | diff --git a/.github/workflows/qwen3-next-provider-gpu.yml b/.github/workflows/qwen3-next-provider-gpu.yml index ca5bf6f4d..9b19dcf89 100644 --- a/.github/workflows/qwen3-next-provider-gpu.yml +++ b/.github/workflows/qwen3-next-provider-gpu.yml @@ -90,4 +90,5 @@ jobs: tests/check_qwen3_next_gdn_bridge.py tests/check_qwen3_next_gdn_sequence.py \ tests/check_qwen3_next_conv_bridge.py tests/check_qwen3_next_core_matrix.py \ tests/check_qwen3_next_shared_core.py \ - tests/check_qwen3_next_paged_attention.py tests/check_qwen3_next_batch_invariance.py + tests/check_qwen3_next_paged_attention.py tests/check_qwen3_next_batch_invariance.py \ + tests/check_qwen3_next_bi_requests.py diff --git a/docs/usage/qwen3-next-batch-invariance.md b/docs/usage/qwen3-next-batch-invariance.md new file mode 100644 index 000000000..603deccce --- /dev/null +++ b/docs/usage/qwen3-next-batch-invariance.md @@ -0,0 +1,55 @@ +# Qwen3-Next batch invariance (RFC #428 `batch_invariance_ci`) + +The `bi` stage checks that a Qwen3-Next-80B-A3B-Instruct sequence gets the +same bits whatever else the engines are doing: other requests in the same +vLLM step, how many there are, when they arrive, how its prompt is chunked, +and how the replay engine packs it with other sequences. It runs after a +passed `l2` stage of the [full-model chain](qwen3-next-chain.md), under the +same certified provider profile. + +```bash +python scripts/qwen3_next_run.py --stage bi --previous /<...-l2-...> \ + --runs-root --checkpoint --cuda-home \ + --python /bin/python [--bi-suite quick] +python scripts/qwen3_next_chain_report.py --last <...-train-...> --bi <...-bi-...> --out chain-report.json +``` + +## Cells + +Every cell has one *target* (16 generated tokens) and compares it bitwise - +response tokens, BF16 logits, FP32 logprobs, the embedding and every layer, +sub-node and recurrent/KV-state digest - with a reference. The cells are +generated by `rl_engine/testing/qwen3_next_bi_cases.py` and pinned by +`qwen3_next_bi_manifest.json`. + +| Family | Cells | The target runs | Compared with | +| --- | --- | --- | --- | +| `concurrency` | 13 | with 0, 1, 3, 7, 15, 31 or 63 companions (prompts 37-1000 tokens), first or last in the FCFS order | the target alone, same chunk plan | +| `interference` | 10 | with companions of the same text, very short or long prompts, mixed lengths, arriving during its prefill, during its decode or at its last decode step, generating 1 or 24 tokens; or itself arriving after them | the target alone, same chunk plan | +| `chunk` | 66 | alone, prompt 63/64/65, 127/128/129, 527/528/529, 1023/1024 tokens, chunk 64 or 128, first chunk 1, 63 or 65 | the replay engine's recompute of the same tokens (the train/rollout boundary) | +| `packing` | 8 | in the replay engine, packed into one THD batch with 1, 3 or 7 neighbours (16-1015 tokens), first or last | the replay of the target alone | + +`--bi-suite quick` runs five cells (one per family plus 64 concurrent +requests) for CI. Prompt 1025 is outside the pinned rollout profile +(`max_model_len` 1040 = 1024 + 16). + +## How a cell runs + +All requests of a cell are submitted together; the exact-prefill scheduler +admits a request to the waiting queue only at its `arrival_step`, counted in +scheduled steps, so arrivals are reproducible. Every prefilling request +shares one `long_prefill_token_threshold`: the target's next planned chunk +while the target prefills, the cell's chunk size otherwise. The scheduler +fails the cell if the target does not get exactly its planned tokens at +every step until its last input, or if any request is preempted. Only the +target is traced; companions generate greedily and are never recorded. +The rollout caps (64 sequences, 16384 tokens per step, 4 GiB of KV cache per +GPU) are part of the certified profile the `layers` stage qualifies. + +## Results + +`bi-matrix.json` lists every cell with its comparisons, the first divergent +layer and sub-node, and its layer family (`embedding`, `norm`, `gdn`, +`full_attention`, `moe` or `lm_head_logprob`). The chain report's +`batch_invariance` section summarises it per family; a failing cell fails +the chain report. diff --git a/rl_engine/integrations/qwen3_next_native_recompute.py b/rl_engine/integrations/qwen3_next_native_recompute.py index a59e89dc7..0624ffeff 100644 --- a/rl_engine/integrations/qwen3_next_native_recompute.py +++ b/rl_engine/integrations/qwen3_next_native_recompute.py @@ -27,19 +27,44 @@ from rl_engine.testing.tensor_identity import assert_tensor_bitwise_equal as exact +def packed_layout(request): + """``(sequences, traced)``: every packed sequence's tokens and which ones are traced. + + An L2 request packs its equal-length samples and traces all of them. A + batch-invariance packing request (``request["packing"]``) packs its target + with untraced companions of any length; only the target is traced. + """ + traced = request["consumed_input_tokens"] + packing = request.get("packing") + if packing is None: + return traced, list(range(len(traced))) + sequences, index = packing["sequences"], packing["target_index"] + if ( + len(traced) != 1 + or index not in range(len(sequences)) + or sequences[index] != traced[0] + or any(not row for row in sequences) + ): + raise ValueError("Packing request must contain its traced target exactly once") + return sequences, [index] + + def response_rows(value, request): - """Keep original BF16 values at P-1..P+14 for every packed sample.""" - batch = len(request["prompt_tokens"]) + """Keep original values at P-1..P+14 of every traced packed sample.""" + sequences, traced = packed_layout(request) + starts = [0] + for row in sequences: + starts.append(starts[-1] + len(row)) length = len(request["consumed_input_tokens"][0]) if value.dtype not in (torch.bfloat16, torch.int64) or value.numel() == 0: raise ValueError("Response traces must preserve nonempty original BF16/int64 storage") value = value.reshape(-1, value.shape[-1]) - if value.shape[0] < batch * length: + if value.shape[0] < starts[-1]: raise ValueError("Packed model output does not cover every frozen sample") positions = torch.tensor(request["prediction_positions"], device=value.device) if positions.shape != (16,) or positions[-1] != length - 1: raise ValueError("Response positions must end before consuming the last target token") - return torch.stack([value[index * length + positions] for index in range(batch)]) + return torch.stack([value[starts[index] + positions] for index in traced]) def _rank_main(rank, cases, staging): @@ -89,18 +114,22 @@ def _rank_main(rank, cases, staging): "request": str(Path(_output).with_suffix(".request.json")), }, ) - consumed = torch.tensor( - request["consumed_input_tokens"], device="cuda", dtype=torch.long - ) - batch, length = consumed.shape + sequences, traced_rows = packed_layout(request) + batch, length = len(traced_rows), len(request["consumed_input_tokens"][0]) if length != request["state_position"] + 1: raise ValueError("Recompute recurrent-state position is inconsistent") - cu = torch.arange(batch + 1, device="cuda", dtype=torch.int32) * length + consumed = torch.tensor( + [token for row in sequences for token in row], device="cuda", dtype=torch.long + ) + lengths = [len(row) for row in sequences] + cu = torch.tensor( + [0, *torch.tensor(lengths).cumsum(0).tolist()], device="cuda", dtype=torch.int32 + ) packed = PackedSeqParams( cu_seqlens_q=cu, cu_seqlens_kv=cu, - max_seqlen_q=length, - max_seqlen_kv=length, + max_seqlen_q=max(lengths), + max_seqlen_kv=max(lengths), qkv_format="thd", ) traces, handles = {}, [] @@ -117,7 +146,7 @@ def hook(_module, _inputs, output): def capture_state(index): def hook(state, indices, _cu): - slots = indices[:batch].long() + slots = indices[traced_rows].long() if (index + 1) % 4: values = { "convolution": state.convolution[slots], diff --git a/rl_engine/integrations/qwen3_next_native_rollout.py b/rl_engine/integrations/qwen3_next_native_rollout.py index 912354597..64012765b 100644 --- a/rl_engine/integrations/qwen3_next_native_rollout.py +++ b/rl_engine/integrations/qwen3_next_native_rollout.py @@ -85,22 +85,25 @@ def runtime_profile(config): def validate_request(request): - if request.get("role") != "rollout" or request.get("schema_version") != 1: - raise ValueError("A version1 rollout request is required") + if request.get("role") != "rollout" or request.get("schema_version") not in (1, 2): + raise ValueError("A version 1 (L2) or 2 (batch-invariance) rollout request is required") + # Version 2 is one traced target next to untraced companions. + bi = request["schema_version"] == 2 digest_input = {key: value for key, value in request.items() if key != "request_sha256"} if json_digest(digest_input) != request.get("request_sha256"): raise ValueError("Rollout request identity mismatch") prompts, samples = request["prompt_tokens"], request["sample_ids"] batch = len(prompts) if ( - batch not in (1, 4) + batch not in ((1,) if bi else (1, 4)) or len(samples) != batch or any(type(sample) is not int for sample in samples) or len(set(samples)) != batch ): raise ValueError("Rollout requires one or four uniquely identified samples") length = len(prompts[0]) - if length not in (8, 64, 256, 1024) or any(len(row) != length for row in prompts): + lengths = range(1, 1025) if bi else (8, 64, 256, 1024) + if length not in lengths or any(len(row) != length for row in prompts): raise ValueError("Rollout prompts must use one official matrix length") responses = request["response_tokens"] for rows in (prompts, responses or []): @@ -137,7 +140,9 @@ def validate_request(request): ): raise ValueError("Rollout execution or response offsets differ from the pinned contract") if responses is None: - if batch != 4 or chunks != [length] or request["consumed_input_tokens"] is not None: + if request["consumed_input_tokens"] is not None or ( + not bi and (batch != 4 or chunks != [length]) + ): raise ValueError("Only baseline B4 full prefill may define frozen responses") elif request["consumed_input_tokens"] != [ prompt + response[:-1] for prompt, response in zip(prompts, responses, strict=True) @@ -145,6 +150,10 @@ def validate_request(request): raise ValueError("Consumed input must end before response token sixteen") if any(type(layer) is not int or layer not in range(48) for layer in request["trace_layers"]): raise ValueError("Debug layer indices must be in [0,48)") + if bi: + validate_companions(request, length) + elif "companions" in request: + raise ValueError("Only a version 2 request may run companions") identity = request["identity"] if identity["architecture_layers"] != 48 or identity["topology"] != { "tp": 4, @@ -163,6 +172,37 @@ def validate_request(request): return batch, length +def validate_companions(request, length): + companions = request["companions"] + tokens, arrivals = request["companion_max_tokens"], request["arrival_steps"] + max_len = NATIVE_ROLLOUT_PROFILE["max_model_len"] + if ( + not isinstance(companions, list) + or len(companions) > NATIVE_ROLLOUT_PROFILE["max_num_seqs"] - 1 + or len(tokens) != len(companions) + or len(arrivals.get("companions", [])) != len(companions) + or type(arrivals.get("target")) is not int + or arrivals["target"] < 0 + or any(type(step) is not int or step < 0 for step in arrivals["companions"]) + or type(request["chunk_size"]) is not int + or request["chunk_size"] < 1 + or length + RESPONSE_LENGTH > max_len + ): + raise ValueError("Batch-invariance companions, arrivals or chunk size are malformed") + for prompt, count in zip(companions, tokens, strict=True): + if ( + not prompt + or type(count) is not int + or count < 1 + or len(prompt) + count > max_len + or any(type(token) is not int or not 0 <= token < 151936 for token in prompt) + ): + raise ValueError("A companion does not fit the pinned rollout profile") + + +RESPONSE_LENGTH = 16 + + def next_scheduled_tokens(computed, prompt_length, chunks): boundary = 0 for size in chunks: @@ -181,6 +221,12 @@ def schedule(self, throttle_prefills=False): active = [request for request in self.requests.values() if not request.is_finished()] if not active: return super().schedule(throttle_prefills) + if any( + (request.sampling_params.extra_args or {}).get("shared_bi_companion") is not None + or ((request.sampling_params.extra_args or {}).get("shared_l2") or {}).get("bi") + for request in active + ): + return self._schedule_batch_invariance(active, throttle_prefills) descriptors = [ (request.sampling_params.extra_args or {}).get("shared_l2") for request in active ] @@ -235,6 +281,82 @@ def schedule(self, throttle_prefills=False): ) return result + def _schedule_batch_invariance(self, active, throttle_prefills): + """One traced target keeps its exact chunk plan; companions fill the step. + + All requests of a cell are admitted before the first step (as for L2). + A request joins the waiting queue only at its ``arrival_step``, counted + in scheduled steps from the first one, so arrivals are reproducible + whatever the engine-core timing. Every prefilling request shares one + ``long_prefill_token_threshold``: the target's next planned chunk while + it prefills, the cell's chunk size otherwise. The target must get + exactly its planned token count at every step until it has consumed its + last input, and no request may be preempted. + """ + descriptors = {} + for request in self.requests.values(): + extra = request.sampling_params.extra_args or {} + descriptor = extra.get("shared_l2") or extra.get("shared_bi_companion") + if descriptor is None: + raise ValueError("Exact Qwen scheduler accepts only identified requests") + descriptors[request.request_id] = (request, descriptor, "shared_l2" in extra) + cells = {item[1]["request_sha256"] for item in descriptors.values()} + targets = [item for item in descriptors.values() if item[2]] + if len(cells) != 1 or len(targets) > 1: + raise ValueError("One batch-invariance cell runs exactly one traced target") + # Once the target has finished, the scheduler frees it; companions go on. + target, contract, _ = ( + targets[0] if targets else (None, *next(iter(descriptors.values()))[1:]) + ) + cell = contract["request_sha256"] + if getattr(self, "_bi_cell", None) != cell: + self._bi_cell, self._bi_step, self._bi_started = cell, 0, False + if not self._bi_started and len(descriptors) < contract["total_requests"]: + previous = self._pause_state + self._pause_state = PauseState.PAUSED_ALL + try: + result = super().schedule(throttle_prefills) + finally: + self._pause_state = previous + if result.total_num_scheduled_tokens: + raise RuntimeError("The native scheduler violated the cell admission barrier") + return result + self._bi_started = True + held = [ + r for r in self.waiting if descriptors[r.request_id][1]["arrival_step"] > self._bi_step + ] + if len(held) == len(self.waiting) and not self.running and held: + # Nothing can run before the next arrival: that arrival is now. + self._bi_step = min(descriptors[r.request_id][1]["arrival_step"] for r in held) + held = [r for r in held if descriptors[r.request_id][1]["arrival_step"] > self._bi_step] + self.waiting.remove_requests(held) + target_active = target is not None and not target.is_finished() and target not in held + count = None + if target_active: + count = next_scheduled_tokens( + target.num_computed_tokens, contract["prompt_length"], contract["prefill_chunks"] + ) + prefilling = target_active and target.num_computed_tokens < contract["prompt_length"] + self.scheduler_config.long_prefill_token_threshold = ( + count if prefilling else contract["chunk_size"] + ) + try: + result = super().schedule(throttle_prefills) + finally: + for request in held: + self.waiting.add_request(request) + if result.total_num_scheduled_tokens: + self._bi_step += 1 + if result.preempted_req_ids or ( + count is not None and result.num_scheduled_tokens.get(target.request_id) != count + ): + raise RuntimeError( + "exact_scheduler_mismatch: target expected " + f"{count}, actual {result.num_scheduled_tokens.get(target.request_id)}, " + f"preempted {sorted(result.preempted_req_ids)}" + ) + return result + class ForceFrozenTokens(AdapterLogitsProcessor): """Sampling-only teacher forcing; raw model logits are observed beforehand.""" @@ -243,6 +365,8 @@ def is_argmax_invariant(self): return False def new_req_logits_processor(self, params): + if (params.extra_args or {}).get("shared_bi_companion") is not None: + return None # companions generate greedily and are never traced descriptor = (params.extra_args or {}).get("shared_l2") if descriptor is None: raise ValueError("L2 sampling requires explicit request metadata") @@ -301,7 +425,11 @@ def __init__(self, worker, request, output_directory): ) self.row_by_sample = {sample: row for row, sample in enumerate(request["sample_ids"])} self.request_rows, self.progress = {}, {} - self.current, self.schedule = [], [] + # Batch-invariance requests run untraced companions next to the traced + # target; their tokens share every step but are never recorded. + self.companions = request.get("companions") + self.untraced = set() + self.current, self.current_index, self.packed, self.schedule = [], [], [], [] self.logits = torch.empty(self.batch, 16, 151936, dtype=torch.bfloat16) self.local_logits = torch.empty(self.batch, 16, 37984, dtype=torch.bfloat16) self.logprobs = torch.empty(self.batch, 16, dtype=torch.float32) @@ -339,7 +467,21 @@ def subnode(self, layer_index, name, packed): def before_execute(self, scheduled): for new in scheduled.scheduled_new_reqs: - descriptor = (new.sampling_params.extra_args or {}).get("shared_l2", {}) + extra = new.sampling_params.extra_args or {} + companion = extra.get("shared_bi_companion") + if companion is not None: + if ( + self.companions is None + or companion.get("request_sha256") != self.request["request_sha256"] + or new.prompt_token_ids != self.companions[companion["index"]] + or new.num_computed_tokens != 0 + or new.req_id in self.untraced + ): + raise ValueError("Untraced companion does not belong to this request") + self.untraced.add(new.req_id) + self.progress[new.req_id] = 0 + continue + descriptor = extra.get("shared_l2", {}) if descriptor.get("request_sha256") != self.request["request_sha256"]: raise ValueError("Scheduler request belongs to a different L2 case") row = self.row_by_sample[descriptor["sample_id"]] @@ -354,11 +496,29 @@ def before_execute(self, scheduled): self.scheduled = scheduled if not scheduled.total_num_scheduled_tokens: return - if len(scheduled.num_scheduled_tokens) != self.batch or scheduled.preempted_req_ids: + scheduled_ids = set(scheduled.num_scheduled_tokens) + traced = scheduled_ids & set(self.request_rows) + unfinished = { + req_id + for req_id in self.request_rows + if self.progress[req_id] < self.prompt_length + 15 + } + # A batch-invariance target may wait for its arrival step; once it has + # started it must take part in every step until its last input. + started = {req_id for req_id in unfinished if self.progress[req_id] > 0} + if ( + scheduled.preempted_req_ids + or scheduled_ids - traced - self.untraced + or (self.companions is None and len(traced) != self.batch) + or (self.companions is not None and not started <= traced <= unfinished) + ): raise RuntimeError("The actual native step did not preserve its required batch") step = {} for req_id, count in scheduled.num_scheduled_tokens.items(): computed = self.progress[req_id] + if req_id in self.untraced: + step[req_id] = (None, computed, count) + continue expected = next_scheduled_tokens( computed, self.prompt_length, self.request["prefill_chunks"] ) @@ -373,23 +533,31 @@ def begin_forward(self, input_ids, positions): ids = list(self.worker.model_runner.input_batch.req_ids) if set(ids) != set(self.step): raise ValueError("Actual model input batch differs from SchedulerOutput") - self.current = [] + self.current, self.current_index, self.packed = [], [], [] begin = 0 - for req_id in ids: + for index, req_id in enumerate(ids): row, computed, count = self.step[req_id] end = begin + count if positions[begin:end].cpu().tolist() != list(range(computed, computed + count)): raise ValueError("Native absolute positions differ from the scheduled offsets") + self.packed.append((begin, end, computed)) + if row is None: + self.progress[req_id] = computed + count + begin = end + continue known = self.request["prompt_tokens"][row] + self.responses[row].tolist() if input_ids[begin:end].cpu().tolist() != known[computed : computed + count]: raise ValueError( "Native engine consumed tokens other than the prompt/frozen response prefix" ) self.current.append((row, begin, end, computed)) + self.current_index.append(index) self.progress[req_id] = computed + count begin = end if begin != self.scheduled.total_num_scheduled_tokens: raise ValueError("Packed model input does not cover actual scheduled tokens") + if not self.current: + return self.schedule.append( { "samples": [self.request["sample_ids"][row] for row, _, _, _ in self.current], @@ -431,14 +599,16 @@ def layer(self, layer_index, output, layer): indices, cu, _reset = metadata_sequences( meta, self.scheduled.total_num_scheduled_tokens ) - if cu.tolist() != [0] + [end for _, _, end, _ in self.current]: + if cu.tolist() != [0] + [end for _, end, _ in self.packed]: raise ValueError("GDN metadata reordered sequences without matching model inputs") conv, recurrent = module.kv_cache if not is_conv_state_dim_first(): conv = conv.transpose(-1, -2) - for (row, begin, end, computed), slot in zip( - self.current, indices.tolist(), strict=True - ): + slots = indices.tolist() + if len(slots) != len(self.packed): + raise ValueError("GDN metadata does not cover every packed sequence") + for (row, begin, end, computed), index in zip(self.current, self.current_index): + slot = slots[index] if computed + end - begin == self.prompt_length + 15: self.states[layer_index]["convolution"][row] = conv[slot].detach().cpu().clone() self.states[layer_index]["recurrent_state"][row] = ( @@ -449,10 +619,10 @@ def layer(self, layer_index, output, layer): meta, cache = metadata[attention.layer_name], attention.kv_cache if not isinstance(meta, SharedAttentionMetadata): raise ValueError("Full attention did not use shared native paged-KV metadata") - if list(meta.query_start_loc) != [0] + [end for _, _, end, _ in self.current]: + if list(meta.query_start_loc) != [0] + [end for _, end, _ in self.packed]: raise ValueError("Full attention boundaries differ from actual packed input") block_size = cache.shape[2] - for index, (row, begin, end, computed) in enumerate(self.current): + for index, (row, begin, end, computed) in zip(self.current_index, self.current): length = computed + end - begin if length != self.prompt_length + 15: continue @@ -472,13 +642,13 @@ def record_logits(self, hidden, local, full): from rl_engine.integrations.qwen3_next_logprob import qwen_logprob_contract from rl_engine.kernels.logprob_contract import LogprobRole - if full.shape != (len(self.current), 151936) or local.shape != (len(self.current), 37984): + if full.shape != (len(self.packed), 151936) or local.shape != (len(self.packed), 37984): raise ValueError( "Native sampling rows do not correspond one-to-one with active requests" ) eligible = [ (index, row, computed + end - begin - self.prompt_length) - for index, (row, begin, end, computed) in enumerate(self.current) + for index, (row, begin, end, computed) in zip(self.current_index, self.current) if computed + end - begin >= self.prompt_length ] if not eligible: @@ -775,3 +945,102 @@ def run_rollout_cases(cases): def run_rollout_case(request, output): run_rollout_cases([(request, output)]) + + +def batch_invariance_descriptors(request): + """Scheduler descriptors for one version 2 request, in FCFS submission order.""" + common = { + "request_sha256": request["request_sha256"], + "total_requests": 1 + len(request["companions"]), + "chunk_size": request["chunk_size"], + } + responses = request["response_tokens"] + target = { + **common, + "bi": True, + "sample_id": request["sample_ids"][0], + "batch_size": 1, + "prompt_length": len(request["prompt_tokens"][0]), + "prefill_chunks": request["prefill_chunks"], + "response_tokens": None if responses is None else responses[0], + "arrival_step": request["arrival_steps"]["target"], + } + companions = [ + ( + prompt, + count, + { + **common, + "index": index, + "arrival_step": request["arrival_steps"]["companions"][index], + }, + ) + for index, (prompt, count) in enumerate( + zip(request["companions"], request["companion_max_tokens"], strict=True) + ) + ] + entries = [(request["prompt_tokens"][0], RESPONSE_LENGTH, target, "shared_l2")] + [ + (prompt, count, descriptor, "shared_bi_companion") + for prompt, count, descriptor in companions + ] + if request.get("target_last"): + entries = entries[1:] + entries[:1] + return entries + + +def run_batch_invariance_cases(cases): + """Run version 2 cells in one engine; each artifact describes the traced target only.""" + from vllm import SamplingParams + + engine, identity = None, None + try: + for request, output in cases: + validate_request(request) + if request["schema_version"] != 2: + raise ValueError("Batch-invariance cells use version 2 requests") + if engine is None: + identity = request["identity"] + engine = _new_engine(identity) + elif request["identity"] != identity: + raise ValueError("One native rollout process cannot change its identity") + output = Path(output).resolve() + records = engine.collective_rpc( + "configure_l2_trace", args=(request, str(output.with_suffix(".worker-traces"))) + ) + if len(records) != 4 or any( + record["request_sha256"] != request["request_sha256"] for record in records + ): + raise RuntimeError("All TP workers must acknowledge the exact trace request") + entries = batch_invariance_descriptors(request) + sampling = [ + SamplingParams( + temperature=0, + top_p=1, + top_k=-1, + seed=1234, + ignore_eos=True, + max_tokens=count, + detokenize=False, + extra_args={key: descriptor}, + ) + for _, count, descriptor, key in entries + ] + generated = engine.generate( + [{"prompt_token_ids": prompt} for prompt, _, _, _ in entries], + sampling, + use_tqdm=False, + ) + responses = None + for (prompt, count, _, key), item in zip(entries, generated, strict=True): + tokens = list(item.outputs[0].token_ids) + if item.prompt_token_ids != prompt or len(tokens) != count: + raise RuntimeError("Native engine did not complete every request of the cell") + if key == "shared_l2": + responses = [tokens] + records = engine.collective_rpc("collect_l2_trace") + save_tensor_artifact(output, assemble_trace(request, records, responses)) + finally: + if engine is not None: + engine.llm_engine.engine_core.shutdown() + del engine + gc.collect() diff --git a/rl_engine/kernels/gtest/forward_invariance.py b/rl_engine/kernels/gtest/forward_invariance.py index 04d6fed21..0937ce7ea 100644 --- a/rl_engine/kernels/gtest/forward_invariance.py +++ b/rl_engine/kernels/gtest/forward_invariance.py @@ -32,6 +32,7 @@ resolve_tolerance, validate_backend_provenance, ) +from rl_engine.testing.tensor_identity import tensor_bitwise_equal from rl_engine.testing.ws1_workload import ( LogicalBatch, PaddedBatch, @@ -349,7 +350,10 @@ def _compare_logical_tensors( rel_error = abs_error / canonical_fp32.abs().clamp_min(1e-12) max_rel = float(rel_error.max().item()) - passed = bool(torch.allclose(transformed_fp32, canonical_fp32, atol=atol, rtol=rtol)) + if spec.mode == "bitwise": + passed = tensor_bitwise_equal(transformed, canonical) + else: + passed = bool(torch.allclose(transformed_fp32, canonical_fp32, atol=atol, rtol=rtol)) return TensorComparisonDetail( tensor_name=tensor_name, diff --git a/rl_engine/kernels/gtest/qwen3_next_chain_report.py b/rl_engine/kernels/gtest/qwen3_next_chain_report.py index 3326dd0af..20fdbd621 100644 --- a/rl_engine/kernels/gtest/qwen3_next_chain_report.py +++ b/rl_engine/kernels/gtest/qwen3_next_chain_report.py @@ -117,11 +117,14 @@ def build_report( device: str, gpu_name: str | None, compute_capability: str | None, + bi_matrix: Mapping[str, Any] | None = None, ) -> dict[str, Any]: """Build the chain report from L2 matrices and their loaded case artifacts. ``matrices[version]`` is an ``l2-matrix.json`` report; ``artifacts[version] [case_id][role]`` is the loaded rollout/recompute artifact of that case. + ``bi_matrix`` (a ``bi-matrix.json`` from the batch-invariance stage) adds a + ``batch_invariance`` section and must pass for the report to pass. """ if not matrices or set(matrices) - set(WEIGHT_VERSIONS): raise ValueError(f"Weight versions must be a subset of {WEIGHT_VERSIONS}") @@ -204,6 +207,7 @@ def build_report( first is None and all(matrix["status"] == "passed" for matrix in matrices.values()) and all(item.passed for item in invariance) + and (bi_matrix is None or bi_matrix["status"] == "passed") ) report = ChainGateReport( backend_profile=PROFILE, @@ -264,5 +268,26 @@ def build_report( first_drift_cell=None if first is None else first[3], first_drift_layer=None if first is None else first[1], first_drift_family=None if first is None else first[2], + batch_invariance=None if bi_matrix is None else batch_invariance_section(bi_matrix), ) return payload + + +def batch_invariance_section(matrix: Mapping[str, Any]) -> dict[str, Any]: + """Per-family pass counts and the first failing cell of a ``bi-matrix.json``.""" + families: dict[str, dict[str, int]] = {} + for cell_id in matrix["cell_ids"]: + cell = matrix["cells"][cell_id] + counts = families.setdefault(cell["family"], {"cells": 0, "passed": 0}) + counts["cells"] += 1 + counts["passed"] += int(cell["passed"]) + first = matrix.get("first_failure") + return { + "suite": matrix["suite"], + "passed": matrix["status"] == "passed", + "families": families, + "first_failure": first, + "first_failure_family": ( + None if first is None else matrix["cells"][first]["first_drift_family"] + ), + } diff --git a/rl_engine/testing/qwen3_next_bi_cases.py b/rl_engine/testing/qwen3_next_bi_cases.py new file mode 100644 index 000000000..60004877b --- /dev/null +++ b/rl_engine/testing/qwen3_next_bi_cases.py @@ -0,0 +1,370 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Batch-invariance cells for the Qwen3-Next full model (RFC #428 ``batch_invariance_ci``). + +Every cell runs one *target* sequence through the native rollout, optionally +next to *companion* sequences, and compares the target bitwise - response +tokens, BF16 logits, FP32 logprobs, the embedding and every layer, sub-node +and recurrent/KV-state digest - with a *reference*: the same target, alone, +with the same prefill chunk plan. A cell passes only if nothing about the +target changed. Families: + +* ``concurrency`` - N = 1, 2, 4, 8, 16, 32, 64 requests in one engine, the + target first or last, all arriving together; +* ``interference`` - companion content, lengths and arrival (during the + target's prefill, during its decode, after it) varied around one target; +* ``chunk`` - the target alone across prefill chunk boundaries (prompt + lengths at and around 64, 128, 528 and 1024 tokens, chunk 64 or 128, first + chunk 1, 63 or 65), compared with the replay engine's full-sequence + recompute of the same tokens: the train/rollout boundary itself; +* ``packing`` - the replay engine packs the target with companions into one + THD sequence batch (offsets and padding varied) and the target must equal + its recompute alone. + +Prompts repeat the four pinned L2 texts to any length, so a cell is fully +determined by its parameters. :func:`cells` is pinned by +``qwen3_next_bi_manifest.json``. +""" + +from __future__ import annotations + +import hashlib +import json +from dataclasses import asdict, dataclass +from pathlib import Path + +from rl_engine.testing.qwen3_next_l2 import json_digest + +MANIFEST = Path(__file__).with_name("qwen3_next_bi_manifest.json") +MAX_MODEL_LEN = 1040 +RESPONSE_LENGTH = 16 +CONCURRENCY = (1, 2, 4, 8, 16, 32, 64) +CHUNK_PROMPTS = (63, 64, 65, 127, 128, 129, 527, 528, 529, 1023, 1024) +CHUNK_SIZES = (64, 128) +FIRST_CHUNKS = (1, 63, 65) + + +@dataclass(frozen=True) +class Sequence: + """One request: which pinned text it repeats, how long its prompt is, when it arrives.""" + + text: int + prompt_length: int + max_tokens: int = RESPONSE_LENGTH + arrival_step: int = 0 + offset: int = 0 + + +@dataclass(frozen=True) +class Cell: + cell_id: str + family: str + target: Sequence + first_chunk: int + chunk_size: int + companions: tuple[Sequence, ...] = () + target_last: bool = False + engine: str = "rollout" + + def chunk_plan(self): + """The target's exact prefill chunks: first chunk, then fixed chunks, then the rest.""" + remaining, plan = self.target.prompt_length, [] + size = min(self.first_chunk, remaining) + while remaining: + plan.append(size) + remaining -= size + size = min(self.chunk_size, remaining) + return plan + + def reference(self): + """The same target, alone, with the same chunk plan.""" + return Cell( + cell_id=f"ref-{self.target.text}-{self.target.prompt_length}" + f"-{self.target.offset}-{self.first_chunk}-{self.chunk_size}", + family="reference", + target=self.target, + first_chunk=self.first_chunk, + chunk_size=self.chunk_size, + engine=self.engine, + ) + + def to_dict(self): + return asdict(self) + + +def _companions(count, *, seed, lengths=(37, 256, 512, 1000), arrival=0, tokens=RESPONSE_LENGTH): + return tuple( + Sequence( + text=(seed + index) % 4, + prompt_length=lengths[(seed + index) % len(lengths)], + max_tokens=tokens, + arrival_step=arrival, + offset=7 * (index + 1), + ) + for index in range(count) + ) + + +def cells(): + out = [] + target = Sequence(text=0, prompt_length=256) + for n in CONCURRENCY: + for last in (False, True) if n > 1 else (False,): + out.append( + Cell( + cell_id=f"concurrency-n{n:02d}-{'last' if last else 'first'}", + family="concurrency", + target=target, + first_chunk=64, + chunk_size=64, + companions=_companions(n - 1, seed=n), + target_last=last, + ) + ) + interference = { + "same-text": _companions(3, seed=0, lengths=(256,)), + "short-companions": _companions(7, seed=1, lengths=(1, 2, 3, 5)), + "long-companions": _companions(3, seed=2, lengths=(1000, 1024)), + "mixed-lengths": _companions(15, seed=3, lengths=(8, 63, 129, 777, 1024)), + "arrive-in-prefill": _companions(4, seed=4, arrival=2), + "arrive-in-decode": _companions(4, seed=5, arrival=6), + # The 256-token target prefills in four steps and decodes in fifteen: step 18 + # is its last decode. + "arrive-at-last-decode": _companions(4, seed=6, arrival=18), + "long-generations": _companions(4, seed=7, tokens=24), + "single-token-generations": _companions(8, seed=8, tokens=1), + } + for name, companions in interference.items(): + out.append( + Cell( + cell_id=f"interference-{name}", + family="interference", + target=target, + first_chunk=64, + chunk_size=64, + companions=companions, + ) + ) + out.append( + Cell( + cell_id="interference-target-last-arrival", + family="interference", + target=Sequence(text=0, prompt_length=256, arrival_step=3), + first_chunk=64, + chunk_size=64, + companions=_companions(4, seed=9), + ) + ) + for prompt in CHUNK_PROMPTS: + for chunk in CHUNK_SIZES: + for first in FIRST_CHUNKS: + out.append( + Cell( + cell_id=f"chunk-p{prompt:04d}-c{chunk}-f{first:02d}", + family="chunk", + target=Sequence(text=prompt % 4, prompt_length=prompt), + first_chunk=first, + chunk_size=chunk, + ) + ) + packing = { + "two-sequences": _companions(1, seed=10), + "four-sequences": _companions(3, seed=11), + "eight-mixed": _companions(7, seed=12, lengths=(8, 63, 129, 777)), + "one-token-neighbours": _companions(3, seed=13, lengths=(1,)), + } + for name, companions in packing.items(): + for last in (False, True): + out.append( + Cell( + cell_id=f"packing-{name}-{'last' if last else 'first'}", + family="packing", + target=target, + first_chunk=target.prompt_length, + chunk_size=target.prompt_length, + companions=companions, + target_last=last, + engine="replay", + ) + ) + for cell in out: + validate(cell) + if len({cell.cell_id for cell in out}) != len(out): + raise ValueError("Batch-invariance cell IDs must be unique") + return out + + +def quick_cells(): + """A CI-sized subset: one cell per family, plus the largest concurrency.""" + keep = { + "concurrency-n04-last", + "concurrency-n64-first", + "interference-arrive-in-decode", + "chunk-p0129-c64-f63", + "packing-four-sequences-last", + } + return [cell for cell in cells() if cell.cell_id in keep] + + +def validate(cell): + sequences = (cell.target, *cell.companions) + if any( + s.prompt_length < 1 + or s.max_tokens < 1 + or s.prompt_length + s.max_tokens > MAX_MODEL_LEN + or s.text not in range(4) + or s.arrival_step < 0 + for s in sequences + ): + raise ValueError(f"{cell.cell_id}: a sequence does not fit the pinned rollout profile") + if cell.target.max_tokens != RESPONSE_LENGTH: + raise ValueError(f"{cell.cell_id}: the target always generates sixteen tokens") + if len(sequences) > 64: + raise ValueError(f"{cell.cell_id}: at most 64 concurrent requests are certified") + if cell.first_chunk < 1 or cell.chunk_size < 1: + raise ValueError(f"{cell.cell_id}: chunks must be positive") + if cell.engine not in ("rollout", "replay"): + raise ValueError(f"{cell.cell_id}: unknown engine {cell.engine}") + + +def prompt_tokens(encoded_texts, sequence): + """The pinned text ``sequence.text`` repeated, rotated by ``offset``, cut to length.""" + row = encoded_texts[sequence.text] + start = sequence.offset % len(row) + rotated = row[start:] + row[:start] + return (rotated * ((sequence.prompt_length + len(rotated) - 1) // len(rotated)))[ + : sequence.prompt_length + ] + + +def manifest_payload(): + entries = [cell.to_dict() for cell in cells()] + return { + "schema_version": 1, + "description": "Qwen3-Next batch-invariance cells; regenerate with " + "python -m rl_engine.testing.qwen3_next_bi_cases --write", + "cells": entries, + "cells_sha256": hashlib.sha256( + json.dumps(entries, sort_keys=True, separators=(",", ":")).encode() + ).hexdigest(), + } + + +def load_manifest(): + payload = json.loads(MANIFEST.read_text()) + if payload != json.loads(json.dumps(manifest_payload())): + raise ValueError("qwen3_next_bi_manifest.json differs from the generated cells") + return payload + + +if __name__ == "__main__": + import sys + + text = json.dumps(manifest_payload(), indent=2) + "\n" + if "--write" in sys.argv: + MANIFEST.write_text(text) + elif not MANIFEST.is_file() or MANIFEST.read_text() != text: + raise SystemExit("qwen3_next_bi_manifest.json is stale; rerun with --write") + + +# --------------------------------------------------------------------------- # +# Worker requests +# --------------------------------------------------------------------------- # + + +def _common(case_id, role, identity, prompt, responses, trace_layers): + length = len(prompt) + return { + "case_id": case_id, + "role": role, + "identity": identity, + "sample_ids": [0], + "prompt_tokens": [prompt], + "response_tokens": None if responses is None else [responses], + "response_length": RESPONSE_LENGTH, + "prediction_positions": list(range(length - 1, length + RESPONSE_LENGTH - 1)), + "consumed_response_tokens": RESPONSE_LENGTH - 1, + "consumed_input_tokens": None if responses is None else [prompt + responses[:-1]], + "state_position": length + RESPONSE_LENGTH - 2, + "logits_dtype": "bfloat16", + "logprobs_dtype": "float32", + "vocab_size": 151936, + "trace_layers": list(trace_layers or []), + "required_layer_digests": list(range(48)), + "generation": { + "temperature": 0.0, + "top_p": 1.0, + "top_k": -1, + "seed": 1234, + "ignore_eos": True, + }, + } + + +def rollout_request(cell, encoded_texts, identity, *, trace_layers=None): + """Version 2 rollout request: the generating target plus untraced companions.""" + if cell.engine != "rollout": + raise ValueError(f"{cell.cell_id} is not a rollout cell") + plan = cell.chunk_plan() + request = { + "schema_version": 2, + **_common( + cell.cell_id, + "rollout", + identity, + prompt_tokens(encoded_texts, cell.target), + None, + trace_layers, + ), + "rollout_prefill_chunks": plan, + "prefill_chunks": plan, + "execution": { + "rollout_mode": "autoregressive", + "prefill_chunks": plan, + "response_mode": "generate", + }, + "companions": [prompt_tokens(encoded_texts, s) for s in cell.companions], + "companion_max_tokens": [s.max_tokens for s in cell.companions], + "arrival_steps": { + "target": cell.target.arrival_step, + "companions": [s.arrival_step for s in cell.companions], + }, + "chunk_size": cell.chunk_size, + "target_last": cell.target_last, + } + request["request_sha256"] = json_digest(request) + return request + + +def replay_request(case_id, prompt, responses, identity, *, packing=None, trace_layers=None): + """Version 1 recompute request for one target; ``packing`` adds untraced neighbours.""" + if len(responses) != RESPONSE_LENGTH: + raise ValueError("Replay needs the target's sixteen response tokens") + request = { + "schema_version": 1, + **_common(case_id, "recompute", identity, prompt, responses, trace_layers), + "rollout_prefill_chunks": [len(prompt)], + "prefill_chunks": None, + "execution": { + "recompute_mode": "full_from_tokens", + "input_sequence_length": len(prompt) + RESPONSE_LENGTH - 1, + }, + } + if packing is not None: + request["packing"] = packing + request["request_sha256"] = json_digest(request) + return request + + +def packing_layout(cell, encoded_texts, target_tokens): + """The replay packing of one cell: neighbours are prompt plus continuation tokens.""" + neighbours = [ + prompt_tokens( + encoded_texts, + Sequence(s.text, s.prompt_length + s.max_tokens - 1, offset=s.offset), + ) + for s in cell.companions + ] + sequences = (neighbours + [target_tokens]) if cell.target_last else [target_tokens, *neighbours] + return {"sequences": sequences, "target_index": len(neighbours) if cell.target_last else 0} diff --git a/rl_engine/testing/qwen3_next_bi_manifest.json b/rl_engine/testing/qwen3_next_bi_manifest.json new file mode 100644 index 000000000..182f4d196 --- /dev/null +++ b/rl_engine/testing/qwen3_next_bi_manifest.json @@ -0,0 +1,3857 @@ +{ + "schema_version": 1, + "description": "Qwen3-Next batch-invariance cells; regenerate with python -m rl_engine.testing.qwen3_next_bi_cases --write", + "cells": [ + { + "cell_id": "concurrency-n01-first", + "family": "concurrency", + "target": { + "text": 0, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 64, + "chunk_size": 64, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "concurrency-n02-first", + "family": "concurrency", + "target": { + "text": 0, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 64, + "chunk_size": 64, + "companions": [ + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 7 + } + ], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "concurrency-n02-last", + "family": "concurrency", + "target": { + "text": 0, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 64, + "chunk_size": 64, + "companions": [ + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 7 + } + ], + "target_last": true, + "engine": "rollout" + }, + { + "cell_id": "concurrency-n04-first", + "family": "concurrency", + "target": { + "text": 0, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 64, + "chunk_size": 64, + "companions": [ + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 7 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 14 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 21 + } + ], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "concurrency-n04-last", + "family": "concurrency", + "target": { + "text": 0, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 64, + "chunk_size": 64, + "companions": [ + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 7 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 14 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 21 + } + ], + "target_last": true, + "engine": "rollout" + }, + { + "cell_id": "concurrency-n08-first", + "family": "concurrency", + "target": { + "text": 0, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 64, + "chunk_size": 64, + "companions": [ + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 7 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 14 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 21 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 28 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 35 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 42 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 49 + } + ], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "concurrency-n08-last", + "family": "concurrency", + "target": { + "text": 0, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 64, + "chunk_size": 64, + "companions": [ + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 7 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 14 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 21 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 28 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 35 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 42 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 49 + } + ], + "target_last": true, + "engine": "rollout" + }, + { + "cell_id": "concurrency-n16-first", + "family": "concurrency", + "target": { + "text": 0, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 64, + "chunk_size": 64, + "companions": [ + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 7 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 14 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 21 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 28 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 35 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 42 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 49 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 56 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 63 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 70 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 77 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 84 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 91 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 98 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 105 + } + ], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "concurrency-n16-last", + "family": "concurrency", + "target": { + "text": 0, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 64, + "chunk_size": 64, + "companions": [ + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 7 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 14 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 21 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 28 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 35 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 42 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 49 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 56 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 63 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 70 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 77 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 84 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 91 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 98 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 105 + } + ], + "target_last": true, + "engine": "rollout" + }, + { + "cell_id": "concurrency-n32-first", + "family": "concurrency", + "target": { + "text": 0, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 64, + "chunk_size": 64, + "companions": [ + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 7 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 14 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 21 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 28 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 35 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 42 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 49 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 56 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 63 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 70 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 77 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 84 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 91 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 98 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 105 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 112 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 119 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 126 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 133 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 140 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 147 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 154 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 161 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 168 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 175 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 182 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 189 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 196 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 203 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 210 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 217 + } + ], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "concurrency-n32-last", + "family": "concurrency", + "target": { + "text": 0, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 64, + "chunk_size": 64, + "companions": [ + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 7 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 14 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 21 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 28 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 35 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 42 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 49 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 56 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 63 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 70 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 77 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 84 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 91 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 98 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 105 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 112 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 119 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 126 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 133 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 140 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 147 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 154 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 161 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 168 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 175 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 182 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 189 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 196 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 203 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 210 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 217 + } + ], + "target_last": true, + "engine": "rollout" + }, + { + "cell_id": "concurrency-n64-first", + "family": "concurrency", + "target": { + "text": 0, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 64, + "chunk_size": 64, + "companions": [ + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 7 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 14 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 21 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 28 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 35 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 42 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 49 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 56 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 63 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 70 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 77 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 84 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 91 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 98 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 105 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 112 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 119 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 126 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 133 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 140 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 147 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 154 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 161 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 168 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 175 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 182 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 189 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 196 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 203 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 210 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 217 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 224 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 231 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 238 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 245 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 252 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 259 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 266 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 273 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 280 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 287 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 294 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 301 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 308 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 315 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 322 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 329 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 336 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 343 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 350 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 357 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 364 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 371 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 378 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 385 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 392 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 399 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 406 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 413 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 420 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 427 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 434 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 441 + } + ], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "concurrency-n64-last", + "family": "concurrency", + "target": { + "text": 0, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 64, + "chunk_size": 64, + "companions": [ + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 7 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 14 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 21 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 28 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 35 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 42 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 49 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 56 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 63 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 70 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 77 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 84 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 91 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 98 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 105 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 112 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 119 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 126 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 133 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 140 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 147 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 154 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 161 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 168 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 175 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 182 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 189 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 196 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 203 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 210 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 217 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 224 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 231 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 238 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 245 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 252 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 259 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 266 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 273 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 280 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 287 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 294 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 301 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 308 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 315 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 322 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 329 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 336 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 343 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 350 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 357 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 364 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 371 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 378 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 385 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 392 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 399 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 406 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 413 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 420 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 427 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 434 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 441 + } + ], + "target_last": true, + "engine": "rollout" + }, + { + "cell_id": "interference-same-text", + "family": "interference", + "target": { + "text": 0, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 64, + "chunk_size": 64, + "companions": [ + { + "text": 0, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 7 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 14 + }, + { + "text": 2, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 21 + } + ], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "interference-short-companions", + "family": "interference", + "target": { + "text": 0, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 64, + "chunk_size": 64, + "companions": [ + { + "text": 1, + "prompt_length": 2, + "max_tokens": 16, + "arrival_step": 0, + "offset": 7 + }, + { + "text": 2, + "prompt_length": 3, + "max_tokens": 16, + "arrival_step": 0, + "offset": 14 + }, + { + "text": 3, + "prompt_length": 5, + "max_tokens": 16, + "arrival_step": 0, + "offset": 21 + }, + { + "text": 0, + "prompt_length": 1, + "max_tokens": 16, + "arrival_step": 0, + "offset": 28 + }, + { + "text": 1, + "prompt_length": 2, + "max_tokens": 16, + "arrival_step": 0, + "offset": 35 + }, + { + "text": 2, + "prompt_length": 3, + "max_tokens": 16, + "arrival_step": 0, + "offset": 42 + }, + { + "text": 3, + "prompt_length": 5, + "max_tokens": 16, + "arrival_step": 0, + "offset": 49 + } + ], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "interference-long-companions", + "family": "interference", + "target": { + "text": 0, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 64, + "chunk_size": 64, + "companions": [ + { + "text": 2, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 7 + }, + { + "text": 3, + "prompt_length": 1024, + "max_tokens": 16, + "arrival_step": 0, + "offset": 14 + }, + { + "text": 0, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 21 + } + ], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "interference-mixed-lengths", + "family": "interference", + "target": { + "text": 0, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 64, + "chunk_size": 64, + "companions": [ + { + "text": 3, + "prompt_length": 777, + "max_tokens": 16, + "arrival_step": 0, + "offset": 7 + }, + { + "text": 0, + "prompt_length": 1024, + "max_tokens": 16, + "arrival_step": 0, + "offset": 14 + }, + { + "text": 1, + "prompt_length": 8, + "max_tokens": 16, + "arrival_step": 0, + "offset": 21 + }, + { + "text": 2, + "prompt_length": 63, + "max_tokens": 16, + "arrival_step": 0, + "offset": 28 + }, + { + "text": 3, + "prompt_length": 129, + "max_tokens": 16, + "arrival_step": 0, + "offset": 35 + }, + { + "text": 0, + "prompt_length": 777, + "max_tokens": 16, + "arrival_step": 0, + "offset": 42 + }, + { + "text": 1, + "prompt_length": 1024, + "max_tokens": 16, + "arrival_step": 0, + "offset": 49 + }, + { + "text": 2, + "prompt_length": 8, + "max_tokens": 16, + "arrival_step": 0, + "offset": 56 + }, + { + "text": 3, + "prompt_length": 63, + "max_tokens": 16, + "arrival_step": 0, + "offset": 63 + }, + { + "text": 0, + "prompt_length": 129, + "max_tokens": 16, + "arrival_step": 0, + "offset": 70 + }, + { + "text": 1, + "prompt_length": 777, + "max_tokens": 16, + "arrival_step": 0, + "offset": 77 + }, + { + "text": 2, + "prompt_length": 1024, + "max_tokens": 16, + "arrival_step": 0, + "offset": 84 + }, + { + "text": 3, + "prompt_length": 8, + "max_tokens": 16, + "arrival_step": 0, + "offset": 91 + }, + { + "text": 0, + "prompt_length": 63, + "max_tokens": 16, + "arrival_step": 0, + "offset": 98 + }, + { + "text": 1, + "prompt_length": 129, + "max_tokens": 16, + "arrival_step": 0, + "offset": 105 + } + ], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "interference-arrive-in-prefill", + "family": "interference", + "target": { + "text": 0, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 64, + "chunk_size": 64, + "companions": [ + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 2, + "offset": 7 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 2, + "offset": 14 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 2, + "offset": 21 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 2, + "offset": 28 + } + ], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "interference-arrive-in-decode", + "family": "interference", + "target": { + "text": 0, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 64, + "chunk_size": 64, + "companions": [ + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 6, + "offset": 7 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 6, + "offset": 14 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 6, + "offset": 21 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 6, + "offset": 28 + } + ], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "interference-arrive-at-last-decode", + "family": "interference", + "target": { + "text": 0, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 64, + "chunk_size": 64, + "companions": [ + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 18, + "offset": 7 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 18, + "offset": 14 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 18, + "offset": 21 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 18, + "offset": 28 + } + ], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "interference-long-generations", + "family": "interference", + "target": { + "text": 0, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 64, + "chunk_size": 64, + "companions": [ + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 24, + "arrival_step": 0, + "offset": 7 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 24, + "arrival_step": 0, + "offset": 14 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 24, + "arrival_step": 0, + "offset": 21 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 24, + "arrival_step": 0, + "offset": 28 + } + ], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "interference-single-token-generations", + "family": "interference", + "target": { + "text": 0, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 64, + "chunk_size": 64, + "companions": [ + { + "text": 0, + "prompt_length": 37, + "max_tokens": 1, + "arrival_step": 0, + "offset": 7 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 1, + "arrival_step": 0, + "offset": 14 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 1, + "arrival_step": 0, + "offset": 21 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 1, + "arrival_step": 0, + "offset": 28 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 1, + "arrival_step": 0, + "offset": 35 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 1, + "arrival_step": 0, + "offset": 42 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 1, + "arrival_step": 0, + "offset": 49 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 1, + "arrival_step": 0, + "offset": 56 + } + ], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "interference-target-last-arrival", + "family": "interference", + "target": { + "text": 0, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 3, + "offset": 0 + }, + "first_chunk": 64, + "chunk_size": 64, + "companions": [ + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 7 + }, + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 14 + }, + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 21 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 28 + } + ], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0063-c64-f01", + "family": "chunk", + "target": { + "text": 3, + "prompt_length": 63, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 1, + "chunk_size": 64, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0063-c64-f63", + "family": "chunk", + "target": { + "text": 3, + "prompt_length": 63, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 63, + "chunk_size": 64, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0063-c64-f65", + "family": "chunk", + "target": { + "text": 3, + "prompt_length": 63, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 65, + "chunk_size": 64, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0063-c128-f01", + "family": "chunk", + "target": { + "text": 3, + "prompt_length": 63, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 1, + "chunk_size": 128, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0063-c128-f63", + "family": "chunk", + "target": { + "text": 3, + "prompt_length": 63, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 63, + "chunk_size": 128, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0063-c128-f65", + "family": "chunk", + "target": { + "text": 3, + "prompt_length": 63, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 65, + "chunk_size": 128, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0064-c64-f01", + "family": "chunk", + "target": { + "text": 0, + "prompt_length": 64, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 1, + "chunk_size": 64, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0064-c64-f63", + "family": "chunk", + "target": { + "text": 0, + "prompt_length": 64, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 63, + "chunk_size": 64, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0064-c64-f65", + "family": "chunk", + "target": { + "text": 0, + "prompt_length": 64, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 65, + "chunk_size": 64, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0064-c128-f01", + "family": "chunk", + "target": { + "text": 0, + "prompt_length": 64, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 1, + "chunk_size": 128, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0064-c128-f63", + "family": "chunk", + "target": { + "text": 0, + "prompt_length": 64, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 63, + "chunk_size": 128, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0064-c128-f65", + "family": "chunk", + "target": { + "text": 0, + "prompt_length": 64, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 65, + "chunk_size": 128, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0065-c64-f01", + "family": "chunk", + "target": { + "text": 1, + "prompt_length": 65, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 1, + "chunk_size": 64, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0065-c64-f63", + "family": "chunk", + "target": { + "text": 1, + "prompt_length": 65, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 63, + "chunk_size": 64, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0065-c64-f65", + "family": "chunk", + "target": { + "text": 1, + "prompt_length": 65, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 65, + "chunk_size": 64, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0065-c128-f01", + "family": "chunk", + "target": { + "text": 1, + "prompt_length": 65, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 1, + "chunk_size": 128, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0065-c128-f63", + "family": "chunk", + "target": { + "text": 1, + "prompt_length": 65, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 63, + "chunk_size": 128, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0065-c128-f65", + "family": "chunk", + "target": { + "text": 1, + "prompt_length": 65, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 65, + "chunk_size": 128, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0127-c64-f01", + "family": "chunk", + "target": { + "text": 3, + "prompt_length": 127, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 1, + "chunk_size": 64, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0127-c64-f63", + "family": "chunk", + "target": { + "text": 3, + "prompt_length": 127, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 63, + "chunk_size": 64, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0127-c64-f65", + "family": "chunk", + "target": { + "text": 3, + "prompt_length": 127, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 65, + "chunk_size": 64, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0127-c128-f01", + "family": "chunk", + "target": { + "text": 3, + "prompt_length": 127, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 1, + "chunk_size": 128, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0127-c128-f63", + "family": "chunk", + "target": { + "text": 3, + "prompt_length": 127, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 63, + "chunk_size": 128, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0127-c128-f65", + "family": "chunk", + "target": { + "text": 3, + "prompt_length": 127, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 65, + "chunk_size": 128, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0128-c64-f01", + "family": "chunk", + "target": { + "text": 0, + "prompt_length": 128, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 1, + "chunk_size": 64, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0128-c64-f63", + "family": "chunk", + "target": { + "text": 0, + "prompt_length": 128, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 63, + "chunk_size": 64, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0128-c64-f65", + "family": "chunk", + "target": { + "text": 0, + "prompt_length": 128, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 65, + "chunk_size": 64, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0128-c128-f01", + "family": "chunk", + "target": { + "text": 0, + "prompt_length": 128, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 1, + "chunk_size": 128, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0128-c128-f63", + "family": "chunk", + "target": { + "text": 0, + "prompt_length": 128, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 63, + "chunk_size": 128, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0128-c128-f65", + "family": "chunk", + "target": { + "text": 0, + "prompt_length": 128, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 65, + "chunk_size": 128, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0129-c64-f01", + "family": "chunk", + "target": { + "text": 1, + "prompt_length": 129, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 1, + "chunk_size": 64, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0129-c64-f63", + "family": "chunk", + "target": { + "text": 1, + "prompt_length": 129, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 63, + "chunk_size": 64, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0129-c64-f65", + "family": "chunk", + "target": { + "text": 1, + "prompt_length": 129, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 65, + "chunk_size": 64, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0129-c128-f01", + "family": "chunk", + "target": { + "text": 1, + "prompt_length": 129, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 1, + "chunk_size": 128, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0129-c128-f63", + "family": "chunk", + "target": { + "text": 1, + "prompt_length": 129, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 63, + "chunk_size": 128, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0129-c128-f65", + "family": "chunk", + "target": { + "text": 1, + "prompt_length": 129, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 65, + "chunk_size": 128, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0527-c64-f01", + "family": "chunk", + "target": { + "text": 3, + "prompt_length": 527, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 1, + "chunk_size": 64, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0527-c64-f63", + "family": "chunk", + "target": { + "text": 3, + "prompt_length": 527, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 63, + "chunk_size": 64, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0527-c64-f65", + "family": "chunk", + "target": { + "text": 3, + "prompt_length": 527, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 65, + "chunk_size": 64, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0527-c128-f01", + "family": "chunk", + "target": { + "text": 3, + "prompt_length": 527, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 1, + "chunk_size": 128, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0527-c128-f63", + "family": "chunk", + "target": { + "text": 3, + "prompt_length": 527, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 63, + "chunk_size": 128, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0527-c128-f65", + "family": "chunk", + "target": { + "text": 3, + "prompt_length": 527, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 65, + "chunk_size": 128, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0528-c64-f01", + "family": "chunk", + "target": { + "text": 0, + "prompt_length": 528, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 1, + "chunk_size": 64, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0528-c64-f63", + "family": "chunk", + "target": { + "text": 0, + "prompt_length": 528, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 63, + "chunk_size": 64, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0528-c64-f65", + "family": "chunk", + "target": { + "text": 0, + "prompt_length": 528, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 65, + "chunk_size": 64, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0528-c128-f01", + "family": "chunk", + "target": { + "text": 0, + "prompt_length": 528, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 1, + "chunk_size": 128, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0528-c128-f63", + "family": "chunk", + "target": { + "text": 0, + "prompt_length": 528, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 63, + "chunk_size": 128, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0528-c128-f65", + "family": "chunk", + "target": { + "text": 0, + "prompt_length": 528, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 65, + "chunk_size": 128, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0529-c64-f01", + "family": "chunk", + "target": { + "text": 1, + "prompt_length": 529, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 1, + "chunk_size": 64, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0529-c64-f63", + "family": "chunk", + "target": { + "text": 1, + "prompt_length": 529, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 63, + "chunk_size": 64, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0529-c64-f65", + "family": "chunk", + "target": { + "text": 1, + "prompt_length": 529, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 65, + "chunk_size": 64, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0529-c128-f01", + "family": "chunk", + "target": { + "text": 1, + "prompt_length": 529, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 1, + "chunk_size": 128, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0529-c128-f63", + "family": "chunk", + "target": { + "text": 1, + "prompt_length": 529, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 63, + "chunk_size": 128, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p0529-c128-f65", + "family": "chunk", + "target": { + "text": 1, + "prompt_length": 529, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 65, + "chunk_size": 128, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p1023-c64-f01", + "family": "chunk", + "target": { + "text": 3, + "prompt_length": 1023, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 1, + "chunk_size": 64, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p1023-c64-f63", + "family": "chunk", + "target": { + "text": 3, + "prompt_length": 1023, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 63, + "chunk_size": 64, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p1023-c64-f65", + "family": "chunk", + "target": { + "text": 3, + "prompt_length": 1023, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 65, + "chunk_size": 64, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p1023-c128-f01", + "family": "chunk", + "target": { + "text": 3, + "prompt_length": 1023, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 1, + "chunk_size": 128, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p1023-c128-f63", + "family": "chunk", + "target": { + "text": 3, + "prompt_length": 1023, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 63, + "chunk_size": 128, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p1023-c128-f65", + "family": "chunk", + "target": { + "text": 3, + "prompt_length": 1023, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 65, + "chunk_size": 128, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p1024-c64-f01", + "family": "chunk", + "target": { + "text": 0, + "prompt_length": 1024, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 1, + "chunk_size": 64, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p1024-c64-f63", + "family": "chunk", + "target": { + "text": 0, + "prompt_length": 1024, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 63, + "chunk_size": 64, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p1024-c64-f65", + "family": "chunk", + "target": { + "text": 0, + "prompt_length": 1024, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 65, + "chunk_size": 64, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p1024-c128-f01", + "family": "chunk", + "target": { + "text": 0, + "prompt_length": 1024, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 1, + "chunk_size": 128, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p1024-c128-f63", + "family": "chunk", + "target": { + "text": 0, + "prompt_length": 1024, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 63, + "chunk_size": 128, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "chunk-p1024-c128-f65", + "family": "chunk", + "target": { + "text": 0, + "prompt_length": 1024, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 65, + "chunk_size": 128, + "companions": [], + "target_last": false, + "engine": "rollout" + }, + { + "cell_id": "packing-two-sequences-first", + "family": "packing", + "target": { + "text": 0, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 256, + "chunk_size": 256, + "companions": [ + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 7 + } + ], + "target_last": false, + "engine": "replay" + }, + { + "cell_id": "packing-two-sequences-last", + "family": "packing", + "target": { + "text": 0, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 256, + "chunk_size": 256, + "companions": [ + { + "text": 2, + "prompt_length": 512, + "max_tokens": 16, + "arrival_step": 0, + "offset": 7 + } + ], + "target_last": true, + "engine": "replay" + }, + { + "cell_id": "packing-four-sequences-first", + "family": "packing", + "target": { + "text": 0, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 256, + "chunk_size": 256, + "companions": [ + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 7 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 14 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 21 + } + ], + "target_last": false, + "engine": "replay" + }, + { + "cell_id": "packing-four-sequences-last", + "family": "packing", + "target": { + "text": 0, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 256, + "chunk_size": 256, + "companions": [ + { + "text": 3, + "prompt_length": 1000, + "max_tokens": 16, + "arrival_step": 0, + "offset": 7 + }, + { + "text": 0, + "prompt_length": 37, + "max_tokens": 16, + "arrival_step": 0, + "offset": 14 + }, + { + "text": 1, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 21 + } + ], + "target_last": true, + "engine": "replay" + }, + { + "cell_id": "packing-eight-mixed-first", + "family": "packing", + "target": { + "text": 0, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 256, + "chunk_size": 256, + "companions": [ + { + "text": 0, + "prompt_length": 8, + "max_tokens": 16, + "arrival_step": 0, + "offset": 7 + }, + { + "text": 1, + "prompt_length": 63, + "max_tokens": 16, + "arrival_step": 0, + "offset": 14 + }, + { + "text": 2, + "prompt_length": 129, + "max_tokens": 16, + "arrival_step": 0, + "offset": 21 + }, + { + "text": 3, + "prompt_length": 777, + "max_tokens": 16, + "arrival_step": 0, + "offset": 28 + }, + { + "text": 0, + "prompt_length": 8, + "max_tokens": 16, + "arrival_step": 0, + "offset": 35 + }, + { + "text": 1, + "prompt_length": 63, + "max_tokens": 16, + "arrival_step": 0, + "offset": 42 + }, + { + "text": 2, + "prompt_length": 129, + "max_tokens": 16, + "arrival_step": 0, + "offset": 49 + } + ], + "target_last": false, + "engine": "replay" + }, + { + "cell_id": "packing-eight-mixed-last", + "family": "packing", + "target": { + "text": 0, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 256, + "chunk_size": 256, + "companions": [ + { + "text": 0, + "prompt_length": 8, + "max_tokens": 16, + "arrival_step": 0, + "offset": 7 + }, + { + "text": 1, + "prompt_length": 63, + "max_tokens": 16, + "arrival_step": 0, + "offset": 14 + }, + { + "text": 2, + "prompt_length": 129, + "max_tokens": 16, + "arrival_step": 0, + "offset": 21 + }, + { + "text": 3, + "prompt_length": 777, + "max_tokens": 16, + "arrival_step": 0, + "offset": 28 + }, + { + "text": 0, + "prompt_length": 8, + "max_tokens": 16, + "arrival_step": 0, + "offset": 35 + }, + { + "text": 1, + "prompt_length": 63, + "max_tokens": 16, + "arrival_step": 0, + "offset": 42 + }, + { + "text": 2, + "prompt_length": 129, + "max_tokens": 16, + "arrival_step": 0, + "offset": 49 + } + ], + "target_last": true, + "engine": "replay" + }, + { + "cell_id": "packing-one-token-neighbours-first", + "family": "packing", + "target": { + "text": 0, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 256, + "chunk_size": 256, + "companions": [ + { + "text": 1, + "prompt_length": 1, + "max_tokens": 16, + "arrival_step": 0, + "offset": 7 + }, + { + "text": 2, + "prompt_length": 1, + "max_tokens": 16, + "arrival_step": 0, + "offset": 14 + }, + { + "text": 3, + "prompt_length": 1, + "max_tokens": 16, + "arrival_step": 0, + "offset": 21 + } + ], + "target_last": false, + "engine": "replay" + }, + { + "cell_id": "packing-one-token-neighbours-last", + "family": "packing", + "target": { + "text": 0, + "prompt_length": 256, + "max_tokens": 16, + "arrival_step": 0, + "offset": 0 + }, + "first_chunk": 256, + "chunk_size": 256, + "companions": [ + { + "text": 1, + "prompt_length": 1, + "max_tokens": 16, + "arrival_step": 0, + "offset": 7 + }, + { + "text": 2, + "prompt_length": 1, + "max_tokens": 16, + "arrival_step": 0, + "offset": 14 + }, + { + "text": 3, + "prompt_length": 1, + "max_tokens": 16, + "arrival_step": 0, + "offset": 21 + } + ], + "target_last": true, + "engine": "replay" + } + ], + "cells_sha256": "f4709588a5d1e4fdceffc74df74d8c5980f8321e484906324e507d5b55ebcfae" +} diff --git a/scripts/qwen3_next_batch_invariance.py b/scripts/qwen3_next_batch_invariance.py new file mode 100644 index 000000000..df9381dac --- /dev/null +++ b/scripts/qwen3_next_batch_invariance.py @@ -0,0 +1,337 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Stage ``bi``: the Qwen3-Next batch-invariance matrix (RFC #428 ``batch_invariance_ci``). + +Runs after a passed ``l2`` stage, under the same certified provider profile +(``VLLM_BATCH_INVARIANT=1``). The cells are ``rl_engine/testing/qwen3_next_bi_cases.py`` +(pinned by ``qwen3_next_bi_manifest.json``); ``bi_suite: quick`` in the manifest +runs the CI subset. Two independent worker processes, as in ``l2``: + +1. rollout: every rollout cell and its reference (the target alone, same chunk + plan) in one native vLLM engine; the target generates its sixteen tokens; +2. replay: for every ``chunk`` cell, the VIME recompute of the target's tokens; + for every ``packing`` cell, the target packed with its neighbours and alone. + +Then, bitwise on response tokens, logits, logprobs, the embedding and every +layer, sub-node and state digest: concurrency and interference cells against +their reference, chunk cells against their replay, packing cells against the +replay alone. ``bi-matrix.json`` records every cell, the first divergence and +its layer family. +""" + +import argparse +import json +import os +import shutil +import sys +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT)) +sys.path.insert(0, str(ROOT / "scripts")) + +from qwen3_next_contract import evidence_record, result_envelope, validate_result # noqa: E402 +from qwen3_next_l2 import ( # noqa: E402 + check_ready, + model_identity, + run_process, + verify_before_model_load, + wait_gpu_release, +) +from qwen3_next_runtime import ( # noqa: E402 + atomic_json, + failure_fields, + file_digest, + memory_limits, + parse_memory_request, + require_predecessor, + verify_environment, +) + +from rl_engine.kernels.gtest.qwen3_next_chain_report import family_of # noqa: E402 +from rl_engine.testing import qwen3_next_bi_cases as bi # noqa: E402 +from rl_engine.testing.qwen3_next_binary import ( # noqa: E402 + archive_provider_binary, + validate_binary_record, + verify_imported_provider, +) +from rl_engine.testing.qwen3_next_l2 import ( # noqa: E402 + FROZEN_TEXTS, + compare_artifacts, + compare_batch_prefill, + first_divergent_node, + load_tensor_artifact, + validate_model_artifact, +) + + +def suite_cells(manifest): + suite = manifest.get("bi_suite", "full") + if suite not in ("full", "quick"): + raise ValueError(f"Unknown batch-invariance suite {suite!r}") + bi.load_manifest() + return bi.quick_cells() if suite == "quick" else bi.cells() + + +def encoded_texts(manifest): + from transformers import AutoTokenizer + + tokenizer = AutoTokenizer.from_pretrained( + manifest["checkpoint"], local_files_only=True, trust_remote_code=False + ) + return [tokenizer.encode(text, add_special_tokens=False) for text in FROZEN_TEXTS] + + +def packing_source(cell): + """The rollout that defines a packing cell's target tokens: the target alone, 64/64.""" + return bi.Cell( + cell_id=cell.cell_id, + family=cell.family, + target=cell.target, + first_chunk=64, + chunk_size=64, + ).reference() + + +def rollout_requests(manifest, cells): + """References first, each once; then every rollout cell.""" + texts, identity = encoded_texts(manifest), model_identity(manifest) + requests, seen = [], set() + for cell in cells: + reference = packing_source(cell) if cell.engine == "replay" else cell.reference() + for item in (reference, cell): + if item.engine == "rollout" and item.cell_id not in seen: + seen.add(item.cell_id) + requests.append(bi.rollout_request(item, texts, identity)) + return requests + + +def replay_requests(manifest, cells, rollout_dir): + """Chunk-cell replays and packing cells (each with its unpacked replay).""" + texts, identity = encoded_texts(manifest), model_identity(manifest) + requests, seen = [], set() + for cell in cells: + if cell.family not in ("chunk", "packing"): + continue + source = cell.cell_id if cell.family == "chunk" else packing_source(cell).cell_id + artifact = load_tensor_artifact(rollout_dir / f"{source}.pt") + prompt = artifact["prompt_tokens"][0].tolist() + responses = artifact["response_tokens"][0].tolist() + alone = f"replay-{source}" + if alone not in seen: + seen.add(alone) + requests.append(bi.replay_request(alone, prompt, responses, identity)) + if cell.family == "packing": + layout = bi.packing_layout(cell, texts, prompt + responses[:-1]) + requests.append( + bi.replay_request(cell.cell_id, prompt, responses, identity, packing=layout) + ) + return requests + + +def worker(role, manifest_path, output, provider_binary): + """One independent process: run every request of ``role`` into ``output``.""" + manifest = json.loads(Path(manifest_path).read_text()) + module, _capabilities = check_ready() + verify_environment(manifest["environment"], require_venv=True) + output.mkdir(parents=True, exist_ok=True) + verify_before_model_load(manifest, output) + actual_binary = verify_imported_provider(provider_binary, source_tree=manifest["source_tree"]) + cells = suite_cells(manifest) + if role == "rollout": + from rl_engine.integrations.qwen3_next_native_rollout import run_batch_invariance_cases + + requests = rollout_requests(manifest, cells) + run = run_batch_invariance_cases + else: + requests = replay_requests(manifest, cells, output.parent / "rollout") + run = module.run_recompute_cases + pending = [] + for request in requests: + path = output / f"{request['case_id']}.pt" + atomic_json(path.with_suffix(".request.json"), request) + pending.append((request, path)) + run(pending) + records = {} + for request, path in pending: + artifact = load_tensor_artifact(path) + validate_model_artifact(artifact, request) + if artifact.get("provider_binary") != actual_binary: + raise ValueError("A batch-invariance case used a different CUDA provider") + records[request["case_id"]] = {"path": str(path), "sha256": file_digest(path)} + atomic_json( + output / "worker-result.json", + {"status": "passed", "role": role, "pid": os.getpid(), "cases": records}, + ) + + +def judge(cells, output): + rollout, replay = output / "rollout", output / "replay" + load = {} + + def artifact(directory, case_id): + key = (directory, case_id) + if key not in load: + load[key] = load_tensor_artifact(directory / f"{case_id}.pt") + return load[key] + + results = {} + for cell in cells: + if cell.family == "chunk": + lhs, rhs = artifact(rollout, cell.cell_id), artifact(replay, f"replay-{cell.cell_id}") + paired = compare_artifacts(lhs, rhs) + comparisons, against = paired["comparisons"], "replay" + elif cell.family == "packing": + source = packing_source(cell).cell_id + lhs, rhs = artifact(replay, f"replay-{source}"), artifact(replay, cell.cell_id) + comparisons, against = compare_batch_prefill(lhs, rhs), "replay alone" + else: + lhs = artifact(rollout, cell.reference().cell_id) + rhs = artifact(rollout, cell.cell_id) + comparisons, against = compare_batch_prefill(lhs, rhs), "reference alone" + node = first_divergent_node(lhs, rhs) + passed = all(comparisons.values()) + if node is None and not passed: + node = {"layer": None, "node": next(k for k, v in comparisons.items() if not v)} + results[cell.cell_id] = { + "family": cell.family, + "compared_with": against, + "passed": passed, + "comparisons": comparisons, + "first_divergent_node": None if passed else node, + "first_drift_family": (None if passed else family_of(node["layer"], node["node"])), + } + return results + + +def execute(manifest_path, output): + manifest = json.loads(Path(manifest_path).read_text()) + output.mkdir(parents=True, exist_ok=True) + previous = Path(manifest["previous"]) + require_predecessor("bi", previous, Path(manifest["checkpoint"]), manifest) + check_ready() + verify_environment(manifest["environment"], require_venv=True) + memory, requested = memory_limits(), parse_memory_request(manifest["memory"]) + if any( + value is None or value < requested + for value in (memory["effective_bytes"], memory["available_bytes"]) + ): + raise RuntimeError("insufficient_memory: batch-invariance stage budget unavailable") + run_process( + [manifest["python"], str(ROOT / "setup.py"), "build_ext", "--inplace"], + log_path=output / "build.log", + timeout=1800, + ) + provider_binary = archive_provider_binary(ROOT, output, source_tree=manifest["source_tree"]) + validate_binary_record(provider_binary, source_tree=manifest["source_tree"]) + probe = output / "gpu-probe.json" + run_process( + [ + manifest["python"], + str(ROOT / "scripts/qwen3_next_l2.py"), + "--gpu-probe", + "--output", + str(probe), + ], + log_path=output / "gpu-probe.log", + timeout=180, + ) + uuids = json.loads(probe.read_text())["uuids"] + wait_gpu_release(uuids) + atomic_json( + output / "environment.json", + {"environment": manifest["environment"], "memory": memory, "gpu_uuids": uuids}, + ) + for role in ("rollout", "replay"): + run_process( + [ + manifest["python"], + str(Path(__file__)), + "--worker", + role, + "--manifest", + str(manifest_path), + "--output", + str(output / role), + "--provider-binary", + json.dumps(provider_binary), + ], + log_path=output / f"{role}.log", + timeout=8 * 3600, + ) + wait_gpu_release(uuids) + cells = suite_cells(manifest) + results = judge(cells, output) + failed = [cell_id for cell_id, item in results.items() if not item["passed"]] + matrix = { + "schema_version": 1, + "scope": "qwen3_next_batch_invariance", + "status": "passed" if not failed else "failed", + "suite": manifest.get("bi_suite", "full"), + "identity": model_identity(manifest), + "cells_sha256": bi.manifest_payload()["cells_sha256"], + "cell_ids": [cell.cell_id for cell in cells], + "cells": results, + "failed": failed, + "first_failure": failed[0] if failed else None, + "provider_binary": provider_binary, + } + atomic_json(output / "bi-matrix.json", matrix) + prior = json.loads((previous / "result.json").read_text()) + shutil.copyfile(previous / prior["evidence"]["operators"]["path"], output / "operators.json") + evidence = { + name: evidence_record(output / filename, Path(manifest_path).parent) + for name, filename in { + "operators": "operators.json", + "environment": "environment.json", + "provider_binary": "provider-binary.json", + "bi_matrix": "bi-matrix.json", + }.items() + } + if failed: + raise RuntimeError(f"Batch invariance failed in {len(failed)} cells; first: {failed[0]}") + result = result_envelope(manifest, os.environ["QWEN3_NEXT_ATTEMPT"], evidence=evidence) + validate_result( + manifest, + result, + run_dir=Path(manifest_path).parent, + attempt=os.environ["QWEN3_NEXT_ATTEMPT"], + ) + atomic_json(output / "result.json", result) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--manifest", type=Path) + parser.add_argument("--output", type=Path) + parser.add_argument("--worker", choices=("rollout", "replay")) + parser.add_argument("--provider-binary") + parser.add_argument("--check-ready", action="store_true") + args = parser.parse_args() + if args.check_ready: + _, capabilities = check_ready() + print(json.dumps(capabilities)) + return + if args.worker: + worker(args.worker, args.manifest, args.output, json.loads(args.provider_binary)) + return + try: + execute(args.manifest, args.output) + except Exception as exc: + args.output.mkdir(parents=True, exist_ok=True) + atomic_json( + args.output / "result.json", + { + "status": "failed", + "attempt": os.environ.get("QWEN3_NEXT_ATTEMPT"), + "phase": "batch_invariance", + **failure_fields(exc), + }, + ) + raise + + +if __name__ == "__main__": + main() diff --git a/scripts/qwen3_next_chain_report.py b/scripts/qwen3_next_chain_report.py index df01bee54..6cf75b18f 100644 --- a/scripts/qwen3_next_chain_report.py +++ b/scripts/qwen3_next_chain_report.py @@ -52,6 +52,7 @@ def main(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--last", type=Path, required=True, help="last passed stage run") parser.add_argument("--out", type=Path, required=True) + parser.add_argument("--bi", type=Path, help="passed batch-invariance (bi) stage run") args = parser.parse_args() matrices, artifacts = {}, {} gpu_name = None @@ -74,6 +75,16 @@ def main(): if gpu_name is None and environment.is_file(): gpu_name = json.loads(environment.read_text()).get("gpu_name") identity = manifest["checkpoint_identity"] + bi_matrix = None + if args.bi is not None: + bi_manifest = json.loads((args.bi / "run.json").read_text()) + bi_result = json.loads((args.bi / "result.json").read_text()) + if ( + bi_manifest["stage"] != "bi" + or bi_manifest["source_commit"] != manifest["source_commit"] + ): + raise SystemExit("--bi must name a bi run on the same commit as the chain") + bi_matrix = json.loads((args.bi / bi_result["evidence"]["bi_matrix"]["path"]).read_text()) report = build_report( matrices, artifacts, @@ -84,6 +95,7 @@ def main(): device="cuda", gpu_name=gpu_name, compute_capability=None, + bi_matrix=bi_matrix, ) args.out.parent.mkdir(parents=True, exist_ok=True) args.out.write_text(json.dumps(report, indent=2, sort_keys=True) + "\n") diff --git a/scripts/qwen3_next_contract.py b/scripts/qwen3_next_contract.py index 88d55dd6c..e0642b399 100644 --- a/scripts/qwen3_next_contract.py +++ b/scripts/qwen3_next_contract.py @@ -20,6 +20,7 @@ "train1": "qwen3_next_training_update1", "train2": "qwen3_next_training_update2", "train": "qwen3_next_training_and_reload", + "bi": "qwen3_next_batch_invariance", } # Stages that evaluate the full model against updated weights (an L2 matrix each). TRAIN_STAGES = ("train1", "train2", "train") @@ -232,6 +233,8 @@ def validate_result(manifest, result, *, run_dir=None, attempt=None): required.add("provider_binary") if manifest["stage"] == "layers": required |= {"layers", "checkpoint", "provider_binary"} + if manifest["stage"] == "bi": + required |= {"bi_matrix", "provider_binary"} if manifest["stage"] == "train": required |= {"updates", "reload"} if manifest["stage"] in ("train1", "train2"): @@ -283,6 +286,20 @@ def validate_result(manifest, result, *, run_dir=None, attempt=None): counts.get(key, 0) for key in ("skipped", "errors", "failures") ): raise ValueError("Required operator tests must pass without skips") + if manifest["stage"] == "bi": + from qwen3_next_l2 import model_identity + + from rl_engine.testing import qwen3_next_bi_cases as bi + + matrix = json.loads((root / evidence["bi_matrix"]["path"]).read_text()) + suite = bi.quick_cells() if manifest.get("bi_suite") == "quick" else bi.cells() + if ( + matrix.get("status") != "passed" + or matrix.get("identity") != model_identity(manifest) + or matrix.get("cell_ids") != [cell.cell_id for cell in suite] + or any(not matrix["cells"][cell.cell_id]["passed"] for cell in suite) + ): + raise ValueError("Batch-invariance matrix is incomplete or failed") if manifest["stage"] in ("layers", "l2", *TRAIN_STAGES): from qwen3_next_l2 import model_identity diff --git a/scripts/qwen3_next_publish_evidence.py b/scripts/qwen3_next_publish_evidence.py index 1cb6cb2e7..5ea7ec348 100644 --- a/scripts/qwen3_next_publish_evidence.py +++ b/scripts/qwen3_next_publish_evidence.py @@ -129,9 +129,23 @@ def main(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--last", type=Path, required=True) parser.add_argument("--chain-report", type=Path) + parser.add_argument( + "--also", + type=Path, + action="append", + default=[], + help="another finished run of the same commit, e.g. the bi stage (repeatable)", + ) parser.add_argument("--out", type=Path, required=True) args = parser.parse_args() runs = chain_runs(args.last) + for extra in args.also: + manifest = json.loads((extra / "run.json").read_text()) + if manifest["source_commit"] != runs[0][0]["source_commit"]: + raise SystemExit(f"{extra} ran another commit") + if manifest["stage"] in {item[0]["stage"] for item in runs}: + raise SystemExit(f"{extra} repeats the stage {manifest['stage']}") + runs.append((manifest, extra.resolve())) if any(not (run / "result.json").is_file() for _, run in runs): raise SystemExit("Every stage on the chain must have finished") publish(runs, args.chain_report, args.out) diff --git a/scripts/qwen3_next_run.py b/scripts/qwen3_next_run.py index db8133d94..75adefce6 100644 --- a/scripts/qwen3_next_run.py +++ b/scripts/qwen3_next_run.py @@ -14,7 +14,8 @@ scheduler gates, which certify the shared provider), ``l2`` (full-model train/prefill/decode raw-bit matrix), then ``train1``, ``train2`` and ``train`` (two optimizer updates, export, L2 on the updated weights, reload and -resumption). A single stage takes ``--previous `` of its predecessor. +resumption). A single stage takes ``--previous `` of its predecessor; +``bi`` (the batch-invariance matrix) runs after a passed ``l2``. Every run directory holds ``run.json`` (the immutable manifest, identified by a fresh ``execution_id``), ``attempts//`` (the stage's output) and, once the @@ -139,6 +140,8 @@ def prepare(stage, previous, args): "status": "prepared", "full_model_l2": "not_evaluated", } + if stage == "bi": + manifest["bi_suite"] = args.bi_suite if args.training_storage_root and stage == "train1": manifest["training_storage"] = str(args.training_storage_root.resolve(strict=True) / run_id) environment = probe_environment(python) @@ -160,7 +163,7 @@ def prepare(stage, previous, args): "path": str(certificate), "sha256": file_digest(certificate), } - elif stage in ("train1", "train2", "train"): + elif stage in ("train1", "train2", "train", "bi"): manifest["scheduler_profile_certificate"] = json.loads((previous / "run.json").read_text())[ "scheduler_profile_certificate" ] @@ -288,7 +291,7 @@ def main(): parser = argparse.ArgumentParser( description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter ) - parser.add_argument("--stage", choices=(*ORDER, "all"), required=True) + parser.add_argument("--stage", choices=(*ORDER, "bi", "all"), required=True) parser.add_argument("--runs-root", type=Path, required=True) parser.add_argument("--checkpoint", type=Path, required=True) parser.add_argument("--cuda-home", type=Path, required=True) @@ -308,6 +311,12 @@ def main(): "--memory", help="host memory this allocation grants (e.g. 1280G); default: the stage's budget", ) + parser.add_argument( + "--bi-suite", + choices=("full", "quick"), + default="full", + help="with --stage bi: the whole batch-invariance matrix or the CI subset", + ) parser.add_argument( "--training-storage-root", type=Path, diff --git a/scripts/qwen3_next_runtime.py b/scripts/qwen3_next_runtime.py index 321597ac5..e4985239b 100644 --- a/scripts/qwen3_next_runtime.py +++ b/scripts/qwen3_next_runtime.py @@ -443,6 +443,8 @@ def wait_owned_child(child, interrupted, *, grace_seconds=10): "train1": ("1280G", "06:00:00", "l2", "scripts/qwen3_next_training.py"), "train2": ("1280G", "07:00:00", "train1", "scripts/qwen3_next_training.py"), "train": ("1280G", "09:00:00", "train2", "scripts/qwen3_next_training.py"), + # Batch invariance branches off a passed l2, under the same certified profile. + "bi": ("512G", "06:00:00", "l2", "scripts/qwen3_next_batch_invariance.py"), } diff --git a/tests/check_qwen3_next_bi_requests.py b/tests/check_qwen3_next_bi_requests.py new file mode 100644 index 000000000..4eb2ccaee --- /dev/null +++ b/tests/check_qwen3_next_bi_requests.py @@ -0,0 +1,44 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Batch-invariance rollout requests against the native rollout contract (imports vLLM).""" + +import pytest + +from rl_engine.integrations import qwen3_next_native_rollout as rollout +from rl_engine.testing import qwen3_next_bi_cases as bi + +TEXTS = [list(range(1000 + 50 * i, 1000 + 50 * i + 17 + i)) for i in range(4)] +IDENTITY = { + "architecture_layers": 48, + "topology": {"tp": 4, "pp": 1, "cp": 1, "ep": 1}, + "checkpoint": "/checkpoint", + "provider_config": {"native_rollout_kv_cache_memory_bytes": 4 << 30}, +} + + +def test_every_rollout_cell_builds_a_valid_rollout_request(): + for cell in bi.cells(): + if cell.engine != "rollout": + continue + request = bi.rollout_request(cell, TEXTS, IDENTITY) + assert rollout.validate_request(request) == (1, cell.target.prompt_length) + entries = rollout.batch_invariance_descriptors(request) + assert len(entries) == 1 + len(cell.companions) + target = [entry for entry in entries if entry[3] == "shared_l2"] + assert len(target) == 1 and target[0][2]["prefill_chunks"] == cell.chunk_plan() + assert (entries[-1] if cell.target_last else entries[0])[3] == "shared_l2" + + +def test_requests_reject_companions_that_do_not_fit_the_profile(): + request = bi.rollout_request( + bi.Cell("y", "interference", bi.Sequence(0, 256), 64, 64, (bi.Sequence(1, 8),)), + TEXTS, + IDENTITY, + ) + request["companion_max_tokens"] = [2000] + request["request_sha256"] = bi.json_digest( + {k: v for k, v in request.items() if k != "request_sha256"} + ) + with pytest.raises(ValueError, match="does not fit"): + rollout.validate_request(request) diff --git a/tests/test_qwen3_next_bi_cases.py b/tests/test_qwen3_next_bi_cases.py new file mode 100644 index 000000000..df478f60d --- /dev/null +++ b/tests/test_qwen3_next_bi_cases.py @@ -0,0 +1,94 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Batch-invariance cells, their pinned manifest and the worker requests built from them.""" + +import collections + +import pytest + +from rl_engine.integrations.qwen3_next_native_recompute import packed_layout +from rl_engine.testing import qwen3_next_bi_cases as bi + +TEXTS = [list(range(1000 + 50 * i, 1000 + 50 * i + 17 + i)) for i in range(4)] +IDENTITY = { + "architecture_layers": 48, + "topology": {"tp": 4, "pp": 1, "cp": 1, "ep": 1}, + "checkpoint": "/checkpoint", + "provider_config": {"native_rollout_kv_cache_memory_bytes": 4 << 30}, +} + + +def test_manifest_pins_the_generated_cells(): + payload = bi.load_manifest() + assert len(payload["cells"]) == len(bi.cells()) == 97 + families = collections.Counter(cell.family for cell in bi.cells()) + assert families == {"chunk": 66, "concurrency": 13, "interference": 10, "packing": 8} + + +def test_concurrency_covers_one_to_sixty_four_requests(): + sizes = {1 + len(cell.companions) for cell in bi.cells() if cell.family == "concurrency"} + assert sizes == set(bi.CONCURRENCY) + + +@pytest.mark.parametrize( + "prompt,first,chunk,plan", + [ + (64, 1, 64, [1, 63]), + (65, 63, 64, [63, 2]), + (129, 65, 64, [65, 64]), + (1024, 1, 128, [1] + [128] * 7 + [127]), + (63, 65, 128, [63]), + ], +) +def test_chunk_plan_is_first_chunk_then_fixed_chunks(prompt, first, chunk, plan): + cell = bi.Cell("c", "chunk", bi.Sequence(0, prompt), first, chunk) + assert cell.chunk_plan() == plan and sum(plan) == prompt + + +def test_quick_subset_has_one_cell_per_family_and_the_largest_batch(): + quick = bi.quick_cells() + assert {cell.family for cell in quick} == {"concurrency", "interference", "chunk", "packing"} + assert max(1 + len(cell.companions) for cell in quick) == 64 + + +def test_reference_is_the_target_alone_with_the_same_plan(): + cell = next(c for c in bi.cells() if c.cell_id == "concurrency-n16-last") + reference = cell.reference() + assert reference.companions == () and reference.chunk_plan() == cell.chunk_plan() + assert reference.target == cell.target + + +def test_cells_reject_companions_that_do_not_fit_the_profile(): + cell = bi.Cell( + "x", "interference", bi.Sequence(0, 256), 64, 64, (bi.Sequence(1, 1030, max_tokens=16),) + ) + with pytest.raises(ValueError, match="does not fit"): + bi.validate(cell) + + +def test_prompts_repeat_and_rotate_the_pinned_text(): + tokens = bi.prompt_tokens(TEXTS, bi.Sequence(1, 40, offset=3)) + row = TEXTS[1] + assert len(tokens) == 40 and tokens[:5] == row[3:8] + assert tokens[len(row) - 3] == row[0] + + +@pytest.mark.parametrize("last", [False, True]) +def test_packing_traces_only_the_target(last): + cell = next( + c + for c in bi.cells() + if c.cell_id == f"packing-four-sequences-{'last' if last else 'first'}" + ) + target = list(range(271)) + layout = bi.packing_layout(cell, TEXTS, target) + request = bi.replay_request( + cell.cell_id, target[:256], target[256:] + [7], IDENTITY, packing=layout + ) + sequences, traced = packed_layout(request) + assert len(sequences) == 4 and traced == [3 if last else 0] + assert sequences[traced[0]] == target + layout["sequences"][traced[0]] = target[:-1] + with pytest.raises(ValueError, match="exactly once"): + packed_layout({**request, "packing": layout}) diff --git a/tests/test_qwen3_next_chain_report.py b/tests/test_qwen3_next_chain_report.py index 71b0eacde..e863091d8 100644 --- a/tests/test_qwen3_next_chain_report.py +++ b/tests/test_qwen3_next_chain_report.py @@ -147,3 +147,41 @@ def test_unknown_nodes_and_versions_are_rejected(): matrices["update3"] = matrices["update1"] with pytest.raises(ValueError, match="subset"): build(matrices, artifacts) + + +def test_batch_invariance_section_counts_families_and_gates_the_report(): + matrix = { + "suite": "quick", + "status": "failed", + "cell_ids": ["concurrency-n04-last", "chunk-p0129-c64-f63"], + "first_failure": "chunk-p0129-c64-f63", + "cells": { + "concurrency-n04-last": {"family": "concurrency", "passed": True}, + "chunk-p0129-c64-f63": { + "family": "chunk", + "passed": False, + "first_drift_family": "gdn", + }, + }, + } + matrices, artifacts = inputs() + report = chain.build_report( + matrices, + artifacts, + contract=load_contract(), + measured_commit="c" * 40, + weight_source="w", + weight_hash="h", + device="cuda", + gpu_name=None, + compute_capability=None, + bi_matrix=matrix, + ) + section = report["batch_invariance"] + assert not report["passed"] and not section["passed"] + assert section["families"] == { + "concurrency": {"cells": 1, "passed": 1}, + "chunk": {"cells": 1, "passed": 0}, + } + assert section["first_failure_family"] == "gdn" + assert build(matrices, artifacts)["batch_invariance"] is None diff --git a/tests/test_tensor_identity.py b/tests/test_tensor_identity.py index f85c0c4dd..c25d3d6d5 100644 --- a/tests/test_tensor_identity.py +++ b/tests/test_tensor_identity.py @@ -6,6 +6,8 @@ import pytest import torch +from rl_engine.kernels.gtest.forward_invariance import _compare_logical_tensors +from rl_engine.kernels.gtest.tolerance import load_contract from rl_engine.testing.tensor_identity import assert_tensor_bitwise_equal, tensor_bitwise_equal @@ -39,3 +41,38 @@ def test_adjacent_bfloat16_values_are_rejected(): ) def test_logical_identity_does_not_require_matching_strides(value): assert_tensor_bitwise_equal(value, value.contiguous().clone()) + + +@pytest.mark.parametrize("judgment", ["forward_invariance", "gradient_invariance"]) +@pytest.mark.parametrize("fault", ["signed_zero", "dtype", "nan"]) +def test_gtest_invariance_uses_original_bits(judgment, fault): + canonical = torch.zeros(1, dtype=torch.bfloat16) + changed = torch.tensor([-0.0], dtype=torch.bfloat16) + if fault == "dtype": + changed = canonical.float() + elif fault == "nan": + canonical = torch.tensor([float("nan")], dtype=torch.bfloat16) + changed = canonical.clone() + result = _compare_logical_tensors( + canonical, + changed, + judgment=judgment, + contract=load_contract(), + op_class="reduction", + dtype=torch.bfloat16, + backend_profile="cuda_bf16", + ) + assert result.passed is False + + +def test_accuracy_keeps_its_tolerance_semantics(): + result = _compare_logical_tensors( + torch.ones(1), + torch.tensor([1.0078125], dtype=torch.bfloat16), + judgment="forward_accuracy", + contract=load_contract(), + op_class="reduction", + dtype=torch.bfloat16, + backend_profile="cuda_bf16", + ) + assert result.passed is True From 759755e08f8a801d617a273fe23b55831f8de194 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Fri, 9 Oct 2026 05:13:53 +0000 Subject: [PATCH 52/70] fix(qwen3-next): native state shapes for any prompt that fits the rollout profile Batch-invariance chunk cells use prompts such as 129 tokens; the state-shape check only admitted the four L2 lengths, which their own validators already pin. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- rl_engine/testing/qwen3_next_l2.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/rl_engine/testing/qwen3_next_l2.py b/rl_engine/testing/qwen3_next_l2.py index 7f8778072..15ab886f6 100644 --- a/rl_engine/testing/qwen3_next_l2.py +++ b/rl_engine/testing/qwen3_next_l2.py @@ -654,8 +654,10 @@ def native_state_shapes(request): raise ValueError("Native state evidence requires the fixed equal-length batch1/4 matrix") prompt_length = len(prompts[0]) consumed = prompt_length + RESPONSE_LENGTH - 1 + # L2 requests are pinned to PROMPT_LENGTHS by their own validators; batch-invariance + # cells use any prompt that fits the rollout profile (1024 + 16 = max_model_len). if ( - prompt_length not in PROMPT_LENGTHS + not 1 <= prompt_length <= 1024 or request.get("consumed_response_tokens") != RESPONSE_LENGTH - 1 or request.get("state_position") != consumed - 1 ): From 3025497cff70396feeb7a346cd16d1606663df95 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Fri, 9 Oct 2026 07:35:22 +0000 Subject: [PATCH 53/70] fix(qwen3-next): evidence publisher redacts every recorded site path Editable sources, base interpreters and build directories in package metadata now keep only their last path component; cgroup paths keep only their file name. The leftover check matches absolute paths only, so package paths such as vllm/.../cpu/data/ are not flagged, and any mention of the batch scheduler blocks publication. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- scripts/qwen3_next_publish_evidence.py | 22 +++++++++++++----- tests/test_qwen3_next_evidence_redaction.py | 25 ++++++++++++++++----- 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/scripts/qwen3_next_publish_evidence.py b/scripts/qwen3_next_publish_evidence.py index 1cb6cb2e7..41312eb53 100644 --- a/scripts/qwen3_next_publish_evidence.py +++ b/scripts/qwen3_next_publish_evidence.py @@ -27,13 +27,15 @@ import socket from pathlib import Path +# Absolute site paths only: "cpu/data/" inside a package path is not a site path. +_ABSOLUTE = r"(?-])" FORBIDDEN = ( - r"/data/", - r"/home/", - r"/raid/", - r"/scratch", + _ABSOLUTE + r"/data/", + _ABSOLUTE + r"/home/", + _ABSOLUTE + r"/raid/", + _ABSOLUTE + r"/scratch", r"\bdgx-", - r"SLURM_", + r"(?i)slurm", ) TEXT_SUFFIXES = (".json", ".xml", ".txt", ".log") @@ -74,14 +76,22 @@ def redact(text, pairs, counts): counts[placeholder] = counts.get(placeholder, 0) + text.count(value) text = text.replace(value, placeholder) for pattern, placeholder in ( + (r"/sys/fs/cgroup/[^\s\"']*/([^/\s\"']+)", r"/\1"), (r"/[^\s\"']*/site-packages", ""), + # Anything else under a site root (editable sources, base interpreters, + # build directories in package metadata) keeps only its last component. + ( + _ABSOLUTE + r"/(?:data|home|raid|scratch)/[^\s\"'\\]*?([^/\s\"'\\]+)(?=[\s\"'\\]|$)", + r"/\1", + ), (r"\bdgx-[A-Za-z0-9-]+", ""), (rf"\b{re.escape(socket.gethostname())}\b", ""), (rf"\b{re.escape(getpass.getuser())}\b", ""), ): text, count = re.subn(pattern, placeholder, text) if count: - counts[placeholder] = counts.get(placeholder, 0) + count + label = placeholder.split("/", 1)[0] + counts[label] = counts.get(label, 0) + count return text diff --git a/tests/test_qwen3_next_evidence_redaction.py b/tests/test_qwen3_next_evidence_redaction.py index 5f045e8ab..eb2a1ff56 100644 --- a/tests/test_qwen3_next_evidence_redaction.py +++ b/tests/test_qwen3_next_evidence_redaction.py @@ -16,12 +16,12 @@ import qwen3_next_publish_evidence as publisher # noqa: E402 PATTERNS = ( - r"/data/", - r"/home/", - r"/raid/", - r"/scratch", + r"(?-])/data/", + r"(?-])/home/", + r"(?-])/raid/", + r"(?-])/scratch", r"\bdgx-", - r"SLURM_", + r"(?i)slurm", r"\bsbatch\b", r"\bsrun\b", r"\bwrd\b", @@ -99,7 +99,20 @@ def test_publisher_replaces_every_recorded_root(tmp_path): def test_publisher_refuses_text_that_survives_redaction(tmp_path): last = chain(tmp_path) leak = last / "attempts" / "0" / "environment.json" - leak.write_text(json.dumps({"note": "copied from /scratch/elsewhere"})) + leak.write_text(json.dumps({"note": "SLURM_JOB_ID=123"})) with pytest.raises(SystemExit, match="survived redaction"): publisher.publish(publisher.chain_runs(last), None, tmp_path / "published") assert not (tmp_path / "published").exists() + + +def test_relative_package_paths_are_not_site_paths(tmp_path): + counts = {} + text = publisher.redact( + '"vllm/ec_connector/cpu/data/base.py" "file:///data/x/editable/vime" "/home/b/env/bin/py"' + ' "/sys/fs/cgroup/memory/system.slice/slurmd.service/memory.limit_in_bytes"', + [], + counts, + ) + assert "cpu/data/base.py" in text and "/vime" in text and "/py" in text + assert "/memory.limit_in_bytes" in text + assert not publisher.leftovers(text) From bd9ba13759b1d97940e17d67ddc19b5befe21f1b Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Fri, 9 Oct 2026 07:36:02 +0000 Subject: [PATCH 54/70] docs(qwen3-next): batch-invariance evidence, 97/97 cells bitwise (B200, 759755e) Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- .../README.md | 44 + .../SHA256SUMS | 31 + .../bi/bi_matrix.json | 1698 ++++++ .../bi/environment.json | 4510 ++++++++++++++ .../bi/operators.json | 304 + .../bi/provider_binary.json | 13 + .../bi/result.json | 771 +++ .../bi/run.json | 5253 +++++++++++++++++ .../chain-report.json | 2152 +++++++ .../l2/environment.json | 4511 ++++++++++++++ .../l2/l2_matrix.json | 1186 ++++ .../l2/operators.json | 304 + .../l2/predecessor.json | 5 + .../l2/provider_binary.json | 13 + .../l2/result.json | 775 +++ .../l2/run.json | 5252 ++++++++++++++++ .../layers/checkpoint.json | 14 + .../layers/environment.json | 4511 ++++++++++++++ .../layers/layers.json | 457 ++ .../layers/operators.json | 304 + .../layers/provider_binary.json | 13 + .../layers/result.json | 775 +++ .../layers/run.json | 5248 ++++++++++++++++ .../measured-commit.txt | 1 + .../preflight/checkpoint.json | 14 + .../preflight/device_guards.xml | 1 + .../preflight/environment.json | 40 + .../preflight/operators.json | 304 + .../preflight/result.json | 797 +++ .../preflight/rollout_smoke.json | 75 + .../preflight/run.json | 5248 ++++++++++++++++ .../preflight/tp4.json | 49 + .../redaction.json | 14 + 33 files changed, 44687 insertions(+) create mode 100644 docs/usage/evidence/qwen3-next-batch-invariance-b200/README.md create mode 100644 docs/usage/evidence/qwen3-next-batch-invariance-b200/SHA256SUMS create mode 100644 docs/usage/evidence/qwen3-next-batch-invariance-b200/bi/bi_matrix.json create mode 100644 docs/usage/evidence/qwen3-next-batch-invariance-b200/bi/environment.json create mode 100644 docs/usage/evidence/qwen3-next-batch-invariance-b200/bi/operators.json create mode 100644 docs/usage/evidence/qwen3-next-batch-invariance-b200/bi/provider_binary.json create mode 100644 docs/usage/evidence/qwen3-next-batch-invariance-b200/bi/result.json create mode 100644 docs/usage/evidence/qwen3-next-batch-invariance-b200/bi/run.json create mode 100644 docs/usage/evidence/qwen3-next-batch-invariance-b200/chain-report.json create mode 100644 docs/usage/evidence/qwen3-next-batch-invariance-b200/l2/environment.json create mode 100644 docs/usage/evidence/qwen3-next-batch-invariance-b200/l2/l2_matrix.json create mode 100644 docs/usage/evidence/qwen3-next-batch-invariance-b200/l2/operators.json create mode 100644 docs/usage/evidence/qwen3-next-batch-invariance-b200/l2/predecessor.json create mode 100644 docs/usage/evidence/qwen3-next-batch-invariance-b200/l2/provider_binary.json create mode 100644 docs/usage/evidence/qwen3-next-batch-invariance-b200/l2/result.json create mode 100644 docs/usage/evidence/qwen3-next-batch-invariance-b200/l2/run.json create mode 100644 docs/usage/evidence/qwen3-next-batch-invariance-b200/layers/checkpoint.json create mode 100644 docs/usage/evidence/qwen3-next-batch-invariance-b200/layers/environment.json create mode 100644 docs/usage/evidence/qwen3-next-batch-invariance-b200/layers/layers.json create mode 100644 docs/usage/evidence/qwen3-next-batch-invariance-b200/layers/operators.json create mode 100644 docs/usage/evidence/qwen3-next-batch-invariance-b200/layers/provider_binary.json create mode 100644 docs/usage/evidence/qwen3-next-batch-invariance-b200/layers/result.json create mode 100644 docs/usage/evidence/qwen3-next-batch-invariance-b200/layers/run.json create mode 100644 docs/usage/evidence/qwen3-next-batch-invariance-b200/measured-commit.txt create mode 100644 docs/usage/evidence/qwen3-next-batch-invariance-b200/preflight/checkpoint.json create mode 100644 docs/usage/evidence/qwen3-next-batch-invariance-b200/preflight/device_guards.xml create mode 100644 docs/usage/evidence/qwen3-next-batch-invariance-b200/preflight/environment.json create mode 100644 docs/usage/evidence/qwen3-next-batch-invariance-b200/preflight/operators.json create mode 100644 docs/usage/evidence/qwen3-next-batch-invariance-b200/preflight/result.json create mode 100644 docs/usage/evidence/qwen3-next-batch-invariance-b200/preflight/rollout_smoke.json create mode 100644 docs/usage/evidence/qwen3-next-batch-invariance-b200/preflight/run.json create mode 100644 docs/usage/evidence/qwen3-next-batch-invariance-b200/preflight/tp4.json create mode 100644 docs/usage/evidence/qwen3-next-batch-invariance-b200/redaction.json diff --git a/docs/usage/evidence/qwen3-next-batch-invariance-b200/README.md b/docs/usage/evidence/qwen3-next-batch-invariance-b200/README.md new file mode 100644 index 000000000..6f6b93093 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-batch-invariance-b200/README.md @@ -0,0 +1,44 @@ +# Qwen3-Next batch invariance (B200) + +Measured at commit `759755e` (`measured-commit.txt`) from clean clones, one +stage after another on one node with four B200 GPUs, in one environment +(`environment_sha256` `118384371a88…` in every `run.json`): + +```bash +python scripts/qwen3_next_run.py --stage all --until l2 \ + --runs-root --checkpoint --cuda-home --python /bin/python +python scripts/qwen3_next_run.py --stage bi --bi-suite full --previous /<...-l2-...> \ + --runs-root --checkpoint --cuda-home --python /bin/python +python scripts/qwen3_next_chain_report.py --last <...-l2-...> --bi <...-bi-...> --out chain-report.json +python scripts/qwen3_next_publish_evidence.py --last <...-l2-...> --also <...-bi-...> \ + --chain-report chain-report.json --out docs/usage/evidence/qwen3-next-batch-invariance-b200 +``` + +The stages ran the code of `759755e`; the copy in this directory was made by +the publisher of `3025497`, which only adds redaction rules (`redaction.json` +counts the placeholders) and changes no measured byte. `SHA256SUMS` covers +every file. + +| Stage | Result | +| --- | --- | +| `preflight` | passed: environment, mandatory operator cases and norm gates, device guards, TP4 probe, checkpoint hashes, rollout smoke | +| `layers` | passed: GDN, attention, MoE, GDN-adapter and embedding/head TP4 gates on real weights; native scheduler on 16 cases | +| `l2` | passed: 16/16 cases bitwise rollout vs replay, every layer, sub-node and state digest equal | +| `bi` (full) | passed: **97/97 cells bitwise** | + +| `bi` family | Cells | Passed | Compared with | +| --- | --- | --- | --- | +| concurrency (1-64 requests, target first or last) | 13 | 13 | the target alone, same chunk plan | +| interference (content, lengths, arrival, generation length) | 10 | 10 | the target alone, same chunk plan | +| chunk (prompts 63-1024, chunk 64/128, first chunk 1/63/65) | 66 | 66 | the replay engine's recompute | +| packing (replay THD batch with 1-7 neighbours) | 8 | 8 | the replay of the target alone | + +Each comparison is raw bits of the target's 16 response tokens, its BF16 +logits and FP32 logprobs over the full vocabulary, the embedding rows and, for +all 48 layers, the five sub-node outputs, the layer output and the +convolution/recurrent or KV state. `bi/bi_matrix.json` lists every cell; +`chain-report.json` is the chain-gate report with its `batch_invariance` +section. + +Site paths, host names and the scheduler are replaced by placeholders +(``, ``, ``, ``, `/name`, `/file`). diff --git a/docs/usage/evidence/qwen3-next-batch-invariance-b200/SHA256SUMS b/docs/usage/evidence/qwen3-next-batch-invariance-b200/SHA256SUMS new file mode 100644 index 000000000..d9791572a --- /dev/null +++ b/docs/usage/evidence/qwen3-next-batch-invariance-b200/SHA256SUMS @@ -0,0 +1,31 @@ +10ff2c602da1b7e195e3ff4878248519734fbc6856e23e5bc8044cf8aeff993b bi/bi_matrix.json +092bb1bb11c47d604c1bfb69292ddaf0e3720dce5ce31742b795be4b0a36c316 bi/environment.json +bb96af8122ba0c79d94ba00fc8f67c18d1d5cb1d3806a4c372ec0f0f19ab52c5 bi/operators.json +bb49a465b63ddc24b4bd650deb9e3502f0e63b7d27bb9b881160ccc20d926390 bi/provider_binary.json +dae27bfed4e1beac3bebbc43927ff3dc1fdca757591db516d1546b99d43f9e5a bi/result.json +35a969fedf51687ba6738be2109ed7d3efd4ff2570c6896b027b906de61135e6 bi/run.json +36a618b8346de00baeba241ad4c86108f61f74043ddfaf5d420cf1e84a7f0cd0 chain-report.json +ff415b6773224e8c16411ca4f8527dd50d116777181632416027075c512a0a2d l2/environment.json +32cf084e8f94fe53ac76867db93a93113c10b47957215105b267e877ef8789fb l2/l2_matrix.json +bb96af8122ba0c79d94ba00fc8f67c18d1d5cb1d3806a4c372ec0f0f19ab52c5 l2/operators.json +8e5ff1f1c4c94fd654b77d29d65b71e839adb97eea9a6e73d7d7c02ec80c3cbf l2/predecessor.json +a7cb660b4e5e4cd879ab05652cf9feedaa0369fc5b36223bc8bdfe361ef93792 l2/provider_binary.json +45f1cdf4df454347cf164510b601e24b06f1b31862c42eb655adac5aa9c22303 l2/result.json +97f95042c4ae49e382dd27c0187cdd5f483abfe752ccf1675a623230a010802a l2/run.json +7ceb9dab2ce8c0a2551a970819f9f0adbb538f04c4124982458a42f997d7c934 layers/checkpoint.json +1f73ff08eca9832acc8ce2776cd8d392cf1cebcebf3c16cb06221300a17715f2 layers/environment.json +a5b9ece90e3c1b82461e4ea97ab4a249d7244169868dc8eaf7d498fcf6492b26 layers/layers.json +bb96af8122ba0c79d94ba00fc8f67c18d1d5cb1d3806a4c372ec0f0f19ab52c5 layers/operators.json +03e184fd1488d3751401676532719d4df549bf2e2222fac354e2ff4860928d67 layers/provider_binary.json +6e12fec6b2f3b8de5bb57f9ee9cc2e53a5f6e9b1f6e269f4d8107d9de64bfb15 layers/result.json +b74b807070088750f285a3ee0d82fee32f3a4aa697834103240beec2169c0855 layers/run.json +13782b2d36239a9afc3883c4abb84eb1f11dd4be3dd4a7698e885b7a246070a6 measured-commit.txt +7ceb9dab2ce8c0a2551a970819f9f0adbb538f04c4124982458a42f997d7c934 preflight/checkpoint.json +2d66d1ad9ac9bc552d72f2869d8123f8ab74944ad79292c1ba4e95c963bfc92d preflight/device_guards.xml +b9d06f1c5ac22fd5bfb0e4abdf691262fe4644d1be1353d95a5f81b60497215e preflight/environment.json +bb96af8122ba0c79d94ba00fc8f67c18d1d5cb1d3806a4c372ec0f0f19ab52c5 preflight/operators.json +b98af9a7e636844aa1b02a0d429d331e9eec9dce17f5a4619bb30f5f3b4abba5 preflight/result.json +32a325240b552b6674ea89692979d7e97ff5593373b79daa5575250511fd83a8 preflight/rollout_smoke.json +cb9de6c11fe7a5a8d5790adfcbcb34576b9191149649ac21e6a18f1b3f7e51fc preflight/run.json +94b8471a1b6c0c75c0af44a25f62b50d633bce4429a8f5de40cc7ab3ef721a9e preflight/tp4.json +18933215177fb6080e903a55ef03ac8bd6c3ca283b2acda23f43e5f8694b61e1 redaction.json diff --git a/docs/usage/evidence/qwen3-next-batch-invariance-b200/bi/bi_matrix.json b/docs/usage/evidence/qwen3-next-batch-invariance-b200/bi/bi_matrix.json new file mode 100644 index 000000000..9845ae241 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-batch-invariance-b200/bi/bi_matrix.json @@ -0,0 +1,1698 @@ +{ + "schema_version": 1, + "scope": "qwen3_next_batch_invariance", + "status": "passed", + "suite": "full", + "identity": { + "scheduler_profile_certificate": { + "path": "/result.json", + "sha256": "fbfb9aca512a01d150f5b6bf4a1f12c77c3292ba279bd7d63e24dbf3a7231ce9" + }, + "source_commit": "759755e08f8a801d617a273fe23b55831f8de194", + "source_tree": "d8da35c889c3ffe57d8569fd9d2c51b063de16ce", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "checkpoint": "", + "weight_version": "baseline", + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "architecture_layers": 48, + "weights_dtype": "bfloat16", + "recurrent_state_dtype": "float32" + }, + "cells_sha256": "f4709588a5d1e4fdceffc74df74d8c5980f8321e484906324e507d5b55ebcfae", + "cell_ids": [ + "concurrency-n01-first", + "concurrency-n02-first", + "concurrency-n02-last", + "concurrency-n04-first", + "concurrency-n04-last", + "concurrency-n08-first", + "concurrency-n08-last", + "concurrency-n16-first", + "concurrency-n16-last", + "concurrency-n32-first", + "concurrency-n32-last", + "concurrency-n64-first", + "concurrency-n64-last", + "interference-same-text", + "interference-short-companions", + "interference-long-companions", + "interference-mixed-lengths", + "interference-arrive-in-prefill", + "interference-arrive-in-decode", + "interference-arrive-at-last-decode", + "interference-long-generations", + "interference-single-token-generations", + "interference-target-last-arrival", + "chunk-p0063-c64-f01", + "chunk-p0063-c64-f63", + "chunk-p0063-c64-f65", + "chunk-p0063-c128-f01", + "chunk-p0063-c128-f63", + "chunk-p0063-c128-f65", + "chunk-p0064-c64-f01", + "chunk-p0064-c64-f63", + "chunk-p0064-c64-f65", + "chunk-p0064-c128-f01", + "chunk-p0064-c128-f63", + "chunk-p0064-c128-f65", + "chunk-p0065-c64-f01", + "chunk-p0065-c64-f63", + "chunk-p0065-c64-f65", + "chunk-p0065-c128-f01", + "chunk-p0065-c128-f63", + "chunk-p0065-c128-f65", + "chunk-p0127-c64-f01", + "chunk-p0127-c64-f63", + "chunk-p0127-c64-f65", + "chunk-p0127-c128-f01", + "chunk-p0127-c128-f63", + "chunk-p0127-c128-f65", + "chunk-p0128-c64-f01", + "chunk-p0128-c64-f63", + "chunk-p0128-c64-f65", + "chunk-p0128-c128-f01", + "chunk-p0128-c128-f63", + "chunk-p0128-c128-f65", + "chunk-p0129-c64-f01", + "chunk-p0129-c64-f63", + "chunk-p0129-c64-f65", + "chunk-p0129-c128-f01", + "chunk-p0129-c128-f63", + "chunk-p0129-c128-f65", + "chunk-p0527-c64-f01", + "chunk-p0527-c64-f63", + "chunk-p0527-c64-f65", + "chunk-p0527-c128-f01", + "chunk-p0527-c128-f63", + "chunk-p0527-c128-f65", + "chunk-p0528-c64-f01", + "chunk-p0528-c64-f63", + "chunk-p0528-c64-f65", + "chunk-p0528-c128-f01", + "chunk-p0528-c128-f63", + "chunk-p0528-c128-f65", + "chunk-p0529-c64-f01", + "chunk-p0529-c64-f63", + "chunk-p0529-c64-f65", + "chunk-p0529-c128-f01", + "chunk-p0529-c128-f63", + "chunk-p0529-c128-f65", + "chunk-p1023-c64-f01", + "chunk-p1023-c64-f63", + "chunk-p1023-c64-f65", + "chunk-p1023-c128-f01", + "chunk-p1023-c128-f63", + "chunk-p1023-c128-f65", + "chunk-p1024-c64-f01", + "chunk-p1024-c64-f63", + "chunk-p1024-c64-f65", + "chunk-p1024-c128-f01", + "chunk-p1024-c128-f63", + "chunk-p1024-c128-f65", + "packing-two-sequences-first", + "packing-two-sequences-last", + "packing-four-sequences-first", + "packing-four-sequences-last", + "packing-eight-mixed-first", + "packing-eight-mixed-last", + "packing-one-token-neighbours-first", + "packing-one-token-neighbours-last" + ], + "cells": { + "concurrency-n01-first": { + "family": "concurrency", + "compared_with": "reference alone", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "concurrency-n02-first": { + "family": "concurrency", + "compared_with": "reference alone", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "concurrency-n02-last": { + "family": "concurrency", + "compared_with": "reference alone", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "concurrency-n04-first": { + "family": "concurrency", + "compared_with": "reference alone", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "concurrency-n04-last": { + "family": "concurrency", + "compared_with": "reference alone", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "concurrency-n08-first": { + "family": "concurrency", + "compared_with": "reference alone", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "concurrency-n08-last": { + "family": "concurrency", + "compared_with": "reference alone", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "concurrency-n16-first": { + "family": "concurrency", + "compared_with": "reference alone", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "concurrency-n16-last": { + "family": "concurrency", + "compared_with": "reference alone", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "concurrency-n32-first": { + "family": "concurrency", + "compared_with": "reference alone", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "concurrency-n32-last": { + "family": "concurrency", + "compared_with": "reference alone", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "concurrency-n64-first": { + "family": "concurrency", + "compared_with": "reference alone", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "concurrency-n64-last": { + "family": "concurrency", + "compared_with": "reference alone", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "interference-same-text": { + "family": "interference", + "compared_with": "reference alone", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "interference-short-companions": { + "family": "interference", + "compared_with": "reference alone", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "interference-long-companions": { + "family": "interference", + "compared_with": "reference alone", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "interference-mixed-lengths": { + "family": "interference", + "compared_with": "reference alone", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "interference-arrive-in-prefill": { + "family": "interference", + "compared_with": "reference alone", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "interference-arrive-in-decode": { + "family": "interference", + "compared_with": "reference alone", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "interference-arrive-at-last-decode": { + "family": "interference", + "compared_with": "reference alone", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "interference-long-generations": { + "family": "interference", + "compared_with": "reference alone", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "interference-single-token-generations": { + "family": "interference", + "compared_with": "reference alone", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "interference-target-last-arrival": { + "family": "interference", + "compared_with": "reference alone", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0063-c64-f01": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0063-c64-f63": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0063-c64-f65": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0063-c128-f01": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0063-c128-f63": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0063-c128-f65": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0064-c64-f01": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0064-c64-f63": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0064-c64-f65": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0064-c128-f01": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0064-c128-f63": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0064-c128-f65": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0065-c64-f01": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0065-c64-f63": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0065-c64-f65": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0065-c128-f01": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0065-c128-f63": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0065-c128-f65": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0127-c64-f01": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0127-c64-f63": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0127-c64-f65": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0127-c128-f01": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0127-c128-f63": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0127-c128-f65": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0128-c64-f01": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0128-c64-f63": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0128-c64-f65": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0128-c128-f01": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0128-c128-f63": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0128-c128-f65": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0129-c64-f01": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0129-c64-f63": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0129-c64-f65": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0129-c128-f01": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0129-c128-f63": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0129-c128-f65": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0527-c64-f01": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0527-c64-f63": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0527-c64-f65": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0527-c128-f01": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0527-c128-f63": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0527-c128-f65": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0528-c64-f01": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0528-c64-f63": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0528-c64-f65": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0528-c128-f01": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0528-c128-f63": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0528-c128-f65": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0529-c64-f01": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0529-c64-f63": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0529-c64-f65": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0529-c128-f01": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0529-c128-f63": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p0529-c128-f65": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p1023-c64-f01": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p1023-c64-f63": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p1023-c64-f65": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p1023-c128-f01": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p1023-c128-f63": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p1023-c128-f65": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p1024-c64-f01": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p1024-c64-f63": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p1024-c64-f65": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p1024-c128-f01": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p1024-c128-f63": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "chunk-p1024-c128-f65": { + "family": "chunk", + "compared_with": "replay", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "packing-two-sequences-first": { + "family": "packing", + "compared_with": "replay alone", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "packing-two-sequences-last": { + "family": "packing", + "compared_with": "replay alone", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "packing-four-sequences-first": { + "family": "packing", + "compared_with": "replay alone", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "packing-four-sequences-last": { + "family": "packing", + "compared_with": "replay alone", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "packing-eight-mixed-first": { + "family": "packing", + "compared_with": "replay alone", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "packing-eight-mixed-last": { + "family": "packing", + "compared_with": "replay alone", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "packing-one-token-neighbours-first": { + "family": "packing", + "compared_with": "replay alone", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + }, + "packing-one-token-neighbours-last": { + "family": "packing", + "compared_with": "replay alone", + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_node": null, + "first_drift_family": null + } + }, + "failed": [], + "first_failure": null, + "provider_binary": { + "path": "/attempts/0/provider-binary.json", + "sha256": "2d20f473fe71e1539a8a4e04ccbde8e012b3e44e6c36e43fb15ecd6f822a1243" + } +} diff --git a/docs/usage/evidence/qwen3-next-batch-invariance-b200/bi/environment.json b/docs/usage/evidence/qwen3-next-batch-invariance-b200/bi/environment.json new file mode 100644 index 000000000..5c34e39a1 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-batch-invariance-b200/bi/environment.json @@ -0,0 +1,4510 @@ +{ + "environment": { + "identity": { + "base_prefix": "/miniconda3/envs/rlkernel", + "binary": "/python3.12", + "binary_sha256": "6a1eb3ffc29f3a6b0ece607b016b4cfa5ca3ac57b34f17ed3266b404f78d2729", + "build_tools": { + "ninja": { + "path": "/miniconda3/envs/rlkernel/bin/ninja", + "sha256": "08639e194fffa7f08b259fc4abfa4803aff66b64de52549cee42ec527d55cea6" + } + }, + "distributions": [ + { + "direct_url": null, + "metadata_sha256": "6f1038270be40f9b8c0bcf391c627e7d7f41ccdd19aa192d6eac1dbfc3b19abc", + "name": "GitPython", + "version": "3.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "3f71971502087521f123c9daa26bc12d31d3466738b567390b8602acad3be22a", + "name": "Jinja2", + "version": "3.1.6" + }, + { + "direct_url": null, + "metadata_sha256": "818fb343b7b6b99a32771bf4813521ae6440b4c7579b3ae46e32dd02da0afeee", + "name": "Markdown", + "version": "3.11" + }, + { + "direct_url": null, + "metadata_sha256": "dc1ee42cf8ecfeee0ab60b15b21d291833e0732548efcb7bb5b3564dca3e5bf7", + "name": "MarkupSafe", + "version": "3.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "de7389b142450a0014234286b0876f328439b823c355c73d0aed41fd67ec208c", + "name": "PyJWT", + "version": "2.15.1" + }, + { + "direct_url": null, + "metadata_sha256": "ffcad4415cafb22b8b536a61595e9ee13438b51d31b0763c1b273ce3bc58e840", + "name": "PyYAML", + "version": "6.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "8562d701cc52d9cafbb418942b0e072fc087ed8ddcf35cd10224c1b2ed8bdd91", + "name": "Pygments", + "version": "2.21.0" + }, + { + "direct_url": null, + "metadata_sha256": "b6c25fcfdcc495edf248a10ca4ad28327ef2ed6047a6ec5c6346e121414c7f21", + "name": "Werkzeug", + "version": "3.1.9" + }, + { + "direct_url": null, + "metadata_sha256": "55c400d24c71b581d9c0992f71df6047cf6c878bebe61a7d45d6e02dc0e4c510", + "name": "absl-py", + "version": "2.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "13db521f90a6a882027b2388eaa2ebf252945f9c2adb7e7e371da18239da4df0", + "name": "accelerate", + "version": "1.15.0" + }, + { + "direct_url": null, + "metadata_sha256": "86fe44e38e67872dd895c729044942ba2c2f934ae439a899fb83a186206b7fd4", + "name": "agent-detector", + "version": "2.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "afe11fe9f5aa54e734cdd51659bed8c89dc6bcd5aef0ad96f2d20149c8de5456", + "name": "aiohappyeyeballs", + "version": "2.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "570b307bc0b53fbbd3ed2ce0b7eca6bbf2fa73bf75e24a480f1034d8c0b832bf", + "name": "aiohttp", + "version": "3.14.3" + }, + { + "direct_url": null, + "metadata_sha256": "44b7f8e14c4770793e747fad50c9e0a6ee7357651d878554f192d94768dc14a8", + "name": "aiohttp-cors", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "648813a44a9ae0ab2f20ee86d2404dcc38e3f9e80c63316cf6e536735df14e54", + "name": "aiosignal", + "version": "1.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "f6a3f6668bacef7f73a2c19ccb2be910b2363d1731c4725cb04364d99e24935a", + "name": "annotated-doc", + "version": "0.0.5" + }, + { + "direct_url": null, + "metadata_sha256": "fc6d752cde6a6a4bff03474386de750e130b75da3c7815ee909f45b51fea98c8", + "name": "annotated-types", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "4e89d670a4b20029da30e5a9e8ebcbc844deff9c44209552bafd5537249c8b9e", + "name": "anthropic", + "version": "1.9.0" + }, + { + "direct_url": null, + "metadata_sha256": "b5a6f00800956387fcddab1fe1b5aa8502c249b86cfb16d58ed700f282f60142", + "name": "antlr4-python3-runtime", + "version": "4.9.3" + }, + { + "direct_url": null, + "metadata_sha256": "a6008defa9492cd08250217b134782cad1db4580e1d7ddf69cc2a2a48cea24e0", + "name": "anyio", + "version": "4.15.1" + }, + { + "direct_url": null, + "metadata_sha256": "7877c64ce8957237363f2df313819bb07f50752df016d14c5a5a99bec10f5deb", + "name": "apache-tvm-ffi", + "version": "0.1.11" + }, + { + "direct_url": null, + "metadata_sha256": "3543ca8f0e072c00ab111b20eba99ce86dbf93ada28988775bc2677284b3c07a", + "name": "astor", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "d4b328c09c024fe1e4d788a9c7715ad726095131b815cd35fd933268226f6269", + "name": "attrs", + "version": "26.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "4850c4d696a5e2a2ecbb3dd792b060acc1de79e09800669b0b9fc3a22c055e6d", + "name": "av", + "version": "19.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "863ff92208d0a02dabfa008bfe91846a5c401ded301e5687dca7dc63c911865f", + "name": "babel", + "version": "2.18.0" + }, + { + "direct_url": null, + "metadata_sha256": "f32e6df3197f05202e586624d95c5e217003d80cee655c165d533102f628df21", + "name": "backrefs", + "version": "8.0" + }, + { + "direct_url": null, + "metadata_sha256": "905c362f655fbc6d37a24686efc2b3bfbd3123b8ee5a443a43f6750d87455e90", + "name": "blake3", + "version": "1.0.10" + }, + { + "direct_url": null, + "metadata_sha256": "07c85682b6aefd5c9b48890d306c1604311902295704892ede48e5a83219a8d3", + "name": "blobfile", + "version": "3.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "2d582941a7081625a35f35a0c4a2e80f7737312e29c38e5fdb6fc08f9c113077", + "name": "bracex", + "version": "3.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "3b60c55bae0d0340c3a3fd918635bbfa3087579da66e0fd7f6be7a3782c0da3d", + "name": "cachetools", + "version": "7.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "5d11a6878d5bc3f22290281a19ef7b36daa95c910780950608b95cd788c7e12e", + "name": "cbor2", + "version": "6.1.4" + }, + { + "direct_url": null, + "metadata_sha256": "362c9942c48051f168ed2b9f2146266b7792d3c05e164cd6afc3f3b65884fdc9", + "name": "certifi", + "version": "2026.7.22" + }, + { + "direct_url": null, + "metadata_sha256": "b4abf1bcf1c1d8e0272d8007fc974499ea59e5f2a5b98af3c78a5e67515a9d87", + "name": "cffi", + "version": "2.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "766120f13c177446f51929a4d201104bc935b6d5a2a176cd6716edce757d3d95", + "name": "cfgv", + "version": "3.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "610e9a9d03ce837ffe6e42be5e02e70087f73863f7350bf7bb7f0511edcc5ec0", + "name": "charset-normalizer", + "version": "3.5.2" + }, + { + "direct_url": null, + "metadata_sha256": "7ad836b3147c9702546d9c28b4fa5be23b24445439db5d0d2a58d17281c84daa", + "name": "click", + "version": "8.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "4c5f00599ebcbf11d337e48a72784d256ca3d704fa9e9f5daadd60065e6776b7", + "name": "cloudpickle", + "version": "3.1.2" + }, + { + "direct_url": null, + "metadata_sha256": "a0970189e3ab7a596d6902d5f61f93b414f138f03d3cf19029145657bfceb382", + "name": "cmake", + "version": "4.1.2" + }, + { + "direct_url": null, + "metadata_sha256": "94a6ebf9718e55f254a43ce0d2f04e0d6d44e7141b6f3144a84feb6519a77bfd", + "name": "colorama", + "version": "0.4.6" + }, + { + "direct_url": null, + "metadata_sha256": "ca8ec227f406d970a645ec482b20619128dd34b9cf71159cc24e27db461a2711", + "name": "colorful", + "version": "0.5.8" + }, + { + "direct_url": null, + "metadata_sha256": "bbaa51b7e4d8f142bd075d01257c0572c0c844796d51426e35c8096a13e8da76", + "name": "compressed-tensors", + "version": "0.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "6063d8ff7ebc458d63a4332853d7ababf4ee2b86336362c8d2b12be6e998eb6b", + "name": "connectrpc", + "version": "0.11.1" + }, + { + "direct_url": null, + "metadata_sha256": "ac5f4b5a5f68080bd9c3fe77399fe8a1bff2ee5923c49db1df544dd054cbf15b", + "name": "cryptography", + "version": "50.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "f41d2f6b4616accca2f5e1dd47aa9e8937c28076cde698226d93e727751f3099", + "name": "cuda-bindings", + "version": "13.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "e5ca6ed34c687c6f4a4d157ad0a2cf06ec0316fe8c4c0ddeb666ad76dd6f30f4", + "name": "cuda-core", + "version": "1.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "89baadd9da23dce9990481519544115615ba3cbd2d1a41e09feea7756fffb378", + "name": "cuda-pathfinder", + "version": "1.8.2" + }, + { + "direct_url": null, + "metadata_sha256": "1ab914b9a57ca601df2e3cfe9608427b15d8afb78029076ace5d1caf9fd45f08", + "name": "cuda-python", + "version": "13.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "73d97a5eb578223b4895ef4f234574d14219cef9999ff7d0e92a3d0dd057bd3f", + "name": "cuda-tile", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "ae6f957fe66ed63081d1d83ee6e8838f3a0af2c6fce1223629d0dd6264565ead", + "name": "cuda-toolkit", + "version": "13.0.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "1f8e0ae51ad5feea63f58ed2e24f3da6f23ed548043235a14f7623d961dd9b64", + "name": "datasets", + "version": "5.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "153f4a4d6ff03dbe5c8ad7fe54bc2e7b989a4947b70f7aa77fbf652b394f2a2e", + "name": "depyf", + "version": "0.20.0" + }, + { + "direct_url": null, + "metadata_sha256": "ee09fc752d7271aac93079cfd63409957dc6b536c1ffd9355a01bf7297e72aa6", + "name": "detect-installer", + "version": "0.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "a7feab2c4f69fd5f85e5a3cb495a7f1870a6bf8199dcee5339e8118f7acbdc09", + "name": "dill", + "version": "0.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "fef3fde661fe30ba7bd1d78841a797136b2b3461705bb4eb92dc54f8308bbaae", + "name": "distlib", + "version": "0.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "fef3fde661fe30ba7bd1d78841a797136b2b3461705bb4eb92dc54f8308bbaae", + "name": "distlib", + "version": "0.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "a3ca2e39abe76c4a33d5fe4a2a84375ec9f25cdfdb7e1d8ea406bd6f1603205c", + "name": "dnspython", + "version": "2.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "92a07daad5e6ff461199de14e845d9b376e309ef916ce5379f3c9cd4e3b1623f", + "name": "dockerfile-parse", + "version": "2.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "5b566b25f0cbe4955d0b16844a7cc6d2002caa3bde2dfda7f301fd8870cbaa56", + "name": "docstring_parser", + "version": "0.18.0" + }, + { + "direct_url": null, + "metadata_sha256": "5a1080b5768c6c591e1c4f9c9812cafa808781b9eeb198043bf185e22d4a1613", + "name": "e2b", + "version": "2.51.0" + }, + { + "direct_url": null, + "metadata_sha256": "0a63979e0b946e16238e4339e60d9c1eb5a7ce3ea93dae78b5da9c65a6190540", + "name": "einops", + "version": "0.8.2" + }, + { + "direct_url": null, + "metadata_sha256": "16cbe67a57558f1d4bfdbc22a454434ba301750c57a62b1d3f5361c9e5cddc00", + "name": "email-validator", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "0617ddb55b90b42ddc9398dc7e91d61fe928a2504939f76526dc15b22d238caa", + "name": "fastapi", + "version": "0.136.3" + }, + { + "direct_url": null, + "metadata_sha256": "ddd82b9666c21988e234d623e2575e1b89fd4133260eeab43fc9a7c074f7024a", + "name": "fastapi-cli", + "version": "0.0.32" + }, + { + "direct_url": null, + "metadata_sha256": "611602e834d42e10433155ff5f5581358d732fa6b6f6f7820a8f79e74b1ce1f9", + "name": "fastapi-cloud-cli", + "version": "0.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "794524e4a9659bda6043721d848d028ea49996085a33326094fbaaa3f6e6b895", + "name": "fastar", + "version": "0.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "711401d36e60e10e35beb4d0f1bb42bf0c4d86339ae52f32b9aa4a4d790530dd", + "name": "fastsafetensors", + "version": "0.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "efaea9742e348c4c4bdcc6f616a33cc5aa3ae926494a72a46690b7da2f08ed5c", + "name": "filelock", + "version": "4.0.7" + }, + { + "direct_url": null, + "metadata_sha256": "99bd6c3f10781d3d2d350f2c3c9fc4765b55f25de8a6d6dd1f71501802d1255e", + "name": "fla-core", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "0a6ef979b75295cee2b5293ad4942b0cf2682e9e38680203064e0b70249c1a96", + "name": "flash-linear-attention", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "76b70a11ca82ea4606b529e7a8658cb3fe71412afa46f2ed57101dd91ba27558", + "name": "flashinfer-python", + "version": "0.6.18.post1" + }, + { + "direct_url": null, + "metadata_sha256": "ba8ff415192b5cbb90efce046e2271a00c8184afc362d8b47fbbc84d5e558b05", + "name": "frozenlist", + "version": "1.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "e7712831c80eb13b08fb7f7cc33988a8f24654af9eba7c6f5f943b2636e4306a", + "name": "fsspec", + "version": "2026.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "025de85c794878d0caa737869307447595f514ebf9599eacb5b1a501bae479b6", + "name": "fsspec", + "version": "2026.9.0" + }, + { + "direct_url": null, + "metadata_sha256": "ca94883bdeaa3740b45b6994443b445fd67c6e4a8064ac3bf9d92d2a5221eee8", + "name": "ghp-import", + "version": "2.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "a7e90983562a035cf767baa63d8c32bc37e1de7cad71ac7b6b2bc70a95bba4eb", + "name": "gitdb", + "version": "4.0.12" + }, + { + "direct_url": null, + "metadata_sha256": "dd96143ec79178bef685c1f5c0a58a87a66d003b421e605de65697308321d518", + "name": "google-api-core", + "version": "2.40.0" + }, + { + "direct_url": null, + "metadata_sha256": "0735d57088a83df2355e16843107fb0112abe2178fc5bb8132947a7ad962aa41", + "name": "google-auth", + "version": "2.59.1" + }, + { + "direct_url": null, + "metadata_sha256": "2f3aa9d9500d329560440e6a5a152e420aad5f5bbb23701f45b740be721784a1", + "name": "googleapis-common-protos", + "version": "1.75.5" + }, + { + "direct_url": null, + "metadata_sha256": "06d74ab04fdc03fad368868907f0d10e7d9f397aab58d58965c0b78ffaec34cc", + "name": "griffelib", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "7ee1c179e2c68a62968308b2f96f4f3469176ee3ac8bdb494ac80188d4d41271", + "name": "grpcio", + "version": "1.84.0" + }, + { + "direct_url": null, + "metadata_sha256": "04cf3a4a91575850f386f4fcfdedd8e7fbfba08feff038fbc1296d1e854db2dd", + "name": "h11", + "version": "0.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "b954a6ba4739c0cc878bb8ea27ea7c7154a48bb4b7c06dba9e9cf880cf0ec930", + "name": "h2", + "version": "4.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "6f0d7bf86e75d0bda1ceccc82367c0145ad0ec522c4d4f51bb454f467faadcc9", + "name": "hf-xet", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "f991b847550cf8225f69562902b5ccb591b2ce9a08fe07ef6e6d701bdb4694a7", + "name": "hpack", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "314d194165c4700034c1c67cee847d549a6d7091374c71f2cef0186ec56a3eb9", + "name": "httpcore", + "version": "1.0.9" + }, + { + "direct_url": null, + "metadata_sha256": "aed9767360bed1bcbda71e3b1a3c996603f86558bc77a1693ee3d09973d20cad", + "name": "httpcore2", + "version": "2.13.1" + }, + { + "direct_url": null, + "metadata_sha256": "8fa3bf3510c35e2eea9f523a1cace7120079cf51d76c4acea97de95806aaa14a", + "name": "httptools", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "3bf4804c215d111b6a4702cf9000021ab39807d1ed3207dd011b14b2843b2d14", + "name": "httpx", + "version": "0.28.1" + }, + { + "direct_url": null, + "metadata_sha256": "d11dd50813b8914bd9455e8b2b591171cd2b1618883943153afadc8bb9224678", + "name": "httpx2", + "version": "2.13.1" + }, + { + "direct_url": null, + "metadata_sha256": "43b119c34ad2b2aacc032a1a6a8feb142fdb5ca407a3519325d74dd53d8904df", + "name": "huggingface_hub", + "version": "1.33.0" + }, + { + "direct_url": null, + "metadata_sha256": "9ce850d5a6b775e5ef4a335f907e579a878e058213121b6eec567781ea68c585", + "name": "humming-kernels", + "version": "0.1.12" + }, + { + "direct_url": null, + "metadata_sha256": "67aa4f6717d82446a51ce350e7c4769eba0c4a22d2f428255cddd9d24b11a914", + "name": "hyperframe", + "version": "6.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd9511ede42f63b995c3f71944f908cb8f014048b63ecc1c8d420525a3354b59", + "name": "identify", + "version": "2.6.20" + }, + { + "direct_url": null, + "metadata_sha256": "af3c3a62bb5d82d6a43454684e0b1dedde27a21ea90eacfb1bed9814619f06d0", + "name": "idna", + "version": "3.20" + }, + { + "direct_url": null, + "metadata_sha256": "cf71393f3d079ce2e859384573e65aaacd1709bef700701f629df32398b598f0", + "name": "ijson", + "version": "3.5.1" + }, + { + "direct_url": null, + "metadata_sha256": "9305763e93d03df0e36516b1125fa046a6ebe37d44589e200e0593cf4bdfd980", + "name": "importlib_metadata", + "version": "9.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "32860c3c19b2e91f6cb5bd83400b5870cda051bc74a5a08822c8c666af0990db", + "name": "iniconfig", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "560faabb3d45d779e445a74e7e806a786f95f2200fa06d979603b7f0ee1cfb39", + "name": "instanttensor", + "version": "0.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "f6fc1f0d389e4245fc2a1a0fdfee09422e56200cb6f94659668456997ff4f7a9", + "name": "interegular", + "version": "0.3.3" + }, + { + "direct_url": null, + "metadata_sha256": "d10f300731197a4829b77f0c883bb3cf8a37ae8c76a302e095fa95d6427706d0", + "name": "jiter", + "version": "0.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "5b0c8d4b4c535a2432fb206223d774509b6e20af374c6a4b6f98bf72a7de6702", + "name": "jmespath", + "version": "1.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "6c4032c2e74273452cd77399af2ee85198f49c22da897983f26d2ed6f787c4e8", + "name": "jsonschema", + "version": "4.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "aaa6cd66f423729e8da397c9d533b7d731f6b25f3d6371b9338c36bdb9be74a0", + "name": "jsonschema-specifications", + "version": "2025.9.1" + }, + { + "direct_url": null, + "metadata_sha256": "f7c0687c032593106a2e5a3c241cf8043e7e2c222bddb0022b4cb2bf5de67115", + "name": "lark", + "version": "1.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "4511c6b04efc57a5f5333edc1f5f48b9f5412c3923d4bc19b715bdf47977511c", + "name": "linkify-it-py", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "be929870f6ecae18a819c56118f1101f3076e25ac6a4843ca6f4707ebd1e87c6", + "name": "llguidance", + "version": "1.7.6" + }, + { + "direct_url": null, + "metadata_sha256": "cf2b87669bead3e76ec54207f3354c13f73b50c32fcd13c8d627084b3379139e", + "name": "llvmlite", + "version": "0.47.0" + }, + { + "direct_url": null, + "metadata_sha256": "0a416d79c5543d94d2b18807626293d4f47655d1d22724c7ae296e413078aaba", + "name": "lm-format-enforcer", + "version": "0.11.3" + }, + { + "direct_url": null, + "metadata_sha256": "16bc1f59e34fd2a6633bd395276052eacd2c777b2cf72781e76b203f013a8fac", + "name": "loguru", + "version": "0.7.3" + }, + { + "direct_url": null, + "metadata_sha256": "5216d5acfd039a7b581a826186309594b228d37d2c8d56864124ea666689fe4e", + "name": "lxml", + "version": "6.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "f59d772b35315a928672bfcccfb89d82c0aac672c5275c048f7a93b79015bcea", + "name": "markdown-it-py", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "b137367ef0056711cbf5e53015df9168cab80373104e7899b1c0263a21d9c99c", + "name": "mcp", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "38e0b9edaae09e58cd1461fc961ced22672038a697930bedef153a74befb3de1", + "name": "mcp-types", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "799f49685865fd9cc8915fdb92a33e102eeeffad562b03b4aeffb6f422b771c1", + "name": "mdit-py-plugins", + "version": "0.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "481f9cbe08596c6eaba6343e0efa1b13b2362c30dce0610f7c08523f1d98388d", + "name": "mdurl", + "version": "0.1.2" + }, + { + "direct_url": "{\"dir_info\": {\"editable\": true}, \"url\": \"file:///Megatron-LM-training\"}", + "metadata_sha256": "2876c0c760bbfc93bd7d737bf0db2866a937308a7c1707c3a2bb59d4795986ff", + "name": "megatron-core", + "version": "0.16.0rc0" + }, + { + "direct_url": null, + "metadata_sha256": "a6e34d488c879f57ce042bec38f8864ba3ea7d6ecf0ab757fc88fe8dc0a22f26", + "name": "memray", + "version": "1.20.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd26d80dc9676b1fb8c894355bd525fbe7f49a6a86a555c72e9ec6d927247c33", + "name": "mergedeep", + "version": "1.3.4" + }, + { + "direct_url": null, + "metadata_sha256": "dd1b3b89e88d1c65a26e6e72dd075eabbc220bfb138769ec8b64578ee911795c", + "name": "mistral_common", + "version": "1.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "4859847a9f6321daf8849cf7fd1542ff430db6563a2abf9ac0d62a5b21bd951d", + "name": "mkdocs", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "1729fc31479f2582486cdc85397417659dd3b2fb3f920553de66cfe59d5f0b3e", + "name": "mkdocs-awesome-nav", + "version": "3.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "88b4b7b7c0aba5547befdedaf515c8df4867361daf55ff60b72578464d72dcbe", + "name": "mkdocs-get-deps", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "ad33bb33fb16b1f69689c4682550e97232154e367e2c8c8aee9dad0f10d269ce", + "name": "mkdocs-git-revision-date-localized-plugin", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "ed69fbfb9ac00c10c5a383a12ff9d2b9919ae184e408554434199211643d6040", + "name": "mkdocs-material", + "version": "9.7.7" + }, + { + "direct_url": null, + "metadata_sha256": "d1c549b61701148b97f8246bc924b2840e504b37b0ce7a27e78ddf81261e5363", + "name": "mkdocs-material-extensions", + "version": "1.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "4ad6171f3bf6812e4de90670ff0089d445093d4fe1d05d55f17b96a4a192a816", + "name": "ml_dtypes", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "4ad6171f3bf6812e4de90670ff0089d445093d4fe1d05d55f17b96a4a192a816", + "name": "ml_dtypes", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "b0dbdfa30ab6b1ce637a794899c9e43019182b6d1ab2d07b90f647f7331eba6b", + "name": "model-hosting-container-standards", + "version": "0.1.16" + }, + { + "direct_url": null, + "metadata_sha256": "95424470e481cfa8d18b30963b6de3aafe16614b1ea0414e184a008571dde84f", + "name": "mpmath", + "version": "1.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "eb184d83489401903615ce8a78d98d5b933dec0f7246811d396a529915fe797c", + "name": "msgpack", + "version": "1.2.3" + }, + { + "direct_url": null, + "metadata_sha256": "520006303d6a0e859970b83f7d452196e2e8f6dab08f6dcf1ba5823c1230025f", + "name": "msgspec", + "version": "0.22.0" + }, + { + "direct_url": null, + "metadata_sha256": "010d2fe039006070a711a476b171b7b7da5c29ccad3c4eecd77ef3711b07c2d0", + "name": "multidict", + "version": "6.9.1" + }, + { + "direct_url": null, + "metadata_sha256": "235634cc7ebda45f8a84dfdb1b9b35ac1a77a1888b34650c3a616d23e4a7e93f", + "name": "multiprocess", + "version": "0.70.19" + }, + { + "direct_url": null, + "metadata_sha256": "7c545b4b3e5e83d3fde41352272c10cb9deeaba5b7138fbf24383e952af8822e", + "name": "natsort", + "version": "8.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "311ee8cdaeaf9f11acf51cda9c3b5b191f76ce9d98bc3418164c3189bbc37a08", + "name": "nccl4py", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "66360539217852c3b44b37f409eade7e1559baf018bb363bacb2aa3a9759b203", + "name": "networkx", + "version": "3.7" + }, + { + "direct_url": null, + "metadata_sha256": "e8b0b1746808b87816c47e4531780ded7f246bed9575a89e8b40200aa81e9a13", + "name": "ninja", + "version": "1.13.2" + }, + { + "direct_url": null, + "metadata_sha256": "77c1117f0dbc41560ddc6e6b37b542fb4e88afcd4ef82ec06593e5bbd5f37121", + "name": "nodeenv", + "version": "1.11.0" + }, + { + "direct_url": null, + "metadata_sha256": "9af629898406c9eaa69897fe09220dc483270cdba89f6b20bf0165cdf0e1668e", + "name": "numba", + "version": "0.65.0" + }, + { + "direct_url": null, + "metadata_sha256": "0c7281a81cf76e40b27c1385ffd8a215d7227adc219f177ce807ead9e91994a5", + "name": "numpy", + "version": "2.3.5" + }, + { + "direct_url": null, + "metadata_sha256": "0c7281a81cf76e40b27c1385ffd8a215d7227adc219f177ce807ead9e91994a5", + "name": "numpy", + "version": "2.3.5" + }, + { + "direct_url": null, + "metadata_sha256": "bab990ced4537ce74ef5961ca933c4c6fd604fd09a5827a4a428c55bcb0be35b", + "name": "nvdlfw_inspect", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "10f6595146332d35f7f15a000e08b5c81432528c5d026470c1d03f0c1399fb70", + "name": "nvidia-cublas", + "version": "13.1.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "58e933b4ac8e49f098b16ab7480d03bd792afc3d1db10d0aacbdcc2c62e48fa3", + "name": "nvidia-cuda-cccl", + "version": "13.3.4.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "baac937970681d41aa0c3708b3d55d73f8d29e70aceaac0e71fe6d1548e94a09", + "name": "nvidia-cuda-crt", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "8d51e5c76ef5707b0b80d5ec9a791c0f11a480ab721820cf100a3cc566017eef", + "name": "nvidia-cuda-cupti", + "version": "13.0.85" + }, + { + "direct_url": null, + "metadata_sha256": "724bf56e61ddef5d4c2482ff64103a973b911b110b668acaea5373f6c83c1c5c", + "name": "nvidia-cuda-nvcc", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "c54801dbd815d534519a761f1f328325aa0f1d1f1659aa969fa74e7a2c76eee9", + "name": "nvidia-cuda-nvdisasm", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "af51f248363020b9fdfd2743704e901bf3d19a1a1ce1fe44fb98ba148bfc0157", + "name": "nvidia-cuda-nvrtc", + "version": "13.0.88" + }, + { + "direct_url": null, + "metadata_sha256": "055f7fc69a5a2159de82cd0718da02c8852e81c8a71ebb117b8e799badd7167e", + "name": "nvidia-cuda-runtime", + "version": "13.0.96" + }, + { + "direct_url": null, + "metadata_sha256": "df18686dbdb3074ca375a1d6c623a04102fd348950c67a721397349c6d4f0477", + "name": "nvidia-cudnn-cu13", + "version": "9.20.0.48" + }, + { + "direct_url": null, + "metadata_sha256": "abd0ca3f67af19a4d383ff2a012ae0090d4731c6492fd47236615308a50b3981", + "name": "nvidia-cudnn-frontend", + "version": "1.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "4a78545d424d0c5038353f7046a8ae40ceaf312045d71399eac9511f5fc15434", + "name": "nvidia-cufft", + "version": "12.0.0.61" + }, + { + "direct_url": null, + "metadata_sha256": "e49b909195c03ddbe203729d9b31dd88e3f207368333d1909c67c6b130a0c696", + "name": "nvidia-cufile", + "version": "1.15.1.6" + }, + { + "direct_url": null, + "metadata_sha256": "bb15a754c6be32c23aaac13c1cfa7a8ce53d92bc26652ec3b609f7a5cce3e7d1", + "name": "nvidia-curand", + "version": "10.4.0.35" + }, + { + "direct_url": null, + "metadata_sha256": "0dd58f677811eac04901a793740932e5a2a8fff2f5453aa6351614eb18391bb6", + "name": "nvidia-cusolver", + "version": "12.0.4.66" + }, + { + "direct_url": null, + "metadata_sha256": "8aeb284782ef6883095a5d1c110e221cad023a99afcfd5cdb4969a25e146d562", + "name": "nvidia-cusparse", + "version": "12.6.3.3" + }, + { + "direct_url": null, + "metadata_sha256": "09555246122896eaca3b8313eecfca4b339fefd3b597874cb9fe3bf29dab38c9", + "name": "nvidia-cusparselt-cu13", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "ac77bac79fbfb0c52ac6e2e5abc936b1e127be2192f0cbc27b00be3125fa86ae", + "name": "nvidia-cutlass-dsl", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "1ec968ec7c4083f7fe4e1fb8384c7e9b853a81491fef9f4cb1cf755961aaedf6", + "name": "nvidia-cutlass-dsl-libs-base", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "cc6f3846cd820013eaa6e2665c493d70c607be6ce7349b939eb4742888470585", + "name": "nvidia-cutlass-dsl-libs-core", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "2357d0df2d0d17c0b16663b8a89df53f751b19721f66821fd88fa78112c08e55", + "name": "nvidia-cutlass-dsl-libs-cu12", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "244590c25662dcf777b1daae97a858afe1a1aec62e5e6678b217007a459ab552", + "name": "nvidia-cutlass-dsl-libs-cu13", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "c3a25ada01f57418c1b897406c3abab18834e6adc573ab7b060620c453afb6db", + "name": "nvidia-ml-py", + "version": "13.615.71" + }, + { + "direct_url": null, + "metadata_sha256": "56baad4e7f699902b03b17580933f7bd50b6ea97b7df9d7e807750973da7529c", + "name": "nvidia-nccl-cu13", + "version": "2.29.7" + }, + { + "direct_url": null, + "metadata_sha256": "98810ef0ab8badc369e6a46a038f8ee9f412c0c753fb5ad580544f23a0aa7962", + "name": "nvidia-nvjitlink", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "b0f54ee21909d19640a58e05da755c91763eb5725f544fd0d4b84b2f5f94deba", + "name": "nvidia-nvshmem-cu13", + "version": "3.4.5" + }, + { + "direct_url": null, + "metadata_sha256": "06dc1a593c7e8b8c3f29184228c83f8f7ef57787ad91f3e5bcae1d238dd3092a", + "name": "nvidia-nvtx", + "version": "13.0.85" + }, + { + "direct_url": null, + "metadata_sha256": "32ee63450a437b6a6ed227ff6549144aa596197a322993521ec7af826ebd413e", + "name": "nvidia-nvvm", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "32c2efdcd2c673b3b7f35ca9c2cccefaad36f1f0a920648a13cad85f6a5767b2", + "name": "nvtx", + "version": "0.2.15" + }, + { + "direct_url": null, + "metadata_sha256": "3419d80e114a2c19fa9bd3582939a3942f19673055707ba6ca2ca489d58b41e0", + "name": "omegaconf", + "version": "2.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "28971076ce9c279d4b889496b046d55a1e05b02fb9851ceb717e9a10df799572", + "name": "onnx", + "version": "1.23.1" + }, + { + "direct_url": null, + "metadata_sha256": "1246f5a4d8295907a42e809ed9173ede2510ec9d260d2168989d126564897fa5", + "name": "onnx-ir", + "version": "1.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "e14643636835759700dff286f949c5ec34e7eac7ac47f44096414f0e0f1c3101", + "name": "onnxscript", + "version": "0.7.2" + }, + { + "direct_url": null, + "metadata_sha256": "00f847e99939207bd70dfd806428f6b20a3d01074b59325e4c76149a2e19be26", + "name": "openai", + "version": "3.22.1" + }, + { + "direct_url": null, + "metadata_sha256": "598d3ad5a22a14a7c4f1d218b43e345f32b0ba094b753467bae8a3f708fd48cb", + "name": "openai-agents", + "version": "0.22.3" + }, + { + "direct_url": null, + "metadata_sha256": "5a0afcb1ce845e05da12beb1767f5d2749bbc9e9050718c6b9fa3c225713c9eb", + "name": "openai-harmony", + "version": "0.0.8" + }, + { + "direct_url": null, + "metadata_sha256": "e86a6b6fcbbe152805f782c57df321002892e163019574877e9829272e25eb4e", + "name": "opencensus", + "version": "0.11.4" + }, + { + "direct_url": null, + "metadata_sha256": "53d669c8bd3d32d3275153b454e515ca5cc6dec92fae3a98309b5a2b19fe6d2d", + "name": "opencensus-context", + "version": "0.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "19778b6d66b0e45bf73e11fa37a208949d5b393aef914627394d5601455546a6", + "name": "opencv-python-headless", + "version": "5.0.0.93" + }, + { + "direct_url": null, + "metadata_sha256": "19778b6d66b0e45bf73e11fa37a208949d5b393aef914627394d5601455546a6", + "name": "opencv-python-headless", + "version": "5.0.0.93" + }, + { + "direct_url": null, + "metadata_sha256": "a3f5434fa7c80f7f7abc82173da639c8e9c59d30b4027182645562bd3d2f4f97", + "name": "opentelemetry-api", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "8611977ea596e4827874582e86250618444e1c718229dddfc16e5ea437ce5fcb", + "name": "opentelemetry-exporter-http-transport", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "2cfd41e5ca33292d987ba71fa6186d11e16ed66888f3a26f8a3a99060c4b5e90", + "name": "opentelemetry-exporter-otlp", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "3bb4494220732d4bf10e1dba231ea7638cedaa5362e1f23a50d34a14f520fea8", + "name": "opentelemetry-exporter-otlp-common", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "27fb1c8aa5c2cd07776f9f3281fc618cd3feb96017757c33d2b3586fb7fec88b", + "name": "opentelemetry-exporter-otlp-proto-common", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "5cba6098cdd0bfb06853a6c704a2451c4f82c9dea376a30b59ecd279296648ad", + "name": "opentelemetry-exporter-otlp-proto-grpc", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "6f53ef1c172ebf87af69b9ef390aa908506d0cd14bc7811985fdd937a4058808", + "name": "opentelemetry-exporter-otlp-proto-http", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "1910f4e7ebd497e98b6d231e10275288fda2cd1885117575706c62f45e065889", + "name": "opentelemetry-exporter-prometheus", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "fab18b721e30be41448be252e1dca43b48e7f15d971e0bb552492c0ef4b07bee", + "name": "opentelemetry-proto", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "3644a79f55762a646799ff52b9d837e01c8192b7b28f735a383f55c90edb9bc2", + "name": "opentelemetry-sdk", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "add3db481f7f401f65cfbddb058fde3bb4c9dd7b61064a84f8598ad7efe0b11c", + "name": "opentelemetry-semantic-conventions", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "0dfff30e912520a226bcf7a547393484cfcd8c738439c7b48418f61c95109480", + "name": "opentelemetry-semantic-conventions-ai", + "version": "0.5.1" + }, + { + "direct_url": null, + "metadata_sha256": "210ce26bad0a245a72831b4fa029708c245d4d670a88c8d5a69b1446c24a95e4", + "name": "orjson", + "version": "3.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "35ff73511848f5f934ccc39d538014716ec4579e76d54e0e407ff51794a7939c", + "name": "outlines_core", + "version": "0.2.14" + }, + { + "direct_url": null, + "metadata_sha256": "8ee2f7138ade46b6e348a6d099612f5bd6caff13511f3b4144327f37ce50eacf", + "name": "packaging", + "version": "26.3" + }, + { + "direct_url": null, + "metadata_sha256": "a4ab87bf8083001f25ccdc46095f05b678b3569dd58edc2cf941e3e7f64d7c88", + "name": "paginate", + "version": "0.5.7" + }, + { + "direct_url": null, + "metadata_sha256": "1de96a6c28c2e5613c9c87cd4ad9484791001cf58df43cf2ba74d5c4f85f0ad2", + "name": "pandas", + "version": "3.0.6" + }, + { + "direct_url": null, + "metadata_sha256": "d05b8d05da9f78176b2eefaacdfaa5e96708ec4f488daea8bbc52e3ed1bc3954", + "name": "partial-json-parser", + "version": "0.2.1.1.post7" + }, + { + "direct_url": null, + "metadata_sha256": "c1d126edceac2685e29403a8ae3a27c47143dce1f0252fa3931771562f1e2b4f", + "name": "pathspec", + "version": "1.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "30325dc8ce17bc64f9dbc0a449232fd35841a019df22a6f481007c9c5a28c1cb", + "name": "pillow", + "version": "12.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "cbc0b7b6e63b50dcb7c17cf3526a9304f285d9a31353adf3b22acc2059ab23f5", + "name": "pip", + "version": "25.0.1" + }, + { + "direct_url": "{\"dir_info\": {}, \"url\": \"file:///work\"}", + "metadata_sha256": "6ba03b5bc457a2a3d92468729501b5892a0d38ebcc36766c58859449498c5743", + "name": "pip", + "version": "26.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "0421937c4410b61c5325233d5b7671ae933bae8de174f87586ac55aa804851ea", + "name": "platformdirs", + "version": "4.12.2" + }, + { + "direct_url": null, + "metadata_sha256": "2bcffab42626e1fb50d6329765619312d30fe7f4880e98dcee99c92ebd283bb4", + "name": "pluggy", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "7e7562ba7c032f8edd02641ae71b1ac2d8f388103a68d777a7e907d19e75bc17", + "name": "pre_commit", + "version": "4.6.2" + }, + { + "direct_url": null, + "metadata_sha256": "bbe0a7662602ddd23f929fe0ee98e9d04406e138aeee18ce4861af186ea6060d", + "name": "prometheus-fastapi-instrumentator", + "version": "8.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "ece4a61f3ffb92a083fd5e47e180e3e070342e60a3bd93876a879e79a643e821", + "name": "prometheus_client", + "version": "0.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "5feba21a58eaa126e7e7739e57e2572e5bb251fcbf56e439e508acc47d769314", + "name": "propcache", + "version": "0.5.4" + }, + { + "direct_url": null, + "metadata_sha256": "3f136dbf7239c987a7685acd33440cc5efd6c4107b4b11c425201b4de70ae36f", + "name": "proto-plus", + "version": "1.29.0" + }, + { + "direct_url": null, + "metadata_sha256": "118b5ad013120a7a6e24714595ad776bf264d7b0060389133310d18ea1480902", + "name": "protobuf", + "version": "7.36.2" + }, + { + "direct_url": null, + "metadata_sha256": "0849f5a519bf9bc23ef204443fdd8d6d10678863acac7ca9340fc11bfba5a856", + "name": "protobuf-py", + "version": "0.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "eab5f2f4fd98f67a710a8fb1975b64ffa880a4f977566f022c567e08e324ccd6", + "name": "protobuf-py-ext", + "version": "0.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "39009938840de3a8b2a37eb4668d2601aae8c74e4b74743f73e59996b5b7e6e1", + "name": "psutil", + "version": "7.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "df44b58e8a4cfe57f65773ec47f7bdf2a14c8f5f73a7abf331a6b6237d6d691a", + "name": "py-cpuinfo", + "version": "9.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "2fd4a9efc5e5c74ae4c2fcf1970193c524c62ab22af8d5e66ebf7df9e6e46e83", + "name": "py-spy", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "d2ccdeb15cddedc81637a83e40baa6397fe269023b738d0fc3cb2d90722e290b", + "name": "pyarrow", + "version": "25.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "47b9f28e971a56f5adf949e0bcf105b0bf6587946566ecf197a2819d8848cc01", + "name": "pyasn1", + "version": "0.6.4" + }, + { + "direct_url": null, + "metadata_sha256": "82ce4c01c6d36841b9801fcdabab9bfe61d0b5e4e440c275941d8a2d4a790730", + "name": "pyasn1_modules", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "45cb345e4c12f63bc843b8c88902cc44c4d624a55aaef8cd5ffbc0ad16356fbe", + "name": "pybase64", + "version": "1.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "d311ae661edeac8ff029ab2960d065a7e792ebf8f79af682daa53109fe81318b", + "name": "pybind11", + "version": "3.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "cce9c0d440d065d4cdfb0d00004b8ddd65cf363a740efc5b0920b29201a59cd9", + "name": "pycountry", + "version": "26.2.16" + }, + { + "direct_url": null, + "metadata_sha256": "a1e33542883c249bf6c263b0023b9ea8a6131a77d9cb2cbc88316968e5eada83", + "name": "pycparser", + "version": "3.0" + }, + { + "direct_url": null, + "metadata_sha256": "faffcc4d7d359cb1047a9f67f7c65096b838c6db6c62852ef20fb27d55649a95", + "name": "pycryptodomex", + "version": "3.23.0" + }, + { + "direct_url": null, + "metadata_sha256": "98929f4cb80451dc3c6c8cd541a3081dccf0dee94afe7d9fa5c214a18ff236ce", + "name": "pydantic", + "version": "2.13.5" + }, + { + "direct_url": null, + "metadata_sha256": "8eccadbe707db97c397fb79073fe791b7998ef3a85f04f817f8991f7697b190b", + "name": "pydantic-extra-types", + "version": "2.11.1" + }, + { + "direct_url": null, + "metadata_sha256": "8f00c91deb34399316a5386eb2e76fe09f14a08dc3045f2e7dce9bf8573796bd", + "name": "pydantic-settings", + "version": "2.15.0" + }, + { + "direct_url": null, + "metadata_sha256": "66c729edddc20bf2764bb18bd87d907b08690e50355f39b97acc737b26d1d164", + "name": "pydantic_core", + "version": "2.46.5" + }, + { + "direct_url": null, + "metadata_sha256": "394500d78a0c1a433ae8ca3693152c08f6a901121d4b069cf1540a19759e2950", + "name": "pylatexenc", + "version": "2.11" + }, + { + "direct_url": null, + "metadata_sha256": "df2e9e9847a2aea0ae6e20fd325aeb16cf3ce7f8913462db6c2398363cd0c0bf", + "name": "pymdown-extensions", + "version": "12.1" + }, + { + "direct_url": null, + "metadata_sha256": "82fcfe724db9f0b51348da89f4f5cdc0b08d08882b1bbc0ca4913d3a0a93bcb9", + "name": "pynvvideocodec", + "version": "2.0.4" + }, + { + "direct_url": null, + "metadata_sha256": "3722422cc1478b175879143dfb78f98b7a5f53f4f684d71b7054fe2e8acd3b89", + "name": "pyqwest", + "version": "0.10.0" + }, + { + "direct_url": null, + "metadata_sha256": "7d1d1c276b7c372d55d17ac7d30f0a4b80a746e147347b8510d1355eea7f80c8", + "name": "pytest", + "version": "9.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "89e7c1c932e52b74bdcaf504389d2d1a2d7ca559b02bf5a09fc80ebd58ad10f7", + "name": "python-dateutil", + "version": "2.9.0.post0" + }, + { + "direct_url": null, + "metadata_sha256": "54f30f811841b6d772f31715712c85bfe0041839cb071f78daf41c700a98642b", + "name": "python-discovery", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "54f30f811841b6d772f31715712c85bfe0041839cb071f78daf41c700a98642b", + "name": "python-discovery", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "0cc19efd76cfbf3bcb2cb0d3ab82191036855859455aa3812c5e9e591e3f34e8", + "name": "python-dotenv", + "version": "1.2.3" + }, + { + "direct_url": null, + "metadata_sha256": "1d866c6124631b9ce1797ad412fff298ab53fc2d95210281d7c8f20e920753fa", + "name": "python-json-logger", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "2d18a1e7286d92a656ead5ec6f83d5ae6dc858634624f6b264703ae88d24d718", + "name": "python-multipart", + "version": "0.0.32" + }, + { + "direct_url": null, + "metadata_sha256": "beaa0efe9ba4b34843f5a0fc7379a73f10e95adb8cc0c31f359ab6f3a42b4def", + "name": "pyyaml_env_tag", + "version": "1.1" + }, + { + "direct_url": null, + "metadata_sha256": "238dc769e22d4f5626750cdff36e920e4a8d69c10d88de6d79b40a59cc13d873", + "name": "pyzmq", + "version": "27.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "de0a5e855bb5bb78b7acdcd2ca60619c6a0c109814881589caf158ec07155662", + "name": "quack-kernels", + "version": "0.6.5" + }, + { + "direct_url": null, + "metadata_sha256": "961ffef199b876fb4d7b10903d78e79f359d703b1638834c61d70b9879932918", + "name": "qwen-vl-utils", + "version": "0.0.14" + }, + { + "direct_url": null, + "metadata_sha256": "faf6ab9027d12de992827a2d8a224996fe6747a8c5f7d31ae495983dc73eefe9", + "name": "ray", + "version": "2.54.0" + }, + { + "direct_url": null, + "metadata_sha256": "c50d8b3ff4d113925b60dc47d1d28e87248a3338024241b0a3a66c8794fbce0c", + "name": "referencing", + "version": "0.37.0" + }, + { + "direct_url": null, + "metadata_sha256": "02acdc52d6f21d5f4b172254daaa94edfaa44c9ebe14d1c00cc4c8fe99b0e1df", + "name": "regex", + "version": "2026.9.29" + }, + { + "direct_url": null, + "metadata_sha256": "ac08207697217d1ffde8a161b424d77d6e2af6b62630fa26d75d08f11076cdca", + "name": "requests", + "version": "2.34.2" + }, + { + "direct_url": null, + "metadata_sha256": "f1abd635c3dff607a4fd654c62a88d9d4c21843cfc9176116c156f4269ca21b5", + "name": "rich", + "version": "15.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "932ff7743a756d0efcc45528d64c275ac3cb40a8dd1787ea10cb303907f0ae4f", + "name": "rich-toolkit", + "version": "0.20.5" + }, + { + "direct_url": null, + "metadata_sha256": "294a1405c0fa34b5f735bcb46459050436849a1e584c643544de99c07c529fb7", + "name": "rignore", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "5e54dd00b4ad336c5161d47de2a5c2212090c44629c28b6538b156256e49282d", + "name": "rpds-py", + "version": "2026.6.3" + }, + { + "direct_url": null, + "metadata_sha256": "0d5895abd80bfc0027c02943abaea4547061b9004bd134950d640d619a697835", + "name": "safetensors", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "91d5de3f641f33a8fbb4b6e91772da68d50b68686971d7b66af2068f2e77b694", + "name": "scipy", + "version": "1.17.1" + }, + { + "direct_url": null, + "metadata_sha256": "297fb30f701a800489c12893a951da3e5bd1f80061a1f43f0d3e9f1d4c6bc6fd", + "name": "sentencepiece", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "4245e0388ddf2048a38ae2a24a3d2c583408b2454aadc680d3c3beede639db3f", + "name": "sentry-sdk", + "version": "2.71.0" + }, + { + "direct_url": null, + "metadata_sha256": "ae8a9e6feec1a76e954d65ea48ac57842c9a7bfb5ac6e5ea82400a5ba9f71a98", + "name": "setproctitle", + "version": "1.3.7" + }, + { + "direct_url": null, + "metadata_sha256": "341d00772017437d0f6e3c943ae353f243c39fedfba403aea47cced927a76516", + "name": "setuptools", + "version": "79.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "ff4bcfb192bd542ed8f1794fb32ffc9eabd932d6e03cb00a4ad5e35a2469af88", + "name": "setuptools", + "version": "80.10.2" + }, + { + "direct_url": null, + "metadata_sha256": "f1e5a532fb8cda0bbc370e3db6cb9cea72a065d12ddd6a14976ba3cf66264221", + "name": "shellingham", + "version": "1.5.4" + }, + { + "direct_url": null, + "metadata_sha256": "2aba2cfd9c2ad7625a5d374d141af317d8f92d3534997bf98d127e52848dfc81", + "name": "six", + "version": "1.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "69ae2dfe547624be97fae348e1cfa3793f8854eed32cc1603badedc7d48fb36e", + "name": "smart_open", + "version": "8.0.2" + }, + { + "direct_url": null, + "metadata_sha256": "d415e6c6de7dee117d254a342668c489931bc88eac7ec8678b452078e366da6e", + "name": "smmap", + "version": "5.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "093bc4f0740a6fc28692e616aa8fe68d7e1d76426cc5a5faf9ea722a8ee7aaae", + "name": "sniffio", + "version": "1.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "b3cef071eb1dbeaa76a1273fe2ca2cc8ef36e835165253952d93780962529ac1", + "name": "sse-starlette", + "version": "3.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "3c01ca830e213f0311fe37bc3b46b8ab230a5e7acb894bf0fc8785cb7ccfed48", + "name": "starlette", + "version": "1.7.0" + }, + { + "direct_url": null, + "metadata_sha256": "6017ca508a293cf47a88a78cb330e9cbd131d74ec3c7fbf89bd4300ed3129d30", + "name": "supervisor", + "version": "4.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "fd5eb4925b04f9bffbc6c4f92bf8aea7243b918b43cd359493fce48a7dd3b336", + "name": "sympy", + "version": "1.14.0" + }, + { + "direct_url": null, + "metadata_sha256": "f09f0e24282c5a86346bcd5b10ae5ff81869fa8ef69c3ba524bd0a817a87dda9", + "name": "tabulate", + "version": "0.10.0" + }, + { + "direct_url": null, + "metadata_sha256": "519fa19c146fd58a0a75ecf1461e4bd98f9c06d01800c37d4a80f5fef095f4e1", + "name": "tensorboard", + "version": "2.21.0" + }, + { + "direct_url": null, + "metadata_sha256": "1af7ad76e4073b01ab147eb3c1d8e38b95d38062c6c9bc63890150738642e8eb", + "name": "tensorboard-data-server", + "version": "0.7.2" + }, + { + "direct_url": null, + "metadata_sha256": "9e597f62fc07e3b931d5c8fb0e90706fb6d45465cfb5d01dbd27ba7fc135c02c", + "name": "tensorstore", + "version": "0.1.80" + }, + { + "direct_url": null, + "metadata_sha256": "0da993d16ef6326f471796fcb065622f309c5c1aae6c6295b488ea64bb5c880c", + "name": "textual", + "version": "8.2.8" + }, + { + "direct_url": null, + "metadata_sha256": "52ca6148d4fd1497254855fa610cfdde99191cd42bce7a452fd3a68855504ac0", + "name": "tiktoken", + "version": "0.14.0" + }, + { + "direct_url": null, + "metadata_sha256": "0df9eb495cfb477dcbdfbdcd8c04d952d3eb00d77831630760571e13545398e5", + "name": "tilelang", + "version": "0.1.12" + }, + { + "direct_url": null, + "metadata_sha256": "802b576e011dc61bd2681593e8d802714b6c4ce636a9cf87035026db32ce6262", + "name": "tokenizers", + "version": "0.23.2" + }, + { + "direct_url": null, + "metadata_sha256": "4e1631b2164a49ff9a848d86ce504fdcc15e3540dbb262df8f33a2681a8de513", + "name": "tokenspeed-mla", + "version": "0.1.8" + }, + { + "direct_url": null, + "metadata_sha256": "05086095a775c5dca70998dcf442a848c13f9c68b54a54c510c3542c5abb6563", + "name": "tokenspeed-triton", + "version": "3.8.10.post20260920" + }, + { + "direct_url": null, + "metadata_sha256": "71daba472d0c5ffc25c0231dc29688ab0cb13d5bc7e7d93f6c4cce4169c50048", + "name": "torch", + "version": "2.13.0" + }, + { + "direct_url": null, + "metadata_sha256": "cccd2f1c0e5866e63732f58798c8d642ee6d10cd560d6f691e7981b908c246c9", + "name": "torch_c_dlpack_ext", + "version": "0.1.5" + }, + { + "direct_url": "{\"dir_info\": {}, \"url\": \"file:///torch_memory_saver\"}", + "metadata_sha256": "6276cef17dedbb5ee0d6157bbf63b832e916026281328d995ad3d488c2539618", + "name": "torch_memory_saver", + "version": "0.0.9.post1+slime" + }, + { + "direct_url": null, + "metadata_sha256": "29809ca2c86dda5079654f1f70564a64435e9d08f1964a2412b6f514e1b5ff64", + "name": "torchaudio", + "version": "2.11.0" + }, + { + "direct_url": null, + "metadata_sha256": "7e9be0f3a290e3fd9370d8fe010c7ffd006d5d3d05ab8bdf7df8f92f0fca9c39", + "name": "torchcodec", + "version": "0.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "181fa5e6b399c378711eddcdacd756d3c51317916f8eb160ee36cae7fae9589f", + "name": "torchvision", + "version": "0.28.0" + }, + { + "direct_url": null, + "metadata_sha256": "43d1261aff90cf3d5b1b40cf1f94234d61409b14e59f3766f457c1eec7f7ac15", + "name": "tqdm", + "version": "4.70.1" + }, + { + "direct_url": "{\"archive_info\": {\"hash\": \"sha256=3e1d9f534781c8e608240da0b495b8246317a36382f7609017cbaa7fb1d53f7b\", \"hashes\": {\"sha256\": \"3e1d9f534781c8e608240da0b495b8246317a36382f7609017cbaa7fb1d53f7b\"}}, \"url\": \"file:///wheels/transformer_engine-2.16.1%2Bc9877beb-cp312-cp312-linux_x86_64.whl\"}", + "metadata_sha256": "d882f743161d9d9f35dee4e1a8cc9136fa495f7c660caace01ab8f5602d76aa7", + "name": "transformer_engine", + "version": "2.16.1+c9877beb" + }, + { + "direct_url": null, + "metadata_sha256": "465797a59706d83b45c93fde750b228c3b6e1addc44115de2c4c02ad66d9c5ea", + "name": "transformers", + "version": "5.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "a91982ca086667c592a951973434f7c5a9f27a8300bc97af78dfb496afe53e71", + "name": "triton", + "version": "3.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "d26fbb244532c4051e715f9047cd943e2cc4abb0ac6f2a517fa2986eb1ea726a", + "name": "truststore", + "version": "0.10.4" + }, + { + "direct_url": null, + "metadata_sha256": "c84af1a069084b1b440b3594068dec29200d52d4c1a9b652030448717f270158", + "name": "typer", + "version": "0.27.2" + }, + { + "direct_url": null, + "metadata_sha256": "0ad6653b7439f4bb6a596cb7b01ed1b716458467525c4dc40b75d62bdb943c98", + "name": "typing-inspection", + "version": "0.4.4" + }, + { + "direct_url": null, + "metadata_sha256": "d005280aa13b334ac942d20219102865e559f69ffd06c35c248b2f0d0da3b933", + "name": "typing_extensions", + "version": "4.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "fba2930e9030a18965d243f8d330748db2e67572a81b3b68710462fb5110332a", + "name": "urllib3", + "version": "2.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "bc5717bd6524a33838f285261868bcc8e311e8c29fdb19e41d56c38b04890e84", + "name": "uvicorn", + "version": "0.54.0" + }, + { + "direct_url": null, + "metadata_sha256": "741c006d8441f562aa853a5430df236fbb4af923445491f396bf09943bd30258", + "name": "uvloop", + "version": "0.22.1" + }, + { + "direct_url": "{\"dir_info\": {\"editable\": true}, \"url\": \"file:///vime\"}", + "metadata_sha256": "f85aa01dfdc868756a6583434bbff040f29eb511d47d5b25ada063a84353aac6", + "name": "vime", + "version": "0.3.2" + }, + { + "direct_url": null, + "metadata_sha256": "c25431aaf1950971fe96292f395a41a55b403127bfca0d0b8f7dc9cff5dab75d", + "name": "virtualenv", + "version": "21.14.1" + }, + { + "direct_url": null, + "metadata_sha256": "4e3ee0a31d85e56268640aae853bcee4794dfe8c0483c5c6370517e480c81ae0", + "name": "virtualenv", + "version": "21.14.5" + }, + { + "direct_url": null, + "metadata_sha256": "d4ed5c7551cddb8c1aeff2f9f27b3491f6ad2c9afda8e7bb9779c33fa12a536c", + "name": "vllm", + "version": "0.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "84b482e09bac949e992594757214a1920c667a5d898ee320e309250697f6d26e", + "name": "vllm-router", + "version": "0.1.15" + }, + { + "direct_url": null, + "metadata_sha256": "9b16c871eb1060a5218e9b9a9ad33288d94844cfaf43f08dbb6c32423bde8fe3", + "name": "wandb", + "version": "0.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "8e4f2be437dfe4eb3c6c959e517ac20b75d06525563f1ebcbf06f9ec648bd7c1", + "name": "watchdog", + "version": "6.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "15218afb42938907c2ca74c54e3d8e3a5406493c4761e29e38e82bfec0f84296", + "name": "watchfiles", + "version": "1.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "8863af96e88b7db9990da99aa6c46816eacc3d2f9ae1297b53381b033cd70119", + "name": "wcmatch", + "version": "11.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "f46e6bd6cfafb2b684c29587b017b7096fd9155b74eda25a22eca784b9803ab7", + "name": "websockets", + "version": "16.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "ce82db5ccfefa4bfbe4e25a36e1f91e8e7d51fcaeb31586c4d48e1c69f99168b", + "name": "websockets", + "version": "17.1" + }, + { + "direct_url": null, + "metadata_sha256": "0f142a2c09eac643c7d0bfe77f3f121184c0b17914afbd32af669ed19b2b02ef", + "name": "wheel", + "version": "0.47.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd58938e51a3c5cb363f6f22eaa2a8a7accc1ce373388de167a82f77d3e5783f", + "name": "wrapt", + "version": "2.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "b0b72c1941f04499ca7e1a3a6e479aee8df902c3d49979624b59dba8c3228d37", + "name": "xgrammar", + "version": "0.2.8" + }, + { + "direct_url": null, + "metadata_sha256": "ef8861f39e5c36255966a36032651f937d890d55f31f1c26304b488f1ba34332", + "name": "xxhash", + "version": "4.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "740c08057b6eb69c58402c87d652af0a471e46325d811f2c605632a18817152f", + "name": "yarl", + "version": "1.25.1" + }, + { + "direct_url": null, + "metadata_sha256": "7b060e4d24394b5431875e2f74fec8e6bffa79d2e6b4cb8c7e2a5187dd2d8d69", + "name": "z3-solver", + "version": "4.15.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "3d76d4fbc95f0851191147db12300938c67a6f8fb1df884886d9601272ccc4e8", + "name": "zipp", + "version": "4.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "d3de2651e4e908dbb7c9d80508e5179590217dfac4993dc8b04381c5b9718c4c", + "name": "zstandard", + "version": "0.25.0" + } + ], + "executable": "", + "installed_provider_sources": { + "vllm/compilation/__init__.py": { + "path": "/vllm/compilation/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/backends.py": { + "path": "/vllm/compilation/backends.py", + "sha256": "fa4bff8920b363efbbde9456f135fa9d2c004a5bde1898877f177418b2d8b008" + }, + "vllm/compilation/base_static_graph.py": { + "path": "/vllm/compilation/base_static_graph.py", + "sha256": "5cfe8e06db84aa42cd41cdd93ebe93af00b3a242c8011042057530e2922b523a" + }, + "vllm/compilation/breakable_cudagraph.py": { + "path": "/vllm/compilation/breakable_cudagraph.py", + "sha256": "3cc427612a08e2b9b3fee47548026400c1d0776e2d4747535e59ef5512bdf1e8" + }, + "vllm/compilation/caching.py": { + "path": "/vllm/compilation/caching.py", + "sha256": "71d212452dde742fbf28b8a01ed29d3c08a7457ff7f8da2a20ce9d17e902c2cf" + }, + "vllm/compilation/codegen.py": { + "path": "/vllm/compilation/codegen.py", + "sha256": "e04833bec88cf9d1a13aa7341e30e3233d1138bfe23424e0fd34d664b3fedb9f" + }, + "vllm/compilation/compiler_interface.py": { + "path": "/vllm/compilation/compiler_interface.py", + "sha256": "8d84e2864bf83f754bae9e9f77119e0287cca9f97f5fa5ec2535e07b5ad88944" + }, + "vllm/compilation/counter.py": { + "path": "/vllm/compilation/counter.py", + "sha256": "d8158c54dd36a357bf24f6f84dc22f572d3a27f4875f3d5779b12bc5d454ff76" + }, + "vllm/compilation/cuda_graph.py": { + "path": "/vllm/compilation/cuda_graph.py", + "sha256": "05c86392d7fae967ac73076dba7e01990a0e3ae619e4866450a0c1be56bd1192" + }, + "vllm/compilation/decorators.py": { + "path": "/vllm/compilation/decorators.py", + "sha256": "cab6962e8a1fead59c75f5ed8cb4732f9e5441ff972030c2f4b1c4ba0c58de3c" + }, + "vllm/compilation/monitor.py": { + "path": "/vllm/compilation/monitor.py", + "sha256": "43b24c5cb1bc4d32dc979f3222596905c7b3acc58415328a234402e6edc76abf" + }, + "vllm/compilation/partition_rules.py": { + "path": "/vllm/compilation/partition_rules.py", + "sha256": "857d2fb06dc871ea1d3717cd01fbd4e5205984100d98b7b72a2933d6ff1cfa4d" + }, + "vllm/compilation/passes/__init__.py": { + "path": "/vllm/compilation/passes/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/fusion/__init__.py": { + "path": "/vllm/compilation/passes/fusion/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/fusion/act_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/act_quant_fusion.py", + "sha256": "1fa9c3ca4fb424685b7053c3dda89dda16c98dc5645d85f0f28dca58429792b3" + }, + "vllm/compilation/passes/fusion/add_rms_fusion.py": { + "path": "/vllm/compilation/passes/fusion/add_rms_fusion.py", + "sha256": "e46998552628aa5cd5962fc39ea39ae824fd97e6aeba1d176e9cc7cade39837b" + }, + "vllm/compilation/passes/fusion/allreduce_rms_fusion.py": { + "path": "/vllm/compilation/passes/fusion/allreduce_rms_fusion.py", + "sha256": "0af193505880cec0f6ffa224c688bce3c9ddc318dccdf04a696b4e4b4506a963" + }, + "vllm/compilation/passes/fusion/attn_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/attn_quant_fusion.py", + "sha256": "ecc64e82be4481954c9cac6c23d7794846ab19486b570f2dda07ab5ad67c5a49" + }, + "vllm/compilation/passes/fusion/collective_fusion.py": { + "path": "/vllm/compilation/passes/fusion/collective_fusion.py", + "sha256": "1e2c8539d6960b45907fb3bf0482441ea7250e97c56ffdea1500514efa0b164d" + }, + "vllm/compilation/passes/fusion/matcher_utils.py": { + "path": "/vllm/compilation/passes/fusion/matcher_utils.py", + "sha256": "50ac5714ce1bb113520de769ea6234316acc470a8cdf2537a996ce9a9d54337d" + }, + "vllm/compilation/passes/fusion/mla_attn_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/mla_attn_quant_fusion.py", + "sha256": "a966fe7f58bf9228379f793f5fd851735a97f9639722766b2a20cb79a9e4baec" + }, + "vllm/compilation/passes/fusion/mla_rope_kvcache_cat_fusion.py": { + "path": "/vllm/compilation/passes/fusion/mla_rope_kvcache_cat_fusion.py", + "sha256": "1602cc28055ffa8d1123ddb1d256bf0bd12006fd06ea7e16a986c55746dbe0dc" + }, + "vllm/compilation/passes/fusion/qk_norm_rope_fusion.py": { + "path": "/vllm/compilation/passes/fusion/qk_norm_rope_fusion.py", + "sha256": "aebc7d1a5189b65ac665afcc169e7baebd53efe719c48e35e7c5babe85af0d39" + }, + "vllm/compilation/passes/fusion/qk_norm_rope_kvcache_fusion.py": { + "path": "/vllm/compilation/passes/fusion/qk_norm_rope_kvcache_fusion.py", + "sha256": "f0cfd0d83ec4acb09f9bf91d199b114e9d4995e3059c13eb23a6978ce7c07eb2" + }, + "vllm/compilation/passes/fusion/rms_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rms_quant_fusion.py", + "sha256": "4852aa44e0e2087043fdac271bda9b8d9bfe3201bb84ce3919b8ed454d8083c4" + }, + "vllm/compilation/passes/fusion/rocm_aiter_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rocm_aiter_fusion.py", + "sha256": "372e76c68c75209a085deec6dd22b3816be633613ca82f6f2925c1b3773d61a0" + }, + "vllm/compilation/passes/fusion/rope_kvcache_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rope_kvcache_fusion.py", + "sha256": "3a756e9049593537143b5a56ab9185a6bc83f57ed81d84226d7791a46a984b53" + }, + "vllm/compilation/passes/fusion/sequence_parallelism.py": { + "path": "/vllm/compilation/passes/fusion/sequence_parallelism.py", + "sha256": "3af7e420dcb35fff0bae0f8f599d0f1bda34445ebe194059892a434b2976d654" + }, + "vllm/compilation/passes/fx_utils.py": { + "path": "/vllm/compilation/passes/fx_utils.py", + "sha256": "730708213acf9d1b5f3176b433dfc197a5f3c81b5ce443f0923c526924833003" + }, + "vllm/compilation/passes/inductor_pass.py": { + "path": "/vllm/compilation/passes/inductor_pass.py", + "sha256": "1f380aacf7adabb8bf8b7d41c0a93473947f0716f7445bd910fd448f6c08e672" + }, + "vllm/compilation/passes/ir/__init__.py": { + "path": "/vllm/compilation/passes/ir/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/ir/clone_elimination.py": { + "path": "/vllm/compilation/passes/ir/clone_elimination.py", + "sha256": "5297078f5cddce081faba5215814275381d2083b32318fcfeb2bf9d69fedb7c7" + }, + "vllm/compilation/passes/ir/inplace_functionalization.py": { + "path": "/vllm/compilation/passes/ir/inplace_functionalization.py", + "sha256": "2dc4f22c6f05224828c2941479185b1452d4490f488b7f0bfd124334e7809fed" + }, + "vllm/compilation/passes/ir/lowering_pass.py": { + "path": "/vllm/compilation/passes/ir/lowering_pass.py", + "sha256": "d9c3d90f63138420f0e5489447b5996573fcfbbab939da2efccd00848492b172" + }, + "vllm/compilation/passes/ir/utils.py": { + "path": "/vllm/compilation/passes/ir/utils.py", + "sha256": "f59d33a6c7d0616cbeec1e9fb1d6c948881bf81fe124caeb906eac2e2197ea21" + }, + "vllm/compilation/passes/pass_manager.py": { + "path": "/vllm/compilation/passes/pass_manager.py", + "sha256": "486979a058aa2e20ebedcbb6e039f7a59f38d2efd2cda11219fae4067be0968d" + }, + "vllm/compilation/passes/utility/__init__.py": { + "path": "/vllm/compilation/passes/utility/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/utility/fix_functionalization.py": { + "path": "/vllm/compilation/passes/utility/fix_functionalization.py", + "sha256": "ad5b504a05ccee023869b0c8df70ec2fff9a4a80d25fd903e2b532f470e7203f" + }, + "vllm/compilation/passes/utility/noop_elimination.py": { + "path": "/vllm/compilation/passes/utility/noop_elimination.py", + "sha256": "8abf85d28c13f95059f2acbc0275b9b9ed2ad4990f7c5763bbe3067a4aa629ce" + }, + "vllm/compilation/passes/utility/post_cleanup.py": { + "path": "/vllm/compilation/passes/utility/post_cleanup.py", + "sha256": "1c38b14fc209165cbcf8ca763a17ac4e528b97f59b573e5d52df2cce7d758de3" + }, + "vllm/compilation/passes/utility/scatter_split_replace.py": { + "path": "/vllm/compilation/passes/utility/scatter_split_replace.py", + "sha256": "138402cc3097768a32e9e5b8d1a054b6176e494bddc8684e23ca2dc5fdc3fdda" + }, + "vllm/compilation/passes/utility/split_coalescing.py": { + "path": "/vllm/compilation/passes/utility/split_coalescing.py", + "sha256": "0b02acd9e1ad43d7b3e128b914e969b9580773f2818078846dfbf163a8bd0871" + }, + "vllm/compilation/passes/vllm_inductor_pass.py": { + "path": "/vllm/compilation/passes/vllm_inductor_pass.py", + "sha256": "4f83ffb67f834a214221d810c7843a8e41eb4e5930eb40adbd8cf054ff6fb9c6" + }, + "vllm/compilation/piecewise_backend.py": { + "path": "/vllm/compilation/piecewise_backend.py", + "sha256": "6525318ff3ca2e4978e24dd9232a7ae0a02e920e19604b83db6f6043d1f8a54d" + }, + "vllm/compilation/wrapper.py": { + "path": "/vllm/compilation/wrapper.py", + "sha256": "c1b1fca679ea16aa07a696831a810c0d531da2bb0ea32dd6f1a95cdaef36de07" + }, + "vllm/config/__init__.py": { + "path": "/vllm/config/__init__.py", + "sha256": "56fb0cb1598d297e4f95a97e5d86dc624145d1532f5faa432b7d2834d7155bd5" + }, + "vllm/config/attention.py": { + "path": "/vllm/config/attention.py", + "sha256": "c41f345b512d9b7df882328257eb3a6381f41088c11ae83b5ecd8a9e8265d1bc" + }, + "vllm/config/cache.py": { + "path": "/vllm/config/cache.py", + "sha256": "f1c226ba679c884930dbfcaf41a57248b137a9a20d3ed8e3d3b31752bb484c07" + }, + "vllm/config/compilation.py": { + "path": "/vllm/config/compilation.py", + "sha256": "c9cec5c7200e8e559810ec8c30113ad61dab6780f9f7fb3c116bd0d9b5a43065" + }, + "vllm/config/device.py": { + "path": "/vllm/config/device.py", + "sha256": "7b82eee02ceb5842337451a27a3d5729920c47e25e8f6bf3997f5146f9330a9c" + }, + "vllm/config/diffusion.py": { + "path": "/vllm/config/diffusion.py", + "sha256": "1fa9fd2478a866098a28a3586b55af2f9738656b7813a55d76539c10dd99fe8d" + }, + "vllm/config/ec_manager_config.py": { + "path": "/vllm/config/ec_manager_config.py", + "sha256": "418b387dbe7bdf67deddce331c205768a2d42aea37141f59fb02a8a1528e3552" + }, + "vllm/config/ec_transfer.py": { + "path": "/vllm/config/ec_transfer.py", + "sha256": "0eabb2c25194676d23c6acf59562672a1dd24415043ac5737d621ce0d681ec70" + }, + "vllm/config/engram.py": { + "path": "/vllm/config/engram.py", + "sha256": "34043a22385a041d4e9be8857f64174c990c2ca8308b97b6a952b5ab96c20ee5" + }, + "vllm/config/fault_tolerance.py": { + "path": "/vllm/config/fault_tolerance.py", + "sha256": "b166b24373d599fb15ddc575e3061cf0dcb42174d0369d8468008e7ffbb2a4e2" + }, + "vllm/config/kernel.py": { + "path": "/vllm/config/kernel.py", + "sha256": "27e23c584cf862f4091858db6dc85bbc2a01f4baf9dca3f232ae6f3bac02390e" + }, + "vllm/config/kv_events.py": { + "path": "/vllm/config/kv_events.py", + "sha256": "b1dbaee3e6830e381e9157fe3bab0d65c357da88ff7cdf8b1e4b3a4e75c82a87" + }, + "vllm/config/kv_transfer.py": { + "path": "/vllm/config/kv_transfer.py", + "sha256": "506fae7a9d7f32cb3646156cf9249a856f6317dff6c4c85db70efd34418c429b" + }, + "vllm/config/load.py": { + "path": "/vllm/config/load.py", + "sha256": "bd6431c22e078362d749a56a2c84145432ebf2605d8bcfa2ac679182d18ed630" + }, + "vllm/config/lora.py": { + "path": "/vllm/config/lora.py", + "sha256": "ed6cf6575f5950f079a62f904caeae93d1a4745dd8c21788b74367883bcd4b08" + }, + "vllm/config/mamba.py": { + "path": "/vllm/config/mamba.py", + "sha256": "2090f791201ca45dd4f1d72b8651268890eb07574b6084721194eb8fdf612c48" + }, + "vllm/config/model.py": { + "path": "/vllm/config/model.py", + "sha256": "f4168b67cc93ce72ff2a6d4c66974223e32fd0f1fab4c05e44bd68a275e18d69" + }, + "vllm/config/model_arch.py": { + "path": "/vllm/config/model_arch.py", + "sha256": "2babe28329d7b60b4e205f6d72c687f0f66e6535aa2f20411469e5ec362f6b5f" + }, + "vllm/config/multimodal.py": { + "path": "/vllm/config/multimodal.py", + "sha256": "271911aee151f17f092228cecee82af0713e9a47340ffdf66834ca7638a50d22" + }, + "vllm/config/observability.py": { + "path": "/vllm/config/observability.py", + "sha256": "d57c59ec776477ab0a20e9f2b945bc954d8ea3737c869259480e9aa10dfb9f6d" + }, + "vllm/config/offload.py": { + "path": "/vllm/config/offload.py", + "sha256": "6f2db3d9a2730588473d5155811690c6241b167a21dcb62fbbd9ebb6386de42c" + }, + "vllm/config/parallel.py": { + "path": "/vllm/config/parallel.py", + "sha256": "f012ace89e3fb730a467f729f602679bc145c49f0d10721811c9d818570e7b2b" + }, + "vllm/config/pooler.py": { + "path": "/vllm/config/pooler.py", + "sha256": "9f01913dcb7bccbf9b672b16643f18471ae202455992e8afaf0725a17f2b3d08" + }, + "vllm/config/profiler.py": { + "path": "/vllm/config/profiler.py", + "sha256": "04d24fa1dc7cfedca6b5c7d9115f7f7021722fc46a5b15234a1e3b3a506c93e5" + }, + "vllm/config/quantization.py": { + "path": "/vllm/config/quantization.py", + "sha256": "acffc52f525b39a88efd656f1ed705ce3a1b758298bb0684fac7694776bc10b4" + }, + "vllm/config/reasoning.py": { + "path": "/vllm/config/reasoning.py", + "sha256": "2c4f7bdee48a9fb3d93787c4c32361c2411417cce452cfde86808d8759977861" + }, + "vllm/config/scheduler.py": { + "path": "/vllm/config/scheduler.py", + "sha256": "822179da62be4bca0619c8590082ae09123f5c4415f9cc2037be673748239edb" + }, + "vllm/config/speculative.py": { + "path": "/vllm/config/speculative.py", + "sha256": "9c642a87264339c0dbc1d0b57330572149df0f9d5e16c6893b9895e50a619e19" + }, + "vllm/config/speech_to_text.py": { + "path": "/vllm/config/speech_to_text.py", + "sha256": "bf4a566fbde6a1cec1e209070b739650c3302c12696739c88049cb8f723a4c3f" + }, + "vllm/config/structured_outputs.py": { + "path": "/vllm/config/structured_outputs.py", + "sha256": "55649776594349b8b4aa3e08fc4c88068366732a486d6fb235079188044aa829" + }, + "vllm/config/utils.py": { + "path": "/vllm/config/utils.py", + "sha256": "d035e9e488ba92b6c47a96cf05d9b2a850d53eda8a05115b22ff9af8dbc2fc64" + }, + "vllm/config/vllm.py": { + "path": "/vllm/config/vllm.py", + "sha256": "956b812e5a719bcbfa3a3958801361b38b9c928c96b8c073311bbb96376dfb7a" + }, + "vllm/config/watermarking.py": { + "path": "/vllm/config/watermarking.py", + "sha256": "30e6620a3cd7529f0736ad55e38bc326a6a78dee4552f0722208400041c94a1f" + }, + "vllm/config/weight_transfer.py": { + "path": "/vllm/config/weight_transfer.py", + "sha256": "92edd9e5ea90c97a8f3c5f20abf1734a105ee1f3f89e306e7ba87e758f1f767e" + }, + "vllm/distributed/__init__.py": { + "path": "/vllm/distributed/__init__.py", + "sha256": "97f28c30b32662af8cab163939e4ee423037f11630752e13b55cbc25a7d0ab71" + }, + "vllm/distributed/communication_op.py": { + "path": "/vllm/distributed/communication_op.py", + "sha256": "3c3f8ac60db38ece891d39dc1e2f6f1947ad438685893d2e5777d072320bd1b8" + }, + "vllm/distributed/device_communicators/__init__.py": { + "path": "/vllm/distributed/device_communicators/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/device_communicators/aiter_custom_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/aiter_custom_all_reduce.py", + "sha256": "f8eb027ce7a85d94af6260960ceb7f36fc6f1406c9af9c9b6285fddb3f178009" + }, + "vllm/distributed/device_communicators/all2all.py": { + "path": "/vllm/distributed/device_communicators/all2all.py", + "sha256": "1f1b69236acd3cd7bd94520fd6d591bfd31b57c4bc7c9f9f4161ea8bbd0c5f26" + }, + "vllm/distributed/device_communicators/all_reduce_utils.py": { + "path": "/vllm/distributed/device_communicators/all_reduce_utils.py", + "sha256": "ed0ab4dd05b2519a6313892e68824c97b540034664d7f8c3d031b322e33e1bfc" + }, + "vllm/distributed/device_communicators/base_device_communicator.py": { + "path": "/vllm/distributed/device_communicators/base_device_communicator.py", + "sha256": "4a7670f12ed7c7621b25d476e2687c24ca01f3be183fff4a6a25337596fe506b" + }, + "vllm/distributed/device_communicators/cpu_communicator.py": { + "path": "/vllm/distributed/device_communicators/cpu_communicator.py", + "sha256": "e1856c8e91cfbbb4d9ce990c1236e258ba4021e226afcbab645653380b38d64b" + }, + "vllm/distributed/device_communicators/cuda_communicator.py": { + "path": "/vllm/distributed/device_communicators/cuda_communicator.py", + "sha256": "102d95c67ec798cf352b817ba92e8abc9da37f30d1bbdf3aab45d3927b627b93" + }, + "vllm/distributed/device_communicators/cuda_wrapper.py": { + "path": "/vllm/distributed/device_communicators/cuda_wrapper.py", + "sha256": "333b6d9ed173e7a18c7f2b6627a3c9c9ed88892ce52015f05e29d6d245e48ee3" + }, + "vllm/distributed/device_communicators/custom_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/custom_all_reduce.py", + "sha256": "a048c1327c23580805600c0c951831bec333b1ffc4eb26a0e3d34119c4f0c445" + }, + "vllm/distributed/device_communicators/flashinfer_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/flashinfer_all_reduce.py", + "sha256": "b4359760e9b55963676109a5c3a015fb82e190d4df1d021de9ee01e7814cbdda" + }, + "vllm/distributed/device_communicators/flashinfer_pcie_ipc_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/flashinfer_pcie_ipc_all_reduce.py", + "sha256": "8b67b0fc356a565095f56b475cc89c513e3a5eff051ab1c52e5beb0c1a79e9f2" + }, + "vllm/distributed/device_communicators/mnnvl_compat.py": { + "path": "/vllm/distributed/device_communicators/mnnvl_compat.py", + "sha256": "72ee1e6f9571b4c8ecbd9f60cd469d1b565cb79cab519a688a93f290906a2615" + }, + "vllm/distributed/device_communicators/pynccl.py": { + "path": "/vllm/distributed/device_communicators/pynccl.py", + "sha256": "882fb83c5a3c565a3f8fd664b79f5ceae566dca180019ecafd74bc8c11d9f8cf" + }, + "vllm/distributed/device_communicators/pynccl_allocator.py": { + "path": "/vllm/distributed/device_communicators/pynccl_allocator.py", + "sha256": "390e2576cbf4ae06341ca4dab24fc7e4d4f7c24dd444329ed05d828a9ce91460" + }, + "vllm/distributed/device_communicators/pynccl_wrapper.py": { + "path": "/vllm/distributed/device_communicators/pynccl_wrapper.py", + "sha256": "ce63c8da57bb88d4cf89956bd70bb63f0f44bfad468ddb37b765611551f6d99f" + }, + "vllm/distributed/device_communicators/quick_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/quick_all_reduce.py", + "sha256": "8aacb23e7c297b0ae2f80d99c5affd2e7517115d7874be51069d14a44db7b5f2" + }, + "vllm/distributed/device_communicators/ray_communicator.py": { + "path": "/vllm/distributed/device_communicators/ray_communicator.py", + "sha256": "332c37f65495b60564d61db59bc2d30ca0236adc33442d01464790bde9aec897" + }, + "vllm/distributed/device_communicators/shm_broadcast.py": { + "path": "/vllm/distributed/device_communicators/shm_broadcast.py", + "sha256": "f3e7a3f3ff713fccbd535e0d41650ee05bdf8677e83d4b90519910645022c30b" + }, + "vllm/distributed/device_communicators/shm_object_storage.py": { + "path": "/vllm/distributed/device_communicators/shm_object_storage.py", + "sha256": "e097bf7ac0141fe8db4131e8fd553ca2ad5b0600b22a56f3924af6b795e7207c" + }, + "vllm/distributed/device_communicators/symm_mem.py": { + "path": "/vllm/distributed/device_communicators/symm_mem.py", + "sha256": "b06e3ddb9ae880a30ec4a103ce32eb9794223bb0293832e89572af28adaaa544" + }, + "vllm/distributed/device_communicators/xpu_communicator.py": { + "path": "/vllm/distributed/device_communicators/xpu_communicator.py", + "sha256": "527cbfb250760abc62096ee7cd612307b821f21b72dee1687ad866620ec89b6d" + }, + "vllm/distributed/ec_transfer/__init__.py": { + "path": "/vllm/distributed/ec_transfer/__init__.py", + "sha256": "061405bb51df7409c9938b62e25caa8bd6ebf85da6d1700dbd4affe2a0825135" + }, + "vllm/distributed/ec_transfer/ec_connector/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/base.py", + "sha256": "22d4913375bb622473fbe1a77f9376b804949cd8a7e31e9518208f9561d161e2" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/common.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/common.py", + "sha256": "e2267abd8d00a6d2605e1a82ea5c73396a71b427452eab469fcca0134c334e7c" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/connector.py", + "sha256": "72cd35d9fd754a2992dd090a8af13c91e0789b4038ac29276750d823120235db" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/base.py", + "sha256": "19e8df88b0fa831997896355ecdd49e0d86cb074cd7ae28aed0b328b0bb3ab2e" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/zmq.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/zmq.py", + "sha256": "435641c0e37551ab4937855abd067be26905b91215e759cbd9d28a419a34ff9a" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/base.py", + "sha256": "3be698aeb67d32ee3741e76b2fb71806941c587578583acf8fbc42fbf22b46a5" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/nixl.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/nixl.py", + "sha256": "03af8f6549a6027b7262a482907af591e45f28b9b1c5a3408bbc6600e38797e5" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/ec_shared_region.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/ec_shared_region.py", + "sha256": "e40607952c9920024455eca2f419e8c3ef1de9a4d8b27c147a33bb941b8c08b1" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/protocol.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/protocol.py", + "sha256": "05878336884396bfbef77b96b0fa6359f6fa0aba912961f14a84f5a436f27038" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/__init__.py", + "sha256": "01c42385bf3a55cff09cc05ba956f6dd4b8b6b986bf4d6eca4e566cb045b48e0" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/embedding_cache.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/embedding_cache.py", + "sha256": "7359fb980af1fc30b3253681310ef636e2b4a19134e04a93270c9c45de2572d8" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/session.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/session.py", + "sha256": "5973548a919e13c866222b91d502686a6757a31e5a5664b879bf2887ed9fb212" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/utils.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/utils.py", + "sha256": "160ac665f20f2c75b343c1e784084f2b0b4d1cf8fdb28ee15deee4dc8ed0ce45" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/worker/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/worker/__init__.py", + "sha256": "f08d296d3560c42173ae8af961af4a768033ccf1e36e9c17c0cdd53013d0c52e" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/worker/descriptor_buffers.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/worker/descriptor_buffers.py", + "sha256": "be7c81be214e995da8499105ba485854d9c19d6f8e905f8f1b87b83694ca0864" + }, + "vllm/distributed/ec_transfer/ec_connector/example_connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/example_connector.py", + "sha256": "09022ce07a89114bb65d9befd2e60873453aed11bbac8c0a75c1e6084e785a5f" + }, + "vllm/distributed/ec_transfer/ec_connector/factory.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/factory.py", + "sha256": "d6cedca0a99c3dd2b03cd1c15d17472b983e3f7d8f5baf4a12eecaf6abedb817" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/__init__.py", + "sha256": "1cbfc2f95f8f4d48a9253056eb1fd4b562062884e3fd5cb6571583c352fc16f3" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/config.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/config.py", + "sha256": "98c60696f79d1de67d2364cd9e8a42a393b5c8e17ed9af2f971368e47891d7b3" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/control.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/control.py", + "sha256": "58e0d1a423fbe958bfa586ac26a17107e08d0b31d044b4c74ab4dde880e7ca9b" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/memory.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/memory.py", + "sha256": "d5e90b1348de670a70f110d58eedcbdbd053db72c21dd007c3f5275c53951149" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/metadata.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/metadata.py", + "sha256": "497a7e6dfffb7fce80a41d5989f96119b970c143df77bb9d0f9c91d7a46e8c42" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/producer.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/producer.py", + "sha256": "97fa4d0b19475574778eab02f55fad73db9642beb9156da890314fd53fa1a7ab" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/reservation.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/reservation.py", + "sha256": "4790bc65cde4db5f17733ca2c2910980ba594a8a9b79ee27c5b957dffd4c1113" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/scheduler.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/scheduler.py", + "sha256": "53004b62529a31fdd80dfb2e6026610b95041a77e91f731ae526fefd84e7968d" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/state.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/state.py", + "sha256": "92f375d6c5cc9c83dbe95a7977ad8eb0f1b5629ccee92968bcacdc94eee15d65" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/transfer.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/transfer.py", + "sha256": "ada2113a5402054f1149d3edc2537f4e5e1bd696c9b17291c9f2b4cbf6b59753" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/worker.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/worker.py", + "sha256": "89eb91bb64845b3b121d502972a6b04d448714253becd2ea662e5691cd5acdd7" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake_ec_connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake_ec_connector.py", + "sha256": "aaebab4711bc00dd0c622dfbfd8639fc41e7ed5d1658d7d68fe33e4d5fbef3ba" + }, + "vllm/distributed/ec_transfer/ec_connector/utils.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/utils.py", + "sha256": "11b9014b9c0697f8846deff1a55a22fa86a15dc2ac3e139442fb6d513ac03059" + }, + "vllm/distributed/ec_transfer/ec_transfer_state.py": { + "path": "/vllm/distributed/ec_transfer/ec_transfer_state.py", + "sha256": "9487a41f23fa1a4fa6dfca8b42b8e97a0ee19d8406ffd1dcf4bef66315180827" + }, + "vllm/distributed/elastic_ep/__init__.py": { + "path": "/vllm/distributed/elastic_ep/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/elastic_ep/elastic_execute.py": { + "path": "/vllm/distributed/elastic_ep/elastic_execute.py", + "sha256": "b8f60a4183c79ff6051095b5f95bb385bc7fea0cffe8cd9ebc9087ab0e9f01b5" + }, + "vllm/distributed/elastic_ep/elastic_state.py": { + "path": "/vllm/distributed/elastic_ep/elastic_state.py", + "sha256": "fbf049199841a086fdf2fc1ab8498ef017ad3bf319db65c3ae61acbb536d2e10" + }, + "vllm/distributed/elastic_ep/standby_state.py": { + "path": "/vllm/distributed/elastic_ep/standby_state.py", + "sha256": "15282597550ebd0e07b8492ff192aea1ec0dcec8f0ad34009123e1002cc140c1" + }, + "vllm/distributed/eplb/__init__.py": { + "path": "/vllm/distributed/eplb/__init__.py", + "sha256": "1b9c2ee22abb5888c354c5aa01f0944f253e5e24e135d019778398bbe495a628" + }, + "vllm/distributed/eplb/async_worker.py": { + "path": "/vllm/distributed/eplb/async_worker.py", + "sha256": "424328600ad1003286fc5dfffa1f9482007314c060947818b2f94a8b97811f5e" + }, + "vllm/distributed/eplb/eplb_communicator.py": { + "path": "/vllm/distributed/eplb/eplb_communicator.py", + "sha256": "ba30d9d40e7b81d3f42aa9041d2f328edca4073cfe2de920285eb68375501ed8" + }, + "vllm/distributed/eplb/eplb_state.py": { + "path": "/vllm/distributed/eplb/eplb_state.py", + "sha256": "2f06bc8c63f3fdf55edb5032ae55c0ffcac3e67720ce74ea312e3d141b12acf4" + }, + "vllm/distributed/eplb/eplb_utils.py": { + "path": "/vllm/distributed/eplb/eplb_utils.py", + "sha256": "058af6104faa6d4085c1dca80bbe60d92bf0a7ec9cd92c775a180546c9d8c9c3" + }, + "vllm/distributed/eplb/policy/__init__.py": { + "path": "/vllm/distributed/eplb/policy/__init__.py", + "sha256": "daeb266c88442832b1ab8c8c4cc064891b38b9e9ba00aea324f926c87dc6d37e" + }, + "vllm/distributed/eplb/policy/abstract.py": { + "path": "/vllm/distributed/eplb/policy/abstract.py", + "sha256": "b9fd34c28bbfdded03360d7f3f6f8fb978e82689190d7ae4501dfe520e958c62" + }, + "vllm/distributed/eplb/policy/default.py": { + "path": "/vllm/distributed/eplb/policy/default.py", + "sha256": "3b54229e6240d050480390f6b29d4744fd38437d23719f78a6decf7002296a29" + }, + "vllm/distributed/eplb/rebalance_execute.py": { + "path": "/vllm/distributed/eplb/rebalance_execute.py", + "sha256": "b387e228791149018536eee96cf955b33ba79d801cdc36849d1b47a580ec2597" + }, + "vllm/distributed/kv_events.py": { + "path": "/vllm/distributed/kv_events.py", + "sha256": "de08f01e8736881560256c350a3b6418999dd4aa30f9c6ec9159527f7ed6899a" + }, + "vllm/distributed/kv_transfer/__init__.py": { + "path": "/vllm/distributed/kv_transfer/__init__.py", + "sha256": "c1be4e58ec6923bae607a355ad22891c740f056a69ff7358b1e10ea3fd2680ea" + }, + "vllm/distributed/kv_transfer/kv_connector/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/base.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/base.py", + "sha256": "2ae2a2c48f5731f3533166a75440fe91e764332305b5d713df840edba970789d" + }, + "vllm/distributed/kv_transfer/kv_connector/factory.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/factory.py", + "sha256": "add99c93c587b0098b90b1f8fd6940bdd1f15c236c5c6f1a258411863cb902d3" + }, + "vllm/distributed/kv_transfer/kv_connector/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/utils.py", + "sha256": "317ed40dc837671ca6e666165222e641a0f9b3992aea63bbf54de7e13d40b3a4" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/__init__.py", + "sha256": "5beb6ccad12fdcfe1581982da6f18321caca50e73a6b3259ebf3c8dc8b3ffcca" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/base.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/base.py", + "sha256": "97af64220475c6c9e8273438d7b5138b105ebe6944beb783facb36a3bb76f31b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/decode_bench_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/decode_bench_connector.py", + "sha256": "b4151c88cdec28f1ff9259047abc17baf23b892f4b68769a93bf26e0442b9017" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/example_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/example_connector.py", + "sha256": "6226876ef52d10d0d284d29c337ab44698e8bac6abdb2e0ece53b5756c55d068" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/example_hidden_states_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/example_hidden_states_connector.py", + "sha256": "58c22534dcad0fb73599a2d70a2fb104d5b612a4723be5e777f56a56fe07892c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/flexkv_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/flexkv_connector.py", + "sha256": "de4f68c3bd565ed898e47e0b2980049b966ff31888f1957050d30995d4953762" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_client.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_client.py", + "sha256": "bea6ecff2be281c7e96c1551c7bf463cbb01f2964696067c0ebdb683844f9aab" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_connector.py", + "sha256": "e67ed58015090e5eea9d499883f2a9422673d07f8bdbe0ccff7db15d2460de13" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_metadata_server.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_metadata_server.py", + "sha256": "6800e5cf37809f8a8e28c469c14a434db288bc3bf83a8b62ee06910a20c2da19" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/common.py", + "sha256": "8f2c02c08227a9093e6aeb183961aba36b7812cfc29b8c047a2b2c9d82f79c15" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/gather_scatter_helper.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/gather_scatter_helper.py", + "sha256": "08c1b43de34fbeca77357d7576ac1d17cba974b59d695562f68bb713061e7b54" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/hf3fs_mock_client.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/hf3fs_mock_client.py", + "sha256": "bec61a9b0c4b9124b2292d7646d76411da44396389349b53cdcbc46353c8780e" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/connector.py", + "sha256": "8c61094ce0a3a702908f9576f69482e6bf314738a2cbe33a7d3b47258fa0ab43" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/stats.py", + "sha256": "d9383a6ad6ab6b8f812d29d90495407b770eeddb79b86e9d0e3216c0bd16e0ed" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/worker.py", + "sha256": "251c0d8e57e4739c03ce3e1c899a95ff5b1752eb27676c28ab88c4ebd62c4776" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_connector.py", + "sha256": "5991f9ff8832df32bd421eb67e48237270ea0a408180e523810bb43606acf8f3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/__init__.py", + "sha256": "c53be9796e76cde637514bfc40a525d8c09bb2784b406cb516790d8285dfe433" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/multi_process_adapter.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/multi_process_adapter.py", + "sha256": "6480d67b31ed603027a83edf327880a38aee45eaeee2da9a4efa93e95527c166" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/utils.py", + "sha256": "e204fa6a853ac9c122d7a4e9d146902230f81c48d4321ed5edfdbf979dd49ba2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/vllm_v1_adapter.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/vllm_v1_adapter.py", + "sha256": "e6fe55049c6b007248516d69640e2f3a4809f9d286091a1014ae0949987fa8f1" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py", + "sha256": "c712c386a7c57bf0355a1441ba574232c3aa5498fcb70713a2b3f5d18b64f9c1" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/metrics.py", + "sha256": "de1b1797d0448f74370919dbb0278767f390e8f59e00a0c0528abefb302babc2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_connector.py", + "sha256": "516be01320e64b0110e102eeb69a6ba766dd5ac8cb3036db6b97b7d54413323d" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_utils.py", + "sha256": "26877610463fa8e9d6b092772f2551bcc0c3ac794cbe63996df0414666a8ebba" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/rdma_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/rdma_utils.py", + "sha256": "716e5042edecaba36c7ca763474988f32fa09c2668b8260260149df610af8f83" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/stats.py", + "sha256": "f39b2f0b1db2e4f922e27e684a3f7bbf5bb279b82a0a8c3bb0c7ae69b6d14d24" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/connector.py", + "sha256": "17a350bdb89e17e415d6c52a48684dc15c35a804378daf03e1f3bee1b1b123a3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/coordinator.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/coordinator.py", + "sha256": "a8eb6c2157a96e8d25233b82347ac8409a41d6390b4f2c64242119c05911010c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/data.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/data.py", + "sha256": "d3cfefdb4165a24995749cba452641b318065baa95bb1bae62f922a2f8886e7b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/metrics.py", + "sha256": "f2b9ef8927632d142aad11a374d0725c6e619ea0bb7fea9eda3f3895eb7d277a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/protocol.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/protocol.py", + "sha256": "ccb1cf6a84a932a375215627d2aaac482c351a05df015d636d05373a6845b7c8" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/scheduler.py", + "sha256": "283849ff581ec206444cdf5621622377f1c925e8d7e05cb9294af2f3a5094e79" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/worker.py", + "sha256": "55f1682dfd1ed7af689166421337126a0e1d08afa4774a242e098d79e0c1e95b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_common.py", + "sha256": "549bb4fe22dca5095515b9c0712c31cc81a9d4923881e9f112317640fd8c04ab" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_connector.py", + "sha256": "c0f474bc34b579d889fae92eaf43eaca241be51a4697a187a942f0df4e6b6a98" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_engine.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_engine.py", + "sha256": "d842f3772fc6588d5a329a67572324cb74709aa3df4033e64c791a1e706c8e88" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_layout.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_layout.py", + "sha256": "2b4ec046a78897236b0626939bb828b6ec095355097d10bca39e5f3e1c992553" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/multi_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/multi_connector.py", + "sha256": "12d8387239f3194f2cb63ccbd64824648047210323572d66671e6a1eed349fc3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/__init__.py", + "sha256": "cc3145fe3b6d219a267bf40a0f7c0cc9430e4289f94acab2df761b99b671e7ba" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py", + "sha256": "7a1db8c54e4cd846bdac747344f2aea2c2fcf507817928796063225223b7e169" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_worker.py", + "sha256": "49a2e4faf99bef146b5a1d4d18d48f240b1e561c438252274494b359db96ef52" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/connector.py", + "sha256": "b6a0dc916d052f344be72ecfcb111509c13580102c11a860fa726cf0888949a9" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/metadata.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/metadata.py", + "sha256": "2b23a07c1ec5ac5490c3b818737c7192e344ea9f52cd5623f75939f741ab4e21" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_scheduler.py", + "sha256": "ac3daf8e2246581fec84ab28f2133569421b62c32a120be4923e2f4d0f2f9de9" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_worker.py", + "sha256": "e5060c9b6cf022de35ca3d1da7a369cd6a6a2dea26219af9f7633aaf78af8a76" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_scheduler.py", + "sha256": "2d9008e33937a4d6c5cf9cc2f96160f2bdbc8e987fe37f0798a7fd7eb84c9572" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_worker.py", + "sha256": "87de3ea383dd3aa95fb2c287ea26ded8a330859cc1295f9faa69047e80865c2c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/scheduler.py", + "sha256": "09f1bfe7075b926b26a94529480e33b62c3ac273ff826f6c502084f08b1b2a08" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/stats.py", + "sha256": "3e710654e0b68d1a8592f0c4735c81b22f4bf698fb1a2dfea126d35bf2dd1ef2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/tp_mapping.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/tp_mapping.py", + "sha256": "2d43607f98701b2fad6cc0ac2767619a80b7fc2b3a3c2eb6ed0da4fb05dcd8f6" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/utils.py", + "sha256": "93de863fc8307a61d40b62f1b176b57ae93c363d34b9e9ddc8e666265b6d45dc" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/worker.py", + "sha256": "5134a36ac100ce7a64f5311029a37ac12c38d91093f63100f51f7fe53ea7c3ee" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/canonical_mapping.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/canonical_mapping.py", + "sha256": "e0b3c6f9806a650e0370c43c5068fc31c0fec94615089e15fdf270d7d96f2b64" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/common.py", + "sha256": "9b3f042c6fa1581d10e8f688d2d9bc927bb41b780a9ea01f514d57228e20c978" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/config.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/config.py", + "sha256": "aea82e60889e78dcad8564ec8285b65a6a372824a1545a98ea8e78b6f4fd418a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/events.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/events.py", + "sha256": "d7039b67be95fd444966628184040a94880873c0611c0e6e7525a22650ffdefb" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/metrics.py", + "sha256": "13d76df014e86691f58dc89a879f9808b124690c9267dd5fa3b2d4004d4c5fdf" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py", + "sha256": "2c5282f4a3165cd787fb355e215e3869f1bdd3f2c795b2155fc537c9d135191a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/worker.py", + "sha256": "acc2df53262441dfc6421a3af7f0cbd68cbfaedbd42bbc384d8e1da2d965d194" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading_connector.py", + "sha256": "cdc16ca7339a10e1993bd6220e6273f86a4e99779f58f25098a24ad31bb0dbd8" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/simple_cpu_offload_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/simple_cpu_offload_connector.py", + "sha256": "96238ca82ccf07a1eeb59b8f66de17b09034e3eb993ad9a0a836511d3f69706b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/ssm_conv_transfer_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/ssm_conv_transfer_utils.py", + "sha256": "59a949709482e65a007fbe5352fe9b4bb54c2dcc10ad2c1c41f754b6e13299f4" + }, + "vllm/distributed/kv_transfer/kv_transfer_state.py": { + "path": "/vllm/distributed/kv_transfer/kv_transfer_state.py", + "sha256": "2e5fe09438d6e2ee642f8a26cf7dcf632e870d955d30baf002b76a8bfe836d05" + }, + "vllm/distributed/nixl_utils.py": { + "path": "/vllm/distributed/nixl_utils.py", + "sha256": "0bffa3c052c9f67472b1c0bc3816114891b010c968bf4b8a292e7da4d687db53" + }, + "vllm/distributed/parallel_state.py": { + "path": "/vllm/distributed/parallel_state.py", + "sha256": "d9b10ad56833ebc08a753e1a050ef0989c30d4134021b7b7b00150b7bd01adc6" + }, + "vllm/distributed/stateless_coordinator.py": { + "path": "/vllm/distributed/stateless_coordinator.py", + "sha256": "f52848fbe985ed47b1f3e3ca555314736ca06436e8d738ab4390101f0672dcb0" + }, + "vllm/distributed/utils.py": { + "path": "/vllm/distributed/utils.py", + "sha256": "792146b357139e705064a68d3b66858de8a0baaca4dc7db1232fa217d45db231" + }, + "vllm/distributed/weight_transfer/__init__.py": { + "path": "/vllm/distributed/weight_transfer/__init__.py", + "sha256": "3fb9d4712b7c131d522f5e76e73cd8c333f3cc7af86e2d5ecf9b61b57b3b7f5a" + }, + "vllm/distributed/weight_transfer/base.py": { + "path": "/vllm/distributed/weight_transfer/base.py", + "sha256": "8ab06feb04f1379d0558fbdb77fde46bc84f179e0a26742cabab937e88caa38d" + }, + "vllm/distributed/weight_transfer/clients.py": { + "path": "/vllm/distributed/weight_transfer/clients.py", + "sha256": "ff85c79c350241e6d2749ca23c9d295a3289b4b62bfdf0257d32eb94a0151d36" + }, + "vllm/distributed/weight_transfer/factory.py": { + "path": "/vllm/distributed/weight_transfer/factory.py", + "sha256": "4e979eeac8c5bcdbffb10eb4765cfb30120fa7595c6c2561d3fa1a966ced61c8" + }, + "vllm/distributed/weight_transfer/ipc_engine.py": { + "path": "/vllm/distributed/weight_transfer/ipc_engine.py", + "sha256": "1af578293f387a19073c322b24143c3ae4716ce0c5d2bac2a4ef26fe20119330" + }, + "vllm/distributed/weight_transfer/nccl_common.py": { + "path": "/vllm/distributed/weight_transfer/nccl_common.py", + "sha256": "7b2ef7dc7481c3f478f17c49aa36c7bed54142ec5c93d36ed8426c8fdf09e500" + }, + "vllm/distributed/weight_transfer/nccl_engine.py": { + "path": "/vllm/distributed/weight_transfer/nccl_engine.py", + "sha256": "7fd020c919dc7b4723fb78e64da977b180d0fef0cd21df955a037b848dbaa008" + }, + "vllm/distributed/weight_transfer/packed_tensor.py": { + "path": "/vllm/distributed/weight_transfer/packed_tensor.py", + "sha256": "d0a27fb0be1dc029bd5a1d44fdb57a5e54aa4cd74308bedc339e86ac02c7494c" + }, + "vllm/distributed/weight_transfer/sharded_rdt_common.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_common.py", + "sha256": "be0b13801f24e7b62999b19d733c030510353603a2d5320d5dc98ee02daf22a2" + }, + "vllm/distributed/weight_transfer/sharded_rdt_engine.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_engine.py", + "sha256": "2f791970b4815511a7578ef6c957e7da97b071d26a39087a09a17475909791ee" + }, + "vllm/distributed/weight_transfer/sharded_rdt_fake.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_fake.py", + "sha256": "ee11164e17b5f2793252ce77741b8b94e0583046abf896a590131b2008d1fbb9" + }, + "vllm/distributed/weight_transfer/sharded_rdt_trainer.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_trainer.py", + "sha256": "dd413ff461d41826ccd3eb87d3df22f6cd7f24e09aac7644e3e5b40d7beec484" + }, + "vllm/distributed/weight_transfer/sparse_nccl_engine.py": { + "path": "/vllm/distributed/weight_transfer/sparse_nccl_engine.py", + "sha256": "e11b409454dda2b05ea34e8115ac19027c5e65cb2a5e9682c494f16a50e978f4" + }, + "vllm/model_executor/determinism/__init__.py": { + "path": "/vllm/model_executor/determinism/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/determinism/batch_invariant.py": { + "path": "/vllm/model_executor/determinism/batch_invariant.py", + "sha256": "af8f8d256a48fc214edf426fbe891fb15bd8b1d7ae98b811c736ff1eb0fae798" + }, + "vllm/model_executor/determinism/batch_invariant_configs.py": { + "path": "/vllm/model_executor/determinism/batch_invariant_configs.py", + "sha256": "72ea0d4df0ab5ae288abb7df5c203d2ad5f1709c7295d87ec72da775fddc1b7a" + }, + "vllm/model_executor/layers/fused_moe/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/__init__.py", + "sha256": "64a32665be6d5afcfbaf7a0915717267278b66b880b908b0263ea58f08e51b5e" + }, + "vllm/model_executor/layers/fused_moe/activation.py": { + "path": "/vllm/model_executor/layers/fused_moe/activation.py", + "sha256": "78dec0e85e0c040304515f64ccf8f2c6a7a2e5b9f1124a2138a97d9a02585541" + }, + "vllm/model_executor/layers/fused_moe/all2all_utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/all2all_utils.py", + "sha256": "dc4750a446f7de31d09a46034da5fdf479bc169af90f47aa9af8ae15e67b0828" + }, + "vllm/model_executor/layers/fused_moe/b12x.py": { + "path": "/vllm/model_executor/layers/fused_moe/b12x.py", + "sha256": "ee76cc6aa801e24be8ec78a9e8502061ad48667d5ff8711e43f68fba912425bd" + }, + "vllm/model_executor/layers/fused_moe/config.py": { + "path": "/vllm/model_executor/layers/fused_moe/config.py", + "sha256": "a3a87cebcc7ac85d73f471dcfafc2d899c6fc08f264777b74a0e919adac9e03f" + }, + "vllm/model_executor/layers/fused_moe/deep_gemm_utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/deep_gemm_utils.py", + "sha256": "8fdcd857eb333f9c68902105f157568d52067c94ba1e2df6dbfe0474ef1f4c02" + }, + "vllm/model_executor/layers/fused_moe/eep_reconfigure.py": { + "path": "/vllm/model_executor/layers/fused_moe/eep_reconfigure.py", + "sha256": "9d7580265e8563e1140c2bb4c3a81a35ddd54903f5ec0a2720ffc064681f02f9" + }, + "vllm/model_executor/layers/fused_moe/expert_map_manager.py": { + "path": "/vllm/model_executor/layers/fused_moe/expert_map_manager.py", + "sha256": "308c00f63fcb6f44518ec3a56d8f902c7bba75928c2e3aea30fbe1f3f473973b" + }, + "vllm/model_executor/layers/fused_moe/experts/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a16_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a16_moe.py", + "sha256": "53deea255175171971422d14082ad139b5ec7b62e21429a4c7cc0ebbefd29cdc" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a8_moe.py", + "sha256": "f3fc51b95ed89862381908a0134e326228827f44854248db9585a9c4899c34f4" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp8_moe.py", + "sha256": "af6db1760961a5a71234f8b1cdf42e9e30a236e13601b0826a75110b79724948" + }, + "vllm/model_executor/layers/fused_moe/experts/batched_deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/batched_deep_gemm_moe.py", + "sha256": "b0cd4ea706583518dc608fb56f832fc3595f24bd863b03ef1e8c22b36b873508" + }, + "vllm/model_executor/layers/fused_moe/experts/cpu_int4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cpu_int4_moe.py", + "sha256": "67170af3ba9dc4c4f71d78a72efc3fa4e366eac614936a79911dae5c75ac1864" + }, + "vllm/model_executor/layers/fused_moe/experts/cpu_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cpu_moe.py", + "sha256": "0754cd4ff1b28e6d3932a67609d335acefd28f95a841f0492923813356a6d81e" + }, + "vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py", + "sha256": "db901bdbcd3fdac23a1d74e39c51e67f14a82be787b2fd704ed1e787372ae868" + }, + "vllm/model_executor/layers/fused_moe/experts/deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/deep_gemm_moe.py", + "sha256": "16911a64a72eafc26a1bcb544a91f90144d85dc41e3ee57cf20e89925227bbb7" + }, + "vllm/model_executor/layers/fused_moe/experts/fallback.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fallback.py", + "sha256": "1bdd0a4f2ebaa40ec96a5aacc07aee61511af59e6324ce456aa65003b6e2991a" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_b12x_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_b12x_moe.py", + "sha256": "e613afe5da2742e42c717c1a0a56bd9e1c7e3e0452a828db0013d81063518954" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_batched_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_batched_moe.py", + "sha256": "295254dfeeec8df3eb8110e6f659a946cb9cded3de1565ecad4d741b3c3f3e00" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_moe.py", + "sha256": "08578bcd0cf72d6a470e40950175e73639efaa6d8d23c6da0869345312b229c9" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutlass_moe.py", + "sha256": "52887cec5fe628e0a4e7793deb546b40f6c29f7362b3b436c10ca36934ab9826" + }, + "vllm/model_executor/layers/fused_moe/experts/fused_batched_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fused_batched_moe.py", + "sha256": "2435587fc7f8fe8ea341ea0eb8f14c11f3f5b31fbbb9b29ce569ad3bace6e6a0" + }, + "vllm/model_executor/layers/fused_moe/experts/fused_humming_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fused_humming_moe.py", + "sha256": "a6830a76ff7f4cd3479b9c8372a30d03e8301604555cbdbcd9ac89a813b7431a" + }, + "vllm/model_executor/layers/fused_moe/experts/gpt_oss_triton_kernels_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/gpt_oss_triton_kernels_moe.py", + "sha256": "1613a7a6b256e8faee6fdcfae84f293492db6229d28ceb3e8a8d6093af480e36" + }, + "vllm/model_executor/layers/fused_moe/experts/int4_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/int4_emulation_moe.py", + "sha256": "f12857caf0671a341687ad3c5f48616b816ed51e1bcbdefa0a7edbecdb81a79d" + }, + "vllm/model_executor/layers/fused_moe/experts/lora_context.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/lora_context.py", + "sha256": "9b41eefaaa57c5dd0dc54217ef95978821b0c52e90ea4db8b0752e08452bd3e5" + }, + "vllm/model_executor/layers/fused_moe/experts/lora_experts_mixin.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/lora_experts_mixin.py", + "sha256": "b2bc55ed6be98b526c6a5698e2d98300650e78555f56b1820e58c04888e2a373" + }, + "vllm/model_executor/layers/fused_moe/experts/marlin_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/marlin_moe.py", + "sha256": "93916b721548e6194dc70cf6cec224b4b1456a0cc0980235e97beba7bf36541d" + }, + "vllm/model_executor/layers/fused_moe/experts/mxfp8_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/mxfp8_emulation_moe.py", + "sha256": "d09c62ad1398c51ff6f515f2a61014ee9e9a9798d0fe9762c47f446efc5edbef" + }, + "vllm/model_executor/layers/fused_moe/experts/mxfp8_native_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/mxfp8_native_moe.py", + "sha256": "01a42cebf18189e566034111b2145573c655319e8af1a56db60d53a319c40613" + }, + "vllm/model_executor/layers/fused_moe/experts/nvfp4_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/nvfp4_emulation_moe.py", + "sha256": "f24467762b60702f0df122ed64786be839a838a9b6cafaecbd04d35fbfedb189" + }, + "vllm/model_executor/layers/fused_moe/experts/ocp_mx_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/ocp_mx_emulation_moe.py", + "sha256": "dcaa60a9ebdb0bd8223b37af41f018ce7f95716ec7cd8526850f4433a579213b" + }, + "vllm/model_executor/layers/fused_moe/experts/rdna3_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/rdna3_moe.py", + "sha256": "e4abd802dc2f0ad9b338ebde397633c761d881c37813e2dc229902c526b597d8" + }, + "vllm/model_executor/layers/fused_moe/experts/rocm_aiter_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/rocm_aiter_moe.py", + "sha256": "bf09a7b783f5752d61cab76221b32b598d8846d801ee39dc9209d636c9659c6f" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_cutlass_moe.py", + "sha256": "ffce5ad627c540940d122d8df7981644b2eb35d07d480995c0f4f30517815fac" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_deep_gemm_moe.py", + "sha256": "c7209fa5e1ccb184a68b37a0706fc571a76696c2ae79802ddc7f889b1c29684d" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_moe.py", + "sha256": "806fbccfe30f5fbd578acf773add99bdf022b12d617958bd6281aef6de369701" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_bf16_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_bf16_moe.py", + "sha256": "76256de96fefece9c41ffb1108487919e24da364cf4412c6c3474498aba59137" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.py", + "sha256": "b54c7ceb45e5d07aa905f42ea44caccf85ca35ba9fb825d4c01947764510f68b" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_lora_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_lora_moe.py", + "sha256": "dd35a9e4242c0dc8d691168813e14bd5543e591f02ee529d0691e07651942c5a" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_mxfp4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_mxfp4_moe.py", + "sha256": "fe780f125a3dc3ba919659e9b85340bd32afcbfe47733a002bfdfb92eadf400c" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_mxint4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_mxint4_moe.py", + "sha256": "2106d67c2951aa690c4656ca58240d09c366cffe8cb4d9fd575df016c377cc30" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_nvfp4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_nvfp4_moe.py", + "sha256": "e938ac9f058f7c90b41c9610513239bec54a95304bfb5ff5f6897ebd54733d7e" + }, + "vllm/model_executor/layers/fused_moe/experts/xpu_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/xpu_moe.py", + "sha256": "2a11bac0cf9274d963315efd6eebdc62978b0b7aa02e8849ff2a562742f0b86d" + }, + "vllm/model_executor/layers/fused_moe/fused_flydsl_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_flydsl_moe.py", + "sha256": "0e74879ee5c72f616ae4064b9dff3b3a0b583b7fc70b8f92f1e8b730ecd5d39b" + }, + "vllm/model_executor/layers/fused_moe/fused_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe.py", + "sha256": "7072eb06237be9d33dcb0ef7101410f886a6363c98cbee70a014c68b70f639cb" + }, + "vllm/model_executor/layers/fused_moe/fused_moe_method_base.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe_method_base.py", + "sha256": "18dcfc469d3252749801bbf943857f58da85de1f2db8fdff5a9f4986a925dc68" + }, + "vllm/model_executor/layers/fused_moe/fused_moe_modular_method.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe_modular_method.py", + "sha256": "321c744eac1fcaffd6b1b2971204c8baa57dfec53e91e5d24140014d72d64f83" + }, + "vllm/model_executor/layers/fused_moe/hpc_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/hpc_moe.py", + "sha256": "2ca9c5d71b6fd91651027905e2b83103a8823845e053e7153e148cb8e0ee666d" + }, + "vllm/model_executor/layers/fused_moe/layer.py": { + "path": "/vllm/model_executor/layers/fused_moe/layer.py", + "sha256": "def0b4e13bcc1e4e21ee10644e647e2eda1acbf0cc01e76d6128abb59ea08224" + }, + "vllm/model_executor/layers/fused_moe/modular_kernel.py": { + "path": "/vllm/model_executor/layers/fused_moe/modular_kernel.py", + "sha256": "8dc4e0dbbf35b3aac8add63ca6f2a7bbfdadaabbd60826e24598b22c7d8e5c22" + }, + "vllm/model_executor/layers/fused_moe/moe_align_block_size.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_align_block_size.py", + "sha256": "c3f7fc2087836f0160a32ab99ceb1d8f6e87c793679da34dd672e225cb7fa31b" + }, + "vllm/model_executor/layers/fused_moe/moe_fused_mul_sum.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_fused_mul_sum.py", + "sha256": "112e72578002c3bff538418dac64b3b56d995994a2fc5e32b18d2cf3b8392a13" + }, + "vllm/model_executor/layers/fused_moe/moe_output.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_output.py", + "sha256": "6ea4cbd78f9efc7f842c5df246f553f08b991c3479b8b04b89902ed08aaf8e8f" + }, + "vllm/model_executor/layers/fused_moe/moe_permute_unpermute.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_permute_unpermute.py", + "sha256": "1adc592c6254d0c877d66be5406afbc822459c18a838f4bbd094a992e7609d06" + }, + "vllm/model_executor/layers/fused_moe/oracle/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/__init__.py", + "sha256": "4dcf941d50d48bb812de0f39e9194bf17a76b8035fe324889c6038f710fdc453" + }, + "vllm/model_executor/layers/fused_moe/oracle/base.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/base.py", + "sha256": "555bbcd18a3744e64eee4e953daabef3bd268a1bd4faf967d4cfd14d6074f685" + }, + "vllm/model_executor/layers/fused_moe/oracle/fp8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/fp8.py", + "sha256": "245bd36c285df1e6f7c51e52dcda31ad247894577a9f8d765613c2c2feae9aee" + }, + "vllm/model_executor/layers/fused_moe/oracle/int8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/int8.py", + "sha256": "c1b67886511bd966b162db5bca8930f04895fb37a969818a4a10f0726c59547f" + }, + "vllm/model_executor/layers/fused_moe/oracle/int_wna16.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/int_wna16.py", + "sha256": "cfffe8b8b290330be9d18ffa07aeecf296484395ff04df3147d99393e48b55c1" + }, + "vllm/model_executor/layers/fused_moe/oracle/mxfp4.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/mxfp4.py", + "sha256": "b7915e6779b5c88e7dcd2d227f003a8e45071d6d86877013067142d4feb64a8c" + }, + "vllm/model_executor/layers/fused_moe/oracle/mxfp8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/mxfp8.py", + "sha256": "9cfdc8102a04bb844dcd7ed88043bba96ec751794bc093da76c69aa8cf88cf48" + }, + "vllm/model_executor/layers/fused_moe/oracle/nvfp4.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/nvfp4.py", + "sha256": "735b4cdeb1258f11fb02320fc0c70cab5edaca468dd60b07b2d369389d2b0313" + }, + "vllm/model_executor/layers/fused_moe/oracle/unquantized.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/unquantized.py", + "sha256": "c8b8203bd0b73bb7f586f703607394d663f14c05711416ad42d45af564382223" + }, + "vllm/model_executor/layers/fused_moe/oracle/w4a8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/w4a8.py", + "sha256": "d7fa6e2982f20b34d5ce9c5ce28a61122762a3fcdd53d249479472a4f2316c6a" + }, + "vllm/model_executor/layers/fused_moe/oracle/w4a8_int8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/w4a8_int8.py", + "sha256": "6d6f9ca2e67b630002873de2f8d8a231d091c5c2f0f3354a9e8209449b481a4c" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/__init__.py", + "sha256": "2800113263a83c2632e522fb22790b29f63384da75d43de32f0ae2f95e8ae4c1" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/batched.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/batched.py", + "sha256": "d52425dd8c08e47cf8d9c3088daf3b1cc721c8667de4c738d04ba997f9a08ccb" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ht.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ht.py", + "sha256": "465cdf1d6cee91b2ee8c2e43abbea6e8408976e3048c10f44c089f34b415bc60" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ll.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ll.py", + "sha256": "f704922b1db680c4c212982a096e09d6b3eb97d89110313f86ed958a00df21b7" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_v2.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_v2.py", + "sha256": "8d690b016bbcfbc9eb599bcc36a6f798b2f1720c828f4347ea742e218c0cc60d" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_one_sided.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_one_sided.py", + "sha256": "acb57d8342af62bb5672036871cd4b27ecc7f37dfa7c894850bb860e6152a1f0" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_two_sided.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_two_sided.py", + "sha256": "cc5b00d6a157b6eca5afaaf7435165dbd1b4524d6d88bf75808cbe074a389f79" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/mori.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/mori.py", + "sha256": "8e9c3b5b1f0de13f467d95bf2f451cba0e4b0d9a1bdcf98da0988a3a9a79a045" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/naive_dp_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/naive_dp_ep.py", + "sha256": "db015e5b18750bbbf5b2bbaceca877dd6f3f3e74c2a94e8dc185f7413b387f91" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/nixl_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/nixl_ep.py", + "sha256": "1f71d70ac509bf5d3d67a8d95a8ee108a50af6bb5d4bde7181ca28e286f6ffce" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/no_dp_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/no_dp_ep.py", + "sha256": "adbbf529cd22059c95b5380952943a70cf11e05e321dcd707f296bebde61a6e7" + }, + "vllm/model_executor/layers/fused_moe/routed_experts.py": { + "path": "/vllm/model_executor/layers/fused_moe/routed_experts.py", + "sha256": "68c48e5df0ea4a7cc1f04436b7b9153eb53802ecd9bb55d38db8738508daac6d" + }, + "vllm/model_executor/layers/fused_moe/routed_experts_capturer.py": { + "path": "/vllm/model_executor/layers/fused_moe/routed_experts_capturer.py", + "sha256": "cd006bc1a1703418cca3b589fafb2abc4268a086fb3db044bbb64348aeac8b13" + }, + "vllm/model_executor/layers/fused_moe/router/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/layers/fused_moe/router/aiter_shared_routed_fused_moe_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/aiter_shared_routed_fused_moe_router.py", + "sha256": "f47046db1275601a2c67c9232afc7b866c9623a19639d5be867e4c7914a35069" + }, + "vllm/model_executor/layers/fused_moe/router/base_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/base_router.py", + "sha256": "47fa2324bcd9b6ebdc138d69ae6b6ecc0f2463d34bda8c5988bdb0a2a76d3fae" + }, + "vllm/model_executor/layers/fused_moe/router/bf16x3_router_gemm_cutedsl.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/bf16x3_router_gemm_cutedsl.py", + "sha256": "d0f1edd1ebc48d88e490bdb3c93db49bdc0a135ff83e7e0b57130e9f8255fc32" + }, + "vllm/model_executor/layers/fused_moe/router/cpu_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/cpu_router.py", + "sha256": "bff36b15818c87bfbb7ee3def7dc7f6396860abbe5893ff6148801fe941a4b92" + }, + "vllm/model_executor/layers/fused_moe/router/custom_routing_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/custom_routing_router.py", + "sha256": "1a40c7054e3c3a1b3ee2e98f6bc9efa9dfdc11f316a8edf7357dd91533487bfe" + }, + "vllm/model_executor/layers/fused_moe/router/dsv4_topk.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/dsv4_topk.py", + "sha256": "14f7c8487b9aef652dd61c91e0e3c3640b643bf9cd0d8a7184157d71f4beb63e" + }, + "vllm/model_executor/layers/fused_moe/router/fused_moe_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_moe_router.py", + "sha256": "0daa0dc05b931d66767feca444a4cd57ecf140f59b40ea0e8ad213eef6da2b36" + }, + "vllm/model_executor/layers/fused_moe/router/fused_topk_bias_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_topk_bias_router.py", + "sha256": "8fdc28cc248180ad4f11bb4bcda3df47926ec12665a0d84bb712fe83fc6b9376" + }, + "vllm/model_executor/layers/fused_moe/router/fused_topk_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_topk_router.py", + "sha256": "1c80f4af4d781fd66b12aa6a7a0fd30082bc521df40f1252987a8ac4c0bef51c" + }, + "vllm/model_executor/layers/fused_moe/router/gate_linear.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/gate_linear.py", + "sha256": "faa43362c2e7c568498a923c682ca18cae75e87f48d00882770821cb19c21198" + }, + "vllm/model_executor/layers/fused_moe/router/grouped_topk_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/grouped_topk_router.py", + "sha256": "048339e1799cdd42c9dae686a6cb891046577fb391b500f0d12eed73c8f61e52" + }, + "vllm/model_executor/layers/fused_moe/router/rocm_fp32_router_gemm.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/rocm_fp32_router_gemm.py", + "sha256": "9c331ef3d0bb2fb6954387d77ac62a99c5c76d2753c7438bfbb5115f68aae5ac" + }, + "vllm/model_executor/layers/fused_moe/router/router_factory.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/router_factory.py", + "sha256": "019bc8adaa7642abab82843efd53cd1a378f62c652521a1de2b781480eb88742" + }, + "vllm/model_executor/layers/fused_moe/router/routing_simulator_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/routing_simulator_router.py", + "sha256": "a7345df5add00cf3bd93024492d6fc1189fd3ecf2754a11cef1b03a295d791f7" + }, + "vllm/model_executor/layers/fused_moe/router/zero_expert_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/zero_expert_router.py", + "sha256": "dea306edd92e2b9c1b43f982ede8e1e10770d2c66220f5a106e0ed0165276e9c" + }, + "vllm/model_executor/layers/fused_moe/runner/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/layers/fused_moe/runner/moe_runner.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/moe_runner.py", + "sha256": "05893188402fe37229bf72d75088d66193c417d5d502daafd3a55e1bfedaa60c" + }, + "vllm/model_executor/layers/fused_moe/runner/moe_runner_interface.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/moe_runner_interface.py", + "sha256": "189cad01611124eb44594713cbf5918d16fc70196dc81a525ae0a7a97a5fcc51" + }, + "vllm/model_executor/layers/fused_moe/runner/shared_experts.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/shared_experts.py", + "sha256": "d89e4c79c46f6fe61262c51f3facf102e71ce1e4eb3db67f72b6bd8470937be9" + }, + "vllm/model_executor/layers/fused_moe/topk_weight_and_reduce.py": { + "path": "/vllm/model_executor/layers/fused_moe/topk_weight_and_reduce.py", + "sha256": "3dfede72d52bf99af40997994704e6c502ee3bab2bd39bfaa8a68d7dae440203" + }, + "vllm/model_executor/layers/fused_moe/unquantized_fused_moe_method.py": { + "path": "/vllm/model_executor/layers/fused_moe/unquantized_fused_moe_method.py", + "sha256": "182a5ec1874ece2091a24c5303f6ab9ea64a9a61adf325b863927f0cdd83e5d3" + }, + "vllm/model_executor/layers/fused_moe/utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/utils.py", + "sha256": "a93a0bded4008db19d8b38370526ae34fafb9c8278e5b4f60acb6acc8fdc1850" + }, + "vllm/model_executor/layers/mamba/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/abstract.py": { + "path": "/vllm/model_executor/layers/mamba/abstract.py", + "sha256": "dfdc8c836894f574e41d93d76ab989cacd3d7ecf59c97a929abfa48d9364e8ad" + }, + "vllm/model_executor/layers/mamba/gdn/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/gdn/base.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/base.py", + "sha256": "7fec748fc74131f5a45bcaf2644b3fa3a0598fd437d7347f8207ea3644a951c5" + }, + "vllm/model_executor/layers/mamba/gdn/kimi_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/kimi_gdn_linear_attn.py", + "sha256": "1cec4da5c9da73557e192bfb36cd540aae51d3e91283b554449c4a97f0f89bd9" + }, + "vllm/model_executor/layers/mamba/gdn/olmo_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/olmo_gdn_linear_attn.py", + "sha256": "60873ca3bb0c4d17c33bd259b62b658db4883cd23138f47dd4ead62cd2ff0605" + }, + "vllm/model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py", + "sha256": "b80f8e6f3fff442fb880aebb3209c52f814f66490009f4ac4003de603576d10a" + }, + "vllm/model_executor/layers/mamba/linear/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/linear/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/linear/bailing_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/linear/bailing_linear_attn.py", + "sha256": "3c480ddd6eba0766ed012a1074bbec5f241d868a87b020b0f6312222c32f93eb" + }, + "vllm/model_executor/layers/mamba/linear/base.py": { + "path": "/vllm/model_executor/layers/mamba/linear/base.py", + "sha256": "26125cd427225954e1846ca361cdaf43f2b56f11b1e217cf26e91a80ef0edb6a" + }, + "vllm/model_executor/layers/mamba/linear/minimax_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/linear/minimax_linear_attn.py", + "sha256": "4adc00f54893b5bc6c31c613deda152a19af3b1bba04153ab5924c3bf2a3aaae" + }, + "vllm/model_executor/layers/mamba/mamba_mixer.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_mixer.py", + "sha256": "a485e937ad9db14d3ad03fde5a9fe795cfa863649563e52fc7e6c52ef631164e" + }, + "vllm/model_executor/layers/mamba/mamba_mixer2.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_mixer2.py", + "sha256": "d58d93e90d9eb90bc5133b79f07c7c62d0032b35d6cf916e3fe34367b81c5cd5" + }, + "vllm/model_executor/layers/mamba/mamba_utils.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_utils.py", + "sha256": "ce9845b4a4ef4bc46577a33038ed69d59ceccb52f30e9c5bdaa36e48be3b2ca4" + }, + "vllm/model_executor/layers/mamba/ops/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/ops/causal_conv1d.py": { + "path": "/vllm/model_executor/layers/mamba/ops/causal_conv1d.py", + "sha256": "044d005cfe59fd0818ed421274e04f3e8dd679b8cdb64fca9f4422f2643484b2" + }, + "vllm/model_executor/layers/mamba/ops/cpu/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/ops/cpu/causal_conv1d.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/causal_conv1d.py", + "sha256": "64104672890ac2ef240c20c7f8059beeade707178574809dbca8721dff5ea6fa" + }, + "vllm/model_executor/layers/mamba/ops/cpu/gdn_attention.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/gdn_attention.py", + "sha256": "a50288945bf5b102ad3025ae536638dcc32d84cf7c22aaf3a85326b0c1c56c1f" + }, + "vllm/model_executor/layers/mamba/ops/cpu/mamba_ssm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/mamba_ssm.py", + "sha256": "5839e576172a3246337f5e4fb1bc19eb583b3e2b2f7e35dd060dc3041eb8372d" + }, + "vllm/model_executor/layers/mamba/ops/gather_initial_states.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gather_initial_states.py", + "sha256": "5198bb6de6d91c583a5f65d926412a76ee04a06fa72aaba76eaf156b27cd0523" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/__init__.py", + "sha256": "b88b52e71fcb21bd3fa215ea171dcd2ad2ff17c97788cfe64caa7ba45c7ecf97" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_h.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_h.py", + "sha256": "f50bbe5c0b6382323ec5dfc24a5e0c7971113d59727515e60c9fe3689734e5ba" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_kkt_inv_uw.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_kkt_inv_uw.py", + "sha256": "b4a65dd194907db08865e0596fe254f915e670a9e6b27ffa2933c1026dde9b1e" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_o.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_o.py", + "sha256": "629f7843a7e611efb9390f2ebb7a4b924b2c328d48a317fddfaa96af4d9bc60a" + }, + "vllm/model_executor/layers/mamba/ops/layernorm_gated.py": { + "path": "/vllm/model_executor/layers/mamba/ops/layernorm_gated.py", + "sha256": "3433f2e3b87c2b2ccf8e9794ce40762c86a6da38a94ecee001f439ea0d0373dd" + }, + "vllm/model_executor/layers/mamba/ops/mamba_ssm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/mamba_ssm.py", + "sha256": "a4515ec7895b40ed878cf380445034b25faa61fbaa799d96c49217bbdfd7e400" + }, + "vllm/model_executor/layers/mamba/ops/replayssm_config.py": { + "path": "/vllm/model_executor/layers/mamba/ops/replayssm_config.py", + "sha256": "5fe9d5d7aa2de6a65875b3796a919b22bc435fd76055ba054bbff43aa005bc44" + }, + "vllm/model_executor/layers/mamba/ops/scatter_states.py": { + "path": "/vllm/model_executor/layers/mamba/ops/scatter_states.py", + "sha256": "f3bb004c73edaba56337747893eb07faf29b270dc8bb9c893ee9b1044e4ead9a" + }, + "vllm/model_executor/layers/mamba/ops/selective_state_update_replayssm_output_only.py": { + "path": "/vllm/model_executor/layers/mamba/ops/selective_state_update_replayssm_output_only.py", + "sha256": "cea7fd3063ca9dcc4e33f180d01ea379195ec515cedc9d0b03b11dc67670d695" + }, + "vllm/model_executor/layers/mamba/ops/ssd_bmm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_bmm.py", + "sha256": "26983d97a7f5c5f9197a16a6bee7b1294839b9ae31a14c14aaee38b43523e630" + }, + "vllm/model_executor/layers/mamba/ops/ssd_chunk_scan.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_chunk_scan.py", + "sha256": "d5ef32e8cb47e2ce71984579df78ab69754895f891766394daf327867cfa4f8f" + }, + "vllm/model_executor/layers/mamba/ops/ssd_chunk_state.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_chunk_state.py", + "sha256": "177e3aa7fe72647133bbd86135533e8688a5802678d4d1564aa549410362316f" + }, + "vllm/model_executor/layers/mamba/ops/ssd_combined.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_combined.py", + "sha256": "1317bbb668d3c60dfe0658850f9968614f03fa5eb61196f8ce6ac17dbb31b480" + }, + "vllm/model_executor/layers/mamba/ops/ssd_state_passing.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_state_passing.py", + "sha256": "36b8c8edba437916a5b789717c61fc22077de01e77892cb96dbff3b00a57410e" + }, + "vllm/model_executor/layers/mamba/ops/ssu_dispatch.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssu_dispatch.py", + "sha256": "bbe0f0e61da87f3ddfead19a79ca376516b63f1ea868be3485333c63fa20ef41" + }, + "vllm/model_executor/layers/mamba/ops/triton_helpers.py": { + "path": "/vllm/model_executor/layers/mamba/ops/triton_helpers.py", + "sha256": "a8795532f22c37a93e82c9d8e3fadcb5f4da98673d7b321fe8481305eaafad30" + }, + "vllm/model_executor/layers/mamba/short_conv.py": { + "path": "/vllm/model_executor/layers/mamba/short_conv.py", + "sha256": "228494efab185ee17374f762874f4c8b9a26aac9decfa8c906ce38446e0de51a" + }, + "vllm/model_executor/models/qwen3_next.py": { + "path": "/vllm/model_executor/models/qwen3_next.py", + "sha256": "4fa5112ac2bf7886d41d9e1f6c3da8793620d1ec49c961b31e9609459a6a7f7a" + }, + "vllm/third_party/flash_linear_attention/__init__.py": { + "path": "/vllm/third_party/flash_linear_attention/__init__.py", + "sha256": "5dbbfa3fc286edb2e970e175ef33cee4f6181c89b0784f5a8986201b2312f54e" + }, + "vllm/third_party/flash_linear_attention/ops/__init__.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/__init__.py", + "sha256": "dd738dc1d08045e76455cdbe16052a5b769e0eb11d6e87ff28353994f880cd6c" + }, + "vllm/third_party/flash_linear_attention/ops/chunk.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk.py", + "sha256": "c105ead259e86aedc248c53e7c4cef07034d0ff12da608d80265d1dd0990803f" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_delta_h.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_delta_h.py", + "sha256": "1b3ad391f939d9443c6b7adb19e57fe381bd5dccea064e8417a4f85b0e713b26" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_o.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_o.py", + "sha256": "3b63b836a8cc561723c23db5a528a0b474d9cd78508d610f0b348c585a889a19" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_scaled_dot_kkt.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_scaled_dot_kkt.py", + "sha256": "7ae41df3755acc7e925a134d848f78bb5fc00b90069039d86403c5853323ea42" + }, + "vllm/third_party/flash_linear_attention/ops/cumsum.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/cumsum.py", + "sha256": "d818215669b451868823202ac0bcea77e7a9d75957254c7c1060a73a55dc39b6" + }, + "vllm/third_party/flash_linear_attention/ops/fused_gdn_prefill_post_conv.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_gdn_prefill_post_conv.py", + "sha256": "590717b2107abc90d72548de06b5d315229eb2775c94614f3f545df11cc2b5df" + }, + "vllm/third_party/flash_linear_attention/ops/fused_norm_gate.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_norm_gate.py", + "sha256": "e6eb90467f29d8a0a04f2a364d20a2c3191b6ab857841bfb82076b33a6022d1a" + }, + "vllm/third_party/flash_linear_attention/ops/fused_recurrent.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_recurrent.py", + "sha256": "fe6f1311014809040497aa0a623e7fa97f4b3457cdc7ee1f1f8aed21f326f755" + }, + "vllm/third_party/flash_linear_attention/ops/fused_sigmoid_gating.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_sigmoid_gating.py", + "sha256": "000ab8996af9788fdb8843a6a3b91833e7a14c8acc0e1ea073a536330f64cb6f" + }, + "vllm/third_party/flash_linear_attention/ops/index.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/index.py", + "sha256": "a4f8b2c052635cb519a80099e8a85411d1d5d6880b38f466788259bbe66b154d" + }, + "vllm/third_party/flash_linear_attention/ops/kda.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/kda.py", + "sha256": "e1f31aaa89b91f8e5db6d070b229e2c81c7206e8caec67de41db97d06be0c476" + }, + "vllm/third_party/flash_linear_attention/ops/l2norm.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/l2norm.py", + "sha256": "520f4513ef4fc97e6b88dc07877cca8e29da0d34e44673fe989e3af002d86381" + }, + "vllm/third_party/flash_linear_attention/ops/layernorm_guard.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/layernorm_guard.py", + "sha256": "42af29be26e8fc94a4658e053c095fcdab9ffdc1bc2446a01e787deda2a298c0" + }, + "vllm/third_party/flash_linear_attention/ops/op.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/op.py", + "sha256": "456da84fd12411cf53c96a90dd4f78f49afb454c3d51d2c524ea8e7106fe8ae5" + }, + "vllm/third_party/flash_linear_attention/ops/solve_tril.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/solve_tril.py", + "sha256": "d1a4ff27623a938825052500afa7e2aa24fadd2fa4c9be6376c9128824f86f82" + }, + "vllm/third_party/flash_linear_attention/ops/utils.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/utils.py", + "sha256": "d6c90d36505e02086954c23ca4dd2fea82a69416d68ff1d0501e16b3148b5b0c" + }, + "vllm/third_party/flash_linear_attention/ops/wy_fast.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/wy_fast.py", + "sha256": "c9fc8259db0a8746dc04f1d799cb73333457118cf89a0bdce8dde8a80a28cd96" + }, + "vllm/v1/attention/__init__.py": { + "path": "/vllm/v1/attention/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backend.py": { + "path": "/vllm/v1/attention/backend.py", + "sha256": "01ac364372afa75fdb22486aa3a9c7cf9aebb742e3471dfb9e0f9d9d36b734bc" + }, + "vllm/v1/attention/backends/__init__.py": { + "path": "/vllm/v1/attention/backends/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backends/b12x.py": { + "path": "/vllm/v1/attention/backends/b12x.py", + "sha256": "443f0a98738fdfefe5b9ab151d278bfd43a8ac807eb2b0b9b2a13d51922afbf9" + }, + "vllm/v1/attention/backends/composite.py": { + "path": "/vllm/v1/attention/backends/composite.py", + "sha256": "4cf3d66dca891562709eed4f50aa14b0ae6c8240d9ea86504a3304b2f356cce0" + }, + "vllm/v1/attention/backends/cpu_attn.py": { + "path": "/vllm/v1/attention/backends/cpu_attn.py", + "sha256": "76fb02a6bd725125565d84bf04f627cf16da5f7ff8f31f87c01ed6a1439398c7" + }, + "vllm/v1/attention/backends/fa_utils.py": { + "path": "/vllm/v1/attention/backends/fa_utils.py", + "sha256": "08fa6e231d3af3a71a6e59162dd12328aa8beb28548165ae58f130a92adb5a83" + }, + "vllm/v1/attention/backends/flash_attn.py": { + "path": "/vllm/v1/attention/backends/flash_attn.py", + "sha256": "b170a4789e18104c1bee35bea70df51abe6766693d8f4726a59f2e6f5c4282aa" + }, + "vllm/v1/attention/backends/flash_attn_diffkv.py": { + "path": "/vllm/v1/attention/backends/flash_attn_diffkv.py", + "sha256": "e4627c88c3ba8caee260540e994cc8137fd2ff7cd7813356b36387c6c88ce30a" + }, + "vllm/v1/attention/backends/flashinfer.py": { + "path": "/vllm/v1/attention/backends/flashinfer.py", + "sha256": "8ee541fde43ed92a417b3f01ea1e6fc64af8ab2eb54cbfc28308a49aaca4ed7f" + }, + "vllm/v1/attention/backends/flex_attention.py": { + "path": "/vllm/v1/attention/backends/flex_attention.py", + "sha256": "ad07f0ad73aeeadc3534b3a05c14f88a62cb3638874239ae9823c49b36276dc3" + }, + "vllm/v1/attention/backends/gdn_attn.py": { + "path": "/vllm/v1/attention/backends/gdn_attn.py", + "sha256": "3831019404a92200a38b43571c040cffeb6638bbdc71e4cb5e680dbc6c93d054" + }, + "vllm/v1/attention/backends/hpc_attn.py": { + "path": "/vllm/v1/attention/backends/hpc_attn.py", + "sha256": "af9e2aec1b498f0ee48a2dce3cf5646edf1976466980b2fd927c0e82b875427c" + }, + "vllm/v1/attention/backends/linear_attn.py": { + "path": "/vllm/v1/attention/backends/linear_attn.py", + "sha256": "bc42144fcd027434c6a10dc9f4c5f991db8899d387af5f6485402ce097eb0513" + }, + "vllm/v1/attention/backends/mamba1_attn.py": { + "path": "/vllm/v1/attention/backends/mamba1_attn.py", + "sha256": "32159dae11cab3c8c576b9514ad97d5108c8d1b4cac9fcfe345ec6a76223aee7" + }, + "vllm/v1/attention/backends/mamba2_attn.py": { + "path": "/vllm/v1/attention/backends/mamba2_attn.py", + "sha256": "a5bcdecb7b9547137023e1c77a386003358fa940eaf5f319ed142211dcdba139" + }, + "vllm/v1/attention/backends/mamba_attn.py": { + "path": "/vllm/v1/attention/backends/mamba_attn.py", + "sha256": "5e7b2c4058fc5e6096d001bff6c789b78368b025bbe4600f191aaca2ff59b59f" + }, + "vllm/v1/attention/backends/mla/__init__.py": { + "path": "/vllm/v1/attention/backends/mla/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backends/mla/aiter_triton_mla.py": { + "path": "/vllm/v1/attention/backends/mla/aiter_triton_mla.py", + "sha256": "ed0e285cdae06a019150c41cc958b3c0b5ceb0e4f299d5318d1c90e2c2395390" + }, + "vllm/v1/attention/backends/mla/amx_mla.py": { + "path": "/vllm/v1/attention/backends/mla/amx_mla.py", + "sha256": "7f5cddec30b2dfe22ccdbd3b9da673c879719bf6da4074317bd60add55f5d15f" + }, + "vllm/v1/attention/backends/mla/compressor_utils.py": { + "path": "/vllm/v1/attention/backends/mla/compressor_utils.py", + "sha256": "3589e94105368ea285c40b82db1a0332682ff5d071fe363627cf4c0d10f3facf" + }, + "vllm/v1/attention/backends/mla/cpu_mla.py": { + "path": "/vllm/v1/attention/backends/mla/cpu_mla.py", + "sha256": "ff2110b9f78e92adf6bab294465cbc294ae1ff71cb1780fed158179e134a4ca6" + }, + "vllm/v1/attention/backends/mla/cutlass_mla.py": { + "path": "/vllm/v1/attention/backends/mla/cutlass_mla.py", + "sha256": "211d298680f9bd793cc468281b316d6633c5f4eb6dcec71d3329b034a23ab9b5" + }, + "vllm/v1/attention/backends/mla/flashattn_mla.py": { + "path": "/vllm/v1/attention/backends/mla/flashattn_mla.py", + "sha256": "ac89e0ad75a37e92566d264bafe324735a80f9ab4709241a4454d17b3d38bb63" + }, + "vllm/v1/attention/backends/mla/flashattn_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashattn_mla_sparse.py", + "sha256": "67dd3ead2e8b9d8cda0825ecc93779cb7d670628bc741c759a7d3cd5d474030f" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla.py", + "sha256": "0c24ff016fb6b0bb41d9e7484b6f1af42f37bcc384ed613473fc3e01ad25f664" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse.py", + "sha256": "2116d965b2067134d8afa5878d4d16c0149b061258f50c4106d993aa13b073cc" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm120.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm120.py", + "sha256": "102ca08793d567f95598eefeb34c3f6ec50b3b9d704f162d1402b97b12b5777b" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm90.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm90.py", + "sha256": "df9fe4970aa3f53cf24784b8534b89e0101a2ca20a35a2ebbc9a12a4463d5993" + }, + "vllm/v1/attention/backends/mla/flashmla.py": { + "path": "/vllm/v1/attention/backends/mla/flashmla.py", + "sha256": "c9d8046a853ecbdeff9ebfc738f5bb34c4f272b278231a09a0fbf73708c7c188" + }, + "vllm/v1/attention/backends/mla/flashmla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashmla_sparse.py", + "sha256": "7a379c717adb9667ce94cbc16c0e3a1fb22a169713db6d7941c141fa84077b3f" + }, + "vllm/v1/attention/backends/mla/index_group.py": { + "path": "/vllm/v1/attention/backends/mla/index_group.py", + "sha256": "c24e028c3c160a9bb92e043da5b5b34c805e84745b7c4b8da6fb8702a0ddd641" + }, + "vllm/v1/attention/backends/mla/indexer.py": { + "path": "/vllm/v1/attention/backends/mla/indexer.py", + "sha256": "2acbc1c4fa57c3424ad95e6ecbe76eb7141747773c3e867ce704f4adccba892a" + }, + "vllm/v1/attention/backends/mla/prefill/__init__.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/__init__.py", + "sha256": "903630eb705dd175bf4ae4558a4bcaa07c110056b6a11eb830fdd2fb21b3c48a" + }, + "vllm/v1/attention/backends/mla/prefill/aiter_flash_attn.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/aiter_flash_attn.py", + "sha256": "571b8a9910c4ea3fefda60659026f3bf0d7b542c34553c8c9a4d43bb82077e61" + }, + "vllm/v1/attention/backends/mla/prefill/base.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/base.py", + "sha256": "138bf3ddaf5a94c3cdbc4e08ac676edcae84b32fc76625e546f3b47f7d8b82ec" + }, + "vllm/v1/attention/backends/mla/prefill/cpu_sdpa.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/cpu_sdpa.py", + "sha256": "1bb686395274a8ec0d9fd7327410a527655fe060cbbc263eab138fea988d96de" + }, + "vllm/v1/attention/backends/mla/prefill/flash_attn.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/flash_attn.py", + "sha256": "5e648c82c82e5f81fe11458eb82b9f90b50fc06df2ade3bf111ee6b7a2ee8481" + }, + "vllm/v1/attention/backends/mla/prefill/flashinfer.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/flashinfer.py", + "sha256": "63861219c35b8abc0ebe01e1f51543c5ed40bd46119ca261d927da7c6826b49b" + }, + "vllm/v1/attention/backends/mla/prefill/registry.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/registry.py", + "sha256": "c8c30b92213d594beaa3cab4d5003da26a85870dbb11d1ab73191962d0645b53" + }, + "vllm/v1/attention/backends/mla/prefill/selector.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/selector.py", + "sha256": "101d9fca7924b0c5d7891a17fe8942611bd6759e32b03a571dc87b14c1430f2f" + }, + "vllm/v1/attention/backends/mla/prefill/tokenspeed_mla.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/tokenspeed_mla.py", + "sha256": "047cf07bfcc83db3b11a6a54ffe189f6146e6ec9ad33ce2fa7d18860bf4210f0" + }, + "vllm/v1/attention/backends/mla/prefill/trtllm_ragged.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/trtllm_ragged.py", + "sha256": "9e13ea6f6a25accedd918c0de64bbb812ccb20ffb95350ab018a6e76d493789b" + }, + "vllm/v1/attention/backends/mla/rocm_aiter_mla.py": { + "path": "/vllm/v1/attention/backends/mla/rocm_aiter_mla.py", + "sha256": "b489f5830c655bfb6299801a70d69b9821513c69568ecab3689db5a7be867be5" + }, + "vllm/v1/attention/backends/mla/rocm_aiter_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/rocm_aiter_mla_sparse.py", + "sha256": "91b1d9b3d860a9720bc01b8ebe9bbe8649a7d6bca20d4b63939bc100309bca19" + }, + "vllm/v1/attention/backends/mla/sparse_swa.py": { + "path": "/vllm/v1/attention/backends/mla/sparse_swa.py", + "sha256": "a47853ad8a3fe40f24704592581ea323a18041b84610df010a5534da634e311e" + }, + "vllm/v1/attention/backends/mla/sparse_utils.py": { + "path": "/vllm/v1/attention/backends/mla/sparse_utils.py", + "sha256": "c3cdf060288c05542243a9fe8b5ad3a963ad75e9ce399009b5e45c1235a88ce4" + }, + "vllm/v1/attention/backends/mla/tokenspeed_mla.py": { + "path": "/vllm/v1/attention/backends/mla/tokenspeed_mla.py", + "sha256": "b9ba523c606430cecb99a88b28c53d98a99dcf5e76105a80664338110a20f1ad" + }, + "vllm/v1/attention/backends/mla/triton_mla.py": { + "path": "/vllm/v1/attention/backends/mla/triton_mla.py", + "sha256": "21b16b3b34470edcc33d0423e560837c1d37d4bab31c7b3b9cfd7faa47864b51" + }, + "vllm/v1/attention/backends/mla/xpu_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/xpu_mla_sparse.py", + "sha256": "559c6240fe466521a6b2df4c94aea02ddf3f5efa5ba6954fa180c5a51c0f12d2" + }, + "vllm/v1/attention/backends/recoverssm_metadata.py": { + "path": "/vllm/v1/attention/backends/recoverssm_metadata.py", + "sha256": "02896a667db0f0308371ceb50048b18e5866c0235d163c0357e9a05dcedb3394" + }, + "vllm/v1/attention/backends/registry.py": { + "path": "/vllm/v1/attention/backends/registry.py", + "sha256": "378e8ee78734bd8c8adbe287d4c0a4058dcbb553195a09fbcce00a3cc30adc29" + }, + "vllm/v1/attention/backends/rocm_aiter_fa.py": { + "path": "/vllm/v1/attention/backends/rocm_aiter_fa.py", + "sha256": "d1418af03bf58209c850f466b712d3ea22a14ebb758c42dd43e65738281841fd" + }, + "vllm/v1/attention/backends/rocm_aiter_unified_attn.py": { + "path": "/vllm/v1/attention/backends/rocm_aiter_unified_attn.py", + "sha256": "59d2645eb4c91dc0567754a7163d066f4f2faf48f1957b254fcdd5604e9d8c8c" + }, + "vllm/v1/attention/backends/rocm_attn.py": { + "path": "/vllm/v1/attention/backends/rocm_attn.py", + "sha256": "4a8f57067073fbceb784af6c3467487c450d00fa3957928fadb99a79f6036292" + }, + "vllm/v1/attention/backends/short_conv_attn.py": { + "path": "/vllm/v1/attention/backends/short_conv_attn.py", + "sha256": "84fc460ef2fbd09743b069bec0c14b39542af6c2254a403e37a048427e151121" + }, + "vllm/v1/attention/backends/triton_attn.py": { + "path": "/vllm/v1/attention/backends/triton_attn.py", + "sha256": "1057663d110e1d5229495a799027b27277c1eca325d5b6780fa2259afbf58a1a" + }, + "vllm/v1/attention/backends/triton_attn_diffkv.py": { + "path": "/vllm/v1/attention/backends/triton_attn_diffkv.py", + "sha256": "de0357eae005246642140f1ab8842ba5ed8bff5c84b18a6d3a7bbf409c578301" + }, + "vllm/v1/attention/backends/triton_flash_attn.py": { + "path": "/vllm/v1/attention/backends/triton_flash_attn.py", + "sha256": "176e45329aeb28a2008362bb607d1b8c89816eb665859ab908b0385a11acf1c2" + }, + "vllm/v1/attention/backends/triton_flashinfer.py": { + "path": "/vllm/v1/attention/backends/triton_flashinfer.py", + "sha256": "48d5f967e388d4e8d6bbec8d827b44d855346bc2fada28adf65768bf6623527b" + }, + "vllm/v1/attention/backends/turboquant_attn.py": { + "path": "/vllm/v1/attention/backends/turboquant_attn.py", + "sha256": "616d16d608d9d1fbf6c29548037e7e9cf330f4d36a01aa3ffabf42a731eb6e2b" + }, + "vllm/v1/attention/backends/utils.py": { + "path": "/vllm/v1/attention/backends/utils.py", + "sha256": "fbc221360d2d54cb21ef3f625dc8711500de345a355801548b4337bb9b8abee0" + }, + "vllm/v1/attention/ops/__init__.py": { + "path": "/vllm/v1/attention/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/ops/chunked_prefill_paged_decode.py": { + "path": "/vllm/v1/attention/ops/chunked_prefill_paged_decode.py", + "sha256": "973db848a790b2e8d99e728b2fc4f44b501bbe58c62747244ddff04cfcf11a85" + }, + "vllm/v1/attention/ops/common.py": { + "path": "/vllm/v1/attention/ops/common.py", + "sha256": "b4b67e7fc0cce471e337d742c097fba06da7563816e8799e27719714e31e1d5b" + }, + "vllm/v1/attention/ops/cp_common.py": { + "path": "/vllm/v1/attention/ops/cp_common.py", + "sha256": "2369181862e96db64b14ef20c5c2e249ed2ea5f3dea2467a2aa388372bb86d9d" + }, + "vllm/v1/attention/ops/dcp.py": { + "path": "/vllm/v1/attention/ops/dcp.py", + "sha256": "a478bdc781460f0582cfaf74d6431f1a826c201f02f39d882d12a96139bc3f28" + }, + "vllm/v1/attention/ops/flashmla.py": { + "path": "/vllm/v1/attention/ops/flashmla.py", + "sha256": "8a40d6e120e3ab25a95fcfeb32b0b5b4c1ea02b984633866628536dcd26ed2e8" + }, + "vllm/v1/attention/ops/flydsl_kernels/__init__.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/attention/ops/flydsl_kernels/tq_decode.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/tq_decode.py", + "sha256": "cc4b7f82897596e0974b3d3a710a1a8bc58c3d22b72cc7f461dd1c4acd2e451b" + }, + "vllm/v1/attention/ops/flydsl_kernels/tq_decode_gqa6.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/tq_decode_gqa6.py", + "sha256": "a983f6d375c325900955e11696dab1e2665770e83f84d51f93d3ed5e1d8880e0" + }, + "vllm/v1/attention/ops/flydsl_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/flydsl_turboquant_decode.py", + "sha256": "7b1dd0ef7c7fb28a6a8831759e00b939ab844d067657155cc11cf75532a22c63" + }, + "vllm/v1/attention/ops/int4_per_token_head.py": { + "path": "/vllm/v1/attention/ops/int4_per_token_head.py", + "sha256": "d91968f280cd8eaed7570ab255f0276b40e833e18a25066d371d9ca8149425f2" + }, + "vllm/v1/attention/ops/merge_attn_states.py": { + "path": "/vllm/v1/attention/ops/merge_attn_states.py", + "sha256": "ad08403d2843fc892f0b0b4b9f5fabb81884556f89f7170dca46ccef498a3539" + }, + "vllm/v1/attention/ops/metadata.py": { + "path": "/vllm/v1/attention/ops/metadata.py", + "sha256": "ca882b84c5aaefb1f77e4d8ea09a00103fbc53defa8671bba036c961c17fc760" + }, + "vllm/v1/attention/ops/paged_attn.py": { + "path": "/vllm/v1/attention/ops/paged_attn.py", + "sha256": "016a95f892ec751c86b37be1e12171bad9f0b4076bbf2219ff336f4e9c503653" + }, + "vllm/v1/attention/ops/pcp.py": { + "path": "/vllm/v1/attention/ops/pcp.py", + "sha256": "dadeff95fe2df2be8028baabeef01b0d2d628cd67de2176915e737ce096de3dd" + }, + "vllm/v1/attention/ops/prefix_prefill.py": { + "path": "/vllm/v1/attention/ops/prefix_prefill.py", + "sha256": "b08ad92db715fc03c11699de3de463d55e411f42f77548e06b41049a61de692f" + }, + "vllm/v1/attention/ops/rocm_aiter_mla_merge.py": { + "path": "/vllm/v1/attention/ops/rocm_aiter_mla_merge.py", + "sha256": "564c66e4877732e48a6f7d52405c43dc952eec0f0ae4353d34886bca056132b9" + }, + "vllm/v1/attention/ops/rocm_aiter_mla_sparse.py": { + "path": "/vllm/v1/attention/ops/rocm_aiter_mla_sparse.py", + "sha256": "feec664be5045fd1ba13b8f6ef83b52c96910ddc78baca0431bcf610c9e8f5cc" + }, + "vllm/v1/attention/ops/triton_attention_helpers.py": { + "path": "/vllm/v1/attention/ops/triton_attention_helpers.py", + "sha256": "35aa993d01345f535d2641cf9dcabb8b64c51b20a19707bc5987e616aaa87ddd" + }, + "vllm/v1/attention/ops/triton_decode_attention.py": { + "path": "/vllm/v1/attention/ops/triton_decode_attention.py", + "sha256": "b9823c65eba22d76abf64dad7d7d16a950f67471c86d6cb5b3e983aaf14381ac" + }, + "vllm/v1/attention/ops/triton_merge_attn_states.py": { + "path": "/vllm/v1/attention/ops/triton_merge_attn_states.py", + "sha256": "f63229162181ab93198550b73a115f1cc1034cfd60e6f58bc8ab3e22a6e8ce60" + }, + "vllm/v1/attention/ops/triton_prefill_attention.py": { + "path": "/vllm/v1/attention/ops/triton_prefill_attention.py", + "sha256": "352c1a4ac86146580040579fb217c2e288268830d6602b735713e154f36d74fe" + }, + "vllm/v1/attention/ops/triton_reshape_and_cache_flash.py": { + "path": "/vllm/v1/attention/ops/triton_reshape_and_cache_flash.py", + "sha256": "6cac51475b8c656992a21b2d150acd3a16a95a7ab7d49aab151a3ef13c24b80d" + }, + "vllm/v1/attention/ops/triton_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/triton_turboquant_decode.py", + "sha256": "8e52678136449e4bbca2195fbcbb87426c955a2b1b8422e7ab9511e45ee5f5c6" + }, + "vllm/v1/attention/ops/triton_turboquant_store.py": { + "path": "/vllm/v1/attention/ops/triton_turboquant_store.py", + "sha256": "6e6e2fe74a307d40f0be786ccbaea76d989e3c7b5985f3144a5218c61bf6d902" + }, + "vllm/v1/attention/ops/triton_unified_attention.py": { + "path": "/vllm/v1/attention/ops/triton_unified_attention.py", + "sha256": "65d0fbcf33d00789df8ca688c0a1c908e710cfaef53471178747ecae11f05829" + }, + "vllm/v1/attention/ops/triton_unified_attention_diffkv.py": { + "path": "/vllm/v1/attention/ops/triton_unified_attention_diffkv.py", + "sha256": "7fa36d7b7441f1c396e0348eac61d691d2e459e5c4c393c4aa262dfb670e68f7" + }, + "vllm/v1/attention/ops/turboquant_soa/__init__.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/__init__.py", + "sha256": "6b43b6fcb2a71c44ceff4ed1edd417a839f4901251ba15831b09ad979baa4984" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode.py", + "sha256": "bf00634191bba14cbf4a23c1d67dc3dcb244c2b8989f08362757b54435830986" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode_v2.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode_v2.py", + "sha256": "28e7ecc15c450d3591983a50c46a03aa6ca6fa99304c17c333940617d9916485" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_store.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_store.py", + "sha256": "dccf93b9fdd34f9b9eacd468e9de35b9d93378594487c335cf50642aaec681f2" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_unified_attention.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_unified_attention.py", + "sha256": "b4b2b5f3985b3a6126fd052e6ec1ed91c610da8a525a9ae7470ac829405bd85c" + }, + "vllm/v1/attention/ops/vit_attn_wrappers.py": { + "path": "/vllm/v1/attention/ops/vit_attn_wrappers.py", + "sha256": "a99d57b58269c7521fa5d7d47af06551f3bab2b5c7358ef78165a7f6e20a92a6" + }, + "vllm/v1/attention/ops/xpu_mla_sparse.py": { + "path": "/vllm/v1/attention/ops/xpu_mla_sparse.py", + "sha256": "d98d17110577c2b7b4d05e07bfdae15faf83321b6342a5daaaecce45b9503f38" + }, + "vllm/v1/attention/selector.py": { + "path": "/vllm/v1/attention/selector.py", + "sha256": "87f653ded7974875183c920e3e4589c28116bcbc99714d1da7cb51ae77c0b182" + }, + "vllm/v1/core/sched/__init__.py": { + "path": "/vllm/v1/core/sched/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/core/sched/async_scheduler.py": { + "path": "/vllm/v1/core/sched/async_scheduler.py", + "sha256": "e586a0ef3c6778be56a93e7f9bb712d4de9de6e7d7fe7e3e1d51dae83ecfc508" + }, + "vllm/v1/core/sched/interface.py": { + "path": "/vllm/v1/core/sched/interface.py", + "sha256": "be6c008664096c5660a8879de72b315bbe479bf1d688be9b25891063ec53a367" + }, + "vllm/v1/core/sched/output.py": { + "path": "/vllm/v1/core/sched/output.py", + "sha256": "3a66c8efaefe10c572f6f33cf1f8aa4610758c945130cad62eb9f7331005677c" + }, + "vllm/v1/core/sched/request_queue.py": { + "path": "/vllm/v1/core/sched/request_queue.py", + "sha256": "4b8d938e5fb8152fe61030b8aa991f983fcac9a405c37ed8908045e05e82ae5e" + }, + "vllm/v1/core/sched/scheduler.py": { + "path": "/vllm/v1/core/sched/scheduler.py", + "sha256": "c1db45f3bbad3a875dd8638331b8870c4380ac1ab4734265ba5c863833a82884" + }, + "vllm/v1/core/sched/utils.py": { + "path": "/vllm/v1/core/sched/utils.py", + "sha256": "1ed988044eb8028c77ede875bd1a5fd05ff6998b455d61e3997d6a3d7fc1c3a7" + }, + "vllm/v1/sample/__init__.py": { + "path": "/vllm/v1/sample/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/sample/logits_processor/__init__.py": { + "path": "/vllm/v1/sample/logits_processor/__init__.py", + "sha256": "1f9b02dae8cf6d44484638037123d3a2dec6b7b9a2bcc9afceef1a9bf3eaedec" + }, + "vllm/v1/sample/logits_processor/builtin.py": { + "path": "/vllm/v1/sample/logits_processor/builtin.py", + "sha256": "6105816ece77e5b1dbee0d07abc90ce039d650bac2ddb85c93280c48b00f2ebe" + }, + "vllm/v1/sample/logits_processor/interface.py": { + "path": "/vllm/v1/sample/logits_processor/interface.py", + "sha256": "171dfc6ef9b5b53128e8eaecc4bdf1de413a706d64bf5be686048f583c66eee1" + }, + "vllm/v1/sample/logits_processor/state.py": { + "path": "/vllm/v1/sample/logits_processor/state.py", + "sha256": "a96411f14362c45f839e181dcb3ac01d5b880812bccb3552fc17863b219f44ac" + }, + "vllm/v1/sample/metadata.py": { + "path": "/vllm/v1/sample/metadata.py", + "sha256": "6582cfe1a240c7ddb975f0ef6dd7dcd28dcf0fc7670394390250013977aa7ffd" + }, + "vllm/v1/sample/ops/__init__.py": { + "path": "/vllm/v1/sample/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/sample/ops/bad_words.py": { + "path": "/vllm/v1/sample/ops/bad_words.py", + "sha256": "0b1d0a9b13b92ddcae2c83393c07a34c0f107813725700dee794caa7fe7f3b12" + }, + "vllm/v1/sample/ops/logprobs.py": { + "path": "/vllm/v1/sample/ops/logprobs.py", + "sha256": "b286f69012a6758bfe9250038b0697294dbffe0d32c6906f284c39f75ee48be3" + }, + "vllm/v1/sample/ops/penalties.py": { + "path": "/vllm/v1/sample/ops/penalties.py", + "sha256": "4debfcf247b3887478d2b9ec98f108756bbed2805462777ef6b56f3bdf4ce682" + }, + "vllm/v1/sample/ops/topk_topp_sampler.py": { + "path": "/vllm/v1/sample/ops/topk_topp_sampler.py", + "sha256": "13ea4359832bc914492330958ec4f5ac140f408b8f410cc05c6eaf7ddcd70be4" + }, + "vllm/v1/sample/ops/topk_topp_triton.py": { + "path": "/vllm/v1/sample/ops/topk_topp_triton.py", + "sha256": "0b5fc337058e22bc28a8530ccec904d6ccd89b9548b02955c657ac429b1669d2" + }, + "vllm/v1/sample/rejection_sampler.py": { + "path": "/vllm/v1/sample/rejection_sampler.py", + "sha256": "0bb9d224887ccb1355e16199005cc23a4afc6fa75156eca419851b7247d99750" + }, + "vllm/v1/sample/sampler.py": { + "path": "/vllm/v1/sample/sampler.py", + "sha256": "f95805b2c6d06218c724826aa5f881a606e8d0a534a566aee7c85948520dd216" + }, + "vllm/v1/sample/thinking_budget_state.py": { + "path": "/vllm/v1/sample/thinking_budget_state.py", + "sha256": "962f8f55210eb0a431cb9c78b013e35f7a7dd58d06d6fb2e7fcff1b457356f8e" + }, + "vllm/v1/worker/__init__.py": { + "path": "/vllm/v1/worker/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/block_table.py": { + "path": "/vllm/v1/worker/block_table.py", + "sha256": "a09b8819e1417b7a186cf3472224e2138fc5d41a291c6692bb7df711b0c44259" + }, + "vllm/v1/worker/cp_utils.py": { + "path": "/vllm/v1/worker/cp_utils.py", + "sha256": "e32625d83a641b8dd8df82e92d1b6fb20af0cdf2e8fbd2fb131aa3c215415448" + }, + "vllm/v1/worker/cpu/__init__.py": { + "path": "/vllm/v1/worker/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/cpu/buffer_utils.py": { + "path": "/vllm/v1/worker/cpu/buffer_utils.py", + "sha256": "e7313fd8c2c76ebfb98d2fa53008bc9691d0f83a7d7c05e87602b5a29fb79e04" + }, + "vllm/v1/worker/cpu/model_runner.py": { + "path": "/vllm/v1/worker/cpu/model_runner.py", + "sha256": "24a1c916550051327dd5893243a6d4200f3824b91b3af8aa6f6c793fd7c68c3e" + }, + "vllm/v1/worker/cpu/shm.py": { + "path": "/vllm/v1/worker/cpu/shm.py", + "sha256": "08491af8ad341399d1375f2d21ad00414d4c89b0a5c03f55de8704914bbfcbd9" + }, + "vllm/v1/worker/cpu_model_runner.py": { + "path": "/vllm/v1/worker/cpu_model_runner.py", + "sha256": "92111aba92f00571f1a3c4c6e43cf1da6ccb4d2afac2f4d5abc018a4a6e7e8bd" + }, + "vllm/v1/worker/cpu_worker.py": { + "path": "/vllm/v1/worker/cpu_worker.py", + "sha256": "a8051b9e510ef0af9cc34004f2cbe5c0f902bd0cebc32c9464e744344dfdf849" + }, + "vllm/v1/worker/dp_utils.py": { + "path": "/vllm/v1/worker/dp_utils.py", + "sha256": "8cd19f1bfbc5c4f6ec60df89aea7c8a19b400ebc264f372b103014152e92158c" + }, + "vllm/v1/worker/ec_connector_model_runner_mixin.py": { + "path": "/vllm/v1/worker/ec_connector_model_runner_mixin.py", + "sha256": "fe9b11cebb8562f1bfe98b98a5647b2b081a6e424cb60d4ffe2412c91a99215e" + }, + "vllm/v1/worker/encoder_cudagraph.py": { + "path": "/vllm/v1/worker/encoder_cudagraph.py", + "sha256": "6a08d3779bca1b47dbf9daf6eafe2d3c70dbcb8aeb7d63ba7efacc68241ee3bc" + }, + "vllm/v1/worker/encoder_cudagraph_defs.py": { + "path": "/vllm/v1/worker/encoder_cudagraph_defs.py", + "sha256": "bb7be050fcaa8868e7816c84caec875da57050d65fe7eaf00f3d41473df25e3a" + }, + "vllm/v1/worker/gpu/__init__.py": { + "path": "/vllm/v1/worker/gpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/async_utils.py": { + "path": "/vllm/v1/worker/gpu/async_utils.py", + "sha256": "77e17a4570ead2be30ae9b00888cf077a3b873018c12ca0549b853bfda02c1ba" + }, + "vllm/v1/worker/gpu/attn_utils.py": { + "path": "/vllm/v1/worker/gpu/attn_utils.py", + "sha256": "b9b81e59dda2720b1f9c434471381f879228832443e52756e469b4ad4905888f" + }, + "vllm/v1/worker/gpu/block_table.py": { + "path": "/vllm/v1/worker/gpu/block_table.py", + "sha256": "61c004315d5af7e7eae4e2a9e6be92ea82c520327690a7f55a73bb9ce95f520a" + }, + "vllm/v1/worker/gpu/buffer_utils.py": { + "path": "/vllm/v1/worker/gpu/buffer_utils.py", + "sha256": "6597f701a30261bf250e9ad5a29737264624a1caa20527aeea0dad630325b093" + }, + "vllm/v1/worker/gpu/cp_utils.py": { + "path": "/vllm/v1/worker/gpu/cp_utils.py", + "sha256": "456c1bb7e262d99ff555522a4f134e5a9b42aee23290be25455eaef36ee8eaaf" + }, + "vllm/v1/worker/gpu/cudagraph_utils.py": { + "path": "/vllm/v1/worker/gpu/cudagraph_utils.py", + "sha256": "6e9c042890603535e300a40df8ee159dbed1058a64a83ae50ff0329e332e05ff" + }, + "vllm/v1/worker/gpu/dp_utils.py": { + "path": "/vllm/v1/worker/gpu/dp_utils.py", + "sha256": "e26867bc89e6bfc933cabc5ed13e5dc7b8d2d3030118ca1ca64c8785dabc0fc1" + }, + "vllm/v1/worker/gpu/ec_connector.py": { + "path": "/vllm/v1/worker/gpu/ec_connector.py", + "sha256": "2afe6e641f4ae3eb3b8da336c74eaa7479bf617b27cfb39a1fcbe487686f0a08" + }, + "vllm/v1/worker/gpu/eplb_utils.py": { + "path": "/vllm/v1/worker/gpu/eplb_utils.py", + "sha256": "1829fac11464aed4649179b302df198de51b95d0589f4e56bea305a876a63e26" + }, + "vllm/v1/worker/gpu/input_batch.py": { + "path": "/vllm/v1/worker/gpu/input_batch.py", + "sha256": "d5dd956eb319bd69dd9e762047833d81ad40b21fce619fcb2133759e73620694" + }, + "vllm/v1/worker/gpu/kv_connector.py": { + "path": "/vllm/v1/worker/gpu/kv_connector.py", + "sha256": "b89a4333f1e552d86e1815674b59e9f1335f0f49c0a7b46082439076f62c6a81" + }, + "vllm/v1/worker/gpu/lora_utils.py": { + "path": "/vllm/v1/worker/gpu/lora_utils.py", + "sha256": "1e90eddd9ddb4ca55e574bb28e87ae3a6f6750175a62d373102426543f4ccd66" + }, + "vllm/v1/worker/gpu/metrics/__init__.py": { + "path": "/vllm/v1/worker/gpu/metrics/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/metrics/logits.py": { + "path": "/vllm/v1/worker/gpu/metrics/logits.py", + "sha256": "ea058d7510a077a55f8ac7e4c3d596508346244e908cb372865d7159f62edc89" + }, + "vllm/v1/worker/gpu/mm/__init__.py": { + "path": "/vllm/v1/worker/gpu/mm/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/mm/encoder_cache.py": { + "path": "/vllm/v1/worker/gpu/mm/encoder_cache.py", + "sha256": "89c500338fddbeee7c4fca978a3a7c4c566a03e848e399d303fbee3c80631cd2" + }, + "vllm/v1/worker/gpu/mm/encoder_runner.py": { + "path": "/vllm/v1/worker/gpu/mm/encoder_runner.py", + "sha256": "0981e352d70301b7154a217a48665ffe35f215d053ec5740c2515a3e1e11b4e6" + }, + "vllm/v1/worker/gpu/mm/lora.py": { + "path": "/vllm/v1/worker/gpu/mm/lora.py", + "sha256": "a3eddfad6ad64de276964240c28dc080888df4a56dd5eac18f89428f2cbb7a01" + }, + "vllm/v1/worker/gpu/mm/rope.py": { + "path": "/vllm/v1/worker/gpu/mm/rope.py", + "sha256": "0924375bcb367267e783b57dd2ad9de1189d97025ce4313baaa54f2911eaaf1e" + }, + "vllm/v1/worker/gpu/model_runner.py": { + "path": "/vllm/v1/worker/gpu/model_runner.py", + "sha256": "174c93db921c23cf0396eee4764be25b2bd2d4b6a06e9fa41ce3598b884ce8ce" + }, + "vllm/v1/worker/gpu/model_states/__init__.py": { + "path": "/vllm/v1/worker/gpu/model_states/__init__.py", + "sha256": "07815d0b788fc88185772f581bbf892a675259f9288375571f29887622f8d93c" + }, + "vllm/v1/worker/gpu/model_states/default.py": { + "path": "/vllm/v1/worker/gpu/model_states/default.py", + "sha256": "bb614f814780f052e869f9acf31dfbfa68718ee7dc6252eefa901b5730ee8a2a" + }, + "vllm/v1/worker/gpu/model_states/encoder_decoder.py": { + "path": "/vllm/v1/worker/gpu/model_states/encoder_decoder.py", + "sha256": "a5868059d8af672548b41d0e623e884320e6ed61e6aaca2d2828ff5be0356f2f" + }, + "vllm/v1/worker/gpu/model_states/encoder_only.py": { + "path": "/vllm/v1/worker/gpu/model_states/encoder_only.py", + "sha256": "84e96b55a2639e2a73fa4a0308acc89c8d053dc715481180b237e0196dcef99f" + }, + "vllm/v1/worker/gpu/model_states/interface.py": { + "path": "/vllm/v1/worker/gpu/model_states/interface.py", + "sha256": "5675b6fedc7403a9ab410b1e5565974e78fac23c42ab4253ae1da52d6e09b594" + }, + "vllm/v1/worker/gpu/model_states/mamba_hybrid.py": { + "path": "/vllm/v1/worker/gpu/model_states/mamba_hybrid.py", + "sha256": "573e130ac5587d4822fabf97adad1ad0fda02ff83c5e70df879a5bb175ae845c" + }, + "vllm/v1/worker/gpu/model_states/mm_pruning.py": { + "path": "/vllm/v1/worker/gpu/model_states/mm_pruning.py", + "sha256": "b150940b12ae76048f050a8eeb54d532bbdc530a18ffbf320ddeeb0cfaa90f93" + }, + "vllm/v1/worker/gpu/model_states/prompt_embeds.py": { + "path": "/vllm/v1/worker/gpu/model_states/prompt_embeds.py", + "sha256": "11f9e270925c2df6a505557605ac2b859bb145cf3420b0111e7482a1c544f9b1" + }, + "vllm/v1/worker/gpu/model_states/recoverssm.py": { + "path": "/vllm/v1/worker/gpu/model_states/recoverssm.py", + "sha256": "b4b660e62eaf33f4fe8271f83ed1fb6de6bc08f800a8073b27803e42fb29a645" + }, + "vllm/v1/worker/gpu/pcp_manager.py": { + "path": "/vllm/v1/worker/gpu/pcp_manager.py", + "sha256": "2d80df0ed5b18a2069f9d0689cb59923ffe324ba200fcafe242da23da3a6ddaa" + }, + "vllm/v1/worker/gpu/pool/__init__.py": { + "path": "/vllm/v1/worker/gpu/pool/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/pool/pooling_runner.py": { + "path": "/vllm/v1/worker/gpu/pool/pooling_runner.py", + "sha256": "f8463f7648cce0f3f29418a4d9fee61634ead760957cf236d06d61cf8cd986e7" + }, + "vllm/v1/worker/gpu/pp_utils.py": { + "path": "/vllm/v1/worker/gpu/pp_utils.py", + "sha256": "dadeef0bebf61d0ad44a28d06372208ec4e6389224d6017f412683b026bdbb5c" + }, + "vllm/v1/worker/gpu/sample/__init__.py": { + "path": "/vllm/v1/worker/gpu/sample/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/sample/bad_words.py": { + "path": "/vllm/v1/worker/gpu/sample/bad_words.py", + "sha256": "8d3cbd5613398260314d94739d8ee0e1ac0c22abf2f960f541d3c0d4e39d360b" + }, + "vllm/v1/worker/gpu/sample/batch_shard.py": { + "path": "/vllm/v1/worker/gpu/sample/batch_shard.py", + "sha256": "c30274a3a04e6a03e89be9cd7c62de602b1aba4d412f64540ab6201036de3928" + }, + "vllm/v1/worker/gpu/sample/gumbel.py": { + "path": "/vllm/v1/worker/gpu/sample/gumbel.py", + "sha256": "3ec1df510bdad13e8b0a457b5b67c98affdf6e57369e56cb471246cc8f40dd34" + }, + "vllm/v1/worker/gpu/sample/logit_bias.py": { + "path": "/vllm/v1/worker/gpu/sample/logit_bias.py", + "sha256": "9e80a3fe6f3c7474723408cfff52183f4585fdeedd9c2312843ee98d0b12724c" + }, + "vllm/v1/worker/gpu/sample/logprob.py": { + "path": "/vllm/v1/worker/gpu/sample/logprob.py", + "sha256": "f47479a818192acb6b297c79fa67a3b2f9820e3492a394d5adda777e9b7c832e" + }, + "vllm/v1/worker/gpu/sample/min_p.py": { + "path": "/vllm/v1/worker/gpu/sample/min_p.py", + "sha256": "4cb5e2f45e1ced6f9685283a7a5c8cfd7204d9a249822e866cfff756c7f04f62" + }, + "vllm/v1/worker/gpu/sample/output.py": { + "path": "/vllm/v1/worker/gpu/sample/output.py", + "sha256": "d6e298c0f197d487a8faaf7200f500fa83df1d7a4bbf4339cadd6a18008f7f9c" + }, + "vllm/v1/worker/gpu/sample/penalties.py": { + "path": "/vllm/v1/worker/gpu/sample/penalties.py", + "sha256": "46c29434caf5f415129ef4a9bb2b8d4f62d2765596e3e07f73ad2b198c7def1b" + }, + "vllm/v1/worker/gpu/sample/prompt_logprob.py": { + "path": "/vllm/v1/worker/gpu/sample/prompt_logprob.py", + "sha256": "4cf22d390e7bf59e44c458cff7180268db63e95d06af2f1e14d720a2d77c9663" + }, + "vllm/v1/worker/gpu/sample/sampler.py": { + "path": "/vllm/v1/worker/gpu/sample/sampler.py", + "sha256": "832c9945d201a1e730ff9b4b52076aa83bd4a5064e1e4cfea952cf84d4a8d1f0" + }, + "vllm/v1/worker/gpu/sample/states.py": { + "path": "/vllm/v1/worker/gpu/sample/states.py", + "sha256": "4e3671f93695ba5a48fad7d2d13beb231ac8741034904ed5a15d9f7b9b86662e" + }, + "vllm/v1/worker/gpu/sample/thinking_budget.py": { + "path": "/vllm/v1/worker/gpu/sample/thinking_budget.py", + "sha256": "020513e1d3406f367de6ad995a95055008fd0c28f2873647e8283c9870e22404" + }, + "vllm/v1/worker/gpu/sample/trace_replay.py": { + "path": "/vllm/v1/worker/gpu/sample/trace_replay.py", + "sha256": "d2a7d3b3b55379efabe4740a4b7f14030126dc11be36f6ea974164ce42316a50" + }, + "vllm/v1/worker/gpu/sample/watermark.py": { + "path": "/vllm/v1/worker/gpu/sample/watermark.py", + "sha256": "a3581458169dab9153eb09fd67218e0ee5585406537a9de80ad528ae62b030c0" + }, + "vllm/v1/worker/gpu/shutdown.py": { + "path": "/vllm/v1/worker/gpu/shutdown.py", + "sha256": "bb470f14b17c7e52571ef8938b2a9527e7c2846852ae8a3a94b69cd1c30aa4b1" + }, + "vllm/v1/worker/gpu/spec_decode/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/__init__.py", + "sha256": "1f1f84bfe6f4f5af3a7e21a7a8716ecf7b9013da1d03327668a3ee36afc24c32" + }, + "vllm/v1/worker/gpu/spec_decode/acceptance_estimator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/acceptance_estimator.py", + "sha256": "505b843bdd75928b03793b395b47b8be914bd7fe2a3351c8ec04339baeebb1c2" + }, + "vllm/v1/worker/gpu/spec_decode/adaptive_verification.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/adaptive_verification.py", + "sha256": "276b2fec56758a94c71b717f6786b8a6f126db2e20cf964350202feee61a0a39" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py", + "sha256": "13392ef0a9ed59eb9c2b2bad43d7c61beb212a8805849e46b5130c230275d0a5" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/speculator.py", + "sha256": "5b97f54e20ddf65b98e939832d050745f67ef43cfa145786da300f1a8322e3c6" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/cudagraph.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/cudagraph.py", + "sha256": "beab567ae2df6a2ba2cd92fe7ee452c6b959b8a7037a4b5f493993a1824619bb" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/speculator.py", + "sha256": "f9c100f42f9326e48eb84e89281897e859ba761943f54d593523555ccd98dc63" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/utils.py", + "sha256": "53d2c3ad474d290d2c6df027446bbd80ac7447684e5242ab2c3c5337d2abd383" + }, + "vllm/v1/worker/gpu/spec_decode/dflash2/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash2/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/dflash2/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash2/speculator.py", + "sha256": "b70043550938a1df9aecc85d8c8224c38c929ca34f68834572f6e723854d2027" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/speculator.py", + "sha256": "dcf4abdedbd2bddd0d76be198ccf5b4e467c46f645038c35fcab821491a35b03" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/utils.py", + "sha256": "86af2bf30604a184312e8f076097b91ecfec704f409f9d68d634b03d6b318070" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/eagle3_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/eagle3_utils.py", + "sha256": "201ee875fcc3d076a8fc1f3876dcbf85736b221a368555243a8987ff26a1674e" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/speculator.py", + "sha256": "746e318a4f266d75522ff7f3731ea9b4527b7b4824f71364d1a62184ea1f7b3d" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/utils.py", + "sha256": "94de6f55a1761f24f4aa1388cbc3b3763d4ab3ee53260330056ad31ce0b78236" + }, + "vllm/v1/worker/gpu/spec_decode/extract_hidden_states.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/extract_hidden_states.py", + "sha256": "93c4233be7b2d2290b33902ea9b3bb5274c11701830851d03967a22144536e2d" + }, + "vllm/v1/worker/gpu/spec_decode/gemma4/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/gemma4/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/gemma4/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/gemma4/speculator.py", + "sha256": "9991210d7babd2caf2cd10797ca8688543dedeafbc3b86bc7c979c1a6ae9f949" + }, + "vllm/v1/worker/gpu/spec_decode/mtp/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/mtp/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/mtp/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/mtp/speculator.py", + "sha256": "926d6c9ffdb368c971647911a60493820d056ce236fcae9d94a42fa2e006255d" + }, + "vllm/v1/worker/gpu/spec_decode/multi_module_mtp/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/multi_module_mtp/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/multi_module_mtp/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/multi_module_mtp/speculator.py", + "sha256": "d9d4735b9b33829332b0e845b6d3073b2f0436045ed693b25c6434f351644127" + }, + "vllm/v1/worker/gpu/spec_decode/rejection_sampler.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/rejection_sampler.py", + "sha256": "030db5bfca162cc1f305112f299de5d6d61c59d3ed0807fee46575441ca4086d" + }, + "vllm/v1/worker/gpu/spec_decode/rejection_sampler_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/rejection_sampler_utils.py", + "sha256": "214b61fa0abe88573beb779872c035b3954e5651a85bd438d99ee5905d3a62ec" + }, + "vllm/v1/worker/gpu/spec_decode/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/speculator.py", + "sha256": "3a1ab15bf8b20918852eb835fe9755046e99dcbac6ba6ca3d414949fc8bc695a" + }, + "vllm/v1/worker/gpu/spec_decode/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/utils.py", + "sha256": "282f2929eddae9ca7312269f799be07472334b6df9fd91878b5e839ec05e418c" + }, + "vllm/v1/worker/gpu/states.py": { + "path": "/vllm/v1/worker/gpu/states.py", + "sha256": "99418f5df43ca612ded72609fee011620b065b2cab2f249ccb387096bf4ae71a" + }, + "vllm/v1/worker/gpu/structured_outputs.py": { + "path": "/vllm/v1/worker/gpu/structured_outputs.py", + "sha256": "18a10532db7e66b55e334acacd1fd989ad6361adf31dd0de9a9a65e23db25951" + }, + "vllm/v1/worker/gpu/ubatch_utils.py": { + "path": "/vllm/v1/worker/gpu/ubatch_utils.py", + "sha256": "5092e2e58af0561c8dc12e62847cfc6dda9ca20dfbd33e7f0cd77a83fe87f7c5" + }, + "vllm/v1/worker/gpu/warmup.py": { + "path": "/vllm/v1/worker/gpu/warmup.py", + "sha256": "423ac32d58fe008c228cfa223e4fcebfcf87e3463a9dbdf80a083c0578d73723" + }, + "vllm/v1/worker/gpu_input_batch.py": { + "path": "/vllm/v1/worker/gpu_input_batch.py", + "sha256": "18cf455c9d0eea61cc581c7932f2e6cd09786914e82dd35eef1c1430da359a0f" + }, + "vllm/v1/worker/gpu_model_runner.py": { + "path": "/vllm/v1/worker/gpu_model_runner.py", + "sha256": "87c29d08c0bbf66993d8b984811e7325e35e6436242a773feb55ec88f16b2c51" + }, + "vllm/v1/worker/gpu_ubatch_wrapper.py": { + "path": "/vllm/v1/worker/gpu_ubatch_wrapper.py", + "sha256": "4233cfbe8c9884b042c4363890108f616483b694ebe9a6e69578dcf89c6dac5c" + }, + "vllm/v1/worker/gpu_worker.py": { + "path": "/vllm/v1/worker/gpu_worker.py", + "sha256": "6994436e4547c0996ab555b3e814e8ccea26b650dfc1b378b97d640745309347" + }, + "vllm/v1/worker/kv_connector_model_runner_mixin.py": { + "path": "/vllm/v1/worker/kv_connector_model_runner_mixin.py", + "sha256": "e1cc76d065a7e60aacddb190ae795a480b65cd02ba71a1fc699a02a85c1a3de2" + }, + "vllm/v1/worker/lora_model_runner_mixin.py": { + "path": "/vllm/v1/worker/lora_model_runner_mixin.py", + "sha256": "fef6092a15d8d37f6fa22495e6106e2e5280180908d61ce43d9ff5bf4eef3f2f" + }, + "vllm/v1/worker/mamba_utils.py": { + "path": "/vllm/v1/worker/mamba_utils.py", + "sha256": "23fdaa4e8f63ee8f938eaa1a2b39f803cb04fa6ecd69789563254b1a0691413a" + }, + "vllm/v1/worker/mm_encoder_model_runner.py": { + "path": "/vllm/v1/worker/mm_encoder_model_runner.py", + "sha256": "780c41be84ad022205c21c1decb6bb8d5afb03bc7be120c1f7df03b710acc3d7" + }, + "vllm/v1/worker/sentinel/__init__.py": { + "path": "/vllm/v1/worker/sentinel/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/sentinel/gpu_worker_sentinel.py": { + "path": "/vllm/v1/worker/sentinel/gpu_worker_sentinel.py", + "sha256": "3959b8619d052c5dd247815074e03ec21ec9b43cc424ff2d296abc19b227b852" + }, + "vllm/v1/worker/startup_plan.py": { + "path": "/vllm/v1/worker/startup_plan.py", + "sha256": "84bcbb4f7a9fd7c8d10c9c895aadd9673d44c767b9132368d11eb5e017afe86b" + }, + "vllm/v1/worker/ubatch_utils.py": { + "path": "/vllm/v1/worker/ubatch_utils.py", + "sha256": "b34dce551b5195c414e6a3a997c75961cc7a17f24c7c980487fe3d3e2ba7a798" + }, + "vllm/v1/worker/ubatching.py": { + "path": "/vllm/v1/worker/ubatching.py", + "sha256": "40391241c564feb5f16c77898ae6ae152ed6e71a4682e2a406387785d8de02d7" + }, + "vllm/v1/worker/utils.py": { + "path": "/vllm/v1/worker/utils.py", + "sha256": "0ca3ec6bf4d20076145b7fe64e564962adebedc8f75a856b517ba0b2f2d77acf" + }, + "vllm/v1/worker/worker_base.py": { + "path": "/vllm/v1/worker/worker_base.py", + "sha256": "4a1a5266b912fe97991d8dc89d92b923990da9f6cb4b817d00d52e9c0d26dd7c" + }, + "vllm/v1/worker/workspace.py": { + "path": "/vllm/v1/worker/workspace.py", + "sha256": "d21c08167d1d0d1c0cddaa80453a53a0b4dec5d81b5a537c94a21324344976b3" + }, + "vllm/v1/worker/xpu_model_runner.py": { + "path": "/vllm/v1/worker/xpu_model_runner.py", + "sha256": "07fa0390d28f2b8c3c3c0019eb9c3b126e2397aea268ba47c889f06b423deb23" + }, + "vllm/v1/worker/xpu_worker.py": { + "path": "/vllm/v1/worker/xpu_worker.py", + "sha256": "711b56432506b58041cd86e71320c3960413f7bd61061990b66488421d81cfc3" + } + }, + "prefix": "", + "pth": { + "/__editable__.megatron_core-0.16.0rc0.pth": "d55c9b64480b34aae3d4d31e7706b93391c969dec6e0498e50963b03445a57b0", + "/__editable__.rl_kernel-0.1.0.pth": "1454c4987b35762a0d189d4e901c5d077fde62a1944fbaabecea230e57f3923a", + "/__editable__.vime-0.3.2.pth": "77eec5d06d628cb952e65edd813ca88d8db67ccc785083e1b7b29011b92bec4f", + "/distutils-precedence.pth": "2638ce9e2500e572a5e0de7faed6661eb569d1b696fcba07b0dd223da5f5d224", + "/qwen3_next_cuda_runtime.pth": "e0d3ab57dd3ff4f5d55fcf76e83c549cc00b3c813e6f717c540d5ded79fa2f49", + "/qwen3_next_megatron_source.pth": "8556ac057538e82856cb76cbbc954f58312a3f45373daec3eec826031cfd2709", + "/__editable__.rl_kernel-0.1.0.pth": "1454c4987b35762a0d189d4e901c5d077fde62a1944fbaabecea230e57f3923a", + "/distutils-precedence.pth": "2638ce9e2500e572a5e0de7faed6661eb569d1b696fcba07b0dd223da5f5d224", + "/nvidia_cutlass_dsl_packages.pth": "cc710b99ddb3d76361a70461461d274212a979d00c381d821fce5bb3ad9cf246" + }, + "pyvenv_cfg_sha256": "48579f2c6d35c3d535c2690d7d426587c4b8e92021463f0266b38d35dfbbb834", + "sources": { + "/Megatron-LM-training": { + "patch_sha256": "f66035f12501aa1d08e8884e0dea5a22d59825d717aeda73c3e83876e3efd79f", + "path": "/Megatron-LM-training", + "tree": "731fc44a368d6cac8c6171a29d5c687ff0d95bd1" + }, + "/vime": { + "patch_sha256": "66949839d4c18329444f4f9f6dcd702b53ce1b94e9aa15ed111f28743bfaa4b9", + "path": "/vime", + "tree": "f5174e67dbcdaef983eecd45f215fef2d8429dd0" + } + }, + "version": "3.12.14 | packaged by Anaconda, Inc. | (main, Aug 27 2026, 14:46:43) [GCC 14.3.0]" + }, + "sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca" + }, + "memory": { + "limits": { + "/memory.limit_in_bytes": "9223372036854771712", + "/memory.limit_in_bytes": "9223372036854771712", + "/memory.limit_in_bytes": "9223372036854771712" + }, + "cgroup_bytes": null, + "declared_bytes": 549755813888, + "effective_bytes": 549755813888, + "available_bytes": 2084410658816 + }, + "gpu_uuids": [ + "dcc07b03-a36e-3e74-6bac-083b8fbb1ef2", + "7ed20e71-9918-90c0-e6e8-5b63679fc495", + "4e306531-0253-eb59-707b-cb5bd20b2690", + "4159b731-34fc-94af-0054-0b53d5ee025c" + ] +} diff --git a/docs/usage/evidence/qwen3-next-batch-invariance-b200/bi/operators.json b/docs/usage/evidence/qwen3-next-batch-invariance-b200/bi/operators.json new file mode 100644 index 000000000..a6e914e66 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-batch-invariance-b200/bi/operators.json @@ -0,0 +1,304 @@ +{ + "scope": "qwen3_next_operators_only", + "status": "passed", + "suite": "all", + "diagnostic_only": false, + "full_model_l2": "not_evaluated", + "git_commit": "759755e08f8a801d617a273fe23b55831f8de194", + "git_dirty": false, + "versions": { + "torch": "2.13.0", + "vllm": "0.30.0", + "transformers": "5.17.0", + "triton": "3.7.1" + }, + "mandatory_case_ids": [ + "tests/check_qwen3_next_attention.py::test_d256_backward_with_cached_prefix_matches_float64_formula", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[1024]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[256]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[64]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[8]", + "tests/check_qwen3_next_attention.py::test_d256_input_device_guard_and_nondefault_stream", + "tests/check_qwen3_next_attention.py::test_native_backward_rejects_malformed_probability_and_gradient_buffers", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[0]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[2]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_target_inputs_do_not_depend_on_companions", + "tests/check_qwen3_next_batch_invariance.py::test_triton_chunked_prefill_is_batch_invariant", + "tests/check_qwen3_next_conv_bridge.py::test_chunked_and_reordered_sequences_match", + "tests/check_qwen3_next_conv_bridge.py::test_empty_sequence_preserves_cache_and_gradients", + "tests/check_qwen3_next_conv_bridge.py::test_response_gradient_reaches_prompt_and_convolution_weight", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths0]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths1]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths2]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-4]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[1]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[4]", + "tests/check_qwen3_next_core_matrix.py::test_variable_lengths_empty_and_mixed_step_match_independent_sequences", + "tests/check_qwen3_next_forward.py::test_combine_has_fixed_route_order_and_differentiable_weights", + "tests/check_qwen3_next_forward.py::test_full_vocabulary_logprob_entropy_modes_and_gradient", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_fail_closed_on_the_tensor_descriptor_path", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[128]", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[512]", + "tests/check_qwen3_next_forward.py::test_logprob_nan_rejected_before_comparison", + "tests/check_qwen3_next_forward.py::test_moe_vjp_matches_independent_double_formula", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[1024-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[128-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-16]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-256]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-3072]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-37984]", + "tests/check_qwen3_next_forward.py::test_qwen_moe_actual_tp4_shapes_and_independent_training_forward", + "tests/check_qwen3_next_forward.py::test_route_weights_are_batch_invariant", + "tests/check_qwen3_next_forward.py::test_shared_linear_vjp_and_empty_tokens", + "tests/check_qwen3_next_forward.py::test_stable_route_tie_boundary_and_router_gradient", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_backward_matches_recomputed_recurrence_vjp", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_forward_is_provider_exact_and_does_not_mutate_inputs", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_keeps_prompt_state_gradient_through_response", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[False]", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[True]", + "tests/check_qwen3_next_gdn_bridge.py::test_initial_state_vjp_matches_provider_directional_difference", + "tests/check_qwen3_next_gdn_sequence.py::test_1024_token_chunk_continuation_is_bitwise_exact", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad0]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad1]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad2]", + "tests/check_qwen3_next_gdn_sequence.py::test_chunk_boundary_retains_prompt_and_initial_state_gradients", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths0]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths1]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths2]", + "tests/check_qwen3_next_gdn_sequence.py::test_reserved_and_duplicate_slots_are_rejected", + "tests/check_qwen3_next_norm_providers.py::test_custom_op_has_distinct_native_and_cuda_paths", + "tests/check_qwen3_next_norm_providers.py::test_gdn_decode_provider_env_defaults_are_recorded", + "tests/check_qwen3_next_norm_providers.py::test_our_gated_op_is_batch_invariant", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_cuda]", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_native]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots0]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots2]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots3]", + "tests/check_qwen3_next_shared_core.py::test_independent_training_forward_matches_inference_and_retains_gradients", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[1024]", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[8]", + "tests/check_qwen3_next_shared_core.py::test_unimplemented_provider_profile_is_rejected", + "tests/test_qwen3_next_norm.py::test_bad_weight_shape_raises", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[16]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[1]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[2]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[32]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[48]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[64]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[8]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[128]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[2048]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_with_padding", + "tests/test_qwen3_next_norm.py::test_call_matches_forward", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[128]", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[2048]", + "tests/test_qwen3_next_norm.py::test_cuda_default_offset_preserves_plain_convention", + "tests/test_qwen3_next_norm.py::test_cuda_gated_backward_matches_autograd_golden", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_matches_golden_within_contract", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_bad_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_mismatched_gate", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_backward_uses_the_sigmoid_derivative", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_swish_is_an_alias_for_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_unit_weight_is_plain_norm_times_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_weight_offset_is_applied_in_fp32", + "tests/test_qwen3_next_norm.py::test_cuda_gated_wrapper_rejects_equal_numel_wrong_shape", + "tests/test_qwen3_next_norm.py::test_cuda_gated_zero_gate_zeroes_output", + "tests/test_qwen3_next_norm.py::test_cuda_offset_equals_explicit_fp32_weight", + "tests/test_qwen3_next_norm.py::test_cuda_offset_is_not_folded_through_bfloat16", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_backward_is_offset_aware", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_within_tolerance_of_golden", + "tests/test_qwen3_next_norm.py::test_deterministic_repeat", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype0]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype1]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype2]", + "tests/test_qwen3_next_norm.py::test_eps_inside_sqrt", + "tests/test_qwen3_next_norm.py::test_gated_batch_invariance_slice", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedHFOp]", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedOp]", + "tests/test_qwen3_next_norm.py::test_gated_conventions_diverge_in_low_precision", + "tests/test_qwen3_next_norm.py::test_gated_cuda_op_rejects_bad_activation_at_construction", + "tests/test_qwen3_next_norm.py::test_gated_extension_handles_empty_batch_and_nondefault_stream", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[dy_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[gate_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[rstd_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_shape]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_matches_hf_formula_fp32", + "tests/test_qwen3_next_norm.py::test_gated_shape_mismatch_raises", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_strict_matches_vllm_formula_fp32", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[128]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[2048]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_offset_applied_in_fp32_not_folded_into_bf16", + "tests/test_qwen3_next_norm.py::test_op_batch_invariance_on_device", + "tests/test_qwen3_next_norm.py::test_plain_reference_is_unchanged_by_the_offset_plumbing", + "tests/test_qwen3_next_norm.py::test_weight_offset_is_one", + "tests/test_qwen3_next_norm.py::test_zero_centred_cuda_constructor_rejects_missing_extension", + "tests/test_qwen3_next_norm.py::test_zero_centred_op_inherits_the_plain_reference", + "tests/test_qwen3_next_norm.py::test_zero_weight_is_identity_scaling" + ], + "case_ids_sha256": "694c931b65f9cfa5db963f2eca6d11bd309546c824a1df52f9da2ab128e83e0f", + "pytest_exit_code": 0, + "provider_tests": { + "tests": 233, + "failures": 0, + "errors": 0, + "skipped": 0 + }, + "norm_gates": { + "qwen3_next_rms_norm-forward.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + }, + "qwen3_next_rms_norm-gradient.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + }, + "rms_norm_gated-forward.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + }, + "rms_norm_gated-gradient.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + } + } +} diff --git a/docs/usage/evidence/qwen3-next-batch-invariance-b200/bi/provider_binary.json b/docs/usage/evidence/qwen3-next-batch-invariance-b200/bi/provider_binary.json new file mode 100644 index 000000000..9e5553eb3 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-batch-invariance-b200/bi/provider_binary.json @@ -0,0 +1,13 @@ +{ + "schema_version": 1, + "source_tree": "d8da35c889c3ffe57d8569fd9d2c51b063de16ce", + "actual": { + "module": "rl_engine._C", + "path": "/source/rl_engine/_C.cpython-312-x86_64-linux-gnu.so", + "sha256": "be6056be08632dd70b0f02cc9b21c2eec08131b1336872dad0b7028184f04be6" + }, + "archive": { + "path": "/attempts/0/provider-binary.so", + "sha256": "be6056be08632dd70b0f02cc9b21c2eec08131b1336872dad0b7028184f04be6" + } +} diff --git a/docs/usage/evidence/qwen3-next-batch-invariance-b200/bi/result.json b/docs/usage/evidence/qwen3-next-batch-invariance-b200/bi/result.json new file mode 100644 index 000000000..bdb5ec534 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-batch-invariance-b200/bi/result.json @@ -0,0 +1,771 @@ +{ + "contract_version": 4, + "source_tree": "d8da35c889c3ffe57d8569fd9d2c51b063de16ce", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "cuda_identity": { + "home": "", + "nvcc_sha256": "b8e2347d9d7fcadf8812a27324d515de99d033d3e48611811ece7e66d7895f8a" + }, + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "operator_requirements": { + "suite": "all", + "case_ids": [ + "tests/check_qwen3_next_attention.py::test_d256_backward_with_cached_prefix_matches_float64_formula", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[1024]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[256]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[64]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[8]", + "tests/check_qwen3_next_attention.py::test_d256_input_device_guard_and_nondefault_stream", + "tests/check_qwen3_next_attention.py::test_native_backward_rejects_malformed_probability_and_gradient_buffers", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[0]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[2]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_target_inputs_do_not_depend_on_companions", + "tests/check_qwen3_next_batch_invariance.py::test_triton_chunked_prefill_is_batch_invariant", + "tests/check_qwen3_next_conv_bridge.py::test_chunked_and_reordered_sequences_match", + "tests/check_qwen3_next_conv_bridge.py::test_empty_sequence_preserves_cache_and_gradients", + "tests/check_qwen3_next_conv_bridge.py::test_response_gradient_reaches_prompt_and_convolution_weight", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths0]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths1]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths2]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-4]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[1]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[4]", + "tests/check_qwen3_next_core_matrix.py::test_variable_lengths_empty_and_mixed_step_match_independent_sequences", + "tests/check_qwen3_next_forward.py::test_combine_has_fixed_route_order_and_differentiable_weights", + "tests/check_qwen3_next_forward.py::test_full_vocabulary_logprob_entropy_modes_and_gradient", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_fail_closed_on_the_tensor_descriptor_path", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[128]", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[512]", + "tests/check_qwen3_next_forward.py::test_logprob_nan_rejected_before_comparison", + "tests/check_qwen3_next_forward.py::test_moe_vjp_matches_independent_double_formula", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[1024-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[128-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-16]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-256]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-3072]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-37984]", + "tests/check_qwen3_next_forward.py::test_qwen_moe_actual_tp4_shapes_and_independent_training_forward", + "tests/check_qwen3_next_forward.py::test_route_weights_are_batch_invariant", + "tests/check_qwen3_next_forward.py::test_shared_linear_vjp_and_empty_tokens", + "tests/check_qwen3_next_forward.py::test_stable_route_tie_boundary_and_router_gradient", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_backward_matches_recomputed_recurrence_vjp", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_forward_is_provider_exact_and_does_not_mutate_inputs", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_keeps_prompt_state_gradient_through_response", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[False]", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[True]", + "tests/check_qwen3_next_gdn_bridge.py::test_initial_state_vjp_matches_provider_directional_difference", + "tests/check_qwen3_next_gdn_sequence.py::test_1024_token_chunk_continuation_is_bitwise_exact", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad0]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad1]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad2]", + "tests/check_qwen3_next_gdn_sequence.py::test_chunk_boundary_retains_prompt_and_initial_state_gradients", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths0]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths1]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths2]", + "tests/check_qwen3_next_gdn_sequence.py::test_reserved_and_duplicate_slots_are_rejected", + "tests/check_qwen3_next_norm_providers.py::test_custom_op_has_distinct_native_and_cuda_paths", + "tests/check_qwen3_next_norm_providers.py::test_gdn_decode_provider_env_defaults_are_recorded", + "tests/check_qwen3_next_norm_providers.py::test_our_gated_op_is_batch_invariant", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_cuda]", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_native]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots0]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots2]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots3]", + "tests/check_qwen3_next_shared_core.py::test_independent_training_forward_matches_inference_and_retains_gradients", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[1024]", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[8]", + "tests/check_qwen3_next_shared_core.py::test_unimplemented_provider_profile_is_rejected", + "tests/test_qwen3_next_norm.py::test_bad_weight_shape_raises", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[16]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[1]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[2]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[32]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[48]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[64]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[8]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[128]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[2048]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_with_padding", + "tests/test_qwen3_next_norm.py::test_call_matches_forward", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[128]", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[2048]", + "tests/test_qwen3_next_norm.py::test_cuda_default_offset_preserves_plain_convention", + "tests/test_qwen3_next_norm.py::test_cuda_gated_backward_matches_autograd_golden", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_matches_golden_within_contract", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_bad_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_mismatched_gate", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_backward_uses_the_sigmoid_derivative", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_swish_is_an_alias_for_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_unit_weight_is_plain_norm_times_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_weight_offset_is_applied_in_fp32", + "tests/test_qwen3_next_norm.py::test_cuda_gated_wrapper_rejects_equal_numel_wrong_shape", + "tests/test_qwen3_next_norm.py::test_cuda_gated_zero_gate_zeroes_output", + "tests/test_qwen3_next_norm.py::test_cuda_offset_equals_explicit_fp32_weight", + "tests/test_qwen3_next_norm.py::test_cuda_offset_is_not_folded_through_bfloat16", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_backward_is_offset_aware", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_within_tolerance_of_golden", + "tests/test_qwen3_next_norm.py::test_deterministic_repeat", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype0]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype1]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype2]", + "tests/test_qwen3_next_norm.py::test_eps_inside_sqrt", + "tests/test_qwen3_next_norm.py::test_gated_batch_invariance_slice", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedHFOp]", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedOp]", + "tests/test_qwen3_next_norm.py::test_gated_conventions_diverge_in_low_precision", + "tests/test_qwen3_next_norm.py::test_gated_cuda_op_rejects_bad_activation_at_construction", + "tests/test_qwen3_next_norm.py::test_gated_extension_handles_empty_batch_and_nondefault_stream", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[dy_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[gate_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[rstd_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_shape]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_matches_hf_formula_fp32", + "tests/test_qwen3_next_norm.py::test_gated_shape_mismatch_raises", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_strict_matches_vllm_formula_fp32", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[128]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[2048]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_offset_applied_in_fp32_not_folded_into_bf16", + "tests/test_qwen3_next_norm.py::test_op_batch_invariance_on_device", + "tests/test_qwen3_next_norm.py::test_plain_reference_is_unchanged_by_the_offset_plumbing", + "tests/test_qwen3_next_norm.py::test_weight_offset_is_one", + "tests/test_qwen3_next_norm.py::test_zero_centred_cuda_constructor_rejects_missing_extension", + "tests/test_qwen3_next_norm.py::test_zero_centred_op_inherits_the_plain_reference", + "tests/test_qwen3_next_norm.py::test_zero_weight_is_identity_scaling" + ], + "case_ids_sha256": "694c931b65f9cfa5db963f2eca6d11bd309546c824a1df52f9da2ab128e83e0f", + "norm_gates": [ + "qwen3_next_rms_norm-forward.json", + "qwen3_next_rms_norm-gradient.json", + "rms_norm_gated-forward.json", + "rms_norm_gated-gradient.json" + ] + }, + "layer_requirements": { + "schema_version": 1, + "gates": { + "gdn": { + "script": "scripts/qwen3_next_tp_gdn_check.py", + "output_option": "--output", + "scope": "tp4_gdn_layer0", + "groups": { + "cases": [ + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "prompt-gradient", + "replicated-norm-gradient", + "hf-load-export" + ] + }, + "script_sha256": "cc4338893f90af004c51c20fc67d1a9a3f4bf8d26775277f72671c02983e4df5" + }, + "attention": { + "script": "scripts/qwen3_next_tp_attention_check.py", + "output_option": "--output", + "scope": "tp4_full_attention_layer3", + "groups": { + "attention.cases": [ + "hf-load-export", + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "batch4-varlen-reorder", + "sixteen-token-decode", + "prompt-gradient", + "kv-pair-gradient", + "qk-norm-gradient" + ] + }, + "script_sha256": "d27d43efb05415a8ef5892c3c2238a2b9744a4821f5466faf46c6510e6e01bec" + }, + "moe": { + "script": "scripts/qwen3_next_tp_moe_check.py", + "output_option": "--output", + "scope": "tp4_moe_block_layer0", + "groups": { + "moe.cases": [ + "hf-load-export-all512experts", + "routes-replicated-8", + "full-chunk-reorder-8", + "routes-replicated-64", + "full-chunk-reorder-64", + "routes-replicated-256", + "full-chunk-reorder-256", + "routes-replicated-1024", + "full-chunk-reorder-1024", + "training-forward", + "all-parameter-gradient", + "replicated-router-gradient" + ] + }, + "script_sha256": "d5c1bbbb82e408b65871b0cb1638d7a6cf8cfe07f0a3315a657b7dc232d544be" + }, + "adapters": { + "script": "scripts/qwen3_next_adapter_check.py", + "output_option": "--out", + "scope": "gdn_engine_adapter_component", + "groups": { + "cases": [ + "batch1-length8", + "batch1-length64", + "batch1-length256", + "batch1-length1024", + "batch4-length8", + "batch4-length64", + "batch4-length256", + "batch4-length1024", + "mixed-prefill-decode16-reorder" + ] + }, + "fields": { + "prompt_gradient": "passed", + "hf_conv_roundtrip": "passed", + "batch_invariance_capability_registered": false + }, + "script_sha256": "3ce45bb317237c1a06533116d65fb77c2a23b6f503ae46406ede543036eb0f20" + }, + "heads": { + "script": "scripts/qwen3_next_tp_head_check.py", + "output_option": "--output", + "scope": "tp4_embedding_lm_head_only", + "groups": { + "cases": [ + "hf-embedding-roundtrip", + "hf-lm-head-roundtrip", + "replicated-norm-gradient", + "nonzero-finite-embedding-head-gradient", + "embedding-repeat-100", + "batch-invariant-prompt8", + "batch-invariant-prompt64", + "batch-invariant-prompt256", + "batch-invariant-prompt1024", + "logprob-original-and-promoted-logits", + "entropy-interface" + ] + }, + "script_sha256": "0504185d21a75405c8e994bc57b016cf4ec357d8b16e7430772c11934f2af876" + } + }, + "scheduler_case_ids": [ + "p0008-b1-full", + "p0008-b1-chunked", + "p0008-b4-full", + "p0008-b4-chunked", + "p0064-b1-full", + "p0064-b1-chunked", + "p0064-b4-full", + "p0064-b4-chunked", + "p0256-b1-full", + "p0256-b1-chunked", + "p0256-b4-full", + "p0256-b4-chunked", + "p1024-b1-full", + "p1024-b1-chunked", + "p1024-b4-full", + "p1024-b4-chunked" + ], + "registry_sha256": "e3949a750cb27c1897a000f3b023f912629906612ae8949c1575d0acc36df5ec", + "case_ids_per_rank": [ + "adapters/cases/batch1-length1024", + "adapters/cases/batch1-length256", + "adapters/cases/batch1-length64", + "adapters/cases/batch1-length8", + "adapters/cases/batch4-length1024", + "adapters/cases/batch4-length256", + "adapters/cases/batch4-length64", + "adapters/cases/batch4-length8", + "adapters/cases/mixed-prefill-decode16-reorder", + "attention/attention.cases/batch4-varlen-reorder", + "attention/attention.cases/full-chunk-1024", + "attention/attention.cases/full-chunk-256", + "attention/attention.cases/full-chunk-64", + "attention/attention.cases/full-chunk-8", + "attention/attention.cases/hf-load-export", + "attention/attention.cases/kv-pair-gradient", + "attention/attention.cases/prompt-gradient", + "attention/attention.cases/qk-norm-gradient", + "attention/attention.cases/sixteen-token-decode", + "gdn/cases/full-chunk-1024", + "gdn/cases/full-chunk-256", + "gdn/cases/full-chunk-64", + "gdn/cases/full-chunk-8", + "gdn/cases/hf-load-export", + "gdn/cases/prompt-gradient", + "gdn/cases/replicated-norm-gradient", + "heads/cases/batch-invariant-prompt1024", + "heads/cases/batch-invariant-prompt256", + "heads/cases/batch-invariant-prompt64", + "heads/cases/batch-invariant-prompt8", + "heads/cases/embedding-repeat-100", + "heads/cases/entropy-interface", + "heads/cases/hf-embedding-roundtrip", + "heads/cases/hf-lm-head-roundtrip", + "heads/cases/logprob-original-and-promoted-logits", + "heads/cases/nonzero-finite-embedding-head-gradient", + "heads/cases/replicated-norm-gradient", + "moe/moe.cases/all-parameter-gradient", + "moe/moe.cases/full-chunk-reorder-1024", + "moe/moe.cases/full-chunk-reorder-256", + "moe/moe.cases/full-chunk-reorder-64", + "moe/moe.cases/full-chunk-reorder-8", + "moe/moe.cases/hf-load-export-all512experts", + "moe/moe.cases/replicated-router-gradient", + "moe/moe.cases/routes-replicated-1024", + "moe/moe.cases/routes-replicated-256", + "moe/moe.cases/routes-replicated-64", + "moe/moe.cases/routes-replicated-8", + "moe/moe.cases/training-forward" + ], + "case_ids_sha256": "be74417dfbd6031ba27978d06d04bb15daaab2aeb57d132c7e0d41176b28b46e" + }, + "source_commit": "759755e08f8a801d617a273fe23b55831f8de194", + "run_id": "20261009T063922Z-bi-759755e0-4dd278d5", + "stage": "bi", + "suite": "all", + "execution_id": "4dd278d521b74fc49b12af8e12e01653", + "attempt": "0", + "status": "passed", + "phase": "complete", + "scope": "qwen3_next_batch_invariance", + "full_model_l2": "not_evaluated", + "evidence": { + "operators": { + "path": "attempts/0/operators.json", + "sha256": "bb96af8122ba0c79d94ba00fc8f67c18d1d5cb1d3806a4c372ec0f0f19ab52c5" + }, + "environment": { + "path": "attempts/0/environment.json", + "sha256": "624b1e7d368de26a0f84c655d1ed0246d549bbdf68387819ff053b70136161e3" + }, + "provider_binary": { + "path": "attempts/0/provider-binary.json", + "sha256": "2d20f473fe71e1539a8a4e04ccbde8e012b3e44e6c36e43fb15ecd6f822a1243" + }, + "bi_matrix": { + "path": "attempts/0/bi-matrix.json", + "sha256": "a41bdbf7857766e5fe02f4d696230dc39c83fcf0db11ba5f22aee7e9ff84fa11" + } + } +} diff --git a/docs/usage/evidence/qwen3-next-batch-invariance-b200/bi/run.json b/docs/usage/evidence/qwen3-next-batch-invariance-b200/bi/run.json new file mode 100644 index 000000000..33f2fff78 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-batch-invariance-b200/bi/run.json @@ -0,0 +1,5253 @@ +{ + "run_id": "20261009T063922Z-bi-759755e0-4dd278d5", + "execution_id": "4dd278d521b74fc49b12af8e12e01653", + "contract_version": 4, + "suite": "all", + "execution_gpus": 4, + "source_tree": "d8da35c889c3ffe57d8569fd9d2c51b063de16ce", + "stage": "bi", + "source_commit": "759755e08f8a801d617a273fe23b55831f8de194", + "source": "/source", + "python": "", + "cuda_home": "", + "checkpoint": "", + "memory": "512G", + "previous": "", + "status": "prepared", + "full_model_l2": "not_evaluated", + "bi_suite": "full", + "environment": { + "identity": { + "base_prefix": "/miniconda3/envs/rlkernel", + "binary": "/python3.12", + "binary_sha256": "6a1eb3ffc29f3a6b0ece607b016b4cfa5ca3ac57b34f17ed3266b404f78d2729", + "build_tools": { + "ninja": { + "path": "/miniconda3/envs/rlkernel/bin/ninja", + "sha256": "08639e194fffa7f08b259fc4abfa4803aff66b64de52549cee42ec527d55cea6" + } + }, + "distributions": [ + { + "direct_url": null, + "metadata_sha256": "6f1038270be40f9b8c0bcf391c627e7d7f41ccdd19aa192d6eac1dbfc3b19abc", + "name": "GitPython", + "version": "3.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "3f71971502087521f123c9daa26bc12d31d3466738b567390b8602acad3be22a", + "name": "Jinja2", + "version": "3.1.6" + }, + { + "direct_url": null, + "metadata_sha256": "818fb343b7b6b99a32771bf4813521ae6440b4c7579b3ae46e32dd02da0afeee", + "name": "Markdown", + "version": "3.11" + }, + { + "direct_url": null, + "metadata_sha256": "dc1ee42cf8ecfeee0ab60b15b21d291833e0732548efcb7bb5b3564dca3e5bf7", + "name": "MarkupSafe", + "version": "3.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "de7389b142450a0014234286b0876f328439b823c355c73d0aed41fd67ec208c", + "name": "PyJWT", + "version": "2.15.1" + }, + { + "direct_url": null, + "metadata_sha256": "ffcad4415cafb22b8b536a61595e9ee13438b51d31b0763c1b273ce3bc58e840", + "name": "PyYAML", + "version": "6.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "8562d701cc52d9cafbb418942b0e072fc087ed8ddcf35cd10224c1b2ed8bdd91", + "name": "Pygments", + "version": "2.21.0" + }, + { + "direct_url": null, + "metadata_sha256": "b6c25fcfdcc495edf248a10ca4ad28327ef2ed6047a6ec5c6346e121414c7f21", + "name": "Werkzeug", + "version": "3.1.9" + }, + { + "direct_url": null, + "metadata_sha256": "55c400d24c71b581d9c0992f71df6047cf6c878bebe61a7d45d6e02dc0e4c510", + "name": "absl-py", + "version": "2.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "13db521f90a6a882027b2388eaa2ebf252945f9c2adb7e7e371da18239da4df0", + "name": "accelerate", + "version": "1.15.0" + }, + { + "direct_url": null, + "metadata_sha256": "86fe44e38e67872dd895c729044942ba2c2f934ae439a899fb83a186206b7fd4", + "name": "agent-detector", + "version": "2.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "afe11fe9f5aa54e734cdd51659bed8c89dc6bcd5aef0ad96f2d20149c8de5456", + "name": "aiohappyeyeballs", + "version": "2.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "570b307bc0b53fbbd3ed2ce0b7eca6bbf2fa73bf75e24a480f1034d8c0b832bf", + "name": "aiohttp", + "version": "3.14.3" + }, + { + "direct_url": null, + "metadata_sha256": "44b7f8e14c4770793e747fad50c9e0a6ee7357651d878554f192d94768dc14a8", + "name": "aiohttp-cors", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "648813a44a9ae0ab2f20ee86d2404dcc38e3f9e80c63316cf6e536735df14e54", + "name": "aiosignal", + "version": "1.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "f6a3f6668bacef7f73a2c19ccb2be910b2363d1731c4725cb04364d99e24935a", + "name": "annotated-doc", + "version": "0.0.5" + }, + { + "direct_url": null, + "metadata_sha256": "fc6d752cde6a6a4bff03474386de750e130b75da3c7815ee909f45b51fea98c8", + "name": "annotated-types", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "4e89d670a4b20029da30e5a9e8ebcbc844deff9c44209552bafd5537249c8b9e", + "name": "anthropic", + "version": "1.9.0" + }, + { + "direct_url": null, + "metadata_sha256": "b5a6f00800956387fcddab1fe1b5aa8502c249b86cfb16d58ed700f282f60142", + "name": "antlr4-python3-runtime", + "version": "4.9.3" + }, + { + "direct_url": null, + "metadata_sha256": "a6008defa9492cd08250217b134782cad1db4580e1d7ddf69cc2a2a48cea24e0", + "name": "anyio", + "version": "4.15.1" + }, + { + "direct_url": null, + "metadata_sha256": "7877c64ce8957237363f2df313819bb07f50752df016d14c5a5a99bec10f5deb", + "name": "apache-tvm-ffi", + "version": "0.1.11" + }, + { + "direct_url": null, + "metadata_sha256": "3543ca8f0e072c00ab111b20eba99ce86dbf93ada28988775bc2677284b3c07a", + "name": "astor", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "d4b328c09c024fe1e4d788a9c7715ad726095131b815cd35fd933268226f6269", + "name": "attrs", + "version": "26.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "4850c4d696a5e2a2ecbb3dd792b060acc1de79e09800669b0b9fc3a22c055e6d", + "name": "av", + "version": "19.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "863ff92208d0a02dabfa008bfe91846a5c401ded301e5687dca7dc63c911865f", + "name": "babel", + "version": "2.18.0" + }, + { + "direct_url": null, + "metadata_sha256": "f32e6df3197f05202e586624d95c5e217003d80cee655c165d533102f628df21", + "name": "backrefs", + "version": "8.0" + }, + { + "direct_url": null, + "metadata_sha256": "905c362f655fbc6d37a24686efc2b3bfbd3123b8ee5a443a43f6750d87455e90", + "name": "blake3", + "version": "1.0.10" + }, + { + "direct_url": null, + "metadata_sha256": "07c85682b6aefd5c9b48890d306c1604311902295704892ede48e5a83219a8d3", + "name": "blobfile", + "version": "3.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "2d582941a7081625a35f35a0c4a2e80f7737312e29c38e5fdb6fc08f9c113077", + "name": "bracex", + "version": "3.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "3b60c55bae0d0340c3a3fd918635bbfa3087579da66e0fd7f6be7a3782c0da3d", + "name": "cachetools", + "version": "7.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "5d11a6878d5bc3f22290281a19ef7b36daa95c910780950608b95cd788c7e12e", + "name": "cbor2", + "version": "6.1.4" + }, + { + "direct_url": null, + "metadata_sha256": "362c9942c48051f168ed2b9f2146266b7792d3c05e164cd6afc3f3b65884fdc9", + "name": "certifi", + "version": "2026.7.22" + }, + { + "direct_url": null, + "metadata_sha256": "b4abf1bcf1c1d8e0272d8007fc974499ea59e5f2a5b98af3c78a5e67515a9d87", + "name": "cffi", + "version": "2.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "766120f13c177446f51929a4d201104bc935b6d5a2a176cd6716edce757d3d95", + "name": "cfgv", + "version": "3.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "610e9a9d03ce837ffe6e42be5e02e70087f73863f7350bf7bb7f0511edcc5ec0", + "name": "charset-normalizer", + "version": "3.5.2" + }, + { + "direct_url": null, + "metadata_sha256": "7ad836b3147c9702546d9c28b4fa5be23b24445439db5d0d2a58d17281c84daa", + "name": "click", + "version": "8.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "4c5f00599ebcbf11d337e48a72784d256ca3d704fa9e9f5daadd60065e6776b7", + "name": "cloudpickle", + "version": "3.1.2" + }, + { + "direct_url": null, + "metadata_sha256": "a0970189e3ab7a596d6902d5f61f93b414f138f03d3cf19029145657bfceb382", + "name": "cmake", + "version": "4.1.2" + }, + { + "direct_url": null, + "metadata_sha256": "94a6ebf9718e55f254a43ce0d2f04e0d6d44e7141b6f3144a84feb6519a77bfd", + "name": "colorama", + "version": "0.4.6" + }, + { + "direct_url": null, + "metadata_sha256": "ca8ec227f406d970a645ec482b20619128dd34b9cf71159cc24e27db461a2711", + "name": "colorful", + "version": "0.5.8" + }, + { + "direct_url": null, + "metadata_sha256": "bbaa51b7e4d8f142bd075d01257c0572c0c844796d51426e35c8096a13e8da76", + "name": "compressed-tensors", + "version": "0.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "6063d8ff7ebc458d63a4332853d7ababf4ee2b86336362c8d2b12be6e998eb6b", + "name": "connectrpc", + "version": "0.11.1" + }, + { + "direct_url": null, + "metadata_sha256": "ac5f4b5a5f68080bd9c3fe77399fe8a1bff2ee5923c49db1df544dd054cbf15b", + "name": "cryptography", + "version": "50.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "f41d2f6b4616accca2f5e1dd47aa9e8937c28076cde698226d93e727751f3099", + "name": "cuda-bindings", + "version": "13.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "e5ca6ed34c687c6f4a4d157ad0a2cf06ec0316fe8c4c0ddeb666ad76dd6f30f4", + "name": "cuda-core", + "version": "1.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "89baadd9da23dce9990481519544115615ba3cbd2d1a41e09feea7756fffb378", + "name": "cuda-pathfinder", + "version": "1.8.2" + }, + { + "direct_url": null, + "metadata_sha256": "1ab914b9a57ca601df2e3cfe9608427b15d8afb78029076ace5d1caf9fd45f08", + "name": "cuda-python", + "version": "13.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "73d97a5eb578223b4895ef4f234574d14219cef9999ff7d0e92a3d0dd057bd3f", + "name": "cuda-tile", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "ae6f957fe66ed63081d1d83ee6e8838f3a0af2c6fce1223629d0dd6264565ead", + "name": "cuda-toolkit", + "version": "13.0.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "1f8e0ae51ad5feea63f58ed2e24f3da6f23ed548043235a14f7623d961dd9b64", + "name": "datasets", + "version": "5.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "153f4a4d6ff03dbe5c8ad7fe54bc2e7b989a4947b70f7aa77fbf652b394f2a2e", + "name": "depyf", + "version": "0.20.0" + }, + { + "direct_url": null, + "metadata_sha256": "ee09fc752d7271aac93079cfd63409957dc6b536c1ffd9355a01bf7297e72aa6", + "name": "detect-installer", + "version": "0.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "a7feab2c4f69fd5f85e5a3cb495a7f1870a6bf8199dcee5339e8118f7acbdc09", + "name": "dill", + "version": "0.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "fef3fde661fe30ba7bd1d78841a797136b2b3461705bb4eb92dc54f8308bbaae", + "name": "distlib", + "version": "0.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "fef3fde661fe30ba7bd1d78841a797136b2b3461705bb4eb92dc54f8308bbaae", + "name": "distlib", + "version": "0.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "a3ca2e39abe76c4a33d5fe4a2a84375ec9f25cdfdb7e1d8ea406bd6f1603205c", + "name": "dnspython", + "version": "2.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "92a07daad5e6ff461199de14e845d9b376e309ef916ce5379f3c9cd4e3b1623f", + "name": "dockerfile-parse", + "version": "2.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "5b566b25f0cbe4955d0b16844a7cc6d2002caa3bde2dfda7f301fd8870cbaa56", + "name": "docstring_parser", + "version": "0.18.0" + }, + { + "direct_url": null, + "metadata_sha256": "5a1080b5768c6c591e1c4f9c9812cafa808781b9eeb198043bf185e22d4a1613", + "name": "e2b", + "version": "2.51.0" + }, + { + "direct_url": null, + "metadata_sha256": "0a63979e0b946e16238e4339e60d9c1eb5a7ce3ea93dae78b5da9c65a6190540", + "name": "einops", + "version": "0.8.2" + }, + { + "direct_url": null, + "metadata_sha256": "16cbe67a57558f1d4bfdbc22a454434ba301750c57a62b1d3f5361c9e5cddc00", + "name": "email-validator", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "0617ddb55b90b42ddc9398dc7e91d61fe928a2504939f76526dc15b22d238caa", + "name": "fastapi", + "version": "0.136.3" + }, + { + "direct_url": null, + "metadata_sha256": "ddd82b9666c21988e234d623e2575e1b89fd4133260eeab43fc9a7c074f7024a", + "name": "fastapi-cli", + "version": "0.0.32" + }, + { + "direct_url": null, + "metadata_sha256": "611602e834d42e10433155ff5f5581358d732fa6b6f6f7820a8f79e74b1ce1f9", + "name": "fastapi-cloud-cli", + "version": "0.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "794524e4a9659bda6043721d848d028ea49996085a33326094fbaaa3f6e6b895", + "name": "fastar", + "version": "0.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "711401d36e60e10e35beb4d0f1bb42bf0c4d86339ae52f32b9aa4a4d790530dd", + "name": "fastsafetensors", + "version": "0.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "efaea9742e348c4c4bdcc6f616a33cc5aa3ae926494a72a46690b7da2f08ed5c", + "name": "filelock", + "version": "4.0.7" + }, + { + "direct_url": null, + "metadata_sha256": "99bd6c3f10781d3d2d350f2c3c9fc4765b55f25de8a6d6dd1f71501802d1255e", + "name": "fla-core", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "0a6ef979b75295cee2b5293ad4942b0cf2682e9e38680203064e0b70249c1a96", + "name": "flash-linear-attention", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "76b70a11ca82ea4606b529e7a8658cb3fe71412afa46f2ed57101dd91ba27558", + "name": "flashinfer-python", + "version": "0.6.18.post1" + }, + { + "direct_url": null, + "metadata_sha256": "ba8ff415192b5cbb90efce046e2271a00c8184afc362d8b47fbbc84d5e558b05", + "name": "frozenlist", + "version": "1.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "e7712831c80eb13b08fb7f7cc33988a8f24654af9eba7c6f5f943b2636e4306a", + "name": "fsspec", + "version": "2026.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "025de85c794878d0caa737869307447595f514ebf9599eacb5b1a501bae479b6", + "name": "fsspec", + "version": "2026.9.0" + }, + { + "direct_url": null, + "metadata_sha256": "ca94883bdeaa3740b45b6994443b445fd67c6e4a8064ac3bf9d92d2a5221eee8", + "name": "ghp-import", + "version": "2.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "a7e90983562a035cf767baa63d8c32bc37e1de7cad71ac7b6b2bc70a95bba4eb", + "name": "gitdb", + "version": "4.0.12" + }, + { + "direct_url": null, + "metadata_sha256": "dd96143ec79178bef685c1f5c0a58a87a66d003b421e605de65697308321d518", + "name": "google-api-core", + "version": "2.40.0" + }, + { + "direct_url": null, + "metadata_sha256": "0735d57088a83df2355e16843107fb0112abe2178fc5bb8132947a7ad962aa41", + "name": "google-auth", + "version": "2.59.1" + }, + { + "direct_url": null, + "metadata_sha256": "2f3aa9d9500d329560440e6a5a152e420aad5f5bbb23701f45b740be721784a1", + "name": "googleapis-common-protos", + "version": "1.75.5" + }, + { + "direct_url": null, + "metadata_sha256": "06d74ab04fdc03fad368868907f0d10e7d9f397aab58d58965c0b78ffaec34cc", + "name": "griffelib", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "7ee1c179e2c68a62968308b2f96f4f3469176ee3ac8bdb494ac80188d4d41271", + "name": "grpcio", + "version": "1.84.0" + }, + { + "direct_url": null, + "metadata_sha256": "04cf3a4a91575850f386f4fcfdedd8e7fbfba08feff038fbc1296d1e854db2dd", + "name": "h11", + "version": "0.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "b954a6ba4739c0cc878bb8ea27ea7c7154a48bb4b7c06dba9e9cf880cf0ec930", + "name": "h2", + "version": "4.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "6f0d7bf86e75d0bda1ceccc82367c0145ad0ec522c4d4f51bb454f467faadcc9", + "name": "hf-xet", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "f991b847550cf8225f69562902b5ccb591b2ce9a08fe07ef6e6d701bdb4694a7", + "name": "hpack", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "314d194165c4700034c1c67cee847d549a6d7091374c71f2cef0186ec56a3eb9", + "name": "httpcore", + "version": "1.0.9" + }, + { + "direct_url": null, + "metadata_sha256": "aed9767360bed1bcbda71e3b1a3c996603f86558bc77a1693ee3d09973d20cad", + "name": "httpcore2", + "version": "2.13.1" + }, + { + "direct_url": null, + "metadata_sha256": "8fa3bf3510c35e2eea9f523a1cace7120079cf51d76c4acea97de95806aaa14a", + "name": "httptools", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "3bf4804c215d111b6a4702cf9000021ab39807d1ed3207dd011b14b2843b2d14", + "name": "httpx", + "version": "0.28.1" + }, + { + "direct_url": null, + "metadata_sha256": "d11dd50813b8914bd9455e8b2b591171cd2b1618883943153afadc8bb9224678", + "name": "httpx2", + "version": "2.13.1" + }, + { + "direct_url": null, + "metadata_sha256": "43b119c34ad2b2aacc032a1a6a8feb142fdb5ca407a3519325d74dd53d8904df", + "name": "huggingface_hub", + "version": "1.33.0" + }, + { + "direct_url": null, + "metadata_sha256": "9ce850d5a6b775e5ef4a335f907e579a878e058213121b6eec567781ea68c585", + "name": "humming-kernels", + "version": "0.1.12" + }, + { + "direct_url": null, + "metadata_sha256": "67aa4f6717d82446a51ce350e7c4769eba0c4a22d2f428255cddd9d24b11a914", + "name": "hyperframe", + "version": "6.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd9511ede42f63b995c3f71944f908cb8f014048b63ecc1c8d420525a3354b59", + "name": "identify", + "version": "2.6.20" + }, + { + "direct_url": null, + "metadata_sha256": "af3c3a62bb5d82d6a43454684e0b1dedde27a21ea90eacfb1bed9814619f06d0", + "name": "idna", + "version": "3.20" + }, + { + "direct_url": null, + "metadata_sha256": "cf71393f3d079ce2e859384573e65aaacd1709bef700701f629df32398b598f0", + "name": "ijson", + "version": "3.5.1" + }, + { + "direct_url": null, + "metadata_sha256": "9305763e93d03df0e36516b1125fa046a6ebe37d44589e200e0593cf4bdfd980", + "name": "importlib_metadata", + "version": "9.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "32860c3c19b2e91f6cb5bd83400b5870cda051bc74a5a08822c8c666af0990db", + "name": "iniconfig", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "560faabb3d45d779e445a74e7e806a786f95f2200fa06d979603b7f0ee1cfb39", + "name": "instanttensor", + "version": "0.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "f6fc1f0d389e4245fc2a1a0fdfee09422e56200cb6f94659668456997ff4f7a9", + "name": "interegular", + "version": "0.3.3" + }, + { + "direct_url": null, + "metadata_sha256": "d10f300731197a4829b77f0c883bb3cf8a37ae8c76a302e095fa95d6427706d0", + "name": "jiter", + "version": "0.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "5b0c8d4b4c535a2432fb206223d774509b6e20af374c6a4b6f98bf72a7de6702", + "name": "jmespath", + "version": "1.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "6c4032c2e74273452cd77399af2ee85198f49c22da897983f26d2ed6f787c4e8", + "name": "jsonschema", + "version": "4.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "aaa6cd66f423729e8da397c9d533b7d731f6b25f3d6371b9338c36bdb9be74a0", + "name": "jsonschema-specifications", + "version": "2025.9.1" + }, + { + "direct_url": null, + "metadata_sha256": "f7c0687c032593106a2e5a3c241cf8043e7e2c222bddb0022b4cb2bf5de67115", + "name": "lark", + "version": "1.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "4511c6b04efc57a5f5333edc1f5f48b9f5412c3923d4bc19b715bdf47977511c", + "name": "linkify-it-py", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "be929870f6ecae18a819c56118f1101f3076e25ac6a4843ca6f4707ebd1e87c6", + "name": "llguidance", + "version": "1.7.6" + }, + { + "direct_url": null, + "metadata_sha256": "cf2b87669bead3e76ec54207f3354c13f73b50c32fcd13c8d627084b3379139e", + "name": "llvmlite", + "version": "0.47.0" + }, + { + "direct_url": null, + "metadata_sha256": "0a416d79c5543d94d2b18807626293d4f47655d1d22724c7ae296e413078aaba", + "name": "lm-format-enforcer", + "version": "0.11.3" + }, + { + "direct_url": null, + "metadata_sha256": "16bc1f59e34fd2a6633bd395276052eacd2c777b2cf72781e76b203f013a8fac", + "name": "loguru", + "version": "0.7.3" + }, + { + "direct_url": null, + "metadata_sha256": "5216d5acfd039a7b581a826186309594b228d37d2c8d56864124ea666689fe4e", + "name": "lxml", + "version": "6.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "f59d772b35315a928672bfcccfb89d82c0aac672c5275c048f7a93b79015bcea", + "name": "markdown-it-py", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "b137367ef0056711cbf5e53015df9168cab80373104e7899b1c0263a21d9c99c", + "name": "mcp", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "38e0b9edaae09e58cd1461fc961ced22672038a697930bedef153a74befb3de1", + "name": "mcp-types", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "799f49685865fd9cc8915fdb92a33e102eeeffad562b03b4aeffb6f422b771c1", + "name": "mdit-py-plugins", + "version": "0.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "481f9cbe08596c6eaba6343e0efa1b13b2362c30dce0610f7c08523f1d98388d", + "name": "mdurl", + "version": "0.1.2" + }, + { + "direct_url": "{\"dir_info\": {\"editable\": true}, \"url\": \"file:///Megatron-LM-training\"}", + "metadata_sha256": "2876c0c760bbfc93bd7d737bf0db2866a937308a7c1707c3a2bb59d4795986ff", + "name": "megatron-core", + "version": "0.16.0rc0" + }, + { + "direct_url": null, + "metadata_sha256": "a6e34d488c879f57ce042bec38f8864ba3ea7d6ecf0ab757fc88fe8dc0a22f26", + "name": "memray", + "version": "1.20.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd26d80dc9676b1fb8c894355bd525fbe7f49a6a86a555c72e9ec6d927247c33", + "name": "mergedeep", + "version": "1.3.4" + }, + { + "direct_url": null, + "metadata_sha256": "dd1b3b89e88d1c65a26e6e72dd075eabbc220bfb138769ec8b64578ee911795c", + "name": "mistral_common", + "version": "1.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "4859847a9f6321daf8849cf7fd1542ff430db6563a2abf9ac0d62a5b21bd951d", + "name": "mkdocs", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "1729fc31479f2582486cdc85397417659dd3b2fb3f920553de66cfe59d5f0b3e", + "name": "mkdocs-awesome-nav", + "version": "3.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "88b4b7b7c0aba5547befdedaf515c8df4867361daf55ff60b72578464d72dcbe", + "name": "mkdocs-get-deps", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "ad33bb33fb16b1f69689c4682550e97232154e367e2c8c8aee9dad0f10d269ce", + "name": "mkdocs-git-revision-date-localized-plugin", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "ed69fbfb9ac00c10c5a383a12ff9d2b9919ae184e408554434199211643d6040", + "name": "mkdocs-material", + "version": "9.7.7" + }, + { + "direct_url": null, + "metadata_sha256": "d1c549b61701148b97f8246bc924b2840e504b37b0ce7a27e78ddf81261e5363", + "name": "mkdocs-material-extensions", + "version": "1.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "4ad6171f3bf6812e4de90670ff0089d445093d4fe1d05d55f17b96a4a192a816", + "name": "ml_dtypes", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "4ad6171f3bf6812e4de90670ff0089d445093d4fe1d05d55f17b96a4a192a816", + "name": "ml_dtypes", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "b0dbdfa30ab6b1ce637a794899c9e43019182b6d1ab2d07b90f647f7331eba6b", + "name": "model-hosting-container-standards", + "version": "0.1.16" + }, + { + "direct_url": null, + "metadata_sha256": "95424470e481cfa8d18b30963b6de3aafe16614b1ea0414e184a008571dde84f", + "name": "mpmath", + "version": "1.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "eb184d83489401903615ce8a78d98d5b933dec0f7246811d396a529915fe797c", + "name": "msgpack", + "version": "1.2.3" + }, + { + "direct_url": null, + "metadata_sha256": "520006303d6a0e859970b83f7d452196e2e8f6dab08f6dcf1ba5823c1230025f", + "name": "msgspec", + "version": "0.22.0" + }, + { + "direct_url": null, + "metadata_sha256": "010d2fe039006070a711a476b171b7b7da5c29ccad3c4eecd77ef3711b07c2d0", + "name": "multidict", + "version": "6.9.1" + }, + { + "direct_url": null, + "metadata_sha256": "235634cc7ebda45f8a84dfdb1b9b35ac1a77a1888b34650c3a616d23e4a7e93f", + "name": "multiprocess", + "version": "0.70.19" + }, + { + "direct_url": null, + "metadata_sha256": "7c545b4b3e5e83d3fde41352272c10cb9deeaba5b7138fbf24383e952af8822e", + "name": "natsort", + "version": "8.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "311ee8cdaeaf9f11acf51cda9c3b5b191f76ce9d98bc3418164c3189bbc37a08", + "name": "nccl4py", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "66360539217852c3b44b37f409eade7e1559baf018bb363bacb2aa3a9759b203", + "name": "networkx", + "version": "3.7" + }, + { + "direct_url": null, + "metadata_sha256": "e8b0b1746808b87816c47e4531780ded7f246bed9575a89e8b40200aa81e9a13", + "name": "ninja", + "version": "1.13.2" + }, + { + "direct_url": null, + "metadata_sha256": "77c1117f0dbc41560ddc6e6b37b542fb4e88afcd4ef82ec06593e5bbd5f37121", + "name": "nodeenv", + "version": "1.11.0" + }, + { + "direct_url": null, + "metadata_sha256": "9af629898406c9eaa69897fe09220dc483270cdba89f6b20bf0165cdf0e1668e", + "name": "numba", + "version": "0.65.0" + }, + { + "direct_url": null, + "metadata_sha256": "0c7281a81cf76e40b27c1385ffd8a215d7227adc219f177ce807ead9e91994a5", + "name": "numpy", + "version": "2.3.5" + }, + { + "direct_url": null, + "metadata_sha256": "0c7281a81cf76e40b27c1385ffd8a215d7227adc219f177ce807ead9e91994a5", + "name": "numpy", + "version": "2.3.5" + }, + { + "direct_url": null, + "metadata_sha256": "bab990ced4537ce74ef5961ca933c4c6fd604fd09a5827a4a428c55bcb0be35b", + "name": "nvdlfw_inspect", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "10f6595146332d35f7f15a000e08b5c81432528c5d026470c1d03f0c1399fb70", + "name": "nvidia-cublas", + "version": "13.1.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "58e933b4ac8e49f098b16ab7480d03bd792afc3d1db10d0aacbdcc2c62e48fa3", + "name": "nvidia-cuda-cccl", + "version": "13.3.4.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "baac937970681d41aa0c3708b3d55d73f8d29e70aceaac0e71fe6d1548e94a09", + "name": "nvidia-cuda-crt", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "8d51e5c76ef5707b0b80d5ec9a791c0f11a480ab721820cf100a3cc566017eef", + "name": "nvidia-cuda-cupti", + "version": "13.0.85" + }, + { + "direct_url": null, + "metadata_sha256": "724bf56e61ddef5d4c2482ff64103a973b911b110b668acaea5373f6c83c1c5c", + "name": "nvidia-cuda-nvcc", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "c54801dbd815d534519a761f1f328325aa0f1d1f1659aa969fa74e7a2c76eee9", + "name": "nvidia-cuda-nvdisasm", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "af51f248363020b9fdfd2743704e901bf3d19a1a1ce1fe44fb98ba148bfc0157", + "name": "nvidia-cuda-nvrtc", + "version": "13.0.88" + }, + { + "direct_url": null, + "metadata_sha256": "055f7fc69a5a2159de82cd0718da02c8852e81c8a71ebb117b8e799badd7167e", + "name": "nvidia-cuda-runtime", + "version": "13.0.96" + }, + { + "direct_url": null, + "metadata_sha256": "df18686dbdb3074ca375a1d6c623a04102fd348950c67a721397349c6d4f0477", + "name": "nvidia-cudnn-cu13", + "version": "9.20.0.48" + }, + { + "direct_url": null, + "metadata_sha256": "abd0ca3f67af19a4d383ff2a012ae0090d4731c6492fd47236615308a50b3981", + "name": "nvidia-cudnn-frontend", + "version": "1.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "4a78545d424d0c5038353f7046a8ae40ceaf312045d71399eac9511f5fc15434", + "name": "nvidia-cufft", + "version": "12.0.0.61" + }, + { + "direct_url": null, + "metadata_sha256": "e49b909195c03ddbe203729d9b31dd88e3f207368333d1909c67c6b130a0c696", + "name": "nvidia-cufile", + "version": "1.15.1.6" + }, + { + "direct_url": null, + "metadata_sha256": "bb15a754c6be32c23aaac13c1cfa7a8ce53d92bc26652ec3b609f7a5cce3e7d1", + "name": "nvidia-curand", + "version": "10.4.0.35" + }, + { + "direct_url": null, + "metadata_sha256": "0dd58f677811eac04901a793740932e5a2a8fff2f5453aa6351614eb18391bb6", + "name": "nvidia-cusolver", + "version": "12.0.4.66" + }, + { + "direct_url": null, + "metadata_sha256": "8aeb284782ef6883095a5d1c110e221cad023a99afcfd5cdb4969a25e146d562", + "name": "nvidia-cusparse", + "version": "12.6.3.3" + }, + { + "direct_url": null, + "metadata_sha256": "09555246122896eaca3b8313eecfca4b339fefd3b597874cb9fe3bf29dab38c9", + "name": "nvidia-cusparselt-cu13", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "ac77bac79fbfb0c52ac6e2e5abc936b1e127be2192f0cbc27b00be3125fa86ae", + "name": "nvidia-cutlass-dsl", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "1ec968ec7c4083f7fe4e1fb8384c7e9b853a81491fef9f4cb1cf755961aaedf6", + "name": "nvidia-cutlass-dsl-libs-base", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "cc6f3846cd820013eaa6e2665c493d70c607be6ce7349b939eb4742888470585", + "name": "nvidia-cutlass-dsl-libs-core", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "2357d0df2d0d17c0b16663b8a89df53f751b19721f66821fd88fa78112c08e55", + "name": "nvidia-cutlass-dsl-libs-cu12", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "244590c25662dcf777b1daae97a858afe1a1aec62e5e6678b217007a459ab552", + "name": "nvidia-cutlass-dsl-libs-cu13", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "c3a25ada01f57418c1b897406c3abab18834e6adc573ab7b060620c453afb6db", + "name": "nvidia-ml-py", + "version": "13.615.71" + }, + { + "direct_url": null, + "metadata_sha256": "56baad4e7f699902b03b17580933f7bd50b6ea97b7df9d7e807750973da7529c", + "name": "nvidia-nccl-cu13", + "version": "2.29.7" + }, + { + "direct_url": null, + "metadata_sha256": "98810ef0ab8badc369e6a46a038f8ee9f412c0c753fb5ad580544f23a0aa7962", + "name": "nvidia-nvjitlink", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "b0f54ee21909d19640a58e05da755c91763eb5725f544fd0d4b84b2f5f94deba", + "name": "nvidia-nvshmem-cu13", + "version": "3.4.5" + }, + { + "direct_url": null, + "metadata_sha256": "06dc1a593c7e8b8c3f29184228c83f8f7ef57787ad91f3e5bcae1d238dd3092a", + "name": "nvidia-nvtx", + "version": "13.0.85" + }, + { + "direct_url": null, + "metadata_sha256": "32ee63450a437b6a6ed227ff6549144aa596197a322993521ec7af826ebd413e", + "name": "nvidia-nvvm", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "32c2efdcd2c673b3b7f35ca9c2cccefaad36f1f0a920648a13cad85f6a5767b2", + "name": "nvtx", + "version": "0.2.15" + }, + { + "direct_url": null, + "metadata_sha256": "3419d80e114a2c19fa9bd3582939a3942f19673055707ba6ca2ca489d58b41e0", + "name": "omegaconf", + "version": "2.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "28971076ce9c279d4b889496b046d55a1e05b02fb9851ceb717e9a10df799572", + "name": "onnx", + "version": "1.23.1" + }, + { + "direct_url": null, + "metadata_sha256": "1246f5a4d8295907a42e809ed9173ede2510ec9d260d2168989d126564897fa5", + "name": "onnx-ir", + "version": "1.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "e14643636835759700dff286f949c5ec34e7eac7ac47f44096414f0e0f1c3101", + "name": "onnxscript", + "version": "0.7.2" + }, + { + "direct_url": null, + "metadata_sha256": "00f847e99939207bd70dfd806428f6b20a3d01074b59325e4c76149a2e19be26", + "name": "openai", + "version": "3.22.1" + }, + { + "direct_url": null, + "metadata_sha256": "598d3ad5a22a14a7c4f1d218b43e345f32b0ba094b753467bae8a3f708fd48cb", + "name": "openai-agents", + "version": "0.22.3" + }, + { + "direct_url": null, + "metadata_sha256": "5a0afcb1ce845e05da12beb1767f5d2749bbc9e9050718c6b9fa3c225713c9eb", + "name": "openai-harmony", + "version": "0.0.8" + }, + { + "direct_url": null, + "metadata_sha256": "e86a6b6fcbbe152805f782c57df321002892e163019574877e9829272e25eb4e", + "name": "opencensus", + "version": "0.11.4" + }, + { + "direct_url": null, + "metadata_sha256": "53d669c8bd3d32d3275153b454e515ca5cc6dec92fae3a98309b5a2b19fe6d2d", + "name": "opencensus-context", + "version": "0.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "19778b6d66b0e45bf73e11fa37a208949d5b393aef914627394d5601455546a6", + "name": "opencv-python-headless", + "version": "5.0.0.93" + }, + { + "direct_url": null, + "metadata_sha256": "19778b6d66b0e45bf73e11fa37a208949d5b393aef914627394d5601455546a6", + "name": "opencv-python-headless", + "version": "5.0.0.93" + }, + { + "direct_url": null, + "metadata_sha256": "a3f5434fa7c80f7f7abc82173da639c8e9c59d30b4027182645562bd3d2f4f97", + "name": "opentelemetry-api", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "8611977ea596e4827874582e86250618444e1c718229dddfc16e5ea437ce5fcb", + "name": "opentelemetry-exporter-http-transport", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "2cfd41e5ca33292d987ba71fa6186d11e16ed66888f3a26f8a3a99060c4b5e90", + "name": "opentelemetry-exporter-otlp", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "3bb4494220732d4bf10e1dba231ea7638cedaa5362e1f23a50d34a14f520fea8", + "name": "opentelemetry-exporter-otlp-common", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "27fb1c8aa5c2cd07776f9f3281fc618cd3feb96017757c33d2b3586fb7fec88b", + "name": "opentelemetry-exporter-otlp-proto-common", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "5cba6098cdd0bfb06853a6c704a2451c4f82c9dea376a30b59ecd279296648ad", + "name": "opentelemetry-exporter-otlp-proto-grpc", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "6f53ef1c172ebf87af69b9ef390aa908506d0cd14bc7811985fdd937a4058808", + "name": "opentelemetry-exporter-otlp-proto-http", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "1910f4e7ebd497e98b6d231e10275288fda2cd1885117575706c62f45e065889", + "name": "opentelemetry-exporter-prometheus", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "fab18b721e30be41448be252e1dca43b48e7f15d971e0bb552492c0ef4b07bee", + "name": "opentelemetry-proto", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "3644a79f55762a646799ff52b9d837e01c8192b7b28f735a383f55c90edb9bc2", + "name": "opentelemetry-sdk", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "add3db481f7f401f65cfbddb058fde3bb4c9dd7b61064a84f8598ad7efe0b11c", + "name": "opentelemetry-semantic-conventions", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "0dfff30e912520a226bcf7a547393484cfcd8c738439c7b48418f61c95109480", + "name": "opentelemetry-semantic-conventions-ai", + "version": "0.5.1" + }, + { + "direct_url": null, + "metadata_sha256": "210ce26bad0a245a72831b4fa029708c245d4d670a88c8d5a69b1446c24a95e4", + "name": "orjson", + "version": "3.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "35ff73511848f5f934ccc39d538014716ec4579e76d54e0e407ff51794a7939c", + "name": "outlines_core", + "version": "0.2.14" + }, + { + "direct_url": null, + "metadata_sha256": "8ee2f7138ade46b6e348a6d099612f5bd6caff13511f3b4144327f37ce50eacf", + "name": "packaging", + "version": "26.3" + }, + { + "direct_url": null, + "metadata_sha256": "a4ab87bf8083001f25ccdc46095f05b678b3569dd58edc2cf941e3e7f64d7c88", + "name": "paginate", + "version": "0.5.7" + }, + { + "direct_url": null, + "metadata_sha256": "1de96a6c28c2e5613c9c87cd4ad9484791001cf58df43cf2ba74d5c4f85f0ad2", + "name": "pandas", + "version": "3.0.6" + }, + { + "direct_url": null, + "metadata_sha256": "d05b8d05da9f78176b2eefaacdfaa5e96708ec4f488daea8bbc52e3ed1bc3954", + "name": "partial-json-parser", + "version": "0.2.1.1.post7" + }, + { + "direct_url": null, + "metadata_sha256": "c1d126edceac2685e29403a8ae3a27c47143dce1f0252fa3931771562f1e2b4f", + "name": "pathspec", + "version": "1.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "30325dc8ce17bc64f9dbc0a449232fd35841a019df22a6f481007c9c5a28c1cb", + "name": "pillow", + "version": "12.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "cbc0b7b6e63b50dcb7c17cf3526a9304f285d9a31353adf3b22acc2059ab23f5", + "name": "pip", + "version": "25.0.1" + }, + { + "direct_url": "{\"dir_info\": {}, \"url\": \"file:///work\"}", + "metadata_sha256": "6ba03b5bc457a2a3d92468729501b5892a0d38ebcc36766c58859449498c5743", + "name": "pip", + "version": "26.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "0421937c4410b61c5325233d5b7671ae933bae8de174f87586ac55aa804851ea", + "name": "platformdirs", + "version": "4.12.2" + }, + { + "direct_url": null, + "metadata_sha256": "2bcffab42626e1fb50d6329765619312d30fe7f4880e98dcee99c92ebd283bb4", + "name": "pluggy", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "7e7562ba7c032f8edd02641ae71b1ac2d8f388103a68d777a7e907d19e75bc17", + "name": "pre_commit", + "version": "4.6.2" + }, + { + "direct_url": null, + "metadata_sha256": "bbe0a7662602ddd23f929fe0ee98e9d04406e138aeee18ce4861af186ea6060d", + "name": "prometheus-fastapi-instrumentator", + "version": "8.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "ece4a61f3ffb92a083fd5e47e180e3e070342e60a3bd93876a879e79a643e821", + "name": "prometheus_client", + "version": "0.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "5feba21a58eaa126e7e7739e57e2572e5bb251fcbf56e439e508acc47d769314", + "name": "propcache", + "version": "0.5.4" + }, + { + "direct_url": null, + "metadata_sha256": "3f136dbf7239c987a7685acd33440cc5efd6c4107b4b11c425201b4de70ae36f", + "name": "proto-plus", + "version": "1.29.0" + }, + { + "direct_url": null, + "metadata_sha256": "118b5ad013120a7a6e24714595ad776bf264d7b0060389133310d18ea1480902", + "name": "protobuf", + "version": "7.36.2" + }, + { + "direct_url": null, + "metadata_sha256": "0849f5a519bf9bc23ef204443fdd8d6d10678863acac7ca9340fc11bfba5a856", + "name": "protobuf-py", + "version": "0.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "eab5f2f4fd98f67a710a8fb1975b64ffa880a4f977566f022c567e08e324ccd6", + "name": "protobuf-py-ext", + "version": "0.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "39009938840de3a8b2a37eb4668d2601aae8c74e4b74743f73e59996b5b7e6e1", + "name": "psutil", + "version": "7.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "df44b58e8a4cfe57f65773ec47f7bdf2a14c8f5f73a7abf331a6b6237d6d691a", + "name": "py-cpuinfo", + "version": "9.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "2fd4a9efc5e5c74ae4c2fcf1970193c524c62ab22af8d5e66ebf7df9e6e46e83", + "name": "py-spy", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "d2ccdeb15cddedc81637a83e40baa6397fe269023b738d0fc3cb2d90722e290b", + "name": "pyarrow", + "version": "25.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "47b9f28e971a56f5adf949e0bcf105b0bf6587946566ecf197a2819d8848cc01", + "name": "pyasn1", + "version": "0.6.4" + }, + { + "direct_url": null, + "metadata_sha256": "82ce4c01c6d36841b9801fcdabab9bfe61d0b5e4e440c275941d8a2d4a790730", + "name": "pyasn1_modules", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "45cb345e4c12f63bc843b8c88902cc44c4d624a55aaef8cd5ffbc0ad16356fbe", + "name": "pybase64", + "version": "1.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "d311ae661edeac8ff029ab2960d065a7e792ebf8f79af682daa53109fe81318b", + "name": "pybind11", + "version": "3.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "cce9c0d440d065d4cdfb0d00004b8ddd65cf363a740efc5b0920b29201a59cd9", + "name": "pycountry", + "version": "26.2.16" + }, + { + "direct_url": null, + "metadata_sha256": "a1e33542883c249bf6c263b0023b9ea8a6131a77d9cb2cbc88316968e5eada83", + "name": "pycparser", + "version": "3.0" + }, + { + "direct_url": null, + "metadata_sha256": "faffcc4d7d359cb1047a9f67f7c65096b838c6db6c62852ef20fb27d55649a95", + "name": "pycryptodomex", + "version": "3.23.0" + }, + { + "direct_url": null, + "metadata_sha256": "98929f4cb80451dc3c6c8cd541a3081dccf0dee94afe7d9fa5c214a18ff236ce", + "name": "pydantic", + "version": "2.13.5" + }, + { + "direct_url": null, + "metadata_sha256": "8eccadbe707db97c397fb79073fe791b7998ef3a85f04f817f8991f7697b190b", + "name": "pydantic-extra-types", + "version": "2.11.1" + }, + { + "direct_url": null, + "metadata_sha256": "8f00c91deb34399316a5386eb2e76fe09f14a08dc3045f2e7dce9bf8573796bd", + "name": "pydantic-settings", + "version": "2.15.0" + }, + { + "direct_url": null, + "metadata_sha256": "66c729edddc20bf2764bb18bd87d907b08690e50355f39b97acc737b26d1d164", + "name": "pydantic_core", + "version": "2.46.5" + }, + { + "direct_url": null, + "metadata_sha256": "394500d78a0c1a433ae8ca3693152c08f6a901121d4b069cf1540a19759e2950", + "name": "pylatexenc", + "version": "2.11" + }, + { + "direct_url": null, + "metadata_sha256": "df2e9e9847a2aea0ae6e20fd325aeb16cf3ce7f8913462db6c2398363cd0c0bf", + "name": "pymdown-extensions", + "version": "12.1" + }, + { + "direct_url": null, + "metadata_sha256": "82fcfe724db9f0b51348da89f4f5cdc0b08d08882b1bbc0ca4913d3a0a93bcb9", + "name": "pynvvideocodec", + "version": "2.0.4" + }, + { + "direct_url": null, + "metadata_sha256": "3722422cc1478b175879143dfb78f98b7a5f53f4f684d71b7054fe2e8acd3b89", + "name": "pyqwest", + "version": "0.10.0" + }, + { + "direct_url": null, + "metadata_sha256": "7d1d1c276b7c372d55d17ac7d30f0a4b80a746e147347b8510d1355eea7f80c8", + "name": "pytest", + "version": "9.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "89e7c1c932e52b74bdcaf504389d2d1a2d7ca559b02bf5a09fc80ebd58ad10f7", + "name": "python-dateutil", + "version": "2.9.0.post0" + }, + { + "direct_url": null, + "metadata_sha256": "54f30f811841b6d772f31715712c85bfe0041839cb071f78daf41c700a98642b", + "name": "python-discovery", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "54f30f811841b6d772f31715712c85bfe0041839cb071f78daf41c700a98642b", + "name": "python-discovery", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "0cc19efd76cfbf3bcb2cb0d3ab82191036855859455aa3812c5e9e591e3f34e8", + "name": "python-dotenv", + "version": "1.2.3" + }, + { + "direct_url": null, + "metadata_sha256": "1d866c6124631b9ce1797ad412fff298ab53fc2d95210281d7c8f20e920753fa", + "name": "python-json-logger", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "2d18a1e7286d92a656ead5ec6f83d5ae6dc858634624f6b264703ae88d24d718", + "name": "python-multipart", + "version": "0.0.32" + }, + { + "direct_url": null, + "metadata_sha256": "beaa0efe9ba4b34843f5a0fc7379a73f10e95adb8cc0c31f359ab6f3a42b4def", + "name": "pyyaml_env_tag", + "version": "1.1" + }, + { + "direct_url": null, + "metadata_sha256": "238dc769e22d4f5626750cdff36e920e4a8d69c10d88de6d79b40a59cc13d873", + "name": "pyzmq", + "version": "27.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "de0a5e855bb5bb78b7acdcd2ca60619c6a0c109814881589caf158ec07155662", + "name": "quack-kernels", + "version": "0.6.5" + }, + { + "direct_url": null, + "metadata_sha256": "961ffef199b876fb4d7b10903d78e79f359d703b1638834c61d70b9879932918", + "name": "qwen-vl-utils", + "version": "0.0.14" + }, + { + "direct_url": null, + "metadata_sha256": "faf6ab9027d12de992827a2d8a224996fe6747a8c5f7d31ae495983dc73eefe9", + "name": "ray", + "version": "2.54.0" + }, + { + "direct_url": null, + "metadata_sha256": "c50d8b3ff4d113925b60dc47d1d28e87248a3338024241b0a3a66c8794fbce0c", + "name": "referencing", + "version": "0.37.0" + }, + { + "direct_url": null, + "metadata_sha256": "02acdc52d6f21d5f4b172254daaa94edfaa44c9ebe14d1c00cc4c8fe99b0e1df", + "name": "regex", + "version": "2026.9.29" + }, + { + "direct_url": null, + "metadata_sha256": "ac08207697217d1ffde8a161b424d77d6e2af6b62630fa26d75d08f11076cdca", + "name": "requests", + "version": "2.34.2" + }, + { + "direct_url": null, + "metadata_sha256": "f1abd635c3dff607a4fd654c62a88d9d4c21843cfc9176116c156f4269ca21b5", + "name": "rich", + "version": "15.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "932ff7743a756d0efcc45528d64c275ac3cb40a8dd1787ea10cb303907f0ae4f", + "name": "rich-toolkit", + "version": "0.20.5" + }, + { + "direct_url": null, + "metadata_sha256": "294a1405c0fa34b5f735bcb46459050436849a1e584c643544de99c07c529fb7", + "name": "rignore", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "5e54dd00b4ad336c5161d47de2a5c2212090c44629c28b6538b156256e49282d", + "name": "rpds-py", + "version": "2026.6.3" + }, + { + "direct_url": null, + "metadata_sha256": "0d5895abd80bfc0027c02943abaea4547061b9004bd134950d640d619a697835", + "name": "safetensors", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "91d5de3f641f33a8fbb4b6e91772da68d50b68686971d7b66af2068f2e77b694", + "name": "scipy", + "version": "1.17.1" + }, + { + "direct_url": null, + "metadata_sha256": "297fb30f701a800489c12893a951da3e5bd1f80061a1f43f0d3e9f1d4c6bc6fd", + "name": "sentencepiece", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "4245e0388ddf2048a38ae2a24a3d2c583408b2454aadc680d3c3beede639db3f", + "name": "sentry-sdk", + "version": "2.71.0" + }, + { + "direct_url": null, + "metadata_sha256": "ae8a9e6feec1a76e954d65ea48ac57842c9a7bfb5ac6e5ea82400a5ba9f71a98", + "name": "setproctitle", + "version": "1.3.7" + }, + { + "direct_url": null, + "metadata_sha256": "341d00772017437d0f6e3c943ae353f243c39fedfba403aea47cced927a76516", + "name": "setuptools", + "version": "79.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "ff4bcfb192bd542ed8f1794fb32ffc9eabd932d6e03cb00a4ad5e35a2469af88", + "name": "setuptools", + "version": "80.10.2" + }, + { + "direct_url": null, + "metadata_sha256": "f1e5a532fb8cda0bbc370e3db6cb9cea72a065d12ddd6a14976ba3cf66264221", + "name": "shellingham", + "version": "1.5.4" + }, + { + "direct_url": null, + "metadata_sha256": "2aba2cfd9c2ad7625a5d374d141af317d8f92d3534997bf98d127e52848dfc81", + "name": "six", + "version": "1.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "69ae2dfe547624be97fae348e1cfa3793f8854eed32cc1603badedc7d48fb36e", + "name": "smart_open", + "version": "8.0.2" + }, + { + "direct_url": null, + "metadata_sha256": "d415e6c6de7dee117d254a342668c489931bc88eac7ec8678b452078e366da6e", + "name": "smmap", + "version": "5.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "093bc4f0740a6fc28692e616aa8fe68d7e1d76426cc5a5faf9ea722a8ee7aaae", + "name": "sniffio", + "version": "1.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "b3cef071eb1dbeaa76a1273fe2ca2cc8ef36e835165253952d93780962529ac1", + "name": "sse-starlette", + "version": "3.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "3c01ca830e213f0311fe37bc3b46b8ab230a5e7acb894bf0fc8785cb7ccfed48", + "name": "starlette", + "version": "1.7.0" + }, + { + "direct_url": null, + "metadata_sha256": "6017ca508a293cf47a88a78cb330e9cbd131d74ec3c7fbf89bd4300ed3129d30", + "name": "supervisor", + "version": "4.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "fd5eb4925b04f9bffbc6c4f92bf8aea7243b918b43cd359493fce48a7dd3b336", + "name": "sympy", + "version": "1.14.0" + }, + { + "direct_url": null, + "metadata_sha256": "f09f0e24282c5a86346bcd5b10ae5ff81869fa8ef69c3ba524bd0a817a87dda9", + "name": "tabulate", + "version": "0.10.0" + }, + { + "direct_url": null, + "metadata_sha256": "519fa19c146fd58a0a75ecf1461e4bd98f9c06d01800c37d4a80f5fef095f4e1", + "name": "tensorboard", + "version": "2.21.0" + }, + { + "direct_url": null, + "metadata_sha256": "1af7ad76e4073b01ab147eb3c1d8e38b95d38062c6c9bc63890150738642e8eb", + "name": "tensorboard-data-server", + "version": "0.7.2" + }, + { + "direct_url": null, + "metadata_sha256": "9e597f62fc07e3b931d5c8fb0e90706fb6d45465cfb5d01dbd27ba7fc135c02c", + "name": "tensorstore", + "version": "0.1.80" + }, + { + "direct_url": null, + "metadata_sha256": "0da993d16ef6326f471796fcb065622f309c5c1aae6c6295b488ea64bb5c880c", + "name": "textual", + "version": "8.2.8" + }, + { + "direct_url": null, + "metadata_sha256": "52ca6148d4fd1497254855fa610cfdde99191cd42bce7a452fd3a68855504ac0", + "name": "tiktoken", + "version": "0.14.0" + }, + { + "direct_url": null, + "metadata_sha256": "0df9eb495cfb477dcbdfbdcd8c04d952d3eb00d77831630760571e13545398e5", + "name": "tilelang", + "version": "0.1.12" + }, + { + "direct_url": null, + "metadata_sha256": "802b576e011dc61bd2681593e8d802714b6c4ce636a9cf87035026db32ce6262", + "name": "tokenizers", + "version": "0.23.2" + }, + { + "direct_url": null, + "metadata_sha256": "4e1631b2164a49ff9a848d86ce504fdcc15e3540dbb262df8f33a2681a8de513", + "name": "tokenspeed-mla", + "version": "0.1.8" + }, + { + "direct_url": null, + "metadata_sha256": "05086095a775c5dca70998dcf442a848c13f9c68b54a54c510c3542c5abb6563", + "name": "tokenspeed-triton", + "version": "3.8.10.post20260920" + }, + { + "direct_url": null, + "metadata_sha256": "71daba472d0c5ffc25c0231dc29688ab0cb13d5bc7e7d93f6c4cce4169c50048", + "name": "torch", + "version": "2.13.0" + }, + { + "direct_url": null, + "metadata_sha256": "cccd2f1c0e5866e63732f58798c8d642ee6d10cd560d6f691e7981b908c246c9", + "name": "torch_c_dlpack_ext", + "version": "0.1.5" + }, + { + "direct_url": "{\"dir_info\": {}, \"url\": \"file:///torch_memory_saver\"}", + "metadata_sha256": "6276cef17dedbb5ee0d6157bbf63b832e916026281328d995ad3d488c2539618", + "name": "torch_memory_saver", + "version": "0.0.9.post1+slime" + }, + { + "direct_url": null, + "metadata_sha256": "29809ca2c86dda5079654f1f70564a64435e9d08f1964a2412b6f514e1b5ff64", + "name": "torchaudio", + "version": "2.11.0" + }, + { + "direct_url": null, + "metadata_sha256": "7e9be0f3a290e3fd9370d8fe010c7ffd006d5d3d05ab8bdf7df8f92f0fca9c39", + "name": "torchcodec", + "version": "0.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "181fa5e6b399c378711eddcdacd756d3c51317916f8eb160ee36cae7fae9589f", + "name": "torchvision", + "version": "0.28.0" + }, + { + "direct_url": null, + "metadata_sha256": "43d1261aff90cf3d5b1b40cf1f94234d61409b14e59f3766f457c1eec7f7ac15", + "name": "tqdm", + "version": "4.70.1" + }, + { + "direct_url": "{\"archive_info\": {\"hash\": \"sha256=3e1d9f534781c8e608240da0b495b8246317a36382f7609017cbaa7fb1d53f7b\", \"hashes\": {\"sha256\": \"3e1d9f534781c8e608240da0b495b8246317a36382f7609017cbaa7fb1d53f7b\"}}, \"url\": \"file:///wheels/transformer_engine-2.16.1%2Bc9877beb-cp312-cp312-linux_x86_64.whl\"}", + "metadata_sha256": "d882f743161d9d9f35dee4e1a8cc9136fa495f7c660caace01ab8f5602d76aa7", + "name": "transformer_engine", + "version": "2.16.1+c9877beb" + }, + { + "direct_url": null, + "metadata_sha256": "465797a59706d83b45c93fde750b228c3b6e1addc44115de2c4c02ad66d9c5ea", + "name": "transformers", + "version": "5.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "a91982ca086667c592a951973434f7c5a9f27a8300bc97af78dfb496afe53e71", + "name": "triton", + "version": "3.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "d26fbb244532c4051e715f9047cd943e2cc4abb0ac6f2a517fa2986eb1ea726a", + "name": "truststore", + "version": "0.10.4" + }, + { + "direct_url": null, + "metadata_sha256": "c84af1a069084b1b440b3594068dec29200d52d4c1a9b652030448717f270158", + "name": "typer", + "version": "0.27.2" + }, + { + "direct_url": null, + "metadata_sha256": "0ad6653b7439f4bb6a596cb7b01ed1b716458467525c4dc40b75d62bdb943c98", + "name": "typing-inspection", + "version": "0.4.4" + }, + { + "direct_url": null, + "metadata_sha256": "d005280aa13b334ac942d20219102865e559f69ffd06c35c248b2f0d0da3b933", + "name": "typing_extensions", + "version": "4.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "fba2930e9030a18965d243f8d330748db2e67572a81b3b68710462fb5110332a", + "name": "urllib3", + "version": "2.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "bc5717bd6524a33838f285261868bcc8e311e8c29fdb19e41d56c38b04890e84", + "name": "uvicorn", + "version": "0.54.0" + }, + { + "direct_url": null, + "metadata_sha256": "741c006d8441f562aa853a5430df236fbb4af923445491f396bf09943bd30258", + "name": "uvloop", + "version": "0.22.1" + }, + { + "direct_url": "{\"dir_info\": {\"editable\": true}, \"url\": \"file:///vime\"}", + "metadata_sha256": "f85aa01dfdc868756a6583434bbff040f29eb511d47d5b25ada063a84353aac6", + "name": "vime", + "version": "0.3.2" + }, + { + "direct_url": null, + "metadata_sha256": "c25431aaf1950971fe96292f395a41a55b403127bfca0d0b8f7dc9cff5dab75d", + "name": "virtualenv", + "version": "21.14.1" + }, + { + "direct_url": null, + "metadata_sha256": "4e3ee0a31d85e56268640aae853bcee4794dfe8c0483c5c6370517e480c81ae0", + "name": "virtualenv", + "version": "21.14.5" + }, + { + "direct_url": null, + "metadata_sha256": "d4ed5c7551cddb8c1aeff2f9f27b3491f6ad2c9afda8e7bb9779c33fa12a536c", + "name": "vllm", + "version": "0.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "84b482e09bac949e992594757214a1920c667a5d898ee320e309250697f6d26e", + "name": "vllm-router", + "version": "0.1.15" + }, + { + "direct_url": null, + "metadata_sha256": "9b16c871eb1060a5218e9b9a9ad33288d94844cfaf43f08dbb6c32423bde8fe3", + "name": "wandb", + "version": "0.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "8e4f2be437dfe4eb3c6c959e517ac20b75d06525563f1ebcbf06f9ec648bd7c1", + "name": "watchdog", + "version": "6.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "15218afb42938907c2ca74c54e3d8e3a5406493c4761e29e38e82bfec0f84296", + "name": "watchfiles", + "version": "1.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "8863af96e88b7db9990da99aa6c46816eacc3d2f9ae1297b53381b033cd70119", + "name": "wcmatch", + "version": "11.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "f46e6bd6cfafb2b684c29587b017b7096fd9155b74eda25a22eca784b9803ab7", + "name": "websockets", + "version": "16.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "ce82db5ccfefa4bfbe4e25a36e1f91e8e7d51fcaeb31586c4d48e1c69f99168b", + "name": "websockets", + "version": "17.1" + }, + { + "direct_url": null, + "metadata_sha256": "0f142a2c09eac643c7d0bfe77f3f121184c0b17914afbd32af669ed19b2b02ef", + "name": "wheel", + "version": "0.47.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd58938e51a3c5cb363f6f22eaa2a8a7accc1ce373388de167a82f77d3e5783f", + "name": "wrapt", + "version": "2.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "b0b72c1941f04499ca7e1a3a6e479aee8df902c3d49979624b59dba8c3228d37", + "name": "xgrammar", + "version": "0.2.8" + }, + { + "direct_url": null, + "metadata_sha256": "ef8861f39e5c36255966a36032651f937d890d55f31f1c26304b488f1ba34332", + "name": "xxhash", + "version": "4.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "740c08057b6eb69c58402c87d652af0a471e46325d811f2c605632a18817152f", + "name": "yarl", + "version": "1.25.1" + }, + { + "direct_url": null, + "metadata_sha256": "7b060e4d24394b5431875e2f74fec8e6bffa79d2e6b4cb8c7e2a5187dd2d8d69", + "name": "z3-solver", + "version": "4.15.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "3d76d4fbc95f0851191147db12300938c67a6f8fb1df884886d9601272ccc4e8", + "name": "zipp", + "version": "4.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "d3de2651e4e908dbb7c9d80508e5179590217dfac4993dc8b04381c5b9718c4c", + "name": "zstandard", + "version": "0.25.0" + } + ], + "executable": "", + "installed_provider_sources": { + "vllm/compilation/__init__.py": { + "path": "/vllm/compilation/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/backends.py": { + "path": "/vllm/compilation/backends.py", + "sha256": "fa4bff8920b363efbbde9456f135fa9d2c004a5bde1898877f177418b2d8b008" + }, + "vllm/compilation/base_static_graph.py": { + "path": "/vllm/compilation/base_static_graph.py", + "sha256": "5cfe8e06db84aa42cd41cdd93ebe93af00b3a242c8011042057530e2922b523a" + }, + "vllm/compilation/breakable_cudagraph.py": { + "path": "/vllm/compilation/breakable_cudagraph.py", + "sha256": "3cc427612a08e2b9b3fee47548026400c1d0776e2d4747535e59ef5512bdf1e8" + }, + "vllm/compilation/caching.py": { + "path": "/vllm/compilation/caching.py", + "sha256": "71d212452dde742fbf28b8a01ed29d3c08a7457ff7f8da2a20ce9d17e902c2cf" + }, + "vllm/compilation/codegen.py": { + "path": "/vllm/compilation/codegen.py", + "sha256": "e04833bec88cf9d1a13aa7341e30e3233d1138bfe23424e0fd34d664b3fedb9f" + }, + "vllm/compilation/compiler_interface.py": { + "path": "/vllm/compilation/compiler_interface.py", + "sha256": "8d84e2864bf83f754bae9e9f77119e0287cca9f97f5fa5ec2535e07b5ad88944" + }, + "vllm/compilation/counter.py": { + "path": "/vllm/compilation/counter.py", + "sha256": "d8158c54dd36a357bf24f6f84dc22f572d3a27f4875f3d5779b12bc5d454ff76" + }, + "vllm/compilation/cuda_graph.py": { + "path": "/vllm/compilation/cuda_graph.py", + "sha256": "05c86392d7fae967ac73076dba7e01990a0e3ae619e4866450a0c1be56bd1192" + }, + "vllm/compilation/decorators.py": { + "path": "/vllm/compilation/decorators.py", + "sha256": "cab6962e8a1fead59c75f5ed8cb4732f9e5441ff972030c2f4b1c4ba0c58de3c" + }, + "vllm/compilation/monitor.py": { + "path": "/vllm/compilation/monitor.py", + "sha256": "43b24c5cb1bc4d32dc979f3222596905c7b3acc58415328a234402e6edc76abf" + }, + "vllm/compilation/partition_rules.py": { + "path": "/vllm/compilation/partition_rules.py", + "sha256": "857d2fb06dc871ea1d3717cd01fbd4e5205984100d98b7b72a2933d6ff1cfa4d" + }, + "vllm/compilation/passes/__init__.py": { + "path": "/vllm/compilation/passes/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/fusion/__init__.py": { + "path": "/vllm/compilation/passes/fusion/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/fusion/act_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/act_quant_fusion.py", + "sha256": "1fa9c3ca4fb424685b7053c3dda89dda16c98dc5645d85f0f28dca58429792b3" + }, + "vllm/compilation/passes/fusion/add_rms_fusion.py": { + "path": "/vllm/compilation/passes/fusion/add_rms_fusion.py", + "sha256": "e46998552628aa5cd5962fc39ea39ae824fd97e6aeba1d176e9cc7cade39837b" + }, + "vllm/compilation/passes/fusion/allreduce_rms_fusion.py": { + "path": "/vllm/compilation/passes/fusion/allreduce_rms_fusion.py", + "sha256": "0af193505880cec0f6ffa224c688bce3c9ddc318dccdf04a696b4e4b4506a963" + }, + "vllm/compilation/passes/fusion/attn_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/attn_quant_fusion.py", + "sha256": "ecc64e82be4481954c9cac6c23d7794846ab19486b570f2dda07ab5ad67c5a49" + }, + "vllm/compilation/passes/fusion/collective_fusion.py": { + "path": "/vllm/compilation/passes/fusion/collective_fusion.py", + "sha256": "1e2c8539d6960b45907fb3bf0482441ea7250e97c56ffdea1500514efa0b164d" + }, + "vllm/compilation/passes/fusion/matcher_utils.py": { + "path": "/vllm/compilation/passes/fusion/matcher_utils.py", + "sha256": "50ac5714ce1bb113520de769ea6234316acc470a8cdf2537a996ce9a9d54337d" + }, + "vllm/compilation/passes/fusion/mla_attn_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/mla_attn_quant_fusion.py", + "sha256": "a966fe7f58bf9228379f793f5fd851735a97f9639722766b2a20cb79a9e4baec" + }, + "vllm/compilation/passes/fusion/mla_rope_kvcache_cat_fusion.py": { + "path": "/vllm/compilation/passes/fusion/mla_rope_kvcache_cat_fusion.py", + "sha256": "1602cc28055ffa8d1123ddb1d256bf0bd12006fd06ea7e16a986c55746dbe0dc" + }, + "vllm/compilation/passes/fusion/qk_norm_rope_fusion.py": { + "path": "/vllm/compilation/passes/fusion/qk_norm_rope_fusion.py", + "sha256": "aebc7d1a5189b65ac665afcc169e7baebd53efe719c48e35e7c5babe85af0d39" + }, + "vllm/compilation/passes/fusion/qk_norm_rope_kvcache_fusion.py": { + "path": "/vllm/compilation/passes/fusion/qk_norm_rope_kvcache_fusion.py", + "sha256": "f0cfd0d83ec4acb09f9bf91d199b114e9d4995e3059c13eb23a6978ce7c07eb2" + }, + "vllm/compilation/passes/fusion/rms_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rms_quant_fusion.py", + "sha256": "4852aa44e0e2087043fdac271bda9b8d9bfe3201bb84ce3919b8ed454d8083c4" + }, + "vllm/compilation/passes/fusion/rocm_aiter_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rocm_aiter_fusion.py", + "sha256": "372e76c68c75209a085deec6dd22b3816be633613ca82f6f2925c1b3773d61a0" + }, + "vllm/compilation/passes/fusion/rope_kvcache_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rope_kvcache_fusion.py", + "sha256": "3a756e9049593537143b5a56ab9185a6bc83f57ed81d84226d7791a46a984b53" + }, + "vllm/compilation/passes/fusion/sequence_parallelism.py": { + "path": "/vllm/compilation/passes/fusion/sequence_parallelism.py", + "sha256": "3af7e420dcb35fff0bae0f8f599d0f1bda34445ebe194059892a434b2976d654" + }, + "vllm/compilation/passes/fx_utils.py": { + "path": "/vllm/compilation/passes/fx_utils.py", + "sha256": "730708213acf9d1b5f3176b433dfc197a5f3c81b5ce443f0923c526924833003" + }, + "vllm/compilation/passes/inductor_pass.py": { + "path": "/vllm/compilation/passes/inductor_pass.py", + "sha256": "1f380aacf7adabb8bf8b7d41c0a93473947f0716f7445bd910fd448f6c08e672" + }, + "vllm/compilation/passes/ir/__init__.py": { + "path": "/vllm/compilation/passes/ir/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/ir/clone_elimination.py": { + "path": "/vllm/compilation/passes/ir/clone_elimination.py", + "sha256": "5297078f5cddce081faba5215814275381d2083b32318fcfeb2bf9d69fedb7c7" + }, + "vllm/compilation/passes/ir/inplace_functionalization.py": { + "path": "/vllm/compilation/passes/ir/inplace_functionalization.py", + "sha256": "2dc4f22c6f05224828c2941479185b1452d4490f488b7f0bfd124334e7809fed" + }, + "vllm/compilation/passes/ir/lowering_pass.py": { + "path": "/vllm/compilation/passes/ir/lowering_pass.py", + "sha256": "d9c3d90f63138420f0e5489447b5996573fcfbbab939da2efccd00848492b172" + }, + "vllm/compilation/passes/ir/utils.py": { + "path": "/vllm/compilation/passes/ir/utils.py", + "sha256": "f59d33a6c7d0616cbeec1e9fb1d6c948881bf81fe124caeb906eac2e2197ea21" + }, + "vllm/compilation/passes/pass_manager.py": { + "path": "/vllm/compilation/passes/pass_manager.py", + "sha256": "486979a058aa2e20ebedcbb6e039f7a59f38d2efd2cda11219fae4067be0968d" + }, + "vllm/compilation/passes/utility/__init__.py": { + "path": "/vllm/compilation/passes/utility/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/utility/fix_functionalization.py": { + "path": "/vllm/compilation/passes/utility/fix_functionalization.py", + "sha256": "ad5b504a05ccee023869b0c8df70ec2fff9a4a80d25fd903e2b532f470e7203f" + }, + "vllm/compilation/passes/utility/noop_elimination.py": { + "path": "/vllm/compilation/passes/utility/noop_elimination.py", + "sha256": "8abf85d28c13f95059f2acbc0275b9b9ed2ad4990f7c5763bbe3067a4aa629ce" + }, + "vllm/compilation/passes/utility/post_cleanup.py": { + "path": "/vllm/compilation/passes/utility/post_cleanup.py", + "sha256": "1c38b14fc209165cbcf8ca763a17ac4e528b97f59b573e5d52df2cce7d758de3" + }, + "vllm/compilation/passes/utility/scatter_split_replace.py": { + "path": "/vllm/compilation/passes/utility/scatter_split_replace.py", + "sha256": "138402cc3097768a32e9e5b8d1a054b6176e494bddc8684e23ca2dc5fdc3fdda" + }, + "vllm/compilation/passes/utility/split_coalescing.py": { + "path": "/vllm/compilation/passes/utility/split_coalescing.py", + "sha256": "0b02acd9e1ad43d7b3e128b914e969b9580773f2818078846dfbf163a8bd0871" + }, + "vllm/compilation/passes/vllm_inductor_pass.py": { + "path": "/vllm/compilation/passes/vllm_inductor_pass.py", + "sha256": "4f83ffb67f834a214221d810c7843a8e41eb4e5930eb40adbd8cf054ff6fb9c6" + }, + "vllm/compilation/piecewise_backend.py": { + "path": "/vllm/compilation/piecewise_backend.py", + "sha256": "6525318ff3ca2e4978e24dd9232a7ae0a02e920e19604b83db6f6043d1f8a54d" + }, + "vllm/compilation/wrapper.py": { + "path": "/vllm/compilation/wrapper.py", + "sha256": "c1b1fca679ea16aa07a696831a810c0d531da2bb0ea32dd6f1a95cdaef36de07" + }, + "vllm/config/__init__.py": { + "path": "/vllm/config/__init__.py", + "sha256": "56fb0cb1598d297e4f95a97e5d86dc624145d1532f5faa432b7d2834d7155bd5" + }, + "vllm/config/attention.py": { + "path": "/vllm/config/attention.py", + "sha256": "c41f345b512d9b7df882328257eb3a6381f41088c11ae83b5ecd8a9e8265d1bc" + }, + "vllm/config/cache.py": { + "path": "/vllm/config/cache.py", + "sha256": "f1c226ba679c884930dbfcaf41a57248b137a9a20d3ed8e3d3b31752bb484c07" + }, + "vllm/config/compilation.py": { + "path": "/vllm/config/compilation.py", + "sha256": "c9cec5c7200e8e559810ec8c30113ad61dab6780f9f7fb3c116bd0d9b5a43065" + }, + "vllm/config/device.py": { + "path": "/vllm/config/device.py", + "sha256": "7b82eee02ceb5842337451a27a3d5729920c47e25e8f6bf3997f5146f9330a9c" + }, + "vllm/config/diffusion.py": { + "path": "/vllm/config/diffusion.py", + "sha256": "1fa9fd2478a866098a28a3586b55af2f9738656b7813a55d76539c10dd99fe8d" + }, + "vllm/config/ec_manager_config.py": { + "path": "/vllm/config/ec_manager_config.py", + "sha256": "418b387dbe7bdf67deddce331c205768a2d42aea37141f59fb02a8a1528e3552" + }, + "vllm/config/ec_transfer.py": { + "path": "/vllm/config/ec_transfer.py", + "sha256": "0eabb2c25194676d23c6acf59562672a1dd24415043ac5737d621ce0d681ec70" + }, + "vllm/config/engram.py": { + "path": "/vllm/config/engram.py", + "sha256": "34043a22385a041d4e9be8857f64174c990c2ca8308b97b6a952b5ab96c20ee5" + }, + "vllm/config/fault_tolerance.py": { + "path": "/vllm/config/fault_tolerance.py", + "sha256": "b166b24373d599fb15ddc575e3061cf0dcb42174d0369d8468008e7ffbb2a4e2" + }, + "vllm/config/kernel.py": { + "path": "/vllm/config/kernel.py", + "sha256": "27e23c584cf862f4091858db6dc85bbc2a01f4baf9dca3f232ae6f3bac02390e" + }, + "vllm/config/kv_events.py": { + "path": "/vllm/config/kv_events.py", + "sha256": "b1dbaee3e6830e381e9157fe3bab0d65c357da88ff7cdf8b1e4b3a4e75c82a87" + }, + "vllm/config/kv_transfer.py": { + "path": "/vllm/config/kv_transfer.py", + "sha256": "506fae7a9d7f32cb3646156cf9249a856f6317dff6c4c85db70efd34418c429b" + }, + "vllm/config/load.py": { + "path": "/vllm/config/load.py", + "sha256": "bd6431c22e078362d749a56a2c84145432ebf2605d8bcfa2ac679182d18ed630" + }, + "vllm/config/lora.py": { + "path": "/vllm/config/lora.py", + "sha256": "ed6cf6575f5950f079a62f904caeae93d1a4745dd8c21788b74367883bcd4b08" + }, + "vllm/config/mamba.py": { + "path": "/vllm/config/mamba.py", + "sha256": "2090f791201ca45dd4f1d72b8651268890eb07574b6084721194eb8fdf612c48" + }, + "vllm/config/model.py": { + "path": "/vllm/config/model.py", + "sha256": "f4168b67cc93ce72ff2a6d4c66974223e32fd0f1fab4c05e44bd68a275e18d69" + }, + "vllm/config/model_arch.py": { + "path": "/vllm/config/model_arch.py", + "sha256": "2babe28329d7b60b4e205f6d72c687f0f66e6535aa2f20411469e5ec362f6b5f" + }, + "vllm/config/multimodal.py": { + "path": "/vllm/config/multimodal.py", + "sha256": "271911aee151f17f092228cecee82af0713e9a47340ffdf66834ca7638a50d22" + }, + "vllm/config/observability.py": { + "path": "/vllm/config/observability.py", + "sha256": "d57c59ec776477ab0a20e9f2b945bc954d8ea3737c869259480e9aa10dfb9f6d" + }, + "vllm/config/offload.py": { + "path": "/vllm/config/offload.py", + "sha256": "6f2db3d9a2730588473d5155811690c6241b167a21dcb62fbbd9ebb6386de42c" + }, + "vllm/config/parallel.py": { + "path": "/vllm/config/parallel.py", + "sha256": "f012ace89e3fb730a467f729f602679bc145c49f0d10721811c9d818570e7b2b" + }, + "vllm/config/pooler.py": { + "path": "/vllm/config/pooler.py", + "sha256": "9f01913dcb7bccbf9b672b16643f18471ae202455992e8afaf0725a17f2b3d08" + }, + "vllm/config/profiler.py": { + "path": "/vllm/config/profiler.py", + "sha256": "04d24fa1dc7cfedca6b5c7d9115f7f7021722fc46a5b15234a1e3b3a506c93e5" + }, + "vllm/config/quantization.py": { + "path": "/vllm/config/quantization.py", + "sha256": "acffc52f525b39a88efd656f1ed705ce3a1b758298bb0684fac7694776bc10b4" + }, + "vllm/config/reasoning.py": { + "path": "/vllm/config/reasoning.py", + "sha256": "2c4f7bdee48a9fb3d93787c4c32361c2411417cce452cfde86808d8759977861" + }, + "vllm/config/scheduler.py": { + "path": "/vllm/config/scheduler.py", + "sha256": "822179da62be4bca0619c8590082ae09123f5c4415f9cc2037be673748239edb" + }, + "vllm/config/speculative.py": { + "path": "/vllm/config/speculative.py", + "sha256": "9c642a87264339c0dbc1d0b57330572149df0f9d5e16c6893b9895e50a619e19" + }, + "vllm/config/speech_to_text.py": { + "path": "/vllm/config/speech_to_text.py", + "sha256": "bf4a566fbde6a1cec1e209070b739650c3302c12696739c88049cb8f723a4c3f" + }, + "vllm/config/structured_outputs.py": { + "path": "/vllm/config/structured_outputs.py", + "sha256": "55649776594349b8b4aa3e08fc4c88068366732a486d6fb235079188044aa829" + }, + "vllm/config/utils.py": { + "path": "/vllm/config/utils.py", + "sha256": "d035e9e488ba92b6c47a96cf05d9b2a850d53eda8a05115b22ff9af8dbc2fc64" + }, + "vllm/config/vllm.py": { + "path": "/vllm/config/vllm.py", + "sha256": "956b812e5a719bcbfa3a3958801361b38b9c928c96b8c073311bbb96376dfb7a" + }, + "vllm/config/watermarking.py": { + "path": "/vllm/config/watermarking.py", + "sha256": "30e6620a3cd7529f0736ad55e38bc326a6a78dee4552f0722208400041c94a1f" + }, + "vllm/config/weight_transfer.py": { + "path": "/vllm/config/weight_transfer.py", + "sha256": "92edd9e5ea90c97a8f3c5f20abf1734a105ee1f3f89e306e7ba87e758f1f767e" + }, + "vllm/distributed/__init__.py": { + "path": "/vllm/distributed/__init__.py", + "sha256": "97f28c30b32662af8cab163939e4ee423037f11630752e13b55cbc25a7d0ab71" + }, + "vllm/distributed/communication_op.py": { + "path": "/vllm/distributed/communication_op.py", + "sha256": "3c3f8ac60db38ece891d39dc1e2f6f1947ad438685893d2e5777d072320bd1b8" + }, + "vllm/distributed/device_communicators/__init__.py": { + "path": "/vllm/distributed/device_communicators/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/device_communicators/aiter_custom_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/aiter_custom_all_reduce.py", + "sha256": "f8eb027ce7a85d94af6260960ceb7f36fc6f1406c9af9c9b6285fddb3f178009" + }, + "vllm/distributed/device_communicators/all2all.py": { + "path": "/vllm/distributed/device_communicators/all2all.py", + "sha256": "1f1b69236acd3cd7bd94520fd6d591bfd31b57c4bc7c9f9f4161ea8bbd0c5f26" + }, + "vllm/distributed/device_communicators/all_reduce_utils.py": { + "path": "/vllm/distributed/device_communicators/all_reduce_utils.py", + "sha256": "ed0ab4dd05b2519a6313892e68824c97b540034664d7f8c3d031b322e33e1bfc" + }, + "vllm/distributed/device_communicators/base_device_communicator.py": { + "path": "/vllm/distributed/device_communicators/base_device_communicator.py", + "sha256": "4a7670f12ed7c7621b25d476e2687c24ca01f3be183fff4a6a25337596fe506b" + }, + "vllm/distributed/device_communicators/cpu_communicator.py": { + "path": "/vllm/distributed/device_communicators/cpu_communicator.py", + "sha256": "e1856c8e91cfbbb4d9ce990c1236e258ba4021e226afcbab645653380b38d64b" + }, + "vllm/distributed/device_communicators/cuda_communicator.py": { + "path": "/vllm/distributed/device_communicators/cuda_communicator.py", + "sha256": "102d95c67ec798cf352b817ba92e8abc9da37f30d1bbdf3aab45d3927b627b93" + }, + "vllm/distributed/device_communicators/cuda_wrapper.py": { + "path": "/vllm/distributed/device_communicators/cuda_wrapper.py", + "sha256": "333b6d9ed173e7a18c7f2b6627a3c9c9ed88892ce52015f05e29d6d245e48ee3" + }, + "vllm/distributed/device_communicators/custom_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/custom_all_reduce.py", + "sha256": "a048c1327c23580805600c0c951831bec333b1ffc4eb26a0e3d34119c4f0c445" + }, + "vllm/distributed/device_communicators/flashinfer_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/flashinfer_all_reduce.py", + "sha256": "b4359760e9b55963676109a5c3a015fb82e190d4df1d021de9ee01e7814cbdda" + }, + "vllm/distributed/device_communicators/flashinfer_pcie_ipc_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/flashinfer_pcie_ipc_all_reduce.py", + "sha256": "8b67b0fc356a565095f56b475cc89c513e3a5eff051ab1c52e5beb0c1a79e9f2" + }, + "vllm/distributed/device_communicators/mnnvl_compat.py": { + "path": "/vllm/distributed/device_communicators/mnnvl_compat.py", + "sha256": "72ee1e6f9571b4c8ecbd9f60cd469d1b565cb79cab519a688a93f290906a2615" + }, + "vllm/distributed/device_communicators/pynccl.py": { + "path": "/vllm/distributed/device_communicators/pynccl.py", + "sha256": "882fb83c5a3c565a3f8fd664b79f5ceae566dca180019ecafd74bc8c11d9f8cf" + }, + "vllm/distributed/device_communicators/pynccl_allocator.py": { + "path": "/vllm/distributed/device_communicators/pynccl_allocator.py", + "sha256": "390e2576cbf4ae06341ca4dab24fc7e4d4f7c24dd444329ed05d828a9ce91460" + }, + "vllm/distributed/device_communicators/pynccl_wrapper.py": { + "path": "/vllm/distributed/device_communicators/pynccl_wrapper.py", + "sha256": "ce63c8da57bb88d4cf89956bd70bb63f0f44bfad468ddb37b765611551f6d99f" + }, + "vllm/distributed/device_communicators/quick_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/quick_all_reduce.py", + "sha256": "8aacb23e7c297b0ae2f80d99c5affd2e7517115d7874be51069d14a44db7b5f2" + }, + "vllm/distributed/device_communicators/ray_communicator.py": { + "path": "/vllm/distributed/device_communicators/ray_communicator.py", + "sha256": "332c37f65495b60564d61db59bc2d30ca0236adc33442d01464790bde9aec897" + }, + "vllm/distributed/device_communicators/shm_broadcast.py": { + "path": "/vllm/distributed/device_communicators/shm_broadcast.py", + "sha256": "f3e7a3f3ff713fccbd535e0d41650ee05bdf8677e83d4b90519910645022c30b" + }, + "vllm/distributed/device_communicators/shm_object_storage.py": { + "path": "/vllm/distributed/device_communicators/shm_object_storage.py", + "sha256": "e097bf7ac0141fe8db4131e8fd553ca2ad5b0600b22a56f3924af6b795e7207c" + }, + "vllm/distributed/device_communicators/symm_mem.py": { + "path": "/vllm/distributed/device_communicators/symm_mem.py", + "sha256": "b06e3ddb9ae880a30ec4a103ce32eb9794223bb0293832e89572af28adaaa544" + }, + "vllm/distributed/device_communicators/xpu_communicator.py": { + "path": "/vllm/distributed/device_communicators/xpu_communicator.py", + "sha256": "527cbfb250760abc62096ee7cd612307b821f21b72dee1687ad866620ec89b6d" + }, + "vllm/distributed/ec_transfer/__init__.py": { + "path": "/vllm/distributed/ec_transfer/__init__.py", + "sha256": "061405bb51df7409c9938b62e25caa8bd6ebf85da6d1700dbd4affe2a0825135" + }, + "vllm/distributed/ec_transfer/ec_connector/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/base.py", + "sha256": "22d4913375bb622473fbe1a77f9376b804949cd8a7e31e9518208f9561d161e2" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/common.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/common.py", + "sha256": "e2267abd8d00a6d2605e1a82ea5c73396a71b427452eab469fcca0134c334e7c" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/connector.py", + "sha256": "72cd35d9fd754a2992dd090a8af13c91e0789b4038ac29276750d823120235db" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/base.py", + "sha256": "19e8df88b0fa831997896355ecdd49e0d86cb074cd7ae28aed0b328b0bb3ab2e" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/zmq.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/zmq.py", + "sha256": "435641c0e37551ab4937855abd067be26905b91215e759cbd9d28a419a34ff9a" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/base.py", + "sha256": "3be698aeb67d32ee3741e76b2fb71806941c587578583acf8fbc42fbf22b46a5" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/nixl.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/nixl.py", + "sha256": "03af8f6549a6027b7262a482907af591e45f28b9b1c5a3408bbc6600e38797e5" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/ec_shared_region.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/ec_shared_region.py", + "sha256": "e40607952c9920024455eca2f419e8c3ef1de9a4d8b27c147a33bb941b8c08b1" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/protocol.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/protocol.py", + "sha256": "05878336884396bfbef77b96b0fa6359f6fa0aba912961f14a84f5a436f27038" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/__init__.py", + "sha256": "01c42385bf3a55cff09cc05ba956f6dd4b8b6b986bf4d6eca4e566cb045b48e0" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/embedding_cache.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/embedding_cache.py", + "sha256": "7359fb980af1fc30b3253681310ef636e2b4a19134e04a93270c9c45de2572d8" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/session.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/session.py", + "sha256": "5973548a919e13c866222b91d502686a6757a31e5a5664b879bf2887ed9fb212" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/utils.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/utils.py", + "sha256": "160ac665f20f2c75b343c1e784084f2b0b4d1cf8fdb28ee15deee4dc8ed0ce45" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/worker/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/worker/__init__.py", + "sha256": "f08d296d3560c42173ae8af961af4a768033ccf1e36e9c17c0cdd53013d0c52e" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/worker/descriptor_buffers.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/worker/descriptor_buffers.py", + "sha256": "be7c81be214e995da8499105ba485854d9c19d6f8e905f8f1b87b83694ca0864" + }, + "vllm/distributed/ec_transfer/ec_connector/example_connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/example_connector.py", + "sha256": "09022ce07a89114bb65d9befd2e60873453aed11bbac8c0a75c1e6084e785a5f" + }, + "vllm/distributed/ec_transfer/ec_connector/factory.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/factory.py", + "sha256": "d6cedca0a99c3dd2b03cd1c15d17472b983e3f7d8f5baf4a12eecaf6abedb817" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/__init__.py", + "sha256": "1cbfc2f95f8f4d48a9253056eb1fd4b562062884e3fd5cb6571583c352fc16f3" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/config.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/config.py", + "sha256": "98c60696f79d1de67d2364cd9e8a42a393b5c8e17ed9af2f971368e47891d7b3" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/control.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/control.py", + "sha256": "58e0d1a423fbe958bfa586ac26a17107e08d0b31d044b4c74ab4dde880e7ca9b" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/memory.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/memory.py", + "sha256": "d5e90b1348de670a70f110d58eedcbdbd053db72c21dd007c3f5275c53951149" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/metadata.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/metadata.py", + "sha256": "497a7e6dfffb7fce80a41d5989f96119b970c143df77bb9d0f9c91d7a46e8c42" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/producer.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/producer.py", + "sha256": "97fa4d0b19475574778eab02f55fad73db9642beb9156da890314fd53fa1a7ab" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/reservation.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/reservation.py", + "sha256": "4790bc65cde4db5f17733ca2c2910980ba594a8a9b79ee27c5b957dffd4c1113" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/scheduler.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/scheduler.py", + "sha256": "53004b62529a31fdd80dfb2e6026610b95041a77e91f731ae526fefd84e7968d" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/state.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/state.py", + "sha256": "92f375d6c5cc9c83dbe95a7977ad8eb0f1b5629ccee92968bcacdc94eee15d65" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/transfer.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/transfer.py", + "sha256": "ada2113a5402054f1149d3edc2537f4e5e1bd696c9b17291c9f2b4cbf6b59753" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/worker.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/worker.py", + "sha256": "89eb91bb64845b3b121d502972a6b04d448714253becd2ea662e5691cd5acdd7" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake_ec_connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake_ec_connector.py", + "sha256": "aaebab4711bc00dd0c622dfbfd8639fc41e7ed5d1658d7d68fe33e4d5fbef3ba" + }, + "vllm/distributed/ec_transfer/ec_connector/utils.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/utils.py", + "sha256": "11b9014b9c0697f8846deff1a55a22fa86a15dc2ac3e139442fb6d513ac03059" + }, + "vllm/distributed/ec_transfer/ec_transfer_state.py": { + "path": "/vllm/distributed/ec_transfer/ec_transfer_state.py", + "sha256": "9487a41f23fa1a4fa6dfca8b42b8e97a0ee19d8406ffd1dcf4bef66315180827" + }, + "vllm/distributed/elastic_ep/__init__.py": { + "path": "/vllm/distributed/elastic_ep/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/elastic_ep/elastic_execute.py": { + "path": "/vllm/distributed/elastic_ep/elastic_execute.py", + "sha256": "b8f60a4183c79ff6051095b5f95bb385bc7fea0cffe8cd9ebc9087ab0e9f01b5" + }, + "vllm/distributed/elastic_ep/elastic_state.py": { + "path": "/vllm/distributed/elastic_ep/elastic_state.py", + "sha256": "fbf049199841a086fdf2fc1ab8498ef017ad3bf319db65c3ae61acbb536d2e10" + }, + "vllm/distributed/elastic_ep/standby_state.py": { + "path": "/vllm/distributed/elastic_ep/standby_state.py", + "sha256": "15282597550ebd0e07b8492ff192aea1ec0dcec8f0ad34009123e1002cc140c1" + }, + "vllm/distributed/eplb/__init__.py": { + "path": "/vllm/distributed/eplb/__init__.py", + "sha256": "1b9c2ee22abb5888c354c5aa01f0944f253e5e24e135d019778398bbe495a628" + }, + "vllm/distributed/eplb/async_worker.py": { + "path": "/vllm/distributed/eplb/async_worker.py", + "sha256": "424328600ad1003286fc5dfffa1f9482007314c060947818b2f94a8b97811f5e" + }, + "vllm/distributed/eplb/eplb_communicator.py": { + "path": "/vllm/distributed/eplb/eplb_communicator.py", + "sha256": "ba30d9d40e7b81d3f42aa9041d2f328edca4073cfe2de920285eb68375501ed8" + }, + "vllm/distributed/eplb/eplb_state.py": { + "path": "/vllm/distributed/eplb/eplb_state.py", + "sha256": "2f06bc8c63f3fdf55edb5032ae55c0ffcac3e67720ce74ea312e3d141b12acf4" + }, + "vllm/distributed/eplb/eplb_utils.py": { + "path": "/vllm/distributed/eplb/eplb_utils.py", + "sha256": "058af6104faa6d4085c1dca80bbe60d92bf0a7ec9cd92c775a180546c9d8c9c3" + }, + "vllm/distributed/eplb/policy/__init__.py": { + "path": "/vllm/distributed/eplb/policy/__init__.py", + "sha256": "daeb266c88442832b1ab8c8c4cc064891b38b9e9ba00aea324f926c87dc6d37e" + }, + "vllm/distributed/eplb/policy/abstract.py": { + "path": "/vllm/distributed/eplb/policy/abstract.py", + "sha256": "b9fd34c28bbfdded03360d7f3f6f8fb978e82689190d7ae4501dfe520e958c62" + }, + "vllm/distributed/eplb/policy/default.py": { + "path": "/vllm/distributed/eplb/policy/default.py", + "sha256": "3b54229e6240d050480390f6b29d4744fd38437d23719f78a6decf7002296a29" + }, + "vllm/distributed/eplb/rebalance_execute.py": { + "path": "/vllm/distributed/eplb/rebalance_execute.py", + "sha256": "b387e228791149018536eee96cf955b33ba79d801cdc36849d1b47a580ec2597" + }, + "vllm/distributed/kv_events.py": { + "path": "/vllm/distributed/kv_events.py", + "sha256": "de08f01e8736881560256c350a3b6418999dd4aa30f9c6ec9159527f7ed6899a" + }, + "vllm/distributed/kv_transfer/__init__.py": { + "path": "/vllm/distributed/kv_transfer/__init__.py", + "sha256": "c1be4e58ec6923bae607a355ad22891c740f056a69ff7358b1e10ea3fd2680ea" + }, + "vllm/distributed/kv_transfer/kv_connector/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/base.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/base.py", + "sha256": "2ae2a2c48f5731f3533166a75440fe91e764332305b5d713df840edba970789d" + }, + "vllm/distributed/kv_transfer/kv_connector/factory.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/factory.py", + "sha256": "add99c93c587b0098b90b1f8fd6940bdd1f15c236c5c6f1a258411863cb902d3" + }, + "vllm/distributed/kv_transfer/kv_connector/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/utils.py", + "sha256": "317ed40dc837671ca6e666165222e641a0f9b3992aea63bbf54de7e13d40b3a4" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/__init__.py", + "sha256": "5beb6ccad12fdcfe1581982da6f18321caca50e73a6b3259ebf3c8dc8b3ffcca" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/base.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/base.py", + "sha256": "97af64220475c6c9e8273438d7b5138b105ebe6944beb783facb36a3bb76f31b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/decode_bench_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/decode_bench_connector.py", + "sha256": "b4151c88cdec28f1ff9259047abc17baf23b892f4b68769a93bf26e0442b9017" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/example_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/example_connector.py", + "sha256": "6226876ef52d10d0d284d29c337ab44698e8bac6abdb2e0ece53b5756c55d068" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/example_hidden_states_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/example_hidden_states_connector.py", + "sha256": "58c22534dcad0fb73599a2d70a2fb104d5b612a4723be5e777f56a56fe07892c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/flexkv_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/flexkv_connector.py", + "sha256": "de4f68c3bd565ed898e47e0b2980049b966ff31888f1957050d30995d4953762" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_client.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_client.py", + "sha256": "bea6ecff2be281c7e96c1551c7bf463cbb01f2964696067c0ebdb683844f9aab" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_connector.py", + "sha256": "e67ed58015090e5eea9d499883f2a9422673d07f8bdbe0ccff7db15d2460de13" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_metadata_server.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_metadata_server.py", + "sha256": "6800e5cf37809f8a8e28c469c14a434db288bc3bf83a8b62ee06910a20c2da19" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/common.py", + "sha256": "8f2c02c08227a9093e6aeb183961aba36b7812cfc29b8c047a2b2c9d82f79c15" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/gather_scatter_helper.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/gather_scatter_helper.py", + "sha256": "08c1b43de34fbeca77357d7576ac1d17cba974b59d695562f68bb713061e7b54" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/hf3fs_mock_client.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/hf3fs_mock_client.py", + "sha256": "bec61a9b0c4b9124b2292d7646d76411da44396389349b53cdcbc46353c8780e" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/connector.py", + "sha256": "8c61094ce0a3a702908f9576f69482e6bf314738a2cbe33a7d3b47258fa0ab43" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/stats.py", + "sha256": "d9383a6ad6ab6b8f812d29d90495407b770eeddb79b86e9d0e3216c0bd16e0ed" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/worker.py", + "sha256": "251c0d8e57e4739c03ce3e1c899a95ff5b1752eb27676c28ab88c4ebd62c4776" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_connector.py", + "sha256": "5991f9ff8832df32bd421eb67e48237270ea0a408180e523810bb43606acf8f3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/__init__.py", + "sha256": "c53be9796e76cde637514bfc40a525d8c09bb2784b406cb516790d8285dfe433" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/multi_process_adapter.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/multi_process_adapter.py", + "sha256": "6480d67b31ed603027a83edf327880a38aee45eaeee2da9a4efa93e95527c166" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/utils.py", + "sha256": "e204fa6a853ac9c122d7a4e9d146902230f81c48d4321ed5edfdbf979dd49ba2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/vllm_v1_adapter.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/vllm_v1_adapter.py", + "sha256": "e6fe55049c6b007248516d69640e2f3a4809f9d286091a1014ae0949987fa8f1" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py", + "sha256": "c712c386a7c57bf0355a1441ba574232c3aa5498fcb70713a2b3f5d18b64f9c1" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/metrics.py", + "sha256": "de1b1797d0448f74370919dbb0278767f390e8f59e00a0c0528abefb302babc2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_connector.py", + "sha256": "516be01320e64b0110e102eeb69a6ba766dd5ac8cb3036db6b97b7d54413323d" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_utils.py", + "sha256": "26877610463fa8e9d6b092772f2551bcc0c3ac794cbe63996df0414666a8ebba" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/rdma_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/rdma_utils.py", + "sha256": "716e5042edecaba36c7ca763474988f32fa09c2668b8260260149df610af8f83" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/stats.py", + "sha256": "f39b2f0b1db2e4f922e27e684a3f7bbf5bb279b82a0a8c3bb0c7ae69b6d14d24" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/connector.py", + "sha256": "17a350bdb89e17e415d6c52a48684dc15c35a804378daf03e1f3bee1b1b123a3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/coordinator.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/coordinator.py", + "sha256": "a8eb6c2157a96e8d25233b82347ac8409a41d6390b4f2c64242119c05911010c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/data.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/data.py", + "sha256": "d3cfefdb4165a24995749cba452641b318065baa95bb1bae62f922a2f8886e7b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/metrics.py", + "sha256": "f2b9ef8927632d142aad11a374d0725c6e619ea0bb7fea9eda3f3895eb7d277a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/protocol.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/protocol.py", + "sha256": "ccb1cf6a84a932a375215627d2aaac482c351a05df015d636d05373a6845b7c8" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/scheduler.py", + "sha256": "283849ff581ec206444cdf5621622377f1c925e8d7e05cb9294af2f3a5094e79" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/worker.py", + "sha256": "55f1682dfd1ed7af689166421337126a0e1d08afa4774a242e098d79e0c1e95b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_common.py", + "sha256": "549bb4fe22dca5095515b9c0712c31cc81a9d4923881e9f112317640fd8c04ab" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_connector.py", + "sha256": "c0f474bc34b579d889fae92eaf43eaca241be51a4697a187a942f0df4e6b6a98" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_engine.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_engine.py", + "sha256": "d842f3772fc6588d5a329a67572324cb74709aa3df4033e64c791a1e706c8e88" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_layout.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_layout.py", + "sha256": "2b4ec046a78897236b0626939bb828b6ec095355097d10bca39e5f3e1c992553" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/multi_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/multi_connector.py", + "sha256": "12d8387239f3194f2cb63ccbd64824648047210323572d66671e6a1eed349fc3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/__init__.py", + "sha256": "cc3145fe3b6d219a267bf40a0f7c0cc9430e4289f94acab2df761b99b671e7ba" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py", + "sha256": "7a1db8c54e4cd846bdac747344f2aea2c2fcf507817928796063225223b7e169" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_worker.py", + "sha256": "49a2e4faf99bef146b5a1d4d18d48f240b1e561c438252274494b359db96ef52" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/connector.py", + "sha256": "b6a0dc916d052f344be72ecfcb111509c13580102c11a860fa726cf0888949a9" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/metadata.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/metadata.py", + "sha256": "2b23a07c1ec5ac5490c3b818737c7192e344ea9f52cd5623f75939f741ab4e21" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_scheduler.py", + "sha256": "ac3daf8e2246581fec84ab28f2133569421b62c32a120be4923e2f4d0f2f9de9" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_worker.py", + "sha256": "e5060c9b6cf022de35ca3d1da7a369cd6a6a2dea26219af9f7633aaf78af8a76" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_scheduler.py", + "sha256": "2d9008e33937a4d6c5cf9cc2f96160f2bdbc8e987fe37f0798a7fd7eb84c9572" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_worker.py", + "sha256": "87de3ea383dd3aa95fb2c287ea26ded8a330859cc1295f9faa69047e80865c2c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/scheduler.py", + "sha256": "09f1bfe7075b926b26a94529480e33b62c3ac273ff826f6c502084f08b1b2a08" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/stats.py", + "sha256": "3e710654e0b68d1a8592f0c4735c81b22f4bf698fb1a2dfea126d35bf2dd1ef2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/tp_mapping.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/tp_mapping.py", + "sha256": "2d43607f98701b2fad6cc0ac2767619a80b7fc2b3a3c2eb6ed0da4fb05dcd8f6" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/utils.py", + "sha256": "93de863fc8307a61d40b62f1b176b57ae93c363d34b9e9ddc8e666265b6d45dc" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/worker.py", + "sha256": "5134a36ac100ce7a64f5311029a37ac12c38d91093f63100f51f7fe53ea7c3ee" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/canonical_mapping.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/canonical_mapping.py", + "sha256": "e0b3c6f9806a650e0370c43c5068fc31c0fec94615089e15fdf270d7d96f2b64" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/common.py", + "sha256": "9b3f042c6fa1581d10e8f688d2d9bc927bb41b780a9ea01f514d57228e20c978" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/config.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/config.py", + "sha256": "aea82e60889e78dcad8564ec8285b65a6a372824a1545a98ea8e78b6f4fd418a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/events.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/events.py", + "sha256": "d7039b67be95fd444966628184040a94880873c0611c0e6e7525a22650ffdefb" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/metrics.py", + "sha256": "13d76df014e86691f58dc89a879f9808b124690c9267dd5fa3b2d4004d4c5fdf" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py", + "sha256": "2c5282f4a3165cd787fb355e215e3869f1bdd3f2c795b2155fc537c9d135191a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/worker.py", + "sha256": "acc2df53262441dfc6421a3af7f0cbd68cbfaedbd42bbc384d8e1da2d965d194" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading_connector.py", + "sha256": "cdc16ca7339a10e1993bd6220e6273f86a4e99779f58f25098a24ad31bb0dbd8" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/simple_cpu_offload_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/simple_cpu_offload_connector.py", + "sha256": "96238ca82ccf07a1eeb59b8f66de17b09034e3eb993ad9a0a836511d3f69706b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/ssm_conv_transfer_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/ssm_conv_transfer_utils.py", + "sha256": "59a949709482e65a007fbe5352fe9b4bb54c2dcc10ad2c1c41f754b6e13299f4" + }, + "vllm/distributed/kv_transfer/kv_transfer_state.py": { + "path": "/vllm/distributed/kv_transfer/kv_transfer_state.py", + "sha256": "2e5fe09438d6e2ee642f8a26cf7dcf632e870d955d30baf002b76a8bfe836d05" + }, + "vllm/distributed/nixl_utils.py": { + "path": "/vllm/distributed/nixl_utils.py", + "sha256": "0bffa3c052c9f67472b1c0bc3816114891b010c968bf4b8a292e7da4d687db53" + }, + "vllm/distributed/parallel_state.py": { + "path": "/vllm/distributed/parallel_state.py", + "sha256": "d9b10ad56833ebc08a753e1a050ef0989c30d4134021b7b7b00150b7bd01adc6" + }, + "vllm/distributed/stateless_coordinator.py": { + "path": "/vllm/distributed/stateless_coordinator.py", + "sha256": "f52848fbe985ed47b1f3e3ca555314736ca06436e8d738ab4390101f0672dcb0" + }, + "vllm/distributed/utils.py": { + "path": "/vllm/distributed/utils.py", + "sha256": "792146b357139e705064a68d3b66858de8a0baaca4dc7db1232fa217d45db231" + }, + "vllm/distributed/weight_transfer/__init__.py": { + "path": "/vllm/distributed/weight_transfer/__init__.py", + "sha256": "3fb9d4712b7c131d522f5e76e73cd8c333f3cc7af86e2d5ecf9b61b57b3b7f5a" + }, + "vllm/distributed/weight_transfer/base.py": { + "path": "/vllm/distributed/weight_transfer/base.py", + "sha256": "8ab06feb04f1379d0558fbdb77fde46bc84f179e0a26742cabab937e88caa38d" + }, + "vllm/distributed/weight_transfer/clients.py": { + "path": "/vllm/distributed/weight_transfer/clients.py", + "sha256": "ff85c79c350241e6d2749ca23c9d295a3289b4b62bfdf0257d32eb94a0151d36" + }, + "vllm/distributed/weight_transfer/factory.py": { + "path": "/vllm/distributed/weight_transfer/factory.py", + "sha256": "4e979eeac8c5bcdbffb10eb4765cfb30120fa7595c6c2561d3fa1a966ced61c8" + }, + "vllm/distributed/weight_transfer/ipc_engine.py": { + "path": "/vllm/distributed/weight_transfer/ipc_engine.py", + "sha256": "1af578293f387a19073c322b24143c3ae4716ce0c5d2bac2a4ef26fe20119330" + }, + "vllm/distributed/weight_transfer/nccl_common.py": { + "path": "/vllm/distributed/weight_transfer/nccl_common.py", + "sha256": "7b2ef7dc7481c3f478f17c49aa36c7bed54142ec5c93d36ed8426c8fdf09e500" + }, + "vllm/distributed/weight_transfer/nccl_engine.py": { + "path": "/vllm/distributed/weight_transfer/nccl_engine.py", + "sha256": "7fd020c919dc7b4723fb78e64da977b180d0fef0cd21df955a037b848dbaa008" + }, + "vllm/distributed/weight_transfer/packed_tensor.py": { + "path": "/vllm/distributed/weight_transfer/packed_tensor.py", + "sha256": "d0a27fb0be1dc029bd5a1d44fdb57a5e54aa4cd74308bedc339e86ac02c7494c" + }, + "vllm/distributed/weight_transfer/sharded_rdt_common.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_common.py", + "sha256": "be0b13801f24e7b62999b19d733c030510353603a2d5320d5dc98ee02daf22a2" + }, + "vllm/distributed/weight_transfer/sharded_rdt_engine.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_engine.py", + "sha256": "2f791970b4815511a7578ef6c957e7da97b071d26a39087a09a17475909791ee" + }, + "vllm/distributed/weight_transfer/sharded_rdt_fake.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_fake.py", + "sha256": "ee11164e17b5f2793252ce77741b8b94e0583046abf896a590131b2008d1fbb9" + }, + "vllm/distributed/weight_transfer/sharded_rdt_trainer.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_trainer.py", + "sha256": "dd413ff461d41826ccd3eb87d3df22f6cd7f24e09aac7644e3e5b40d7beec484" + }, + "vllm/distributed/weight_transfer/sparse_nccl_engine.py": { + "path": "/vllm/distributed/weight_transfer/sparse_nccl_engine.py", + "sha256": "e11b409454dda2b05ea34e8115ac19027c5e65cb2a5e9682c494f16a50e978f4" + }, + "vllm/model_executor/determinism/__init__.py": { + "path": "/vllm/model_executor/determinism/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/determinism/batch_invariant.py": { + "path": "/vllm/model_executor/determinism/batch_invariant.py", + "sha256": "af8f8d256a48fc214edf426fbe891fb15bd8b1d7ae98b811c736ff1eb0fae798" + }, + "vllm/model_executor/determinism/batch_invariant_configs.py": { + "path": "/vllm/model_executor/determinism/batch_invariant_configs.py", + "sha256": "72ea0d4df0ab5ae288abb7df5c203d2ad5f1709c7295d87ec72da775fddc1b7a" + }, + "vllm/model_executor/layers/fused_moe/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/__init__.py", + "sha256": "64a32665be6d5afcfbaf7a0915717267278b66b880b908b0263ea58f08e51b5e" + }, + "vllm/model_executor/layers/fused_moe/activation.py": { + "path": "/vllm/model_executor/layers/fused_moe/activation.py", + "sha256": "78dec0e85e0c040304515f64ccf8f2c6a7a2e5b9f1124a2138a97d9a02585541" + }, + "vllm/model_executor/layers/fused_moe/all2all_utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/all2all_utils.py", + "sha256": "dc4750a446f7de31d09a46034da5fdf479bc169af90f47aa9af8ae15e67b0828" + }, + "vllm/model_executor/layers/fused_moe/b12x.py": { + "path": "/vllm/model_executor/layers/fused_moe/b12x.py", + "sha256": "ee76cc6aa801e24be8ec78a9e8502061ad48667d5ff8711e43f68fba912425bd" + }, + "vllm/model_executor/layers/fused_moe/config.py": { + "path": "/vllm/model_executor/layers/fused_moe/config.py", + "sha256": "a3a87cebcc7ac85d73f471dcfafc2d899c6fc08f264777b74a0e919adac9e03f" + }, + "vllm/model_executor/layers/fused_moe/deep_gemm_utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/deep_gemm_utils.py", + "sha256": "8fdcd857eb333f9c68902105f157568d52067c94ba1e2df6dbfe0474ef1f4c02" + }, + "vllm/model_executor/layers/fused_moe/eep_reconfigure.py": { + "path": "/vllm/model_executor/layers/fused_moe/eep_reconfigure.py", + "sha256": "9d7580265e8563e1140c2bb4c3a81a35ddd54903f5ec0a2720ffc064681f02f9" + }, + "vllm/model_executor/layers/fused_moe/expert_map_manager.py": { + "path": "/vllm/model_executor/layers/fused_moe/expert_map_manager.py", + "sha256": "308c00f63fcb6f44518ec3a56d8f902c7bba75928c2e3aea30fbe1f3f473973b" + }, + "vllm/model_executor/layers/fused_moe/experts/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a16_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a16_moe.py", + "sha256": "53deea255175171971422d14082ad139b5ec7b62e21429a4c7cc0ebbefd29cdc" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a8_moe.py", + "sha256": "f3fc51b95ed89862381908a0134e326228827f44854248db9585a9c4899c34f4" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp8_moe.py", + "sha256": "af6db1760961a5a71234f8b1cdf42e9e30a236e13601b0826a75110b79724948" + }, + "vllm/model_executor/layers/fused_moe/experts/batched_deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/batched_deep_gemm_moe.py", + "sha256": "b0cd4ea706583518dc608fb56f832fc3595f24bd863b03ef1e8c22b36b873508" + }, + "vllm/model_executor/layers/fused_moe/experts/cpu_int4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cpu_int4_moe.py", + "sha256": "67170af3ba9dc4c4f71d78a72efc3fa4e366eac614936a79911dae5c75ac1864" + }, + "vllm/model_executor/layers/fused_moe/experts/cpu_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cpu_moe.py", + "sha256": "0754cd4ff1b28e6d3932a67609d335acefd28f95a841f0492923813356a6d81e" + }, + "vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py", + "sha256": "db901bdbcd3fdac23a1d74e39c51e67f14a82be787b2fd704ed1e787372ae868" + }, + "vllm/model_executor/layers/fused_moe/experts/deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/deep_gemm_moe.py", + "sha256": "16911a64a72eafc26a1bcb544a91f90144d85dc41e3ee57cf20e89925227bbb7" + }, + "vllm/model_executor/layers/fused_moe/experts/fallback.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fallback.py", + "sha256": "1bdd0a4f2ebaa40ec96a5aacc07aee61511af59e6324ce456aa65003b6e2991a" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_b12x_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_b12x_moe.py", + "sha256": "e613afe5da2742e42c717c1a0a56bd9e1c7e3e0452a828db0013d81063518954" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_batched_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_batched_moe.py", + "sha256": "295254dfeeec8df3eb8110e6f659a946cb9cded3de1565ecad4d741b3c3f3e00" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_moe.py", + "sha256": "08578bcd0cf72d6a470e40950175e73639efaa6d8d23c6da0869345312b229c9" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutlass_moe.py", + "sha256": "52887cec5fe628e0a4e7793deb546b40f6c29f7362b3b436c10ca36934ab9826" + }, + "vllm/model_executor/layers/fused_moe/experts/fused_batched_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fused_batched_moe.py", + "sha256": "2435587fc7f8fe8ea341ea0eb8f14c11f3f5b31fbbb9b29ce569ad3bace6e6a0" + }, + "vllm/model_executor/layers/fused_moe/experts/fused_humming_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fused_humming_moe.py", + "sha256": "a6830a76ff7f4cd3479b9c8372a30d03e8301604555cbdbcd9ac89a813b7431a" + }, + "vllm/model_executor/layers/fused_moe/experts/gpt_oss_triton_kernels_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/gpt_oss_triton_kernels_moe.py", + "sha256": "1613a7a6b256e8faee6fdcfae84f293492db6229d28ceb3e8a8d6093af480e36" + }, + "vllm/model_executor/layers/fused_moe/experts/int4_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/int4_emulation_moe.py", + "sha256": "f12857caf0671a341687ad3c5f48616b816ed51e1bcbdefa0a7edbecdb81a79d" + }, + "vllm/model_executor/layers/fused_moe/experts/lora_context.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/lora_context.py", + "sha256": "9b41eefaaa57c5dd0dc54217ef95978821b0c52e90ea4db8b0752e08452bd3e5" + }, + "vllm/model_executor/layers/fused_moe/experts/lora_experts_mixin.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/lora_experts_mixin.py", + "sha256": "b2bc55ed6be98b526c6a5698e2d98300650e78555f56b1820e58c04888e2a373" + }, + "vllm/model_executor/layers/fused_moe/experts/marlin_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/marlin_moe.py", + "sha256": "93916b721548e6194dc70cf6cec224b4b1456a0cc0980235e97beba7bf36541d" + }, + "vllm/model_executor/layers/fused_moe/experts/mxfp8_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/mxfp8_emulation_moe.py", + "sha256": "d09c62ad1398c51ff6f515f2a61014ee9e9a9798d0fe9762c47f446efc5edbef" + }, + "vllm/model_executor/layers/fused_moe/experts/mxfp8_native_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/mxfp8_native_moe.py", + "sha256": "01a42cebf18189e566034111b2145573c655319e8af1a56db60d53a319c40613" + }, + "vllm/model_executor/layers/fused_moe/experts/nvfp4_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/nvfp4_emulation_moe.py", + "sha256": "f24467762b60702f0df122ed64786be839a838a9b6cafaecbd04d35fbfedb189" + }, + "vllm/model_executor/layers/fused_moe/experts/ocp_mx_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/ocp_mx_emulation_moe.py", + "sha256": "dcaa60a9ebdb0bd8223b37af41f018ce7f95716ec7cd8526850f4433a579213b" + }, + "vllm/model_executor/layers/fused_moe/experts/rdna3_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/rdna3_moe.py", + "sha256": "e4abd802dc2f0ad9b338ebde397633c761d881c37813e2dc229902c526b597d8" + }, + "vllm/model_executor/layers/fused_moe/experts/rocm_aiter_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/rocm_aiter_moe.py", + "sha256": "bf09a7b783f5752d61cab76221b32b598d8846d801ee39dc9209d636c9659c6f" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_cutlass_moe.py", + "sha256": "ffce5ad627c540940d122d8df7981644b2eb35d07d480995c0f4f30517815fac" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_deep_gemm_moe.py", + "sha256": "c7209fa5e1ccb184a68b37a0706fc571a76696c2ae79802ddc7f889b1c29684d" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_moe.py", + "sha256": "806fbccfe30f5fbd578acf773add99bdf022b12d617958bd6281aef6de369701" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_bf16_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_bf16_moe.py", + "sha256": "76256de96fefece9c41ffb1108487919e24da364cf4412c6c3474498aba59137" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.py", + "sha256": "b54c7ceb45e5d07aa905f42ea44caccf85ca35ba9fb825d4c01947764510f68b" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_lora_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_lora_moe.py", + "sha256": "dd35a9e4242c0dc8d691168813e14bd5543e591f02ee529d0691e07651942c5a" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_mxfp4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_mxfp4_moe.py", + "sha256": "fe780f125a3dc3ba919659e9b85340bd32afcbfe47733a002bfdfb92eadf400c" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_mxint4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_mxint4_moe.py", + "sha256": "2106d67c2951aa690c4656ca58240d09c366cffe8cb4d9fd575df016c377cc30" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_nvfp4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_nvfp4_moe.py", + "sha256": "e938ac9f058f7c90b41c9610513239bec54a95304bfb5ff5f6897ebd54733d7e" + }, + "vllm/model_executor/layers/fused_moe/experts/xpu_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/xpu_moe.py", + "sha256": "2a11bac0cf9274d963315efd6eebdc62978b0b7aa02e8849ff2a562742f0b86d" + }, + "vllm/model_executor/layers/fused_moe/fused_flydsl_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_flydsl_moe.py", + "sha256": "0e74879ee5c72f616ae4064b9dff3b3a0b583b7fc70b8f92f1e8b730ecd5d39b" + }, + "vllm/model_executor/layers/fused_moe/fused_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe.py", + "sha256": "7072eb06237be9d33dcb0ef7101410f886a6363c98cbee70a014c68b70f639cb" + }, + "vllm/model_executor/layers/fused_moe/fused_moe_method_base.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe_method_base.py", + "sha256": "18dcfc469d3252749801bbf943857f58da85de1f2db8fdff5a9f4986a925dc68" + }, + "vllm/model_executor/layers/fused_moe/fused_moe_modular_method.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe_modular_method.py", + "sha256": "321c744eac1fcaffd6b1b2971204c8baa57dfec53e91e5d24140014d72d64f83" + }, + "vllm/model_executor/layers/fused_moe/hpc_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/hpc_moe.py", + "sha256": "2ca9c5d71b6fd91651027905e2b83103a8823845e053e7153e148cb8e0ee666d" + }, + "vllm/model_executor/layers/fused_moe/layer.py": { + "path": "/vllm/model_executor/layers/fused_moe/layer.py", + "sha256": "def0b4e13bcc1e4e21ee10644e647e2eda1acbf0cc01e76d6128abb59ea08224" + }, + "vllm/model_executor/layers/fused_moe/modular_kernel.py": { + "path": "/vllm/model_executor/layers/fused_moe/modular_kernel.py", + "sha256": "8dc4e0dbbf35b3aac8add63ca6f2a7bbfdadaabbd60826e24598b22c7d8e5c22" + }, + "vllm/model_executor/layers/fused_moe/moe_align_block_size.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_align_block_size.py", + "sha256": "c3f7fc2087836f0160a32ab99ceb1d8f6e87c793679da34dd672e225cb7fa31b" + }, + "vllm/model_executor/layers/fused_moe/moe_fused_mul_sum.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_fused_mul_sum.py", + "sha256": "112e72578002c3bff538418dac64b3b56d995994a2fc5e32b18d2cf3b8392a13" + }, + "vllm/model_executor/layers/fused_moe/moe_output.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_output.py", + "sha256": "6ea4cbd78f9efc7f842c5df246f553f08b991c3479b8b04b89902ed08aaf8e8f" + }, + "vllm/model_executor/layers/fused_moe/moe_permute_unpermute.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_permute_unpermute.py", + "sha256": "1adc592c6254d0c877d66be5406afbc822459c18a838f4bbd094a992e7609d06" + }, + "vllm/model_executor/layers/fused_moe/oracle/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/__init__.py", + "sha256": "4dcf941d50d48bb812de0f39e9194bf17a76b8035fe324889c6038f710fdc453" + }, + "vllm/model_executor/layers/fused_moe/oracle/base.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/base.py", + "sha256": "555bbcd18a3744e64eee4e953daabef3bd268a1bd4faf967d4cfd14d6074f685" + }, + "vllm/model_executor/layers/fused_moe/oracle/fp8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/fp8.py", + "sha256": "245bd36c285df1e6f7c51e52dcda31ad247894577a9f8d765613c2c2feae9aee" + }, + "vllm/model_executor/layers/fused_moe/oracle/int8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/int8.py", + "sha256": "c1b67886511bd966b162db5bca8930f04895fb37a969818a4a10f0726c59547f" + }, + "vllm/model_executor/layers/fused_moe/oracle/int_wna16.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/int_wna16.py", + "sha256": "cfffe8b8b290330be9d18ffa07aeecf296484395ff04df3147d99393e48b55c1" + }, + "vllm/model_executor/layers/fused_moe/oracle/mxfp4.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/mxfp4.py", + "sha256": "b7915e6779b5c88e7dcd2d227f003a8e45071d6d86877013067142d4feb64a8c" + }, + "vllm/model_executor/layers/fused_moe/oracle/mxfp8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/mxfp8.py", + "sha256": "9cfdc8102a04bb844dcd7ed88043bba96ec751794bc093da76c69aa8cf88cf48" + }, + "vllm/model_executor/layers/fused_moe/oracle/nvfp4.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/nvfp4.py", + "sha256": "735b4cdeb1258f11fb02320fc0c70cab5edaca468dd60b07b2d369389d2b0313" + }, + "vllm/model_executor/layers/fused_moe/oracle/unquantized.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/unquantized.py", + "sha256": "c8b8203bd0b73bb7f586f703607394d663f14c05711416ad42d45af564382223" + }, + "vllm/model_executor/layers/fused_moe/oracle/w4a8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/w4a8.py", + "sha256": "d7fa6e2982f20b34d5ce9c5ce28a61122762a3fcdd53d249479472a4f2316c6a" + }, + "vllm/model_executor/layers/fused_moe/oracle/w4a8_int8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/w4a8_int8.py", + "sha256": "6d6f9ca2e67b630002873de2f8d8a231d091c5c2f0f3354a9e8209449b481a4c" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/__init__.py", + "sha256": "2800113263a83c2632e522fb22790b29f63384da75d43de32f0ae2f95e8ae4c1" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/batched.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/batched.py", + "sha256": "d52425dd8c08e47cf8d9c3088daf3b1cc721c8667de4c738d04ba997f9a08ccb" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ht.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ht.py", + "sha256": "465cdf1d6cee91b2ee8c2e43abbea6e8408976e3048c10f44c089f34b415bc60" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ll.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ll.py", + "sha256": "f704922b1db680c4c212982a096e09d6b3eb97d89110313f86ed958a00df21b7" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_v2.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_v2.py", + "sha256": "8d690b016bbcfbc9eb599bcc36a6f798b2f1720c828f4347ea742e218c0cc60d" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_one_sided.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_one_sided.py", + "sha256": "acb57d8342af62bb5672036871cd4b27ecc7f37dfa7c894850bb860e6152a1f0" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_two_sided.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_two_sided.py", + "sha256": "cc5b00d6a157b6eca5afaaf7435165dbd1b4524d6d88bf75808cbe074a389f79" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/mori.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/mori.py", + "sha256": "8e9c3b5b1f0de13f467d95bf2f451cba0e4b0d9a1bdcf98da0988a3a9a79a045" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/naive_dp_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/naive_dp_ep.py", + "sha256": "db015e5b18750bbbf5b2bbaceca877dd6f3f3e74c2a94e8dc185f7413b387f91" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/nixl_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/nixl_ep.py", + "sha256": "1f71d70ac509bf5d3d67a8d95a8ee108a50af6bb5d4bde7181ca28e286f6ffce" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/no_dp_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/no_dp_ep.py", + "sha256": "adbbf529cd22059c95b5380952943a70cf11e05e321dcd707f296bebde61a6e7" + }, + "vllm/model_executor/layers/fused_moe/routed_experts.py": { + "path": "/vllm/model_executor/layers/fused_moe/routed_experts.py", + "sha256": "68c48e5df0ea4a7cc1f04436b7b9153eb53802ecd9bb55d38db8738508daac6d" + }, + "vllm/model_executor/layers/fused_moe/routed_experts_capturer.py": { + "path": "/vllm/model_executor/layers/fused_moe/routed_experts_capturer.py", + "sha256": "cd006bc1a1703418cca3b589fafb2abc4268a086fb3db044bbb64348aeac8b13" + }, + "vllm/model_executor/layers/fused_moe/router/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/layers/fused_moe/router/aiter_shared_routed_fused_moe_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/aiter_shared_routed_fused_moe_router.py", + "sha256": "f47046db1275601a2c67c9232afc7b866c9623a19639d5be867e4c7914a35069" + }, + "vllm/model_executor/layers/fused_moe/router/base_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/base_router.py", + "sha256": "47fa2324bcd9b6ebdc138d69ae6b6ecc0f2463d34bda8c5988bdb0a2a76d3fae" + }, + "vllm/model_executor/layers/fused_moe/router/bf16x3_router_gemm_cutedsl.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/bf16x3_router_gemm_cutedsl.py", + "sha256": "d0f1edd1ebc48d88e490bdb3c93db49bdc0a135ff83e7e0b57130e9f8255fc32" + }, + "vllm/model_executor/layers/fused_moe/router/cpu_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/cpu_router.py", + "sha256": "bff36b15818c87bfbb7ee3def7dc7f6396860abbe5893ff6148801fe941a4b92" + }, + "vllm/model_executor/layers/fused_moe/router/custom_routing_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/custom_routing_router.py", + "sha256": "1a40c7054e3c3a1b3ee2e98f6bc9efa9dfdc11f316a8edf7357dd91533487bfe" + }, + "vllm/model_executor/layers/fused_moe/router/dsv4_topk.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/dsv4_topk.py", + "sha256": "14f7c8487b9aef652dd61c91e0e3c3640b643bf9cd0d8a7184157d71f4beb63e" + }, + "vllm/model_executor/layers/fused_moe/router/fused_moe_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_moe_router.py", + "sha256": "0daa0dc05b931d66767feca444a4cd57ecf140f59b40ea0e8ad213eef6da2b36" + }, + "vllm/model_executor/layers/fused_moe/router/fused_topk_bias_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_topk_bias_router.py", + "sha256": "8fdc28cc248180ad4f11bb4bcda3df47926ec12665a0d84bb712fe83fc6b9376" + }, + "vllm/model_executor/layers/fused_moe/router/fused_topk_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_topk_router.py", + "sha256": "1c80f4af4d781fd66b12aa6a7a0fd30082bc521df40f1252987a8ac4c0bef51c" + }, + "vllm/model_executor/layers/fused_moe/router/gate_linear.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/gate_linear.py", + "sha256": "faa43362c2e7c568498a923c682ca18cae75e87f48d00882770821cb19c21198" + }, + "vllm/model_executor/layers/fused_moe/router/grouped_topk_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/grouped_topk_router.py", + "sha256": "048339e1799cdd42c9dae686a6cb891046577fb391b500f0d12eed73c8f61e52" + }, + "vllm/model_executor/layers/fused_moe/router/rocm_fp32_router_gemm.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/rocm_fp32_router_gemm.py", + "sha256": "9c331ef3d0bb2fb6954387d77ac62a99c5c76d2753c7438bfbb5115f68aae5ac" + }, + "vllm/model_executor/layers/fused_moe/router/router_factory.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/router_factory.py", + "sha256": "019bc8adaa7642abab82843efd53cd1a378f62c652521a1de2b781480eb88742" + }, + "vllm/model_executor/layers/fused_moe/router/routing_simulator_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/routing_simulator_router.py", + "sha256": "a7345df5add00cf3bd93024492d6fc1189fd3ecf2754a11cef1b03a295d791f7" + }, + "vllm/model_executor/layers/fused_moe/router/zero_expert_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/zero_expert_router.py", + "sha256": "dea306edd92e2b9c1b43f982ede8e1e10770d2c66220f5a106e0ed0165276e9c" + }, + "vllm/model_executor/layers/fused_moe/runner/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/layers/fused_moe/runner/moe_runner.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/moe_runner.py", + "sha256": "05893188402fe37229bf72d75088d66193c417d5d502daafd3a55e1bfedaa60c" + }, + "vllm/model_executor/layers/fused_moe/runner/moe_runner_interface.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/moe_runner_interface.py", + "sha256": "189cad01611124eb44594713cbf5918d16fc70196dc81a525ae0a7a97a5fcc51" + }, + "vllm/model_executor/layers/fused_moe/runner/shared_experts.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/shared_experts.py", + "sha256": "d89e4c79c46f6fe61262c51f3facf102e71ce1e4eb3db67f72b6bd8470937be9" + }, + "vllm/model_executor/layers/fused_moe/topk_weight_and_reduce.py": { + "path": "/vllm/model_executor/layers/fused_moe/topk_weight_and_reduce.py", + "sha256": "3dfede72d52bf99af40997994704e6c502ee3bab2bd39bfaa8a68d7dae440203" + }, + "vllm/model_executor/layers/fused_moe/unquantized_fused_moe_method.py": { + "path": "/vllm/model_executor/layers/fused_moe/unquantized_fused_moe_method.py", + "sha256": "182a5ec1874ece2091a24c5303f6ab9ea64a9a61adf325b863927f0cdd83e5d3" + }, + "vllm/model_executor/layers/fused_moe/utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/utils.py", + "sha256": "a93a0bded4008db19d8b38370526ae34fafb9c8278e5b4f60acb6acc8fdc1850" + }, + "vllm/model_executor/layers/mamba/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/abstract.py": { + "path": "/vllm/model_executor/layers/mamba/abstract.py", + "sha256": "dfdc8c836894f574e41d93d76ab989cacd3d7ecf59c97a929abfa48d9364e8ad" + }, + "vllm/model_executor/layers/mamba/gdn/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/gdn/base.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/base.py", + "sha256": "7fec748fc74131f5a45bcaf2644b3fa3a0598fd437d7347f8207ea3644a951c5" + }, + "vllm/model_executor/layers/mamba/gdn/kimi_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/kimi_gdn_linear_attn.py", + "sha256": "1cec4da5c9da73557e192bfb36cd540aae51d3e91283b554449c4a97f0f89bd9" + }, + "vllm/model_executor/layers/mamba/gdn/olmo_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/olmo_gdn_linear_attn.py", + "sha256": "60873ca3bb0c4d17c33bd259b62b658db4883cd23138f47dd4ead62cd2ff0605" + }, + "vllm/model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py", + "sha256": "b80f8e6f3fff442fb880aebb3209c52f814f66490009f4ac4003de603576d10a" + }, + "vllm/model_executor/layers/mamba/linear/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/linear/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/linear/bailing_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/linear/bailing_linear_attn.py", + "sha256": "3c480ddd6eba0766ed012a1074bbec5f241d868a87b020b0f6312222c32f93eb" + }, + "vllm/model_executor/layers/mamba/linear/base.py": { + "path": "/vllm/model_executor/layers/mamba/linear/base.py", + "sha256": "26125cd427225954e1846ca361cdaf43f2b56f11b1e217cf26e91a80ef0edb6a" + }, + "vllm/model_executor/layers/mamba/linear/minimax_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/linear/minimax_linear_attn.py", + "sha256": "4adc00f54893b5bc6c31c613deda152a19af3b1bba04153ab5924c3bf2a3aaae" + }, + "vllm/model_executor/layers/mamba/mamba_mixer.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_mixer.py", + "sha256": "a485e937ad9db14d3ad03fde5a9fe795cfa863649563e52fc7e6c52ef631164e" + }, + "vllm/model_executor/layers/mamba/mamba_mixer2.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_mixer2.py", + "sha256": "d58d93e90d9eb90bc5133b79f07c7c62d0032b35d6cf916e3fe34367b81c5cd5" + }, + "vllm/model_executor/layers/mamba/mamba_utils.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_utils.py", + "sha256": "ce9845b4a4ef4bc46577a33038ed69d59ceccb52f30e9c5bdaa36e48be3b2ca4" + }, + "vllm/model_executor/layers/mamba/ops/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/ops/causal_conv1d.py": { + "path": "/vllm/model_executor/layers/mamba/ops/causal_conv1d.py", + "sha256": "044d005cfe59fd0818ed421274e04f3e8dd679b8cdb64fca9f4422f2643484b2" + }, + "vllm/model_executor/layers/mamba/ops/cpu/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/ops/cpu/causal_conv1d.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/causal_conv1d.py", + "sha256": "64104672890ac2ef240c20c7f8059beeade707178574809dbca8721dff5ea6fa" + }, + "vllm/model_executor/layers/mamba/ops/cpu/gdn_attention.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/gdn_attention.py", + "sha256": "a50288945bf5b102ad3025ae536638dcc32d84cf7c22aaf3a85326b0c1c56c1f" + }, + "vllm/model_executor/layers/mamba/ops/cpu/mamba_ssm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/mamba_ssm.py", + "sha256": "5839e576172a3246337f5e4fb1bc19eb583b3e2b2f7e35dd060dc3041eb8372d" + }, + "vllm/model_executor/layers/mamba/ops/gather_initial_states.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gather_initial_states.py", + "sha256": "5198bb6de6d91c583a5f65d926412a76ee04a06fa72aaba76eaf156b27cd0523" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/__init__.py", + "sha256": "b88b52e71fcb21bd3fa215ea171dcd2ad2ff17c97788cfe64caa7ba45c7ecf97" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_h.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_h.py", + "sha256": "f50bbe5c0b6382323ec5dfc24a5e0c7971113d59727515e60c9fe3689734e5ba" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_kkt_inv_uw.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_kkt_inv_uw.py", + "sha256": "b4a65dd194907db08865e0596fe254f915e670a9e6b27ffa2933c1026dde9b1e" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_o.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_o.py", + "sha256": "629f7843a7e611efb9390f2ebb7a4b924b2c328d48a317fddfaa96af4d9bc60a" + }, + "vllm/model_executor/layers/mamba/ops/layernorm_gated.py": { + "path": "/vllm/model_executor/layers/mamba/ops/layernorm_gated.py", + "sha256": "3433f2e3b87c2b2ccf8e9794ce40762c86a6da38a94ecee001f439ea0d0373dd" + }, + "vllm/model_executor/layers/mamba/ops/mamba_ssm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/mamba_ssm.py", + "sha256": "a4515ec7895b40ed878cf380445034b25faa61fbaa799d96c49217bbdfd7e400" + }, + "vllm/model_executor/layers/mamba/ops/replayssm_config.py": { + "path": "/vllm/model_executor/layers/mamba/ops/replayssm_config.py", + "sha256": "5fe9d5d7aa2de6a65875b3796a919b22bc435fd76055ba054bbff43aa005bc44" + }, + "vllm/model_executor/layers/mamba/ops/scatter_states.py": { + "path": "/vllm/model_executor/layers/mamba/ops/scatter_states.py", + "sha256": "f3bb004c73edaba56337747893eb07faf29b270dc8bb9c893ee9b1044e4ead9a" + }, + "vllm/model_executor/layers/mamba/ops/selective_state_update_replayssm_output_only.py": { + "path": "/vllm/model_executor/layers/mamba/ops/selective_state_update_replayssm_output_only.py", + "sha256": "cea7fd3063ca9dcc4e33f180d01ea379195ec515cedc9d0b03b11dc67670d695" + }, + "vllm/model_executor/layers/mamba/ops/ssd_bmm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_bmm.py", + "sha256": "26983d97a7f5c5f9197a16a6bee7b1294839b9ae31a14c14aaee38b43523e630" + }, + "vllm/model_executor/layers/mamba/ops/ssd_chunk_scan.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_chunk_scan.py", + "sha256": "d5ef32e8cb47e2ce71984579df78ab69754895f891766394daf327867cfa4f8f" + }, + "vllm/model_executor/layers/mamba/ops/ssd_chunk_state.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_chunk_state.py", + "sha256": "177e3aa7fe72647133bbd86135533e8688a5802678d4d1564aa549410362316f" + }, + "vllm/model_executor/layers/mamba/ops/ssd_combined.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_combined.py", + "sha256": "1317bbb668d3c60dfe0658850f9968614f03fa5eb61196f8ce6ac17dbb31b480" + }, + "vllm/model_executor/layers/mamba/ops/ssd_state_passing.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_state_passing.py", + "sha256": "36b8c8edba437916a5b789717c61fc22077de01e77892cb96dbff3b00a57410e" + }, + "vllm/model_executor/layers/mamba/ops/ssu_dispatch.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssu_dispatch.py", + "sha256": "bbe0f0e61da87f3ddfead19a79ca376516b63f1ea868be3485333c63fa20ef41" + }, + "vllm/model_executor/layers/mamba/ops/triton_helpers.py": { + "path": "/vllm/model_executor/layers/mamba/ops/triton_helpers.py", + "sha256": "a8795532f22c37a93e82c9d8e3fadcb5f4da98673d7b321fe8481305eaafad30" + }, + "vllm/model_executor/layers/mamba/short_conv.py": { + "path": "/vllm/model_executor/layers/mamba/short_conv.py", + "sha256": "228494efab185ee17374f762874f4c8b9a26aac9decfa8c906ce38446e0de51a" + }, + "vllm/model_executor/models/qwen3_next.py": { + "path": "/vllm/model_executor/models/qwen3_next.py", + "sha256": "4fa5112ac2bf7886d41d9e1f6c3da8793620d1ec49c961b31e9609459a6a7f7a" + }, + "vllm/third_party/flash_linear_attention/__init__.py": { + "path": "/vllm/third_party/flash_linear_attention/__init__.py", + "sha256": "5dbbfa3fc286edb2e970e175ef33cee4f6181c89b0784f5a8986201b2312f54e" + }, + "vllm/third_party/flash_linear_attention/ops/__init__.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/__init__.py", + "sha256": "dd738dc1d08045e76455cdbe16052a5b769e0eb11d6e87ff28353994f880cd6c" + }, + "vllm/third_party/flash_linear_attention/ops/chunk.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk.py", + "sha256": "c105ead259e86aedc248c53e7c4cef07034d0ff12da608d80265d1dd0990803f" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_delta_h.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_delta_h.py", + "sha256": "1b3ad391f939d9443c6b7adb19e57fe381bd5dccea064e8417a4f85b0e713b26" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_o.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_o.py", + "sha256": "3b63b836a8cc561723c23db5a528a0b474d9cd78508d610f0b348c585a889a19" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_scaled_dot_kkt.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_scaled_dot_kkt.py", + "sha256": "7ae41df3755acc7e925a134d848f78bb5fc00b90069039d86403c5853323ea42" + }, + "vllm/third_party/flash_linear_attention/ops/cumsum.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/cumsum.py", + "sha256": "d818215669b451868823202ac0bcea77e7a9d75957254c7c1060a73a55dc39b6" + }, + "vllm/third_party/flash_linear_attention/ops/fused_gdn_prefill_post_conv.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_gdn_prefill_post_conv.py", + "sha256": "590717b2107abc90d72548de06b5d315229eb2775c94614f3f545df11cc2b5df" + }, + "vllm/third_party/flash_linear_attention/ops/fused_norm_gate.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_norm_gate.py", + "sha256": "e6eb90467f29d8a0a04f2a364d20a2c3191b6ab857841bfb82076b33a6022d1a" + }, + "vllm/third_party/flash_linear_attention/ops/fused_recurrent.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_recurrent.py", + "sha256": "fe6f1311014809040497aa0a623e7fa97f4b3457cdc7ee1f1f8aed21f326f755" + }, + "vllm/third_party/flash_linear_attention/ops/fused_sigmoid_gating.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_sigmoid_gating.py", + "sha256": "000ab8996af9788fdb8843a6a3b91833e7a14c8acc0e1ea073a536330f64cb6f" + }, + "vllm/third_party/flash_linear_attention/ops/index.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/index.py", + "sha256": "a4f8b2c052635cb519a80099e8a85411d1d5d6880b38f466788259bbe66b154d" + }, + "vllm/third_party/flash_linear_attention/ops/kda.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/kda.py", + "sha256": "e1f31aaa89b91f8e5db6d070b229e2c81c7206e8caec67de41db97d06be0c476" + }, + "vllm/third_party/flash_linear_attention/ops/l2norm.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/l2norm.py", + "sha256": "520f4513ef4fc97e6b88dc07877cca8e29da0d34e44673fe989e3af002d86381" + }, + "vllm/third_party/flash_linear_attention/ops/layernorm_guard.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/layernorm_guard.py", + "sha256": "42af29be26e8fc94a4658e053c095fcdab9ffdc1bc2446a01e787deda2a298c0" + }, + "vllm/third_party/flash_linear_attention/ops/op.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/op.py", + "sha256": "456da84fd12411cf53c96a90dd4f78f49afb454c3d51d2c524ea8e7106fe8ae5" + }, + "vllm/third_party/flash_linear_attention/ops/solve_tril.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/solve_tril.py", + "sha256": "d1a4ff27623a938825052500afa7e2aa24fadd2fa4c9be6376c9128824f86f82" + }, + "vllm/third_party/flash_linear_attention/ops/utils.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/utils.py", + "sha256": "d6c90d36505e02086954c23ca4dd2fea82a69416d68ff1d0501e16b3148b5b0c" + }, + "vllm/third_party/flash_linear_attention/ops/wy_fast.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/wy_fast.py", + "sha256": "c9fc8259db0a8746dc04f1d799cb73333457118cf89a0bdce8dde8a80a28cd96" + }, + "vllm/v1/attention/__init__.py": { + "path": "/vllm/v1/attention/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backend.py": { + "path": "/vllm/v1/attention/backend.py", + "sha256": "01ac364372afa75fdb22486aa3a9c7cf9aebb742e3471dfb9e0f9d9d36b734bc" + }, + "vllm/v1/attention/backends/__init__.py": { + "path": "/vllm/v1/attention/backends/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backends/b12x.py": { + "path": "/vllm/v1/attention/backends/b12x.py", + "sha256": "443f0a98738fdfefe5b9ab151d278bfd43a8ac807eb2b0b9b2a13d51922afbf9" + }, + "vllm/v1/attention/backends/composite.py": { + "path": "/vllm/v1/attention/backends/composite.py", + "sha256": "4cf3d66dca891562709eed4f50aa14b0ae6c8240d9ea86504a3304b2f356cce0" + }, + "vllm/v1/attention/backends/cpu_attn.py": { + "path": "/vllm/v1/attention/backends/cpu_attn.py", + "sha256": "76fb02a6bd725125565d84bf04f627cf16da5f7ff8f31f87c01ed6a1439398c7" + }, + "vllm/v1/attention/backends/fa_utils.py": { + "path": "/vllm/v1/attention/backends/fa_utils.py", + "sha256": "08fa6e231d3af3a71a6e59162dd12328aa8beb28548165ae58f130a92adb5a83" + }, + "vllm/v1/attention/backends/flash_attn.py": { + "path": "/vllm/v1/attention/backends/flash_attn.py", + "sha256": "b170a4789e18104c1bee35bea70df51abe6766693d8f4726a59f2e6f5c4282aa" + }, + "vllm/v1/attention/backends/flash_attn_diffkv.py": { + "path": "/vllm/v1/attention/backends/flash_attn_diffkv.py", + "sha256": "e4627c88c3ba8caee260540e994cc8137fd2ff7cd7813356b36387c6c88ce30a" + }, + "vllm/v1/attention/backends/flashinfer.py": { + "path": "/vllm/v1/attention/backends/flashinfer.py", + "sha256": "8ee541fde43ed92a417b3f01ea1e6fc64af8ab2eb54cbfc28308a49aaca4ed7f" + }, + "vllm/v1/attention/backends/flex_attention.py": { + "path": "/vllm/v1/attention/backends/flex_attention.py", + "sha256": "ad07f0ad73aeeadc3534b3a05c14f88a62cb3638874239ae9823c49b36276dc3" + }, + "vllm/v1/attention/backends/gdn_attn.py": { + "path": "/vllm/v1/attention/backends/gdn_attn.py", + "sha256": "3831019404a92200a38b43571c040cffeb6638bbdc71e4cb5e680dbc6c93d054" + }, + "vllm/v1/attention/backends/hpc_attn.py": { + "path": "/vllm/v1/attention/backends/hpc_attn.py", + "sha256": "af9e2aec1b498f0ee48a2dce3cf5646edf1976466980b2fd927c0e82b875427c" + }, + "vllm/v1/attention/backends/linear_attn.py": { + "path": "/vllm/v1/attention/backends/linear_attn.py", + "sha256": "bc42144fcd027434c6a10dc9f4c5f991db8899d387af5f6485402ce097eb0513" + }, + "vllm/v1/attention/backends/mamba1_attn.py": { + "path": "/vllm/v1/attention/backends/mamba1_attn.py", + "sha256": "32159dae11cab3c8c576b9514ad97d5108c8d1b4cac9fcfe345ec6a76223aee7" + }, + "vllm/v1/attention/backends/mamba2_attn.py": { + "path": "/vllm/v1/attention/backends/mamba2_attn.py", + "sha256": "a5bcdecb7b9547137023e1c77a386003358fa940eaf5f319ed142211dcdba139" + }, + "vllm/v1/attention/backends/mamba_attn.py": { + "path": "/vllm/v1/attention/backends/mamba_attn.py", + "sha256": "5e7b2c4058fc5e6096d001bff6c789b78368b025bbe4600f191aaca2ff59b59f" + }, + "vllm/v1/attention/backends/mla/__init__.py": { + "path": "/vllm/v1/attention/backends/mla/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backends/mla/aiter_triton_mla.py": { + "path": "/vllm/v1/attention/backends/mla/aiter_triton_mla.py", + "sha256": "ed0e285cdae06a019150c41cc958b3c0b5ceb0e4f299d5318d1c90e2c2395390" + }, + "vllm/v1/attention/backends/mla/amx_mla.py": { + "path": "/vllm/v1/attention/backends/mla/amx_mla.py", + "sha256": "7f5cddec30b2dfe22ccdbd3b9da673c879719bf6da4074317bd60add55f5d15f" + }, + "vllm/v1/attention/backends/mla/compressor_utils.py": { + "path": "/vllm/v1/attention/backends/mla/compressor_utils.py", + "sha256": "3589e94105368ea285c40b82db1a0332682ff5d071fe363627cf4c0d10f3facf" + }, + "vllm/v1/attention/backends/mla/cpu_mla.py": { + "path": "/vllm/v1/attention/backends/mla/cpu_mla.py", + "sha256": "ff2110b9f78e92adf6bab294465cbc294ae1ff71cb1780fed158179e134a4ca6" + }, + "vllm/v1/attention/backends/mla/cutlass_mla.py": { + "path": "/vllm/v1/attention/backends/mla/cutlass_mla.py", + "sha256": "211d298680f9bd793cc468281b316d6633c5f4eb6dcec71d3329b034a23ab9b5" + }, + "vllm/v1/attention/backends/mla/flashattn_mla.py": { + "path": "/vllm/v1/attention/backends/mla/flashattn_mla.py", + "sha256": "ac89e0ad75a37e92566d264bafe324735a80f9ab4709241a4454d17b3d38bb63" + }, + "vllm/v1/attention/backends/mla/flashattn_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashattn_mla_sparse.py", + "sha256": "67dd3ead2e8b9d8cda0825ecc93779cb7d670628bc741c759a7d3cd5d474030f" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla.py", + "sha256": "0c24ff016fb6b0bb41d9e7484b6f1af42f37bcc384ed613473fc3e01ad25f664" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse.py", + "sha256": "2116d965b2067134d8afa5878d4d16c0149b061258f50c4106d993aa13b073cc" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm120.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm120.py", + "sha256": "102ca08793d567f95598eefeb34c3f6ec50b3b9d704f162d1402b97b12b5777b" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm90.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm90.py", + "sha256": "df9fe4970aa3f53cf24784b8534b89e0101a2ca20a35a2ebbc9a12a4463d5993" + }, + "vllm/v1/attention/backends/mla/flashmla.py": { + "path": "/vllm/v1/attention/backends/mla/flashmla.py", + "sha256": "c9d8046a853ecbdeff9ebfc738f5bb34c4f272b278231a09a0fbf73708c7c188" + }, + "vllm/v1/attention/backends/mla/flashmla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashmla_sparse.py", + "sha256": "7a379c717adb9667ce94cbc16c0e3a1fb22a169713db6d7941c141fa84077b3f" + }, + "vllm/v1/attention/backends/mla/index_group.py": { + "path": "/vllm/v1/attention/backends/mla/index_group.py", + "sha256": "c24e028c3c160a9bb92e043da5b5b34c805e84745b7c4b8da6fb8702a0ddd641" + }, + "vllm/v1/attention/backends/mla/indexer.py": { + "path": "/vllm/v1/attention/backends/mla/indexer.py", + "sha256": "2acbc1c4fa57c3424ad95e6ecbe76eb7141747773c3e867ce704f4adccba892a" + }, + "vllm/v1/attention/backends/mla/prefill/__init__.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/__init__.py", + "sha256": "903630eb705dd175bf4ae4558a4bcaa07c110056b6a11eb830fdd2fb21b3c48a" + }, + "vllm/v1/attention/backends/mla/prefill/aiter_flash_attn.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/aiter_flash_attn.py", + "sha256": "571b8a9910c4ea3fefda60659026f3bf0d7b542c34553c8c9a4d43bb82077e61" + }, + "vllm/v1/attention/backends/mla/prefill/base.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/base.py", + "sha256": "138bf3ddaf5a94c3cdbc4e08ac676edcae84b32fc76625e546f3b47f7d8b82ec" + }, + "vllm/v1/attention/backends/mla/prefill/cpu_sdpa.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/cpu_sdpa.py", + "sha256": "1bb686395274a8ec0d9fd7327410a527655fe060cbbc263eab138fea988d96de" + }, + "vllm/v1/attention/backends/mla/prefill/flash_attn.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/flash_attn.py", + "sha256": "5e648c82c82e5f81fe11458eb82b9f90b50fc06df2ade3bf111ee6b7a2ee8481" + }, + "vllm/v1/attention/backends/mla/prefill/flashinfer.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/flashinfer.py", + "sha256": "63861219c35b8abc0ebe01e1f51543c5ed40bd46119ca261d927da7c6826b49b" + }, + "vllm/v1/attention/backends/mla/prefill/registry.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/registry.py", + "sha256": "c8c30b92213d594beaa3cab4d5003da26a85870dbb11d1ab73191962d0645b53" + }, + "vllm/v1/attention/backends/mla/prefill/selector.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/selector.py", + "sha256": "101d9fca7924b0c5d7891a17fe8942611bd6759e32b03a571dc87b14c1430f2f" + }, + "vllm/v1/attention/backends/mla/prefill/tokenspeed_mla.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/tokenspeed_mla.py", + "sha256": "047cf07bfcc83db3b11a6a54ffe189f6146e6ec9ad33ce2fa7d18860bf4210f0" + }, + "vllm/v1/attention/backends/mla/prefill/trtllm_ragged.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/trtllm_ragged.py", + "sha256": "9e13ea6f6a25accedd918c0de64bbb812ccb20ffb95350ab018a6e76d493789b" + }, + "vllm/v1/attention/backends/mla/rocm_aiter_mla.py": { + "path": "/vllm/v1/attention/backends/mla/rocm_aiter_mla.py", + "sha256": "b489f5830c655bfb6299801a70d69b9821513c69568ecab3689db5a7be867be5" + }, + "vllm/v1/attention/backends/mla/rocm_aiter_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/rocm_aiter_mla_sparse.py", + "sha256": "91b1d9b3d860a9720bc01b8ebe9bbe8649a7d6bca20d4b63939bc100309bca19" + }, + "vllm/v1/attention/backends/mla/sparse_swa.py": { + "path": "/vllm/v1/attention/backends/mla/sparse_swa.py", + "sha256": "a47853ad8a3fe40f24704592581ea323a18041b84610df010a5534da634e311e" + }, + "vllm/v1/attention/backends/mla/sparse_utils.py": { + "path": "/vllm/v1/attention/backends/mla/sparse_utils.py", + "sha256": "c3cdf060288c05542243a9fe8b5ad3a963ad75e9ce399009b5e45c1235a88ce4" + }, + "vllm/v1/attention/backends/mla/tokenspeed_mla.py": { + "path": "/vllm/v1/attention/backends/mla/tokenspeed_mla.py", + "sha256": "b9ba523c606430cecb99a88b28c53d98a99dcf5e76105a80664338110a20f1ad" + }, + "vllm/v1/attention/backends/mla/triton_mla.py": { + "path": "/vllm/v1/attention/backends/mla/triton_mla.py", + "sha256": "21b16b3b34470edcc33d0423e560837c1d37d4bab31c7b3b9cfd7faa47864b51" + }, + "vllm/v1/attention/backends/mla/xpu_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/xpu_mla_sparse.py", + "sha256": "559c6240fe466521a6b2df4c94aea02ddf3f5efa5ba6954fa180c5a51c0f12d2" + }, + "vllm/v1/attention/backends/recoverssm_metadata.py": { + "path": "/vllm/v1/attention/backends/recoverssm_metadata.py", + "sha256": "02896a667db0f0308371ceb50048b18e5866c0235d163c0357e9a05dcedb3394" + }, + "vllm/v1/attention/backends/registry.py": { + "path": "/vllm/v1/attention/backends/registry.py", + "sha256": "378e8ee78734bd8c8adbe287d4c0a4058dcbb553195a09fbcce00a3cc30adc29" + }, + "vllm/v1/attention/backends/rocm_aiter_fa.py": { + "path": "/vllm/v1/attention/backends/rocm_aiter_fa.py", + "sha256": "d1418af03bf58209c850f466b712d3ea22a14ebb758c42dd43e65738281841fd" + }, + "vllm/v1/attention/backends/rocm_aiter_unified_attn.py": { + "path": "/vllm/v1/attention/backends/rocm_aiter_unified_attn.py", + "sha256": "59d2645eb4c91dc0567754a7163d066f4f2faf48f1957b254fcdd5604e9d8c8c" + }, + "vllm/v1/attention/backends/rocm_attn.py": { + "path": "/vllm/v1/attention/backends/rocm_attn.py", + "sha256": "4a8f57067073fbceb784af6c3467487c450d00fa3957928fadb99a79f6036292" + }, + "vllm/v1/attention/backends/short_conv_attn.py": { + "path": "/vllm/v1/attention/backends/short_conv_attn.py", + "sha256": "84fc460ef2fbd09743b069bec0c14b39542af6c2254a403e37a048427e151121" + }, + "vllm/v1/attention/backends/triton_attn.py": { + "path": "/vllm/v1/attention/backends/triton_attn.py", + "sha256": "1057663d110e1d5229495a799027b27277c1eca325d5b6780fa2259afbf58a1a" + }, + "vllm/v1/attention/backends/triton_attn_diffkv.py": { + "path": "/vllm/v1/attention/backends/triton_attn_diffkv.py", + "sha256": "de0357eae005246642140f1ab8842ba5ed8bff5c84b18a6d3a7bbf409c578301" + }, + "vllm/v1/attention/backends/triton_flash_attn.py": { + "path": "/vllm/v1/attention/backends/triton_flash_attn.py", + "sha256": "176e45329aeb28a2008362bb607d1b8c89816eb665859ab908b0385a11acf1c2" + }, + "vllm/v1/attention/backends/triton_flashinfer.py": { + "path": "/vllm/v1/attention/backends/triton_flashinfer.py", + "sha256": "48d5f967e388d4e8d6bbec8d827b44d855346bc2fada28adf65768bf6623527b" + }, + "vllm/v1/attention/backends/turboquant_attn.py": { + "path": "/vllm/v1/attention/backends/turboquant_attn.py", + "sha256": "616d16d608d9d1fbf6c29548037e7e9cf330f4d36a01aa3ffabf42a731eb6e2b" + }, + "vllm/v1/attention/backends/utils.py": { + "path": "/vllm/v1/attention/backends/utils.py", + "sha256": "fbc221360d2d54cb21ef3f625dc8711500de345a355801548b4337bb9b8abee0" + }, + "vllm/v1/attention/ops/__init__.py": { + "path": "/vllm/v1/attention/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/ops/chunked_prefill_paged_decode.py": { + "path": "/vllm/v1/attention/ops/chunked_prefill_paged_decode.py", + "sha256": "973db848a790b2e8d99e728b2fc4f44b501bbe58c62747244ddff04cfcf11a85" + }, + "vllm/v1/attention/ops/common.py": { + "path": "/vllm/v1/attention/ops/common.py", + "sha256": "b4b67e7fc0cce471e337d742c097fba06da7563816e8799e27719714e31e1d5b" + }, + "vllm/v1/attention/ops/cp_common.py": { + "path": "/vllm/v1/attention/ops/cp_common.py", + "sha256": "2369181862e96db64b14ef20c5c2e249ed2ea5f3dea2467a2aa388372bb86d9d" + }, + "vllm/v1/attention/ops/dcp.py": { + "path": "/vllm/v1/attention/ops/dcp.py", + "sha256": "a478bdc781460f0582cfaf74d6431f1a826c201f02f39d882d12a96139bc3f28" + }, + "vllm/v1/attention/ops/flashmla.py": { + "path": "/vllm/v1/attention/ops/flashmla.py", + "sha256": "8a40d6e120e3ab25a95fcfeb32b0b5b4c1ea02b984633866628536dcd26ed2e8" + }, + "vllm/v1/attention/ops/flydsl_kernels/__init__.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/attention/ops/flydsl_kernels/tq_decode.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/tq_decode.py", + "sha256": "cc4b7f82897596e0974b3d3a710a1a8bc58c3d22b72cc7f461dd1c4acd2e451b" + }, + "vllm/v1/attention/ops/flydsl_kernels/tq_decode_gqa6.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/tq_decode_gqa6.py", + "sha256": "a983f6d375c325900955e11696dab1e2665770e83f84d51f93d3ed5e1d8880e0" + }, + "vllm/v1/attention/ops/flydsl_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/flydsl_turboquant_decode.py", + "sha256": "7b1dd0ef7c7fb28a6a8831759e00b939ab844d067657155cc11cf75532a22c63" + }, + "vllm/v1/attention/ops/int4_per_token_head.py": { + "path": "/vllm/v1/attention/ops/int4_per_token_head.py", + "sha256": "d91968f280cd8eaed7570ab255f0276b40e833e18a25066d371d9ca8149425f2" + }, + "vllm/v1/attention/ops/merge_attn_states.py": { + "path": "/vllm/v1/attention/ops/merge_attn_states.py", + "sha256": "ad08403d2843fc892f0b0b4b9f5fabb81884556f89f7170dca46ccef498a3539" + }, + "vllm/v1/attention/ops/metadata.py": { + "path": "/vllm/v1/attention/ops/metadata.py", + "sha256": "ca882b84c5aaefb1f77e4d8ea09a00103fbc53defa8671bba036c961c17fc760" + }, + "vllm/v1/attention/ops/paged_attn.py": { + "path": "/vllm/v1/attention/ops/paged_attn.py", + "sha256": "016a95f892ec751c86b37be1e12171bad9f0b4076bbf2219ff336f4e9c503653" + }, + "vllm/v1/attention/ops/pcp.py": { + "path": "/vllm/v1/attention/ops/pcp.py", + "sha256": "dadeff95fe2df2be8028baabeef01b0d2d628cd67de2176915e737ce096de3dd" + }, + "vllm/v1/attention/ops/prefix_prefill.py": { + "path": "/vllm/v1/attention/ops/prefix_prefill.py", + "sha256": "b08ad92db715fc03c11699de3de463d55e411f42f77548e06b41049a61de692f" + }, + "vllm/v1/attention/ops/rocm_aiter_mla_merge.py": { + "path": "/vllm/v1/attention/ops/rocm_aiter_mla_merge.py", + "sha256": "564c66e4877732e48a6f7d52405c43dc952eec0f0ae4353d34886bca056132b9" + }, + "vllm/v1/attention/ops/rocm_aiter_mla_sparse.py": { + "path": "/vllm/v1/attention/ops/rocm_aiter_mla_sparse.py", + "sha256": "feec664be5045fd1ba13b8f6ef83b52c96910ddc78baca0431bcf610c9e8f5cc" + }, + "vllm/v1/attention/ops/triton_attention_helpers.py": { + "path": "/vllm/v1/attention/ops/triton_attention_helpers.py", + "sha256": "35aa993d01345f535d2641cf9dcabb8b64c51b20a19707bc5987e616aaa87ddd" + }, + "vllm/v1/attention/ops/triton_decode_attention.py": { + "path": "/vllm/v1/attention/ops/triton_decode_attention.py", + "sha256": "b9823c65eba22d76abf64dad7d7d16a950f67471c86d6cb5b3e983aaf14381ac" + }, + "vllm/v1/attention/ops/triton_merge_attn_states.py": { + "path": "/vllm/v1/attention/ops/triton_merge_attn_states.py", + "sha256": "f63229162181ab93198550b73a115f1cc1034cfd60e6f58bc8ab3e22a6e8ce60" + }, + "vllm/v1/attention/ops/triton_prefill_attention.py": { + "path": "/vllm/v1/attention/ops/triton_prefill_attention.py", + "sha256": "352c1a4ac86146580040579fb217c2e288268830d6602b735713e154f36d74fe" + }, + "vllm/v1/attention/ops/triton_reshape_and_cache_flash.py": { + "path": "/vllm/v1/attention/ops/triton_reshape_and_cache_flash.py", + "sha256": "6cac51475b8c656992a21b2d150acd3a16a95a7ab7d49aab151a3ef13c24b80d" + }, + "vllm/v1/attention/ops/triton_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/triton_turboquant_decode.py", + "sha256": "8e52678136449e4bbca2195fbcbb87426c955a2b1b8422e7ab9511e45ee5f5c6" + }, + "vllm/v1/attention/ops/triton_turboquant_store.py": { + "path": "/vllm/v1/attention/ops/triton_turboquant_store.py", + "sha256": "6e6e2fe74a307d40f0be786ccbaea76d989e3c7b5985f3144a5218c61bf6d902" + }, + "vllm/v1/attention/ops/triton_unified_attention.py": { + "path": "/vllm/v1/attention/ops/triton_unified_attention.py", + "sha256": "65d0fbcf33d00789df8ca688c0a1c908e710cfaef53471178747ecae11f05829" + }, + "vllm/v1/attention/ops/triton_unified_attention_diffkv.py": { + "path": "/vllm/v1/attention/ops/triton_unified_attention_diffkv.py", + "sha256": "7fa36d7b7441f1c396e0348eac61d691d2e459e5c4c393c4aa262dfb670e68f7" + }, + "vllm/v1/attention/ops/turboquant_soa/__init__.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/__init__.py", + "sha256": "6b43b6fcb2a71c44ceff4ed1edd417a839f4901251ba15831b09ad979baa4984" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode.py", + "sha256": "bf00634191bba14cbf4a23c1d67dc3dcb244c2b8989f08362757b54435830986" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode_v2.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode_v2.py", + "sha256": "28e7ecc15c450d3591983a50c46a03aa6ca6fa99304c17c333940617d9916485" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_store.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_store.py", + "sha256": "dccf93b9fdd34f9b9eacd468e9de35b9d93378594487c335cf50642aaec681f2" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_unified_attention.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_unified_attention.py", + "sha256": "b4b2b5f3985b3a6126fd052e6ec1ed91c610da8a525a9ae7470ac829405bd85c" + }, + "vllm/v1/attention/ops/vit_attn_wrappers.py": { + "path": "/vllm/v1/attention/ops/vit_attn_wrappers.py", + "sha256": "a99d57b58269c7521fa5d7d47af06551f3bab2b5c7358ef78165a7f6e20a92a6" + }, + "vllm/v1/attention/ops/xpu_mla_sparse.py": { + "path": "/vllm/v1/attention/ops/xpu_mla_sparse.py", + "sha256": "d98d17110577c2b7b4d05e07bfdae15faf83321b6342a5daaaecce45b9503f38" + }, + "vllm/v1/attention/selector.py": { + "path": "/vllm/v1/attention/selector.py", + "sha256": "87f653ded7974875183c920e3e4589c28116bcbc99714d1da7cb51ae77c0b182" + }, + "vllm/v1/core/sched/__init__.py": { + "path": "/vllm/v1/core/sched/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/core/sched/async_scheduler.py": { + "path": "/vllm/v1/core/sched/async_scheduler.py", + "sha256": "e586a0ef3c6778be56a93e7f9bb712d4de9de6e7d7fe7e3e1d51dae83ecfc508" + }, + "vllm/v1/core/sched/interface.py": { + "path": "/vllm/v1/core/sched/interface.py", + "sha256": "be6c008664096c5660a8879de72b315bbe479bf1d688be9b25891063ec53a367" + }, + "vllm/v1/core/sched/output.py": { + "path": "/vllm/v1/core/sched/output.py", + "sha256": "3a66c8efaefe10c572f6f33cf1f8aa4610758c945130cad62eb9f7331005677c" + }, + "vllm/v1/core/sched/request_queue.py": { + "path": "/vllm/v1/core/sched/request_queue.py", + "sha256": "4b8d938e5fb8152fe61030b8aa991f983fcac9a405c37ed8908045e05e82ae5e" + }, + "vllm/v1/core/sched/scheduler.py": { + "path": "/vllm/v1/core/sched/scheduler.py", + "sha256": "c1db45f3bbad3a875dd8638331b8870c4380ac1ab4734265ba5c863833a82884" + }, + "vllm/v1/core/sched/utils.py": { + "path": "/vllm/v1/core/sched/utils.py", + "sha256": "1ed988044eb8028c77ede875bd1a5fd05ff6998b455d61e3997d6a3d7fc1c3a7" + }, + "vllm/v1/sample/__init__.py": { + "path": "/vllm/v1/sample/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/sample/logits_processor/__init__.py": { + "path": "/vllm/v1/sample/logits_processor/__init__.py", + "sha256": "1f9b02dae8cf6d44484638037123d3a2dec6b7b9a2bcc9afceef1a9bf3eaedec" + }, + "vllm/v1/sample/logits_processor/builtin.py": { + "path": "/vllm/v1/sample/logits_processor/builtin.py", + "sha256": "6105816ece77e5b1dbee0d07abc90ce039d650bac2ddb85c93280c48b00f2ebe" + }, + "vllm/v1/sample/logits_processor/interface.py": { + "path": "/vllm/v1/sample/logits_processor/interface.py", + "sha256": "171dfc6ef9b5b53128e8eaecc4bdf1de413a706d64bf5be686048f583c66eee1" + }, + "vllm/v1/sample/logits_processor/state.py": { + "path": "/vllm/v1/sample/logits_processor/state.py", + "sha256": "a96411f14362c45f839e181dcb3ac01d5b880812bccb3552fc17863b219f44ac" + }, + "vllm/v1/sample/metadata.py": { + "path": "/vllm/v1/sample/metadata.py", + "sha256": "6582cfe1a240c7ddb975f0ef6dd7dcd28dcf0fc7670394390250013977aa7ffd" + }, + "vllm/v1/sample/ops/__init__.py": { + "path": "/vllm/v1/sample/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/sample/ops/bad_words.py": { + "path": "/vllm/v1/sample/ops/bad_words.py", + "sha256": "0b1d0a9b13b92ddcae2c83393c07a34c0f107813725700dee794caa7fe7f3b12" + }, + "vllm/v1/sample/ops/logprobs.py": { + "path": "/vllm/v1/sample/ops/logprobs.py", + "sha256": "b286f69012a6758bfe9250038b0697294dbffe0d32c6906f284c39f75ee48be3" + }, + "vllm/v1/sample/ops/penalties.py": { + "path": "/vllm/v1/sample/ops/penalties.py", + "sha256": "4debfcf247b3887478d2b9ec98f108756bbed2805462777ef6b56f3bdf4ce682" + }, + "vllm/v1/sample/ops/topk_topp_sampler.py": { + "path": "/vllm/v1/sample/ops/topk_topp_sampler.py", + "sha256": "13ea4359832bc914492330958ec4f5ac140f408b8f410cc05c6eaf7ddcd70be4" + }, + "vllm/v1/sample/ops/topk_topp_triton.py": { + "path": "/vllm/v1/sample/ops/topk_topp_triton.py", + "sha256": "0b5fc337058e22bc28a8530ccec904d6ccd89b9548b02955c657ac429b1669d2" + }, + "vllm/v1/sample/rejection_sampler.py": { + "path": "/vllm/v1/sample/rejection_sampler.py", + "sha256": "0bb9d224887ccb1355e16199005cc23a4afc6fa75156eca419851b7247d99750" + }, + "vllm/v1/sample/sampler.py": { + "path": "/vllm/v1/sample/sampler.py", + "sha256": "f95805b2c6d06218c724826aa5f881a606e8d0a534a566aee7c85948520dd216" + }, + "vllm/v1/sample/thinking_budget_state.py": { + "path": "/vllm/v1/sample/thinking_budget_state.py", + "sha256": "962f8f55210eb0a431cb9c78b013e35f7a7dd58d06d6fb2e7fcff1b457356f8e" + }, + "vllm/v1/worker/__init__.py": { + "path": "/vllm/v1/worker/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/block_table.py": { + "path": "/vllm/v1/worker/block_table.py", + "sha256": "a09b8819e1417b7a186cf3472224e2138fc5d41a291c6692bb7df711b0c44259" + }, + "vllm/v1/worker/cp_utils.py": { + "path": "/vllm/v1/worker/cp_utils.py", + "sha256": "e32625d83a641b8dd8df82e92d1b6fb20af0cdf2e8fbd2fb131aa3c215415448" + }, + "vllm/v1/worker/cpu/__init__.py": { + "path": "/vllm/v1/worker/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/cpu/buffer_utils.py": { + "path": "/vllm/v1/worker/cpu/buffer_utils.py", + "sha256": "e7313fd8c2c76ebfb98d2fa53008bc9691d0f83a7d7c05e87602b5a29fb79e04" + }, + "vllm/v1/worker/cpu/model_runner.py": { + "path": "/vllm/v1/worker/cpu/model_runner.py", + "sha256": "24a1c916550051327dd5893243a6d4200f3824b91b3af8aa6f6c793fd7c68c3e" + }, + "vllm/v1/worker/cpu/shm.py": { + "path": "/vllm/v1/worker/cpu/shm.py", + "sha256": "08491af8ad341399d1375f2d21ad00414d4c89b0a5c03f55de8704914bbfcbd9" + }, + "vllm/v1/worker/cpu_model_runner.py": { + "path": "/vllm/v1/worker/cpu_model_runner.py", + "sha256": "92111aba92f00571f1a3c4c6e43cf1da6ccb4d2afac2f4d5abc018a4a6e7e8bd" + }, + "vllm/v1/worker/cpu_worker.py": { + "path": "/vllm/v1/worker/cpu_worker.py", + "sha256": "a8051b9e510ef0af9cc34004f2cbe5c0f902bd0cebc32c9464e744344dfdf849" + }, + "vllm/v1/worker/dp_utils.py": { + "path": "/vllm/v1/worker/dp_utils.py", + "sha256": "8cd19f1bfbc5c4f6ec60df89aea7c8a19b400ebc264f372b103014152e92158c" + }, + "vllm/v1/worker/ec_connector_model_runner_mixin.py": { + "path": "/vllm/v1/worker/ec_connector_model_runner_mixin.py", + "sha256": "fe9b11cebb8562f1bfe98b98a5647b2b081a6e424cb60d4ffe2412c91a99215e" + }, + "vllm/v1/worker/encoder_cudagraph.py": { + "path": "/vllm/v1/worker/encoder_cudagraph.py", + "sha256": "6a08d3779bca1b47dbf9daf6eafe2d3c70dbcb8aeb7d63ba7efacc68241ee3bc" + }, + "vllm/v1/worker/encoder_cudagraph_defs.py": { + "path": "/vllm/v1/worker/encoder_cudagraph_defs.py", + "sha256": "bb7be050fcaa8868e7816c84caec875da57050d65fe7eaf00f3d41473df25e3a" + }, + "vllm/v1/worker/gpu/__init__.py": { + "path": "/vllm/v1/worker/gpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/async_utils.py": { + "path": "/vllm/v1/worker/gpu/async_utils.py", + "sha256": "77e17a4570ead2be30ae9b00888cf077a3b873018c12ca0549b853bfda02c1ba" + }, + "vllm/v1/worker/gpu/attn_utils.py": { + "path": "/vllm/v1/worker/gpu/attn_utils.py", + "sha256": "b9b81e59dda2720b1f9c434471381f879228832443e52756e469b4ad4905888f" + }, + "vllm/v1/worker/gpu/block_table.py": { + "path": "/vllm/v1/worker/gpu/block_table.py", + "sha256": "61c004315d5af7e7eae4e2a9e6be92ea82c520327690a7f55a73bb9ce95f520a" + }, + "vllm/v1/worker/gpu/buffer_utils.py": { + "path": "/vllm/v1/worker/gpu/buffer_utils.py", + "sha256": "6597f701a30261bf250e9ad5a29737264624a1caa20527aeea0dad630325b093" + }, + "vllm/v1/worker/gpu/cp_utils.py": { + "path": "/vllm/v1/worker/gpu/cp_utils.py", + "sha256": "456c1bb7e262d99ff555522a4f134e5a9b42aee23290be25455eaef36ee8eaaf" + }, + "vllm/v1/worker/gpu/cudagraph_utils.py": { + "path": "/vllm/v1/worker/gpu/cudagraph_utils.py", + "sha256": "6e9c042890603535e300a40df8ee159dbed1058a64a83ae50ff0329e332e05ff" + }, + "vllm/v1/worker/gpu/dp_utils.py": { + "path": "/vllm/v1/worker/gpu/dp_utils.py", + "sha256": "e26867bc89e6bfc933cabc5ed13e5dc7b8d2d3030118ca1ca64c8785dabc0fc1" + }, + "vllm/v1/worker/gpu/ec_connector.py": { + "path": "/vllm/v1/worker/gpu/ec_connector.py", + "sha256": "2afe6e641f4ae3eb3b8da336c74eaa7479bf617b27cfb39a1fcbe487686f0a08" + }, + "vllm/v1/worker/gpu/eplb_utils.py": { + "path": "/vllm/v1/worker/gpu/eplb_utils.py", + "sha256": "1829fac11464aed4649179b302df198de51b95d0589f4e56bea305a876a63e26" + }, + "vllm/v1/worker/gpu/input_batch.py": { + "path": "/vllm/v1/worker/gpu/input_batch.py", + "sha256": "d5dd956eb319bd69dd9e762047833d81ad40b21fce619fcb2133759e73620694" + }, + "vllm/v1/worker/gpu/kv_connector.py": { + "path": "/vllm/v1/worker/gpu/kv_connector.py", + "sha256": "b89a4333f1e552d86e1815674b59e9f1335f0f49c0a7b46082439076f62c6a81" + }, + "vllm/v1/worker/gpu/lora_utils.py": { + "path": "/vllm/v1/worker/gpu/lora_utils.py", + "sha256": "1e90eddd9ddb4ca55e574bb28e87ae3a6f6750175a62d373102426543f4ccd66" + }, + "vllm/v1/worker/gpu/metrics/__init__.py": { + "path": "/vllm/v1/worker/gpu/metrics/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/metrics/logits.py": { + "path": "/vllm/v1/worker/gpu/metrics/logits.py", + "sha256": "ea058d7510a077a55f8ac7e4c3d596508346244e908cb372865d7159f62edc89" + }, + "vllm/v1/worker/gpu/mm/__init__.py": { + "path": "/vllm/v1/worker/gpu/mm/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/mm/encoder_cache.py": { + "path": "/vllm/v1/worker/gpu/mm/encoder_cache.py", + "sha256": "89c500338fddbeee7c4fca978a3a7c4c566a03e848e399d303fbee3c80631cd2" + }, + "vllm/v1/worker/gpu/mm/encoder_runner.py": { + "path": "/vllm/v1/worker/gpu/mm/encoder_runner.py", + "sha256": "0981e352d70301b7154a217a48665ffe35f215d053ec5740c2515a3e1e11b4e6" + }, + "vllm/v1/worker/gpu/mm/lora.py": { + "path": "/vllm/v1/worker/gpu/mm/lora.py", + "sha256": "a3eddfad6ad64de276964240c28dc080888df4a56dd5eac18f89428f2cbb7a01" + }, + "vllm/v1/worker/gpu/mm/rope.py": { + "path": "/vllm/v1/worker/gpu/mm/rope.py", + "sha256": "0924375bcb367267e783b57dd2ad9de1189d97025ce4313baaa54f2911eaaf1e" + }, + "vllm/v1/worker/gpu/model_runner.py": { + "path": "/vllm/v1/worker/gpu/model_runner.py", + "sha256": "174c93db921c23cf0396eee4764be25b2bd2d4b6a06e9fa41ce3598b884ce8ce" + }, + "vllm/v1/worker/gpu/model_states/__init__.py": { + "path": "/vllm/v1/worker/gpu/model_states/__init__.py", + "sha256": "07815d0b788fc88185772f581bbf892a675259f9288375571f29887622f8d93c" + }, + "vllm/v1/worker/gpu/model_states/default.py": { + "path": "/vllm/v1/worker/gpu/model_states/default.py", + "sha256": "bb614f814780f052e869f9acf31dfbfa68718ee7dc6252eefa901b5730ee8a2a" + }, + "vllm/v1/worker/gpu/model_states/encoder_decoder.py": { + "path": "/vllm/v1/worker/gpu/model_states/encoder_decoder.py", + "sha256": "a5868059d8af672548b41d0e623e884320e6ed61e6aaca2d2828ff5be0356f2f" + }, + "vllm/v1/worker/gpu/model_states/encoder_only.py": { + "path": "/vllm/v1/worker/gpu/model_states/encoder_only.py", + "sha256": "84e96b55a2639e2a73fa4a0308acc89c8d053dc715481180b237e0196dcef99f" + }, + "vllm/v1/worker/gpu/model_states/interface.py": { + "path": "/vllm/v1/worker/gpu/model_states/interface.py", + "sha256": "5675b6fedc7403a9ab410b1e5565974e78fac23c42ab4253ae1da52d6e09b594" + }, + "vllm/v1/worker/gpu/model_states/mamba_hybrid.py": { + "path": "/vllm/v1/worker/gpu/model_states/mamba_hybrid.py", + "sha256": "573e130ac5587d4822fabf97adad1ad0fda02ff83c5e70df879a5bb175ae845c" + }, + "vllm/v1/worker/gpu/model_states/mm_pruning.py": { + "path": "/vllm/v1/worker/gpu/model_states/mm_pruning.py", + "sha256": "b150940b12ae76048f050a8eeb54d532bbdc530a18ffbf320ddeeb0cfaa90f93" + }, + "vllm/v1/worker/gpu/model_states/prompt_embeds.py": { + "path": "/vllm/v1/worker/gpu/model_states/prompt_embeds.py", + "sha256": "11f9e270925c2df6a505557605ac2b859bb145cf3420b0111e7482a1c544f9b1" + }, + "vllm/v1/worker/gpu/model_states/recoverssm.py": { + "path": "/vllm/v1/worker/gpu/model_states/recoverssm.py", + "sha256": "b4b660e62eaf33f4fe8271f83ed1fb6de6bc08f800a8073b27803e42fb29a645" + }, + "vllm/v1/worker/gpu/pcp_manager.py": { + "path": "/vllm/v1/worker/gpu/pcp_manager.py", + "sha256": "2d80df0ed5b18a2069f9d0689cb59923ffe324ba200fcafe242da23da3a6ddaa" + }, + "vllm/v1/worker/gpu/pool/__init__.py": { + "path": "/vllm/v1/worker/gpu/pool/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/pool/pooling_runner.py": { + "path": "/vllm/v1/worker/gpu/pool/pooling_runner.py", + "sha256": "f8463f7648cce0f3f29418a4d9fee61634ead760957cf236d06d61cf8cd986e7" + }, + "vllm/v1/worker/gpu/pp_utils.py": { + "path": "/vllm/v1/worker/gpu/pp_utils.py", + "sha256": "dadeef0bebf61d0ad44a28d06372208ec4e6389224d6017f412683b026bdbb5c" + }, + "vllm/v1/worker/gpu/sample/__init__.py": { + "path": "/vllm/v1/worker/gpu/sample/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/sample/bad_words.py": { + "path": "/vllm/v1/worker/gpu/sample/bad_words.py", + "sha256": "8d3cbd5613398260314d94739d8ee0e1ac0c22abf2f960f541d3c0d4e39d360b" + }, + "vllm/v1/worker/gpu/sample/batch_shard.py": { + "path": "/vllm/v1/worker/gpu/sample/batch_shard.py", + "sha256": "c30274a3a04e6a03e89be9cd7c62de602b1aba4d412f64540ab6201036de3928" + }, + "vllm/v1/worker/gpu/sample/gumbel.py": { + "path": "/vllm/v1/worker/gpu/sample/gumbel.py", + "sha256": "3ec1df510bdad13e8b0a457b5b67c98affdf6e57369e56cb471246cc8f40dd34" + }, + "vllm/v1/worker/gpu/sample/logit_bias.py": { + "path": "/vllm/v1/worker/gpu/sample/logit_bias.py", + "sha256": "9e80a3fe6f3c7474723408cfff52183f4585fdeedd9c2312843ee98d0b12724c" + }, + "vllm/v1/worker/gpu/sample/logprob.py": { + "path": "/vllm/v1/worker/gpu/sample/logprob.py", + "sha256": "f47479a818192acb6b297c79fa67a3b2f9820e3492a394d5adda777e9b7c832e" + }, + "vllm/v1/worker/gpu/sample/min_p.py": { + "path": "/vllm/v1/worker/gpu/sample/min_p.py", + "sha256": "4cb5e2f45e1ced6f9685283a7a5c8cfd7204d9a249822e866cfff756c7f04f62" + }, + "vllm/v1/worker/gpu/sample/output.py": { + "path": "/vllm/v1/worker/gpu/sample/output.py", + "sha256": "d6e298c0f197d487a8faaf7200f500fa83df1d7a4bbf4339cadd6a18008f7f9c" + }, + "vllm/v1/worker/gpu/sample/penalties.py": { + "path": "/vllm/v1/worker/gpu/sample/penalties.py", + "sha256": "46c29434caf5f415129ef4a9bb2b8d4f62d2765596e3e07f73ad2b198c7def1b" + }, + "vllm/v1/worker/gpu/sample/prompt_logprob.py": { + "path": "/vllm/v1/worker/gpu/sample/prompt_logprob.py", + "sha256": "4cf22d390e7bf59e44c458cff7180268db63e95d06af2f1e14d720a2d77c9663" + }, + "vllm/v1/worker/gpu/sample/sampler.py": { + "path": "/vllm/v1/worker/gpu/sample/sampler.py", + "sha256": "832c9945d201a1e730ff9b4b52076aa83bd4a5064e1e4cfea952cf84d4a8d1f0" + }, + "vllm/v1/worker/gpu/sample/states.py": { + "path": "/vllm/v1/worker/gpu/sample/states.py", + "sha256": "4e3671f93695ba5a48fad7d2d13beb231ac8741034904ed5a15d9f7b9b86662e" + }, + "vllm/v1/worker/gpu/sample/thinking_budget.py": { + "path": "/vllm/v1/worker/gpu/sample/thinking_budget.py", + "sha256": "020513e1d3406f367de6ad995a95055008fd0c28f2873647e8283c9870e22404" + }, + "vllm/v1/worker/gpu/sample/trace_replay.py": { + "path": "/vllm/v1/worker/gpu/sample/trace_replay.py", + "sha256": "d2a7d3b3b55379efabe4740a4b7f14030126dc11be36f6ea974164ce42316a50" + }, + "vllm/v1/worker/gpu/sample/watermark.py": { + "path": "/vllm/v1/worker/gpu/sample/watermark.py", + "sha256": "a3581458169dab9153eb09fd67218e0ee5585406537a9de80ad528ae62b030c0" + }, + "vllm/v1/worker/gpu/shutdown.py": { + "path": "/vllm/v1/worker/gpu/shutdown.py", + "sha256": "bb470f14b17c7e52571ef8938b2a9527e7c2846852ae8a3a94b69cd1c30aa4b1" + }, + "vllm/v1/worker/gpu/spec_decode/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/__init__.py", + "sha256": "1f1f84bfe6f4f5af3a7e21a7a8716ecf7b9013da1d03327668a3ee36afc24c32" + }, + "vllm/v1/worker/gpu/spec_decode/acceptance_estimator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/acceptance_estimator.py", + "sha256": "505b843bdd75928b03793b395b47b8be914bd7fe2a3351c8ec04339baeebb1c2" + }, + "vllm/v1/worker/gpu/spec_decode/adaptive_verification.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/adaptive_verification.py", + "sha256": "276b2fec56758a94c71b717f6786b8a6f126db2e20cf964350202feee61a0a39" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py", + "sha256": "13392ef0a9ed59eb9c2b2bad43d7c61beb212a8805849e46b5130c230275d0a5" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/speculator.py", + "sha256": "5b97f54e20ddf65b98e939832d050745f67ef43cfa145786da300f1a8322e3c6" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/cudagraph.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/cudagraph.py", + "sha256": "beab567ae2df6a2ba2cd92fe7ee452c6b959b8a7037a4b5f493993a1824619bb" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/speculator.py", + "sha256": "f9c100f42f9326e48eb84e89281897e859ba761943f54d593523555ccd98dc63" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/utils.py", + "sha256": "53d2c3ad474d290d2c6df027446bbd80ac7447684e5242ab2c3c5337d2abd383" + }, + "vllm/v1/worker/gpu/spec_decode/dflash2/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash2/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/dflash2/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash2/speculator.py", + "sha256": "b70043550938a1df9aecc85d8c8224c38c929ca34f68834572f6e723854d2027" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/speculator.py", + "sha256": "dcf4abdedbd2bddd0d76be198ccf5b4e467c46f645038c35fcab821491a35b03" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/utils.py", + "sha256": "86af2bf30604a184312e8f076097b91ecfec704f409f9d68d634b03d6b318070" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/eagle3_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/eagle3_utils.py", + "sha256": "201ee875fcc3d076a8fc1f3876dcbf85736b221a368555243a8987ff26a1674e" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/speculator.py", + "sha256": "746e318a4f266d75522ff7f3731ea9b4527b7b4824f71364d1a62184ea1f7b3d" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/utils.py", + "sha256": "94de6f55a1761f24f4aa1388cbc3b3763d4ab3ee53260330056ad31ce0b78236" + }, + "vllm/v1/worker/gpu/spec_decode/extract_hidden_states.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/extract_hidden_states.py", + "sha256": "93c4233be7b2d2290b33902ea9b3bb5274c11701830851d03967a22144536e2d" + }, + "vllm/v1/worker/gpu/spec_decode/gemma4/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/gemma4/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/gemma4/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/gemma4/speculator.py", + "sha256": "9991210d7babd2caf2cd10797ca8688543dedeafbc3b86bc7c979c1a6ae9f949" + }, + "vllm/v1/worker/gpu/spec_decode/mtp/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/mtp/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/mtp/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/mtp/speculator.py", + "sha256": "926d6c9ffdb368c971647911a60493820d056ce236fcae9d94a42fa2e006255d" + }, + "vllm/v1/worker/gpu/spec_decode/multi_module_mtp/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/multi_module_mtp/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/multi_module_mtp/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/multi_module_mtp/speculator.py", + "sha256": "d9d4735b9b33829332b0e845b6d3073b2f0436045ed693b25c6434f351644127" + }, + "vllm/v1/worker/gpu/spec_decode/rejection_sampler.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/rejection_sampler.py", + "sha256": "030db5bfca162cc1f305112f299de5d6d61c59d3ed0807fee46575441ca4086d" + }, + "vllm/v1/worker/gpu/spec_decode/rejection_sampler_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/rejection_sampler_utils.py", + "sha256": "214b61fa0abe88573beb779872c035b3954e5651a85bd438d99ee5905d3a62ec" + }, + "vllm/v1/worker/gpu/spec_decode/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/speculator.py", + "sha256": "3a1ab15bf8b20918852eb835fe9755046e99dcbac6ba6ca3d414949fc8bc695a" + }, + "vllm/v1/worker/gpu/spec_decode/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/utils.py", + "sha256": "282f2929eddae9ca7312269f799be07472334b6df9fd91878b5e839ec05e418c" + }, + "vllm/v1/worker/gpu/states.py": { + "path": "/vllm/v1/worker/gpu/states.py", + "sha256": "99418f5df43ca612ded72609fee011620b065b2cab2f249ccb387096bf4ae71a" + }, + "vllm/v1/worker/gpu/structured_outputs.py": { + "path": "/vllm/v1/worker/gpu/structured_outputs.py", + "sha256": "18a10532db7e66b55e334acacd1fd989ad6361adf31dd0de9a9a65e23db25951" + }, + "vllm/v1/worker/gpu/ubatch_utils.py": { + "path": "/vllm/v1/worker/gpu/ubatch_utils.py", + "sha256": "5092e2e58af0561c8dc12e62847cfc6dda9ca20dfbd33e7f0cd77a83fe87f7c5" + }, + "vllm/v1/worker/gpu/warmup.py": { + "path": "/vllm/v1/worker/gpu/warmup.py", + "sha256": "423ac32d58fe008c228cfa223e4fcebfcf87e3463a9dbdf80a083c0578d73723" + }, + "vllm/v1/worker/gpu_input_batch.py": { + "path": "/vllm/v1/worker/gpu_input_batch.py", + "sha256": "18cf455c9d0eea61cc581c7932f2e6cd09786914e82dd35eef1c1430da359a0f" + }, + "vllm/v1/worker/gpu_model_runner.py": { + "path": "/vllm/v1/worker/gpu_model_runner.py", + "sha256": "87c29d08c0bbf66993d8b984811e7325e35e6436242a773feb55ec88f16b2c51" + }, + "vllm/v1/worker/gpu_ubatch_wrapper.py": { + "path": "/vllm/v1/worker/gpu_ubatch_wrapper.py", + "sha256": "4233cfbe8c9884b042c4363890108f616483b694ebe9a6e69578dcf89c6dac5c" + }, + "vllm/v1/worker/gpu_worker.py": { + "path": "/vllm/v1/worker/gpu_worker.py", + "sha256": "6994436e4547c0996ab555b3e814e8ccea26b650dfc1b378b97d640745309347" + }, + "vllm/v1/worker/kv_connector_model_runner_mixin.py": { + "path": "/vllm/v1/worker/kv_connector_model_runner_mixin.py", + "sha256": "e1cc76d065a7e60aacddb190ae795a480b65cd02ba71a1fc699a02a85c1a3de2" + }, + "vllm/v1/worker/lora_model_runner_mixin.py": { + "path": "/vllm/v1/worker/lora_model_runner_mixin.py", + "sha256": "fef6092a15d8d37f6fa22495e6106e2e5280180908d61ce43d9ff5bf4eef3f2f" + }, + "vllm/v1/worker/mamba_utils.py": { + "path": "/vllm/v1/worker/mamba_utils.py", + "sha256": "23fdaa4e8f63ee8f938eaa1a2b39f803cb04fa6ecd69789563254b1a0691413a" + }, + "vllm/v1/worker/mm_encoder_model_runner.py": { + "path": "/vllm/v1/worker/mm_encoder_model_runner.py", + "sha256": "780c41be84ad022205c21c1decb6bb8d5afb03bc7be120c1f7df03b710acc3d7" + }, + "vllm/v1/worker/sentinel/__init__.py": { + "path": "/vllm/v1/worker/sentinel/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/sentinel/gpu_worker_sentinel.py": { + "path": "/vllm/v1/worker/sentinel/gpu_worker_sentinel.py", + "sha256": "3959b8619d052c5dd247815074e03ec21ec9b43cc424ff2d296abc19b227b852" + }, + "vllm/v1/worker/startup_plan.py": { + "path": "/vllm/v1/worker/startup_plan.py", + "sha256": "84bcbb4f7a9fd7c8d10c9c895aadd9673d44c767b9132368d11eb5e017afe86b" + }, + "vllm/v1/worker/ubatch_utils.py": { + "path": "/vllm/v1/worker/ubatch_utils.py", + "sha256": "b34dce551b5195c414e6a3a997c75961cc7a17f24c7c980487fe3d3e2ba7a798" + }, + "vllm/v1/worker/ubatching.py": { + "path": "/vllm/v1/worker/ubatching.py", + "sha256": "40391241c564feb5f16c77898ae6ae152ed6e71a4682e2a406387785d8de02d7" + }, + "vllm/v1/worker/utils.py": { + "path": "/vllm/v1/worker/utils.py", + "sha256": "0ca3ec6bf4d20076145b7fe64e564962adebedc8f75a856b517ba0b2f2d77acf" + }, + "vllm/v1/worker/worker_base.py": { + "path": "/vllm/v1/worker/worker_base.py", + "sha256": "4a1a5266b912fe97991d8dc89d92b923990da9f6cb4b817d00d52e9c0d26dd7c" + }, + "vllm/v1/worker/workspace.py": { + "path": "/vllm/v1/worker/workspace.py", + "sha256": "d21c08167d1d0d1c0cddaa80453a53a0b4dec5d81b5a537c94a21324344976b3" + }, + "vllm/v1/worker/xpu_model_runner.py": { + "path": "/vllm/v1/worker/xpu_model_runner.py", + "sha256": "07fa0390d28f2b8c3c3c0019eb9c3b126e2397aea268ba47c889f06b423deb23" + }, + "vllm/v1/worker/xpu_worker.py": { + "path": "/vllm/v1/worker/xpu_worker.py", + "sha256": "711b56432506b58041cd86e71320c3960413f7bd61061990b66488421d81cfc3" + } + }, + "prefix": "", + "pth": { + "/__editable__.megatron_core-0.16.0rc0.pth": "d55c9b64480b34aae3d4d31e7706b93391c969dec6e0498e50963b03445a57b0", + "/__editable__.rl_kernel-0.1.0.pth": "1454c4987b35762a0d189d4e901c5d077fde62a1944fbaabecea230e57f3923a", + "/__editable__.vime-0.3.2.pth": "77eec5d06d628cb952e65edd813ca88d8db67ccc785083e1b7b29011b92bec4f", + "/distutils-precedence.pth": "2638ce9e2500e572a5e0de7faed6661eb569d1b696fcba07b0dd223da5f5d224", + "/qwen3_next_cuda_runtime.pth": "e0d3ab57dd3ff4f5d55fcf76e83c549cc00b3c813e6f717c540d5ded79fa2f49", + "/qwen3_next_megatron_source.pth": "8556ac057538e82856cb76cbbc954f58312a3f45373daec3eec826031cfd2709", + "/__editable__.rl_kernel-0.1.0.pth": "1454c4987b35762a0d189d4e901c5d077fde62a1944fbaabecea230e57f3923a", + "/distutils-precedence.pth": "2638ce9e2500e572a5e0de7faed6661eb569d1b696fcba07b0dd223da5f5d224", + "/nvidia_cutlass_dsl_packages.pth": "cc710b99ddb3d76361a70461461d274212a979d00c381d821fce5bb3ad9cf246" + }, + "pyvenv_cfg_sha256": "48579f2c6d35c3d535c2690d7d426587c4b8e92021463f0266b38d35dfbbb834", + "sources": { + "/Megatron-LM-training": { + "patch_sha256": "f66035f12501aa1d08e8884e0dea5a22d59825d717aeda73c3e83876e3efd79f", + "path": "/Megatron-LM-training", + "tree": "731fc44a368d6cac8c6171a29d5c687ff0d95bd1" + }, + "/vime": { + "patch_sha256": "66949839d4c18329444f4f9f6dcd702b53ce1b94e9aa15ed111f28743bfaa4b9", + "path": "/vime", + "tree": "f5174e67dbcdaef983eecd45f215fef2d8429dd0" + } + }, + "version": "3.12.14 | packaged by Anaconda, Inc. | (main, Aug 27 2026, 14:46:43) [GCC 14.3.0]" + }, + "sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca" + }, + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "cuda_identity": { + "home": "", + "nvcc_sha256": "b8e2347d9d7fcadf8812a27324d515de99d033d3e48611811ece7e66d7895f8a" + }, + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "operator_requirements": { + "suite": "all", + "case_ids": [ + "tests/check_qwen3_next_attention.py::test_d256_backward_with_cached_prefix_matches_float64_formula", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[1024]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[256]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[64]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[8]", + "tests/check_qwen3_next_attention.py::test_d256_input_device_guard_and_nondefault_stream", + "tests/check_qwen3_next_attention.py::test_native_backward_rejects_malformed_probability_and_gradient_buffers", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[0]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[2]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_target_inputs_do_not_depend_on_companions", + "tests/check_qwen3_next_batch_invariance.py::test_triton_chunked_prefill_is_batch_invariant", + "tests/check_qwen3_next_conv_bridge.py::test_chunked_and_reordered_sequences_match", + "tests/check_qwen3_next_conv_bridge.py::test_empty_sequence_preserves_cache_and_gradients", + "tests/check_qwen3_next_conv_bridge.py::test_response_gradient_reaches_prompt_and_convolution_weight", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths0]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths1]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths2]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-4]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[1]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[4]", + "tests/check_qwen3_next_core_matrix.py::test_variable_lengths_empty_and_mixed_step_match_independent_sequences", + "tests/check_qwen3_next_forward.py::test_combine_has_fixed_route_order_and_differentiable_weights", + "tests/check_qwen3_next_forward.py::test_full_vocabulary_logprob_entropy_modes_and_gradient", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_fail_closed_on_the_tensor_descriptor_path", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[128]", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[512]", + "tests/check_qwen3_next_forward.py::test_logprob_nan_rejected_before_comparison", + "tests/check_qwen3_next_forward.py::test_moe_vjp_matches_independent_double_formula", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[1024-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[128-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-16]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-256]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-3072]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-37984]", + "tests/check_qwen3_next_forward.py::test_qwen_moe_actual_tp4_shapes_and_independent_training_forward", + "tests/check_qwen3_next_forward.py::test_route_weights_are_batch_invariant", + "tests/check_qwen3_next_forward.py::test_shared_linear_vjp_and_empty_tokens", + "tests/check_qwen3_next_forward.py::test_stable_route_tie_boundary_and_router_gradient", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_backward_matches_recomputed_recurrence_vjp", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_forward_is_provider_exact_and_does_not_mutate_inputs", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_keeps_prompt_state_gradient_through_response", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[False]", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[True]", + "tests/check_qwen3_next_gdn_bridge.py::test_initial_state_vjp_matches_provider_directional_difference", + "tests/check_qwen3_next_gdn_sequence.py::test_1024_token_chunk_continuation_is_bitwise_exact", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad0]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad1]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad2]", + "tests/check_qwen3_next_gdn_sequence.py::test_chunk_boundary_retains_prompt_and_initial_state_gradients", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths0]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths1]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths2]", + "tests/check_qwen3_next_gdn_sequence.py::test_reserved_and_duplicate_slots_are_rejected", + "tests/check_qwen3_next_norm_providers.py::test_custom_op_has_distinct_native_and_cuda_paths", + "tests/check_qwen3_next_norm_providers.py::test_gdn_decode_provider_env_defaults_are_recorded", + "tests/check_qwen3_next_norm_providers.py::test_our_gated_op_is_batch_invariant", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_cuda]", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_native]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots0]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots2]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots3]", + "tests/check_qwen3_next_shared_core.py::test_independent_training_forward_matches_inference_and_retains_gradients", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[1024]", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[8]", + "tests/check_qwen3_next_shared_core.py::test_unimplemented_provider_profile_is_rejected", + "tests/test_qwen3_next_norm.py::test_bad_weight_shape_raises", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[16]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[1]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[2]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[32]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[48]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[64]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[8]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[128]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[2048]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_with_padding", + "tests/test_qwen3_next_norm.py::test_call_matches_forward", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[128]", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[2048]", + "tests/test_qwen3_next_norm.py::test_cuda_default_offset_preserves_plain_convention", + "tests/test_qwen3_next_norm.py::test_cuda_gated_backward_matches_autograd_golden", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_matches_golden_within_contract", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_bad_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_mismatched_gate", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_backward_uses_the_sigmoid_derivative", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_swish_is_an_alias_for_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_unit_weight_is_plain_norm_times_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_weight_offset_is_applied_in_fp32", + "tests/test_qwen3_next_norm.py::test_cuda_gated_wrapper_rejects_equal_numel_wrong_shape", + "tests/test_qwen3_next_norm.py::test_cuda_gated_zero_gate_zeroes_output", + "tests/test_qwen3_next_norm.py::test_cuda_offset_equals_explicit_fp32_weight", + "tests/test_qwen3_next_norm.py::test_cuda_offset_is_not_folded_through_bfloat16", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_backward_is_offset_aware", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_within_tolerance_of_golden", + "tests/test_qwen3_next_norm.py::test_deterministic_repeat", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype0]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype1]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype2]", + "tests/test_qwen3_next_norm.py::test_eps_inside_sqrt", + "tests/test_qwen3_next_norm.py::test_gated_batch_invariance_slice", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedHFOp]", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedOp]", + "tests/test_qwen3_next_norm.py::test_gated_conventions_diverge_in_low_precision", + "tests/test_qwen3_next_norm.py::test_gated_cuda_op_rejects_bad_activation_at_construction", + "tests/test_qwen3_next_norm.py::test_gated_extension_handles_empty_batch_and_nondefault_stream", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[dy_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[gate_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[rstd_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_shape]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_matches_hf_formula_fp32", + "tests/test_qwen3_next_norm.py::test_gated_shape_mismatch_raises", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_strict_matches_vllm_formula_fp32", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[128]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[2048]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_offset_applied_in_fp32_not_folded_into_bf16", + "tests/test_qwen3_next_norm.py::test_op_batch_invariance_on_device", + "tests/test_qwen3_next_norm.py::test_plain_reference_is_unchanged_by_the_offset_plumbing", + "tests/test_qwen3_next_norm.py::test_weight_offset_is_one", + "tests/test_qwen3_next_norm.py::test_zero_centred_cuda_constructor_rejects_missing_extension", + "tests/test_qwen3_next_norm.py::test_zero_centred_op_inherits_the_plain_reference", + "tests/test_qwen3_next_norm.py::test_zero_weight_is_identity_scaling" + ], + "case_ids_sha256": "694c931b65f9cfa5db963f2eca6d11bd309546c824a1df52f9da2ab128e83e0f", + "norm_gates": [ + "qwen3_next_rms_norm-forward.json", + "qwen3_next_rms_norm-gradient.json", + "rms_norm_gated-forward.json", + "rms_norm_gated-gradient.json" + ] + }, + "layer_requirements": { + "schema_version": 1, + "gates": { + "gdn": { + "script": "scripts/qwen3_next_tp_gdn_check.py", + "output_option": "--output", + "scope": "tp4_gdn_layer0", + "groups": { + "cases": [ + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "prompt-gradient", + "replicated-norm-gradient", + "hf-load-export" + ] + }, + "script_sha256": "cc4338893f90af004c51c20fc67d1a9a3f4bf8d26775277f72671c02983e4df5" + }, + "attention": { + "script": "scripts/qwen3_next_tp_attention_check.py", + "output_option": "--output", + "scope": "tp4_full_attention_layer3", + "groups": { + "attention.cases": [ + "hf-load-export", + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "batch4-varlen-reorder", + "sixteen-token-decode", + "prompt-gradient", + "kv-pair-gradient", + "qk-norm-gradient" + ] + }, + "script_sha256": "d27d43efb05415a8ef5892c3c2238a2b9744a4821f5466faf46c6510e6e01bec" + }, + "moe": { + "script": "scripts/qwen3_next_tp_moe_check.py", + "output_option": "--output", + "scope": "tp4_moe_block_layer0", + "groups": { + "moe.cases": [ + "hf-load-export-all512experts", + "routes-replicated-8", + "full-chunk-reorder-8", + "routes-replicated-64", + "full-chunk-reorder-64", + "routes-replicated-256", + "full-chunk-reorder-256", + "routes-replicated-1024", + "full-chunk-reorder-1024", + "training-forward", + "all-parameter-gradient", + "replicated-router-gradient" + ] + }, + "script_sha256": "d5c1bbbb82e408b65871b0cb1638d7a6cf8cfe07f0a3315a657b7dc232d544be" + }, + "adapters": { + "script": "scripts/qwen3_next_adapter_check.py", + "output_option": "--out", + "scope": "gdn_engine_adapter_component", + "groups": { + "cases": [ + "batch1-length8", + "batch1-length64", + "batch1-length256", + "batch1-length1024", + "batch4-length8", + "batch4-length64", + "batch4-length256", + "batch4-length1024", + "mixed-prefill-decode16-reorder" + ] + }, + "fields": { + "prompt_gradient": "passed", + "hf_conv_roundtrip": "passed", + "batch_invariance_capability_registered": false + }, + "script_sha256": "3ce45bb317237c1a06533116d65fb77c2a23b6f503ae46406ede543036eb0f20" + }, + "heads": { + "script": "scripts/qwen3_next_tp_head_check.py", + "output_option": "--output", + "scope": "tp4_embedding_lm_head_only", + "groups": { + "cases": [ + "hf-embedding-roundtrip", + "hf-lm-head-roundtrip", + "replicated-norm-gradient", + "nonzero-finite-embedding-head-gradient", + "embedding-repeat-100", + "batch-invariant-prompt8", + "batch-invariant-prompt64", + "batch-invariant-prompt256", + "batch-invariant-prompt1024", + "logprob-original-and-promoted-logits", + "entropy-interface" + ] + }, + "script_sha256": "0504185d21a75405c8e994bc57b016cf4ec357d8b16e7430772c11934f2af876" + } + }, + "scheduler_case_ids": [ + "p0008-b1-full", + "p0008-b1-chunked", + "p0008-b4-full", + "p0008-b4-chunked", + "p0064-b1-full", + "p0064-b1-chunked", + "p0064-b4-full", + "p0064-b4-chunked", + "p0256-b1-full", + "p0256-b1-chunked", + "p0256-b4-full", + "p0256-b4-chunked", + "p1024-b1-full", + "p1024-b1-chunked", + "p1024-b4-full", + "p1024-b4-chunked" + ], + "registry_sha256": "e3949a750cb27c1897a000f3b023f912629906612ae8949c1575d0acc36df5ec", + "case_ids_per_rank": [ + "adapters/cases/batch1-length1024", + "adapters/cases/batch1-length256", + "adapters/cases/batch1-length64", + "adapters/cases/batch1-length8", + "adapters/cases/batch4-length1024", + "adapters/cases/batch4-length256", + "adapters/cases/batch4-length64", + "adapters/cases/batch4-length8", + "adapters/cases/mixed-prefill-decode16-reorder", + "attention/attention.cases/batch4-varlen-reorder", + "attention/attention.cases/full-chunk-1024", + "attention/attention.cases/full-chunk-256", + "attention/attention.cases/full-chunk-64", + "attention/attention.cases/full-chunk-8", + "attention/attention.cases/hf-load-export", + "attention/attention.cases/kv-pair-gradient", + "attention/attention.cases/prompt-gradient", + "attention/attention.cases/qk-norm-gradient", + "attention/attention.cases/sixteen-token-decode", + "gdn/cases/full-chunk-1024", + "gdn/cases/full-chunk-256", + "gdn/cases/full-chunk-64", + "gdn/cases/full-chunk-8", + "gdn/cases/hf-load-export", + "gdn/cases/prompt-gradient", + "gdn/cases/replicated-norm-gradient", + "heads/cases/batch-invariant-prompt1024", + "heads/cases/batch-invariant-prompt256", + "heads/cases/batch-invariant-prompt64", + "heads/cases/batch-invariant-prompt8", + "heads/cases/embedding-repeat-100", + "heads/cases/entropy-interface", + "heads/cases/hf-embedding-roundtrip", + "heads/cases/hf-lm-head-roundtrip", + "heads/cases/logprob-original-and-promoted-logits", + "heads/cases/nonzero-finite-embedding-head-gradient", + "heads/cases/replicated-norm-gradient", + "moe/moe.cases/all-parameter-gradient", + "moe/moe.cases/full-chunk-reorder-1024", + "moe/moe.cases/full-chunk-reorder-256", + "moe/moe.cases/full-chunk-reorder-64", + "moe/moe.cases/full-chunk-reorder-8", + "moe/moe.cases/hf-load-export-all512experts", + "moe/moe.cases/replicated-router-gradient", + "moe/moe.cases/routes-replicated-1024", + "moe/moe.cases/routes-replicated-256", + "moe/moe.cases/routes-replicated-64", + "moe/moe.cases/routes-replicated-8", + "moe/moe.cases/training-forward" + ], + "case_ids_sha256": "be74417dfbd6031ba27978d06d04bb15daaab2aeb57d132c7e0d41176b28b46e" + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "scheduler_profile_certificate": { + "path": "/result.json", + "sha256": "fbfb9aca512a01d150f5b6bf4a1f12c77c3292ba279bd7d63e24dbf3a7231ce9" + } +} diff --git a/docs/usage/evidence/qwen3-next-batch-invariance-b200/chain-report.json b/docs/usage/evidence/qwen3-next-batch-invariance-b200/chain-report.json new file mode 100644 index 000000000..c677bf792 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-batch-invariance-b200/chain-report.json @@ -0,0 +1,2152 @@ +{ + "accuracy": [], + "accuracy_aggregates": [], + "accuracy_executed": false, + "aggregates": { + "aggregates": { + "active_token_count": 640, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + "all_parameter_gradients": false, + "backend_profile": "qwen3_next_tp4_shared_eager_v1", + "backend_provenance": { + "accumulation_dtype": "fp32", + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "backend_profile": "qwen3_next_tp4_shared_eager_v1", + "candidate_tf32_enabled": false, + "execution_dtype": "bf16", + "output_dtype": "bf16", + "reference_dtype": "bf16", + "reference_tf32_enabled": false, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "backward_executed": false, + "backward_runtime_observations": {}, + "batch_invariance": { + "families": { + "chunk": { + "cells": 66, + "passed": 66 + }, + "concurrency": { + "cells": 13, + "passed": 13 + }, + "interference": { + "cells": 10, + "passed": 10 + }, + "packing": { + "cells": 8, + "passed": 8 + } + }, + "first_failure": null, + "first_failure_family": null, + "passed": true, + "suite": "full" + }, + "c8_evidence_path": "", + "c8_source_commit": null, + "cells": { + "baseline/p0008-b1-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "baseline/p0008-b1-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "5dcefedce9eec0602f525293ce812f806a37b1c41bd1dcd1870d9b93c81645b8", + "layer0": "f48903cec22fc97f965f326686975101312ee8e0bc33944f35e1ec80f524bb34", + "layer1": "1472ee2f34ebbe1ac687bba49cbfda89e40cc57c0d2ff1266e4b9c91f012fc46", + "layer10": "f4b74c35b097be6e7b93fbd1b6ff7b2a010b4e0af7e677ab6c6e4d977a8bd5e7", + "layer11": "035b5e56d1cf3eb9519856c0def55a293cc89d4992635ce2020097bde5e24b59", + "layer12": "f53f4d58b165913772497d8314c56d5abff372518802df27ecd3105f02c8cd73", + "layer13": "f3776349e9079b850a975d0cf5810b873f967dc727f5e37106ad3a8195c3dacb", + "layer14": "78fef2e3e056c5ec1df8d712bd3be0782a37c01534826e53d9c20e16dfa699fc", + "layer15": "4651447f27ba16396a09af2934ab04ddebcc07ce22602687be8e5cb3a81bae1c", + "layer16": "b71919ea0f452e6e96628708e9710f4ebc85a1996b2ee8c2f8782a9d45e8053e", + "layer17": "990a1a30d074970cd4150bcdeb4c94c9b0ad22e407964a8bce72f4ac497107d0", + "layer18": "fb0cf1b0484cfb619cd92172112392f8a979d1a8346be48910276cf90ef2c9bb", + "layer19": "7ebb43f5641931ffda4d7ef4d1ceff5337f33f303cfadb347290bddfeaef816c", + "layer2": "ebb0fd7eba8481b6c66e9cd49c0acc7b8d9225fb0665386a679fb8e5027e268d", + "layer20": "0e683c98f23546a0b08cc0e5a892a1402329e4f476c2bd50d1fbbe7789e918c9", + "layer21": "755f6ce27dac3fc5569dbdb6a46bcbfc2a41b34ef0bb474a1172f7c2e141979c", + "layer22": "89d6e9d48ef75a85a1c61631c214449fe2f7953e371b74a4262eda4b9fce6728", + "layer23": "f8a49146a657d3dae60ace3bcf5936a53e6a0ea84f5079d12b71bd6f9bbd11e9", + "layer24": "9a3d005412924ea64649461e4c9144abb3c1ff03ee405eda47c5396195b8b5e9", + "layer25": "587db8fe58631b0dc17425e227cf271a22c0b72455e160544d2827d65545a49c", + "layer26": "fb9c49bafda77cc14f43994331901b3bd13a6f74b6749ef2c9dab57ef4e70652", + "layer27": "254cb9ef96a7c2353313f8860ea82e503b6729bdb23f5f30594fa843843e225d", + "layer28": "7c24980ce971422ade4407f081fd40c72abf38e42405c58756fe812f9e36777e", + "layer29": "5742c82893b178b8810be6042ee3a0a7c4922922f9a77c2d99b3f8d147614c92", + "layer3": "3a0da370f7e4bc255dad7f022621acd77564908f52c9f036f24f99d90fb126ed", + "layer30": "bea5516a9cdc987fe3fa4e065f93ec6d8edeaa7b7d9c043fff308a8c44b355c4", + "layer31": "3d8477f0866822edcdd7c14a75e212dfd51dfe5d5820fccc22876c9dd5258e0a", + "layer32": "4895c073f408812ba90b12aa9c6acfb4efd3d86f4cd9644b190ea39d41517237", + "layer33": "fdbf1bd71f1fe2bd0afd1f66269713be0337be8ee3309a193c803da08032910c", + "layer34": "e45d25f43b44b2dc4de64d20d1e18a3f739ae9990896fe8911c3c4ef3853b1f6", + "layer35": "f8a0d2b2af8d829bdbda260fef93790e5d03c5ed3234e2e61481f0c6e5f3c100", + "layer36": "e9f403bc583f32669285d6dc70b150138a58d40bff2a9127a52478b9467c9a2c", + "layer37": "8db5c27e1c596ea559eabee54351305d1b22afa3cc6c30fb51fcc9ab06d22060", + "layer38": "54cf5317fdf58c6003a8dd5dc0f65ed085a53bbdcbef60ec801851faabd0c73c", + "layer39": "fcdb6aab646e9e364244fb5b726308360e728ee3f68ef150af0367e051ff202b", + "layer4": "20f5a2d7373da9a8035677e81dc160b6ae8161b098a29d734744e055099aa1fa", + "layer40": "3c5c9673e348b7157764e0ef50241f732aff1721fb093f260667ce327714782b", + "layer41": "652dd9ad74c5d27a7436024c339d16ad8cf17c5af6fd0cc0c1801d78aeeba48b", + "layer42": "81a607c404264b7b20a49338e76c007d9ba6523b813e7d288ccf080f2c70ea1a", + "layer43": "8d2f6a995940e926d8b3247ba1154b59979f8f423d4ea96fb61683b38a5a4f2b", + "layer44": "8fe08b0c6ddf3c36cb0f77c8c4b01ae2c98c4b7bdd1eb79f70c65fd8d38d85cd", + "layer45": "a1839dd6bd8a54f67e98ede7d2d49bac88f655b8cb6ff5754996e1b4d240132c", + "layer46": "a354818401baed90019a940560355a02feb22d93b51bb65dd5049117ffc73e30", + "layer47": "5b27d3d758a1520a0fec1f60e8efd4647791f51f6e22401c7d15ecce79847c84", + "layer5": "9b03a638a8da24cd588294c5586b41160d1e51e8d3f644d22ab0dde2a26a7405", + "layer6": "05e36af84deed9814952b8be6b27cc64a853cbec2731758e4c0eb98facce7c4e", + "layer7": "bfaa96f913e7cd39b1b8f135918e32acfe22a905d2d68c522162de9de42ed223", + "layer8": "57d852129e14e29c89a1780e08fc7ec183222a0b52ed2be0a2c17bd0661f265f", + "layer9": "74e68131689abf3417308cf8b21239c8e6a8e4ac88510711712f72f4c48d18f1" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "baseline/p0008-b1-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "baseline/p0008-b1-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "5dcefedce9eec0602f525293ce812f806a37b1c41bd1dcd1870d9b93c81645b8", + "layer0": "f48903cec22fc97f965f326686975101312ee8e0bc33944f35e1ec80f524bb34", + "layer1": "1472ee2f34ebbe1ac687bba49cbfda89e40cc57c0d2ff1266e4b9c91f012fc46", + "layer10": "f4b74c35b097be6e7b93fbd1b6ff7b2a010b4e0af7e677ab6c6e4d977a8bd5e7", + "layer11": "035b5e56d1cf3eb9519856c0def55a293cc89d4992635ce2020097bde5e24b59", + "layer12": "f53f4d58b165913772497d8314c56d5abff372518802df27ecd3105f02c8cd73", + "layer13": "f3776349e9079b850a975d0cf5810b873f967dc727f5e37106ad3a8195c3dacb", + "layer14": "78fef2e3e056c5ec1df8d712bd3be0782a37c01534826e53d9c20e16dfa699fc", + "layer15": "4651447f27ba16396a09af2934ab04ddebcc07ce22602687be8e5cb3a81bae1c", + "layer16": "b71919ea0f452e6e96628708e9710f4ebc85a1996b2ee8c2f8782a9d45e8053e", + "layer17": "990a1a30d074970cd4150bcdeb4c94c9b0ad22e407964a8bce72f4ac497107d0", + "layer18": "fb0cf1b0484cfb619cd92172112392f8a979d1a8346be48910276cf90ef2c9bb", + "layer19": "7ebb43f5641931ffda4d7ef4d1ceff5337f33f303cfadb347290bddfeaef816c", + "layer2": "ebb0fd7eba8481b6c66e9cd49c0acc7b8d9225fb0665386a679fb8e5027e268d", + "layer20": "0e683c98f23546a0b08cc0e5a892a1402329e4f476c2bd50d1fbbe7789e918c9", + "layer21": "755f6ce27dac3fc5569dbdb6a46bcbfc2a41b34ef0bb474a1172f7c2e141979c", + "layer22": "89d6e9d48ef75a85a1c61631c214449fe2f7953e371b74a4262eda4b9fce6728", + "layer23": "f8a49146a657d3dae60ace3bcf5936a53e6a0ea84f5079d12b71bd6f9bbd11e9", + "layer24": "9a3d005412924ea64649461e4c9144abb3c1ff03ee405eda47c5396195b8b5e9", + "layer25": "587db8fe58631b0dc17425e227cf271a22c0b72455e160544d2827d65545a49c", + "layer26": "fb9c49bafda77cc14f43994331901b3bd13a6f74b6749ef2c9dab57ef4e70652", + "layer27": "254cb9ef96a7c2353313f8860ea82e503b6729bdb23f5f30594fa843843e225d", + "layer28": "7c24980ce971422ade4407f081fd40c72abf38e42405c58756fe812f9e36777e", + "layer29": "5742c82893b178b8810be6042ee3a0a7c4922922f9a77c2d99b3f8d147614c92", + "layer3": "3a0da370f7e4bc255dad7f022621acd77564908f52c9f036f24f99d90fb126ed", + "layer30": "bea5516a9cdc987fe3fa4e065f93ec6d8edeaa7b7d9c043fff308a8c44b355c4", + "layer31": "3d8477f0866822edcdd7c14a75e212dfd51dfe5d5820fccc22876c9dd5258e0a", + "layer32": "4895c073f408812ba90b12aa9c6acfb4efd3d86f4cd9644b190ea39d41517237", + "layer33": "fdbf1bd71f1fe2bd0afd1f66269713be0337be8ee3309a193c803da08032910c", + "layer34": "e45d25f43b44b2dc4de64d20d1e18a3f739ae9990896fe8911c3c4ef3853b1f6", + "layer35": "f8a0d2b2af8d829bdbda260fef93790e5d03c5ed3234e2e61481f0c6e5f3c100", + "layer36": "e9f403bc583f32669285d6dc70b150138a58d40bff2a9127a52478b9467c9a2c", + "layer37": "8db5c27e1c596ea559eabee54351305d1b22afa3cc6c30fb51fcc9ab06d22060", + "layer38": "54cf5317fdf58c6003a8dd5dc0f65ed085a53bbdcbef60ec801851faabd0c73c", + "layer39": "fcdb6aab646e9e364244fb5b726308360e728ee3f68ef150af0367e051ff202b", + "layer4": "20f5a2d7373da9a8035677e81dc160b6ae8161b098a29d734744e055099aa1fa", + "layer40": "3c5c9673e348b7157764e0ef50241f732aff1721fb093f260667ce327714782b", + "layer41": "652dd9ad74c5d27a7436024c339d16ad8cf17c5af6fd0cc0c1801d78aeeba48b", + "layer42": "81a607c404264b7b20a49338e76c007d9ba6523b813e7d288ccf080f2c70ea1a", + "layer43": "8d2f6a995940e926d8b3247ba1154b59979f8f423d4ea96fb61683b38a5a4f2b", + "layer44": "8fe08b0c6ddf3c36cb0f77c8c4b01ae2c98c4b7bdd1eb79f70c65fd8d38d85cd", + "layer45": "a1839dd6bd8a54f67e98ede7d2d49bac88f655b8cb6ff5754996e1b4d240132c", + "layer46": "a354818401baed90019a940560355a02feb22d93b51bb65dd5049117ffc73e30", + "layer47": "5b27d3d758a1520a0fec1f60e8efd4647791f51f6e22401c7d15ecce79847c84", + "layer5": "9b03a638a8da24cd588294c5586b41160d1e51e8d3f644d22ab0dde2a26a7405", + "layer6": "05e36af84deed9814952b8be6b27cc64a853cbec2731758e4c0eb98facce7c4e", + "layer7": "bfaa96f913e7cd39b1b8f135918e32acfe22a905d2d68c522162de9de42ed223", + "layer8": "57d852129e14e29c89a1780e08fc7ec183222a0b52ed2be0a2c17bd0661f265f", + "layer9": "74e68131689abf3417308cf8b21239c8e6a8e4ac88510711712f72f4c48d18f1" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "baseline/p0008-b4-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "baseline/p0008-b4-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "9330cfbfea9b0ecd067000ade8d63d21740ee1bed61d9969de450f0888d9e4d6", + "layer0": "007cb395b58999377bda435f91affc27d3fe4cc2f8ee12e86e1075521c679b79", + "layer1": "92a7a5c07e70612ecc72efddf05dd6abc7c94c6a8b67eb82eba74be96b3893fd", + "layer10": "62c91e079e06a85c82309d2078d06920768594e1648627869eba14f2845216eb", + "layer11": "de248056a90c7b9d51568a48aa66b4349811c32e250ce376a3c5ba59ff1a9c6a", + "layer12": "38a8faf33e5bb83cff57483c1373a8b12919d5cb09b1b992f674f112f633359d", + "layer13": "cf63c5012f9493601967333e29d419288ceb2cd203615cc00619b6ec1619c643", + "layer14": "2cefaa1894918ba22f1cb2461d965ba0bd2edf2ada260186b695d975cfaad9d9", + "layer15": "5920cfbdf854d1b71f0697dbf4e3400b30d85dd5e4be818cfcb00cd4ceeabc90", + "layer16": "b8223029ce655f20f9cf77bfa32be0b7de7bcc9165c6fb75e7b493b1c546c6ff", + "layer17": "e2b257c2d0678100ccd476b56b444c2b86d657f3ae46d9cac6933cfc09eb22ef", + "layer18": "76fe643e8b07f67fa933fd8497651364e9e5b4083c75ae084e3252c85bb81aee", + "layer19": "7cd3f567cba1a103a1f33d7fb055cd4f4a230217fc3b0ce2be468f748920f4eb", + "layer2": "85ea056f9a0087ab172a83e6c8361569e35fc14f846fa0e701efeb6781c66094", + "layer20": "d17a212462aa9675f1e828332318f08c1c5486ca07ce5e9e4d9519b705b0d4f5", + "layer21": "b24e5ee55dc7a92ab5a2d4189a4c1a3294ec5987a11597cd8bc69f1c1962d84d", + "layer22": "7c6e0bdcd92a6ae019e7c980a4a72e2ddd02b31c1e2569734da8367defa12625", + "layer23": "eaf764b807fd281c88a9661c6a108670030deff0ac84b6907664bb5bc92923a6", + "layer24": "ae6454c38b7a156186aae9e6485342a81e9215ba2f037106f610456547185282", + "layer25": "d0a03bfe6249b6ce4ce9a44033ad0885f0cb7db256e74a2a985c855fa91f876a", + "layer26": "13ad8bc8a8da22c34cc796ae7183ab1c1414a95c454391f3aae72eecd51ac4b9", + "layer27": "ee28f0af95f077bef4b8592e18b860962e33efe89af526e91b2f94a7a31f1706", + "layer28": "f9c9b57d798317f438cb1c3bfa61cb5878d0c70263df90adc030468fca74f0c5", + "layer29": "f3428557e60c420c4827c922941201d42c3e359ca2da59fd41a1a32b19aec28f", + "layer3": "933994054ee0e56a06ee10a101216292f009b8986924a5df8322651faaeb9d42", + "layer30": "2b0dbe4b4b9cc17517a95ffc8b14f5f8458b0d7ffc763f5fe117e2a73d6d772f", + "layer31": "ceb0a9c2b41f8329e9055f012e0c9d70d2e7d1d8eeed63a828cdd7a237b4b20d", + "layer32": "01e4aa607492a860698bd04e185b68d59979054203514ad8132215073ea3501a", + "layer33": "cc246fa6f13f5401f45e5dd2f4896262ce77bb9f271bf90386e86d4b5f5c95dc", + "layer34": "050ccb132e36197da641b69a9d55f9437de9238550c3e58697fac1cbed082071", + "layer35": "0ed33735035b81291030fec2bef407696a0a1980d836c58087002b6d960ad5a8", + "layer36": "bcf4358fd097fa12a6cf2194b054a8475ac2dadd93e4975374710690f3cbef45", + "layer37": "774e5c17d476709bccabcf64640253a42139bfc368268c25279f338364ce097a", + "layer38": "a6788d214f1788020ac6459fb10b464da702db2998e70cf1e7817e9be64f5d1e", + "layer39": "e35899c72c8c8f0e0c24580012c53dc0230790d9545170c9883a148851895010", + "layer4": "cce7f158e01f763bda4559642730eb1b76213baab1542629a58cfd80ea6e7337", + "layer40": "d046881d0b7ab44d351f6b924186e31a1dcd0750b0a04b5e90dc4072e4ced7d1", + "layer41": "bbad96f4574a82893a198534632f36533f8ab89d9adbe9f625246a498504eb6b", + "layer42": "428df67a8db79cf37f2bc866f838a48765a8a30153cf632d76455435316a15a8", + "layer43": "02b06d2b1564c1710d11fff2e4274539549d27a36442ebf13bebb677087371a2", + "layer44": "2ae6de9870c02048a4cebb2b1d97879cd16e4731947400cd8c2bc04b93779fe4", + "layer45": "de347e930f2a81297bc877415b7e0d58e90cab89515ae32080b4f60847eb1f22", + "layer46": "acb8853fcebe0e0dd1daf49ce9ab8ab4638662e6c6c570813f4da061a27701f8", + "layer47": "a42d2595a8c1966c24e4ec9ffb1ec8568fe0af400026070b81efb0ff98c0f1e0", + "layer5": "a0f56a4df1ddb26eb363b2374afdea4d433b15dc26007dfc8f56c6771fb340e3", + "layer6": "63378d169197c9c099390007cc2a6bc773e240fbff028145a63aa07da7eb4a2f", + "layer7": "c7747dd4c86a30a49292c64a39886e515d281b926e714d1c0f785a6777fd7505", + "layer8": "326b71590c3ce49716ce6fa69bf12043e0a61c10fbf8d4666e6809b2bd6289b3", + "layer9": "df022442ff4b6f0faffa5c467af433f13370cdd3fec86d8aab677285750506c8" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "baseline/p0008-b4-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "baseline/p0008-b4-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "9330cfbfea9b0ecd067000ade8d63d21740ee1bed61d9969de450f0888d9e4d6", + "layer0": "007cb395b58999377bda435f91affc27d3fe4cc2f8ee12e86e1075521c679b79", + "layer1": "92a7a5c07e70612ecc72efddf05dd6abc7c94c6a8b67eb82eba74be96b3893fd", + "layer10": "62c91e079e06a85c82309d2078d06920768594e1648627869eba14f2845216eb", + "layer11": "de248056a90c7b9d51568a48aa66b4349811c32e250ce376a3c5ba59ff1a9c6a", + "layer12": "38a8faf33e5bb83cff57483c1373a8b12919d5cb09b1b992f674f112f633359d", + "layer13": "cf63c5012f9493601967333e29d419288ceb2cd203615cc00619b6ec1619c643", + "layer14": "2cefaa1894918ba22f1cb2461d965ba0bd2edf2ada260186b695d975cfaad9d9", + "layer15": "5920cfbdf854d1b71f0697dbf4e3400b30d85dd5e4be818cfcb00cd4ceeabc90", + "layer16": "b8223029ce655f20f9cf77bfa32be0b7de7bcc9165c6fb75e7b493b1c546c6ff", + "layer17": "e2b257c2d0678100ccd476b56b444c2b86d657f3ae46d9cac6933cfc09eb22ef", + "layer18": "76fe643e8b07f67fa933fd8497651364e9e5b4083c75ae084e3252c85bb81aee", + "layer19": "7cd3f567cba1a103a1f33d7fb055cd4f4a230217fc3b0ce2be468f748920f4eb", + "layer2": "85ea056f9a0087ab172a83e6c8361569e35fc14f846fa0e701efeb6781c66094", + "layer20": "d17a212462aa9675f1e828332318f08c1c5486ca07ce5e9e4d9519b705b0d4f5", + "layer21": "b24e5ee55dc7a92ab5a2d4189a4c1a3294ec5987a11597cd8bc69f1c1962d84d", + "layer22": "7c6e0bdcd92a6ae019e7c980a4a72e2ddd02b31c1e2569734da8367defa12625", + "layer23": "eaf764b807fd281c88a9661c6a108670030deff0ac84b6907664bb5bc92923a6", + "layer24": "ae6454c38b7a156186aae9e6485342a81e9215ba2f037106f610456547185282", + "layer25": "d0a03bfe6249b6ce4ce9a44033ad0885f0cb7db256e74a2a985c855fa91f876a", + "layer26": "13ad8bc8a8da22c34cc796ae7183ab1c1414a95c454391f3aae72eecd51ac4b9", + "layer27": "ee28f0af95f077bef4b8592e18b860962e33efe89af526e91b2f94a7a31f1706", + "layer28": "f9c9b57d798317f438cb1c3bfa61cb5878d0c70263df90adc030468fca74f0c5", + "layer29": "f3428557e60c420c4827c922941201d42c3e359ca2da59fd41a1a32b19aec28f", + "layer3": "933994054ee0e56a06ee10a101216292f009b8986924a5df8322651faaeb9d42", + "layer30": "2b0dbe4b4b9cc17517a95ffc8b14f5f8458b0d7ffc763f5fe117e2a73d6d772f", + "layer31": "ceb0a9c2b41f8329e9055f012e0c9d70d2e7d1d8eeed63a828cdd7a237b4b20d", + "layer32": "01e4aa607492a860698bd04e185b68d59979054203514ad8132215073ea3501a", + "layer33": "cc246fa6f13f5401f45e5dd2f4896262ce77bb9f271bf90386e86d4b5f5c95dc", + "layer34": "050ccb132e36197da641b69a9d55f9437de9238550c3e58697fac1cbed082071", + "layer35": "0ed33735035b81291030fec2bef407696a0a1980d836c58087002b6d960ad5a8", + "layer36": "bcf4358fd097fa12a6cf2194b054a8475ac2dadd93e4975374710690f3cbef45", + "layer37": "774e5c17d476709bccabcf64640253a42139bfc368268c25279f338364ce097a", + "layer38": "a6788d214f1788020ac6459fb10b464da702db2998e70cf1e7817e9be64f5d1e", + "layer39": "e35899c72c8c8f0e0c24580012c53dc0230790d9545170c9883a148851895010", + "layer4": "cce7f158e01f763bda4559642730eb1b76213baab1542629a58cfd80ea6e7337", + "layer40": "d046881d0b7ab44d351f6b924186e31a1dcd0750b0a04b5e90dc4072e4ced7d1", + "layer41": "bbad96f4574a82893a198534632f36533f8ab89d9adbe9f625246a498504eb6b", + "layer42": "428df67a8db79cf37f2bc866f838a48765a8a30153cf632d76455435316a15a8", + "layer43": "02b06d2b1564c1710d11fff2e4274539549d27a36442ebf13bebb677087371a2", + "layer44": "2ae6de9870c02048a4cebb2b1d97879cd16e4731947400cd8c2bc04b93779fe4", + "layer45": "de347e930f2a81297bc877415b7e0d58e90cab89515ae32080b4f60847eb1f22", + "layer46": "acb8853fcebe0e0dd1daf49ce9ab8ab4638662e6c6c570813f4da061a27701f8", + "layer47": "a42d2595a8c1966c24e4ec9ffb1ec8568fe0af400026070b81efb0ff98c0f1e0", + "layer5": "a0f56a4df1ddb26eb363b2374afdea4d433b15dc26007dfc8f56c6771fb340e3", + "layer6": "63378d169197c9c099390007cc2a6bc773e240fbff028145a63aa07da7eb4a2f", + "layer7": "c7747dd4c86a30a49292c64a39886e515d281b926e714d1c0f785a6777fd7505", + "layer8": "326b71590c3ce49716ce6fa69bf12043e0a61c10fbf8d4666e6809b2bd6289b3", + "layer9": "df022442ff4b6f0faffa5c467af433f13370cdd3fec86d8aab677285750506c8" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "baseline/p0064-b1-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "baseline/p0064-b1-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "2103a7ecdb753bab5aa53770623a6edee88dd41c69c99a6d332273343636bc26", + "layer0": "e9684275c85eca0fa7f77e6ca497c659c55506974235bb1e83ee8f1676a0b98e", + "layer1": "497450f1cd49b0663ffb88553935c68320009dc6a76651c377184ce26547e3a2", + "layer10": "dbfa621f00ac6bb40be236999508d4345b57022d633207f7e2a2885511f13c7f", + "layer11": "83ef553ecadab44d289fd7871fcbb96e05986eca3ebc1cc75c5754bcee0fea27", + "layer12": "03dc6b89ddf27ddfa682d9d60990149efe2904839a619ae63b2d476da077f61a", + "layer13": "0bbfa1680231027d8babab601c8961e070a7116d29ddbcd482ca4c8be1fcb040", + "layer14": "dc2d6b92c6c9e7bc49d858b5bcb631a81b516b6204fa5a315dafd48151404d18", + "layer15": "0d76fc8cb336b185b9fa46420935a3cd21cb18f42af90cd59f5c986269f650d5", + "layer16": "e6b2de2d6f4b59461f3a0c9c2df8f6f0ab22459d94a877cdb73bf1c6f37f56ae", + "layer17": "db96458aa486d7a78dd31939c4471ba734dd4e7cbe64e9ddf9429091072fdee8", + "layer18": "b5b85c15ef27c983bc1a0de67b58d3238c8587cb41782bc31ddab58ee77e7482", + "layer19": "9539f7201598071d3858b640ed9fb83248ee17b5e3ddbacdde96224432c756bb", + "layer2": "166add13932791a0b186e0e248161cc249ec3be75b71934fce0d7affb04ec609", + "layer20": "d49160c2926d1b3756029cae7b5ff91c96465772a1e1782d66292f6e855e4f0e", + "layer21": "5c1ebdeeddddb5e282801cfc4faae40d21bf09d132631ba0194638a0d619ea2b", + "layer22": "b3070ad9ddd311bf57762fbb185c0d6d47490c70580325ebd70290c93328d019", + "layer23": "9d0c6f46d8ddf5290a25be4bbca60662e39fbb6f3dd9975c20e0247818407883", + "layer24": "2b447f31b9093f42954e509165d3ad88079813ce5a4401e99607153a68c4dc97", + "layer25": "953f9caa45bddb76e08ba38abad518aac3ffe55edee147c0959165a22d1b3c1d", + "layer26": "d8d8a4ec3ddd4f5811c3a8a002aed130bbca0f8a94198c64483a4ab809136bfb", + "layer27": "f107da3c54e97550ad53d68b6b3c1daa0b825705e91939e3cc232ece9c09457f", + "layer28": "d227472b4d14af7e0d6b93ce06781505239d975bc255ec680fd272cc3fc12780", + "layer29": "e056874b6de3477593ee243b90b34658cca20ed943caeca835512bada739208f", + "layer3": "f2362face2bf9458748b6d8da4e33ceee6f52f1d4f2513ac955f076a275076ef", + "layer30": "072e569bb0bd979f2cc7ed87f8b68649418570d60c31c78f413968a75fc9c5b8", + "layer31": "92486de2ccf48a0b3e556d68d0e718cc6dcb1637fe4748af5b11ecb83a60e7f3", + "layer32": "6d11506a66c4b9f4cea48f71b19eb60aa5f4ddf13f7e4dc3935f2bdad7258fdd", + "layer33": "ebf8d8c3534f8a8d7bdeaa677c3750d52fc17a1cf796ed7c7fdff4ef3e95d3ac", + "layer34": "55405ed12e72c43abe543d55758fc42d236fd3c61493d1c7ff6ae40eaf7fa502", + "layer35": "bff2ae45b89598d748d4226b5561936e7a6864683e2bae899e8509ff12bae31b", + "layer36": "92db2aaf748c9f95e8df030b47b26321492f62ad46c1df9cc4005b4724a693ac", + "layer37": "77ca2847b6fdfa385e0111ea25db316fa2986ec6e84f6e4fbfc30ab76e8bc7ed", + "layer38": "88ddf6ee32902b03eef06c3f475c1d3f8b6e04f97b0b62ebb63706d8b47e7479", + "layer39": "d9ba7d0ba445ff684483b2ca61b692cb7cd7ee6fc3dbb701c3c126da919d565a", + "layer4": "58f9312200f23da5a0c4a03f468a8429d67863b57b688a68eb28801ee051fc23", + "layer40": "27a854931b1d9c6c5760179804c583d3291efe27dc947b436bf1ea2e02991d1f", + "layer41": "90acfe0ad7f1426de8a3c8d7ce75ebd038ae7e28c23f99558730456bd578acad", + "layer42": "aed73f50dfe098882f6e259596feaf57b0a3e9585d019a4ef366da9dfce2db00", + "layer43": "bf6a3f59f2bdda1672a5f133ddfbc72cfac95cf29e250bc242378c98d0acaf82", + "layer44": "f823a38f7ac7cb4311c0083a413c4326083d649d100ccda2fc11cd447c895bb9", + "layer45": "0cfb5407942d8e694b5ac6f3367947700e36e91db3447e93f7e0ea1806bf5207", + "layer46": "d27dc815230df8c1bdf12407dc9ebee88005320c8a71834e3628de4de61d98d8", + "layer47": "a3cf298e8cfb5c7cd3db91341c545db9fc377d68c867c0c0c02cc9963ebb3781", + "layer5": "959a1f213733eb5036623d9de750afb8d96d931037ab8d79e6ea86f3165ff740", + "layer6": "0af5fb0fe8889723490d919d44da64ed34347421020be17b0d1c1a61d0e91e2c", + "layer7": "4878416361b610adc87125d7b8f364c09931d8c9c3ff8fb40a9f82b7204af591", + "layer8": "dc552095fd0625ddc19e4b6f48469ecc167883f935644c3a3c99a0b80c1d5a6a", + "layer9": "8c85d6559929773cb5b08fd3b32d12aac255562df7940b343691d652db8d834a" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "baseline/p0064-b1-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "baseline/p0064-b1-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "2103a7ecdb753bab5aa53770623a6edee88dd41c69c99a6d332273343636bc26", + "layer0": "e9684275c85eca0fa7f77e6ca497c659c55506974235bb1e83ee8f1676a0b98e", + "layer1": "497450f1cd49b0663ffb88553935c68320009dc6a76651c377184ce26547e3a2", + "layer10": "dbfa621f00ac6bb40be236999508d4345b57022d633207f7e2a2885511f13c7f", + "layer11": "83ef553ecadab44d289fd7871fcbb96e05986eca3ebc1cc75c5754bcee0fea27", + "layer12": "03dc6b89ddf27ddfa682d9d60990149efe2904839a619ae63b2d476da077f61a", + "layer13": "0bbfa1680231027d8babab601c8961e070a7116d29ddbcd482ca4c8be1fcb040", + "layer14": "dc2d6b92c6c9e7bc49d858b5bcb631a81b516b6204fa5a315dafd48151404d18", + "layer15": "0d76fc8cb336b185b9fa46420935a3cd21cb18f42af90cd59f5c986269f650d5", + "layer16": "e6b2de2d6f4b59461f3a0c9c2df8f6f0ab22459d94a877cdb73bf1c6f37f56ae", + "layer17": "db96458aa486d7a78dd31939c4471ba734dd4e7cbe64e9ddf9429091072fdee8", + "layer18": "b5b85c15ef27c983bc1a0de67b58d3238c8587cb41782bc31ddab58ee77e7482", + "layer19": "9539f7201598071d3858b640ed9fb83248ee17b5e3ddbacdde96224432c756bb", + "layer2": "166add13932791a0b186e0e248161cc249ec3be75b71934fce0d7affb04ec609", + "layer20": "d49160c2926d1b3756029cae7b5ff91c96465772a1e1782d66292f6e855e4f0e", + "layer21": "5c1ebdeeddddb5e282801cfc4faae40d21bf09d132631ba0194638a0d619ea2b", + "layer22": "b3070ad9ddd311bf57762fbb185c0d6d47490c70580325ebd70290c93328d019", + "layer23": "9d0c6f46d8ddf5290a25be4bbca60662e39fbb6f3dd9975c20e0247818407883", + "layer24": "2b447f31b9093f42954e509165d3ad88079813ce5a4401e99607153a68c4dc97", + "layer25": "953f9caa45bddb76e08ba38abad518aac3ffe55edee147c0959165a22d1b3c1d", + "layer26": "d8d8a4ec3ddd4f5811c3a8a002aed130bbca0f8a94198c64483a4ab809136bfb", + "layer27": "f107da3c54e97550ad53d68b6b3c1daa0b825705e91939e3cc232ece9c09457f", + "layer28": "d227472b4d14af7e0d6b93ce06781505239d975bc255ec680fd272cc3fc12780", + "layer29": "e056874b6de3477593ee243b90b34658cca20ed943caeca835512bada739208f", + "layer3": "f2362face2bf9458748b6d8da4e33ceee6f52f1d4f2513ac955f076a275076ef", + "layer30": "072e569bb0bd979f2cc7ed87f8b68649418570d60c31c78f413968a75fc9c5b8", + "layer31": "92486de2ccf48a0b3e556d68d0e718cc6dcb1637fe4748af5b11ecb83a60e7f3", + "layer32": "6d11506a66c4b9f4cea48f71b19eb60aa5f4ddf13f7e4dc3935f2bdad7258fdd", + "layer33": "ebf8d8c3534f8a8d7bdeaa677c3750d52fc17a1cf796ed7c7fdff4ef3e95d3ac", + "layer34": "55405ed12e72c43abe543d55758fc42d236fd3c61493d1c7ff6ae40eaf7fa502", + "layer35": "bff2ae45b89598d748d4226b5561936e7a6864683e2bae899e8509ff12bae31b", + "layer36": "92db2aaf748c9f95e8df030b47b26321492f62ad46c1df9cc4005b4724a693ac", + "layer37": "77ca2847b6fdfa385e0111ea25db316fa2986ec6e84f6e4fbfc30ab76e8bc7ed", + "layer38": "88ddf6ee32902b03eef06c3f475c1d3f8b6e04f97b0b62ebb63706d8b47e7479", + "layer39": "d9ba7d0ba445ff684483b2ca61b692cb7cd7ee6fc3dbb701c3c126da919d565a", + "layer4": "58f9312200f23da5a0c4a03f468a8429d67863b57b688a68eb28801ee051fc23", + "layer40": "27a854931b1d9c6c5760179804c583d3291efe27dc947b436bf1ea2e02991d1f", + "layer41": "90acfe0ad7f1426de8a3c8d7ce75ebd038ae7e28c23f99558730456bd578acad", + "layer42": "aed73f50dfe098882f6e259596feaf57b0a3e9585d019a4ef366da9dfce2db00", + "layer43": "bf6a3f59f2bdda1672a5f133ddfbc72cfac95cf29e250bc242378c98d0acaf82", + "layer44": "f823a38f7ac7cb4311c0083a413c4326083d649d100ccda2fc11cd447c895bb9", + "layer45": "0cfb5407942d8e694b5ac6f3367947700e36e91db3447e93f7e0ea1806bf5207", + "layer46": "d27dc815230df8c1bdf12407dc9ebee88005320c8a71834e3628de4de61d98d8", + "layer47": "a3cf298e8cfb5c7cd3db91341c545db9fc377d68c867c0c0c02cc9963ebb3781", + "layer5": "959a1f213733eb5036623d9de750afb8d96d931037ab8d79e6ea86f3165ff740", + "layer6": "0af5fb0fe8889723490d919d44da64ed34347421020be17b0d1c1a61d0e91e2c", + "layer7": "4878416361b610adc87125d7b8f364c09931d8c9c3ff8fb40a9f82b7204af591", + "layer8": "dc552095fd0625ddc19e4b6f48469ecc167883f935644c3a3c99a0b80c1d5a6a", + "layer9": "8c85d6559929773cb5b08fd3b32d12aac255562df7940b343691d652db8d834a" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "baseline/p0064-b4-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "baseline/p0064-b4-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "b6f90e09a20a53772513a4b600371a17c30a670eb8b78ce14f3fa997e72f1c62", + "layer0": "5e86f46b86042b3befddc9e3cf614782b90921d911deb1a0277eb3a6d5e0c117", + "layer1": "316031fc5922a711d626eb51d3d8bf85beb104f936c96006f826558d728ce91c", + "layer10": "56329904bd137f4e1f99e8fc07c4524bcd1102b1628151e60c7198923641c3dc", + "layer11": "ebfeaefb303cd0d41cbb507dab031b124df374683f18e2c31b94f9130ecfa630", + "layer12": "cfba9fa270035f36ed0946b6d2f81f1599ea2aa8329347d7027b20eea0d53435", + "layer13": "675b22e6b39b9902fff67784fcc372671cdf7f45e15b11ecd194074db98259db", + "layer14": "2a38b28823a6fdcbdfe5ee9b6738f2419b6e051806310556ad793abb298448ee", + "layer15": "39e3dcbe117d6f882428537a61484b1015906ec9f64c73695c35e7898181c4c8", + "layer16": "cdd35fe7f57343d9d8044dfcfa2c3ec4f196cbed95b7478f218e5259c2af698b", + "layer17": "6d37b67894d0fc5519dc61fc2bf8a721e0e678ca2854de1488aa235d79ea95c2", + "layer18": "cbc359dc919d8e001a515ec3b5c3829a88b0195e6829eb4f2944e877a571339c", + "layer19": "21afd4ffebbf5dc304e92d8d2df03ae7bf7bf80715dbd950c4f07797baca378a", + "layer2": "aa9e2830a632410821028776aca979356442da9cbceb050c6ef49e7ebed84b48", + "layer20": "0ebb6e3bf30afe0df987fb3cdb3a893b7f4f792250e068b2c13c67d4244f03f3", + "layer21": "9883227ba5d29127765158f0d1da0658f24458d9668b7fd252172a0eab0563d6", + "layer22": "8917c3b454bcd68d1a2fbe630f0484f196f4ce0e2d11e322e6dc2ec5443748ce", + "layer23": "07a035ca6c42381d26b1ced490bcea73366f8c879b064033525c0f71d230f0e9", + "layer24": "4419fffe351852328e0e0a5e7852db183949f763bbfd78ce1e9e389c277e7bb6", + "layer25": "fd971525eaef15a6dd122a1942736c83a97b423bfdcdefda4bedd6f942170c17", + "layer26": "c32a396a33d597d6e0a175727233f6ede8465e9810c0703d0e3f08478eb3a8db", + "layer27": "921838011bd70e05f22578081a779eb8e134bd86ea38badb2cbb1b2974812dc7", + "layer28": "a0e246e7f23e239ed3aa86b695e41ee19b5e5b125e7221eb10f6419177015687", + "layer29": "0fc4eaf56e1284a8af483185a343fb2bda24a38ffaf87e6688b7cbc2bfbed937", + "layer3": "9bac16f649c286635cbf8fcede8bba5c1cb61d36516058f11370b810fb072e36", + "layer30": "f2dfe05e0d81bb91bfb109cf2e92e131177f2bf6e88f665e1e276df9fd3c8aad", + "layer31": "f4381e59b694346b25f822a031232d6296c4e897a9866694f0385945429ea345", + "layer32": "a43c7ea4a99376018cd3410e36aa7ff5946601ae60227a4f752093ccee513b52", + "layer33": "6c2416fe97dfa911fc3db240d477a2558c614f272a76aefb0c129e1ff982211f", + "layer34": "4718fb1f6f482f005b9af231c8c43773e428c7a8d1e7d5913f9a73a90f48781e", + "layer35": "d48c9a49005a33dd760bc3f18e38c835c80ff5ef0371856b082d901a992a9f8d", + "layer36": "0c7ee3ef5dd7a1cb99df9b17b45f1a48db7dfbfb98372b9498fe923a34d59c48", + "layer37": "560b9cea75682bf2180aa08ded7ea83cd2c8d8139893301c7a8342b48f9122b0", + "layer38": "81e9ac48af216a64d627585c335db294a9409c05270e9d31abd6d5f1e96968ea", + "layer39": "504f5034efde268ab8e49fde7e19799ad7b571c50a94afbde49a18ae2d34dd08", + "layer4": "50b43448b34a040403d6937a236de2ef8e0fccefd98545c12ac36dac8a70fcaf", + "layer40": "0ac6d17c33cca1bacaaf5bad8b6543aad2ce025218834402a8e6640e666955c7", + "layer41": "8b20544a888fafe987688c5ca45b3c64a0ad7bf72dc59f45aac598a330a08b0c", + "layer42": "ab104136f3228dfbceae2930ff9e31c99f34c2dd539541e7482c47fea55e3d72", + "layer43": "f2b43d327a1002cc0365f2a45dfc7c3afc9f38f82ba87c2cb93eabe0b291e03e", + "layer44": "a445bad88b31c6602a768bc7d5ed1b354823559841bcca1d6526402460aec839", + "layer45": "9faa5bfdcea51a143df40a047a434816a6c571a1a4b9de560d0e3020ff95f03b", + "layer46": "1a80391137d78d9ca2c14678915ec0707e4829684264a73fc426209f10603cb6", + "layer47": "337c2887a9488cfc8ac22a8def008d340e56d9a8d86f7a8b7ae941c6e3c8f3a0", + "layer5": "90eca74a5e89fe68fd13f470e7ae0bedf8266380b185ec855b5d96c2bfe5519e", + "layer6": "b7d46e2a7fd2e67999fcbd3021b3af6159f40d85012b50af5eb953f323216af0", + "layer7": "e29657d0917f95f1c3b9f6cf470219638b896fe4529ca7e320c074219cc12998", + "layer8": "ac7a99abba73073ab330b26e9d8a506c5495e3b3bdd690d5df361294707df33e", + "layer9": "038485209612b9350c2fb6a599b1e7b414039caa3481753ee68c41b3915fe673" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "baseline/p0064-b4-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "baseline/p0064-b4-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "b6f90e09a20a53772513a4b600371a17c30a670eb8b78ce14f3fa997e72f1c62", + "layer0": "5e86f46b86042b3befddc9e3cf614782b90921d911deb1a0277eb3a6d5e0c117", + "layer1": "316031fc5922a711d626eb51d3d8bf85beb104f936c96006f826558d728ce91c", + "layer10": "56329904bd137f4e1f99e8fc07c4524bcd1102b1628151e60c7198923641c3dc", + "layer11": "ebfeaefb303cd0d41cbb507dab031b124df374683f18e2c31b94f9130ecfa630", + "layer12": "cfba9fa270035f36ed0946b6d2f81f1599ea2aa8329347d7027b20eea0d53435", + "layer13": "675b22e6b39b9902fff67784fcc372671cdf7f45e15b11ecd194074db98259db", + "layer14": "2a38b28823a6fdcbdfe5ee9b6738f2419b6e051806310556ad793abb298448ee", + "layer15": "39e3dcbe117d6f882428537a61484b1015906ec9f64c73695c35e7898181c4c8", + "layer16": "cdd35fe7f57343d9d8044dfcfa2c3ec4f196cbed95b7478f218e5259c2af698b", + "layer17": "6d37b67894d0fc5519dc61fc2bf8a721e0e678ca2854de1488aa235d79ea95c2", + "layer18": "cbc359dc919d8e001a515ec3b5c3829a88b0195e6829eb4f2944e877a571339c", + "layer19": "21afd4ffebbf5dc304e92d8d2df03ae7bf7bf80715dbd950c4f07797baca378a", + "layer2": "aa9e2830a632410821028776aca979356442da9cbceb050c6ef49e7ebed84b48", + "layer20": "0ebb6e3bf30afe0df987fb3cdb3a893b7f4f792250e068b2c13c67d4244f03f3", + "layer21": "9883227ba5d29127765158f0d1da0658f24458d9668b7fd252172a0eab0563d6", + "layer22": "8917c3b454bcd68d1a2fbe630f0484f196f4ce0e2d11e322e6dc2ec5443748ce", + "layer23": "07a035ca6c42381d26b1ced490bcea73366f8c879b064033525c0f71d230f0e9", + "layer24": "4419fffe351852328e0e0a5e7852db183949f763bbfd78ce1e9e389c277e7bb6", + "layer25": "fd971525eaef15a6dd122a1942736c83a97b423bfdcdefda4bedd6f942170c17", + "layer26": "c32a396a33d597d6e0a175727233f6ede8465e9810c0703d0e3f08478eb3a8db", + "layer27": "921838011bd70e05f22578081a779eb8e134bd86ea38badb2cbb1b2974812dc7", + "layer28": "a0e246e7f23e239ed3aa86b695e41ee19b5e5b125e7221eb10f6419177015687", + "layer29": "0fc4eaf56e1284a8af483185a343fb2bda24a38ffaf87e6688b7cbc2bfbed937", + "layer3": "9bac16f649c286635cbf8fcede8bba5c1cb61d36516058f11370b810fb072e36", + "layer30": "f2dfe05e0d81bb91bfb109cf2e92e131177f2bf6e88f665e1e276df9fd3c8aad", + "layer31": "f4381e59b694346b25f822a031232d6296c4e897a9866694f0385945429ea345", + "layer32": "a43c7ea4a99376018cd3410e36aa7ff5946601ae60227a4f752093ccee513b52", + "layer33": "6c2416fe97dfa911fc3db240d477a2558c614f272a76aefb0c129e1ff982211f", + "layer34": "4718fb1f6f482f005b9af231c8c43773e428c7a8d1e7d5913f9a73a90f48781e", + "layer35": "d48c9a49005a33dd760bc3f18e38c835c80ff5ef0371856b082d901a992a9f8d", + "layer36": "0c7ee3ef5dd7a1cb99df9b17b45f1a48db7dfbfb98372b9498fe923a34d59c48", + "layer37": "560b9cea75682bf2180aa08ded7ea83cd2c8d8139893301c7a8342b48f9122b0", + "layer38": "81e9ac48af216a64d627585c335db294a9409c05270e9d31abd6d5f1e96968ea", + "layer39": "504f5034efde268ab8e49fde7e19799ad7b571c50a94afbde49a18ae2d34dd08", + "layer4": "50b43448b34a040403d6937a236de2ef8e0fccefd98545c12ac36dac8a70fcaf", + "layer40": "0ac6d17c33cca1bacaaf5bad8b6543aad2ce025218834402a8e6640e666955c7", + "layer41": "8b20544a888fafe987688c5ca45b3c64a0ad7bf72dc59f45aac598a330a08b0c", + "layer42": "ab104136f3228dfbceae2930ff9e31c99f34c2dd539541e7482c47fea55e3d72", + "layer43": "f2b43d327a1002cc0365f2a45dfc7c3afc9f38f82ba87c2cb93eabe0b291e03e", + "layer44": "a445bad88b31c6602a768bc7d5ed1b354823559841bcca1d6526402460aec839", + "layer45": "9faa5bfdcea51a143df40a047a434816a6c571a1a4b9de560d0e3020ff95f03b", + "layer46": "1a80391137d78d9ca2c14678915ec0707e4829684264a73fc426209f10603cb6", + "layer47": "337c2887a9488cfc8ac22a8def008d340e56d9a8d86f7a8b7ae941c6e3c8f3a0", + "layer5": "90eca74a5e89fe68fd13f470e7ae0bedf8266380b185ec855b5d96c2bfe5519e", + "layer6": "b7d46e2a7fd2e67999fcbd3021b3af6159f40d85012b50af5eb953f323216af0", + "layer7": "e29657d0917f95f1c3b9f6cf470219638b896fe4529ca7e320c074219cc12998", + "layer8": "ac7a99abba73073ab330b26e9d8a506c5495e3b3bdd690d5df361294707df33e", + "layer9": "038485209612b9350c2fb6a599b1e7b414039caa3481753ee68c41b3915fe673" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "baseline/p0256-b1-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "baseline/p0256-b1-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "d45b13953a6723e1432c10560b12fc3a17df46be807636260ad47ca262b8f7df", + "layer0": "ba7bef60950f50bb784bdbcbf6756d14f478afb2056ee0097cb8620c1e3cb06d", + "layer1": "cb78298093a80d0e15e4fd051af782ef76395db19918bef90ef5b88a962b0888", + "layer10": "993c5ceb97eab2a34dcdd8bf36bc467c43392925b8b3b10574d9bea2f5e88a0c", + "layer11": "0ace185b37799008a2578f7a068d3ff63de95086bda1d9724d12695c3e0ef1ce", + "layer12": "35b21add3d724dc592ca71f132efcb58968abd2829857087bbc80eb94d648e1c", + "layer13": "c95980d6b8bb2a05da09f8c49bafc177b9d0cb4946dd5f18389abd10bd3d7d85", + "layer14": "6d142aef4ad626d72d96a8465f7bb2e532ce9e855b721c55ffc4c6dbc9891e5e", + "layer15": "0f8f96e698a22cab4f523b7feb0c2636d216447b62c189cdc434e7e2b0f28403", + "layer16": "49ace30bd51a4d3d5ab90c8ccab6709ce1ce9e1c8c125c904184cfdeae8997d4", + "layer17": "343f065a873afd3ae012097413e56fb4c75f7e9fb8288f3412fd0b8212b1635f", + "layer18": "f58b2a2482a2fc638b4a130e2df45b012c095e471c740f3a5f3571e5e67750ec", + "layer19": "40d9527ae47c8ba74cdefd698ad7f8199922b2e293f2a82b41862555db639d7c", + "layer2": "1755bb03edc9109fc07a6a9bc8ebc6865e24b32e1719d7f47acbfcb2241e92ee", + "layer20": "ee33cb92f8c00894ee80c59685f3da1dd988fb35433f21aaf2c20278e6534b74", + "layer21": "f91ddc49837180ddf156d479032805a9ee2a84902168f6a6a1adfd8a9724948c", + "layer22": "e4645e911ddcc5b8c9d0dffd7f9673f6d7c0b90531b06346d5dbdbcf0d6b99bd", + "layer23": "09fc780a575d37f786efa1551b02781716acba6f35f8b556c0e1cd7265a045da", + "layer24": "b1a4b06722bcb20347e76650e51054f4cca7be7129fe4e599a3147bfd2fe2b2a", + "layer25": "1e45777af5a55e0908d5021a9a2f2ce50e79a2a009fb9093a418909d5533a6c8", + "layer26": "6f5cb0bb0bd68d6d760a809838d574353dc3053aa783f52dc76831cde5fc1ef9", + "layer27": "e5ea9eb45be2dcad437465bdaeb89336f20dc30f4c97e4c12b79dea7b93b6b36", + "layer28": "c2f7e456363dac0a2aa298135c3e4b855538ed82f3f2428505926602c2de298d", + "layer29": "b8c680a3f5a99e0835eb90d4fcbf3e5c31e054acab88e5d1714070940c5efe7a", + "layer3": "8c2e2976a31a382482c3fc579fd93357850e64f1797415630fc8d9b2989cba7b", + "layer30": "ea173a758a3cf770e7630f290d2cec966d227d19f82322754190f0499773d15e", + "layer31": "f8679e012f6fce5ec4510bf26b1cfdd664c38b4c05e7558f8812eae13285854e", + "layer32": "d375b093ecc1a1b965ccebdba0462fdd95b6457bfea0118877a7734c01b8bfca", + "layer33": "0bb90cde221c40e60955501f45f82bcabe90b328cf50cea4da9f3b3a83c034de", + "layer34": "b1aecdcc8b0772e93323a32738c5c827b330fa08b99df4e624eae9e4a33c8b3a", + "layer35": "1b06a40737c60063c471f47398004bd5a526009c21a7047c2b258e77828e0912", + "layer36": "d403b709be3507c20ffac0e5d64eeed8d8fd6a9a136c4af6d1ada6236543fe2e", + "layer37": "ea79c1449f1abfd5fc16036e59a739ef860948264b51958ff2e6e7a0d3dc2182", + "layer38": "ecbbf1b3b2e75a8483efb5bf7c8cfc5bd7861e7ada6c242838de382a3c699fdd", + "layer39": "6d3f82a5f60fe1e9d238e9102fcf29586dfce0758457241e599f91ee8ccbaeb8", + "layer4": "51be3c5dc9fc65645254557fe3e6c405ab62390d6ca63f6ccb246957a2c62967", + "layer40": "476c70adfeecef8dd01f28f5255631b074923111bb2c61e2cbec74b427d71609", + "layer41": "849bf1b58ef3dda94bc8742f369a1e388cb1031ca30b70991e16fe1630d6501a", + "layer42": "1f5e9d03b45e40d867ab69a5157d668c9c0a683630c0f10f6723da53888bc115", + "layer43": "134eabb978af2204d6b9b6aac23164cccdcfce3407cd8b5d79bb1e76154cd76a", + "layer44": "a38dd2518110fd851409084dcefefcb6a1faf92fe957cde4f59b7e229ceb494f", + "layer45": "fb60fb10d3eff59a42d051cf4a4a6975bcb31d5f9e5729c74a026ab9cbed130d", + "layer46": "64184aff8faf9d15a5799b95e35525a9926eacd52d97f381bb8762af6ab8c600", + "layer47": "7a52d411e17db146820d58a713f4a836394319ec747b84c486806efa287fdb12", + "layer5": "c33833472b7c961796d448933920b546a329d4ec65722964e779b8b3a804eae5", + "layer6": "bddb50159cd1268a2ecaf23cffdc338d479888a87d112f9f51d3c85efdb30004", + "layer7": "a7a11676faea1b17536aa65bce9505ce923fedf22fc59c0d78df90903a9ae15b", + "layer8": "4085339183dbb82500bc7173c9224a3a12288d210fa83c04073cda184cdee37d", + "layer9": "a1335b980d119a17e7bc7c3542e05027a0d361d756cd3687518f2a04cb2f732f" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "baseline/p0256-b1-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "baseline/p0256-b1-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "d45b13953a6723e1432c10560b12fc3a17df46be807636260ad47ca262b8f7df", + "layer0": "ba7bef60950f50bb784bdbcbf6756d14f478afb2056ee0097cb8620c1e3cb06d", + "layer1": "cb78298093a80d0e15e4fd051af782ef76395db19918bef90ef5b88a962b0888", + "layer10": "993c5ceb97eab2a34dcdd8bf36bc467c43392925b8b3b10574d9bea2f5e88a0c", + "layer11": "0ace185b37799008a2578f7a068d3ff63de95086bda1d9724d12695c3e0ef1ce", + "layer12": "35b21add3d724dc592ca71f132efcb58968abd2829857087bbc80eb94d648e1c", + "layer13": "c95980d6b8bb2a05da09f8c49bafc177b9d0cb4946dd5f18389abd10bd3d7d85", + "layer14": "6d142aef4ad626d72d96a8465f7bb2e532ce9e855b721c55ffc4c6dbc9891e5e", + "layer15": "0f8f96e698a22cab4f523b7feb0c2636d216447b62c189cdc434e7e2b0f28403", + "layer16": "49ace30bd51a4d3d5ab90c8ccab6709ce1ce9e1c8c125c904184cfdeae8997d4", + "layer17": "343f065a873afd3ae012097413e56fb4c75f7e9fb8288f3412fd0b8212b1635f", + "layer18": "f58b2a2482a2fc638b4a130e2df45b012c095e471c740f3a5f3571e5e67750ec", + "layer19": "40d9527ae47c8ba74cdefd698ad7f8199922b2e293f2a82b41862555db639d7c", + "layer2": "1755bb03edc9109fc07a6a9bc8ebc6865e24b32e1719d7f47acbfcb2241e92ee", + "layer20": "ee33cb92f8c00894ee80c59685f3da1dd988fb35433f21aaf2c20278e6534b74", + "layer21": "f91ddc49837180ddf156d479032805a9ee2a84902168f6a6a1adfd8a9724948c", + "layer22": "e4645e911ddcc5b8c9d0dffd7f9673f6d7c0b90531b06346d5dbdbcf0d6b99bd", + "layer23": "09fc780a575d37f786efa1551b02781716acba6f35f8b556c0e1cd7265a045da", + "layer24": "b1a4b06722bcb20347e76650e51054f4cca7be7129fe4e599a3147bfd2fe2b2a", + "layer25": "1e45777af5a55e0908d5021a9a2f2ce50e79a2a009fb9093a418909d5533a6c8", + "layer26": "6f5cb0bb0bd68d6d760a809838d574353dc3053aa783f52dc76831cde5fc1ef9", + "layer27": "e5ea9eb45be2dcad437465bdaeb89336f20dc30f4c97e4c12b79dea7b93b6b36", + "layer28": "c2f7e456363dac0a2aa298135c3e4b855538ed82f3f2428505926602c2de298d", + "layer29": "b8c680a3f5a99e0835eb90d4fcbf3e5c31e054acab88e5d1714070940c5efe7a", + "layer3": "8c2e2976a31a382482c3fc579fd93357850e64f1797415630fc8d9b2989cba7b", + "layer30": "ea173a758a3cf770e7630f290d2cec966d227d19f82322754190f0499773d15e", + "layer31": "f8679e012f6fce5ec4510bf26b1cfdd664c38b4c05e7558f8812eae13285854e", + "layer32": "d375b093ecc1a1b965ccebdba0462fdd95b6457bfea0118877a7734c01b8bfca", + "layer33": "0bb90cde221c40e60955501f45f82bcabe90b328cf50cea4da9f3b3a83c034de", + "layer34": "b1aecdcc8b0772e93323a32738c5c827b330fa08b99df4e624eae9e4a33c8b3a", + "layer35": "1b06a40737c60063c471f47398004bd5a526009c21a7047c2b258e77828e0912", + "layer36": "d403b709be3507c20ffac0e5d64eeed8d8fd6a9a136c4af6d1ada6236543fe2e", + "layer37": "ea79c1449f1abfd5fc16036e59a739ef860948264b51958ff2e6e7a0d3dc2182", + "layer38": "ecbbf1b3b2e75a8483efb5bf7c8cfc5bd7861e7ada6c242838de382a3c699fdd", + "layer39": "6d3f82a5f60fe1e9d238e9102fcf29586dfce0758457241e599f91ee8ccbaeb8", + "layer4": "51be3c5dc9fc65645254557fe3e6c405ab62390d6ca63f6ccb246957a2c62967", + "layer40": "476c70adfeecef8dd01f28f5255631b074923111bb2c61e2cbec74b427d71609", + "layer41": "849bf1b58ef3dda94bc8742f369a1e388cb1031ca30b70991e16fe1630d6501a", + "layer42": "1f5e9d03b45e40d867ab69a5157d668c9c0a683630c0f10f6723da53888bc115", + "layer43": "134eabb978af2204d6b9b6aac23164cccdcfce3407cd8b5d79bb1e76154cd76a", + "layer44": "a38dd2518110fd851409084dcefefcb6a1faf92fe957cde4f59b7e229ceb494f", + "layer45": "fb60fb10d3eff59a42d051cf4a4a6975bcb31d5f9e5729c74a026ab9cbed130d", + "layer46": "64184aff8faf9d15a5799b95e35525a9926eacd52d97f381bb8762af6ab8c600", + "layer47": "7a52d411e17db146820d58a713f4a836394319ec747b84c486806efa287fdb12", + "layer5": "c33833472b7c961796d448933920b546a329d4ec65722964e779b8b3a804eae5", + "layer6": "bddb50159cd1268a2ecaf23cffdc338d479888a87d112f9f51d3c85efdb30004", + "layer7": "a7a11676faea1b17536aa65bce9505ce923fedf22fc59c0d78df90903a9ae15b", + "layer8": "4085339183dbb82500bc7173c9224a3a12288d210fa83c04073cda184cdee37d", + "layer9": "a1335b980d119a17e7bc7c3542e05027a0d361d756cd3687518f2a04cb2f732f" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "baseline/p0256-b4-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "baseline/p0256-b4-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "5795c5c90d91c336a0375a4af6634aed1251c4094f93d18a9411a4f3f5421730", + "layer0": "bf0f44e41560572a645003483e9e5d6b4c13fbdd26f770d248037384af5d8410", + "layer1": "0eb88d0b44b6090036260e31912ed484b27ec140b0258f72fa05074216a0c471", + "layer10": "782476829ab747d1b2fef3f31fc889feabb48635d6c22286d15973b7db938aaa", + "layer11": "db2076bc5204c5a904e3ed127327dc17ccd3de3316bc0f6f2e7be6d29ac65596", + "layer12": "3ed1a1a9b925aa24eae8b8150d63910cb8134b68b591d58252fc82b836b02467", + "layer13": "2c183315e98a5a629b643427cae6ff89bfb3802bc770a378c32a576e05b2504b", + "layer14": "3be88c4913d88e72388047a95ff0c35f83fa756c2581b76214eeb5e8a83da6c3", + "layer15": "e6264b38dedbd7cbc4fb209baf37432e546b2f13d25ce5cf2d6e1cf9edfea957", + "layer16": "93b6c673d6cdfeeb26490b8fd72e17f8125dcc5255c6f0e1024c9129f59776c3", + "layer17": "b7064a1e3fd3a341e6a4907bda810660f750cf44256c603d90a49893c0c43d6b", + "layer18": "26867d73636914e2d708a8d67129d3a30fae38cc10cda47ebee5590ecc7b966f", + "layer19": "d2e00e7fb22ef26ae8154a5f12c9c68240ca755e27864c5aafad2ab4c93b24ce", + "layer2": "05cebc4844223e9ffd1ff405a3e5b4158f4df9ad31de36801446aa67ebc41186", + "layer20": "ef372c386871d523fd803d52df2f327d4a1b116b539fb86050f5ef0f9ea2dbd9", + "layer21": "0a2cfb46da47f4ea967372002f09a91c5cc404cd7ac54ee866e928da971e5422", + "layer22": "c1acd5a1d3f1311739c3b5f5c5788294e1552b649148e3c97d58fff76b9ee36f", + "layer23": "d426390612260db0378518f9b68bb47f1df82a14d7e66bd317e33995d4e1feeb", + "layer24": "3a01dd605c57d1767a6f69fee85f09d1f4d6580286f6459e1089468ffa8033f5", + "layer25": "86f096f1ead50da5da2218568baa8663afff740fd4dda3ab1ad14f0b7955e9f9", + "layer26": "cd16aaf20000032aa760e95f2a11731c20d972aa732312b451b29b9baa01ef65", + "layer27": "d4819d0c61ab5bebf1fc4f883e14a438bf42cf6b5b979779ee6944f31b788218", + "layer28": "af59217a0c3f7db71c2fd1cf4afcb2efcc493127f126874f776fb12289e2d1f5", + "layer29": "f5bbeee1fb280368568381af51e583c2d7bd80507ca2804a636e1925a2ba4a1c", + "layer3": "50207662369255cef314fec8b48b6884fc2c7afae72027295f3fdec3e7a6f338", + "layer30": "80801633ac967a1a7d7992f6caf40dbbb7949667bf4389a89520b284b856d3ec", + "layer31": "c5729b8135a09a3f87c0d790136f1dbf09f795c8761de938a78ab0cf17f60f7d", + "layer32": "048b6cccc0ae49efedf0555fe24c97023b02c0cf7396998e65d303f850b5fce7", + "layer33": "c4d6cf94da4cf69b55cba2ffb8e4b2fe7fc2231d56fe832835d4319e987c29a4", + "layer34": "3619bed1a76d39b6a9682e1c2b92df38062c7e122c7cddc7f1470d252a69ffca", + "layer35": "81c96ee7023e9bf0b366701b64a1f69034aec5f6ca8b884797cb3ff0cf1356ad", + "layer36": "b1204028af1aebdb8333467e6da7b4c53eabe225e3b540afaa92cf098852d3b5", + "layer37": "ce34c65a85f273bc3e8943c1de29155792df9fe1c87ab9740f9383475af624d6", + "layer38": "6eb8fc7dee23c1f0157751b9434e9f0b504f44c2a5d3906ce07ad36c4a5d4e6d", + "layer39": "0be5a19a04972297fabf820c7c35e74b533b9a80c660188698d33449115f9f1c", + "layer4": "c816410e6aa96b7b94b564286bf2354f08811e7732073bd3a58a5594aeeb6e25", + "layer40": "30ad7a3b53e1dd8b70fa7ec9bfb3c79d59c6ee4a0c3a76c6dafefe56c3b917fb", + "layer41": "7db35d5a79904c01078666ca824654336a888f189dbee51e873729b5fa9c6bc4", + "layer42": "532c45343d85afcd536033eb6f8e26fb8c6b4406f6b885d06c4b9417e8281e59", + "layer43": "a927ddaa75414de84aea577f7233f08051e675406a9c16b5931292eda2690cea", + "layer44": "8f7a32688a502af77e5b3348c76452d3071a3899ff39b38ad5d1651e996b78ae", + "layer45": "3ecbd3790f77a2916529aef0477dd2fe1d0274522c77502af3adc16fecfc820c", + "layer46": "46e760f836d17d6d2799de04d246446dffe6f444792028452cff62cf5dee3101", + "layer47": "483653f8e4fbcd2766057318a2dce44298d34dafb0f7c44c9c64fcd6e3ade4e9", + "layer5": "1a872f109ded785e75a0c4c95f6401ad93c143409ab0098c21e5fd73087df185", + "layer6": "bdfcc3a8427ddf195659ca3676e5ef75fcba101c0d4eddb48142710066699115", + "layer7": "fabead5e7d861916a643c8623df69439fcbb118752c59a59a96ca1938cba0e10", + "layer8": "5a2bc574743ee8a7a66a8cbfce49f0c047e1eed0df99da3659fb3d4daa887c33", + "layer9": "9b8f80614167f1037acd649cd35a031e5138a0b6a59913c82dd536e91718665e" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "baseline/p0256-b4-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "baseline/p0256-b4-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "5795c5c90d91c336a0375a4af6634aed1251c4094f93d18a9411a4f3f5421730", + "layer0": "bf0f44e41560572a645003483e9e5d6b4c13fbdd26f770d248037384af5d8410", + "layer1": "0eb88d0b44b6090036260e31912ed484b27ec140b0258f72fa05074216a0c471", + "layer10": "782476829ab747d1b2fef3f31fc889feabb48635d6c22286d15973b7db938aaa", + "layer11": "db2076bc5204c5a904e3ed127327dc17ccd3de3316bc0f6f2e7be6d29ac65596", + "layer12": "3ed1a1a9b925aa24eae8b8150d63910cb8134b68b591d58252fc82b836b02467", + "layer13": "2c183315e98a5a629b643427cae6ff89bfb3802bc770a378c32a576e05b2504b", + "layer14": "3be88c4913d88e72388047a95ff0c35f83fa756c2581b76214eeb5e8a83da6c3", + "layer15": "e6264b38dedbd7cbc4fb209baf37432e546b2f13d25ce5cf2d6e1cf9edfea957", + "layer16": "93b6c673d6cdfeeb26490b8fd72e17f8125dcc5255c6f0e1024c9129f59776c3", + "layer17": "b7064a1e3fd3a341e6a4907bda810660f750cf44256c603d90a49893c0c43d6b", + "layer18": "26867d73636914e2d708a8d67129d3a30fae38cc10cda47ebee5590ecc7b966f", + "layer19": "d2e00e7fb22ef26ae8154a5f12c9c68240ca755e27864c5aafad2ab4c93b24ce", + "layer2": "05cebc4844223e9ffd1ff405a3e5b4158f4df9ad31de36801446aa67ebc41186", + "layer20": "ef372c386871d523fd803d52df2f327d4a1b116b539fb86050f5ef0f9ea2dbd9", + "layer21": "0a2cfb46da47f4ea967372002f09a91c5cc404cd7ac54ee866e928da971e5422", + "layer22": "c1acd5a1d3f1311739c3b5f5c5788294e1552b649148e3c97d58fff76b9ee36f", + "layer23": "d426390612260db0378518f9b68bb47f1df82a14d7e66bd317e33995d4e1feeb", + "layer24": "3a01dd605c57d1767a6f69fee85f09d1f4d6580286f6459e1089468ffa8033f5", + "layer25": "86f096f1ead50da5da2218568baa8663afff740fd4dda3ab1ad14f0b7955e9f9", + "layer26": "cd16aaf20000032aa760e95f2a11731c20d972aa732312b451b29b9baa01ef65", + "layer27": "d4819d0c61ab5bebf1fc4f883e14a438bf42cf6b5b979779ee6944f31b788218", + "layer28": "af59217a0c3f7db71c2fd1cf4afcb2efcc493127f126874f776fb12289e2d1f5", + "layer29": "f5bbeee1fb280368568381af51e583c2d7bd80507ca2804a636e1925a2ba4a1c", + "layer3": "50207662369255cef314fec8b48b6884fc2c7afae72027295f3fdec3e7a6f338", + "layer30": "80801633ac967a1a7d7992f6caf40dbbb7949667bf4389a89520b284b856d3ec", + "layer31": "c5729b8135a09a3f87c0d790136f1dbf09f795c8761de938a78ab0cf17f60f7d", + "layer32": "048b6cccc0ae49efedf0555fe24c97023b02c0cf7396998e65d303f850b5fce7", + "layer33": "c4d6cf94da4cf69b55cba2ffb8e4b2fe7fc2231d56fe832835d4319e987c29a4", + "layer34": "3619bed1a76d39b6a9682e1c2b92df38062c7e122c7cddc7f1470d252a69ffca", + "layer35": "81c96ee7023e9bf0b366701b64a1f69034aec5f6ca8b884797cb3ff0cf1356ad", + "layer36": "b1204028af1aebdb8333467e6da7b4c53eabe225e3b540afaa92cf098852d3b5", + "layer37": "ce34c65a85f273bc3e8943c1de29155792df9fe1c87ab9740f9383475af624d6", + "layer38": "6eb8fc7dee23c1f0157751b9434e9f0b504f44c2a5d3906ce07ad36c4a5d4e6d", + "layer39": "0be5a19a04972297fabf820c7c35e74b533b9a80c660188698d33449115f9f1c", + "layer4": "c816410e6aa96b7b94b564286bf2354f08811e7732073bd3a58a5594aeeb6e25", + "layer40": "30ad7a3b53e1dd8b70fa7ec9bfb3c79d59c6ee4a0c3a76c6dafefe56c3b917fb", + "layer41": "7db35d5a79904c01078666ca824654336a888f189dbee51e873729b5fa9c6bc4", + "layer42": "532c45343d85afcd536033eb6f8e26fb8c6b4406f6b885d06c4b9417e8281e59", + "layer43": "a927ddaa75414de84aea577f7233f08051e675406a9c16b5931292eda2690cea", + "layer44": "8f7a32688a502af77e5b3348c76452d3071a3899ff39b38ad5d1651e996b78ae", + "layer45": "3ecbd3790f77a2916529aef0477dd2fe1d0274522c77502af3adc16fecfc820c", + "layer46": "46e760f836d17d6d2799de04d246446dffe6f444792028452cff62cf5dee3101", + "layer47": "483653f8e4fbcd2766057318a2dce44298d34dafb0f7c44c9c64fcd6e3ade4e9", + "layer5": "1a872f109ded785e75a0c4c95f6401ad93c143409ab0098c21e5fd73087df185", + "layer6": "bdfcc3a8427ddf195659ca3676e5ef75fcba101c0d4eddb48142710066699115", + "layer7": "fabead5e7d861916a643c8623df69439fcbb118752c59a59a96ca1938cba0e10", + "layer8": "5a2bc574743ee8a7a66a8cbfce49f0c047e1eed0df99da3659fb3d4daa887c33", + "layer9": "9b8f80614167f1037acd649cd35a031e5138a0b6a59913c82dd536e91718665e" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "baseline/p1024-b1-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "baseline/p1024-b1-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "58eb9aed2ac599729103717be0e2bf3129602daed8c80dae7f54d75d1c626bc2", + "layer0": "28e67b926c4b05495af5e152ff9dd63fc7ca4a61114f94588250cf97af84e117", + "layer1": "54fb6e2eff64749b8bb26e5c58bb44fdfc5dd40eea529538a5679d3ac5f73275", + "layer10": "eb80bcd18f0f67b9ab6a9ea4ce5a957a47a724ca8f1528278f0d9ca950cb3642", + "layer11": "10196684c66ec4106726cd2d37bdad0cae333bf7ed6a6664b4f3f12335bfa317", + "layer12": "439b088fa691d19a7c5316219b01680a6bac03921179b035604d264fcd481482", + "layer13": "076d15310e5c82dff2b7de3be04cb073e441c79ecd842e0ca106e03bc8fca557", + "layer14": "520d7f330e19e23c794df46528144d5c27cc979e2b27247e6d6d2c1ae6839a59", + "layer15": "146a492a4e9852b3c54301d12fb481e1f1ff795538ded40005771fb00cc4793d", + "layer16": "549588774658bef489c130fbce0ac39181797dc80b623e0334930194dd1c3380", + "layer17": "4feb38011e3264ecae15ee115bee84e2094189d52935f176b124c07be0ae673d", + "layer18": "9085b1bce83f6193eb5f3031a1e127332f43a5b7461104fc81854661da8c6bdf", + "layer19": "e80fac9189bc8a1e56875f7ac5602122a9c4e520ced7316c2a78f320671d5fe2", + "layer2": "397a3bd53f0e380a988f3b86f24bed240d20b3f030379349ceedf7da3613487b", + "layer20": "94985b16331fae29e2feb3442f9c4838444f2908daf63df97f12c55d24c9472d", + "layer21": "632e0674f61c1d7d9d427e34225a89e503d2ed6602164204a5971f3494565f14", + "layer22": "02623b13cc475ee3b182bb9583ec950e272e7f32b463ab6ecc6f4c8c8dd30f3a", + "layer23": "54fbc497aa2bae601dd3ba230110fe3834ac515d8402953bd373eac5867425c5", + "layer24": "9a2b84b7ab3e0f51f8e3801b8a78c6e8cdb66d475badea5bb64bc0f2d5cec32d", + "layer25": "23c2aafbbdc441eaa7c5d5bfeddd46419f77625f6b89d3c98384678311e03df6", + "layer26": "516a26fbbb61797989a659991f043e39d812d464a81c48ffd339adfb14a3744f", + "layer27": "bf12649f7001466c337d2853098b9832b132155875f7b96a27d7aecf31a7154c", + "layer28": "625b8d2ef04da553f2ba344f14de1e013b171704d09e036fc07712cd08c2a1b7", + "layer29": "bf09aca419ecdabda4a8c8283aadfa29192f52f0738aeea118e40080d663f100", + "layer3": "29159de09eea1e92172618404e676105ed41445f95144262b658f9047370a760", + "layer30": "7a38125a677747c3320f6a669e480cf00e4337b73b74cb27a37f284d08e8bae9", + "layer31": "b7c18a9a642ed4bc52dd6c9bf25c01a83040397a0eddf0e22a9abda237b4a622", + "layer32": "ca5fb56b122f3cc20a5e94abd7c74df3ec6b9adfd50990042e12b0e20e0137b2", + "layer33": "57e17ce86c19f351e595e9f61801bea070c000f3aec4a1ebf2a8a85533075862", + "layer34": "80201d7d8a1b8f8a49a38ceb659f5399ab25713acfde47d5d5c7b29c38672530", + "layer35": "d4b87d0b7f825b0b4f36da983ae9fa9526fc4573f676934bc7ea9957c3233dcb", + "layer36": "4b297a8ae56d08a7914b4f53cef9e0f68cc205e36a9a6d8971b8e239ed5c8808", + "layer37": "f5714317aa12f96aa8430686cb2c9cfcc6f903721f8d66223f6879e99e02629d", + "layer38": "30b6cd9b1e425570488bd6756202e193785c7d6ebea2106a2a35b04ca92a7b98", + "layer39": "88505ca02b61a1e45b5a81019cd10f017578ef1584b51850631d6ceb40ec04a0", + "layer4": "b74c8be48ce9c3f2a2fdaa767798764d2d5c713402f72622f4c68ed5d176342d", + "layer40": "217556023d4b629229ae0d3469fa56bec14a49a5a253ad765992141622f1e9f8", + "layer41": "a6cdfa8c2a8e5d211660d5252569ba9ee412b35bcea75ab1a6bac2f2bdecd46e", + "layer42": "ef55fbeb6458522f06d927879d10725632da8435655645893e3f69083b936758", + "layer43": "670ae0654f0ec1c8872665bc3a2a766652c4e583803eba53b846542ed5aa3ef7", + "layer44": "14c9752e1365152c0f1251e99cbe3eb2f6df04ddc9c359ac11429333a0a3bc66", + "layer45": "67d47ea1be00a516ddf3e67526bdd3147e51879f6b9df738c6e225e29931d4cf", + "layer46": "de38b02d5fa732198834e017911f01143c6c63fe08f0d881f1c37109f9117de5", + "layer47": "d59b0d37267a459b0204d5fd229c1c939140b9ebfa3daabf62149bd4dd150d53", + "layer5": "98b4f0cac36424f550303eb76522e3688ff7faad30eb89e213558460f09e79b7", + "layer6": "736254d2c4c8f566d97e7d144a4ad68a97f3ef53664ad4ab4186caceb6904ef6", + "layer7": "72efba9c748ab6bd0c7bbecdd21b144252fb6ffc1b42fc150b6024fa504db8a0", + "layer8": "f0233c964362c88172f8ab8902d34653b8ee38a253f3728802a81d18f091a707", + "layer9": "dd773e17960cc7a4563d67655b53d9f7e2dad4043b91d0b033f38ac1b042806d" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "baseline/p1024-b1-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "baseline/p1024-b1-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "58eb9aed2ac599729103717be0e2bf3129602daed8c80dae7f54d75d1c626bc2", + "layer0": "28e67b926c4b05495af5e152ff9dd63fc7ca4a61114f94588250cf97af84e117", + "layer1": "54fb6e2eff64749b8bb26e5c58bb44fdfc5dd40eea529538a5679d3ac5f73275", + "layer10": "eb80bcd18f0f67b9ab6a9ea4ce5a957a47a724ca8f1528278f0d9ca950cb3642", + "layer11": "10196684c66ec4106726cd2d37bdad0cae333bf7ed6a6664b4f3f12335bfa317", + "layer12": "439b088fa691d19a7c5316219b01680a6bac03921179b035604d264fcd481482", + "layer13": "076d15310e5c82dff2b7de3be04cb073e441c79ecd842e0ca106e03bc8fca557", + "layer14": "520d7f330e19e23c794df46528144d5c27cc979e2b27247e6d6d2c1ae6839a59", + "layer15": "146a492a4e9852b3c54301d12fb481e1f1ff795538ded40005771fb00cc4793d", + "layer16": "549588774658bef489c130fbce0ac39181797dc80b623e0334930194dd1c3380", + "layer17": "4feb38011e3264ecae15ee115bee84e2094189d52935f176b124c07be0ae673d", + "layer18": "9085b1bce83f6193eb5f3031a1e127332f43a5b7461104fc81854661da8c6bdf", + "layer19": "e80fac9189bc8a1e56875f7ac5602122a9c4e520ced7316c2a78f320671d5fe2", + "layer2": "397a3bd53f0e380a988f3b86f24bed240d20b3f030379349ceedf7da3613487b", + "layer20": "94985b16331fae29e2feb3442f9c4838444f2908daf63df97f12c55d24c9472d", + "layer21": "632e0674f61c1d7d9d427e34225a89e503d2ed6602164204a5971f3494565f14", + "layer22": "02623b13cc475ee3b182bb9583ec950e272e7f32b463ab6ecc6f4c8c8dd30f3a", + "layer23": "54fbc497aa2bae601dd3ba230110fe3834ac515d8402953bd373eac5867425c5", + "layer24": "9a2b84b7ab3e0f51f8e3801b8a78c6e8cdb66d475badea5bb64bc0f2d5cec32d", + "layer25": "23c2aafbbdc441eaa7c5d5bfeddd46419f77625f6b89d3c98384678311e03df6", + "layer26": "516a26fbbb61797989a659991f043e39d812d464a81c48ffd339adfb14a3744f", + "layer27": "bf12649f7001466c337d2853098b9832b132155875f7b96a27d7aecf31a7154c", + "layer28": "625b8d2ef04da553f2ba344f14de1e013b171704d09e036fc07712cd08c2a1b7", + "layer29": "bf09aca419ecdabda4a8c8283aadfa29192f52f0738aeea118e40080d663f100", + "layer3": "29159de09eea1e92172618404e676105ed41445f95144262b658f9047370a760", + "layer30": "7a38125a677747c3320f6a669e480cf00e4337b73b74cb27a37f284d08e8bae9", + "layer31": "b7c18a9a642ed4bc52dd6c9bf25c01a83040397a0eddf0e22a9abda237b4a622", + "layer32": "ca5fb56b122f3cc20a5e94abd7c74df3ec6b9adfd50990042e12b0e20e0137b2", + "layer33": "57e17ce86c19f351e595e9f61801bea070c000f3aec4a1ebf2a8a85533075862", + "layer34": "80201d7d8a1b8f8a49a38ceb659f5399ab25713acfde47d5d5c7b29c38672530", + "layer35": "d4b87d0b7f825b0b4f36da983ae9fa9526fc4573f676934bc7ea9957c3233dcb", + "layer36": "4b297a8ae56d08a7914b4f53cef9e0f68cc205e36a9a6d8971b8e239ed5c8808", + "layer37": "f5714317aa12f96aa8430686cb2c9cfcc6f903721f8d66223f6879e99e02629d", + "layer38": "30b6cd9b1e425570488bd6756202e193785c7d6ebea2106a2a35b04ca92a7b98", + "layer39": "88505ca02b61a1e45b5a81019cd10f017578ef1584b51850631d6ceb40ec04a0", + "layer4": "b74c8be48ce9c3f2a2fdaa767798764d2d5c713402f72622f4c68ed5d176342d", + "layer40": "217556023d4b629229ae0d3469fa56bec14a49a5a253ad765992141622f1e9f8", + "layer41": "a6cdfa8c2a8e5d211660d5252569ba9ee412b35bcea75ab1a6bac2f2bdecd46e", + "layer42": "ef55fbeb6458522f06d927879d10725632da8435655645893e3f69083b936758", + "layer43": "670ae0654f0ec1c8872665bc3a2a766652c4e583803eba53b846542ed5aa3ef7", + "layer44": "14c9752e1365152c0f1251e99cbe3eb2f6df04ddc9c359ac11429333a0a3bc66", + "layer45": "67d47ea1be00a516ddf3e67526bdd3147e51879f6b9df738c6e225e29931d4cf", + "layer46": "de38b02d5fa732198834e017911f01143c6c63fe08f0d881f1c37109f9117de5", + "layer47": "d59b0d37267a459b0204d5fd229c1c939140b9ebfa3daabf62149bd4dd150d53", + "layer5": "98b4f0cac36424f550303eb76522e3688ff7faad30eb89e213558460f09e79b7", + "layer6": "736254d2c4c8f566d97e7d144a4ad68a97f3ef53664ad4ab4186caceb6904ef6", + "layer7": "72efba9c748ab6bd0c7bbecdd21b144252fb6ffc1b42fc150b6024fa504db8a0", + "layer8": "f0233c964362c88172f8ab8902d34653b8ee38a253f3728802a81d18f091a707", + "layer9": "dd773e17960cc7a4563d67655b53d9f7e2dad4043b91d0b033f38ac1b042806d" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "baseline/p1024-b4-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "baseline/p1024-b4-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "075873ff5d8cea35b8c2067d26abee0fca32cf3f9b7e63ee3dc80696dbe95f9c", + "layer0": "c9da7c58870f90bb507c70add20544731424d252b0439f1bb7193038bfbdd221", + "layer1": "531d69e122acf30ef37eb48819d1022efcd55d1ced140b7346c65a5e293d1e27", + "layer10": "10f922b7b87bd4225e9a8e45399c9e621b7dcb49f59f0ebb64bccfa1bc6a7df6", + "layer11": "c61045bf166ca144291b3426b14e677b9abe853b74a6f92c35b3639c9ea0fb5b", + "layer12": "853bd9b930493219171d93e6cbdbdaafcc3d22d41ee52bebc59eb0ffb5067dcc", + "layer13": "6ea64c91a9ae18f471b9d30cb673144b2507c26bcfc7f807523ba9508129cd92", + "layer14": "7e3523ce84c0c79ed2db54600a399ce4685fd28f0fe85f891d0c8bdebc811db7", + "layer15": "1676af889edbda17ccad57a54ac9f6cf1dca8fdb68f2d4c96d425216ef0f763e", + "layer16": "b0092b21f989097c1b60d1dd1205bedccd86f63f43123e2581879e49dd7cd5fd", + "layer17": "692a47a7dbc558235b5ee84d34c160c107e3639beff0453f896d9ea68784ff14", + "layer18": "4a56e759234ce4983c86b3cf8c479a1d8ac3fa667c9226295677901d717eb76a", + "layer19": "59a4e24234402198a2d122387509a9cec4f03a0c4fb366807f37b58492ff1fd9", + "layer2": "b28293ee6f402908748b82035869d110fdc41c2fa53765335ef37914ffe12777", + "layer20": "f9b4e59d78a54dc404a0e92231a5e091990e186ae92eff1667d584769dd9d2be", + "layer21": "75ac14d11ab2c8df06dac211e36ecd1c2d8129b6dead55d4246bb452e7cbd1e1", + "layer22": "b26631507047c40ed36264da58f2dc00bfe91b04782b17b09e91955857d27d03", + "layer23": "e4f0267f28abec0a7e9d4ab8743ef6ed12f6a02412ad72d84b603c0e9cca6904", + "layer24": "5ed9aaf2870edc82691bf9b3fcf7bdc598c8760f14119e1f888002d426e3f81a", + "layer25": "fae52df93e8b93985fb11ba27a14986ef0b95a03b96e5cc9447fe8a47cc23e44", + "layer26": "7bdad3d733ac7484b6f812d15bb7dc26e92202f6d23051d011aa17f70527b41c", + "layer27": "5b868fb33607eccb66434925a5e58c7a39e7032f5f07f3f5cf47371037239dde", + "layer28": "824d183a14a2dd39584a63b0d9255fd7f0234c14e679e830c7f196a16e60356c", + "layer29": "bdca32d9c4c45e842e518e8186d2f8db92c514bae203d3778c43592d6456c710", + "layer3": "4ecc2328d21227530ae630804a8522e6a5431985f6dee6cb0eef5301a76ba85c", + "layer30": "a659c1391d04dffbc6c5522aa8ea2e25302ff64cfd7c41eb55279495382e58d0", + "layer31": "88e2c6d3706c47a27f8c7cfbf9bb6e89955569cd1e6d1e52a014be8c77bf9fda", + "layer32": "72902db64dadc3b53664f49fdb069cda17a9cd8f2a417961ddd57f8bde5dbf18", + "layer33": "aaf47c22fa2dbd85d712dd979fa5297eabd58e02a7fbf5a8f5d5a74fb80586e1", + "layer34": "1e98a0a4312178a00d173042fff9a94184235a7d564347740af8f564dba7e0ab", + "layer35": "8c78f43c305220df38b9036d4d815f75329cad3d1d78e8838bf4fdcee350ce0a", + "layer36": "c74b7a95a07a6865ce0984327d147546b082eac05b4d9faf76cbe2a059c5fe7d", + "layer37": "bebaf9798168745bbd750bd87d77800c664598eec5ddaa4cdb056b9450f3ef77", + "layer38": "4a66582a43381a0bdf29f21f15cb7aeae5e54ab180536e5abb0774ae3ca103e8", + "layer39": "adf6fcdebf286dbf4b6707fba72617a8b8428878c74fa5d8ca56bf4d651cac0a", + "layer4": "9bb7c6650a70088ba525efa5bbe8b25d01ced414f7b9f15b393c331f6df8d1f6", + "layer40": "f919a20f530eb925dc5dd6c8d64b0128fc034f3c6f89ce86c409a139565e0790", + "layer41": "c7fed92a3c611e132971423afe50738f4764dd4d868f9fe3f47a79dbbaac606a", + "layer42": "9b8fe098d18b0b5276316763e50cc10bff8c96f63a67df16004d6e1ddfcbab87", + "layer43": "7640785dba714afa15d043e01cec1139ea508a55222015731039dec5138c45b5", + "layer44": "3d42fee55df4d75475162148703c43a011af305fb09ae0c6f899e068d7f9ce85", + "layer45": "8bb0c75d8fc0ad90a29aabfb0723802063e47bf8808fe7403b970efb61c9fddf", + "layer46": "6b30161bd4481658ed86d5495db36964a08b238891aed9e6a31f79d38f06d65d", + "layer47": "214b87cc29fed3c62c37ca2c3499e2f399ee1bb5467dde134b1f51ed59c80184", + "layer5": "ec2605ed9bc0587b9922ab67e0ce1fbaa1ac8f88625fa60a20dc17d7301d1d92", + "layer6": "0a3a13fb4d7a3b7cc03021907ea1696093c4678a309dd233abe4dfb746868345", + "layer7": "209329b03cc3969d96ff5095e6dd9bdbaa632663825787d4bbacab1a737056eb", + "layer8": "9b42d17c2a1c889ebe1881a4b525ae32a6ffdd31759834e043421769ce7be225", + "layer9": "7f8c69e2cfe1e10043499758d2a690d3fb8145d8ffa23343a20a00f49fc33e5f" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "baseline/p1024-b4-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "baseline/p1024-b4-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "075873ff5d8cea35b8c2067d26abee0fca32cf3f9b7e63ee3dc80696dbe95f9c", + "layer0": "c9da7c58870f90bb507c70add20544731424d252b0439f1bb7193038bfbdd221", + "layer1": "531d69e122acf30ef37eb48819d1022efcd55d1ced140b7346c65a5e293d1e27", + "layer10": "10f922b7b87bd4225e9a8e45399c9e621b7dcb49f59f0ebb64bccfa1bc6a7df6", + "layer11": "c61045bf166ca144291b3426b14e677b9abe853b74a6f92c35b3639c9ea0fb5b", + "layer12": "853bd9b930493219171d93e6cbdbdaafcc3d22d41ee52bebc59eb0ffb5067dcc", + "layer13": "6ea64c91a9ae18f471b9d30cb673144b2507c26bcfc7f807523ba9508129cd92", + "layer14": "7e3523ce84c0c79ed2db54600a399ce4685fd28f0fe85f891d0c8bdebc811db7", + "layer15": "1676af889edbda17ccad57a54ac9f6cf1dca8fdb68f2d4c96d425216ef0f763e", + "layer16": "b0092b21f989097c1b60d1dd1205bedccd86f63f43123e2581879e49dd7cd5fd", + "layer17": "692a47a7dbc558235b5ee84d34c160c107e3639beff0453f896d9ea68784ff14", + "layer18": "4a56e759234ce4983c86b3cf8c479a1d8ac3fa667c9226295677901d717eb76a", + "layer19": "59a4e24234402198a2d122387509a9cec4f03a0c4fb366807f37b58492ff1fd9", + "layer2": "b28293ee6f402908748b82035869d110fdc41c2fa53765335ef37914ffe12777", + "layer20": "f9b4e59d78a54dc404a0e92231a5e091990e186ae92eff1667d584769dd9d2be", + "layer21": "75ac14d11ab2c8df06dac211e36ecd1c2d8129b6dead55d4246bb452e7cbd1e1", + "layer22": "b26631507047c40ed36264da58f2dc00bfe91b04782b17b09e91955857d27d03", + "layer23": "e4f0267f28abec0a7e9d4ab8743ef6ed12f6a02412ad72d84b603c0e9cca6904", + "layer24": "5ed9aaf2870edc82691bf9b3fcf7bdc598c8760f14119e1f888002d426e3f81a", + "layer25": "fae52df93e8b93985fb11ba27a14986ef0b95a03b96e5cc9447fe8a47cc23e44", + "layer26": "7bdad3d733ac7484b6f812d15bb7dc26e92202f6d23051d011aa17f70527b41c", + "layer27": "5b868fb33607eccb66434925a5e58c7a39e7032f5f07f3f5cf47371037239dde", + "layer28": "824d183a14a2dd39584a63b0d9255fd7f0234c14e679e830c7f196a16e60356c", + "layer29": "bdca32d9c4c45e842e518e8186d2f8db92c514bae203d3778c43592d6456c710", + "layer3": "4ecc2328d21227530ae630804a8522e6a5431985f6dee6cb0eef5301a76ba85c", + "layer30": "a659c1391d04dffbc6c5522aa8ea2e25302ff64cfd7c41eb55279495382e58d0", + "layer31": "88e2c6d3706c47a27f8c7cfbf9bb6e89955569cd1e6d1e52a014be8c77bf9fda", + "layer32": "72902db64dadc3b53664f49fdb069cda17a9cd8f2a417961ddd57f8bde5dbf18", + "layer33": "aaf47c22fa2dbd85d712dd979fa5297eabd58e02a7fbf5a8f5d5a74fb80586e1", + "layer34": "1e98a0a4312178a00d173042fff9a94184235a7d564347740af8f564dba7e0ab", + "layer35": "8c78f43c305220df38b9036d4d815f75329cad3d1d78e8838bf4fdcee350ce0a", + "layer36": "c74b7a95a07a6865ce0984327d147546b082eac05b4d9faf76cbe2a059c5fe7d", + "layer37": "bebaf9798168745bbd750bd87d77800c664598eec5ddaa4cdb056b9450f3ef77", + "layer38": "4a66582a43381a0bdf29f21f15cb7aeae5e54ab180536e5abb0774ae3ca103e8", + "layer39": "adf6fcdebf286dbf4b6707fba72617a8b8428878c74fa5d8ca56bf4d651cac0a", + "layer4": "9bb7c6650a70088ba525efa5bbe8b25d01ced414f7b9f15b393c331f6df8d1f6", + "layer40": "f919a20f530eb925dc5dd6c8d64b0128fc034f3c6f89ce86c409a139565e0790", + "layer41": "c7fed92a3c611e132971423afe50738f4764dd4d868f9fe3f47a79dbbaac606a", + "layer42": "9b8fe098d18b0b5276316763e50cc10bff8c96f63a67df16004d6e1ddfcbab87", + "layer43": "7640785dba714afa15d043e01cec1139ea508a55222015731039dec5138c45b5", + "layer44": "3d42fee55df4d75475162148703c43a011af305fb09ae0c6f899e068d7f9ce85", + "layer45": "8bb0c75d8fc0ad90a29aabfb0723802063e47bf8808fe7403b970efb61c9fddf", + "layer46": "6b30161bd4481658ed86d5495db36964a08b238891aed9e6a31f79d38f06d65d", + "layer47": "214b87cc29fed3c62c37ca2c3499e2f399ee1bb5467dde134b1f51ed59c80184", + "layer5": "ec2605ed9bc0587b9922ab67e0ce1fbaa1ac8f88625fa60a20dc17d7301d1d92", + "layer6": "0a3a13fb4d7a3b7cc03021907ea1696093c4678a309dd233abe4dfb746868345", + "layer7": "209329b03cc3969d96ff5095e6dd9bdbaa632663825787d4bbacab1a737056eb", + "layer8": "9b42d17c2a1c889ebe1881a4b525ae32a6ffdd31759834e043421769ce7be225", + "layer9": "7f8c69e2cfe1e10043499758d2a690d3fb8145d8ffa23343a20a00f49fc33e5f" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + } + }, + "compatible_schema": "ws1-c10-c11-v5", + "compute_capability": null, + "config_fingerprint": { + "ep": 1, + "model": "Qwen3-Next-80B-A3B-Instruct", + "pp": 1, + "tp": 4 + }, + "decode_prefill": [ + { + "aggregates": { + "active_token_count": 16, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "baseline/p0008-b1-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + { + "aggregates": { + "active_token_count": 64, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "baseline/p0008-b4-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + { + "aggregates": { + "active_token_count": 16, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "baseline/p0064-b1-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + { + "aggregates": { + "active_token_count": 64, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "baseline/p0064-b4-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + { + "aggregates": { + "active_token_count": 16, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "baseline/p0256-b1-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + { + "aggregates": { + "active_token_count": 64, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "baseline/p0256-b4-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + { + "aggregates": { + "active_token_count": 16, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "baseline/p1024-b1-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + { + "aggregates": { + "active_token_count": 64, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "baseline/p1024-b4-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + } + ], + "device": "cuda", + "disclaimer": "Qwen3-Next-80B-A3B-Instruct, TP4 x EP1, BF16, strict shared providers. Cells are the 16-case raw-bit L2 matrix (prompt 8/64/256/1024 x batch 1/4 x full/chunked prefill, 16 response tokens) at each weight version; rollout is native vLLM prefill and decode, replay is VIME recompute. Gradients are judged by the training stages (two updates, reload and resumption), not by C11 gradient rows, so gradient fields are empty here.", + "first_drift": null, + "first_drift_cell": null, + "first_drift_family": null, + "first_drift_layer": null, + "fixture_hash": "790dabd7e86e37bd0746a45b9e452cf24082769580b1c1ae85dcd495ffdcaa99", + "gpu_name": null, + "gradient_accuracy": [], + "gradient_accuracy_executed": false, + "gradient_invariance": [], + "gradient_scope": "training_stage_reports", + "invariance": [ + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0008-b1-full/rollout", + "baseline/p0008-b1-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0008-b1-full/rollout", + "baseline/p0008-b1-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0008-b1-chunked/rollout", + "baseline/p0008-b1-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0008-b1-chunked/rollout", + "baseline/p0008-b1-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0008-b4-full/rollout", + "baseline/p0008-b4-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0008-b4-full/rollout", + "baseline/p0008-b4-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0008-b4-chunked/rollout", + "baseline/p0008-b4-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0008-b4-chunked/rollout", + "baseline/p0008-b4-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0064-b1-full/rollout", + "baseline/p0064-b1-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0064-b1-full/rollout", + "baseline/p0064-b1-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0064-b1-chunked/rollout", + "baseline/p0064-b1-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0064-b1-chunked/rollout", + "baseline/p0064-b1-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0064-b4-full/rollout", + "baseline/p0064-b4-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0064-b4-full/rollout", + "baseline/p0064-b4-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0064-b4-chunked/rollout", + "baseline/p0064-b4-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0064-b4-chunked/rollout", + "baseline/p0064-b4-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0256-b1-full/rollout", + "baseline/p0256-b1-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0256-b1-full/rollout", + "baseline/p0256-b1-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0256-b1-chunked/rollout", + "baseline/p0256-b1-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0256-b1-chunked/rollout", + "baseline/p0256-b1-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0256-b4-full/rollout", + "baseline/p0256-b4-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0256-b4-full/rollout", + "baseline/p0256-b4-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0256-b4-chunked/rollout", + "baseline/p0256-b4-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0256-b4-chunked/rollout", + "baseline/p0256-b4-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p1024-b1-full/rollout", + "baseline/p1024-b1-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p1024-b1-full/rollout", + "baseline/p1024-b1-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p1024-b1-chunked/rollout", + "baseline/p1024-b1-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p1024-b1-chunked/rollout", + "baseline/p1024-b1-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p1024-b4-full/rollout", + "baseline/p1024-b4-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p1024-b4-full/rollout", + "baseline/p1024-b4-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p1024-b4-chunked/rollout", + "baseline/p1024-b4-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p1024-b4-chunked/rollout", + "baseline/p1024-b4-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + } + ], + "measured_commit": "759755e08f8a801d617a273fe23b55831f8de194", + "passed": true, + "representative_case_ids": [ + "baseline/p0008-b1-full", + "baseline/p0008-b1-chunked", + "baseline/p0008-b4-full", + "baseline/p0008-b4-chunked", + "baseline/p0064-b1-full", + "baseline/p0064-b1-chunked", + "baseline/p0064-b4-full", + "baseline/p0064-b4-chunked", + "baseline/p0256-b1-full", + "baseline/p0256-b1-chunked", + "baseline/p0256-b4-full", + "baseline/p0256-b4-chunked", + "baseline/p1024-b1-full", + "baseline/p1024-b1-chunked", + "baseline/p1024-b4-full", + "baseline/p1024-b4-chunked" + ], + "required_grad_names": [], + "runtime_backend_observations": {}, + "schema_version": "qwen3-next-chain-v1", + "seed": 1234, + "train_infer": { + "aggregates": { + "active_token_count": 640, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + "train_infer_bn": null, + "train_infer_executed": true, + "weight_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "weight_source": "Qwen/Qwen3-Next-80B-A3B-Instruct@9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "weight_versions": [ + "baseline" + ], + "workflow_url": null, + "workload_id": "qwen3-next-l2-matrix-16", + "workload_seed": 1234 +} diff --git a/docs/usage/evidence/qwen3-next-batch-invariance-b200/l2/environment.json b/docs/usage/evidence/qwen3-next-batch-invariance-b200/l2/environment.json new file mode 100644 index 000000000..bf967b038 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-batch-invariance-b200/l2/environment.json @@ -0,0 +1,4511 @@ +{ + "environment": { + "identity": { + "base_prefix": "/miniconda3/envs/rlkernel", + "binary": "/python3.12", + "binary_sha256": "6a1eb3ffc29f3a6b0ece607b016b4cfa5ca3ac57b34f17ed3266b404f78d2729", + "build_tools": { + "ninja": { + "path": "/miniconda3/envs/rlkernel/bin/ninja", + "sha256": "08639e194fffa7f08b259fc4abfa4803aff66b64de52549cee42ec527d55cea6" + } + }, + "distributions": [ + { + "direct_url": null, + "metadata_sha256": "6f1038270be40f9b8c0bcf391c627e7d7f41ccdd19aa192d6eac1dbfc3b19abc", + "name": "GitPython", + "version": "3.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "3f71971502087521f123c9daa26bc12d31d3466738b567390b8602acad3be22a", + "name": "Jinja2", + "version": "3.1.6" + }, + { + "direct_url": null, + "metadata_sha256": "818fb343b7b6b99a32771bf4813521ae6440b4c7579b3ae46e32dd02da0afeee", + "name": "Markdown", + "version": "3.11" + }, + { + "direct_url": null, + "metadata_sha256": "dc1ee42cf8ecfeee0ab60b15b21d291833e0732548efcb7bb5b3564dca3e5bf7", + "name": "MarkupSafe", + "version": "3.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "de7389b142450a0014234286b0876f328439b823c355c73d0aed41fd67ec208c", + "name": "PyJWT", + "version": "2.15.1" + }, + { + "direct_url": null, + "metadata_sha256": "ffcad4415cafb22b8b536a61595e9ee13438b51d31b0763c1b273ce3bc58e840", + "name": "PyYAML", + "version": "6.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "8562d701cc52d9cafbb418942b0e072fc087ed8ddcf35cd10224c1b2ed8bdd91", + "name": "Pygments", + "version": "2.21.0" + }, + { + "direct_url": null, + "metadata_sha256": "b6c25fcfdcc495edf248a10ca4ad28327ef2ed6047a6ec5c6346e121414c7f21", + "name": "Werkzeug", + "version": "3.1.9" + }, + { + "direct_url": null, + "metadata_sha256": "55c400d24c71b581d9c0992f71df6047cf6c878bebe61a7d45d6e02dc0e4c510", + "name": "absl-py", + "version": "2.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "13db521f90a6a882027b2388eaa2ebf252945f9c2adb7e7e371da18239da4df0", + "name": "accelerate", + "version": "1.15.0" + }, + { + "direct_url": null, + "metadata_sha256": "86fe44e38e67872dd895c729044942ba2c2f934ae439a899fb83a186206b7fd4", + "name": "agent-detector", + "version": "2.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "afe11fe9f5aa54e734cdd51659bed8c89dc6bcd5aef0ad96f2d20149c8de5456", + "name": "aiohappyeyeballs", + "version": "2.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "570b307bc0b53fbbd3ed2ce0b7eca6bbf2fa73bf75e24a480f1034d8c0b832bf", + "name": "aiohttp", + "version": "3.14.3" + }, + { + "direct_url": null, + "metadata_sha256": "44b7f8e14c4770793e747fad50c9e0a6ee7357651d878554f192d94768dc14a8", + "name": "aiohttp-cors", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "648813a44a9ae0ab2f20ee86d2404dcc38e3f9e80c63316cf6e536735df14e54", + "name": "aiosignal", + "version": "1.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "f6a3f6668bacef7f73a2c19ccb2be910b2363d1731c4725cb04364d99e24935a", + "name": "annotated-doc", + "version": "0.0.5" + }, + { + "direct_url": null, + "metadata_sha256": "fc6d752cde6a6a4bff03474386de750e130b75da3c7815ee909f45b51fea98c8", + "name": "annotated-types", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "4e89d670a4b20029da30e5a9e8ebcbc844deff9c44209552bafd5537249c8b9e", + "name": "anthropic", + "version": "1.9.0" + }, + { + "direct_url": null, + "metadata_sha256": "b5a6f00800956387fcddab1fe1b5aa8502c249b86cfb16d58ed700f282f60142", + "name": "antlr4-python3-runtime", + "version": "4.9.3" + }, + { + "direct_url": null, + "metadata_sha256": "a6008defa9492cd08250217b134782cad1db4580e1d7ddf69cc2a2a48cea24e0", + "name": "anyio", + "version": "4.15.1" + }, + { + "direct_url": null, + "metadata_sha256": "7877c64ce8957237363f2df313819bb07f50752df016d14c5a5a99bec10f5deb", + "name": "apache-tvm-ffi", + "version": "0.1.11" + }, + { + "direct_url": null, + "metadata_sha256": "3543ca8f0e072c00ab111b20eba99ce86dbf93ada28988775bc2677284b3c07a", + "name": "astor", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "d4b328c09c024fe1e4d788a9c7715ad726095131b815cd35fd933268226f6269", + "name": "attrs", + "version": "26.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "4850c4d696a5e2a2ecbb3dd792b060acc1de79e09800669b0b9fc3a22c055e6d", + "name": "av", + "version": "19.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "863ff92208d0a02dabfa008bfe91846a5c401ded301e5687dca7dc63c911865f", + "name": "babel", + "version": "2.18.0" + }, + { + "direct_url": null, + "metadata_sha256": "f32e6df3197f05202e586624d95c5e217003d80cee655c165d533102f628df21", + "name": "backrefs", + "version": "8.0" + }, + { + "direct_url": null, + "metadata_sha256": "905c362f655fbc6d37a24686efc2b3bfbd3123b8ee5a443a43f6750d87455e90", + "name": "blake3", + "version": "1.0.10" + }, + { + "direct_url": null, + "metadata_sha256": "07c85682b6aefd5c9b48890d306c1604311902295704892ede48e5a83219a8d3", + "name": "blobfile", + "version": "3.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "2d582941a7081625a35f35a0c4a2e80f7737312e29c38e5fdb6fc08f9c113077", + "name": "bracex", + "version": "3.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "3b60c55bae0d0340c3a3fd918635bbfa3087579da66e0fd7f6be7a3782c0da3d", + "name": "cachetools", + "version": "7.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "5d11a6878d5bc3f22290281a19ef7b36daa95c910780950608b95cd788c7e12e", + "name": "cbor2", + "version": "6.1.4" + }, + { + "direct_url": null, + "metadata_sha256": "362c9942c48051f168ed2b9f2146266b7792d3c05e164cd6afc3f3b65884fdc9", + "name": "certifi", + "version": "2026.7.22" + }, + { + "direct_url": null, + "metadata_sha256": "b4abf1bcf1c1d8e0272d8007fc974499ea59e5f2a5b98af3c78a5e67515a9d87", + "name": "cffi", + "version": "2.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "766120f13c177446f51929a4d201104bc935b6d5a2a176cd6716edce757d3d95", + "name": "cfgv", + "version": "3.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "610e9a9d03ce837ffe6e42be5e02e70087f73863f7350bf7bb7f0511edcc5ec0", + "name": "charset-normalizer", + "version": "3.5.2" + }, + { + "direct_url": null, + "metadata_sha256": "7ad836b3147c9702546d9c28b4fa5be23b24445439db5d0d2a58d17281c84daa", + "name": "click", + "version": "8.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "4c5f00599ebcbf11d337e48a72784d256ca3d704fa9e9f5daadd60065e6776b7", + "name": "cloudpickle", + "version": "3.1.2" + }, + { + "direct_url": null, + "metadata_sha256": "a0970189e3ab7a596d6902d5f61f93b414f138f03d3cf19029145657bfceb382", + "name": "cmake", + "version": "4.1.2" + }, + { + "direct_url": null, + "metadata_sha256": "94a6ebf9718e55f254a43ce0d2f04e0d6d44e7141b6f3144a84feb6519a77bfd", + "name": "colorama", + "version": "0.4.6" + }, + { + "direct_url": null, + "metadata_sha256": "ca8ec227f406d970a645ec482b20619128dd34b9cf71159cc24e27db461a2711", + "name": "colorful", + "version": "0.5.8" + }, + { + "direct_url": null, + "metadata_sha256": "bbaa51b7e4d8f142bd075d01257c0572c0c844796d51426e35c8096a13e8da76", + "name": "compressed-tensors", + "version": "0.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "6063d8ff7ebc458d63a4332853d7ababf4ee2b86336362c8d2b12be6e998eb6b", + "name": "connectrpc", + "version": "0.11.1" + }, + { + "direct_url": null, + "metadata_sha256": "ac5f4b5a5f68080bd9c3fe77399fe8a1bff2ee5923c49db1df544dd054cbf15b", + "name": "cryptography", + "version": "50.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "f41d2f6b4616accca2f5e1dd47aa9e8937c28076cde698226d93e727751f3099", + "name": "cuda-bindings", + "version": "13.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "e5ca6ed34c687c6f4a4d157ad0a2cf06ec0316fe8c4c0ddeb666ad76dd6f30f4", + "name": "cuda-core", + "version": "1.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "89baadd9da23dce9990481519544115615ba3cbd2d1a41e09feea7756fffb378", + "name": "cuda-pathfinder", + "version": "1.8.2" + }, + { + "direct_url": null, + "metadata_sha256": "1ab914b9a57ca601df2e3cfe9608427b15d8afb78029076ace5d1caf9fd45f08", + "name": "cuda-python", + "version": "13.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "73d97a5eb578223b4895ef4f234574d14219cef9999ff7d0e92a3d0dd057bd3f", + "name": "cuda-tile", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "ae6f957fe66ed63081d1d83ee6e8838f3a0af2c6fce1223629d0dd6264565ead", + "name": "cuda-toolkit", + "version": "13.0.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "1f8e0ae51ad5feea63f58ed2e24f3da6f23ed548043235a14f7623d961dd9b64", + "name": "datasets", + "version": "5.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "153f4a4d6ff03dbe5c8ad7fe54bc2e7b989a4947b70f7aa77fbf652b394f2a2e", + "name": "depyf", + "version": "0.20.0" + }, + { + "direct_url": null, + "metadata_sha256": "ee09fc752d7271aac93079cfd63409957dc6b536c1ffd9355a01bf7297e72aa6", + "name": "detect-installer", + "version": "0.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "a7feab2c4f69fd5f85e5a3cb495a7f1870a6bf8199dcee5339e8118f7acbdc09", + "name": "dill", + "version": "0.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "fef3fde661fe30ba7bd1d78841a797136b2b3461705bb4eb92dc54f8308bbaae", + "name": "distlib", + "version": "0.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "fef3fde661fe30ba7bd1d78841a797136b2b3461705bb4eb92dc54f8308bbaae", + "name": "distlib", + "version": "0.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "a3ca2e39abe76c4a33d5fe4a2a84375ec9f25cdfdb7e1d8ea406bd6f1603205c", + "name": "dnspython", + "version": "2.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "92a07daad5e6ff461199de14e845d9b376e309ef916ce5379f3c9cd4e3b1623f", + "name": "dockerfile-parse", + "version": "2.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "5b566b25f0cbe4955d0b16844a7cc6d2002caa3bde2dfda7f301fd8870cbaa56", + "name": "docstring_parser", + "version": "0.18.0" + }, + { + "direct_url": null, + "metadata_sha256": "5a1080b5768c6c591e1c4f9c9812cafa808781b9eeb198043bf185e22d4a1613", + "name": "e2b", + "version": "2.51.0" + }, + { + "direct_url": null, + "metadata_sha256": "0a63979e0b946e16238e4339e60d9c1eb5a7ce3ea93dae78b5da9c65a6190540", + "name": "einops", + "version": "0.8.2" + }, + { + "direct_url": null, + "metadata_sha256": "16cbe67a57558f1d4bfdbc22a454434ba301750c57a62b1d3f5361c9e5cddc00", + "name": "email-validator", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "0617ddb55b90b42ddc9398dc7e91d61fe928a2504939f76526dc15b22d238caa", + "name": "fastapi", + "version": "0.136.3" + }, + { + "direct_url": null, + "metadata_sha256": "ddd82b9666c21988e234d623e2575e1b89fd4133260eeab43fc9a7c074f7024a", + "name": "fastapi-cli", + "version": "0.0.32" + }, + { + "direct_url": null, + "metadata_sha256": "611602e834d42e10433155ff5f5581358d732fa6b6f6f7820a8f79e74b1ce1f9", + "name": "fastapi-cloud-cli", + "version": "0.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "794524e4a9659bda6043721d848d028ea49996085a33326094fbaaa3f6e6b895", + "name": "fastar", + "version": "0.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "711401d36e60e10e35beb4d0f1bb42bf0c4d86339ae52f32b9aa4a4d790530dd", + "name": "fastsafetensors", + "version": "0.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "efaea9742e348c4c4bdcc6f616a33cc5aa3ae926494a72a46690b7da2f08ed5c", + "name": "filelock", + "version": "4.0.7" + }, + { + "direct_url": null, + "metadata_sha256": "99bd6c3f10781d3d2d350f2c3c9fc4765b55f25de8a6d6dd1f71501802d1255e", + "name": "fla-core", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "0a6ef979b75295cee2b5293ad4942b0cf2682e9e38680203064e0b70249c1a96", + "name": "flash-linear-attention", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "76b70a11ca82ea4606b529e7a8658cb3fe71412afa46f2ed57101dd91ba27558", + "name": "flashinfer-python", + "version": "0.6.18.post1" + }, + { + "direct_url": null, + "metadata_sha256": "ba8ff415192b5cbb90efce046e2271a00c8184afc362d8b47fbbc84d5e558b05", + "name": "frozenlist", + "version": "1.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "e7712831c80eb13b08fb7f7cc33988a8f24654af9eba7c6f5f943b2636e4306a", + "name": "fsspec", + "version": "2026.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "025de85c794878d0caa737869307447595f514ebf9599eacb5b1a501bae479b6", + "name": "fsspec", + "version": "2026.9.0" + }, + { + "direct_url": null, + "metadata_sha256": "ca94883bdeaa3740b45b6994443b445fd67c6e4a8064ac3bf9d92d2a5221eee8", + "name": "ghp-import", + "version": "2.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "a7e90983562a035cf767baa63d8c32bc37e1de7cad71ac7b6b2bc70a95bba4eb", + "name": "gitdb", + "version": "4.0.12" + }, + { + "direct_url": null, + "metadata_sha256": "dd96143ec79178bef685c1f5c0a58a87a66d003b421e605de65697308321d518", + "name": "google-api-core", + "version": "2.40.0" + }, + { + "direct_url": null, + "metadata_sha256": "0735d57088a83df2355e16843107fb0112abe2178fc5bb8132947a7ad962aa41", + "name": "google-auth", + "version": "2.59.1" + }, + { + "direct_url": null, + "metadata_sha256": "2f3aa9d9500d329560440e6a5a152e420aad5f5bbb23701f45b740be721784a1", + "name": "googleapis-common-protos", + "version": "1.75.5" + }, + { + "direct_url": null, + "metadata_sha256": "06d74ab04fdc03fad368868907f0d10e7d9f397aab58d58965c0b78ffaec34cc", + "name": "griffelib", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "7ee1c179e2c68a62968308b2f96f4f3469176ee3ac8bdb494ac80188d4d41271", + "name": "grpcio", + "version": "1.84.0" + }, + { + "direct_url": null, + "metadata_sha256": "04cf3a4a91575850f386f4fcfdedd8e7fbfba08feff038fbc1296d1e854db2dd", + "name": "h11", + "version": "0.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "b954a6ba4739c0cc878bb8ea27ea7c7154a48bb4b7c06dba9e9cf880cf0ec930", + "name": "h2", + "version": "4.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "6f0d7bf86e75d0bda1ceccc82367c0145ad0ec522c4d4f51bb454f467faadcc9", + "name": "hf-xet", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "f991b847550cf8225f69562902b5ccb591b2ce9a08fe07ef6e6d701bdb4694a7", + "name": "hpack", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "314d194165c4700034c1c67cee847d549a6d7091374c71f2cef0186ec56a3eb9", + "name": "httpcore", + "version": "1.0.9" + }, + { + "direct_url": null, + "metadata_sha256": "aed9767360bed1bcbda71e3b1a3c996603f86558bc77a1693ee3d09973d20cad", + "name": "httpcore2", + "version": "2.13.1" + }, + { + "direct_url": null, + "metadata_sha256": "8fa3bf3510c35e2eea9f523a1cace7120079cf51d76c4acea97de95806aaa14a", + "name": "httptools", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "3bf4804c215d111b6a4702cf9000021ab39807d1ed3207dd011b14b2843b2d14", + "name": "httpx", + "version": "0.28.1" + }, + { + "direct_url": null, + "metadata_sha256": "d11dd50813b8914bd9455e8b2b591171cd2b1618883943153afadc8bb9224678", + "name": "httpx2", + "version": "2.13.1" + }, + { + "direct_url": null, + "metadata_sha256": "43b119c34ad2b2aacc032a1a6a8feb142fdb5ca407a3519325d74dd53d8904df", + "name": "huggingface_hub", + "version": "1.33.0" + }, + { + "direct_url": null, + "metadata_sha256": "9ce850d5a6b775e5ef4a335f907e579a878e058213121b6eec567781ea68c585", + "name": "humming-kernels", + "version": "0.1.12" + }, + { + "direct_url": null, + "metadata_sha256": "67aa4f6717d82446a51ce350e7c4769eba0c4a22d2f428255cddd9d24b11a914", + "name": "hyperframe", + "version": "6.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd9511ede42f63b995c3f71944f908cb8f014048b63ecc1c8d420525a3354b59", + "name": "identify", + "version": "2.6.20" + }, + { + "direct_url": null, + "metadata_sha256": "af3c3a62bb5d82d6a43454684e0b1dedde27a21ea90eacfb1bed9814619f06d0", + "name": "idna", + "version": "3.20" + }, + { + "direct_url": null, + "metadata_sha256": "cf71393f3d079ce2e859384573e65aaacd1709bef700701f629df32398b598f0", + "name": "ijson", + "version": "3.5.1" + }, + { + "direct_url": null, + "metadata_sha256": "9305763e93d03df0e36516b1125fa046a6ebe37d44589e200e0593cf4bdfd980", + "name": "importlib_metadata", + "version": "9.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "32860c3c19b2e91f6cb5bd83400b5870cda051bc74a5a08822c8c666af0990db", + "name": "iniconfig", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "560faabb3d45d779e445a74e7e806a786f95f2200fa06d979603b7f0ee1cfb39", + "name": "instanttensor", + "version": "0.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "f6fc1f0d389e4245fc2a1a0fdfee09422e56200cb6f94659668456997ff4f7a9", + "name": "interegular", + "version": "0.3.3" + }, + { + "direct_url": null, + "metadata_sha256": "d10f300731197a4829b77f0c883bb3cf8a37ae8c76a302e095fa95d6427706d0", + "name": "jiter", + "version": "0.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "5b0c8d4b4c535a2432fb206223d774509b6e20af374c6a4b6f98bf72a7de6702", + "name": "jmespath", + "version": "1.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "6c4032c2e74273452cd77399af2ee85198f49c22da897983f26d2ed6f787c4e8", + "name": "jsonschema", + "version": "4.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "aaa6cd66f423729e8da397c9d533b7d731f6b25f3d6371b9338c36bdb9be74a0", + "name": "jsonschema-specifications", + "version": "2025.9.1" + }, + { + "direct_url": null, + "metadata_sha256": "f7c0687c032593106a2e5a3c241cf8043e7e2c222bddb0022b4cb2bf5de67115", + "name": "lark", + "version": "1.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "4511c6b04efc57a5f5333edc1f5f48b9f5412c3923d4bc19b715bdf47977511c", + "name": "linkify-it-py", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "be929870f6ecae18a819c56118f1101f3076e25ac6a4843ca6f4707ebd1e87c6", + "name": "llguidance", + "version": "1.7.6" + }, + { + "direct_url": null, + "metadata_sha256": "cf2b87669bead3e76ec54207f3354c13f73b50c32fcd13c8d627084b3379139e", + "name": "llvmlite", + "version": "0.47.0" + }, + { + "direct_url": null, + "metadata_sha256": "0a416d79c5543d94d2b18807626293d4f47655d1d22724c7ae296e413078aaba", + "name": "lm-format-enforcer", + "version": "0.11.3" + }, + { + "direct_url": null, + "metadata_sha256": "16bc1f59e34fd2a6633bd395276052eacd2c777b2cf72781e76b203f013a8fac", + "name": "loguru", + "version": "0.7.3" + }, + { + "direct_url": null, + "metadata_sha256": "5216d5acfd039a7b581a826186309594b228d37d2c8d56864124ea666689fe4e", + "name": "lxml", + "version": "6.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "f59d772b35315a928672bfcccfb89d82c0aac672c5275c048f7a93b79015bcea", + "name": "markdown-it-py", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "b137367ef0056711cbf5e53015df9168cab80373104e7899b1c0263a21d9c99c", + "name": "mcp", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "38e0b9edaae09e58cd1461fc961ced22672038a697930bedef153a74befb3de1", + "name": "mcp-types", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "799f49685865fd9cc8915fdb92a33e102eeeffad562b03b4aeffb6f422b771c1", + "name": "mdit-py-plugins", + "version": "0.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "481f9cbe08596c6eaba6343e0efa1b13b2362c30dce0610f7c08523f1d98388d", + "name": "mdurl", + "version": "0.1.2" + }, + { + "direct_url": "{\"dir_info\": {\"editable\": true}, \"url\": \"file:///Megatron-LM-training\"}", + "metadata_sha256": "2876c0c760bbfc93bd7d737bf0db2866a937308a7c1707c3a2bb59d4795986ff", + "name": "megatron-core", + "version": "0.16.0rc0" + }, + { + "direct_url": null, + "metadata_sha256": "a6e34d488c879f57ce042bec38f8864ba3ea7d6ecf0ab757fc88fe8dc0a22f26", + "name": "memray", + "version": "1.20.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd26d80dc9676b1fb8c894355bd525fbe7f49a6a86a555c72e9ec6d927247c33", + "name": "mergedeep", + "version": "1.3.4" + }, + { + "direct_url": null, + "metadata_sha256": "dd1b3b89e88d1c65a26e6e72dd075eabbc220bfb138769ec8b64578ee911795c", + "name": "mistral_common", + "version": "1.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "4859847a9f6321daf8849cf7fd1542ff430db6563a2abf9ac0d62a5b21bd951d", + "name": "mkdocs", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "1729fc31479f2582486cdc85397417659dd3b2fb3f920553de66cfe59d5f0b3e", + "name": "mkdocs-awesome-nav", + "version": "3.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "88b4b7b7c0aba5547befdedaf515c8df4867361daf55ff60b72578464d72dcbe", + "name": "mkdocs-get-deps", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "ad33bb33fb16b1f69689c4682550e97232154e367e2c8c8aee9dad0f10d269ce", + "name": "mkdocs-git-revision-date-localized-plugin", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "ed69fbfb9ac00c10c5a383a12ff9d2b9919ae184e408554434199211643d6040", + "name": "mkdocs-material", + "version": "9.7.7" + }, + { + "direct_url": null, + "metadata_sha256": "d1c549b61701148b97f8246bc924b2840e504b37b0ce7a27e78ddf81261e5363", + "name": "mkdocs-material-extensions", + "version": "1.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "4ad6171f3bf6812e4de90670ff0089d445093d4fe1d05d55f17b96a4a192a816", + "name": "ml_dtypes", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "4ad6171f3bf6812e4de90670ff0089d445093d4fe1d05d55f17b96a4a192a816", + "name": "ml_dtypes", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "b0dbdfa30ab6b1ce637a794899c9e43019182b6d1ab2d07b90f647f7331eba6b", + "name": "model-hosting-container-standards", + "version": "0.1.16" + }, + { + "direct_url": null, + "metadata_sha256": "95424470e481cfa8d18b30963b6de3aafe16614b1ea0414e184a008571dde84f", + "name": "mpmath", + "version": "1.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "eb184d83489401903615ce8a78d98d5b933dec0f7246811d396a529915fe797c", + "name": "msgpack", + "version": "1.2.3" + }, + { + "direct_url": null, + "metadata_sha256": "520006303d6a0e859970b83f7d452196e2e8f6dab08f6dcf1ba5823c1230025f", + "name": "msgspec", + "version": "0.22.0" + }, + { + "direct_url": null, + "metadata_sha256": "010d2fe039006070a711a476b171b7b7da5c29ccad3c4eecd77ef3711b07c2d0", + "name": "multidict", + "version": "6.9.1" + }, + { + "direct_url": null, + "metadata_sha256": "235634cc7ebda45f8a84dfdb1b9b35ac1a77a1888b34650c3a616d23e4a7e93f", + "name": "multiprocess", + "version": "0.70.19" + }, + { + "direct_url": null, + "metadata_sha256": "7c545b4b3e5e83d3fde41352272c10cb9deeaba5b7138fbf24383e952af8822e", + "name": "natsort", + "version": "8.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "311ee8cdaeaf9f11acf51cda9c3b5b191f76ce9d98bc3418164c3189bbc37a08", + "name": "nccl4py", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "66360539217852c3b44b37f409eade7e1559baf018bb363bacb2aa3a9759b203", + "name": "networkx", + "version": "3.7" + }, + { + "direct_url": null, + "metadata_sha256": "e8b0b1746808b87816c47e4531780ded7f246bed9575a89e8b40200aa81e9a13", + "name": "ninja", + "version": "1.13.2" + }, + { + "direct_url": null, + "metadata_sha256": "77c1117f0dbc41560ddc6e6b37b542fb4e88afcd4ef82ec06593e5bbd5f37121", + "name": "nodeenv", + "version": "1.11.0" + }, + { + "direct_url": null, + "metadata_sha256": "9af629898406c9eaa69897fe09220dc483270cdba89f6b20bf0165cdf0e1668e", + "name": "numba", + "version": "0.65.0" + }, + { + "direct_url": null, + "metadata_sha256": "0c7281a81cf76e40b27c1385ffd8a215d7227adc219f177ce807ead9e91994a5", + "name": "numpy", + "version": "2.3.5" + }, + { + "direct_url": null, + "metadata_sha256": "0c7281a81cf76e40b27c1385ffd8a215d7227adc219f177ce807ead9e91994a5", + "name": "numpy", + "version": "2.3.5" + }, + { + "direct_url": null, + "metadata_sha256": "bab990ced4537ce74ef5961ca933c4c6fd604fd09a5827a4a428c55bcb0be35b", + "name": "nvdlfw_inspect", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "10f6595146332d35f7f15a000e08b5c81432528c5d026470c1d03f0c1399fb70", + "name": "nvidia-cublas", + "version": "13.1.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "58e933b4ac8e49f098b16ab7480d03bd792afc3d1db10d0aacbdcc2c62e48fa3", + "name": "nvidia-cuda-cccl", + "version": "13.3.4.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "baac937970681d41aa0c3708b3d55d73f8d29e70aceaac0e71fe6d1548e94a09", + "name": "nvidia-cuda-crt", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "8d51e5c76ef5707b0b80d5ec9a791c0f11a480ab721820cf100a3cc566017eef", + "name": "nvidia-cuda-cupti", + "version": "13.0.85" + }, + { + "direct_url": null, + "metadata_sha256": "724bf56e61ddef5d4c2482ff64103a973b911b110b668acaea5373f6c83c1c5c", + "name": "nvidia-cuda-nvcc", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "c54801dbd815d534519a761f1f328325aa0f1d1f1659aa969fa74e7a2c76eee9", + "name": "nvidia-cuda-nvdisasm", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "af51f248363020b9fdfd2743704e901bf3d19a1a1ce1fe44fb98ba148bfc0157", + "name": "nvidia-cuda-nvrtc", + "version": "13.0.88" + }, + { + "direct_url": null, + "metadata_sha256": "055f7fc69a5a2159de82cd0718da02c8852e81c8a71ebb117b8e799badd7167e", + "name": "nvidia-cuda-runtime", + "version": "13.0.96" + }, + { + "direct_url": null, + "metadata_sha256": "df18686dbdb3074ca375a1d6c623a04102fd348950c67a721397349c6d4f0477", + "name": "nvidia-cudnn-cu13", + "version": "9.20.0.48" + }, + { + "direct_url": null, + "metadata_sha256": "abd0ca3f67af19a4d383ff2a012ae0090d4731c6492fd47236615308a50b3981", + "name": "nvidia-cudnn-frontend", + "version": "1.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "4a78545d424d0c5038353f7046a8ae40ceaf312045d71399eac9511f5fc15434", + "name": "nvidia-cufft", + "version": "12.0.0.61" + }, + { + "direct_url": null, + "metadata_sha256": "e49b909195c03ddbe203729d9b31dd88e3f207368333d1909c67c6b130a0c696", + "name": "nvidia-cufile", + "version": "1.15.1.6" + }, + { + "direct_url": null, + "metadata_sha256": "bb15a754c6be32c23aaac13c1cfa7a8ce53d92bc26652ec3b609f7a5cce3e7d1", + "name": "nvidia-curand", + "version": "10.4.0.35" + }, + { + "direct_url": null, + "metadata_sha256": "0dd58f677811eac04901a793740932e5a2a8fff2f5453aa6351614eb18391bb6", + "name": "nvidia-cusolver", + "version": "12.0.4.66" + }, + { + "direct_url": null, + "metadata_sha256": "8aeb284782ef6883095a5d1c110e221cad023a99afcfd5cdb4969a25e146d562", + "name": "nvidia-cusparse", + "version": "12.6.3.3" + }, + { + "direct_url": null, + "metadata_sha256": "09555246122896eaca3b8313eecfca4b339fefd3b597874cb9fe3bf29dab38c9", + "name": "nvidia-cusparselt-cu13", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "ac77bac79fbfb0c52ac6e2e5abc936b1e127be2192f0cbc27b00be3125fa86ae", + "name": "nvidia-cutlass-dsl", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "1ec968ec7c4083f7fe4e1fb8384c7e9b853a81491fef9f4cb1cf755961aaedf6", + "name": "nvidia-cutlass-dsl-libs-base", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "cc6f3846cd820013eaa6e2665c493d70c607be6ce7349b939eb4742888470585", + "name": "nvidia-cutlass-dsl-libs-core", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "2357d0df2d0d17c0b16663b8a89df53f751b19721f66821fd88fa78112c08e55", + "name": "nvidia-cutlass-dsl-libs-cu12", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "244590c25662dcf777b1daae97a858afe1a1aec62e5e6678b217007a459ab552", + "name": "nvidia-cutlass-dsl-libs-cu13", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "c3a25ada01f57418c1b897406c3abab18834e6adc573ab7b060620c453afb6db", + "name": "nvidia-ml-py", + "version": "13.615.71" + }, + { + "direct_url": null, + "metadata_sha256": "56baad4e7f699902b03b17580933f7bd50b6ea97b7df9d7e807750973da7529c", + "name": "nvidia-nccl-cu13", + "version": "2.29.7" + }, + { + "direct_url": null, + "metadata_sha256": "98810ef0ab8badc369e6a46a038f8ee9f412c0c753fb5ad580544f23a0aa7962", + "name": "nvidia-nvjitlink", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "b0f54ee21909d19640a58e05da755c91763eb5725f544fd0d4b84b2f5f94deba", + "name": "nvidia-nvshmem-cu13", + "version": "3.4.5" + }, + { + "direct_url": null, + "metadata_sha256": "06dc1a593c7e8b8c3f29184228c83f8f7ef57787ad91f3e5bcae1d238dd3092a", + "name": "nvidia-nvtx", + "version": "13.0.85" + }, + { + "direct_url": null, + "metadata_sha256": "32ee63450a437b6a6ed227ff6549144aa596197a322993521ec7af826ebd413e", + "name": "nvidia-nvvm", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "32c2efdcd2c673b3b7f35ca9c2cccefaad36f1f0a920648a13cad85f6a5767b2", + "name": "nvtx", + "version": "0.2.15" + }, + { + "direct_url": null, + "metadata_sha256": "3419d80e114a2c19fa9bd3582939a3942f19673055707ba6ca2ca489d58b41e0", + "name": "omegaconf", + "version": "2.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "28971076ce9c279d4b889496b046d55a1e05b02fb9851ceb717e9a10df799572", + "name": "onnx", + "version": "1.23.1" + }, + { + "direct_url": null, + "metadata_sha256": "1246f5a4d8295907a42e809ed9173ede2510ec9d260d2168989d126564897fa5", + "name": "onnx-ir", + "version": "1.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "e14643636835759700dff286f949c5ec34e7eac7ac47f44096414f0e0f1c3101", + "name": "onnxscript", + "version": "0.7.2" + }, + { + "direct_url": null, + "metadata_sha256": "00f847e99939207bd70dfd806428f6b20a3d01074b59325e4c76149a2e19be26", + "name": "openai", + "version": "3.22.1" + }, + { + "direct_url": null, + "metadata_sha256": "598d3ad5a22a14a7c4f1d218b43e345f32b0ba094b753467bae8a3f708fd48cb", + "name": "openai-agents", + "version": "0.22.3" + }, + { + "direct_url": null, + "metadata_sha256": "5a0afcb1ce845e05da12beb1767f5d2749bbc9e9050718c6b9fa3c225713c9eb", + "name": "openai-harmony", + "version": "0.0.8" + }, + { + "direct_url": null, + "metadata_sha256": "e86a6b6fcbbe152805f782c57df321002892e163019574877e9829272e25eb4e", + "name": "opencensus", + "version": "0.11.4" + }, + { + "direct_url": null, + "metadata_sha256": "53d669c8bd3d32d3275153b454e515ca5cc6dec92fae3a98309b5a2b19fe6d2d", + "name": "opencensus-context", + "version": "0.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "19778b6d66b0e45bf73e11fa37a208949d5b393aef914627394d5601455546a6", + "name": "opencv-python-headless", + "version": "5.0.0.93" + }, + { + "direct_url": null, + "metadata_sha256": "19778b6d66b0e45bf73e11fa37a208949d5b393aef914627394d5601455546a6", + "name": "opencv-python-headless", + "version": "5.0.0.93" + }, + { + "direct_url": null, + "metadata_sha256": "a3f5434fa7c80f7f7abc82173da639c8e9c59d30b4027182645562bd3d2f4f97", + "name": "opentelemetry-api", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "8611977ea596e4827874582e86250618444e1c718229dddfc16e5ea437ce5fcb", + "name": "opentelemetry-exporter-http-transport", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "2cfd41e5ca33292d987ba71fa6186d11e16ed66888f3a26f8a3a99060c4b5e90", + "name": "opentelemetry-exporter-otlp", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "3bb4494220732d4bf10e1dba231ea7638cedaa5362e1f23a50d34a14f520fea8", + "name": "opentelemetry-exporter-otlp-common", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "27fb1c8aa5c2cd07776f9f3281fc618cd3feb96017757c33d2b3586fb7fec88b", + "name": "opentelemetry-exporter-otlp-proto-common", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "5cba6098cdd0bfb06853a6c704a2451c4f82c9dea376a30b59ecd279296648ad", + "name": "opentelemetry-exporter-otlp-proto-grpc", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "6f53ef1c172ebf87af69b9ef390aa908506d0cd14bc7811985fdd937a4058808", + "name": "opentelemetry-exporter-otlp-proto-http", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "1910f4e7ebd497e98b6d231e10275288fda2cd1885117575706c62f45e065889", + "name": "opentelemetry-exporter-prometheus", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "fab18b721e30be41448be252e1dca43b48e7f15d971e0bb552492c0ef4b07bee", + "name": "opentelemetry-proto", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "3644a79f55762a646799ff52b9d837e01c8192b7b28f735a383f55c90edb9bc2", + "name": "opentelemetry-sdk", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "add3db481f7f401f65cfbddb058fde3bb4c9dd7b61064a84f8598ad7efe0b11c", + "name": "opentelemetry-semantic-conventions", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "0dfff30e912520a226bcf7a547393484cfcd8c738439c7b48418f61c95109480", + "name": "opentelemetry-semantic-conventions-ai", + "version": "0.5.1" + }, + { + "direct_url": null, + "metadata_sha256": "210ce26bad0a245a72831b4fa029708c245d4d670a88c8d5a69b1446c24a95e4", + "name": "orjson", + "version": "3.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "35ff73511848f5f934ccc39d538014716ec4579e76d54e0e407ff51794a7939c", + "name": "outlines_core", + "version": "0.2.14" + }, + { + "direct_url": null, + "metadata_sha256": "8ee2f7138ade46b6e348a6d099612f5bd6caff13511f3b4144327f37ce50eacf", + "name": "packaging", + "version": "26.3" + }, + { + "direct_url": null, + "metadata_sha256": "a4ab87bf8083001f25ccdc46095f05b678b3569dd58edc2cf941e3e7f64d7c88", + "name": "paginate", + "version": "0.5.7" + }, + { + "direct_url": null, + "metadata_sha256": "1de96a6c28c2e5613c9c87cd4ad9484791001cf58df43cf2ba74d5c4f85f0ad2", + "name": "pandas", + "version": "3.0.6" + }, + { + "direct_url": null, + "metadata_sha256": "d05b8d05da9f78176b2eefaacdfaa5e96708ec4f488daea8bbc52e3ed1bc3954", + "name": "partial-json-parser", + "version": "0.2.1.1.post7" + }, + { + "direct_url": null, + "metadata_sha256": "c1d126edceac2685e29403a8ae3a27c47143dce1f0252fa3931771562f1e2b4f", + "name": "pathspec", + "version": "1.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "30325dc8ce17bc64f9dbc0a449232fd35841a019df22a6f481007c9c5a28c1cb", + "name": "pillow", + "version": "12.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "cbc0b7b6e63b50dcb7c17cf3526a9304f285d9a31353adf3b22acc2059ab23f5", + "name": "pip", + "version": "25.0.1" + }, + { + "direct_url": "{\"dir_info\": {}, \"url\": \"file:///work\"}", + "metadata_sha256": "6ba03b5bc457a2a3d92468729501b5892a0d38ebcc36766c58859449498c5743", + "name": "pip", + "version": "26.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "0421937c4410b61c5325233d5b7671ae933bae8de174f87586ac55aa804851ea", + "name": "platformdirs", + "version": "4.12.2" + }, + { + "direct_url": null, + "metadata_sha256": "2bcffab42626e1fb50d6329765619312d30fe7f4880e98dcee99c92ebd283bb4", + "name": "pluggy", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "7e7562ba7c032f8edd02641ae71b1ac2d8f388103a68d777a7e907d19e75bc17", + "name": "pre_commit", + "version": "4.6.2" + }, + { + "direct_url": null, + "metadata_sha256": "bbe0a7662602ddd23f929fe0ee98e9d04406e138aeee18ce4861af186ea6060d", + "name": "prometheus-fastapi-instrumentator", + "version": "8.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "ece4a61f3ffb92a083fd5e47e180e3e070342e60a3bd93876a879e79a643e821", + "name": "prometheus_client", + "version": "0.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "5feba21a58eaa126e7e7739e57e2572e5bb251fcbf56e439e508acc47d769314", + "name": "propcache", + "version": "0.5.4" + }, + { + "direct_url": null, + "metadata_sha256": "3f136dbf7239c987a7685acd33440cc5efd6c4107b4b11c425201b4de70ae36f", + "name": "proto-plus", + "version": "1.29.0" + }, + { + "direct_url": null, + "metadata_sha256": "118b5ad013120a7a6e24714595ad776bf264d7b0060389133310d18ea1480902", + "name": "protobuf", + "version": "7.36.2" + }, + { + "direct_url": null, + "metadata_sha256": "0849f5a519bf9bc23ef204443fdd8d6d10678863acac7ca9340fc11bfba5a856", + "name": "protobuf-py", + "version": "0.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "eab5f2f4fd98f67a710a8fb1975b64ffa880a4f977566f022c567e08e324ccd6", + "name": "protobuf-py-ext", + "version": "0.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "39009938840de3a8b2a37eb4668d2601aae8c74e4b74743f73e59996b5b7e6e1", + "name": "psutil", + "version": "7.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "df44b58e8a4cfe57f65773ec47f7bdf2a14c8f5f73a7abf331a6b6237d6d691a", + "name": "py-cpuinfo", + "version": "9.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "2fd4a9efc5e5c74ae4c2fcf1970193c524c62ab22af8d5e66ebf7df9e6e46e83", + "name": "py-spy", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "d2ccdeb15cddedc81637a83e40baa6397fe269023b738d0fc3cb2d90722e290b", + "name": "pyarrow", + "version": "25.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "47b9f28e971a56f5adf949e0bcf105b0bf6587946566ecf197a2819d8848cc01", + "name": "pyasn1", + "version": "0.6.4" + }, + { + "direct_url": null, + "metadata_sha256": "82ce4c01c6d36841b9801fcdabab9bfe61d0b5e4e440c275941d8a2d4a790730", + "name": "pyasn1_modules", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "45cb345e4c12f63bc843b8c88902cc44c4d624a55aaef8cd5ffbc0ad16356fbe", + "name": "pybase64", + "version": "1.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "d311ae661edeac8ff029ab2960d065a7e792ebf8f79af682daa53109fe81318b", + "name": "pybind11", + "version": "3.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "cce9c0d440d065d4cdfb0d00004b8ddd65cf363a740efc5b0920b29201a59cd9", + "name": "pycountry", + "version": "26.2.16" + }, + { + "direct_url": null, + "metadata_sha256": "a1e33542883c249bf6c263b0023b9ea8a6131a77d9cb2cbc88316968e5eada83", + "name": "pycparser", + "version": "3.0" + }, + { + "direct_url": null, + "metadata_sha256": "faffcc4d7d359cb1047a9f67f7c65096b838c6db6c62852ef20fb27d55649a95", + "name": "pycryptodomex", + "version": "3.23.0" + }, + { + "direct_url": null, + "metadata_sha256": "98929f4cb80451dc3c6c8cd541a3081dccf0dee94afe7d9fa5c214a18ff236ce", + "name": "pydantic", + "version": "2.13.5" + }, + { + "direct_url": null, + "metadata_sha256": "8eccadbe707db97c397fb79073fe791b7998ef3a85f04f817f8991f7697b190b", + "name": "pydantic-extra-types", + "version": "2.11.1" + }, + { + "direct_url": null, + "metadata_sha256": "8f00c91deb34399316a5386eb2e76fe09f14a08dc3045f2e7dce9bf8573796bd", + "name": "pydantic-settings", + "version": "2.15.0" + }, + { + "direct_url": null, + "metadata_sha256": "66c729edddc20bf2764bb18bd87d907b08690e50355f39b97acc737b26d1d164", + "name": "pydantic_core", + "version": "2.46.5" + }, + { + "direct_url": null, + "metadata_sha256": "394500d78a0c1a433ae8ca3693152c08f6a901121d4b069cf1540a19759e2950", + "name": "pylatexenc", + "version": "2.11" + }, + { + "direct_url": null, + "metadata_sha256": "df2e9e9847a2aea0ae6e20fd325aeb16cf3ce7f8913462db6c2398363cd0c0bf", + "name": "pymdown-extensions", + "version": "12.1" + }, + { + "direct_url": null, + "metadata_sha256": "82fcfe724db9f0b51348da89f4f5cdc0b08d08882b1bbc0ca4913d3a0a93bcb9", + "name": "pynvvideocodec", + "version": "2.0.4" + }, + { + "direct_url": null, + "metadata_sha256": "3722422cc1478b175879143dfb78f98b7a5f53f4f684d71b7054fe2e8acd3b89", + "name": "pyqwest", + "version": "0.10.0" + }, + { + "direct_url": null, + "metadata_sha256": "7d1d1c276b7c372d55d17ac7d30f0a4b80a746e147347b8510d1355eea7f80c8", + "name": "pytest", + "version": "9.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "89e7c1c932e52b74bdcaf504389d2d1a2d7ca559b02bf5a09fc80ebd58ad10f7", + "name": "python-dateutil", + "version": "2.9.0.post0" + }, + { + "direct_url": null, + "metadata_sha256": "54f30f811841b6d772f31715712c85bfe0041839cb071f78daf41c700a98642b", + "name": "python-discovery", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "54f30f811841b6d772f31715712c85bfe0041839cb071f78daf41c700a98642b", + "name": "python-discovery", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "0cc19efd76cfbf3bcb2cb0d3ab82191036855859455aa3812c5e9e591e3f34e8", + "name": "python-dotenv", + "version": "1.2.3" + }, + { + "direct_url": null, + "metadata_sha256": "1d866c6124631b9ce1797ad412fff298ab53fc2d95210281d7c8f20e920753fa", + "name": "python-json-logger", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "2d18a1e7286d92a656ead5ec6f83d5ae6dc858634624f6b264703ae88d24d718", + "name": "python-multipart", + "version": "0.0.32" + }, + { + "direct_url": null, + "metadata_sha256": "beaa0efe9ba4b34843f5a0fc7379a73f10e95adb8cc0c31f359ab6f3a42b4def", + "name": "pyyaml_env_tag", + "version": "1.1" + }, + { + "direct_url": null, + "metadata_sha256": "238dc769e22d4f5626750cdff36e920e4a8d69c10d88de6d79b40a59cc13d873", + "name": "pyzmq", + "version": "27.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "de0a5e855bb5bb78b7acdcd2ca60619c6a0c109814881589caf158ec07155662", + "name": "quack-kernels", + "version": "0.6.5" + }, + { + "direct_url": null, + "metadata_sha256": "961ffef199b876fb4d7b10903d78e79f359d703b1638834c61d70b9879932918", + "name": "qwen-vl-utils", + "version": "0.0.14" + }, + { + "direct_url": null, + "metadata_sha256": "faf6ab9027d12de992827a2d8a224996fe6747a8c5f7d31ae495983dc73eefe9", + "name": "ray", + "version": "2.54.0" + }, + { + "direct_url": null, + "metadata_sha256": "c50d8b3ff4d113925b60dc47d1d28e87248a3338024241b0a3a66c8794fbce0c", + "name": "referencing", + "version": "0.37.0" + }, + { + "direct_url": null, + "metadata_sha256": "02acdc52d6f21d5f4b172254daaa94edfaa44c9ebe14d1c00cc4c8fe99b0e1df", + "name": "regex", + "version": "2026.9.29" + }, + { + "direct_url": null, + "metadata_sha256": "ac08207697217d1ffde8a161b424d77d6e2af6b62630fa26d75d08f11076cdca", + "name": "requests", + "version": "2.34.2" + }, + { + "direct_url": null, + "metadata_sha256": "f1abd635c3dff607a4fd654c62a88d9d4c21843cfc9176116c156f4269ca21b5", + "name": "rich", + "version": "15.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "932ff7743a756d0efcc45528d64c275ac3cb40a8dd1787ea10cb303907f0ae4f", + "name": "rich-toolkit", + "version": "0.20.5" + }, + { + "direct_url": null, + "metadata_sha256": "294a1405c0fa34b5f735bcb46459050436849a1e584c643544de99c07c529fb7", + "name": "rignore", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "5e54dd00b4ad336c5161d47de2a5c2212090c44629c28b6538b156256e49282d", + "name": "rpds-py", + "version": "2026.6.3" + }, + { + "direct_url": null, + "metadata_sha256": "0d5895abd80bfc0027c02943abaea4547061b9004bd134950d640d619a697835", + "name": "safetensors", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "91d5de3f641f33a8fbb4b6e91772da68d50b68686971d7b66af2068f2e77b694", + "name": "scipy", + "version": "1.17.1" + }, + { + "direct_url": null, + "metadata_sha256": "297fb30f701a800489c12893a951da3e5bd1f80061a1f43f0d3e9f1d4c6bc6fd", + "name": "sentencepiece", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "4245e0388ddf2048a38ae2a24a3d2c583408b2454aadc680d3c3beede639db3f", + "name": "sentry-sdk", + "version": "2.71.0" + }, + { + "direct_url": null, + "metadata_sha256": "ae8a9e6feec1a76e954d65ea48ac57842c9a7bfb5ac6e5ea82400a5ba9f71a98", + "name": "setproctitle", + "version": "1.3.7" + }, + { + "direct_url": null, + "metadata_sha256": "341d00772017437d0f6e3c943ae353f243c39fedfba403aea47cced927a76516", + "name": "setuptools", + "version": "79.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "ff4bcfb192bd542ed8f1794fb32ffc9eabd932d6e03cb00a4ad5e35a2469af88", + "name": "setuptools", + "version": "80.10.2" + }, + { + "direct_url": null, + "metadata_sha256": "f1e5a532fb8cda0bbc370e3db6cb9cea72a065d12ddd6a14976ba3cf66264221", + "name": "shellingham", + "version": "1.5.4" + }, + { + "direct_url": null, + "metadata_sha256": "2aba2cfd9c2ad7625a5d374d141af317d8f92d3534997bf98d127e52848dfc81", + "name": "six", + "version": "1.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "69ae2dfe547624be97fae348e1cfa3793f8854eed32cc1603badedc7d48fb36e", + "name": "smart_open", + "version": "8.0.2" + }, + { + "direct_url": null, + "metadata_sha256": "d415e6c6de7dee117d254a342668c489931bc88eac7ec8678b452078e366da6e", + "name": "smmap", + "version": "5.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "093bc4f0740a6fc28692e616aa8fe68d7e1d76426cc5a5faf9ea722a8ee7aaae", + "name": "sniffio", + "version": "1.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "b3cef071eb1dbeaa76a1273fe2ca2cc8ef36e835165253952d93780962529ac1", + "name": "sse-starlette", + "version": "3.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "3c01ca830e213f0311fe37bc3b46b8ab230a5e7acb894bf0fc8785cb7ccfed48", + "name": "starlette", + "version": "1.7.0" + }, + { + "direct_url": null, + "metadata_sha256": "6017ca508a293cf47a88a78cb330e9cbd131d74ec3c7fbf89bd4300ed3129d30", + "name": "supervisor", + "version": "4.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "fd5eb4925b04f9bffbc6c4f92bf8aea7243b918b43cd359493fce48a7dd3b336", + "name": "sympy", + "version": "1.14.0" + }, + { + "direct_url": null, + "metadata_sha256": "f09f0e24282c5a86346bcd5b10ae5ff81869fa8ef69c3ba524bd0a817a87dda9", + "name": "tabulate", + "version": "0.10.0" + }, + { + "direct_url": null, + "metadata_sha256": "519fa19c146fd58a0a75ecf1461e4bd98f9c06d01800c37d4a80f5fef095f4e1", + "name": "tensorboard", + "version": "2.21.0" + }, + { + "direct_url": null, + "metadata_sha256": "1af7ad76e4073b01ab147eb3c1d8e38b95d38062c6c9bc63890150738642e8eb", + "name": "tensorboard-data-server", + "version": "0.7.2" + }, + { + "direct_url": null, + "metadata_sha256": "9e597f62fc07e3b931d5c8fb0e90706fb6d45465cfb5d01dbd27ba7fc135c02c", + "name": "tensorstore", + "version": "0.1.80" + }, + { + "direct_url": null, + "metadata_sha256": "0da993d16ef6326f471796fcb065622f309c5c1aae6c6295b488ea64bb5c880c", + "name": "textual", + "version": "8.2.8" + }, + { + "direct_url": null, + "metadata_sha256": "52ca6148d4fd1497254855fa610cfdde99191cd42bce7a452fd3a68855504ac0", + "name": "tiktoken", + "version": "0.14.0" + }, + { + "direct_url": null, + "metadata_sha256": "0df9eb495cfb477dcbdfbdcd8c04d952d3eb00d77831630760571e13545398e5", + "name": "tilelang", + "version": "0.1.12" + }, + { + "direct_url": null, + "metadata_sha256": "802b576e011dc61bd2681593e8d802714b6c4ce636a9cf87035026db32ce6262", + "name": "tokenizers", + "version": "0.23.2" + }, + { + "direct_url": null, + "metadata_sha256": "4e1631b2164a49ff9a848d86ce504fdcc15e3540dbb262df8f33a2681a8de513", + "name": "tokenspeed-mla", + "version": "0.1.8" + }, + { + "direct_url": null, + "metadata_sha256": "05086095a775c5dca70998dcf442a848c13f9c68b54a54c510c3542c5abb6563", + "name": "tokenspeed-triton", + "version": "3.8.10.post20260920" + }, + { + "direct_url": null, + "metadata_sha256": "71daba472d0c5ffc25c0231dc29688ab0cb13d5bc7e7d93f6c4cce4169c50048", + "name": "torch", + "version": "2.13.0" + }, + { + "direct_url": null, + "metadata_sha256": "cccd2f1c0e5866e63732f58798c8d642ee6d10cd560d6f691e7981b908c246c9", + "name": "torch_c_dlpack_ext", + "version": "0.1.5" + }, + { + "direct_url": "{\"dir_info\": {}, \"url\": \"file:///torch_memory_saver\"}", + "metadata_sha256": "6276cef17dedbb5ee0d6157bbf63b832e916026281328d995ad3d488c2539618", + "name": "torch_memory_saver", + "version": "0.0.9.post1+slime" + }, + { + "direct_url": null, + "metadata_sha256": "29809ca2c86dda5079654f1f70564a64435e9d08f1964a2412b6f514e1b5ff64", + "name": "torchaudio", + "version": "2.11.0" + }, + { + "direct_url": null, + "metadata_sha256": "7e9be0f3a290e3fd9370d8fe010c7ffd006d5d3d05ab8bdf7df8f92f0fca9c39", + "name": "torchcodec", + "version": "0.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "181fa5e6b399c378711eddcdacd756d3c51317916f8eb160ee36cae7fae9589f", + "name": "torchvision", + "version": "0.28.0" + }, + { + "direct_url": null, + "metadata_sha256": "43d1261aff90cf3d5b1b40cf1f94234d61409b14e59f3766f457c1eec7f7ac15", + "name": "tqdm", + "version": "4.70.1" + }, + { + "direct_url": "{\"archive_info\": {\"hash\": \"sha256=3e1d9f534781c8e608240da0b495b8246317a36382f7609017cbaa7fb1d53f7b\", \"hashes\": {\"sha256\": \"3e1d9f534781c8e608240da0b495b8246317a36382f7609017cbaa7fb1d53f7b\"}}, \"url\": \"file:///wheels/transformer_engine-2.16.1%2Bc9877beb-cp312-cp312-linux_x86_64.whl\"}", + "metadata_sha256": "d882f743161d9d9f35dee4e1a8cc9136fa495f7c660caace01ab8f5602d76aa7", + "name": "transformer_engine", + "version": "2.16.1+c9877beb" + }, + { + "direct_url": null, + "metadata_sha256": "465797a59706d83b45c93fde750b228c3b6e1addc44115de2c4c02ad66d9c5ea", + "name": "transformers", + "version": "5.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "a91982ca086667c592a951973434f7c5a9f27a8300bc97af78dfb496afe53e71", + "name": "triton", + "version": "3.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "d26fbb244532c4051e715f9047cd943e2cc4abb0ac6f2a517fa2986eb1ea726a", + "name": "truststore", + "version": "0.10.4" + }, + { + "direct_url": null, + "metadata_sha256": "c84af1a069084b1b440b3594068dec29200d52d4c1a9b652030448717f270158", + "name": "typer", + "version": "0.27.2" + }, + { + "direct_url": null, + "metadata_sha256": "0ad6653b7439f4bb6a596cb7b01ed1b716458467525c4dc40b75d62bdb943c98", + "name": "typing-inspection", + "version": "0.4.4" + }, + { + "direct_url": null, + "metadata_sha256": "d005280aa13b334ac942d20219102865e559f69ffd06c35c248b2f0d0da3b933", + "name": "typing_extensions", + "version": "4.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "fba2930e9030a18965d243f8d330748db2e67572a81b3b68710462fb5110332a", + "name": "urllib3", + "version": "2.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "bc5717bd6524a33838f285261868bcc8e311e8c29fdb19e41d56c38b04890e84", + "name": "uvicorn", + "version": "0.54.0" + }, + { + "direct_url": null, + "metadata_sha256": "741c006d8441f562aa853a5430df236fbb4af923445491f396bf09943bd30258", + "name": "uvloop", + "version": "0.22.1" + }, + { + "direct_url": "{\"dir_info\": {\"editable\": true}, \"url\": \"file:///vime\"}", + "metadata_sha256": "f85aa01dfdc868756a6583434bbff040f29eb511d47d5b25ada063a84353aac6", + "name": "vime", + "version": "0.3.2" + }, + { + "direct_url": null, + "metadata_sha256": "c25431aaf1950971fe96292f395a41a55b403127bfca0d0b8f7dc9cff5dab75d", + "name": "virtualenv", + "version": "21.14.1" + }, + { + "direct_url": null, + "metadata_sha256": "4e3ee0a31d85e56268640aae853bcee4794dfe8c0483c5c6370517e480c81ae0", + "name": "virtualenv", + "version": "21.14.5" + }, + { + "direct_url": null, + "metadata_sha256": "d4ed5c7551cddb8c1aeff2f9f27b3491f6ad2c9afda8e7bb9779c33fa12a536c", + "name": "vllm", + "version": "0.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "84b482e09bac949e992594757214a1920c667a5d898ee320e309250697f6d26e", + "name": "vllm-router", + "version": "0.1.15" + }, + { + "direct_url": null, + "metadata_sha256": "9b16c871eb1060a5218e9b9a9ad33288d94844cfaf43f08dbb6c32423bde8fe3", + "name": "wandb", + "version": "0.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "8e4f2be437dfe4eb3c6c959e517ac20b75d06525563f1ebcbf06f9ec648bd7c1", + "name": "watchdog", + "version": "6.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "15218afb42938907c2ca74c54e3d8e3a5406493c4761e29e38e82bfec0f84296", + "name": "watchfiles", + "version": "1.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "8863af96e88b7db9990da99aa6c46816eacc3d2f9ae1297b53381b033cd70119", + "name": "wcmatch", + "version": "11.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "f46e6bd6cfafb2b684c29587b017b7096fd9155b74eda25a22eca784b9803ab7", + "name": "websockets", + "version": "16.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "ce82db5ccfefa4bfbe4e25a36e1f91e8e7d51fcaeb31586c4d48e1c69f99168b", + "name": "websockets", + "version": "17.1" + }, + { + "direct_url": null, + "metadata_sha256": "0f142a2c09eac643c7d0bfe77f3f121184c0b17914afbd32af669ed19b2b02ef", + "name": "wheel", + "version": "0.47.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd58938e51a3c5cb363f6f22eaa2a8a7accc1ce373388de167a82f77d3e5783f", + "name": "wrapt", + "version": "2.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "b0b72c1941f04499ca7e1a3a6e479aee8df902c3d49979624b59dba8c3228d37", + "name": "xgrammar", + "version": "0.2.8" + }, + { + "direct_url": null, + "metadata_sha256": "ef8861f39e5c36255966a36032651f937d890d55f31f1c26304b488f1ba34332", + "name": "xxhash", + "version": "4.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "740c08057b6eb69c58402c87d652af0a471e46325d811f2c605632a18817152f", + "name": "yarl", + "version": "1.25.1" + }, + { + "direct_url": null, + "metadata_sha256": "7b060e4d24394b5431875e2f74fec8e6bffa79d2e6b4cb8c7e2a5187dd2d8d69", + "name": "z3-solver", + "version": "4.15.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "3d76d4fbc95f0851191147db12300938c67a6f8fb1df884886d9601272ccc4e8", + "name": "zipp", + "version": "4.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "d3de2651e4e908dbb7c9d80508e5179590217dfac4993dc8b04381c5b9718c4c", + "name": "zstandard", + "version": "0.25.0" + } + ], + "executable": "", + "installed_provider_sources": { + "vllm/compilation/__init__.py": { + "path": "/vllm/compilation/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/backends.py": { + "path": "/vllm/compilation/backends.py", + "sha256": "fa4bff8920b363efbbde9456f135fa9d2c004a5bde1898877f177418b2d8b008" + }, + "vllm/compilation/base_static_graph.py": { + "path": "/vllm/compilation/base_static_graph.py", + "sha256": "5cfe8e06db84aa42cd41cdd93ebe93af00b3a242c8011042057530e2922b523a" + }, + "vllm/compilation/breakable_cudagraph.py": { + "path": "/vllm/compilation/breakable_cudagraph.py", + "sha256": "3cc427612a08e2b9b3fee47548026400c1d0776e2d4747535e59ef5512bdf1e8" + }, + "vllm/compilation/caching.py": { + "path": "/vllm/compilation/caching.py", + "sha256": "71d212452dde742fbf28b8a01ed29d3c08a7457ff7f8da2a20ce9d17e902c2cf" + }, + "vllm/compilation/codegen.py": { + "path": "/vllm/compilation/codegen.py", + "sha256": "e04833bec88cf9d1a13aa7341e30e3233d1138bfe23424e0fd34d664b3fedb9f" + }, + "vllm/compilation/compiler_interface.py": { + "path": "/vllm/compilation/compiler_interface.py", + "sha256": "8d84e2864bf83f754bae9e9f77119e0287cca9f97f5fa5ec2535e07b5ad88944" + }, + "vllm/compilation/counter.py": { + "path": "/vllm/compilation/counter.py", + "sha256": "d8158c54dd36a357bf24f6f84dc22f572d3a27f4875f3d5779b12bc5d454ff76" + }, + "vllm/compilation/cuda_graph.py": { + "path": "/vllm/compilation/cuda_graph.py", + "sha256": "05c86392d7fae967ac73076dba7e01990a0e3ae619e4866450a0c1be56bd1192" + }, + "vllm/compilation/decorators.py": { + "path": "/vllm/compilation/decorators.py", + "sha256": "cab6962e8a1fead59c75f5ed8cb4732f9e5441ff972030c2f4b1c4ba0c58de3c" + }, + "vllm/compilation/monitor.py": { + "path": "/vllm/compilation/monitor.py", + "sha256": "43b24c5cb1bc4d32dc979f3222596905c7b3acc58415328a234402e6edc76abf" + }, + "vllm/compilation/partition_rules.py": { + "path": "/vllm/compilation/partition_rules.py", + "sha256": "857d2fb06dc871ea1d3717cd01fbd4e5205984100d98b7b72a2933d6ff1cfa4d" + }, + "vllm/compilation/passes/__init__.py": { + "path": "/vllm/compilation/passes/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/fusion/__init__.py": { + "path": "/vllm/compilation/passes/fusion/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/fusion/act_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/act_quant_fusion.py", + "sha256": "1fa9c3ca4fb424685b7053c3dda89dda16c98dc5645d85f0f28dca58429792b3" + }, + "vllm/compilation/passes/fusion/add_rms_fusion.py": { + "path": "/vllm/compilation/passes/fusion/add_rms_fusion.py", + "sha256": "e46998552628aa5cd5962fc39ea39ae824fd97e6aeba1d176e9cc7cade39837b" + }, + "vllm/compilation/passes/fusion/allreduce_rms_fusion.py": { + "path": "/vllm/compilation/passes/fusion/allreduce_rms_fusion.py", + "sha256": "0af193505880cec0f6ffa224c688bce3c9ddc318dccdf04a696b4e4b4506a963" + }, + "vllm/compilation/passes/fusion/attn_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/attn_quant_fusion.py", + "sha256": "ecc64e82be4481954c9cac6c23d7794846ab19486b570f2dda07ab5ad67c5a49" + }, + "vllm/compilation/passes/fusion/collective_fusion.py": { + "path": "/vllm/compilation/passes/fusion/collective_fusion.py", + "sha256": "1e2c8539d6960b45907fb3bf0482441ea7250e97c56ffdea1500514efa0b164d" + }, + "vllm/compilation/passes/fusion/matcher_utils.py": { + "path": "/vllm/compilation/passes/fusion/matcher_utils.py", + "sha256": "50ac5714ce1bb113520de769ea6234316acc470a8cdf2537a996ce9a9d54337d" + }, + "vllm/compilation/passes/fusion/mla_attn_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/mla_attn_quant_fusion.py", + "sha256": "a966fe7f58bf9228379f793f5fd851735a97f9639722766b2a20cb79a9e4baec" + }, + "vllm/compilation/passes/fusion/mla_rope_kvcache_cat_fusion.py": { + "path": "/vllm/compilation/passes/fusion/mla_rope_kvcache_cat_fusion.py", + "sha256": "1602cc28055ffa8d1123ddb1d256bf0bd12006fd06ea7e16a986c55746dbe0dc" + }, + "vllm/compilation/passes/fusion/qk_norm_rope_fusion.py": { + "path": "/vllm/compilation/passes/fusion/qk_norm_rope_fusion.py", + "sha256": "aebc7d1a5189b65ac665afcc169e7baebd53efe719c48e35e7c5babe85af0d39" + }, + "vllm/compilation/passes/fusion/qk_norm_rope_kvcache_fusion.py": { + "path": "/vllm/compilation/passes/fusion/qk_norm_rope_kvcache_fusion.py", + "sha256": "f0cfd0d83ec4acb09f9bf91d199b114e9d4995e3059c13eb23a6978ce7c07eb2" + }, + "vllm/compilation/passes/fusion/rms_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rms_quant_fusion.py", + "sha256": "4852aa44e0e2087043fdac271bda9b8d9bfe3201bb84ce3919b8ed454d8083c4" + }, + "vllm/compilation/passes/fusion/rocm_aiter_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rocm_aiter_fusion.py", + "sha256": "372e76c68c75209a085deec6dd22b3816be633613ca82f6f2925c1b3773d61a0" + }, + "vllm/compilation/passes/fusion/rope_kvcache_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rope_kvcache_fusion.py", + "sha256": "3a756e9049593537143b5a56ab9185a6bc83f57ed81d84226d7791a46a984b53" + }, + "vllm/compilation/passes/fusion/sequence_parallelism.py": { + "path": "/vllm/compilation/passes/fusion/sequence_parallelism.py", + "sha256": "3af7e420dcb35fff0bae0f8f599d0f1bda34445ebe194059892a434b2976d654" + }, + "vllm/compilation/passes/fx_utils.py": { + "path": "/vllm/compilation/passes/fx_utils.py", + "sha256": "730708213acf9d1b5f3176b433dfc197a5f3c81b5ce443f0923c526924833003" + }, + "vllm/compilation/passes/inductor_pass.py": { + "path": "/vllm/compilation/passes/inductor_pass.py", + "sha256": "1f380aacf7adabb8bf8b7d41c0a93473947f0716f7445bd910fd448f6c08e672" + }, + "vllm/compilation/passes/ir/__init__.py": { + "path": "/vllm/compilation/passes/ir/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/ir/clone_elimination.py": { + "path": "/vllm/compilation/passes/ir/clone_elimination.py", + "sha256": "5297078f5cddce081faba5215814275381d2083b32318fcfeb2bf9d69fedb7c7" + }, + "vllm/compilation/passes/ir/inplace_functionalization.py": { + "path": "/vllm/compilation/passes/ir/inplace_functionalization.py", + "sha256": "2dc4f22c6f05224828c2941479185b1452d4490f488b7f0bfd124334e7809fed" + }, + "vllm/compilation/passes/ir/lowering_pass.py": { + "path": "/vllm/compilation/passes/ir/lowering_pass.py", + "sha256": "d9c3d90f63138420f0e5489447b5996573fcfbbab939da2efccd00848492b172" + }, + "vllm/compilation/passes/ir/utils.py": { + "path": "/vllm/compilation/passes/ir/utils.py", + "sha256": "f59d33a6c7d0616cbeec1e9fb1d6c948881bf81fe124caeb906eac2e2197ea21" + }, + "vllm/compilation/passes/pass_manager.py": { + "path": "/vllm/compilation/passes/pass_manager.py", + "sha256": "486979a058aa2e20ebedcbb6e039f7a59f38d2efd2cda11219fae4067be0968d" + }, + "vllm/compilation/passes/utility/__init__.py": { + "path": "/vllm/compilation/passes/utility/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/utility/fix_functionalization.py": { + "path": "/vllm/compilation/passes/utility/fix_functionalization.py", + "sha256": "ad5b504a05ccee023869b0c8df70ec2fff9a4a80d25fd903e2b532f470e7203f" + }, + "vllm/compilation/passes/utility/noop_elimination.py": { + "path": "/vllm/compilation/passes/utility/noop_elimination.py", + "sha256": "8abf85d28c13f95059f2acbc0275b9b9ed2ad4990f7c5763bbe3067a4aa629ce" + }, + "vllm/compilation/passes/utility/post_cleanup.py": { + "path": "/vllm/compilation/passes/utility/post_cleanup.py", + "sha256": "1c38b14fc209165cbcf8ca763a17ac4e528b97f59b573e5d52df2cce7d758de3" + }, + "vllm/compilation/passes/utility/scatter_split_replace.py": { + "path": "/vllm/compilation/passes/utility/scatter_split_replace.py", + "sha256": "138402cc3097768a32e9e5b8d1a054b6176e494bddc8684e23ca2dc5fdc3fdda" + }, + "vllm/compilation/passes/utility/split_coalescing.py": { + "path": "/vllm/compilation/passes/utility/split_coalescing.py", + "sha256": "0b02acd9e1ad43d7b3e128b914e969b9580773f2818078846dfbf163a8bd0871" + }, + "vllm/compilation/passes/vllm_inductor_pass.py": { + "path": "/vllm/compilation/passes/vllm_inductor_pass.py", + "sha256": "4f83ffb67f834a214221d810c7843a8e41eb4e5930eb40adbd8cf054ff6fb9c6" + }, + "vllm/compilation/piecewise_backend.py": { + "path": "/vllm/compilation/piecewise_backend.py", + "sha256": "6525318ff3ca2e4978e24dd9232a7ae0a02e920e19604b83db6f6043d1f8a54d" + }, + "vllm/compilation/wrapper.py": { + "path": "/vllm/compilation/wrapper.py", + "sha256": "c1b1fca679ea16aa07a696831a810c0d531da2bb0ea32dd6f1a95cdaef36de07" + }, + "vllm/config/__init__.py": { + "path": "/vllm/config/__init__.py", + "sha256": "56fb0cb1598d297e4f95a97e5d86dc624145d1532f5faa432b7d2834d7155bd5" + }, + "vllm/config/attention.py": { + "path": "/vllm/config/attention.py", + "sha256": "c41f345b512d9b7df882328257eb3a6381f41088c11ae83b5ecd8a9e8265d1bc" + }, + "vllm/config/cache.py": { + "path": "/vllm/config/cache.py", + "sha256": "f1c226ba679c884930dbfcaf41a57248b137a9a20d3ed8e3d3b31752bb484c07" + }, + "vllm/config/compilation.py": { + "path": "/vllm/config/compilation.py", + "sha256": "c9cec5c7200e8e559810ec8c30113ad61dab6780f9f7fb3c116bd0d9b5a43065" + }, + "vllm/config/device.py": { + "path": "/vllm/config/device.py", + "sha256": "7b82eee02ceb5842337451a27a3d5729920c47e25e8f6bf3997f5146f9330a9c" + }, + "vllm/config/diffusion.py": { + "path": "/vllm/config/diffusion.py", + "sha256": "1fa9fd2478a866098a28a3586b55af2f9738656b7813a55d76539c10dd99fe8d" + }, + "vllm/config/ec_manager_config.py": { + "path": "/vllm/config/ec_manager_config.py", + "sha256": "418b387dbe7bdf67deddce331c205768a2d42aea37141f59fb02a8a1528e3552" + }, + "vllm/config/ec_transfer.py": { + "path": "/vllm/config/ec_transfer.py", + "sha256": "0eabb2c25194676d23c6acf59562672a1dd24415043ac5737d621ce0d681ec70" + }, + "vllm/config/engram.py": { + "path": "/vllm/config/engram.py", + "sha256": "34043a22385a041d4e9be8857f64174c990c2ca8308b97b6a952b5ab96c20ee5" + }, + "vllm/config/fault_tolerance.py": { + "path": "/vllm/config/fault_tolerance.py", + "sha256": "b166b24373d599fb15ddc575e3061cf0dcb42174d0369d8468008e7ffbb2a4e2" + }, + "vllm/config/kernel.py": { + "path": "/vllm/config/kernel.py", + "sha256": "27e23c584cf862f4091858db6dc85bbc2a01f4baf9dca3f232ae6f3bac02390e" + }, + "vllm/config/kv_events.py": { + "path": "/vllm/config/kv_events.py", + "sha256": "b1dbaee3e6830e381e9157fe3bab0d65c357da88ff7cdf8b1e4b3a4e75c82a87" + }, + "vllm/config/kv_transfer.py": { + "path": "/vllm/config/kv_transfer.py", + "sha256": "506fae7a9d7f32cb3646156cf9249a856f6317dff6c4c85db70efd34418c429b" + }, + "vllm/config/load.py": { + "path": "/vllm/config/load.py", + "sha256": "bd6431c22e078362d749a56a2c84145432ebf2605d8bcfa2ac679182d18ed630" + }, + "vllm/config/lora.py": { + "path": "/vllm/config/lora.py", + "sha256": "ed6cf6575f5950f079a62f904caeae93d1a4745dd8c21788b74367883bcd4b08" + }, + "vllm/config/mamba.py": { + "path": "/vllm/config/mamba.py", + "sha256": "2090f791201ca45dd4f1d72b8651268890eb07574b6084721194eb8fdf612c48" + }, + "vllm/config/model.py": { + "path": "/vllm/config/model.py", + "sha256": "f4168b67cc93ce72ff2a6d4c66974223e32fd0f1fab4c05e44bd68a275e18d69" + }, + "vllm/config/model_arch.py": { + "path": "/vllm/config/model_arch.py", + "sha256": "2babe28329d7b60b4e205f6d72c687f0f66e6535aa2f20411469e5ec362f6b5f" + }, + "vllm/config/multimodal.py": { + "path": "/vllm/config/multimodal.py", + "sha256": "271911aee151f17f092228cecee82af0713e9a47340ffdf66834ca7638a50d22" + }, + "vllm/config/observability.py": { + "path": "/vllm/config/observability.py", + "sha256": "d57c59ec776477ab0a20e9f2b945bc954d8ea3737c869259480e9aa10dfb9f6d" + }, + "vllm/config/offload.py": { + "path": "/vllm/config/offload.py", + "sha256": "6f2db3d9a2730588473d5155811690c6241b167a21dcb62fbbd9ebb6386de42c" + }, + "vllm/config/parallel.py": { + "path": "/vllm/config/parallel.py", + "sha256": "f012ace89e3fb730a467f729f602679bc145c49f0d10721811c9d818570e7b2b" + }, + "vllm/config/pooler.py": { + "path": "/vllm/config/pooler.py", + "sha256": "9f01913dcb7bccbf9b672b16643f18471ae202455992e8afaf0725a17f2b3d08" + }, + "vllm/config/profiler.py": { + "path": "/vllm/config/profiler.py", + "sha256": "04d24fa1dc7cfedca6b5c7d9115f7f7021722fc46a5b15234a1e3b3a506c93e5" + }, + "vllm/config/quantization.py": { + "path": "/vllm/config/quantization.py", + "sha256": "acffc52f525b39a88efd656f1ed705ce3a1b758298bb0684fac7694776bc10b4" + }, + "vllm/config/reasoning.py": { + "path": "/vllm/config/reasoning.py", + "sha256": "2c4f7bdee48a9fb3d93787c4c32361c2411417cce452cfde86808d8759977861" + }, + "vllm/config/scheduler.py": { + "path": "/vllm/config/scheduler.py", + "sha256": "822179da62be4bca0619c8590082ae09123f5c4415f9cc2037be673748239edb" + }, + "vllm/config/speculative.py": { + "path": "/vllm/config/speculative.py", + "sha256": "9c642a87264339c0dbc1d0b57330572149df0f9d5e16c6893b9895e50a619e19" + }, + "vllm/config/speech_to_text.py": { + "path": "/vllm/config/speech_to_text.py", + "sha256": "bf4a566fbde6a1cec1e209070b739650c3302c12696739c88049cb8f723a4c3f" + }, + "vllm/config/structured_outputs.py": { + "path": "/vllm/config/structured_outputs.py", + "sha256": "55649776594349b8b4aa3e08fc4c88068366732a486d6fb235079188044aa829" + }, + "vllm/config/utils.py": { + "path": "/vllm/config/utils.py", + "sha256": "d035e9e488ba92b6c47a96cf05d9b2a850d53eda8a05115b22ff9af8dbc2fc64" + }, + "vllm/config/vllm.py": { + "path": "/vllm/config/vllm.py", + "sha256": "956b812e5a719bcbfa3a3958801361b38b9c928c96b8c073311bbb96376dfb7a" + }, + "vllm/config/watermarking.py": { + "path": "/vllm/config/watermarking.py", + "sha256": "30e6620a3cd7529f0736ad55e38bc326a6a78dee4552f0722208400041c94a1f" + }, + "vllm/config/weight_transfer.py": { + "path": "/vllm/config/weight_transfer.py", + "sha256": "92edd9e5ea90c97a8f3c5f20abf1734a105ee1f3f89e306e7ba87e758f1f767e" + }, + "vllm/distributed/__init__.py": { + "path": "/vllm/distributed/__init__.py", + "sha256": "97f28c30b32662af8cab163939e4ee423037f11630752e13b55cbc25a7d0ab71" + }, + "vllm/distributed/communication_op.py": { + "path": "/vllm/distributed/communication_op.py", + "sha256": "3c3f8ac60db38ece891d39dc1e2f6f1947ad438685893d2e5777d072320bd1b8" + }, + "vllm/distributed/device_communicators/__init__.py": { + "path": "/vllm/distributed/device_communicators/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/device_communicators/aiter_custom_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/aiter_custom_all_reduce.py", + "sha256": "f8eb027ce7a85d94af6260960ceb7f36fc6f1406c9af9c9b6285fddb3f178009" + }, + "vllm/distributed/device_communicators/all2all.py": { + "path": "/vllm/distributed/device_communicators/all2all.py", + "sha256": "1f1b69236acd3cd7bd94520fd6d591bfd31b57c4bc7c9f9f4161ea8bbd0c5f26" + }, + "vllm/distributed/device_communicators/all_reduce_utils.py": { + "path": "/vllm/distributed/device_communicators/all_reduce_utils.py", + "sha256": "ed0ab4dd05b2519a6313892e68824c97b540034664d7f8c3d031b322e33e1bfc" + }, + "vllm/distributed/device_communicators/base_device_communicator.py": { + "path": "/vllm/distributed/device_communicators/base_device_communicator.py", + "sha256": "4a7670f12ed7c7621b25d476e2687c24ca01f3be183fff4a6a25337596fe506b" + }, + "vllm/distributed/device_communicators/cpu_communicator.py": { + "path": "/vllm/distributed/device_communicators/cpu_communicator.py", + "sha256": "e1856c8e91cfbbb4d9ce990c1236e258ba4021e226afcbab645653380b38d64b" + }, + "vllm/distributed/device_communicators/cuda_communicator.py": { + "path": "/vllm/distributed/device_communicators/cuda_communicator.py", + "sha256": "102d95c67ec798cf352b817ba92e8abc9da37f30d1bbdf3aab45d3927b627b93" + }, + "vllm/distributed/device_communicators/cuda_wrapper.py": { + "path": "/vllm/distributed/device_communicators/cuda_wrapper.py", + "sha256": "333b6d9ed173e7a18c7f2b6627a3c9c9ed88892ce52015f05e29d6d245e48ee3" + }, + "vllm/distributed/device_communicators/custom_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/custom_all_reduce.py", + "sha256": "a048c1327c23580805600c0c951831bec333b1ffc4eb26a0e3d34119c4f0c445" + }, + "vllm/distributed/device_communicators/flashinfer_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/flashinfer_all_reduce.py", + "sha256": "b4359760e9b55963676109a5c3a015fb82e190d4df1d021de9ee01e7814cbdda" + }, + "vllm/distributed/device_communicators/flashinfer_pcie_ipc_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/flashinfer_pcie_ipc_all_reduce.py", + "sha256": "8b67b0fc356a565095f56b475cc89c513e3a5eff051ab1c52e5beb0c1a79e9f2" + }, + "vllm/distributed/device_communicators/mnnvl_compat.py": { + "path": "/vllm/distributed/device_communicators/mnnvl_compat.py", + "sha256": "72ee1e6f9571b4c8ecbd9f60cd469d1b565cb79cab519a688a93f290906a2615" + }, + "vllm/distributed/device_communicators/pynccl.py": { + "path": "/vllm/distributed/device_communicators/pynccl.py", + "sha256": "882fb83c5a3c565a3f8fd664b79f5ceae566dca180019ecafd74bc8c11d9f8cf" + }, + "vllm/distributed/device_communicators/pynccl_allocator.py": { + "path": "/vllm/distributed/device_communicators/pynccl_allocator.py", + "sha256": "390e2576cbf4ae06341ca4dab24fc7e4d4f7c24dd444329ed05d828a9ce91460" + }, + "vllm/distributed/device_communicators/pynccl_wrapper.py": { + "path": "/vllm/distributed/device_communicators/pynccl_wrapper.py", + "sha256": "ce63c8da57bb88d4cf89956bd70bb63f0f44bfad468ddb37b765611551f6d99f" + }, + "vllm/distributed/device_communicators/quick_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/quick_all_reduce.py", + "sha256": "8aacb23e7c297b0ae2f80d99c5affd2e7517115d7874be51069d14a44db7b5f2" + }, + "vllm/distributed/device_communicators/ray_communicator.py": { + "path": "/vllm/distributed/device_communicators/ray_communicator.py", + "sha256": "332c37f65495b60564d61db59bc2d30ca0236adc33442d01464790bde9aec897" + }, + "vllm/distributed/device_communicators/shm_broadcast.py": { + "path": "/vllm/distributed/device_communicators/shm_broadcast.py", + "sha256": "f3e7a3f3ff713fccbd535e0d41650ee05bdf8677e83d4b90519910645022c30b" + }, + "vllm/distributed/device_communicators/shm_object_storage.py": { + "path": "/vllm/distributed/device_communicators/shm_object_storage.py", + "sha256": "e097bf7ac0141fe8db4131e8fd553ca2ad5b0600b22a56f3924af6b795e7207c" + }, + "vllm/distributed/device_communicators/symm_mem.py": { + "path": "/vllm/distributed/device_communicators/symm_mem.py", + "sha256": "b06e3ddb9ae880a30ec4a103ce32eb9794223bb0293832e89572af28adaaa544" + }, + "vllm/distributed/device_communicators/xpu_communicator.py": { + "path": "/vllm/distributed/device_communicators/xpu_communicator.py", + "sha256": "527cbfb250760abc62096ee7cd612307b821f21b72dee1687ad866620ec89b6d" + }, + "vllm/distributed/ec_transfer/__init__.py": { + "path": "/vllm/distributed/ec_transfer/__init__.py", + "sha256": "061405bb51df7409c9938b62e25caa8bd6ebf85da6d1700dbd4affe2a0825135" + }, + "vllm/distributed/ec_transfer/ec_connector/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/base.py", + "sha256": "22d4913375bb622473fbe1a77f9376b804949cd8a7e31e9518208f9561d161e2" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/common.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/common.py", + "sha256": "e2267abd8d00a6d2605e1a82ea5c73396a71b427452eab469fcca0134c334e7c" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/connector.py", + "sha256": "72cd35d9fd754a2992dd090a8af13c91e0789b4038ac29276750d823120235db" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/base.py", + "sha256": "19e8df88b0fa831997896355ecdd49e0d86cb074cd7ae28aed0b328b0bb3ab2e" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/zmq.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/zmq.py", + "sha256": "435641c0e37551ab4937855abd067be26905b91215e759cbd9d28a419a34ff9a" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/base.py", + "sha256": "3be698aeb67d32ee3741e76b2fb71806941c587578583acf8fbc42fbf22b46a5" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/nixl.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/nixl.py", + "sha256": "03af8f6549a6027b7262a482907af591e45f28b9b1c5a3408bbc6600e38797e5" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/ec_shared_region.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/ec_shared_region.py", + "sha256": "e40607952c9920024455eca2f419e8c3ef1de9a4d8b27c147a33bb941b8c08b1" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/protocol.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/protocol.py", + "sha256": "05878336884396bfbef77b96b0fa6359f6fa0aba912961f14a84f5a436f27038" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/__init__.py", + "sha256": "01c42385bf3a55cff09cc05ba956f6dd4b8b6b986bf4d6eca4e566cb045b48e0" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/embedding_cache.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/embedding_cache.py", + "sha256": "7359fb980af1fc30b3253681310ef636e2b4a19134e04a93270c9c45de2572d8" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/session.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/session.py", + "sha256": "5973548a919e13c866222b91d502686a6757a31e5a5664b879bf2887ed9fb212" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/utils.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/utils.py", + "sha256": "160ac665f20f2c75b343c1e784084f2b0b4d1cf8fdb28ee15deee4dc8ed0ce45" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/worker/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/worker/__init__.py", + "sha256": "f08d296d3560c42173ae8af961af4a768033ccf1e36e9c17c0cdd53013d0c52e" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/worker/descriptor_buffers.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/worker/descriptor_buffers.py", + "sha256": "be7c81be214e995da8499105ba485854d9c19d6f8e905f8f1b87b83694ca0864" + }, + "vllm/distributed/ec_transfer/ec_connector/example_connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/example_connector.py", + "sha256": "09022ce07a89114bb65d9befd2e60873453aed11bbac8c0a75c1e6084e785a5f" + }, + "vllm/distributed/ec_transfer/ec_connector/factory.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/factory.py", + "sha256": "d6cedca0a99c3dd2b03cd1c15d17472b983e3f7d8f5baf4a12eecaf6abedb817" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/__init__.py", + "sha256": "1cbfc2f95f8f4d48a9253056eb1fd4b562062884e3fd5cb6571583c352fc16f3" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/config.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/config.py", + "sha256": "98c60696f79d1de67d2364cd9e8a42a393b5c8e17ed9af2f971368e47891d7b3" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/control.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/control.py", + "sha256": "58e0d1a423fbe958bfa586ac26a17107e08d0b31d044b4c74ab4dde880e7ca9b" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/memory.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/memory.py", + "sha256": "d5e90b1348de670a70f110d58eedcbdbd053db72c21dd007c3f5275c53951149" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/metadata.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/metadata.py", + "sha256": "497a7e6dfffb7fce80a41d5989f96119b970c143df77bb9d0f9c91d7a46e8c42" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/producer.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/producer.py", + "sha256": "97fa4d0b19475574778eab02f55fad73db9642beb9156da890314fd53fa1a7ab" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/reservation.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/reservation.py", + "sha256": "4790bc65cde4db5f17733ca2c2910980ba594a8a9b79ee27c5b957dffd4c1113" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/scheduler.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/scheduler.py", + "sha256": "53004b62529a31fdd80dfb2e6026610b95041a77e91f731ae526fefd84e7968d" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/state.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/state.py", + "sha256": "92f375d6c5cc9c83dbe95a7977ad8eb0f1b5629ccee92968bcacdc94eee15d65" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/transfer.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/transfer.py", + "sha256": "ada2113a5402054f1149d3edc2537f4e5e1bd696c9b17291c9f2b4cbf6b59753" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/worker.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/worker.py", + "sha256": "89eb91bb64845b3b121d502972a6b04d448714253becd2ea662e5691cd5acdd7" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake_ec_connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake_ec_connector.py", + "sha256": "aaebab4711bc00dd0c622dfbfd8639fc41e7ed5d1658d7d68fe33e4d5fbef3ba" + }, + "vllm/distributed/ec_transfer/ec_connector/utils.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/utils.py", + "sha256": "11b9014b9c0697f8846deff1a55a22fa86a15dc2ac3e139442fb6d513ac03059" + }, + "vllm/distributed/ec_transfer/ec_transfer_state.py": { + "path": "/vllm/distributed/ec_transfer/ec_transfer_state.py", + "sha256": "9487a41f23fa1a4fa6dfca8b42b8e97a0ee19d8406ffd1dcf4bef66315180827" + }, + "vllm/distributed/elastic_ep/__init__.py": { + "path": "/vllm/distributed/elastic_ep/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/elastic_ep/elastic_execute.py": { + "path": "/vllm/distributed/elastic_ep/elastic_execute.py", + "sha256": "b8f60a4183c79ff6051095b5f95bb385bc7fea0cffe8cd9ebc9087ab0e9f01b5" + }, + "vllm/distributed/elastic_ep/elastic_state.py": { + "path": "/vllm/distributed/elastic_ep/elastic_state.py", + "sha256": "fbf049199841a086fdf2fc1ab8498ef017ad3bf319db65c3ae61acbb536d2e10" + }, + "vllm/distributed/elastic_ep/standby_state.py": { + "path": "/vllm/distributed/elastic_ep/standby_state.py", + "sha256": "15282597550ebd0e07b8492ff192aea1ec0dcec8f0ad34009123e1002cc140c1" + }, + "vllm/distributed/eplb/__init__.py": { + "path": "/vllm/distributed/eplb/__init__.py", + "sha256": "1b9c2ee22abb5888c354c5aa01f0944f253e5e24e135d019778398bbe495a628" + }, + "vllm/distributed/eplb/async_worker.py": { + "path": "/vllm/distributed/eplb/async_worker.py", + "sha256": "424328600ad1003286fc5dfffa1f9482007314c060947818b2f94a8b97811f5e" + }, + "vllm/distributed/eplb/eplb_communicator.py": { + "path": "/vllm/distributed/eplb/eplb_communicator.py", + "sha256": "ba30d9d40e7b81d3f42aa9041d2f328edca4073cfe2de920285eb68375501ed8" + }, + "vllm/distributed/eplb/eplb_state.py": { + "path": "/vllm/distributed/eplb/eplb_state.py", + "sha256": "2f06bc8c63f3fdf55edb5032ae55c0ffcac3e67720ce74ea312e3d141b12acf4" + }, + "vllm/distributed/eplb/eplb_utils.py": { + "path": "/vllm/distributed/eplb/eplb_utils.py", + "sha256": "058af6104faa6d4085c1dca80bbe60d92bf0a7ec9cd92c775a180546c9d8c9c3" + }, + "vllm/distributed/eplb/policy/__init__.py": { + "path": "/vllm/distributed/eplb/policy/__init__.py", + "sha256": "daeb266c88442832b1ab8c8c4cc064891b38b9e9ba00aea324f926c87dc6d37e" + }, + "vllm/distributed/eplb/policy/abstract.py": { + "path": "/vllm/distributed/eplb/policy/abstract.py", + "sha256": "b9fd34c28bbfdded03360d7f3f6f8fb978e82689190d7ae4501dfe520e958c62" + }, + "vllm/distributed/eplb/policy/default.py": { + "path": "/vllm/distributed/eplb/policy/default.py", + "sha256": "3b54229e6240d050480390f6b29d4744fd38437d23719f78a6decf7002296a29" + }, + "vllm/distributed/eplb/rebalance_execute.py": { + "path": "/vllm/distributed/eplb/rebalance_execute.py", + "sha256": "b387e228791149018536eee96cf955b33ba79d801cdc36849d1b47a580ec2597" + }, + "vllm/distributed/kv_events.py": { + "path": "/vllm/distributed/kv_events.py", + "sha256": "de08f01e8736881560256c350a3b6418999dd4aa30f9c6ec9159527f7ed6899a" + }, + "vllm/distributed/kv_transfer/__init__.py": { + "path": "/vllm/distributed/kv_transfer/__init__.py", + "sha256": "c1be4e58ec6923bae607a355ad22891c740f056a69ff7358b1e10ea3fd2680ea" + }, + "vllm/distributed/kv_transfer/kv_connector/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/base.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/base.py", + "sha256": "2ae2a2c48f5731f3533166a75440fe91e764332305b5d713df840edba970789d" + }, + "vllm/distributed/kv_transfer/kv_connector/factory.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/factory.py", + "sha256": "add99c93c587b0098b90b1f8fd6940bdd1f15c236c5c6f1a258411863cb902d3" + }, + "vllm/distributed/kv_transfer/kv_connector/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/utils.py", + "sha256": "317ed40dc837671ca6e666165222e641a0f9b3992aea63bbf54de7e13d40b3a4" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/__init__.py", + "sha256": "5beb6ccad12fdcfe1581982da6f18321caca50e73a6b3259ebf3c8dc8b3ffcca" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/base.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/base.py", + "sha256": "97af64220475c6c9e8273438d7b5138b105ebe6944beb783facb36a3bb76f31b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/decode_bench_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/decode_bench_connector.py", + "sha256": "b4151c88cdec28f1ff9259047abc17baf23b892f4b68769a93bf26e0442b9017" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/example_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/example_connector.py", + "sha256": "6226876ef52d10d0d284d29c337ab44698e8bac6abdb2e0ece53b5756c55d068" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/example_hidden_states_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/example_hidden_states_connector.py", + "sha256": "58c22534dcad0fb73599a2d70a2fb104d5b612a4723be5e777f56a56fe07892c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/flexkv_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/flexkv_connector.py", + "sha256": "de4f68c3bd565ed898e47e0b2980049b966ff31888f1957050d30995d4953762" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_client.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_client.py", + "sha256": "bea6ecff2be281c7e96c1551c7bf463cbb01f2964696067c0ebdb683844f9aab" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_connector.py", + "sha256": "e67ed58015090e5eea9d499883f2a9422673d07f8bdbe0ccff7db15d2460de13" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_metadata_server.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_metadata_server.py", + "sha256": "6800e5cf37809f8a8e28c469c14a434db288bc3bf83a8b62ee06910a20c2da19" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/common.py", + "sha256": "8f2c02c08227a9093e6aeb183961aba36b7812cfc29b8c047a2b2c9d82f79c15" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/gather_scatter_helper.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/gather_scatter_helper.py", + "sha256": "08c1b43de34fbeca77357d7576ac1d17cba974b59d695562f68bb713061e7b54" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/hf3fs_mock_client.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/hf3fs_mock_client.py", + "sha256": "bec61a9b0c4b9124b2292d7646d76411da44396389349b53cdcbc46353c8780e" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/connector.py", + "sha256": "8c61094ce0a3a702908f9576f69482e6bf314738a2cbe33a7d3b47258fa0ab43" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/stats.py", + "sha256": "d9383a6ad6ab6b8f812d29d90495407b770eeddb79b86e9d0e3216c0bd16e0ed" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/worker.py", + "sha256": "251c0d8e57e4739c03ce3e1c899a95ff5b1752eb27676c28ab88c4ebd62c4776" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_connector.py", + "sha256": "5991f9ff8832df32bd421eb67e48237270ea0a408180e523810bb43606acf8f3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/__init__.py", + "sha256": "c53be9796e76cde637514bfc40a525d8c09bb2784b406cb516790d8285dfe433" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/multi_process_adapter.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/multi_process_adapter.py", + "sha256": "6480d67b31ed603027a83edf327880a38aee45eaeee2da9a4efa93e95527c166" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/utils.py", + "sha256": "e204fa6a853ac9c122d7a4e9d146902230f81c48d4321ed5edfdbf979dd49ba2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/vllm_v1_adapter.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/vllm_v1_adapter.py", + "sha256": "e6fe55049c6b007248516d69640e2f3a4809f9d286091a1014ae0949987fa8f1" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py", + "sha256": "c712c386a7c57bf0355a1441ba574232c3aa5498fcb70713a2b3f5d18b64f9c1" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/metrics.py", + "sha256": "de1b1797d0448f74370919dbb0278767f390e8f59e00a0c0528abefb302babc2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_connector.py", + "sha256": "516be01320e64b0110e102eeb69a6ba766dd5ac8cb3036db6b97b7d54413323d" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_utils.py", + "sha256": "26877610463fa8e9d6b092772f2551bcc0c3ac794cbe63996df0414666a8ebba" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/rdma_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/rdma_utils.py", + "sha256": "716e5042edecaba36c7ca763474988f32fa09c2668b8260260149df610af8f83" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/stats.py", + "sha256": "f39b2f0b1db2e4f922e27e684a3f7bbf5bb279b82a0a8c3bb0c7ae69b6d14d24" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/connector.py", + "sha256": "17a350bdb89e17e415d6c52a48684dc15c35a804378daf03e1f3bee1b1b123a3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/coordinator.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/coordinator.py", + "sha256": "a8eb6c2157a96e8d25233b82347ac8409a41d6390b4f2c64242119c05911010c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/data.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/data.py", + "sha256": "d3cfefdb4165a24995749cba452641b318065baa95bb1bae62f922a2f8886e7b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/metrics.py", + "sha256": "f2b9ef8927632d142aad11a374d0725c6e619ea0bb7fea9eda3f3895eb7d277a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/protocol.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/protocol.py", + "sha256": "ccb1cf6a84a932a375215627d2aaac482c351a05df015d636d05373a6845b7c8" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/scheduler.py", + "sha256": "283849ff581ec206444cdf5621622377f1c925e8d7e05cb9294af2f3a5094e79" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/worker.py", + "sha256": "55f1682dfd1ed7af689166421337126a0e1d08afa4774a242e098d79e0c1e95b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_common.py", + "sha256": "549bb4fe22dca5095515b9c0712c31cc81a9d4923881e9f112317640fd8c04ab" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_connector.py", + "sha256": "c0f474bc34b579d889fae92eaf43eaca241be51a4697a187a942f0df4e6b6a98" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_engine.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_engine.py", + "sha256": "d842f3772fc6588d5a329a67572324cb74709aa3df4033e64c791a1e706c8e88" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_layout.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_layout.py", + "sha256": "2b4ec046a78897236b0626939bb828b6ec095355097d10bca39e5f3e1c992553" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/multi_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/multi_connector.py", + "sha256": "12d8387239f3194f2cb63ccbd64824648047210323572d66671e6a1eed349fc3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/__init__.py", + "sha256": "cc3145fe3b6d219a267bf40a0f7c0cc9430e4289f94acab2df761b99b671e7ba" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py", + "sha256": "7a1db8c54e4cd846bdac747344f2aea2c2fcf507817928796063225223b7e169" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_worker.py", + "sha256": "49a2e4faf99bef146b5a1d4d18d48f240b1e561c438252274494b359db96ef52" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/connector.py", + "sha256": "b6a0dc916d052f344be72ecfcb111509c13580102c11a860fa726cf0888949a9" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/metadata.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/metadata.py", + "sha256": "2b23a07c1ec5ac5490c3b818737c7192e344ea9f52cd5623f75939f741ab4e21" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_scheduler.py", + "sha256": "ac3daf8e2246581fec84ab28f2133569421b62c32a120be4923e2f4d0f2f9de9" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_worker.py", + "sha256": "e5060c9b6cf022de35ca3d1da7a369cd6a6a2dea26219af9f7633aaf78af8a76" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_scheduler.py", + "sha256": "2d9008e33937a4d6c5cf9cc2f96160f2bdbc8e987fe37f0798a7fd7eb84c9572" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_worker.py", + "sha256": "87de3ea383dd3aa95fb2c287ea26ded8a330859cc1295f9faa69047e80865c2c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/scheduler.py", + "sha256": "09f1bfe7075b926b26a94529480e33b62c3ac273ff826f6c502084f08b1b2a08" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/stats.py", + "sha256": "3e710654e0b68d1a8592f0c4735c81b22f4bf698fb1a2dfea126d35bf2dd1ef2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/tp_mapping.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/tp_mapping.py", + "sha256": "2d43607f98701b2fad6cc0ac2767619a80b7fc2b3a3c2eb6ed0da4fb05dcd8f6" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/utils.py", + "sha256": "93de863fc8307a61d40b62f1b176b57ae93c363d34b9e9ddc8e666265b6d45dc" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/worker.py", + "sha256": "5134a36ac100ce7a64f5311029a37ac12c38d91093f63100f51f7fe53ea7c3ee" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/canonical_mapping.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/canonical_mapping.py", + "sha256": "e0b3c6f9806a650e0370c43c5068fc31c0fec94615089e15fdf270d7d96f2b64" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/common.py", + "sha256": "9b3f042c6fa1581d10e8f688d2d9bc927bb41b780a9ea01f514d57228e20c978" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/config.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/config.py", + "sha256": "aea82e60889e78dcad8564ec8285b65a6a372824a1545a98ea8e78b6f4fd418a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/events.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/events.py", + "sha256": "d7039b67be95fd444966628184040a94880873c0611c0e6e7525a22650ffdefb" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/metrics.py", + "sha256": "13d76df014e86691f58dc89a879f9808b124690c9267dd5fa3b2d4004d4c5fdf" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py", + "sha256": "2c5282f4a3165cd787fb355e215e3869f1bdd3f2c795b2155fc537c9d135191a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/worker.py", + "sha256": "acc2df53262441dfc6421a3af7f0cbd68cbfaedbd42bbc384d8e1da2d965d194" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading_connector.py", + "sha256": "cdc16ca7339a10e1993bd6220e6273f86a4e99779f58f25098a24ad31bb0dbd8" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/simple_cpu_offload_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/simple_cpu_offload_connector.py", + "sha256": "96238ca82ccf07a1eeb59b8f66de17b09034e3eb993ad9a0a836511d3f69706b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/ssm_conv_transfer_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/ssm_conv_transfer_utils.py", + "sha256": "59a949709482e65a007fbe5352fe9b4bb54c2dcc10ad2c1c41f754b6e13299f4" + }, + "vllm/distributed/kv_transfer/kv_transfer_state.py": { + "path": "/vllm/distributed/kv_transfer/kv_transfer_state.py", + "sha256": "2e5fe09438d6e2ee642f8a26cf7dcf632e870d955d30baf002b76a8bfe836d05" + }, + "vllm/distributed/nixl_utils.py": { + "path": "/vllm/distributed/nixl_utils.py", + "sha256": "0bffa3c052c9f67472b1c0bc3816114891b010c968bf4b8a292e7da4d687db53" + }, + "vllm/distributed/parallel_state.py": { + "path": "/vllm/distributed/parallel_state.py", + "sha256": "d9b10ad56833ebc08a753e1a050ef0989c30d4134021b7b7b00150b7bd01adc6" + }, + "vllm/distributed/stateless_coordinator.py": { + "path": "/vllm/distributed/stateless_coordinator.py", + "sha256": "f52848fbe985ed47b1f3e3ca555314736ca06436e8d738ab4390101f0672dcb0" + }, + "vllm/distributed/utils.py": { + "path": "/vllm/distributed/utils.py", + "sha256": "792146b357139e705064a68d3b66858de8a0baaca4dc7db1232fa217d45db231" + }, + "vllm/distributed/weight_transfer/__init__.py": { + "path": "/vllm/distributed/weight_transfer/__init__.py", + "sha256": "3fb9d4712b7c131d522f5e76e73cd8c333f3cc7af86e2d5ecf9b61b57b3b7f5a" + }, + "vllm/distributed/weight_transfer/base.py": { + "path": "/vllm/distributed/weight_transfer/base.py", + "sha256": "8ab06feb04f1379d0558fbdb77fde46bc84f179e0a26742cabab937e88caa38d" + }, + "vllm/distributed/weight_transfer/clients.py": { + "path": "/vllm/distributed/weight_transfer/clients.py", + "sha256": "ff85c79c350241e6d2749ca23c9d295a3289b4b62bfdf0257d32eb94a0151d36" + }, + "vllm/distributed/weight_transfer/factory.py": { + "path": "/vllm/distributed/weight_transfer/factory.py", + "sha256": "4e979eeac8c5bcdbffb10eb4765cfb30120fa7595c6c2561d3fa1a966ced61c8" + }, + "vllm/distributed/weight_transfer/ipc_engine.py": { + "path": "/vllm/distributed/weight_transfer/ipc_engine.py", + "sha256": "1af578293f387a19073c322b24143c3ae4716ce0c5d2bac2a4ef26fe20119330" + }, + "vllm/distributed/weight_transfer/nccl_common.py": { + "path": "/vllm/distributed/weight_transfer/nccl_common.py", + "sha256": "7b2ef7dc7481c3f478f17c49aa36c7bed54142ec5c93d36ed8426c8fdf09e500" + }, + "vllm/distributed/weight_transfer/nccl_engine.py": { + "path": "/vllm/distributed/weight_transfer/nccl_engine.py", + "sha256": "7fd020c919dc7b4723fb78e64da977b180d0fef0cd21df955a037b848dbaa008" + }, + "vllm/distributed/weight_transfer/packed_tensor.py": { + "path": "/vllm/distributed/weight_transfer/packed_tensor.py", + "sha256": "d0a27fb0be1dc029bd5a1d44fdb57a5e54aa4cd74308bedc339e86ac02c7494c" + }, + "vllm/distributed/weight_transfer/sharded_rdt_common.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_common.py", + "sha256": "be0b13801f24e7b62999b19d733c030510353603a2d5320d5dc98ee02daf22a2" + }, + "vllm/distributed/weight_transfer/sharded_rdt_engine.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_engine.py", + "sha256": "2f791970b4815511a7578ef6c957e7da97b071d26a39087a09a17475909791ee" + }, + "vllm/distributed/weight_transfer/sharded_rdt_fake.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_fake.py", + "sha256": "ee11164e17b5f2793252ce77741b8b94e0583046abf896a590131b2008d1fbb9" + }, + "vllm/distributed/weight_transfer/sharded_rdt_trainer.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_trainer.py", + "sha256": "dd413ff461d41826ccd3eb87d3df22f6cd7f24e09aac7644e3e5b40d7beec484" + }, + "vllm/distributed/weight_transfer/sparse_nccl_engine.py": { + "path": "/vllm/distributed/weight_transfer/sparse_nccl_engine.py", + "sha256": "e11b409454dda2b05ea34e8115ac19027c5e65cb2a5e9682c494f16a50e978f4" + }, + "vllm/model_executor/determinism/__init__.py": { + "path": "/vllm/model_executor/determinism/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/determinism/batch_invariant.py": { + "path": "/vllm/model_executor/determinism/batch_invariant.py", + "sha256": "af8f8d256a48fc214edf426fbe891fb15bd8b1d7ae98b811c736ff1eb0fae798" + }, + "vllm/model_executor/determinism/batch_invariant_configs.py": { + "path": "/vllm/model_executor/determinism/batch_invariant_configs.py", + "sha256": "72ea0d4df0ab5ae288abb7df5c203d2ad5f1709c7295d87ec72da775fddc1b7a" + }, + "vllm/model_executor/layers/fused_moe/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/__init__.py", + "sha256": "64a32665be6d5afcfbaf7a0915717267278b66b880b908b0263ea58f08e51b5e" + }, + "vllm/model_executor/layers/fused_moe/activation.py": { + "path": "/vllm/model_executor/layers/fused_moe/activation.py", + "sha256": "78dec0e85e0c040304515f64ccf8f2c6a7a2e5b9f1124a2138a97d9a02585541" + }, + "vllm/model_executor/layers/fused_moe/all2all_utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/all2all_utils.py", + "sha256": "dc4750a446f7de31d09a46034da5fdf479bc169af90f47aa9af8ae15e67b0828" + }, + "vllm/model_executor/layers/fused_moe/b12x.py": { + "path": "/vllm/model_executor/layers/fused_moe/b12x.py", + "sha256": "ee76cc6aa801e24be8ec78a9e8502061ad48667d5ff8711e43f68fba912425bd" + }, + "vllm/model_executor/layers/fused_moe/config.py": { + "path": "/vllm/model_executor/layers/fused_moe/config.py", + "sha256": "a3a87cebcc7ac85d73f471dcfafc2d899c6fc08f264777b74a0e919adac9e03f" + }, + "vllm/model_executor/layers/fused_moe/deep_gemm_utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/deep_gemm_utils.py", + "sha256": "8fdcd857eb333f9c68902105f157568d52067c94ba1e2df6dbfe0474ef1f4c02" + }, + "vllm/model_executor/layers/fused_moe/eep_reconfigure.py": { + "path": "/vllm/model_executor/layers/fused_moe/eep_reconfigure.py", + "sha256": "9d7580265e8563e1140c2bb4c3a81a35ddd54903f5ec0a2720ffc064681f02f9" + }, + "vllm/model_executor/layers/fused_moe/expert_map_manager.py": { + "path": "/vllm/model_executor/layers/fused_moe/expert_map_manager.py", + "sha256": "308c00f63fcb6f44518ec3a56d8f902c7bba75928c2e3aea30fbe1f3f473973b" + }, + "vllm/model_executor/layers/fused_moe/experts/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a16_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a16_moe.py", + "sha256": "53deea255175171971422d14082ad139b5ec7b62e21429a4c7cc0ebbefd29cdc" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a8_moe.py", + "sha256": "f3fc51b95ed89862381908a0134e326228827f44854248db9585a9c4899c34f4" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp8_moe.py", + "sha256": "af6db1760961a5a71234f8b1cdf42e9e30a236e13601b0826a75110b79724948" + }, + "vllm/model_executor/layers/fused_moe/experts/batched_deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/batched_deep_gemm_moe.py", + "sha256": "b0cd4ea706583518dc608fb56f832fc3595f24bd863b03ef1e8c22b36b873508" + }, + "vllm/model_executor/layers/fused_moe/experts/cpu_int4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cpu_int4_moe.py", + "sha256": "67170af3ba9dc4c4f71d78a72efc3fa4e366eac614936a79911dae5c75ac1864" + }, + "vllm/model_executor/layers/fused_moe/experts/cpu_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cpu_moe.py", + "sha256": "0754cd4ff1b28e6d3932a67609d335acefd28f95a841f0492923813356a6d81e" + }, + "vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py", + "sha256": "db901bdbcd3fdac23a1d74e39c51e67f14a82be787b2fd704ed1e787372ae868" + }, + "vllm/model_executor/layers/fused_moe/experts/deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/deep_gemm_moe.py", + "sha256": "16911a64a72eafc26a1bcb544a91f90144d85dc41e3ee57cf20e89925227bbb7" + }, + "vllm/model_executor/layers/fused_moe/experts/fallback.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fallback.py", + "sha256": "1bdd0a4f2ebaa40ec96a5aacc07aee61511af59e6324ce456aa65003b6e2991a" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_b12x_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_b12x_moe.py", + "sha256": "e613afe5da2742e42c717c1a0a56bd9e1c7e3e0452a828db0013d81063518954" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_batched_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_batched_moe.py", + "sha256": "295254dfeeec8df3eb8110e6f659a946cb9cded3de1565ecad4d741b3c3f3e00" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_moe.py", + "sha256": "08578bcd0cf72d6a470e40950175e73639efaa6d8d23c6da0869345312b229c9" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutlass_moe.py", + "sha256": "52887cec5fe628e0a4e7793deb546b40f6c29f7362b3b436c10ca36934ab9826" + }, + "vllm/model_executor/layers/fused_moe/experts/fused_batched_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fused_batched_moe.py", + "sha256": "2435587fc7f8fe8ea341ea0eb8f14c11f3f5b31fbbb9b29ce569ad3bace6e6a0" + }, + "vllm/model_executor/layers/fused_moe/experts/fused_humming_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fused_humming_moe.py", + "sha256": "a6830a76ff7f4cd3479b9c8372a30d03e8301604555cbdbcd9ac89a813b7431a" + }, + "vllm/model_executor/layers/fused_moe/experts/gpt_oss_triton_kernels_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/gpt_oss_triton_kernels_moe.py", + "sha256": "1613a7a6b256e8faee6fdcfae84f293492db6229d28ceb3e8a8d6093af480e36" + }, + "vllm/model_executor/layers/fused_moe/experts/int4_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/int4_emulation_moe.py", + "sha256": "f12857caf0671a341687ad3c5f48616b816ed51e1bcbdefa0a7edbecdb81a79d" + }, + "vllm/model_executor/layers/fused_moe/experts/lora_context.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/lora_context.py", + "sha256": "9b41eefaaa57c5dd0dc54217ef95978821b0c52e90ea4db8b0752e08452bd3e5" + }, + "vllm/model_executor/layers/fused_moe/experts/lora_experts_mixin.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/lora_experts_mixin.py", + "sha256": "b2bc55ed6be98b526c6a5698e2d98300650e78555f56b1820e58c04888e2a373" + }, + "vllm/model_executor/layers/fused_moe/experts/marlin_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/marlin_moe.py", + "sha256": "93916b721548e6194dc70cf6cec224b4b1456a0cc0980235e97beba7bf36541d" + }, + "vllm/model_executor/layers/fused_moe/experts/mxfp8_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/mxfp8_emulation_moe.py", + "sha256": "d09c62ad1398c51ff6f515f2a61014ee9e9a9798d0fe9762c47f446efc5edbef" + }, + "vllm/model_executor/layers/fused_moe/experts/mxfp8_native_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/mxfp8_native_moe.py", + "sha256": "01a42cebf18189e566034111b2145573c655319e8af1a56db60d53a319c40613" + }, + "vllm/model_executor/layers/fused_moe/experts/nvfp4_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/nvfp4_emulation_moe.py", + "sha256": "f24467762b60702f0df122ed64786be839a838a9b6cafaecbd04d35fbfedb189" + }, + "vllm/model_executor/layers/fused_moe/experts/ocp_mx_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/ocp_mx_emulation_moe.py", + "sha256": "dcaa60a9ebdb0bd8223b37af41f018ce7f95716ec7cd8526850f4433a579213b" + }, + "vllm/model_executor/layers/fused_moe/experts/rdna3_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/rdna3_moe.py", + "sha256": "e4abd802dc2f0ad9b338ebde397633c761d881c37813e2dc229902c526b597d8" + }, + "vllm/model_executor/layers/fused_moe/experts/rocm_aiter_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/rocm_aiter_moe.py", + "sha256": "bf09a7b783f5752d61cab76221b32b598d8846d801ee39dc9209d636c9659c6f" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_cutlass_moe.py", + "sha256": "ffce5ad627c540940d122d8df7981644b2eb35d07d480995c0f4f30517815fac" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_deep_gemm_moe.py", + "sha256": "c7209fa5e1ccb184a68b37a0706fc571a76696c2ae79802ddc7f889b1c29684d" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_moe.py", + "sha256": "806fbccfe30f5fbd578acf773add99bdf022b12d617958bd6281aef6de369701" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_bf16_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_bf16_moe.py", + "sha256": "76256de96fefece9c41ffb1108487919e24da364cf4412c6c3474498aba59137" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.py", + "sha256": "b54c7ceb45e5d07aa905f42ea44caccf85ca35ba9fb825d4c01947764510f68b" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_lora_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_lora_moe.py", + "sha256": "dd35a9e4242c0dc8d691168813e14bd5543e591f02ee529d0691e07651942c5a" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_mxfp4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_mxfp4_moe.py", + "sha256": "fe780f125a3dc3ba919659e9b85340bd32afcbfe47733a002bfdfb92eadf400c" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_mxint4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_mxint4_moe.py", + "sha256": "2106d67c2951aa690c4656ca58240d09c366cffe8cb4d9fd575df016c377cc30" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_nvfp4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_nvfp4_moe.py", + "sha256": "e938ac9f058f7c90b41c9610513239bec54a95304bfb5ff5f6897ebd54733d7e" + }, + "vllm/model_executor/layers/fused_moe/experts/xpu_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/xpu_moe.py", + "sha256": "2a11bac0cf9274d963315efd6eebdc62978b0b7aa02e8849ff2a562742f0b86d" + }, + "vllm/model_executor/layers/fused_moe/fused_flydsl_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_flydsl_moe.py", + "sha256": "0e74879ee5c72f616ae4064b9dff3b3a0b583b7fc70b8f92f1e8b730ecd5d39b" + }, + "vllm/model_executor/layers/fused_moe/fused_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe.py", + "sha256": "7072eb06237be9d33dcb0ef7101410f886a6363c98cbee70a014c68b70f639cb" + }, + "vllm/model_executor/layers/fused_moe/fused_moe_method_base.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe_method_base.py", + "sha256": "18dcfc469d3252749801bbf943857f58da85de1f2db8fdff5a9f4986a925dc68" + }, + "vllm/model_executor/layers/fused_moe/fused_moe_modular_method.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe_modular_method.py", + "sha256": "321c744eac1fcaffd6b1b2971204c8baa57dfec53e91e5d24140014d72d64f83" + }, + "vllm/model_executor/layers/fused_moe/hpc_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/hpc_moe.py", + "sha256": "2ca9c5d71b6fd91651027905e2b83103a8823845e053e7153e148cb8e0ee666d" + }, + "vllm/model_executor/layers/fused_moe/layer.py": { + "path": "/vllm/model_executor/layers/fused_moe/layer.py", + "sha256": "def0b4e13bcc1e4e21ee10644e647e2eda1acbf0cc01e76d6128abb59ea08224" + }, + "vllm/model_executor/layers/fused_moe/modular_kernel.py": { + "path": "/vllm/model_executor/layers/fused_moe/modular_kernel.py", + "sha256": "8dc4e0dbbf35b3aac8add63ca6f2a7bbfdadaabbd60826e24598b22c7d8e5c22" + }, + "vllm/model_executor/layers/fused_moe/moe_align_block_size.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_align_block_size.py", + "sha256": "c3f7fc2087836f0160a32ab99ceb1d8f6e87c793679da34dd672e225cb7fa31b" + }, + "vllm/model_executor/layers/fused_moe/moe_fused_mul_sum.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_fused_mul_sum.py", + "sha256": "112e72578002c3bff538418dac64b3b56d995994a2fc5e32b18d2cf3b8392a13" + }, + "vllm/model_executor/layers/fused_moe/moe_output.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_output.py", + "sha256": "6ea4cbd78f9efc7f842c5df246f553f08b991c3479b8b04b89902ed08aaf8e8f" + }, + "vllm/model_executor/layers/fused_moe/moe_permute_unpermute.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_permute_unpermute.py", + "sha256": "1adc592c6254d0c877d66be5406afbc822459c18a838f4bbd094a992e7609d06" + }, + "vllm/model_executor/layers/fused_moe/oracle/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/__init__.py", + "sha256": "4dcf941d50d48bb812de0f39e9194bf17a76b8035fe324889c6038f710fdc453" + }, + "vllm/model_executor/layers/fused_moe/oracle/base.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/base.py", + "sha256": "555bbcd18a3744e64eee4e953daabef3bd268a1bd4faf967d4cfd14d6074f685" + }, + "vllm/model_executor/layers/fused_moe/oracle/fp8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/fp8.py", + "sha256": "245bd36c285df1e6f7c51e52dcda31ad247894577a9f8d765613c2c2feae9aee" + }, + "vllm/model_executor/layers/fused_moe/oracle/int8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/int8.py", + "sha256": "c1b67886511bd966b162db5bca8930f04895fb37a969818a4a10f0726c59547f" + }, + "vllm/model_executor/layers/fused_moe/oracle/int_wna16.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/int_wna16.py", + "sha256": "cfffe8b8b290330be9d18ffa07aeecf296484395ff04df3147d99393e48b55c1" + }, + "vllm/model_executor/layers/fused_moe/oracle/mxfp4.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/mxfp4.py", + "sha256": "b7915e6779b5c88e7dcd2d227f003a8e45071d6d86877013067142d4feb64a8c" + }, + "vllm/model_executor/layers/fused_moe/oracle/mxfp8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/mxfp8.py", + "sha256": "9cfdc8102a04bb844dcd7ed88043bba96ec751794bc093da76c69aa8cf88cf48" + }, + "vllm/model_executor/layers/fused_moe/oracle/nvfp4.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/nvfp4.py", + "sha256": "735b4cdeb1258f11fb02320fc0c70cab5edaca468dd60b07b2d369389d2b0313" + }, + "vllm/model_executor/layers/fused_moe/oracle/unquantized.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/unquantized.py", + "sha256": "c8b8203bd0b73bb7f586f703607394d663f14c05711416ad42d45af564382223" + }, + "vllm/model_executor/layers/fused_moe/oracle/w4a8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/w4a8.py", + "sha256": "d7fa6e2982f20b34d5ce9c5ce28a61122762a3fcdd53d249479472a4f2316c6a" + }, + "vllm/model_executor/layers/fused_moe/oracle/w4a8_int8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/w4a8_int8.py", + "sha256": "6d6f9ca2e67b630002873de2f8d8a231d091c5c2f0f3354a9e8209449b481a4c" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/__init__.py", + "sha256": "2800113263a83c2632e522fb22790b29f63384da75d43de32f0ae2f95e8ae4c1" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/batched.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/batched.py", + "sha256": "d52425dd8c08e47cf8d9c3088daf3b1cc721c8667de4c738d04ba997f9a08ccb" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ht.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ht.py", + "sha256": "465cdf1d6cee91b2ee8c2e43abbea6e8408976e3048c10f44c089f34b415bc60" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ll.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ll.py", + "sha256": "f704922b1db680c4c212982a096e09d6b3eb97d89110313f86ed958a00df21b7" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_v2.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_v2.py", + "sha256": "8d690b016bbcfbc9eb599bcc36a6f798b2f1720c828f4347ea742e218c0cc60d" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_one_sided.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_one_sided.py", + "sha256": "acb57d8342af62bb5672036871cd4b27ecc7f37dfa7c894850bb860e6152a1f0" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_two_sided.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_two_sided.py", + "sha256": "cc5b00d6a157b6eca5afaaf7435165dbd1b4524d6d88bf75808cbe074a389f79" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/mori.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/mori.py", + "sha256": "8e9c3b5b1f0de13f467d95bf2f451cba0e4b0d9a1bdcf98da0988a3a9a79a045" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/naive_dp_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/naive_dp_ep.py", + "sha256": "db015e5b18750bbbf5b2bbaceca877dd6f3f3e74c2a94e8dc185f7413b387f91" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/nixl_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/nixl_ep.py", + "sha256": "1f71d70ac509bf5d3d67a8d95a8ee108a50af6bb5d4bde7181ca28e286f6ffce" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/no_dp_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/no_dp_ep.py", + "sha256": "adbbf529cd22059c95b5380952943a70cf11e05e321dcd707f296bebde61a6e7" + }, + "vllm/model_executor/layers/fused_moe/routed_experts.py": { + "path": "/vllm/model_executor/layers/fused_moe/routed_experts.py", + "sha256": "68c48e5df0ea4a7cc1f04436b7b9153eb53802ecd9bb55d38db8738508daac6d" + }, + "vllm/model_executor/layers/fused_moe/routed_experts_capturer.py": { + "path": "/vllm/model_executor/layers/fused_moe/routed_experts_capturer.py", + "sha256": "cd006bc1a1703418cca3b589fafb2abc4268a086fb3db044bbb64348aeac8b13" + }, + "vllm/model_executor/layers/fused_moe/router/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/layers/fused_moe/router/aiter_shared_routed_fused_moe_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/aiter_shared_routed_fused_moe_router.py", + "sha256": "f47046db1275601a2c67c9232afc7b866c9623a19639d5be867e4c7914a35069" + }, + "vllm/model_executor/layers/fused_moe/router/base_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/base_router.py", + "sha256": "47fa2324bcd9b6ebdc138d69ae6b6ecc0f2463d34bda8c5988bdb0a2a76d3fae" + }, + "vllm/model_executor/layers/fused_moe/router/bf16x3_router_gemm_cutedsl.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/bf16x3_router_gemm_cutedsl.py", + "sha256": "d0f1edd1ebc48d88e490bdb3c93db49bdc0a135ff83e7e0b57130e9f8255fc32" + }, + "vllm/model_executor/layers/fused_moe/router/cpu_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/cpu_router.py", + "sha256": "bff36b15818c87bfbb7ee3def7dc7f6396860abbe5893ff6148801fe941a4b92" + }, + "vllm/model_executor/layers/fused_moe/router/custom_routing_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/custom_routing_router.py", + "sha256": "1a40c7054e3c3a1b3ee2e98f6bc9efa9dfdc11f316a8edf7357dd91533487bfe" + }, + "vllm/model_executor/layers/fused_moe/router/dsv4_topk.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/dsv4_topk.py", + "sha256": "14f7c8487b9aef652dd61c91e0e3c3640b643bf9cd0d8a7184157d71f4beb63e" + }, + "vllm/model_executor/layers/fused_moe/router/fused_moe_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_moe_router.py", + "sha256": "0daa0dc05b931d66767feca444a4cd57ecf140f59b40ea0e8ad213eef6da2b36" + }, + "vllm/model_executor/layers/fused_moe/router/fused_topk_bias_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_topk_bias_router.py", + "sha256": "8fdc28cc248180ad4f11bb4bcda3df47926ec12665a0d84bb712fe83fc6b9376" + }, + "vllm/model_executor/layers/fused_moe/router/fused_topk_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_topk_router.py", + "sha256": "1c80f4af4d781fd66b12aa6a7a0fd30082bc521df40f1252987a8ac4c0bef51c" + }, + "vllm/model_executor/layers/fused_moe/router/gate_linear.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/gate_linear.py", + "sha256": "faa43362c2e7c568498a923c682ca18cae75e87f48d00882770821cb19c21198" + }, + "vllm/model_executor/layers/fused_moe/router/grouped_topk_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/grouped_topk_router.py", + "sha256": "048339e1799cdd42c9dae686a6cb891046577fb391b500f0d12eed73c8f61e52" + }, + "vllm/model_executor/layers/fused_moe/router/rocm_fp32_router_gemm.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/rocm_fp32_router_gemm.py", + "sha256": "9c331ef3d0bb2fb6954387d77ac62a99c5c76d2753c7438bfbb5115f68aae5ac" + }, + "vllm/model_executor/layers/fused_moe/router/router_factory.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/router_factory.py", + "sha256": "019bc8adaa7642abab82843efd53cd1a378f62c652521a1de2b781480eb88742" + }, + "vllm/model_executor/layers/fused_moe/router/routing_simulator_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/routing_simulator_router.py", + "sha256": "a7345df5add00cf3bd93024492d6fc1189fd3ecf2754a11cef1b03a295d791f7" + }, + "vllm/model_executor/layers/fused_moe/router/zero_expert_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/zero_expert_router.py", + "sha256": "dea306edd92e2b9c1b43f982ede8e1e10770d2c66220f5a106e0ed0165276e9c" + }, + "vllm/model_executor/layers/fused_moe/runner/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/layers/fused_moe/runner/moe_runner.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/moe_runner.py", + "sha256": "05893188402fe37229bf72d75088d66193c417d5d502daafd3a55e1bfedaa60c" + }, + "vllm/model_executor/layers/fused_moe/runner/moe_runner_interface.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/moe_runner_interface.py", + "sha256": "189cad01611124eb44594713cbf5918d16fc70196dc81a525ae0a7a97a5fcc51" + }, + "vllm/model_executor/layers/fused_moe/runner/shared_experts.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/shared_experts.py", + "sha256": "d89e4c79c46f6fe61262c51f3facf102e71ce1e4eb3db67f72b6bd8470937be9" + }, + "vllm/model_executor/layers/fused_moe/topk_weight_and_reduce.py": { + "path": "/vllm/model_executor/layers/fused_moe/topk_weight_and_reduce.py", + "sha256": "3dfede72d52bf99af40997994704e6c502ee3bab2bd39bfaa8a68d7dae440203" + }, + "vllm/model_executor/layers/fused_moe/unquantized_fused_moe_method.py": { + "path": "/vllm/model_executor/layers/fused_moe/unquantized_fused_moe_method.py", + "sha256": "182a5ec1874ece2091a24c5303f6ab9ea64a9a61adf325b863927f0cdd83e5d3" + }, + "vllm/model_executor/layers/fused_moe/utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/utils.py", + "sha256": "a93a0bded4008db19d8b38370526ae34fafb9c8278e5b4f60acb6acc8fdc1850" + }, + "vllm/model_executor/layers/mamba/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/abstract.py": { + "path": "/vllm/model_executor/layers/mamba/abstract.py", + "sha256": "dfdc8c836894f574e41d93d76ab989cacd3d7ecf59c97a929abfa48d9364e8ad" + }, + "vllm/model_executor/layers/mamba/gdn/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/gdn/base.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/base.py", + "sha256": "7fec748fc74131f5a45bcaf2644b3fa3a0598fd437d7347f8207ea3644a951c5" + }, + "vllm/model_executor/layers/mamba/gdn/kimi_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/kimi_gdn_linear_attn.py", + "sha256": "1cec4da5c9da73557e192bfb36cd540aae51d3e91283b554449c4a97f0f89bd9" + }, + "vllm/model_executor/layers/mamba/gdn/olmo_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/olmo_gdn_linear_attn.py", + "sha256": "60873ca3bb0c4d17c33bd259b62b658db4883cd23138f47dd4ead62cd2ff0605" + }, + "vllm/model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py", + "sha256": "b80f8e6f3fff442fb880aebb3209c52f814f66490009f4ac4003de603576d10a" + }, + "vllm/model_executor/layers/mamba/linear/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/linear/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/linear/bailing_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/linear/bailing_linear_attn.py", + "sha256": "3c480ddd6eba0766ed012a1074bbec5f241d868a87b020b0f6312222c32f93eb" + }, + "vllm/model_executor/layers/mamba/linear/base.py": { + "path": "/vllm/model_executor/layers/mamba/linear/base.py", + "sha256": "26125cd427225954e1846ca361cdaf43f2b56f11b1e217cf26e91a80ef0edb6a" + }, + "vllm/model_executor/layers/mamba/linear/minimax_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/linear/minimax_linear_attn.py", + "sha256": "4adc00f54893b5bc6c31c613deda152a19af3b1bba04153ab5924c3bf2a3aaae" + }, + "vllm/model_executor/layers/mamba/mamba_mixer.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_mixer.py", + "sha256": "a485e937ad9db14d3ad03fde5a9fe795cfa863649563e52fc7e6c52ef631164e" + }, + "vllm/model_executor/layers/mamba/mamba_mixer2.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_mixer2.py", + "sha256": "d58d93e90d9eb90bc5133b79f07c7c62d0032b35d6cf916e3fe34367b81c5cd5" + }, + "vllm/model_executor/layers/mamba/mamba_utils.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_utils.py", + "sha256": "ce9845b4a4ef4bc46577a33038ed69d59ceccb52f30e9c5bdaa36e48be3b2ca4" + }, + "vllm/model_executor/layers/mamba/ops/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/ops/causal_conv1d.py": { + "path": "/vllm/model_executor/layers/mamba/ops/causal_conv1d.py", + "sha256": "044d005cfe59fd0818ed421274e04f3e8dd679b8cdb64fca9f4422f2643484b2" + }, + "vllm/model_executor/layers/mamba/ops/cpu/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/ops/cpu/causal_conv1d.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/causal_conv1d.py", + "sha256": "64104672890ac2ef240c20c7f8059beeade707178574809dbca8721dff5ea6fa" + }, + "vllm/model_executor/layers/mamba/ops/cpu/gdn_attention.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/gdn_attention.py", + "sha256": "a50288945bf5b102ad3025ae536638dcc32d84cf7c22aaf3a85326b0c1c56c1f" + }, + "vllm/model_executor/layers/mamba/ops/cpu/mamba_ssm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/mamba_ssm.py", + "sha256": "5839e576172a3246337f5e4fb1bc19eb583b3e2b2f7e35dd060dc3041eb8372d" + }, + "vllm/model_executor/layers/mamba/ops/gather_initial_states.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gather_initial_states.py", + "sha256": "5198bb6de6d91c583a5f65d926412a76ee04a06fa72aaba76eaf156b27cd0523" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/__init__.py", + "sha256": "b88b52e71fcb21bd3fa215ea171dcd2ad2ff17c97788cfe64caa7ba45c7ecf97" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_h.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_h.py", + "sha256": "f50bbe5c0b6382323ec5dfc24a5e0c7971113d59727515e60c9fe3689734e5ba" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_kkt_inv_uw.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_kkt_inv_uw.py", + "sha256": "b4a65dd194907db08865e0596fe254f915e670a9e6b27ffa2933c1026dde9b1e" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_o.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_o.py", + "sha256": "629f7843a7e611efb9390f2ebb7a4b924b2c328d48a317fddfaa96af4d9bc60a" + }, + "vllm/model_executor/layers/mamba/ops/layernorm_gated.py": { + "path": "/vllm/model_executor/layers/mamba/ops/layernorm_gated.py", + "sha256": "3433f2e3b87c2b2ccf8e9794ce40762c86a6da38a94ecee001f439ea0d0373dd" + }, + "vllm/model_executor/layers/mamba/ops/mamba_ssm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/mamba_ssm.py", + "sha256": "a4515ec7895b40ed878cf380445034b25faa61fbaa799d96c49217bbdfd7e400" + }, + "vllm/model_executor/layers/mamba/ops/replayssm_config.py": { + "path": "/vllm/model_executor/layers/mamba/ops/replayssm_config.py", + "sha256": "5fe9d5d7aa2de6a65875b3796a919b22bc435fd76055ba054bbff43aa005bc44" + }, + "vllm/model_executor/layers/mamba/ops/scatter_states.py": { + "path": "/vllm/model_executor/layers/mamba/ops/scatter_states.py", + "sha256": "f3bb004c73edaba56337747893eb07faf29b270dc8bb9c893ee9b1044e4ead9a" + }, + "vllm/model_executor/layers/mamba/ops/selective_state_update_replayssm_output_only.py": { + "path": "/vllm/model_executor/layers/mamba/ops/selective_state_update_replayssm_output_only.py", + "sha256": "cea7fd3063ca9dcc4e33f180d01ea379195ec515cedc9d0b03b11dc67670d695" + }, + "vllm/model_executor/layers/mamba/ops/ssd_bmm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_bmm.py", + "sha256": "26983d97a7f5c5f9197a16a6bee7b1294839b9ae31a14c14aaee38b43523e630" + }, + "vllm/model_executor/layers/mamba/ops/ssd_chunk_scan.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_chunk_scan.py", + "sha256": "d5ef32e8cb47e2ce71984579df78ab69754895f891766394daf327867cfa4f8f" + }, + "vllm/model_executor/layers/mamba/ops/ssd_chunk_state.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_chunk_state.py", + "sha256": "177e3aa7fe72647133bbd86135533e8688a5802678d4d1564aa549410362316f" + }, + "vllm/model_executor/layers/mamba/ops/ssd_combined.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_combined.py", + "sha256": "1317bbb668d3c60dfe0658850f9968614f03fa5eb61196f8ce6ac17dbb31b480" + }, + "vllm/model_executor/layers/mamba/ops/ssd_state_passing.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_state_passing.py", + "sha256": "36b8c8edba437916a5b789717c61fc22077de01e77892cb96dbff3b00a57410e" + }, + "vllm/model_executor/layers/mamba/ops/ssu_dispatch.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssu_dispatch.py", + "sha256": "bbe0f0e61da87f3ddfead19a79ca376516b63f1ea868be3485333c63fa20ef41" + }, + "vllm/model_executor/layers/mamba/ops/triton_helpers.py": { + "path": "/vllm/model_executor/layers/mamba/ops/triton_helpers.py", + "sha256": "a8795532f22c37a93e82c9d8e3fadcb5f4da98673d7b321fe8481305eaafad30" + }, + "vllm/model_executor/layers/mamba/short_conv.py": { + "path": "/vllm/model_executor/layers/mamba/short_conv.py", + "sha256": "228494efab185ee17374f762874f4c8b9a26aac9decfa8c906ce38446e0de51a" + }, + "vllm/model_executor/models/qwen3_next.py": { + "path": "/vllm/model_executor/models/qwen3_next.py", + "sha256": "4fa5112ac2bf7886d41d9e1f6c3da8793620d1ec49c961b31e9609459a6a7f7a" + }, + "vllm/third_party/flash_linear_attention/__init__.py": { + "path": "/vllm/third_party/flash_linear_attention/__init__.py", + "sha256": "5dbbfa3fc286edb2e970e175ef33cee4f6181c89b0784f5a8986201b2312f54e" + }, + "vllm/third_party/flash_linear_attention/ops/__init__.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/__init__.py", + "sha256": "dd738dc1d08045e76455cdbe16052a5b769e0eb11d6e87ff28353994f880cd6c" + }, + "vllm/third_party/flash_linear_attention/ops/chunk.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk.py", + "sha256": "c105ead259e86aedc248c53e7c4cef07034d0ff12da608d80265d1dd0990803f" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_delta_h.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_delta_h.py", + "sha256": "1b3ad391f939d9443c6b7adb19e57fe381bd5dccea064e8417a4f85b0e713b26" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_o.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_o.py", + "sha256": "3b63b836a8cc561723c23db5a528a0b474d9cd78508d610f0b348c585a889a19" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_scaled_dot_kkt.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_scaled_dot_kkt.py", + "sha256": "7ae41df3755acc7e925a134d848f78bb5fc00b90069039d86403c5853323ea42" + }, + "vllm/third_party/flash_linear_attention/ops/cumsum.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/cumsum.py", + "sha256": "d818215669b451868823202ac0bcea77e7a9d75957254c7c1060a73a55dc39b6" + }, + "vllm/third_party/flash_linear_attention/ops/fused_gdn_prefill_post_conv.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_gdn_prefill_post_conv.py", + "sha256": "590717b2107abc90d72548de06b5d315229eb2775c94614f3f545df11cc2b5df" + }, + "vllm/third_party/flash_linear_attention/ops/fused_norm_gate.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_norm_gate.py", + "sha256": "e6eb90467f29d8a0a04f2a364d20a2c3191b6ab857841bfb82076b33a6022d1a" + }, + "vllm/third_party/flash_linear_attention/ops/fused_recurrent.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_recurrent.py", + "sha256": "fe6f1311014809040497aa0a623e7fa97f4b3457cdc7ee1f1f8aed21f326f755" + }, + "vllm/third_party/flash_linear_attention/ops/fused_sigmoid_gating.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_sigmoid_gating.py", + "sha256": "000ab8996af9788fdb8843a6a3b91833e7a14c8acc0e1ea073a536330f64cb6f" + }, + "vllm/third_party/flash_linear_attention/ops/index.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/index.py", + "sha256": "a4f8b2c052635cb519a80099e8a85411d1d5d6880b38f466788259bbe66b154d" + }, + "vllm/third_party/flash_linear_attention/ops/kda.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/kda.py", + "sha256": "e1f31aaa89b91f8e5db6d070b229e2c81c7206e8caec67de41db97d06be0c476" + }, + "vllm/third_party/flash_linear_attention/ops/l2norm.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/l2norm.py", + "sha256": "520f4513ef4fc97e6b88dc07877cca8e29da0d34e44673fe989e3af002d86381" + }, + "vllm/third_party/flash_linear_attention/ops/layernorm_guard.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/layernorm_guard.py", + "sha256": "42af29be26e8fc94a4658e053c095fcdab9ffdc1bc2446a01e787deda2a298c0" + }, + "vllm/third_party/flash_linear_attention/ops/op.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/op.py", + "sha256": "456da84fd12411cf53c96a90dd4f78f49afb454c3d51d2c524ea8e7106fe8ae5" + }, + "vllm/third_party/flash_linear_attention/ops/solve_tril.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/solve_tril.py", + "sha256": "d1a4ff27623a938825052500afa7e2aa24fadd2fa4c9be6376c9128824f86f82" + }, + "vllm/third_party/flash_linear_attention/ops/utils.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/utils.py", + "sha256": "d6c90d36505e02086954c23ca4dd2fea82a69416d68ff1d0501e16b3148b5b0c" + }, + "vllm/third_party/flash_linear_attention/ops/wy_fast.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/wy_fast.py", + "sha256": "c9fc8259db0a8746dc04f1d799cb73333457118cf89a0bdce8dde8a80a28cd96" + }, + "vllm/v1/attention/__init__.py": { + "path": "/vllm/v1/attention/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backend.py": { + "path": "/vllm/v1/attention/backend.py", + "sha256": "01ac364372afa75fdb22486aa3a9c7cf9aebb742e3471dfb9e0f9d9d36b734bc" + }, + "vllm/v1/attention/backends/__init__.py": { + "path": "/vllm/v1/attention/backends/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backends/b12x.py": { + "path": "/vllm/v1/attention/backends/b12x.py", + "sha256": "443f0a98738fdfefe5b9ab151d278bfd43a8ac807eb2b0b9b2a13d51922afbf9" + }, + "vllm/v1/attention/backends/composite.py": { + "path": "/vllm/v1/attention/backends/composite.py", + "sha256": "4cf3d66dca891562709eed4f50aa14b0ae6c8240d9ea86504a3304b2f356cce0" + }, + "vllm/v1/attention/backends/cpu_attn.py": { + "path": "/vllm/v1/attention/backends/cpu_attn.py", + "sha256": "76fb02a6bd725125565d84bf04f627cf16da5f7ff8f31f87c01ed6a1439398c7" + }, + "vllm/v1/attention/backends/fa_utils.py": { + "path": "/vllm/v1/attention/backends/fa_utils.py", + "sha256": "08fa6e231d3af3a71a6e59162dd12328aa8beb28548165ae58f130a92adb5a83" + }, + "vllm/v1/attention/backends/flash_attn.py": { + "path": "/vllm/v1/attention/backends/flash_attn.py", + "sha256": "b170a4789e18104c1bee35bea70df51abe6766693d8f4726a59f2e6f5c4282aa" + }, + "vllm/v1/attention/backends/flash_attn_diffkv.py": { + "path": "/vllm/v1/attention/backends/flash_attn_diffkv.py", + "sha256": "e4627c88c3ba8caee260540e994cc8137fd2ff7cd7813356b36387c6c88ce30a" + }, + "vllm/v1/attention/backends/flashinfer.py": { + "path": "/vllm/v1/attention/backends/flashinfer.py", + "sha256": "8ee541fde43ed92a417b3f01ea1e6fc64af8ab2eb54cbfc28308a49aaca4ed7f" + }, + "vllm/v1/attention/backends/flex_attention.py": { + "path": "/vllm/v1/attention/backends/flex_attention.py", + "sha256": "ad07f0ad73aeeadc3534b3a05c14f88a62cb3638874239ae9823c49b36276dc3" + }, + "vllm/v1/attention/backends/gdn_attn.py": { + "path": "/vllm/v1/attention/backends/gdn_attn.py", + "sha256": "3831019404a92200a38b43571c040cffeb6638bbdc71e4cb5e680dbc6c93d054" + }, + "vllm/v1/attention/backends/hpc_attn.py": { + "path": "/vllm/v1/attention/backends/hpc_attn.py", + "sha256": "af9e2aec1b498f0ee48a2dce3cf5646edf1976466980b2fd927c0e82b875427c" + }, + "vllm/v1/attention/backends/linear_attn.py": { + "path": "/vllm/v1/attention/backends/linear_attn.py", + "sha256": "bc42144fcd027434c6a10dc9f4c5f991db8899d387af5f6485402ce097eb0513" + }, + "vllm/v1/attention/backends/mamba1_attn.py": { + "path": "/vllm/v1/attention/backends/mamba1_attn.py", + "sha256": "32159dae11cab3c8c576b9514ad97d5108c8d1b4cac9fcfe345ec6a76223aee7" + }, + "vllm/v1/attention/backends/mamba2_attn.py": { + "path": "/vllm/v1/attention/backends/mamba2_attn.py", + "sha256": "a5bcdecb7b9547137023e1c77a386003358fa940eaf5f319ed142211dcdba139" + }, + "vllm/v1/attention/backends/mamba_attn.py": { + "path": "/vllm/v1/attention/backends/mamba_attn.py", + "sha256": "5e7b2c4058fc5e6096d001bff6c789b78368b025bbe4600f191aaca2ff59b59f" + }, + "vllm/v1/attention/backends/mla/__init__.py": { + "path": "/vllm/v1/attention/backends/mla/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backends/mla/aiter_triton_mla.py": { + "path": "/vllm/v1/attention/backends/mla/aiter_triton_mla.py", + "sha256": "ed0e285cdae06a019150c41cc958b3c0b5ceb0e4f299d5318d1c90e2c2395390" + }, + "vllm/v1/attention/backends/mla/amx_mla.py": { + "path": "/vllm/v1/attention/backends/mla/amx_mla.py", + "sha256": "7f5cddec30b2dfe22ccdbd3b9da673c879719bf6da4074317bd60add55f5d15f" + }, + "vllm/v1/attention/backends/mla/compressor_utils.py": { + "path": "/vllm/v1/attention/backends/mla/compressor_utils.py", + "sha256": "3589e94105368ea285c40b82db1a0332682ff5d071fe363627cf4c0d10f3facf" + }, + "vllm/v1/attention/backends/mla/cpu_mla.py": { + "path": "/vllm/v1/attention/backends/mla/cpu_mla.py", + "sha256": "ff2110b9f78e92adf6bab294465cbc294ae1ff71cb1780fed158179e134a4ca6" + }, + "vllm/v1/attention/backends/mla/cutlass_mla.py": { + "path": "/vllm/v1/attention/backends/mla/cutlass_mla.py", + "sha256": "211d298680f9bd793cc468281b316d6633c5f4eb6dcec71d3329b034a23ab9b5" + }, + "vllm/v1/attention/backends/mla/flashattn_mla.py": { + "path": "/vllm/v1/attention/backends/mla/flashattn_mla.py", + "sha256": "ac89e0ad75a37e92566d264bafe324735a80f9ab4709241a4454d17b3d38bb63" + }, + "vllm/v1/attention/backends/mla/flashattn_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashattn_mla_sparse.py", + "sha256": "67dd3ead2e8b9d8cda0825ecc93779cb7d670628bc741c759a7d3cd5d474030f" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla.py", + "sha256": "0c24ff016fb6b0bb41d9e7484b6f1af42f37bcc384ed613473fc3e01ad25f664" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse.py", + "sha256": "2116d965b2067134d8afa5878d4d16c0149b061258f50c4106d993aa13b073cc" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm120.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm120.py", + "sha256": "102ca08793d567f95598eefeb34c3f6ec50b3b9d704f162d1402b97b12b5777b" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm90.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm90.py", + "sha256": "df9fe4970aa3f53cf24784b8534b89e0101a2ca20a35a2ebbc9a12a4463d5993" + }, + "vllm/v1/attention/backends/mla/flashmla.py": { + "path": "/vllm/v1/attention/backends/mla/flashmla.py", + "sha256": "c9d8046a853ecbdeff9ebfc738f5bb34c4f272b278231a09a0fbf73708c7c188" + }, + "vllm/v1/attention/backends/mla/flashmla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashmla_sparse.py", + "sha256": "7a379c717adb9667ce94cbc16c0e3a1fb22a169713db6d7941c141fa84077b3f" + }, + "vllm/v1/attention/backends/mla/index_group.py": { + "path": "/vllm/v1/attention/backends/mla/index_group.py", + "sha256": "c24e028c3c160a9bb92e043da5b5b34c805e84745b7c4b8da6fb8702a0ddd641" + }, + "vllm/v1/attention/backends/mla/indexer.py": { + "path": "/vllm/v1/attention/backends/mla/indexer.py", + "sha256": "2acbc1c4fa57c3424ad95e6ecbe76eb7141747773c3e867ce704f4adccba892a" + }, + "vllm/v1/attention/backends/mla/prefill/__init__.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/__init__.py", + "sha256": "903630eb705dd175bf4ae4558a4bcaa07c110056b6a11eb830fdd2fb21b3c48a" + }, + "vllm/v1/attention/backends/mla/prefill/aiter_flash_attn.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/aiter_flash_attn.py", + "sha256": "571b8a9910c4ea3fefda60659026f3bf0d7b542c34553c8c9a4d43bb82077e61" + }, + "vllm/v1/attention/backends/mla/prefill/base.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/base.py", + "sha256": "138bf3ddaf5a94c3cdbc4e08ac676edcae84b32fc76625e546f3b47f7d8b82ec" + }, + "vllm/v1/attention/backends/mla/prefill/cpu_sdpa.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/cpu_sdpa.py", + "sha256": "1bb686395274a8ec0d9fd7327410a527655fe060cbbc263eab138fea988d96de" + }, + "vllm/v1/attention/backends/mla/prefill/flash_attn.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/flash_attn.py", + "sha256": "5e648c82c82e5f81fe11458eb82b9f90b50fc06df2ade3bf111ee6b7a2ee8481" + }, + "vllm/v1/attention/backends/mla/prefill/flashinfer.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/flashinfer.py", + "sha256": "63861219c35b8abc0ebe01e1f51543c5ed40bd46119ca261d927da7c6826b49b" + }, + "vllm/v1/attention/backends/mla/prefill/registry.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/registry.py", + "sha256": "c8c30b92213d594beaa3cab4d5003da26a85870dbb11d1ab73191962d0645b53" + }, + "vllm/v1/attention/backends/mla/prefill/selector.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/selector.py", + "sha256": "101d9fca7924b0c5d7891a17fe8942611bd6759e32b03a571dc87b14c1430f2f" + }, + "vllm/v1/attention/backends/mla/prefill/tokenspeed_mla.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/tokenspeed_mla.py", + "sha256": "047cf07bfcc83db3b11a6a54ffe189f6146e6ec9ad33ce2fa7d18860bf4210f0" + }, + "vllm/v1/attention/backends/mla/prefill/trtllm_ragged.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/trtllm_ragged.py", + "sha256": "9e13ea6f6a25accedd918c0de64bbb812ccb20ffb95350ab018a6e76d493789b" + }, + "vllm/v1/attention/backends/mla/rocm_aiter_mla.py": { + "path": "/vllm/v1/attention/backends/mla/rocm_aiter_mla.py", + "sha256": "b489f5830c655bfb6299801a70d69b9821513c69568ecab3689db5a7be867be5" + }, + "vllm/v1/attention/backends/mla/rocm_aiter_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/rocm_aiter_mla_sparse.py", + "sha256": "91b1d9b3d860a9720bc01b8ebe9bbe8649a7d6bca20d4b63939bc100309bca19" + }, + "vllm/v1/attention/backends/mla/sparse_swa.py": { + "path": "/vllm/v1/attention/backends/mla/sparse_swa.py", + "sha256": "a47853ad8a3fe40f24704592581ea323a18041b84610df010a5534da634e311e" + }, + "vllm/v1/attention/backends/mla/sparse_utils.py": { + "path": "/vllm/v1/attention/backends/mla/sparse_utils.py", + "sha256": "c3cdf060288c05542243a9fe8b5ad3a963ad75e9ce399009b5e45c1235a88ce4" + }, + "vllm/v1/attention/backends/mla/tokenspeed_mla.py": { + "path": "/vllm/v1/attention/backends/mla/tokenspeed_mla.py", + "sha256": "b9ba523c606430cecb99a88b28c53d98a99dcf5e76105a80664338110a20f1ad" + }, + "vllm/v1/attention/backends/mla/triton_mla.py": { + "path": "/vllm/v1/attention/backends/mla/triton_mla.py", + "sha256": "21b16b3b34470edcc33d0423e560837c1d37d4bab31c7b3b9cfd7faa47864b51" + }, + "vllm/v1/attention/backends/mla/xpu_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/xpu_mla_sparse.py", + "sha256": "559c6240fe466521a6b2df4c94aea02ddf3f5efa5ba6954fa180c5a51c0f12d2" + }, + "vllm/v1/attention/backends/recoverssm_metadata.py": { + "path": "/vllm/v1/attention/backends/recoverssm_metadata.py", + "sha256": "02896a667db0f0308371ceb50048b18e5866c0235d163c0357e9a05dcedb3394" + }, + "vllm/v1/attention/backends/registry.py": { + "path": "/vllm/v1/attention/backends/registry.py", + "sha256": "378e8ee78734bd8c8adbe287d4c0a4058dcbb553195a09fbcce00a3cc30adc29" + }, + "vllm/v1/attention/backends/rocm_aiter_fa.py": { + "path": "/vllm/v1/attention/backends/rocm_aiter_fa.py", + "sha256": "d1418af03bf58209c850f466b712d3ea22a14ebb758c42dd43e65738281841fd" + }, + "vllm/v1/attention/backends/rocm_aiter_unified_attn.py": { + "path": "/vllm/v1/attention/backends/rocm_aiter_unified_attn.py", + "sha256": "59d2645eb4c91dc0567754a7163d066f4f2faf48f1957b254fcdd5604e9d8c8c" + }, + "vllm/v1/attention/backends/rocm_attn.py": { + "path": "/vllm/v1/attention/backends/rocm_attn.py", + "sha256": "4a8f57067073fbceb784af6c3467487c450d00fa3957928fadb99a79f6036292" + }, + "vllm/v1/attention/backends/short_conv_attn.py": { + "path": "/vllm/v1/attention/backends/short_conv_attn.py", + "sha256": "84fc460ef2fbd09743b069bec0c14b39542af6c2254a403e37a048427e151121" + }, + "vllm/v1/attention/backends/triton_attn.py": { + "path": "/vllm/v1/attention/backends/triton_attn.py", + "sha256": "1057663d110e1d5229495a799027b27277c1eca325d5b6780fa2259afbf58a1a" + }, + "vllm/v1/attention/backends/triton_attn_diffkv.py": { + "path": "/vllm/v1/attention/backends/triton_attn_diffkv.py", + "sha256": "de0357eae005246642140f1ab8842ba5ed8bff5c84b18a6d3a7bbf409c578301" + }, + "vllm/v1/attention/backends/triton_flash_attn.py": { + "path": "/vllm/v1/attention/backends/triton_flash_attn.py", + "sha256": "176e45329aeb28a2008362bb607d1b8c89816eb665859ab908b0385a11acf1c2" + }, + "vllm/v1/attention/backends/triton_flashinfer.py": { + "path": "/vllm/v1/attention/backends/triton_flashinfer.py", + "sha256": "48d5f967e388d4e8d6bbec8d827b44d855346bc2fada28adf65768bf6623527b" + }, + "vllm/v1/attention/backends/turboquant_attn.py": { + "path": "/vllm/v1/attention/backends/turboquant_attn.py", + "sha256": "616d16d608d9d1fbf6c29548037e7e9cf330f4d36a01aa3ffabf42a731eb6e2b" + }, + "vllm/v1/attention/backends/utils.py": { + "path": "/vllm/v1/attention/backends/utils.py", + "sha256": "fbc221360d2d54cb21ef3f625dc8711500de345a355801548b4337bb9b8abee0" + }, + "vllm/v1/attention/ops/__init__.py": { + "path": "/vllm/v1/attention/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/ops/chunked_prefill_paged_decode.py": { + "path": "/vllm/v1/attention/ops/chunked_prefill_paged_decode.py", + "sha256": "973db848a790b2e8d99e728b2fc4f44b501bbe58c62747244ddff04cfcf11a85" + }, + "vllm/v1/attention/ops/common.py": { + "path": "/vllm/v1/attention/ops/common.py", + "sha256": "b4b67e7fc0cce471e337d742c097fba06da7563816e8799e27719714e31e1d5b" + }, + "vllm/v1/attention/ops/cp_common.py": { + "path": "/vllm/v1/attention/ops/cp_common.py", + "sha256": "2369181862e96db64b14ef20c5c2e249ed2ea5f3dea2467a2aa388372bb86d9d" + }, + "vllm/v1/attention/ops/dcp.py": { + "path": "/vllm/v1/attention/ops/dcp.py", + "sha256": "a478bdc781460f0582cfaf74d6431f1a826c201f02f39d882d12a96139bc3f28" + }, + "vllm/v1/attention/ops/flashmla.py": { + "path": "/vllm/v1/attention/ops/flashmla.py", + "sha256": "8a40d6e120e3ab25a95fcfeb32b0b5b4c1ea02b984633866628536dcd26ed2e8" + }, + "vllm/v1/attention/ops/flydsl_kernels/__init__.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/attention/ops/flydsl_kernels/tq_decode.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/tq_decode.py", + "sha256": "cc4b7f82897596e0974b3d3a710a1a8bc58c3d22b72cc7f461dd1c4acd2e451b" + }, + "vllm/v1/attention/ops/flydsl_kernels/tq_decode_gqa6.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/tq_decode_gqa6.py", + "sha256": "a983f6d375c325900955e11696dab1e2665770e83f84d51f93d3ed5e1d8880e0" + }, + "vllm/v1/attention/ops/flydsl_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/flydsl_turboquant_decode.py", + "sha256": "7b1dd0ef7c7fb28a6a8831759e00b939ab844d067657155cc11cf75532a22c63" + }, + "vllm/v1/attention/ops/int4_per_token_head.py": { + "path": "/vllm/v1/attention/ops/int4_per_token_head.py", + "sha256": "d91968f280cd8eaed7570ab255f0276b40e833e18a25066d371d9ca8149425f2" + }, + "vllm/v1/attention/ops/merge_attn_states.py": { + "path": "/vllm/v1/attention/ops/merge_attn_states.py", + "sha256": "ad08403d2843fc892f0b0b4b9f5fabb81884556f89f7170dca46ccef498a3539" + }, + "vllm/v1/attention/ops/metadata.py": { + "path": "/vllm/v1/attention/ops/metadata.py", + "sha256": "ca882b84c5aaefb1f77e4d8ea09a00103fbc53defa8671bba036c961c17fc760" + }, + "vllm/v1/attention/ops/paged_attn.py": { + "path": "/vllm/v1/attention/ops/paged_attn.py", + "sha256": "016a95f892ec751c86b37be1e12171bad9f0b4076bbf2219ff336f4e9c503653" + }, + "vllm/v1/attention/ops/pcp.py": { + "path": "/vllm/v1/attention/ops/pcp.py", + "sha256": "dadeff95fe2df2be8028baabeef01b0d2d628cd67de2176915e737ce096de3dd" + }, + "vllm/v1/attention/ops/prefix_prefill.py": { + "path": "/vllm/v1/attention/ops/prefix_prefill.py", + "sha256": "b08ad92db715fc03c11699de3de463d55e411f42f77548e06b41049a61de692f" + }, + "vllm/v1/attention/ops/rocm_aiter_mla_merge.py": { + "path": "/vllm/v1/attention/ops/rocm_aiter_mla_merge.py", + "sha256": "564c66e4877732e48a6f7d52405c43dc952eec0f0ae4353d34886bca056132b9" + }, + "vllm/v1/attention/ops/rocm_aiter_mla_sparse.py": { + "path": "/vllm/v1/attention/ops/rocm_aiter_mla_sparse.py", + "sha256": "feec664be5045fd1ba13b8f6ef83b52c96910ddc78baca0431bcf610c9e8f5cc" + }, + "vllm/v1/attention/ops/triton_attention_helpers.py": { + "path": "/vllm/v1/attention/ops/triton_attention_helpers.py", + "sha256": "35aa993d01345f535d2641cf9dcabb8b64c51b20a19707bc5987e616aaa87ddd" + }, + "vllm/v1/attention/ops/triton_decode_attention.py": { + "path": "/vllm/v1/attention/ops/triton_decode_attention.py", + "sha256": "b9823c65eba22d76abf64dad7d7d16a950f67471c86d6cb5b3e983aaf14381ac" + }, + "vllm/v1/attention/ops/triton_merge_attn_states.py": { + "path": "/vllm/v1/attention/ops/triton_merge_attn_states.py", + "sha256": "f63229162181ab93198550b73a115f1cc1034cfd60e6f58bc8ab3e22a6e8ce60" + }, + "vllm/v1/attention/ops/triton_prefill_attention.py": { + "path": "/vllm/v1/attention/ops/triton_prefill_attention.py", + "sha256": "352c1a4ac86146580040579fb217c2e288268830d6602b735713e154f36d74fe" + }, + "vllm/v1/attention/ops/triton_reshape_and_cache_flash.py": { + "path": "/vllm/v1/attention/ops/triton_reshape_and_cache_flash.py", + "sha256": "6cac51475b8c656992a21b2d150acd3a16a95a7ab7d49aab151a3ef13c24b80d" + }, + "vllm/v1/attention/ops/triton_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/triton_turboquant_decode.py", + "sha256": "8e52678136449e4bbca2195fbcbb87426c955a2b1b8422e7ab9511e45ee5f5c6" + }, + "vllm/v1/attention/ops/triton_turboquant_store.py": { + "path": "/vllm/v1/attention/ops/triton_turboquant_store.py", + "sha256": "6e6e2fe74a307d40f0be786ccbaea76d989e3c7b5985f3144a5218c61bf6d902" + }, + "vllm/v1/attention/ops/triton_unified_attention.py": { + "path": "/vllm/v1/attention/ops/triton_unified_attention.py", + "sha256": "65d0fbcf33d00789df8ca688c0a1c908e710cfaef53471178747ecae11f05829" + }, + "vllm/v1/attention/ops/triton_unified_attention_diffkv.py": { + "path": "/vllm/v1/attention/ops/triton_unified_attention_diffkv.py", + "sha256": "7fa36d7b7441f1c396e0348eac61d691d2e459e5c4c393c4aa262dfb670e68f7" + }, + "vllm/v1/attention/ops/turboquant_soa/__init__.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/__init__.py", + "sha256": "6b43b6fcb2a71c44ceff4ed1edd417a839f4901251ba15831b09ad979baa4984" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode.py", + "sha256": "bf00634191bba14cbf4a23c1d67dc3dcb244c2b8989f08362757b54435830986" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode_v2.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode_v2.py", + "sha256": "28e7ecc15c450d3591983a50c46a03aa6ca6fa99304c17c333940617d9916485" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_store.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_store.py", + "sha256": "dccf93b9fdd34f9b9eacd468e9de35b9d93378594487c335cf50642aaec681f2" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_unified_attention.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_unified_attention.py", + "sha256": "b4b2b5f3985b3a6126fd052e6ec1ed91c610da8a525a9ae7470ac829405bd85c" + }, + "vllm/v1/attention/ops/vit_attn_wrappers.py": { + "path": "/vllm/v1/attention/ops/vit_attn_wrappers.py", + "sha256": "a99d57b58269c7521fa5d7d47af06551f3bab2b5c7358ef78165a7f6e20a92a6" + }, + "vllm/v1/attention/ops/xpu_mla_sparse.py": { + "path": "/vllm/v1/attention/ops/xpu_mla_sparse.py", + "sha256": "d98d17110577c2b7b4d05e07bfdae15faf83321b6342a5daaaecce45b9503f38" + }, + "vllm/v1/attention/selector.py": { + "path": "/vllm/v1/attention/selector.py", + "sha256": "87f653ded7974875183c920e3e4589c28116bcbc99714d1da7cb51ae77c0b182" + }, + "vllm/v1/core/sched/__init__.py": { + "path": "/vllm/v1/core/sched/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/core/sched/async_scheduler.py": { + "path": "/vllm/v1/core/sched/async_scheduler.py", + "sha256": "e586a0ef3c6778be56a93e7f9bb712d4de9de6e7d7fe7e3e1d51dae83ecfc508" + }, + "vllm/v1/core/sched/interface.py": { + "path": "/vllm/v1/core/sched/interface.py", + "sha256": "be6c008664096c5660a8879de72b315bbe479bf1d688be9b25891063ec53a367" + }, + "vllm/v1/core/sched/output.py": { + "path": "/vllm/v1/core/sched/output.py", + "sha256": "3a66c8efaefe10c572f6f33cf1f8aa4610758c945130cad62eb9f7331005677c" + }, + "vllm/v1/core/sched/request_queue.py": { + "path": "/vllm/v1/core/sched/request_queue.py", + "sha256": "4b8d938e5fb8152fe61030b8aa991f983fcac9a405c37ed8908045e05e82ae5e" + }, + "vllm/v1/core/sched/scheduler.py": { + "path": "/vllm/v1/core/sched/scheduler.py", + "sha256": "c1db45f3bbad3a875dd8638331b8870c4380ac1ab4734265ba5c863833a82884" + }, + "vllm/v1/core/sched/utils.py": { + "path": "/vllm/v1/core/sched/utils.py", + "sha256": "1ed988044eb8028c77ede875bd1a5fd05ff6998b455d61e3997d6a3d7fc1c3a7" + }, + "vllm/v1/sample/__init__.py": { + "path": "/vllm/v1/sample/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/sample/logits_processor/__init__.py": { + "path": "/vllm/v1/sample/logits_processor/__init__.py", + "sha256": "1f9b02dae8cf6d44484638037123d3a2dec6b7b9a2bcc9afceef1a9bf3eaedec" + }, + "vllm/v1/sample/logits_processor/builtin.py": { + "path": "/vllm/v1/sample/logits_processor/builtin.py", + "sha256": "6105816ece77e5b1dbee0d07abc90ce039d650bac2ddb85c93280c48b00f2ebe" + }, + "vllm/v1/sample/logits_processor/interface.py": { + "path": "/vllm/v1/sample/logits_processor/interface.py", + "sha256": "171dfc6ef9b5b53128e8eaecc4bdf1de413a706d64bf5be686048f583c66eee1" + }, + "vllm/v1/sample/logits_processor/state.py": { + "path": "/vllm/v1/sample/logits_processor/state.py", + "sha256": "a96411f14362c45f839e181dcb3ac01d5b880812bccb3552fc17863b219f44ac" + }, + "vllm/v1/sample/metadata.py": { + "path": "/vllm/v1/sample/metadata.py", + "sha256": "6582cfe1a240c7ddb975f0ef6dd7dcd28dcf0fc7670394390250013977aa7ffd" + }, + "vllm/v1/sample/ops/__init__.py": { + "path": "/vllm/v1/sample/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/sample/ops/bad_words.py": { + "path": "/vllm/v1/sample/ops/bad_words.py", + "sha256": "0b1d0a9b13b92ddcae2c83393c07a34c0f107813725700dee794caa7fe7f3b12" + }, + "vllm/v1/sample/ops/logprobs.py": { + "path": "/vllm/v1/sample/ops/logprobs.py", + "sha256": "b286f69012a6758bfe9250038b0697294dbffe0d32c6906f284c39f75ee48be3" + }, + "vllm/v1/sample/ops/penalties.py": { + "path": "/vllm/v1/sample/ops/penalties.py", + "sha256": "4debfcf247b3887478d2b9ec98f108756bbed2805462777ef6b56f3bdf4ce682" + }, + "vllm/v1/sample/ops/topk_topp_sampler.py": { + "path": "/vllm/v1/sample/ops/topk_topp_sampler.py", + "sha256": "13ea4359832bc914492330958ec4f5ac140f408b8f410cc05c6eaf7ddcd70be4" + }, + "vllm/v1/sample/ops/topk_topp_triton.py": { + "path": "/vllm/v1/sample/ops/topk_topp_triton.py", + "sha256": "0b5fc337058e22bc28a8530ccec904d6ccd89b9548b02955c657ac429b1669d2" + }, + "vllm/v1/sample/rejection_sampler.py": { + "path": "/vllm/v1/sample/rejection_sampler.py", + "sha256": "0bb9d224887ccb1355e16199005cc23a4afc6fa75156eca419851b7247d99750" + }, + "vllm/v1/sample/sampler.py": { + "path": "/vllm/v1/sample/sampler.py", + "sha256": "f95805b2c6d06218c724826aa5f881a606e8d0a534a566aee7c85948520dd216" + }, + "vllm/v1/sample/thinking_budget_state.py": { + "path": "/vllm/v1/sample/thinking_budget_state.py", + "sha256": "962f8f55210eb0a431cb9c78b013e35f7a7dd58d06d6fb2e7fcff1b457356f8e" + }, + "vllm/v1/worker/__init__.py": { + "path": "/vllm/v1/worker/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/block_table.py": { + "path": "/vllm/v1/worker/block_table.py", + "sha256": "a09b8819e1417b7a186cf3472224e2138fc5d41a291c6692bb7df711b0c44259" + }, + "vllm/v1/worker/cp_utils.py": { + "path": "/vllm/v1/worker/cp_utils.py", + "sha256": "e32625d83a641b8dd8df82e92d1b6fb20af0cdf2e8fbd2fb131aa3c215415448" + }, + "vllm/v1/worker/cpu/__init__.py": { + "path": "/vllm/v1/worker/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/cpu/buffer_utils.py": { + "path": "/vllm/v1/worker/cpu/buffer_utils.py", + "sha256": "e7313fd8c2c76ebfb98d2fa53008bc9691d0f83a7d7c05e87602b5a29fb79e04" + }, + "vllm/v1/worker/cpu/model_runner.py": { + "path": "/vllm/v1/worker/cpu/model_runner.py", + "sha256": "24a1c916550051327dd5893243a6d4200f3824b91b3af8aa6f6c793fd7c68c3e" + }, + "vllm/v1/worker/cpu/shm.py": { + "path": "/vllm/v1/worker/cpu/shm.py", + "sha256": "08491af8ad341399d1375f2d21ad00414d4c89b0a5c03f55de8704914bbfcbd9" + }, + "vllm/v1/worker/cpu_model_runner.py": { + "path": "/vllm/v1/worker/cpu_model_runner.py", + "sha256": "92111aba92f00571f1a3c4c6e43cf1da6ccb4d2afac2f4d5abc018a4a6e7e8bd" + }, + "vllm/v1/worker/cpu_worker.py": { + "path": "/vllm/v1/worker/cpu_worker.py", + "sha256": "a8051b9e510ef0af9cc34004f2cbe5c0f902bd0cebc32c9464e744344dfdf849" + }, + "vllm/v1/worker/dp_utils.py": { + "path": "/vllm/v1/worker/dp_utils.py", + "sha256": "8cd19f1bfbc5c4f6ec60df89aea7c8a19b400ebc264f372b103014152e92158c" + }, + "vllm/v1/worker/ec_connector_model_runner_mixin.py": { + "path": "/vllm/v1/worker/ec_connector_model_runner_mixin.py", + "sha256": "fe9b11cebb8562f1bfe98b98a5647b2b081a6e424cb60d4ffe2412c91a99215e" + }, + "vllm/v1/worker/encoder_cudagraph.py": { + "path": "/vllm/v1/worker/encoder_cudagraph.py", + "sha256": "6a08d3779bca1b47dbf9daf6eafe2d3c70dbcb8aeb7d63ba7efacc68241ee3bc" + }, + "vllm/v1/worker/encoder_cudagraph_defs.py": { + "path": "/vllm/v1/worker/encoder_cudagraph_defs.py", + "sha256": "bb7be050fcaa8868e7816c84caec875da57050d65fe7eaf00f3d41473df25e3a" + }, + "vllm/v1/worker/gpu/__init__.py": { + "path": "/vllm/v1/worker/gpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/async_utils.py": { + "path": "/vllm/v1/worker/gpu/async_utils.py", + "sha256": "77e17a4570ead2be30ae9b00888cf077a3b873018c12ca0549b853bfda02c1ba" + }, + "vllm/v1/worker/gpu/attn_utils.py": { + "path": "/vllm/v1/worker/gpu/attn_utils.py", + "sha256": "b9b81e59dda2720b1f9c434471381f879228832443e52756e469b4ad4905888f" + }, + "vllm/v1/worker/gpu/block_table.py": { + "path": "/vllm/v1/worker/gpu/block_table.py", + "sha256": "61c004315d5af7e7eae4e2a9e6be92ea82c520327690a7f55a73bb9ce95f520a" + }, + "vllm/v1/worker/gpu/buffer_utils.py": { + "path": "/vllm/v1/worker/gpu/buffer_utils.py", + "sha256": "6597f701a30261bf250e9ad5a29737264624a1caa20527aeea0dad630325b093" + }, + "vllm/v1/worker/gpu/cp_utils.py": { + "path": "/vllm/v1/worker/gpu/cp_utils.py", + "sha256": "456c1bb7e262d99ff555522a4f134e5a9b42aee23290be25455eaef36ee8eaaf" + }, + "vllm/v1/worker/gpu/cudagraph_utils.py": { + "path": "/vllm/v1/worker/gpu/cudagraph_utils.py", + "sha256": "6e9c042890603535e300a40df8ee159dbed1058a64a83ae50ff0329e332e05ff" + }, + "vllm/v1/worker/gpu/dp_utils.py": { + "path": "/vllm/v1/worker/gpu/dp_utils.py", + "sha256": "e26867bc89e6bfc933cabc5ed13e5dc7b8d2d3030118ca1ca64c8785dabc0fc1" + }, + "vllm/v1/worker/gpu/ec_connector.py": { + "path": "/vllm/v1/worker/gpu/ec_connector.py", + "sha256": "2afe6e641f4ae3eb3b8da336c74eaa7479bf617b27cfb39a1fcbe487686f0a08" + }, + "vllm/v1/worker/gpu/eplb_utils.py": { + "path": "/vllm/v1/worker/gpu/eplb_utils.py", + "sha256": "1829fac11464aed4649179b302df198de51b95d0589f4e56bea305a876a63e26" + }, + "vllm/v1/worker/gpu/input_batch.py": { + "path": "/vllm/v1/worker/gpu/input_batch.py", + "sha256": "d5dd956eb319bd69dd9e762047833d81ad40b21fce619fcb2133759e73620694" + }, + "vllm/v1/worker/gpu/kv_connector.py": { + "path": "/vllm/v1/worker/gpu/kv_connector.py", + "sha256": "b89a4333f1e552d86e1815674b59e9f1335f0f49c0a7b46082439076f62c6a81" + }, + "vllm/v1/worker/gpu/lora_utils.py": { + "path": "/vllm/v1/worker/gpu/lora_utils.py", + "sha256": "1e90eddd9ddb4ca55e574bb28e87ae3a6f6750175a62d373102426543f4ccd66" + }, + "vllm/v1/worker/gpu/metrics/__init__.py": { + "path": "/vllm/v1/worker/gpu/metrics/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/metrics/logits.py": { + "path": "/vllm/v1/worker/gpu/metrics/logits.py", + "sha256": "ea058d7510a077a55f8ac7e4c3d596508346244e908cb372865d7159f62edc89" + }, + "vllm/v1/worker/gpu/mm/__init__.py": { + "path": "/vllm/v1/worker/gpu/mm/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/mm/encoder_cache.py": { + "path": "/vllm/v1/worker/gpu/mm/encoder_cache.py", + "sha256": "89c500338fddbeee7c4fca978a3a7c4c566a03e848e399d303fbee3c80631cd2" + }, + "vllm/v1/worker/gpu/mm/encoder_runner.py": { + "path": "/vllm/v1/worker/gpu/mm/encoder_runner.py", + "sha256": "0981e352d70301b7154a217a48665ffe35f215d053ec5740c2515a3e1e11b4e6" + }, + "vllm/v1/worker/gpu/mm/lora.py": { + "path": "/vllm/v1/worker/gpu/mm/lora.py", + "sha256": "a3eddfad6ad64de276964240c28dc080888df4a56dd5eac18f89428f2cbb7a01" + }, + "vllm/v1/worker/gpu/mm/rope.py": { + "path": "/vllm/v1/worker/gpu/mm/rope.py", + "sha256": "0924375bcb367267e783b57dd2ad9de1189d97025ce4313baaa54f2911eaaf1e" + }, + "vllm/v1/worker/gpu/model_runner.py": { + "path": "/vllm/v1/worker/gpu/model_runner.py", + "sha256": "174c93db921c23cf0396eee4764be25b2bd2d4b6a06e9fa41ce3598b884ce8ce" + }, + "vllm/v1/worker/gpu/model_states/__init__.py": { + "path": "/vllm/v1/worker/gpu/model_states/__init__.py", + "sha256": "07815d0b788fc88185772f581bbf892a675259f9288375571f29887622f8d93c" + }, + "vllm/v1/worker/gpu/model_states/default.py": { + "path": "/vllm/v1/worker/gpu/model_states/default.py", + "sha256": "bb614f814780f052e869f9acf31dfbfa68718ee7dc6252eefa901b5730ee8a2a" + }, + "vllm/v1/worker/gpu/model_states/encoder_decoder.py": { + "path": "/vllm/v1/worker/gpu/model_states/encoder_decoder.py", + "sha256": "a5868059d8af672548b41d0e623e884320e6ed61e6aaca2d2828ff5be0356f2f" + }, + "vllm/v1/worker/gpu/model_states/encoder_only.py": { + "path": "/vllm/v1/worker/gpu/model_states/encoder_only.py", + "sha256": "84e96b55a2639e2a73fa4a0308acc89c8d053dc715481180b237e0196dcef99f" + }, + "vllm/v1/worker/gpu/model_states/interface.py": { + "path": "/vllm/v1/worker/gpu/model_states/interface.py", + "sha256": "5675b6fedc7403a9ab410b1e5565974e78fac23c42ab4253ae1da52d6e09b594" + }, + "vllm/v1/worker/gpu/model_states/mamba_hybrid.py": { + "path": "/vllm/v1/worker/gpu/model_states/mamba_hybrid.py", + "sha256": "573e130ac5587d4822fabf97adad1ad0fda02ff83c5e70df879a5bb175ae845c" + }, + "vllm/v1/worker/gpu/model_states/mm_pruning.py": { + "path": "/vllm/v1/worker/gpu/model_states/mm_pruning.py", + "sha256": "b150940b12ae76048f050a8eeb54d532bbdc530a18ffbf320ddeeb0cfaa90f93" + }, + "vllm/v1/worker/gpu/model_states/prompt_embeds.py": { + "path": "/vllm/v1/worker/gpu/model_states/prompt_embeds.py", + "sha256": "11f9e270925c2df6a505557605ac2b859bb145cf3420b0111e7482a1c544f9b1" + }, + "vllm/v1/worker/gpu/model_states/recoverssm.py": { + "path": "/vllm/v1/worker/gpu/model_states/recoverssm.py", + "sha256": "b4b660e62eaf33f4fe8271f83ed1fb6de6bc08f800a8073b27803e42fb29a645" + }, + "vllm/v1/worker/gpu/pcp_manager.py": { + "path": "/vllm/v1/worker/gpu/pcp_manager.py", + "sha256": "2d80df0ed5b18a2069f9d0689cb59923ffe324ba200fcafe242da23da3a6ddaa" + }, + "vllm/v1/worker/gpu/pool/__init__.py": { + "path": "/vllm/v1/worker/gpu/pool/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/pool/pooling_runner.py": { + "path": "/vllm/v1/worker/gpu/pool/pooling_runner.py", + "sha256": "f8463f7648cce0f3f29418a4d9fee61634ead760957cf236d06d61cf8cd986e7" + }, + "vllm/v1/worker/gpu/pp_utils.py": { + "path": "/vllm/v1/worker/gpu/pp_utils.py", + "sha256": "dadeef0bebf61d0ad44a28d06372208ec4e6389224d6017f412683b026bdbb5c" + }, + "vllm/v1/worker/gpu/sample/__init__.py": { + "path": "/vllm/v1/worker/gpu/sample/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/sample/bad_words.py": { + "path": "/vllm/v1/worker/gpu/sample/bad_words.py", + "sha256": "8d3cbd5613398260314d94739d8ee0e1ac0c22abf2f960f541d3c0d4e39d360b" + }, + "vllm/v1/worker/gpu/sample/batch_shard.py": { + "path": "/vllm/v1/worker/gpu/sample/batch_shard.py", + "sha256": "c30274a3a04e6a03e89be9cd7c62de602b1aba4d412f64540ab6201036de3928" + }, + "vllm/v1/worker/gpu/sample/gumbel.py": { + "path": "/vllm/v1/worker/gpu/sample/gumbel.py", + "sha256": "3ec1df510bdad13e8b0a457b5b67c98affdf6e57369e56cb471246cc8f40dd34" + }, + "vllm/v1/worker/gpu/sample/logit_bias.py": { + "path": "/vllm/v1/worker/gpu/sample/logit_bias.py", + "sha256": "9e80a3fe6f3c7474723408cfff52183f4585fdeedd9c2312843ee98d0b12724c" + }, + "vllm/v1/worker/gpu/sample/logprob.py": { + "path": "/vllm/v1/worker/gpu/sample/logprob.py", + "sha256": "f47479a818192acb6b297c79fa67a3b2f9820e3492a394d5adda777e9b7c832e" + }, + "vllm/v1/worker/gpu/sample/min_p.py": { + "path": "/vllm/v1/worker/gpu/sample/min_p.py", + "sha256": "4cb5e2f45e1ced6f9685283a7a5c8cfd7204d9a249822e866cfff756c7f04f62" + }, + "vllm/v1/worker/gpu/sample/output.py": { + "path": "/vllm/v1/worker/gpu/sample/output.py", + "sha256": "d6e298c0f197d487a8faaf7200f500fa83df1d7a4bbf4339cadd6a18008f7f9c" + }, + "vllm/v1/worker/gpu/sample/penalties.py": { + "path": "/vllm/v1/worker/gpu/sample/penalties.py", + "sha256": "46c29434caf5f415129ef4a9bb2b8d4f62d2765596e3e07f73ad2b198c7def1b" + }, + "vllm/v1/worker/gpu/sample/prompt_logprob.py": { + "path": "/vllm/v1/worker/gpu/sample/prompt_logprob.py", + "sha256": "4cf22d390e7bf59e44c458cff7180268db63e95d06af2f1e14d720a2d77c9663" + }, + "vllm/v1/worker/gpu/sample/sampler.py": { + "path": "/vllm/v1/worker/gpu/sample/sampler.py", + "sha256": "832c9945d201a1e730ff9b4b52076aa83bd4a5064e1e4cfea952cf84d4a8d1f0" + }, + "vllm/v1/worker/gpu/sample/states.py": { + "path": "/vllm/v1/worker/gpu/sample/states.py", + "sha256": "4e3671f93695ba5a48fad7d2d13beb231ac8741034904ed5a15d9f7b9b86662e" + }, + "vllm/v1/worker/gpu/sample/thinking_budget.py": { + "path": "/vllm/v1/worker/gpu/sample/thinking_budget.py", + "sha256": "020513e1d3406f367de6ad995a95055008fd0c28f2873647e8283c9870e22404" + }, + "vllm/v1/worker/gpu/sample/trace_replay.py": { + "path": "/vllm/v1/worker/gpu/sample/trace_replay.py", + "sha256": "d2a7d3b3b55379efabe4740a4b7f14030126dc11be36f6ea974164ce42316a50" + }, + "vllm/v1/worker/gpu/sample/watermark.py": { + "path": "/vllm/v1/worker/gpu/sample/watermark.py", + "sha256": "a3581458169dab9153eb09fd67218e0ee5585406537a9de80ad528ae62b030c0" + }, + "vllm/v1/worker/gpu/shutdown.py": { + "path": "/vllm/v1/worker/gpu/shutdown.py", + "sha256": "bb470f14b17c7e52571ef8938b2a9527e7c2846852ae8a3a94b69cd1c30aa4b1" + }, + "vllm/v1/worker/gpu/spec_decode/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/__init__.py", + "sha256": "1f1f84bfe6f4f5af3a7e21a7a8716ecf7b9013da1d03327668a3ee36afc24c32" + }, + "vllm/v1/worker/gpu/spec_decode/acceptance_estimator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/acceptance_estimator.py", + "sha256": "505b843bdd75928b03793b395b47b8be914bd7fe2a3351c8ec04339baeebb1c2" + }, + "vllm/v1/worker/gpu/spec_decode/adaptive_verification.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/adaptive_verification.py", + "sha256": "276b2fec56758a94c71b717f6786b8a6f126db2e20cf964350202feee61a0a39" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py", + "sha256": "13392ef0a9ed59eb9c2b2bad43d7c61beb212a8805849e46b5130c230275d0a5" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/speculator.py", + "sha256": "5b97f54e20ddf65b98e939832d050745f67ef43cfa145786da300f1a8322e3c6" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/cudagraph.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/cudagraph.py", + "sha256": "beab567ae2df6a2ba2cd92fe7ee452c6b959b8a7037a4b5f493993a1824619bb" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/speculator.py", + "sha256": "f9c100f42f9326e48eb84e89281897e859ba761943f54d593523555ccd98dc63" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/utils.py", + "sha256": "53d2c3ad474d290d2c6df027446bbd80ac7447684e5242ab2c3c5337d2abd383" + }, + "vllm/v1/worker/gpu/spec_decode/dflash2/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash2/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/dflash2/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash2/speculator.py", + "sha256": "b70043550938a1df9aecc85d8c8224c38c929ca34f68834572f6e723854d2027" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/speculator.py", + "sha256": "dcf4abdedbd2bddd0d76be198ccf5b4e467c46f645038c35fcab821491a35b03" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/utils.py", + "sha256": "86af2bf30604a184312e8f076097b91ecfec704f409f9d68d634b03d6b318070" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/eagle3_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/eagle3_utils.py", + "sha256": "201ee875fcc3d076a8fc1f3876dcbf85736b221a368555243a8987ff26a1674e" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/speculator.py", + "sha256": "746e318a4f266d75522ff7f3731ea9b4527b7b4824f71364d1a62184ea1f7b3d" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/utils.py", + "sha256": "94de6f55a1761f24f4aa1388cbc3b3763d4ab3ee53260330056ad31ce0b78236" + }, + "vllm/v1/worker/gpu/spec_decode/extract_hidden_states.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/extract_hidden_states.py", + "sha256": "93c4233be7b2d2290b33902ea9b3bb5274c11701830851d03967a22144536e2d" + }, + "vllm/v1/worker/gpu/spec_decode/gemma4/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/gemma4/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/gemma4/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/gemma4/speculator.py", + "sha256": "9991210d7babd2caf2cd10797ca8688543dedeafbc3b86bc7c979c1a6ae9f949" + }, + "vllm/v1/worker/gpu/spec_decode/mtp/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/mtp/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/mtp/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/mtp/speculator.py", + "sha256": "926d6c9ffdb368c971647911a60493820d056ce236fcae9d94a42fa2e006255d" + }, + "vllm/v1/worker/gpu/spec_decode/multi_module_mtp/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/multi_module_mtp/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/multi_module_mtp/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/multi_module_mtp/speculator.py", + "sha256": "d9d4735b9b33829332b0e845b6d3073b2f0436045ed693b25c6434f351644127" + }, + "vllm/v1/worker/gpu/spec_decode/rejection_sampler.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/rejection_sampler.py", + "sha256": "030db5bfca162cc1f305112f299de5d6d61c59d3ed0807fee46575441ca4086d" + }, + "vllm/v1/worker/gpu/spec_decode/rejection_sampler_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/rejection_sampler_utils.py", + "sha256": "214b61fa0abe88573beb779872c035b3954e5651a85bd438d99ee5905d3a62ec" + }, + "vllm/v1/worker/gpu/spec_decode/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/speculator.py", + "sha256": "3a1ab15bf8b20918852eb835fe9755046e99dcbac6ba6ca3d414949fc8bc695a" + }, + "vllm/v1/worker/gpu/spec_decode/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/utils.py", + "sha256": "282f2929eddae9ca7312269f799be07472334b6df9fd91878b5e839ec05e418c" + }, + "vllm/v1/worker/gpu/states.py": { + "path": "/vllm/v1/worker/gpu/states.py", + "sha256": "99418f5df43ca612ded72609fee011620b065b2cab2f249ccb387096bf4ae71a" + }, + "vllm/v1/worker/gpu/structured_outputs.py": { + "path": "/vllm/v1/worker/gpu/structured_outputs.py", + "sha256": "18a10532db7e66b55e334acacd1fd989ad6361adf31dd0de9a9a65e23db25951" + }, + "vllm/v1/worker/gpu/ubatch_utils.py": { + "path": "/vllm/v1/worker/gpu/ubatch_utils.py", + "sha256": "5092e2e58af0561c8dc12e62847cfc6dda9ca20dfbd33e7f0cd77a83fe87f7c5" + }, + "vllm/v1/worker/gpu/warmup.py": { + "path": "/vllm/v1/worker/gpu/warmup.py", + "sha256": "423ac32d58fe008c228cfa223e4fcebfcf87e3463a9dbdf80a083c0578d73723" + }, + "vllm/v1/worker/gpu_input_batch.py": { + "path": "/vllm/v1/worker/gpu_input_batch.py", + "sha256": "18cf455c9d0eea61cc581c7932f2e6cd09786914e82dd35eef1c1430da359a0f" + }, + "vllm/v1/worker/gpu_model_runner.py": { + "path": "/vllm/v1/worker/gpu_model_runner.py", + "sha256": "87c29d08c0bbf66993d8b984811e7325e35e6436242a773feb55ec88f16b2c51" + }, + "vllm/v1/worker/gpu_ubatch_wrapper.py": { + "path": "/vllm/v1/worker/gpu_ubatch_wrapper.py", + "sha256": "4233cfbe8c9884b042c4363890108f616483b694ebe9a6e69578dcf89c6dac5c" + }, + "vllm/v1/worker/gpu_worker.py": { + "path": "/vllm/v1/worker/gpu_worker.py", + "sha256": "6994436e4547c0996ab555b3e814e8ccea26b650dfc1b378b97d640745309347" + }, + "vllm/v1/worker/kv_connector_model_runner_mixin.py": { + "path": "/vllm/v1/worker/kv_connector_model_runner_mixin.py", + "sha256": "e1cc76d065a7e60aacddb190ae795a480b65cd02ba71a1fc699a02a85c1a3de2" + }, + "vllm/v1/worker/lora_model_runner_mixin.py": { + "path": "/vllm/v1/worker/lora_model_runner_mixin.py", + "sha256": "fef6092a15d8d37f6fa22495e6106e2e5280180908d61ce43d9ff5bf4eef3f2f" + }, + "vllm/v1/worker/mamba_utils.py": { + "path": "/vllm/v1/worker/mamba_utils.py", + "sha256": "23fdaa4e8f63ee8f938eaa1a2b39f803cb04fa6ecd69789563254b1a0691413a" + }, + "vllm/v1/worker/mm_encoder_model_runner.py": { + "path": "/vllm/v1/worker/mm_encoder_model_runner.py", + "sha256": "780c41be84ad022205c21c1decb6bb8d5afb03bc7be120c1f7df03b710acc3d7" + }, + "vllm/v1/worker/sentinel/__init__.py": { + "path": "/vllm/v1/worker/sentinel/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/sentinel/gpu_worker_sentinel.py": { + "path": "/vllm/v1/worker/sentinel/gpu_worker_sentinel.py", + "sha256": "3959b8619d052c5dd247815074e03ec21ec9b43cc424ff2d296abc19b227b852" + }, + "vllm/v1/worker/startup_plan.py": { + "path": "/vllm/v1/worker/startup_plan.py", + "sha256": "84bcbb4f7a9fd7c8d10c9c895aadd9673d44c767b9132368d11eb5e017afe86b" + }, + "vllm/v1/worker/ubatch_utils.py": { + "path": "/vllm/v1/worker/ubatch_utils.py", + "sha256": "b34dce551b5195c414e6a3a997c75961cc7a17f24c7c980487fe3d3e2ba7a798" + }, + "vllm/v1/worker/ubatching.py": { + "path": "/vllm/v1/worker/ubatching.py", + "sha256": "40391241c564feb5f16c77898ae6ae152ed6e71a4682e2a406387785d8de02d7" + }, + "vllm/v1/worker/utils.py": { + "path": "/vllm/v1/worker/utils.py", + "sha256": "0ca3ec6bf4d20076145b7fe64e564962adebedc8f75a856b517ba0b2f2d77acf" + }, + "vllm/v1/worker/worker_base.py": { + "path": "/vllm/v1/worker/worker_base.py", + "sha256": "4a1a5266b912fe97991d8dc89d92b923990da9f6cb4b817d00d52e9c0d26dd7c" + }, + "vllm/v1/worker/workspace.py": { + "path": "/vllm/v1/worker/workspace.py", + "sha256": "d21c08167d1d0d1c0cddaa80453a53a0b4dec5d81b5a537c94a21324344976b3" + }, + "vllm/v1/worker/xpu_model_runner.py": { + "path": "/vllm/v1/worker/xpu_model_runner.py", + "sha256": "07fa0390d28f2b8c3c3c0019eb9c3b126e2397aea268ba47c889f06b423deb23" + }, + "vllm/v1/worker/xpu_worker.py": { + "path": "/vllm/v1/worker/xpu_worker.py", + "sha256": "711b56432506b58041cd86e71320c3960413f7bd61061990b66488421d81cfc3" + } + }, + "prefix": "", + "pth": { + "/__editable__.megatron_core-0.16.0rc0.pth": "d55c9b64480b34aae3d4d31e7706b93391c969dec6e0498e50963b03445a57b0", + "/__editable__.rl_kernel-0.1.0.pth": "1454c4987b35762a0d189d4e901c5d077fde62a1944fbaabecea230e57f3923a", + "/__editable__.vime-0.3.2.pth": "77eec5d06d628cb952e65edd813ca88d8db67ccc785083e1b7b29011b92bec4f", + "/distutils-precedence.pth": "2638ce9e2500e572a5e0de7faed6661eb569d1b696fcba07b0dd223da5f5d224", + "/qwen3_next_cuda_runtime.pth": "e0d3ab57dd3ff4f5d55fcf76e83c549cc00b3c813e6f717c540d5ded79fa2f49", + "/qwen3_next_megatron_source.pth": "8556ac057538e82856cb76cbbc954f58312a3f45373daec3eec826031cfd2709", + "/__editable__.rl_kernel-0.1.0.pth": "1454c4987b35762a0d189d4e901c5d077fde62a1944fbaabecea230e57f3923a", + "/distutils-precedence.pth": "2638ce9e2500e572a5e0de7faed6661eb569d1b696fcba07b0dd223da5f5d224", + "/nvidia_cutlass_dsl_packages.pth": "cc710b99ddb3d76361a70461461d274212a979d00c381d821fce5bb3ad9cf246" + }, + "pyvenv_cfg_sha256": "48579f2c6d35c3d535c2690d7d426587c4b8e92021463f0266b38d35dfbbb834", + "sources": { + "/Megatron-LM-training": { + "patch_sha256": "f66035f12501aa1d08e8884e0dea5a22d59825d717aeda73c3e83876e3efd79f", + "path": "/Megatron-LM-training", + "tree": "731fc44a368d6cac8c6171a29d5c687ff0d95bd1" + }, + "/vime": { + "patch_sha256": "66949839d4c18329444f4f9f6dcd702b53ce1b94e9aa15ed111f28743bfaa4b9", + "path": "/vime", + "tree": "f5174e67dbcdaef983eecd45f215fef2d8429dd0" + } + }, + "version": "3.12.14 | packaged by Anaconda, Inc. | (main, Aug 27 2026, 14:46:43) [GCC 14.3.0]" + }, + "sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca" + }, + "memory": { + "limits": { + "/memory.limit_in_bytes": "9223372036854771712", + "/memory.limit_in_bytes": "9223372036854771712", + "/memory.limit_in_bytes": "9223372036854771712" + }, + "cgroup_bytes": null, + "declared_bytes": 549755813888, + "effective_bytes": 549755813888, + "available_bytes": 2081571119104 + }, + "gpu_uuids": [ + "dcc07b03-a36e-3e74-6bac-083b8fbb1ef2", + "7ed20e71-9918-90c0-e6e8-5b63679fc495", + "4e306531-0253-eb59-707b-cb5bd20b2690", + "4159b731-34fc-94af-0054-0b53d5ee025c" + ], + "execution_gpus": 4 +} diff --git a/docs/usage/evidence/qwen3-next-batch-invariance-b200/l2/l2_matrix.json b/docs/usage/evidence/qwen3-next-batch-invariance-b200/l2/l2_matrix.json new file mode 100644 index 000000000..89c29d48b --- /dev/null +++ b/docs/usage/evidence/qwen3-next-batch-invariance-b200/l2/l2_matrix.json @@ -0,0 +1,1186 @@ +{ + "schema_version": 1, + "status": "passed", + "scope": "qwen3_next_full_model_l2", + "identity": { + "scheduler_profile_certificate": { + "path": "/result.json", + "sha256": "fbfb9aca512a01d150f5b6bf4a1f12c77c3292ba279bd7d63e24dbf3a7231ce9" + }, + "source_commit": "759755e08f8a801d617a273fe23b55831f8de194", + "source_tree": "d8da35c889c3ffe57d8569fd9d2c51b063de16ce", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "checkpoint": "", + "weight_version": "baseline", + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "architecture_layers": 48, + "weights_dtype": "bfloat16", + "recurrent_state_dtype": "float32" + }, + "fixture": { + "path": "/inputs/frozen.pt", + "sha256": "7758b688acaa978fd9ad97a32d362e974c833ca4c9886f6571cc80c2010cfc67", + "content_sha256": "790dabd7e86e37bd0746a45b9e452cf24082769580b1c1ae85dcd495ffdcaa99" + }, + "case_ids": [ + "p0008-b1-full", + "p0008-b1-chunked", + "p0008-b4-full", + "p0008-b4-chunked", + "p0064-b1-full", + "p0064-b1-chunked", + "p0064-b4-full", + "p0064-b4-chunked", + "p0256-b1-full", + "p0256-b1-chunked", + "p0256-b4-full", + "p0256-b4-chunked", + "p1024-b1-full", + "p1024-b1-chunked", + "p1024-b4-full", + "p1024-b4-chunked" + ], + "cases": { + "p0008-b1-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "artifacts": { + "rollout": { + "path": "/attempts/0/rollout/p0008-b1-full.pt", + "sha256": "9da19e486018bdb03e670803fe0b3f3b93eb5c18de8905a931fbe0f945c74ff1" + }, + "recompute": { + "path": "/attempts/0/recompute/p0008-b1-full.pt", + "sha256": "d6151c49c194b0c076745f72e3dcb7c85df72a5e7fc312f3a904c5de92accb86" + } + } + }, + "p0008-b1-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "artifacts": { + "rollout": { + "path": "/attempts/0/rollout/p0008-b1-chunked.pt", + "sha256": "532184483347524cb52fb64b8a2fe3c1c76c9c0a8dc4f63aa0dccc891a34c3ba" + }, + "recompute": { + "path": "/attempts/0/recompute/p0008-b1-chunked.pt", + "sha256": "23f9f590454448855d00933f41c7f0c71eb7ee3566639b18c1187a4af75b1774" + } + } + }, + "p0008-b4-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "artifacts": { + "rollout": { + "path": "/attempts/0/rollout/p0008-b4-full.pt", + "sha256": "b2ad00717477db977b15526f11c3e8d0ddc5f1f0862e099ab4cd46331d9ce677" + }, + "recompute": { + "path": "/attempts/0/recompute/p0008-b4-full.pt", + "sha256": "627093fc4bafc61a586496cf42136f3986550776737c02d74d83200647c239c7" + } + } + }, + "p0008-b4-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "artifacts": { + "rollout": { + "path": "/attempts/0/rollout/p0008-b4-chunked.pt", + "sha256": "1d03bb5625262a5a320caefdaf8a8e1e57a056e0ccee9cc648bae0c459e8261d" + }, + "recompute": { + "path": "/attempts/0/recompute/p0008-b4-chunked.pt", + "sha256": "f3f458708bed2df6dc37ddac5af95b25fc02f417237fd3026445eecf467e3322" + } + } + }, + "p0064-b1-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "artifacts": { + "rollout": { + "path": "/attempts/0/rollout/p0064-b1-full.pt", + "sha256": "a2d757f957b1bbcf2d43ae923fedb9c47cd11ce1ecd74e4240e734e417a648ed" + }, + "recompute": { + "path": "/attempts/0/recompute/p0064-b1-full.pt", + "sha256": "4054231f8b0f276bdcc2790e280e98ea195bcfc23217cef0b876fad80a946da8" + } + } + }, + "p0064-b1-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "artifacts": { + "rollout": { + "path": "/attempts/0/rollout/p0064-b1-chunked.pt", + "sha256": "83f90618cadc059cb49216179f79da1659fc7effbc2be9916312262aa4934536" + }, + "recompute": { + "path": "/attempts/0/recompute/p0064-b1-chunked.pt", + "sha256": "439219e25eff547f1a98424b6119b5c2eb558d4b90f1e934046143cf5605ef51" + } + } + }, + "p0064-b4-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "artifacts": { + "rollout": { + "path": "/attempts/0/rollout/p0064-b4-full.pt", + "sha256": "7d67eac0a46f9204e52fdff547d0fda15668e63bdc032f6af34592ffee9dffd8" + }, + "recompute": { + "path": "/attempts/0/recompute/p0064-b4-full.pt", + "sha256": "10537981a1ab67de038169907c4a9010de338e25c6c1b7065013e71dbbfc2360" + } + } + }, + "p0064-b4-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "artifacts": { + "rollout": { + "path": "/attempts/0/rollout/p0064-b4-chunked.pt", + "sha256": "0fff029bc53295c32e81d3e2f4ba1f68e4d849eeb22ab6e5ac85ab1f559e48bf" + }, + "recompute": { + "path": "/attempts/0/recompute/p0064-b4-chunked.pt", + "sha256": "aab05ad73d985926c7c06603356e894211881bc76110ce7665ce58ed6864757c" + } + } + }, + "p0256-b1-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "artifacts": { + "rollout": { + "path": "/attempts/0/rollout/p0256-b1-full.pt", + "sha256": "2bf26b072ca97f5239f48257f4b4ca852a1ce0a4da154e4656c723fde84b0c8a" + }, + "recompute": { + "path": "/attempts/0/recompute/p0256-b1-full.pt", + "sha256": "acd227ae17ccb52c4b8e1739295aaf5421d01942eb25cd8e5726a2a62cf63afb" + } + } + }, + "p0256-b1-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "artifacts": { + "rollout": { + "path": "/attempts/0/rollout/p0256-b1-chunked.pt", + "sha256": "8e86da4998b86c99ce271e26bbbfb43f0fb8decff16ae45d8f439e3f8d777a46" + }, + "recompute": { + "path": "/attempts/0/recompute/p0256-b1-chunked.pt", + "sha256": "1be5266656f70f310e035fc8b657a43398559a8782dd898bdcc6327446ea8a3e" + } + } + }, + "p0256-b4-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "artifacts": { + "rollout": { + "path": "/attempts/0/rollout/p0256-b4-full.pt", + "sha256": "b34d2d292d00669fd17d4dfc4ffd156676ec6201b2abc7c88c76516a3ec531eb" + }, + "recompute": { + "path": "/attempts/0/recompute/p0256-b4-full.pt", + "sha256": "f64cebace179fdd2001a5b7cf0cca80b697ea32bdfaf2d0cd79bc296ec43634a" + } + } + }, + "p0256-b4-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "artifacts": { + "rollout": { + "path": "/attempts/0/rollout/p0256-b4-chunked.pt", + "sha256": "b8e742293b11ce94b3f717fae6e8aa29c5a7185f378a6d528b02c0b29f8f2783" + }, + "recompute": { + "path": "/attempts/0/recompute/p0256-b4-chunked.pt", + "sha256": "edb411a37e4aae00b49d22ab9afb6adba56c4263214ffbd1a6fef293d728ca75" + } + } + }, + "p1024-b1-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "artifacts": { + "rollout": { + "path": "/attempts/0/rollout/p1024-b1-full.pt", + "sha256": "31f9d117ccab9866660eb779ab7308821a2bbe7f9c4d4430432a014781dfc205" + }, + "recompute": { + "path": "/attempts/0/recompute/p1024-b1-full.pt", + "sha256": "6b506f98a6f765159231bd4a718ec391516be6cd5723a0573ff747dbffcf892e" + } + } + }, + "p1024-b1-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "artifacts": { + "rollout": { + "path": "/attempts/0/rollout/p1024-b1-chunked.pt", + "sha256": "fae486bfed2f71c6c2cd02d898267ee64a6755d14b8c09a8c023950f26417794" + }, + "recompute": { + "path": "/attempts/0/recompute/p1024-b1-chunked.pt", + "sha256": "3ec8d8be38c45da163316427e1cb57eba6b6db7b66adfecf9d32599fc60f6ed6" + } + } + }, + "p1024-b4-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "artifacts": { + "rollout": { + "path": "/attempts/0/rollout/p1024-b4-full.pt", + "sha256": "a74beb68fa0949b08d963e53f7882a47c97b45db807b86207e37c5fc6a77138c" + }, + "recompute": { + "path": "/attempts/0/recompute/p1024-b4-full.pt", + "sha256": "4dbae53f9970218a577cb1831a46300a8158860f4ccb6d85941072f7ad014c16" + } + } + }, + "p1024-b4-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "artifacts": { + "rollout": { + "path": "/attempts/0/rollout/p1024-b4-chunked.pt", + "sha256": "8ab0991aa5ecc7bf5142dd66f88276117a7503153c188a7d63b226142a5b05a7" + }, + "recompute": { + "path": "/attempts/0/recompute/p1024-b4-chunked.pt", + "sha256": "3cfba8718145e37f34323843a5c967acfa55a05a611e6853191d5ed03b559f5b" + } + } + } + }, + "processes": { + "rollout": { + "pid": 287347, + "exit_code": 0, + "log": "/attempts/0/rollout.log", + "gpu_release_verified": true + }, + "recompute": { + "pid": 299817, + "exit_code": 0, + "log": "/attempts/0/recompute.log", + "gpu_release_verified": true + } + }, + "worker_results": { + "rollout": { + "path": "/attempts/0/rollout/worker-result.json", + "sha256": "5b5a3146162b6b075efaad847a485e357947e1e3f7fcd1200b3f9d8364513cb9" + }, + "recompute": { + "path": "/attempts/0/recompute/worker-result.json", + "sha256": "d00439eea54c4b082513551a343ef891e4ff1b053eb7684d709023c10a46c544" + } + }, + "raw_bit_comparison": true, + "logits_dtype": "bfloat16", + "logprobs_dtype": "float32", + "response_length": 16, + "vocab_size": 151936, + "provider_binary": { + "path": "/attempts/0/provider-binary.json", + "sha256": "abad81c1a17ddcdb833a37f8390831eb83c20525b8031e67277b660e3df422d6" + } +} diff --git a/docs/usage/evidence/qwen3-next-batch-invariance-b200/l2/operators.json b/docs/usage/evidence/qwen3-next-batch-invariance-b200/l2/operators.json new file mode 100644 index 000000000..a6e914e66 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-batch-invariance-b200/l2/operators.json @@ -0,0 +1,304 @@ +{ + "scope": "qwen3_next_operators_only", + "status": "passed", + "suite": "all", + "diagnostic_only": false, + "full_model_l2": "not_evaluated", + "git_commit": "759755e08f8a801d617a273fe23b55831f8de194", + "git_dirty": false, + "versions": { + "torch": "2.13.0", + "vllm": "0.30.0", + "transformers": "5.17.0", + "triton": "3.7.1" + }, + "mandatory_case_ids": [ + "tests/check_qwen3_next_attention.py::test_d256_backward_with_cached_prefix_matches_float64_formula", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[1024]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[256]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[64]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[8]", + "tests/check_qwen3_next_attention.py::test_d256_input_device_guard_and_nondefault_stream", + "tests/check_qwen3_next_attention.py::test_native_backward_rejects_malformed_probability_and_gradient_buffers", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[0]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[2]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_target_inputs_do_not_depend_on_companions", + "tests/check_qwen3_next_batch_invariance.py::test_triton_chunked_prefill_is_batch_invariant", + "tests/check_qwen3_next_conv_bridge.py::test_chunked_and_reordered_sequences_match", + "tests/check_qwen3_next_conv_bridge.py::test_empty_sequence_preserves_cache_and_gradients", + "tests/check_qwen3_next_conv_bridge.py::test_response_gradient_reaches_prompt_and_convolution_weight", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths0]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths1]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths2]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-4]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[1]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[4]", + "tests/check_qwen3_next_core_matrix.py::test_variable_lengths_empty_and_mixed_step_match_independent_sequences", + "tests/check_qwen3_next_forward.py::test_combine_has_fixed_route_order_and_differentiable_weights", + "tests/check_qwen3_next_forward.py::test_full_vocabulary_logprob_entropy_modes_and_gradient", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_fail_closed_on_the_tensor_descriptor_path", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[128]", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[512]", + "tests/check_qwen3_next_forward.py::test_logprob_nan_rejected_before_comparison", + "tests/check_qwen3_next_forward.py::test_moe_vjp_matches_independent_double_formula", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[1024-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[128-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-16]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-256]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-3072]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-37984]", + "tests/check_qwen3_next_forward.py::test_qwen_moe_actual_tp4_shapes_and_independent_training_forward", + "tests/check_qwen3_next_forward.py::test_route_weights_are_batch_invariant", + "tests/check_qwen3_next_forward.py::test_shared_linear_vjp_and_empty_tokens", + "tests/check_qwen3_next_forward.py::test_stable_route_tie_boundary_and_router_gradient", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_backward_matches_recomputed_recurrence_vjp", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_forward_is_provider_exact_and_does_not_mutate_inputs", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_keeps_prompt_state_gradient_through_response", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[False]", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[True]", + "tests/check_qwen3_next_gdn_bridge.py::test_initial_state_vjp_matches_provider_directional_difference", + "tests/check_qwen3_next_gdn_sequence.py::test_1024_token_chunk_continuation_is_bitwise_exact", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad0]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad1]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad2]", + "tests/check_qwen3_next_gdn_sequence.py::test_chunk_boundary_retains_prompt_and_initial_state_gradients", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths0]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths1]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths2]", + "tests/check_qwen3_next_gdn_sequence.py::test_reserved_and_duplicate_slots_are_rejected", + "tests/check_qwen3_next_norm_providers.py::test_custom_op_has_distinct_native_and_cuda_paths", + "tests/check_qwen3_next_norm_providers.py::test_gdn_decode_provider_env_defaults_are_recorded", + "tests/check_qwen3_next_norm_providers.py::test_our_gated_op_is_batch_invariant", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_cuda]", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_native]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots0]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots2]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots3]", + "tests/check_qwen3_next_shared_core.py::test_independent_training_forward_matches_inference_and_retains_gradients", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[1024]", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[8]", + "tests/check_qwen3_next_shared_core.py::test_unimplemented_provider_profile_is_rejected", + "tests/test_qwen3_next_norm.py::test_bad_weight_shape_raises", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[16]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[1]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[2]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[32]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[48]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[64]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[8]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[128]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[2048]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_with_padding", + "tests/test_qwen3_next_norm.py::test_call_matches_forward", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[128]", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[2048]", + "tests/test_qwen3_next_norm.py::test_cuda_default_offset_preserves_plain_convention", + "tests/test_qwen3_next_norm.py::test_cuda_gated_backward_matches_autograd_golden", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_matches_golden_within_contract", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_bad_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_mismatched_gate", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_backward_uses_the_sigmoid_derivative", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_swish_is_an_alias_for_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_unit_weight_is_plain_norm_times_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_weight_offset_is_applied_in_fp32", + "tests/test_qwen3_next_norm.py::test_cuda_gated_wrapper_rejects_equal_numel_wrong_shape", + "tests/test_qwen3_next_norm.py::test_cuda_gated_zero_gate_zeroes_output", + "tests/test_qwen3_next_norm.py::test_cuda_offset_equals_explicit_fp32_weight", + "tests/test_qwen3_next_norm.py::test_cuda_offset_is_not_folded_through_bfloat16", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_backward_is_offset_aware", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_within_tolerance_of_golden", + "tests/test_qwen3_next_norm.py::test_deterministic_repeat", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype0]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype1]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype2]", + "tests/test_qwen3_next_norm.py::test_eps_inside_sqrt", + "tests/test_qwen3_next_norm.py::test_gated_batch_invariance_slice", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedHFOp]", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedOp]", + "tests/test_qwen3_next_norm.py::test_gated_conventions_diverge_in_low_precision", + "tests/test_qwen3_next_norm.py::test_gated_cuda_op_rejects_bad_activation_at_construction", + "tests/test_qwen3_next_norm.py::test_gated_extension_handles_empty_batch_and_nondefault_stream", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[dy_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[gate_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[rstd_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_shape]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_matches_hf_formula_fp32", + "tests/test_qwen3_next_norm.py::test_gated_shape_mismatch_raises", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_strict_matches_vllm_formula_fp32", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[128]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[2048]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_offset_applied_in_fp32_not_folded_into_bf16", + "tests/test_qwen3_next_norm.py::test_op_batch_invariance_on_device", + "tests/test_qwen3_next_norm.py::test_plain_reference_is_unchanged_by_the_offset_plumbing", + "tests/test_qwen3_next_norm.py::test_weight_offset_is_one", + "tests/test_qwen3_next_norm.py::test_zero_centred_cuda_constructor_rejects_missing_extension", + "tests/test_qwen3_next_norm.py::test_zero_centred_op_inherits_the_plain_reference", + "tests/test_qwen3_next_norm.py::test_zero_weight_is_identity_scaling" + ], + "case_ids_sha256": "694c931b65f9cfa5db963f2eca6d11bd309546c824a1df52f9da2ab128e83e0f", + "pytest_exit_code": 0, + "provider_tests": { + "tests": 233, + "failures": 0, + "errors": 0, + "skipped": 0 + }, + "norm_gates": { + "qwen3_next_rms_norm-forward.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + }, + "qwen3_next_rms_norm-gradient.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + }, + "rms_norm_gated-forward.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + }, + "rms_norm_gated-gradient.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + } + } +} diff --git a/docs/usage/evidence/qwen3-next-batch-invariance-b200/l2/predecessor.json b/docs/usage/evidence/qwen3-next-batch-invariance-b200/l2/predecessor.json new file mode 100644 index 000000000..8b3df6c6a --- /dev/null +++ b/docs/usage/evidence/qwen3-next-batch-invariance-b200/l2/predecessor.json @@ -0,0 +1,5 @@ +{ + "run_id": "20261009T052932Z-layers-759755e0-cb5e9870", + "execution_id": "cb5e9870d45442a3b93cdf8cee8ab4db", + "result_sha256": "fbfb9aca512a01d150f5b6bf4a1f12c77c3292ba279bd7d63e24dbf3a7231ce9" +} diff --git a/docs/usage/evidence/qwen3-next-batch-invariance-b200/l2/provider_binary.json b/docs/usage/evidence/qwen3-next-batch-invariance-b200/l2/provider_binary.json new file mode 100644 index 000000000..f7dfae1e7 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-batch-invariance-b200/l2/provider_binary.json @@ -0,0 +1,13 @@ +{ + "schema_version": 1, + "source_tree": "d8da35c889c3ffe57d8569fd9d2c51b063de16ce", + "actual": { + "module": "rl_engine._C", + "path": "/source/rl_engine/_C.cpython-312-x86_64-linux-gnu.so", + "sha256": "fa54ee44a3477b422b68918b2223984a26fa4a58ca454f35bbca5ec4b89a1682" + }, + "archive": { + "path": "/attempts/0/provider-binary.so", + "sha256": "fa54ee44a3477b422b68918b2223984a26fa4a58ca454f35bbca5ec4b89a1682" + } +} diff --git a/docs/usage/evidence/qwen3-next-batch-invariance-b200/l2/result.json b/docs/usage/evidence/qwen3-next-batch-invariance-b200/l2/result.json new file mode 100644 index 000000000..7184cfae9 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-batch-invariance-b200/l2/result.json @@ -0,0 +1,775 @@ +{ + "contract_version": 4, + "source_tree": "d8da35c889c3ffe57d8569fd9d2c51b063de16ce", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "cuda_identity": { + "home": "", + "nvcc_sha256": "b8e2347d9d7fcadf8812a27324d515de99d033d3e48611811ece7e66d7895f8a" + }, + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "operator_requirements": { + "suite": "all", + "case_ids": [ + "tests/check_qwen3_next_attention.py::test_d256_backward_with_cached_prefix_matches_float64_formula", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[1024]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[256]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[64]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[8]", + "tests/check_qwen3_next_attention.py::test_d256_input_device_guard_and_nondefault_stream", + "tests/check_qwen3_next_attention.py::test_native_backward_rejects_malformed_probability_and_gradient_buffers", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[0]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[2]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_target_inputs_do_not_depend_on_companions", + "tests/check_qwen3_next_batch_invariance.py::test_triton_chunked_prefill_is_batch_invariant", + "tests/check_qwen3_next_conv_bridge.py::test_chunked_and_reordered_sequences_match", + "tests/check_qwen3_next_conv_bridge.py::test_empty_sequence_preserves_cache_and_gradients", + "tests/check_qwen3_next_conv_bridge.py::test_response_gradient_reaches_prompt_and_convolution_weight", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths0]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths1]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths2]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-4]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[1]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[4]", + "tests/check_qwen3_next_core_matrix.py::test_variable_lengths_empty_and_mixed_step_match_independent_sequences", + "tests/check_qwen3_next_forward.py::test_combine_has_fixed_route_order_and_differentiable_weights", + "tests/check_qwen3_next_forward.py::test_full_vocabulary_logprob_entropy_modes_and_gradient", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_fail_closed_on_the_tensor_descriptor_path", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[128]", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[512]", + "tests/check_qwen3_next_forward.py::test_logprob_nan_rejected_before_comparison", + "tests/check_qwen3_next_forward.py::test_moe_vjp_matches_independent_double_formula", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[1024-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[128-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-16]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-256]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-3072]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-37984]", + "tests/check_qwen3_next_forward.py::test_qwen_moe_actual_tp4_shapes_and_independent_training_forward", + "tests/check_qwen3_next_forward.py::test_route_weights_are_batch_invariant", + "tests/check_qwen3_next_forward.py::test_shared_linear_vjp_and_empty_tokens", + "tests/check_qwen3_next_forward.py::test_stable_route_tie_boundary_and_router_gradient", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_backward_matches_recomputed_recurrence_vjp", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_forward_is_provider_exact_and_does_not_mutate_inputs", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_keeps_prompt_state_gradient_through_response", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[False]", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[True]", + "tests/check_qwen3_next_gdn_bridge.py::test_initial_state_vjp_matches_provider_directional_difference", + "tests/check_qwen3_next_gdn_sequence.py::test_1024_token_chunk_continuation_is_bitwise_exact", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad0]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad1]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad2]", + "tests/check_qwen3_next_gdn_sequence.py::test_chunk_boundary_retains_prompt_and_initial_state_gradients", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths0]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths1]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths2]", + "tests/check_qwen3_next_gdn_sequence.py::test_reserved_and_duplicate_slots_are_rejected", + "tests/check_qwen3_next_norm_providers.py::test_custom_op_has_distinct_native_and_cuda_paths", + "tests/check_qwen3_next_norm_providers.py::test_gdn_decode_provider_env_defaults_are_recorded", + "tests/check_qwen3_next_norm_providers.py::test_our_gated_op_is_batch_invariant", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_cuda]", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_native]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots0]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots2]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots3]", + "tests/check_qwen3_next_shared_core.py::test_independent_training_forward_matches_inference_and_retains_gradients", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[1024]", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[8]", + "tests/check_qwen3_next_shared_core.py::test_unimplemented_provider_profile_is_rejected", + "tests/test_qwen3_next_norm.py::test_bad_weight_shape_raises", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[16]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[1]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[2]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[32]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[48]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[64]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[8]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[128]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[2048]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_with_padding", + "tests/test_qwen3_next_norm.py::test_call_matches_forward", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[128]", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[2048]", + "tests/test_qwen3_next_norm.py::test_cuda_default_offset_preserves_plain_convention", + "tests/test_qwen3_next_norm.py::test_cuda_gated_backward_matches_autograd_golden", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_matches_golden_within_contract", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_bad_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_mismatched_gate", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_backward_uses_the_sigmoid_derivative", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_swish_is_an_alias_for_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_unit_weight_is_plain_norm_times_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_weight_offset_is_applied_in_fp32", + "tests/test_qwen3_next_norm.py::test_cuda_gated_wrapper_rejects_equal_numel_wrong_shape", + "tests/test_qwen3_next_norm.py::test_cuda_gated_zero_gate_zeroes_output", + "tests/test_qwen3_next_norm.py::test_cuda_offset_equals_explicit_fp32_weight", + "tests/test_qwen3_next_norm.py::test_cuda_offset_is_not_folded_through_bfloat16", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_backward_is_offset_aware", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_within_tolerance_of_golden", + "tests/test_qwen3_next_norm.py::test_deterministic_repeat", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype0]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype1]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype2]", + "tests/test_qwen3_next_norm.py::test_eps_inside_sqrt", + "tests/test_qwen3_next_norm.py::test_gated_batch_invariance_slice", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedHFOp]", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedOp]", + "tests/test_qwen3_next_norm.py::test_gated_conventions_diverge_in_low_precision", + "tests/test_qwen3_next_norm.py::test_gated_cuda_op_rejects_bad_activation_at_construction", + "tests/test_qwen3_next_norm.py::test_gated_extension_handles_empty_batch_and_nondefault_stream", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[dy_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[gate_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[rstd_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_shape]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_matches_hf_formula_fp32", + "tests/test_qwen3_next_norm.py::test_gated_shape_mismatch_raises", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_strict_matches_vllm_formula_fp32", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[128]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[2048]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_offset_applied_in_fp32_not_folded_into_bf16", + "tests/test_qwen3_next_norm.py::test_op_batch_invariance_on_device", + "tests/test_qwen3_next_norm.py::test_plain_reference_is_unchanged_by_the_offset_plumbing", + "tests/test_qwen3_next_norm.py::test_weight_offset_is_one", + "tests/test_qwen3_next_norm.py::test_zero_centred_cuda_constructor_rejects_missing_extension", + "tests/test_qwen3_next_norm.py::test_zero_centred_op_inherits_the_plain_reference", + "tests/test_qwen3_next_norm.py::test_zero_weight_is_identity_scaling" + ], + "case_ids_sha256": "694c931b65f9cfa5db963f2eca6d11bd309546c824a1df52f9da2ab128e83e0f", + "norm_gates": [ + "qwen3_next_rms_norm-forward.json", + "qwen3_next_rms_norm-gradient.json", + "rms_norm_gated-forward.json", + "rms_norm_gated-gradient.json" + ] + }, + "layer_requirements": { + "schema_version": 1, + "gates": { + "gdn": { + "script": "scripts/qwen3_next_tp_gdn_check.py", + "output_option": "--output", + "scope": "tp4_gdn_layer0", + "groups": { + "cases": [ + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "prompt-gradient", + "replicated-norm-gradient", + "hf-load-export" + ] + }, + "script_sha256": "cc4338893f90af004c51c20fc67d1a9a3f4bf8d26775277f72671c02983e4df5" + }, + "attention": { + "script": "scripts/qwen3_next_tp_attention_check.py", + "output_option": "--output", + "scope": "tp4_full_attention_layer3", + "groups": { + "attention.cases": [ + "hf-load-export", + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "batch4-varlen-reorder", + "sixteen-token-decode", + "prompt-gradient", + "kv-pair-gradient", + "qk-norm-gradient" + ] + }, + "script_sha256": "d27d43efb05415a8ef5892c3c2238a2b9744a4821f5466faf46c6510e6e01bec" + }, + "moe": { + "script": "scripts/qwen3_next_tp_moe_check.py", + "output_option": "--output", + "scope": "tp4_moe_block_layer0", + "groups": { + "moe.cases": [ + "hf-load-export-all512experts", + "routes-replicated-8", + "full-chunk-reorder-8", + "routes-replicated-64", + "full-chunk-reorder-64", + "routes-replicated-256", + "full-chunk-reorder-256", + "routes-replicated-1024", + "full-chunk-reorder-1024", + "training-forward", + "all-parameter-gradient", + "replicated-router-gradient" + ] + }, + "script_sha256": "d5c1bbbb82e408b65871b0cb1638d7a6cf8cfe07f0a3315a657b7dc232d544be" + }, + "adapters": { + "script": "scripts/qwen3_next_adapter_check.py", + "output_option": "--out", + "scope": "gdn_engine_adapter_component", + "groups": { + "cases": [ + "batch1-length8", + "batch1-length64", + "batch1-length256", + "batch1-length1024", + "batch4-length8", + "batch4-length64", + "batch4-length256", + "batch4-length1024", + "mixed-prefill-decode16-reorder" + ] + }, + "fields": { + "prompt_gradient": "passed", + "hf_conv_roundtrip": "passed", + "batch_invariance_capability_registered": false + }, + "script_sha256": "3ce45bb317237c1a06533116d65fb77c2a23b6f503ae46406ede543036eb0f20" + }, + "heads": { + "script": "scripts/qwen3_next_tp_head_check.py", + "output_option": "--output", + "scope": "tp4_embedding_lm_head_only", + "groups": { + "cases": [ + "hf-embedding-roundtrip", + "hf-lm-head-roundtrip", + "replicated-norm-gradient", + "nonzero-finite-embedding-head-gradient", + "embedding-repeat-100", + "batch-invariant-prompt8", + "batch-invariant-prompt64", + "batch-invariant-prompt256", + "batch-invariant-prompt1024", + "logprob-original-and-promoted-logits", + "entropy-interface" + ] + }, + "script_sha256": "0504185d21a75405c8e994bc57b016cf4ec357d8b16e7430772c11934f2af876" + } + }, + "scheduler_case_ids": [ + "p0008-b1-full", + "p0008-b1-chunked", + "p0008-b4-full", + "p0008-b4-chunked", + "p0064-b1-full", + "p0064-b1-chunked", + "p0064-b4-full", + "p0064-b4-chunked", + "p0256-b1-full", + "p0256-b1-chunked", + "p0256-b4-full", + "p0256-b4-chunked", + "p1024-b1-full", + "p1024-b1-chunked", + "p1024-b4-full", + "p1024-b4-chunked" + ], + "registry_sha256": "e3949a750cb27c1897a000f3b023f912629906612ae8949c1575d0acc36df5ec", + "case_ids_per_rank": [ + "adapters/cases/batch1-length1024", + "adapters/cases/batch1-length256", + "adapters/cases/batch1-length64", + "adapters/cases/batch1-length8", + "adapters/cases/batch4-length1024", + "adapters/cases/batch4-length256", + "adapters/cases/batch4-length64", + "adapters/cases/batch4-length8", + "adapters/cases/mixed-prefill-decode16-reorder", + "attention/attention.cases/batch4-varlen-reorder", + "attention/attention.cases/full-chunk-1024", + "attention/attention.cases/full-chunk-256", + "attention/attention.cases/full-chunk-64", + "attention/attention.cases/full-chunk-8", + "attention/attention.cases/hf-load-export", + "attention/attention.cases/kv-pair-gradient", + "attention/attention.cases/prompt-gradient", + "attention/attention.cases/qk-norm-gradient", + "attention/attention.cases/sixteen-token-decode", + "gdn/cases/full-chunk-1024", + "gdn/cases/full-chunk-256", + "gdn/cases/full-chunk-64", + "gdn/cases/full-chunk-8", + "gdn/cases/hf-load-export", + "gdn/cases/prompt-gradient", + "gdn/cases/replicated-norm-gradient", + "heads/cases/batch-invariant-prompt1024", + "heads/cases/batch-invariant-prompt256", + "heads/cases/batch-invariant-prompt64", + "heads/cases/batch-invariant-prompt8", + "heads/cases/embedding-repeat-100", + "heads/cases/entropy-interface", + "heads/cases/hf-embedding-roundtrip", + "heads/cases/hf-lm-head-roundtrip", + "heads/cases/logprob-original-and-promoted-logits", + "heads/cases/nonzero-finite-embedding-head-gradient", + "heads/cases/replicated-norm-gradient", + "moe/moe.cases/all-parameter-gradient", + "moe/moe.cases/full-chunk-reorder-1024", + "moe/moe.cases/full-chunk-reorder-256", + "moe/moe.cases/full-chunk-reorder-64", + "moe/moe.cases/full-chunk-reorder-8", + "moe/moe.cases/hf-load-export-all512experts", + "moe/moe.cases/replicated-router-gradient", + "moe/moe.cases/routes-replicated-1024", + "moe/moe.cases/routes-replicated-256", + "moe/moe.cases/routes-replicated-64", + "moe/moe.cases/routes-replicated-8", + "moe/moe.cases/training-forward" + ], + "case_ids_sha256": "be74417dfbd6031ba27978d06d04bb15daaab2aeb57d132c7e0d41176b28b46e" + }, + "source_commit": "759755e08f8a801d617a273fe23b55831f8de194", + "run_id": "20261009T055236Z-l2-759755e0-ca279ba5", + "stage": "l2", + "suite": "all", + "execution_id": "ca279ba511664422840bc5fd3b11ffa5", + "attempt": "0", + "status": "passed", + "phase": "complete", + "scope": "qwen3_next_full_model_l2", + "full_model_l2": "passed", + "evidence": { + "operators": { + "path": "attempts/0/operators.json", + "sha256": "bb96af8122ba0c79d94ba00fc8f67c18d1d5cb1d3806a4c372ec0f0f19ab52c5" + }, + "environment": { + "path": "attempts/0/environment.json", + "sha256": "698678f0d71afecb3199c9b76a3ac07664b6122116b079ff37c8bd70a289646f" + }, + "l2_matrix": { + "path": "attempts/0/l2-matrix.json", + "sha256": "496766c995763f1c4699b14c587d54e3b479a9c3219dd40a485c666aa1554ac3" + }, + "predecessor": { + "path": "attempts/0/predecessor-evidence.json", + "sha256": "8e5ff1f1c4c94fd654b77d29d65b71e839adb97eea9a6e73d7d7c02ec80c3cbf" + }, + "provider_binary": { + "path": "attempts/0/provider-binary.json", + "sha256": "abad81c1a17ddcdb833a37f8390831eb83c20525b8031e67277b660e3df422d6" + } + } +} diff --git a/docs/usage/evidence/qwen3-next-batch-invariance-b200/l2/run.json b/docs/usage/evidence/qwen3-next-batch-invariance-b200/l2/run.json new file mode 100644 index 000000000..a42569b69 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-batch-invariance-b200/l2/run.json @@ -0,0 +1,5252 @@ +{ + "run_id": "20261009T055236Z-l2-759755e0-ca279ba5", + "execution_id": "ca279ba511664422840bc5fd3b11ffa5", + "contract_version": 4, + "suite": "all", + "execution_gpus": 4, + "source_tree": "d8da35c889c3ffe57d8569fd9d2c51b063de16ce", + "stage": "l2", + "source_commit": "759755e08f8a801d617a273fe23b55831f8de194", + "source": "/source", + "python": "", + "cuda_home": "", + "checkpoint": "", + "memory": "512G", + "previous": "", + "status": "prepared", + "full_model_l2": "not_evaluated", + "environment": { + "identity": { + "base_prefix": "/miniconda3/envs/rlkernel", + "binary": "/python3.12", + "binary_sha256": "6a1eb3ffc29f3a6b0ece607b016b4cfa5ca3ac57b34f17ed3266b404f78d2729", + "build_tools": { + "ninja": { + "path": "/miniconda3/envs/rlkernel/bin/ninja", + "sha256": "08639e194fffa7f08b259fc4abfa4803aff66b64de52549cee42ec527d55cea6" + } + }, + "distributions": [ + { + "direct_url": null, + "metadata_sha256": "6f1038270be40f9b8c0bcf391c627e7d7f41ccdd19aa192d6eac1dbfc3b19abc", + "name": "GitPython", + "version": "3.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "3f71971502087521f123c9daa26bc12d31d3466738b567390b8602acad3be22a", + "name": "Jinja2", + "version": "3.1.6" + }, + { + "direct_url": null, + "metadata_sha256": "818fb343b7b6b99a32771bf4813521ae6440b4c7579b3ae46e32dd02da0afeee", + "name": "Markdown", + "version": "3.11" + }, + { + "direct_url": null, + "metadata_sha256": "dc1ee42cf8ecfeee0ab60b15b21d291833e0732548efcb7bb5b3564dca3e5bf7", + "name": "MarkupSafe", + "version": "3.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "de7389b142450a0014234286b0876f328439b823c355c73d0aed41fd67ec208c", + "name": "PyJWT", + "version": "2.15.1" + }, + { + "direct_url": null, + "metadata_sha256": "ffcad4415cafb22b8b536a61595e9ee13438b51d31b0763c1b273ce3bc58e840", + "name": "PyYAML", + "version": "6.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "8562d701cc52d9cafbb418942b0e072fc087ed8ddcf35cd10224c1b2ed8bdd91", + "name": "Pygments", + "version": "2.21.0" + }, + { + "direct_url": null, + "metadata_sha256": "b6c25fcfdcc495edf248a10ca4ad28327ef2ed6047a6ec5c6346e121414c7f21", + "name": "Werkzeug", + "version": "3.1.9" + }, + { + "direct_url": null, + "metadata_sha256": "55c400d24c71b581d9c0992f71df6047cf6c878bebe61a7d45d6e02dc0e4c510", + "name": "absl-py", + "version": "2.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "13db521f90a6a882027b2388eaa2ebf252945f9c2adb7e7e371da18239da4df0", + "name": "accelerate", + "version": "1.15.0" + }, + { + "direct_url": null, + "metadata_sha256": "86fe44e38e67872dd895c729044942ba2c2f934ae439a899fb83a186206b7fd4", + "name": "agent-detector", + "version": "2.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "afe11fe9f5aa54e734cdd51659bed8c89dc6bcd5aef0ad96f2d20149c8de5456", + "name": "aiohappyeyeballs", + "version": "2.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "570b307bc0b53fbbd3ed2ce0b7eca6bbf2fa73bf75e24a480f1034d8c0b832bf", + "name": "aiohttp", + "version": "3.14.3" + }, + { + "direct_url": null, + "metadata_sha256": "44b7f8e14c4770793e747fad50c9e0a6ee7357651d878554f192d94768dc14a8", + "name": "aiohttp-cors", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "648813a44a9ae0ab2f20ee86d2404dcc38e3f9e80c63316cf6e536735df14e54", + "name": "aiosignal", + "version": "1.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "f6a3f6668bacef7f73a2c19ccb2be910b2363d1731c4725cb04364d99e24935a", + "name": "annotated-doc", + "version": "0.0.5" + }, + { + "direct_url": null, + "metadata_sha256": "fc6d752cde6a6a4bff03474386de750e130b75da3c7815ee909f45b51fea98c8", + "name": "annotated-types", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "4e89d670a4b20029da30e5a9e8ebcbc844deff9c44209552bafd5537249c8b9e", + "name": "anthropic", + "version": "1.9.0" + }, + { + "direct_url": null, + "metadata_sha256": "b5a6f00800956387fcddab1fe1b5aa8502c249b86cfb16d58ed700f282f60142", + "name": "antlr4-python3-runtime", + "version": "4.9.3" + }, + { + "direct_url": null, + "metadata_sha256": "a6008defa9492cd08250217b134782cad1db4580e1d7ddf69cc2a2a48cea24e0", + "name": "anyio", + "version": "4.15.1" + }, + { + "direct_url": null, + "metadata_sha256": "7877c64ce8957237363f2df313819bb07f50752df016d14c5a5a99bec10f5deb", + "name": "apache-tvm-ffi", + "version": "0.1.11" + }, + { + "direct_url": null, + "metadata_sha256": "3543ca8f0e072c00ab111b20eba99ce86dbf93ada28988775bc2677284b3c07a", + "name": "astor", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "d4b328c09c024fe1e4d788a9c7715ad726095131b815cd35fd933268226f6269", + "name": "attrs", + "version": "26.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "4850c4d696a5e2a2ecbb3dd792b060acc1de79e09800669b0b9fc3a22c055e6d", + "name": "av", + "version": "19.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "863ff92208d0a02dabfa008bfe91846a5c401ded301e5687dca7dc63c911865f", + "name": "babel", + "version": "2.18.0" + }, + { + "direct_url": null, + "metadata_sha256": "f32e6df3197f05202e586624d95c5e217003d80cee655c165d533102f628df21", + "name": "backrefs", + "version": "8.0" + }, + { + "direct_url": null, + "metadata_sha256": "905c362f655fbc6d37a24686efc2b3bfbd3123b8ee5a443a43f6750d87455e90", + "name": "blake3", + "version": "1.0.10" + }, + { + "direct_url": null, + "metadata_sha256": "07c85682b6aefd5c9b48890d306c1604311902295704892ede48e5a83219a8d3", + "name": "blobfile", + "version": "3.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "2d582941a7081625a35f35a0c4a2e80f7737312e29c38e5fdb6fc08f9c113077", + "name": "bracex", + "version": "3.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "3b60c55bae0d0340c3a3fd918635bbfa3087579da66e0fd7f6be7a3782c0da3d", + "name": "cachetools", + "version": "7.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "5d11a6878d5bc3f22290281a19ef7b36daa95c910780950608b95cd788c7e12e", + "name": "cbor2", + "version": "6.1.4" + }, + { + "direct_url": null, + "metadata_sha256": "362c9942c48051f168ed2b9f2146266b7792d3c05e164cd6afc3f3b65884fdc9", + "name": "certifi", + "version": "2026.7.22" + }, + { + "direct_url": null, + "metadata_sha256": "b4abf1bcf1c1d8e0272d8007fc974499ea59e5f2a5b98af3c78a5e67515a9d87", + "name": "cffi", + "version": "2.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "766120f13c177446f51929a4d201104bc935b6d5a2a176cd6716edce757d3d95", + "name": "cfgv", + "version": "3.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "610e9a9d03ce837ffe6e42be5e02e70087f73863f7350bf7bb7f0511edcc5ec0", + "name": "charset-normalizer", + "version": "3.5.2" + }, + { + "direct_url": null, + "metadata_sha256": "7ad836b3147c9702546d9c28b4fa5be23b24445439db5d0d2a58d17281c84daa", + "name": "click", + "version": "8.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "4c5f00599ebcbf11d337e48a72784d256ca3d704fa9e9f5daadd60065e6776b7", + "name": "cloudpickle", + "version": "3.1.2" + }, + { + "direct_url": null, + "metadata_sha256": "a0970189e3ab7a596d6902d5f61f93b414f138f03d3cf19029145657bfceb382", + "name": "cmake", + "version": "4.1.2" + }, + { + "direct_url": null, + "metadata_sha256": "94a6ebf9718e55f254a43ce0d2f04e0d6d44e7141b6f3144a84feb6519a77bfd", + "name": "colorama", + "version": "0.4.6" + }, + { + "direct_url": null, + "metadata_sha256": "ca8ec227f406d970a645ec482b20619128dd34b9cf71159cc24e27db461a2711", + "name": "colorful", + "version": "0.5.8" + }, + { + "direct_url": null, + "metadata_sha256": "bbaa51b7e4d8f142bd075d01257c0572c0c844796d51426e35c8096a13e8da76", + "name": "compressed-tensors", + "version": "0.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "6063d8ff7ebc458d63a4332853d7ababf4ee2b86336362c8d2b12be6e998eb6b", + "name": "connectrpc", + "version": "0.11.1" + }, + { + "direct_url": null, + "metadata_sha256": "ac5f4b5a5f68080bd9c3fe77399fe8a1bff2ee5923c49db1df544dd054cbf15b", + "name": "cryptography", + "version": "50.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "f41d2f6b4616accca2f5e1dd47aa9e8937c28076cde698226d93e727751f3099", + "name": "cuda-bindings", + "version": "13.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "e5ca6ed34c687c6f4a4d157ad0a2cf06ec0316fe8c4c0ddeb666ad76dd6f30f4", + "name": "cuda-core", + "version": "1.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "89baadd9da23dce9990481519544115615ba3cbd2d1a41e09feea7756fffb378", + "name": "cuda-pathfinder", + "version": "1.8.2" + }, + { + "direct_url": null, + "metadata_sha256": "1ab914b9a57ca601df2e3cfe9608427b15d8afb78029076ace5d1caf9fd45f08", + "name": "cuda-python", + "version": "13.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "73d97a5eb578223b4895ef4f234574d14219cef9999ff7d0e92a3d0dd057bd3f", + "name": "cuda-tile", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "ae6f957fe66ed63081d1d83ee6e8838f3a0af2c6fce1223629d0dd6264565ead", + "name": "cuda-toolkit", + "version": "13.0.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "1f8e0ae51ad5feea63f58ed2e24f3da6f23ed548043235a14f7623d961dd9b64", + "name": "datasets", + "version": "5.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "153f4a4d6ff03dbe5c8ad7fe54bc2e7b989a4947b70f7aa77fbf652b394f2a2e", + "name": "depyf", + "version": "0.20.0" + }, + { + "direct_url": null, + "metadata_sha256": "ee09fc752d7271aac93079cfd63409957dc6b536c1ffd9355a01bf7297e72aa6", + "name": "detect-installer", + "version": "0.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "a7feab2c4f69fd5f85e5a3cb495a7f1870a6bf8199dcee5339e8118f7acbdc09", + "name": "dill", + "version": "0.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "fef3fde661fe30ba7bd1d78841a797136b2b3461705bb4eb92dc54f8308bbaae", + "name": "distlib", + "version": "0.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "fef3fde661fe30ba7bd1d78841a797136b2b3461705bb4eb92dc54f8308bbaae", + "name": "distlib", + "version": "0.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "a3ca2e39abe76c4a33d5fe4a2a84375ec9f25cdfdb7e1d8ea406bd6f1603205c", + "name": "dnspython", + "version": "2.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "92a07daad5e6ff461199de14e845d9b376e309ef916ce5379f3c9cd4e3b1623f", + "name": "dockerfile-parse", + "version": "2.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "5b566b25f0cbe4955d0b16844a7cc6d2002caa3bde2dfda7f301fd8870cbaa56", + "name": "docstring_parser", + "version": "0.18.0" + }, + { + "direct_url": null, + "metadata_sha256": "5a1080b5768c6c591e1c4f9c9812cafa808781b9eeb198043bf185e22d4a1613", + "name": "e2b", + "version": "2.51.0" + }, + { + "direct_url": null, + "metadata_sha256": "0a63979e0b946e16238e4339e60d9c1eb5a7ce3ea93dae78b5da9c65a6190540", + "name": "einops", + "version": "0.8.2" + }, + { + "direct_url": null, + "metadata_sha256": "16cbe67a57558f1d4bfdbc22a454434ba301750c57a62b1d3f5361c9e5cddc00", + "name": "email-validator", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "0617ddb55b90b42ddc9398dc7e91d61fe928a2504939f76526dc15b22d238caa", + "name": "fastapi", + "version": "0.136.3" + }, + { + "direct_url": null, + "metadata_sha256": "ddd82b9666c21988e234d623e2575e1b89fd4133260eeab43fc9a7c074f7024a", + "name": "fastapi-cli", + "version": "0.0.32" + }, + { + "direct_url": null, + "metadata_sha256": "611602e834d42e10433155ff5f5581358d732fa6b6f6f7820a8f79e74b1ce1f9", + "name": "fastapi-cloud-cli", + "version": "0.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "794524e4a9659bda6043721d848d028ea49996085a33326094fbaaa3f6e6b895", + "name": "fastar", + "version": "0.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "711401d36e60e10e35beb4d0f1bb42bf0c4d86339ae52f32b9aa4a4d790530dd", + "name": "fastsafetensors", + "version": "0.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "efaea9742e348c4c4bdcc6f616a33cc5aa3ae926494a72a46690b7da2f08ed5c", + "name": "filelock", + "version": "4.0.7" + }, + { + "direct_url": null, + "metadata_sha256": "99bd6c3f10781d3d2d350f2c3c9fc4765b55f25de8a6d6dd1f71501802d1255e", + "name": "fla-core", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "0a6ef979b75295cee2b5293ad4942b0cf2682e9e38680203064e0b70249c1a96", + "name": "flash-linear-attention", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "76b70a11ca82ea4606b529e7a8658cb3fe71412afa46f2ed57101dd91ba27558", + "name": "flashinfer-python", + "version": "0.6.18.post1" + }, + { + "direct_url": null, + "metadata_sha256": "ba8ff415192b5cbb90efce046e2271a00c8184afc362d8b47fbbc84d5e558b05", + "name": "frozenlist", + "version": "1.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "e7712831c80eb13b08fb7f7cc33988a8f24654af9eba7c6f5f943b2636e4306a", + "name": "fsspec", + "version": "2026.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "025de85c794878d0caa737869307447595f514ebf9599eacb5b1a501bae479b6", + "name": "fsspec", + "version": "2026.9.0" + }, + { + "direct_url": null, + "metadata_sha256": "ca94883bdeaa3740b45b6994443b445fd67c6e4a8064ac3bf9d92d2a5221eee8", + "name": "ghp-import", + "version": "2.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "a7e90983562a035cf767baa63d8c32bc37e1de7cad71ac7b6b2bc70a95bba4eb", + "name": "gitdb", + "version": "4.0.12" + }, + { + "direct_url": null, + "metadata_sha256": "dd96143ec79178bef685c1f5c0a58a87a66d003b421e605de65697308321d518", + "name": "google-api-core", + "version": "2.40.0" + }, + { + "direct_url": null, + "metadata_sha256": "0735d57088a83df2355e16843107fb0112abe2178fc5bb8132947a7ad962aa41", + "name": "google-auth", + "version": "2.59.1" + }, + { + "direct_url": null, + "metadata_sha256": "2f3aa9d9500d329560440e6a5a152e420aad5f5bbb23701f45b740be721784a1", + "name": "googleapis-common-protos", + "version": "1.75.5" + }, + { + "direct_url": null, + "metadata_sha256": "06d74ab04fdc03fad368868907f0d10e7d9f397aab58d58965c0b78ffaec34cc", + "name": "griffelib", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "7ee1c179e2c68a62968308b2f96f4f3469176ee3ac8bdb494ac80188d4d41271", + "name": "grpcio", + "version": "1.84.0" + }, + { + "direct_url": null, + "metadata_sha256": "04cf3a4a91575850f386f4fcfdedd8e7fbfba08feff038fbc1296d1e854db2dd", + "name": "h11", + "version": "0.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "b954a6ba4739c0cc878bb8ea27ea7c7154a48bb4b7c06dba9e9cf880cf0ec930", + "name": "h2", + "version": "4.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "6f0d7bf86e75d0bda1ceccc82367c0145ad0ec522c4d4f51bb454f467faadcc9", + "name": "hf-xet", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "f991b847550cf8225f69562902b5ccb591b2ce9a08fe07ef6e6d701bdb4694a7", + "name": "hpack", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "314d194165c4700034c1c67cee847d549a6d7091374c71f2cef0186ec56a3eb9", + "name": "httpcore", + "version": "1.0.9" + }, + { + "direct_url": null, + "metadata_sha256": "aed9767360bed1bcbda71e3b1a3c996603f86558bc77a1693ee3d09973d20cad", + "name": "httpcore2", + "version": "2.13.1" + }, + { + "direct_url": null, + "metadata_sha256": "8fa3bf3510c35e2eea9f523a1cace7120079cf51d76c4acea97de95806aaa14a", + "name": "httptools", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "3bf4804c215d111b6a4702cf9000021ab39807d1ed3207dd011b14b2843b2d14", + "name": "httpx", + "version": "0.28.1" + }, + { + "direct_url": null, + "metadata_sha256": "d11dd50813b8914bd9455e8b2b591171cd2b1618883943153afadc8bb9224678", + "name": "httpx2", + "version": "2.13.1" + }, + { + "direct_url": null, + "metadata_sha256": "43b119c34ad2b2aacc032a1a6a8feb142fdb5ca407a3519325d74dd53d8904df", + "name": "huggingface_hub", + "version": "1.33.0" + }, + { + "direct_url": null, + "metadata_sha256": "9ce850d5a6b775e5ef4a335f907e579a878e058213121b6eec567781ea68c585", + "name": "humming-kernels", + "version": "0.1.12" + }, + { + "direct_url": null, + "metadata_sha256": "67aa4f6717d82446a51ce350e7c4769eba0c4a22d2f428255cddd9d24b11a914", + "name": "hyperframe", + "version": "6.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd9511ede42f63b995c3f71944f908cb8f014048b63ecc1c8d420525a3354b59", + "name": "identify", + "version": "2.6.20" + }, + { + "direct_url": null, + "metadata_sha256": "af3c3a62bb5d82d6a43454684e0b1dedde27a21ea90eacfb1bed9814619f06d0", + "name": "idna", + "version": "3.20" + }, + { + "direct_url": null, + "metadata_sha256": "cf71393f3d079ce2e859384573e65aaacd1709bef700701f629df32398b598f0", + "name": "ijson", + "version": "3.5.1" + }, + { + "direct_url": null, + "metadata_sha256": "9305763e93d03df0e36516b1125fa046a6ebe37d44589e200e0593cf4bdfd980", + "name": "importlib_metadata", + "version": "9.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "32860c3c19b2e91f6cb5bd83400b5870cda051bc74a5a08822c8c666af0990db", + "name": "iniconfig", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "560faabb3d45d779e445a74e7e806a786f95f2200fa06d979603b7f0ee1cfb39", + "name": "instanttensor", + "version": "0.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "f6fc1f0d389e4245fc2a1a0fdfee09422e56200cb6f94659668456997ff4f7a9", + "name": "interegular", + "version": "0.3.3" + }, + { + "direct_url": null, + "metadata_sha256": "d10f300731197a4829b77f0c883bb3cf8a37ae8c76a302e095fa95d6427706d0", + "name": "jiter", + "version": "0.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "5b0c8d4b4c535a2432fb206223d774509b6e20af374c6a4b6f98bf72a7de6702", + "name": "jmespath", + "version": "1.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "6c4032c2e74273452cd77399af2ee85198f49c22da897983f26d2ed6f787c4e8", + "name": "jsonschema", + "version": "4.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "aaa6cd66f423729e8da397c9d533b7d731f6b25f3d6371b9338c36bdb9be74a0", + "name": "jsonschema-specifications", + "version": "2025.9.1" + }, + { + "direct_url": null, + "metadata_sha256": "f7c0687c032593106a2e5a3c241cf8043e7e2c222bddb0022b4cb2bf5de67115", + "name": "lark", + "version": "1.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "4511c6b04efc57a5f5333edc1f5f48b9f5412c3923d4bc19b715bdf47977511c", + "name": "linkify-it-py", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "be929870f6ecae18a819c56118f1101f3076e25ac6a4843ca6f4707ebd1e87c6", + "name": "llguidance", + "version": "1.7.6" + }, + { + "direct_url": null, + "metadata_sha256": "cf2b87669bead3e76ec54207f3354c13f73b50c32fcd13c8d627084b3379139e", + "name": "llvmlite", + "version": "0.47.0" + }, + { + "direct_url": null, + "metadata_sha256": "0a416d79c5543d94d2b18807626293d4f47655d1d22724c7ae296e413078aaba", + "name": "lm-format-enforcer", + "version": "0.11.3" + }, + { + "direct_url": null, + "metadata_sha256": "16bc1f59e34fd2a6633bd395276052eacd2c777b2cf72781e76b203f013a8fac", + "name": "loguru", + "version": "0.7.3" + }, + { + "direct_url": null, + "metadata_sha256": "5216d5acfd039a7b581a826186309594b228d37d2c8d56864124ea666689fe4e", + "name": "lxml", + "version": "6.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "f59d772b35315a928672bfcccfb89d82c0aac672c5275c048f7a93b79015bcea", + "name": "markdown-it-py", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "b137367ef0056711cbf5e53015df9168cab80373104e7899b1c0263a21d9c99c", + "name": "mcp", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "38e0b9edaae09e58cd1461fc961ced22672038a697930bedef153a74befb3de1", + "name": "mcp-types", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "799f49685865fd9cc8915fdb92a33e102eeeffad562b03b4aeffb6f422b771c1", + "name": "mdit-py-plugins", + "version": "0.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "481f9cbe08596c6eaba6343e0efa1b13b2362c30dce0610f7c08523f1d98388d", + "name": "mdurl", + "version": "0.1.2" + }, + { + "direct_url": "{\"dir_info\": {\"editable\": true}, \"url\": \"file:///Megatron-LM-training\"}", + "metadata_sha256": "2876c0c760bbfc93bd7d737bf0db2866a937308a7c1707c3a2bb59d4795986ff", + "name": "megatron-core", + "version": "0.16.0rc0" + }, + { + "direct_url": null, + "metadata_sha256": "a6e34d488c879f57ce042bec38f8864ba3ea7d6ecf0ab757fc88fe8dc0a22f26", + "name": "memray", + "version": "1.20.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd26d80dc9676b1fb8c894355bd525fbe7f49a6a86a555c72e9ec6d927247c33", + "name": "mergedeep", + "version": "1.3.4" + }, + { + "direct_url": null, + "metadata_sha256": "dd1b3b89e88d1c65a26e6e72dd075eabbc220bfb138769ec8b64578ee911795c", + "name": "mistral_common", + "version": "1.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "4859847a9f6321daf8849cf7fd1542ff430db6563a2abf9ac0d62a5b21bd951d", + "name": "mkdocs", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "1729fc31479f2582486cdc85397417659dd3b2fb3f920553de66cfe59d5f0b3e", + "name": "mkdocs-awesome-nav", + "version": "3.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "88b4b7b7c0aba5547befdedaf515c8df4867361daf55ff60b72578464d72dcbe", + "name": "mkdocs-get-deps", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "ad33bb33fb16b1f69689c4682550e97232154e367e2c8c8aee9dad0f10d269ce", + "name": "mkdocs-git-revision-date-localized-plugin", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "ed69fbfb9ac00c10c5a383a12ff9d2b9919ae184e408554434199211643d6040", + "name": "mkdocs-material", + "version": "9.7.7" + }, + { + "direct_url": null, + "metadata_sha256": "d1c549b61701148b97f8246bc924b2840e504b37b0ce7a27e78ddf81261e5363", + "name": "mkdocs-material-extensions", + "version": "1.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "4ad6171f3bf6812e4de90670ff0089d445093d4fe1d05d55f17b96a4a192a816", + "name": "ml_dtypes", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "4ad6171f3bf6812e4de90670ff0089d445093d4fe1d05d55f17b96a4a192a816", + "name": "ml_dtypes", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "b0dbdfa30ab6b1ce637a794899c9e43019182b6d1ab2d07b90f647f7331eba6b", + "name": "model-hosting-container-standards", + "version": "0.1.16" + }, + { + "direct_url": null, + "metadata_sha256": "95424470e481cfa8d18b30963b6de3aafe16614b1ea0414e184a008571dde84f", + "name": "mpmath", + "version": "1.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "eb184d83489401903615ce8a78d98d5b933dec0f7246811d396a529915fe797c", + "name": "msgpack", + "version": "1.2.3" + }, + { + "direct_url": null, + "metadata_sha256": "520006303d6a0e859970b83f7d452196e2e8f6dab08f6dcf1ba5823c1230025f", + "name": "msgspec", + "version": "0.22.0" + }, + { + "direct_url": null, + "metadata_sha256": "010d2fe039006070a711a476b171b7b7da5c29ccad3c4eecd77ef3711b07c2d0", + "name": "multidict", + "version": "6.9.1" + }, + { + "direct_url": null, + "metadata_sha256": "235634cc7ebda45f8a84dfdb1b9b35ac1a77a1888b34650c3a616d23e4a7e93f", + "name": "multiprocess", + "version": "0.70.19" + }, + { + "direct_url": null, + "metadata_sha256": "7c545b4b3e5e83d3fde41352272c10cb9deeaba5b7138fbf24383e952af8822e", + "name": "natsort", + "version": "8.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "311ee8cdaeaf9f11acf51cda9c3b5b191f76ce9d98bc3418164c3189bbc37a08", + "name": "nccl4py", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "66360539217852c3b44b37f409eade7e1559baf018bb363bacb2aa3a9759b203", + "name": "networkx", + "version": "3.7" + }, + { + "direct_url": null, + "metadata_sha256": "e8b0b1746808b87816c47e4531780ded7f246bed9575a89e8b40200aa81e9a13", + "name": "ninja", + "version": "1.13.2" + }, + { + "direct_url": null, + "metadata_sha256": "77c1117f0dbc41560ddc6e6b37b542fb4e88afcd4ef82ec06593e5bbd5f37121", + "name": "nodeenv", + "version": "1.11.0" + }, + { + "direct_url": null, + "metadata_sha256": "9af629898406c9eaa69897fe09220dc483270cdba89f6b20bf0165cdf0e1668e", + "name": "numba", + "version": "0.65.0" + }, + { + "direct_url": null, + "metadata_sha256": "0c7281a81cf76e40b27c1385ffd8a215d7227adc219f177ce807ead9e91994a5", + "name": "numpy", + "version": "2.3.5" + }, + { + "direct_url": null, + "metadata_sha256": "0c7281a81cf76e40b27c1385ffd8a215d7227adc219f177ce807ead9e91994a5", + "name": "numpy", + "version": "2.3.5" + }, + { + "direct_url": null, + "metadata_sha256": "bab990ced4537ce74ef5961ca933c4c6fd604fd09a5827a4a428c55bcb0be35b", + "name": "nvdlfw_inspect", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "10f6595146332d35f7f15a000e08b5c81432528c5d026470c1d03f0c1399fb70", + "name": "nvidia-cublas", + "version": "13.1.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "58e933b4ac8e49f098b16ab7480d03bd792afc3d1db10d0aacbdcc2c62e48fa3", + "name": "nvidia-cuda-cccl", + "version": "13.3.4.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "baac937970681d41aa0c3708b3d55d73f8d29e70aceaac0e71fe6d1548e94a09", + "name": "nvidia-cuda-crt", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "8d51e5c76ef5707b0b80d5ec9a791c0f11a480ab721820cf100a3cc566017eef", + "name": "nvidia-cuda-cupti", + "version": "13.0.85" + }, + { + "direct_url": null, + "metadata_sha256": "724bf56e61ddef5d4c2482ff64103a973b911b110b668acaea5373f6c83c1c5c", + "name": "nvidia-cuda-nvcc", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "c54801dbd815d534519a761f1f328325aa0f1d1f1659aa969fa74e7a2c76eee9", + "name": "nvidia-cuda-nvdisasm", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "af51f248363020b9fdfd2743704e901bf3d19a1a1ce1fe44fb98ba148bfc0157", + "name": "nvidia-cuda-nvrtc", + "version": "13.0.88" + }, + { + "direct_url": null, + "metadata_sha256": "055f7fc69a5a2159de82cd0718da02c8852e81c8a71ebb117b8e799badd7167e", + "name": "nvidia-cuda-runtime", + "version": "13.0.96" + }, + { + "direct_url": null, + "metadata_sha256": "df18686dbdb3074ca375a1d6c623a04102fd348950c67a721397349c6d4f0477", + "name": "nvidia-cudnn-cu13", + "version": "9.20.0.48" + }, + { + "direct_url": null, + "metadata_sha256": "abd0ca3f67af19a4d383ff2a012ae0090d4731c6492fd47236615308a50b3981", + "name": "nvidia-cudnn-frontend", + "version": "1.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "4a78545d424d0c5038353f7046a8ae40ceaf312045d71399eac9511f5fc15434", + "name": "nvidia-cufft", + "version": "12.0.0.61" + }, + { + "direct_url": null, + "metadata_sha256": "e49b909195c03ddbe203729d9b31dd88e3f207368333d1909c67c6b130a0c696", + "name": "nvidia-cufile", + "version": "1.15.1.6" + }, + { + "direct_url": null, + "metadata_sha256": "bb15a754c6be32c23aaac13c1cfa7a8ce53d92bc26652ec3b609f7a5cce3e7d1", + "name": "nvidia-curand", + "version": "10.4.0.35" + }, + { + "direct_url": null, + "metadata_sha256": "0dd58f677811eac04901a793740932e5a2a8fff2f5453aa6351614eb18391bb6", + "name": "nvidia-cusolver", + "version": "12.0.4.66" + }, + { + "direct_url": null, + "metadata_sha256": "8aeb284782ef6883095a5d1c110e221cad023a99afcfd5cdb4969a25e146d562", + "name": "nvidia-cusparse", + "version": "12.6.3.3" + }, + { + "direct_url": null, + "metadata_sha256": "09555246122896eaca3b8313eecfca4b339fefd3b597874cb9fe3bf29dab38c9", + "name": "nvidia-cusparselt-cu13", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "ac77bac79fbfb0c52ac6e2e5abc936b1e127be2192f0cbc27b00be3125fa86ae", + "name": "nvidia-cutlass-dsl", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "1ec968ec7c4083f7fe4e1fb8384c7e9b853a81491fef9f4cb1cf755961aaedf6", + "name": "nvidia-cutlass-dsl-libs-base", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "cc6f3846cd820013eaa6e2665c493d70c607be6ce7349b939eb4742888470585", + "name": "nvidia-cutlass-dsl-libs-core", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "2357d0df2d0d17c0b16663b8a89df53f751b19721f66821fd88fa78112c08e55", + "name": "nvidia-cutlass-dsl-libs-cu12", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "244590c25662dcf777b1daae97a858afe1a1aec62e5e6678b217007a459ab552", + "name": "nvidia-cutlass-dsl-libs-cu13", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "c3a25ada01f57418c1b897406c3abab18834e6adc573ab7b060620c453afb6db", + "name": "nvidia-ml-py", + "version": "13.615.71" + }, + { + "direct_url": null, + "metadata_sha256": "56baad4e7f699902b03b17580933f7bd50b6ea97b7df9d7e807750973da7529c", + "name": "nvidia-nccl-cu13", + "version": "2.29.7" + }, + { + "direct_url": null, + "metadata_sha256": "98810ef0ab8badc369e6a46a038f8ee9f412c0c753fb5ad580544f23a0aa7962", + "name": "nvidia-nvjitlink", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "b0f54ee21909d19640a58e05da755c91763eb5725f544fd0d4b84b2f5f94deba", + "name": "nvidia-nvshmem-cu13", + "version": "3.4.5" + }, + { + "direct_url": null, + "metadata_sha256": "06dc1a593c7e8b8c3f29184228c83f8f7ef57787ad91f3e5bcae1d238dd3092a", + "name": "nvidia-nvtx", + "version": "13.0.85" + }, + { + "direct_url": null, + "metadata_sha256": "32ee63450a437b6a6ed227ff6549144aa596197a322993521ec7af826ebd413e", + "name": "nvidia-nvvm", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "32c2efdcd2c673b3b7f35ca9c2cccefaad36f1f0a920648a13cad85f6a5767b2", + "name": "nvtx", + "version": "0.2.15" + }, + { + "direct_url": null, + "metadata_sha256": "3419d80e114a2c19fa9bd3582939a3942f19673055707ba6ca2ca489d58b41e0", + "name": "omegaconf", + "version": "2.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "28971076ce9c279d4b889496b046d55a1e05b02fb9851ceb717e9a10df799572", + "name": "onnx", + "version": "1.23.1" + }, + { + "direct_url": null, + "metadata_sha256": "1246f5a4d8295907a42e809ed9173ede2510ec9d260d2168989d126564897fa5", + "name": "onnx-ir", + "version": "1.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "e14643636835759700dff286f949c5ec34e7eac7ac47f44096414f0e0f1c3101", + "name": "onnxscript", + "version": "0.7.2" + }, + { + "direct_url": null, + "metadata_sha256": "00f847e99939207bd70dfd806428f6b20a3d01074b59325e4c76149a2e19be26", + "name": "openai", + "version": "3.22.1" + }, + { + "direct_url": null, + "metadata_sha256": "598d3ad5a22a14a7c4f1d218b43e345f32b0ba094b753467bae8a3f708fd48cb", + "name": "openai-agents", + "version": "0.22.3" + }, + { + "direct_url": null, + "metadata_sha256": "5a0afcb1ce845e05da12beb1767f5d2749bbc9e9050718c6b9fa3c225713c9eb", + "name": "openai-harmony", + "version": "0.0.8" + }, + { + "direct_url": null, + "metadata_sha256": "e86a6b6fcbbe152805f782c57df321002892e163019574877e9829272e25eb4e", + "name": "opencensus", + "version": "0.11.4" + }, + { + "direct_url": null, + "metadata_sha256": "53d669c8bd3d32d3275153b454e515ca5cc6dec92fae3a98309b5a2b19fe6d2d", + "name": "opencensus-context", + "version": "0.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "19778b6d66b0e45bf73e11fa37a208949d5b393aef914627394d5601455546a6", + "name": "opencv-python-headless", + "version": "5.0.0.93" + }, + { + "direct_url": null, + "metadata_sha256": "19778b6d66b0e45bf73e11fa37a208949d5b393aef914627394d5601455546a6", + "name": "opencv-python-headless", + "version": "5.0.0.93" + }, + { + "direct_url": null, + "metadata_sha256": "a3f5434fa7c80f7f7abc82173da639c8e9c59d30b4027182645562bd3d2f4f97", + "name": "opentelemetry-api", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "8611977ea596e4827874582e86250618444e1c718229dddfc16e5ea437ce5fcb", + "name": "opentelemetry-exporter-http-transport", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "2cfd41e5ca33292d987ba71fa6186d11e16ed66888f3a26f8a3a99060c4b5e90", + "name": "opentelemetry-exporter-otlp", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "3bb4494220732d4bf10e1dba231ea7638cedaa5362e1f23a50d34a14f520fea8", + "name": "opentelemetry-exporter-otlp-common", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "27fb1c8aa5c2cd07776f9f3281fc618cd3feb96017757c33d2b3586fb7fec88b", + "name": "opentelemetry-exporter-otlp-proto-common", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "5cba6098cdd0bfb06853a6c704a2451c4f82c9dea376a30b59ecd279296648ad", + "name": "opentelemetry-exporter-otlp-proto-grpc", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "6f53ef1c172ebf87af69b9ef390aa908506d0cd14bc7811985fdd937a4058808", + "name": "opentelemetry-exporter-otlp-proto-http", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "1910f4e7ebd497e98b6d231e10275288fda2cd1885117575706c62f45e065889", + "name": "opentelemetry-exporter-prometheus", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "fab18b721e30be41448be252e1dca43b48e7f15d971e0bb552492c0ef4b07bee", + "name": "opentelemetry-proto", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "3644a79f55762a646799ff52b9d837e01c8192b7b28f735a383f55c90edb9bc2", + "name": "opentelemetry-sdk", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "add3db481f7f401f65cfbddb058fde3bb4c9dd7b61064a84f8598ad7efe0b11c", + "name": "opentelemetry-semantic-conventions", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "0dfff30e912520a226bcf7a547393484cfcd8c738439c7b48418f61c95109480", + "name": "opentelemetry-semantic-conventions-ai", + "version": "0.5.1" + }, + { + "direct_url": null, + "metadata_sha256": "210ce26bad0a245a72831b4fa029708c245d4d670a88c8d5a69b1446c24a95e4", + "name": "orjson", + "version": "3.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "35ff73511848f5f934ccc39d538014716ec4579e76d54e0e407ff51794a7939c", + "name": "outlines_core", + "version": "0.2.14" + }, + { + "direct_url": null, + "metadata_sha256": "8ee2f7138ade46b6e348a6d099612f5bd6caff13511f3b4144327f37ce50eacf", + "name": "packaging", + "version": "26.3" + }, + { + "direct_url": null, + "metadata_sha256": "a4ab87bf8083001f25ccdc46095f05b678b3569dd58edc2cf941e3e7f64d7c88", + "name": "paginate", + "version": "0.5.7" + }, + { + "direct_url": null, + "metadata_sha256": "1de96a6c28c2e5613c9c87cd4ad9484791001cf58df43cf2ba74d5c4f85f0ad2", + "name": "pandas", + "version": "3.0.6" + }, + { + "direct_url": null, + "metadata_sha256": "d05b8d05da9f78176b2eefaacdfaa5e96708ec4f488daea8bbc52e3ed1bc3954", + "name": "partial-json-parser", + "version": "0.2.1.1.post7" + }, + { + "direct_url": null, + "metadata_sha256": "c1d126edceac2685e29403a8ae3a27c47143dce1f0252fa3931771562f1e2b4f", + "name": "pathspec", + "version": "1.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "30325dc8ce17bc64f9dbc0a449232fd35841a019df22a6f481007c9c5a28c1cb", + "name": "pillow", + "version": "12.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "cbc0b7b6e63b50dcb7c17cf3526a9304f285d9a31353adf3b22acc2059ab23f5", + "name": "pip", + "version": "25.0.1" + }, + { + "direct_url": "{\"dir_info\": {}, \"url\": \"file:///work\"}", + "metadata_sha256": "6ba03b5bc457a2a3d92468729501b5892a0d38ebcc36766c58859449498c5743", + "name": "pip", + "version": "26.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "0421937c4410b61c5325233d5b7671ae933bae8de174f87586ac55aa804851ea", + "name": "platformdirs", + "version": "4.12.2" + }, + { + "direct_url": null, + "metadata_sha256": "2bcffab42626e1fb50d6329765619312d30fe7f4880e98dcee99c92ebd283bb4", + "name": "pluggy", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "7e7562ba7c032f8edd02641ae71b1ac2d8f388103a68d777a7e907d19e75bc17", + "name": "pre_commit", + "version": "4.6.2" + }, + { + "direct_url": null, + "metadata_sha256": "bbe0a7662602ddd23f929fe0ee98e9d04406e138aeee18ce4861af186ea6060d", + "name": "prometheus-fastapi-instrumentator", + "version": "8.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "ece4a61f3ffb92a083fd5e47e180e3e070342e60a3bd93876a879e79a643e821", + "name": "prometheus_client", + "version": "0.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "5feba21a58eaa126e7e7739e57e2572e5bb251fcbf56e439e508acc47d769314", + "name": "propcache", + "version": "0.5.4" + }, + { + "direct_url": null, + "metadata_sha256": "3f136dbf7239c987a7685acd33440cc5efd6c4107b4b11c425201b4de70ae36f", + "name": "proto-plus", + "version": "1.29.0" + }, + { + "direct_url": null, + "metadata_sha256": "118b5ad013120a7a6e24714595ad776bf264d7b0060389133310d18ea1480902", + "name": "protobuf", + "version": "7.36.2" + }, + { + "direct_url": null, + "metadata_sha256": "0849f5a519bf9bc23ef204443fdd8d6d10678863acac7ca9340fc11bfba5a856", + "name": "protobuf-py", + "version": "0.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "eab5f2f4fd98f67a710a8fb1975b64ffa880a4f977566f022c567e08e324ccd6", + "name": "protobuf-py-ext", + "version": "0.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "39009938840de3a8b2a37eb4668d2601aae8c74e4b74743f73e59996b5b7e6e1", + "name": "psutil", + "version": "7.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "df44b58e8a4cfe57f65773ec47f7bdf2a14c8f5f73a7abf331a6b6237d6d691a", + "name": "py-cpuinfo", + "version": "9.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "2fd4a9efc5e5c74ae4c2fcf1970193c524c62ab22af8d5e66ebf7df9e6e46e83", + "name": "py-spy", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "d2ccdeb15cddedc81637a83e40baa6397fe269023b738d0fc3cb2d90722e290b", + "name": "pyarrow", + "version": "25.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "47b9f28e971a56f5adf949e0bcf105b0bf6587946566ecf197a2819d8848cc01", + "name": "pyasn1", + "version": "0.6.4" + }, + { + "direct_url": null, + "metadata_sha256": "82ce4c01c6d36841b9801fcdabab9bfe61d0b5e4e440c275941d8a2d4a790730", + "name": "pyasn1_modules", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "45cb345e4c12f63bc843b8c88902cc44c4d624a55aaef8cd5ffbc0ad16356fbe", + "name": "pybase64", + "version": "1.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "d311ae661edeac8ff029ab2960d065a7e792ebf8f79af682daa53109fe81318b", + "name": "pybind11", + "version": "3.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "cce9c0d440d065d4cdfb0d00004b8ddd65cf363a740efc5b0920b29201a59cd9", + "name": "pycountry", + "version": "26.2.16" + }, + { + "direct_url": null, + "metadata_sha256": "a1e33542883c249bf6c263b0023b9ea8a6131a77d9cb2cbc88316968e5eada83", + "name": "pycparser", + "version": "3.0" + }, + { + "direct_url": null, + "metadata_sha256": "faffcc4d7d359cb1047a9f67f7c65096b838c6db6c62852ef20fb27d55649a95", + "name": "pycryptodomex", + "version": "3.23.0" + }, + { + "direct_url": null, + "metadata_sha256": "98929f4cb80451dc3c6c8cd541a3081dccf0dee94afe7d9fa5c214a18ff236ce", + "name": "pydantic", + "version": "2.13.5" + }, + { + "direct_url": null, + "metadata_sha256": "8eccadbe707db97c397fb79073fe791b7998ef3a85f04f817f8991f7697b190b", + "name": "pydantic-extra-types", + "version": "2.11.1" + }, + { + "direct_url": null, + "metadata_sha256": "8f00c91deb34399316a5386eb2e76fe09f14a08dc3045f2e7dce9bf8573796bd", + "name": "pydantic-settings", + "version": "2.15.0" + }, + { + "direct_url": null, + "metadata_sha256": "66c729edddc20bf2764bb18bd87d907b08690e50355f39b97acc737b26d1d164", + "name": "pydantic_core", + "version": "2.46.5" + }, + { + "direct_url": null, + "metadata_sha256": "394500d78a0c1a433ae8ca3693152c08f6a901121d4b069cf1540a19759e2950", + "name": "pylatexenc", + "version": "2.11" + }, + { + "direct_url": null, + "metadata_sha256": "df2e9e9847a2aea0ae6e20fd325aeb16cf3ce7f8913462db6c2398363cd0c0bf", + "name": "pymdown-extensions", + "version": "12.1" + }, + { + "direct_url": null, + "metadata_sha256": "82fcfe724db9f0b51348da89f4f5cdc0b08d08882b1bbc0ca4913d3a0a93bcb9", + "name": "pynvvideocodec", + "version": "2.0.4" + }, + { + "direct_url": null, + "metadata_sha256": "3722422cc1478b175879143dfb78f98b7a5f53f4f684d71b7054fe2e8acd3b89", + "name": "pyqwest", + "version": "0.10.0" + }, + { + "direct_url": null, + "metadata_sha256": "7d1d1c276b7c372d55d17ac7d30f0a4b80a746e147347b8510d1355eea7f80c8", + "name": "pytest", + "version": "9.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "89e7c1c932e52b74bdcaf504389d2d1a2d7ca559b02bf5a09fc80ebd58ad10f7", + "name": "python-dateutil", + "version": "2.9.0.post0" + }, + { + "direct_url": null, + "metadata_sha256": "54f30f811841b6d772f31715712c85bfe0041839cb071f78daf41c700a98642b", + "name": "python-discovery", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "54f30f811841b6d772f31715712c85bfe0041839cb071f78daf41c700a98642b", + "name": "python-discovery", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "0cc19efd76cfbf3bcb2cb0d3ab82191036855859455aa3812c5e9e591e3f34e8", + "name": "python-dotenv", + "version": "1.2.3" + }, + { + "direct_url": null, + "metadata_sha256": "1d866c6124631b9ce1797ad412fff298ab53fc2d95210281d7c8f20e920753fa", + "name": "python-json-logger", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "2d18a1e7286d92a656ead5ec6f83d5ae6dc858634624f6b264703ae88d24d718", + "name": "python-multipart", + "version": "0.0.32" + }, + { + "direct_url": null, + "metadata_sha256": "beaa0efe9ba4b34843f5a0fc7379a73f10e95adb8cc0c31f359ab6f3a42b4def", + "name": "pyyaml_env_tag", + "version": "1.1" + }, + { + "direct_url": null, + "metadata_sha256": "238dc769e22d4f5626750cdff36e920e4a8d69c10d88de6d79b40a59cc13d873", + "name": "pyzmq", + "version": "27.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "de0a5e855bb5bb78b7acdcd2ca60619c6a0c109814881589caf158ec07155662", + "name": "quack-kernels", + "version": "0.6.5" + }, + { + "direct_url": null, + "metadata_sha256": "961ffef199b876fb4d7b10903d78e79f359d703b1638834c61d70b9879932918", + "name": "qwen-vl-utils", + "version": "0.0.14" + }, + { + "direct_url": null, + "metadata_sha256": "faf6ab9027d12de992827a2d8a224996fe6747a8c5f7d31ae495983dc73eefe9", + "name": "ray", + "version": "2.54.0" + }, + { + "direct_url": null, + "metadata_sha256": "c50d8b3ff4d113925b60dc47d1d28e87248a3338024241b0a3a66c8794fbce0c", + "name": "referencing", + "version": "0.37.0" + }, + { + "direct_url": null, + "metadata_sha256": "02acdc52d6f21d5f4b172254daaa94edfaa44c9ebe14d1c00cc4c8fe99b0e1df", + "name": "regex", + "version": "2026.9.29" + }, + { + "direct_url": null, + "metadata_sha256": "ac08207697217d1ffde8a161b424d77d6e2af6b62630fa26d75d08f11076cdca", + "name": "requests", + "version": "2.34.2" + }, + { + "direct_url": null, + "metadata_sha256": "f1abd635c3dff607a4fd654c62a88d9d4c21843cfc9176116c156f4269ca21b5", + "name": "rich", + "version": "15.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "932ff7743a756d0efcc45528d64c275ac3cb40a8dd1787ea10cb303907f0ae4f", + "name": "rich-toolkit", + "version": "0.20.5" + }, + { + "direct_url": null, + "metadata_sha256": "294a1405c0fa34b5f735bcb46459050436849a1e584c643544de99c07c529fb7", + "name": "rignore", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "5e54dd00b4ad336c5161d47de2a5c2212090c44629c28b6538b156256e49282d", + "name": "rpds-py", + "version": "2026.6.3" + }, + { + "direct_url": null, + "metadata_sha256": "0d5895abd80bfc0027c02943abaea4547061b9004bd134950d640d619a697835", + "name": "safetensors", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "91d5de3f641f33a8fbb4b6e91772da68d50b68686971d7b66af2068f2e77b694", + "name": "scipy", + "version": "1.17.1" + }, + { + "direct_url": null, + "metadata_sha256": "297fb30f701a800489c12893a951da3e5bd1f80061a1f43f0d3e9f1d4c6bc6fd", + "name": "sentencepiece", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "4245e0388ddf2048a38ae2a24a3d2c583408b2454aadc680d3c3beede639db3f", + "name": "sentry-sdk", + "version": "2.71.0" + }, + { + "direct_url": null, + "metadata_sha256": "ae8a9e6feec1a76e954d65ea48ac57842c9a7bfb5ac6e5ea82400a5ba9f71a98", + "name": "setproctitle", + "version": "1.3.7" + }, + { + "direct_url": null, + "metadata_sha256": "341d00772017437d0f6e3c943ae353f243c39fedfba403aea47cced927a76516", + "name": "setuptools", + "version": "79.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "ff4bcfb192bd542ed8f1794fb32ffc9eabd932d6e03cb00a4ad5e35a2469af88", + "name": "setuptools", + "version": "80.10.2" + }, + { + "direct_url": null, + "metadata_sha256": "f1e5a532fb8cda0bbc370e3db6cb9cea72a065d12ddd6a14976ba3cf66264221", + "name": "shellingham", + "version": "1.5.4" + }, + { + "direct_url": null, + "metadata_sha256": "2aba2cfd9c2ad7625a5d374d141af317d8f92d3534997bf98d127e52848dfc81", + "name": "six", + "version": "1.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "69ae2dfe547624be97fae348e1cfa3793f8854eed32cc1603badedc7d48fb36e", + "name": "smart_open", + "version": "8.0.2" + }, + { + "direct_url": null, + "metadata_sha256": "d415e6c6de7dee117d254a342668c489931bc88eac7ec8678b452078e366da6e", + "name": "smmap", + "version": "5.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "093bc4f0740a6fc28692e616aa8fe68d7e1d76426cc5a5faf9ea722a8ee7aaae", + "name": "sniffio", + "version": "1.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "b3cef071eb1dbeaa76a1273fe2ca2cc8ef36e835165253952d93780962529ac1", + "name": "sse-starlette", + "version": "3.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "3c01ca830e213f0311fe37bc3b46b8ab230a5e7acb894bf0fc8785cb7ccfed48", + "name": "starlette", + "version": "1.7.0" + }, + { + "direct_url": null, + "metadata_sha256": "6017ca508a293cf47a88a78cb330e9cbd131d74ec3c7fbf89bd4300ed3129d30", + "name": "supervisor", + "version": "4.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "fd5eb4925b04f9bffbc6c4f92bf8aea7243b918b43cd359493fce48a7dd3b336", + "name": "sympy", + "version": "1.14.0" + }, + { + "direct_url": null, + "metadata_sha256": "f09f0e24282c5a86346bcd5b10ae5ff81869fa8ef69c3ba524bd0a817a87dda9", + "name": "tabulate", + "version": "0.10.0" + }, + { + "direct_url": null, + "metadata_sha256": "519fa19c146fd58a0a75ecf1461e4bd98f9c06d01800c37d4a80f5fef095f4e1", + "name": "tensorboard", + "version": "2.21.0" + }, + { + "direct_url": null, + "metadata_sha256": "1af7ad76e4073b01ab147eb3c1d8e38b95d38062c6c9bc63890150738642e8eb", + "name": "tensorboard-data-server", + "version": "0.7.2" + }, + { + "direct_url": null, + "metadata_sha256": "9e597f62fc07e3b931d5c8fb0e90706fb6d45465cfb5d01dbd27ba7fc135c02c", + "name": "tensorstore", + "version": "0.1.80" + }, + { + "direct_url": null, + "metadata_sha256": "0da993d16ef6326f471796fcb065622f309c5c1aae6c6295b488ea64bb5c880c", + "name": "textual", + "version": "8.2.8" + }, + { + "direct_url": null, + "metadata_sha256": "52ca6148d4fd1497254855fa610cfdde99191cd42bce7a452fd3a68855504ac0", + "name": "tiktoken", + "version": "0.14.0" + }, + { + "direct_url": null, + "metadata_sha256": "0df9eb495cfb477dcbdfbdcd8c04d952d3eb00d77831630760571e13545398e5", + "name": "tilelang", + "version": "0.1.12" + }, + { + "direct_url": null, + "metadata_sha256": "802b576e011dc61bd2681593e8d802714b6c4ce636a9cf87035026db32ce6262", + "name": "tokenizers", + "version": "0.23.2" + }, + { + "direct_url": null, + "metadata_sha256": "4e1631b2164a49ff9a848d86ce504fdcc15e3540dbb262df8f33a2681a8de513", + "name": "tokenspeed-mla", + "version": "0.1.8" + }, + { + "direct_url": null, + "metadata_sha256": "05086095a775c5dca70998dcf442a848c13f9c68b54a54c510c3542c5abb6563", + "name": "tokenspeed-triton", + "version": "3.8.10.post20260920" + }, + { + "direct_url": null, + "metadata_sha256": "71daba472d0c5ffc25c0231dc29688ab0cb13d5bc7e7d93f6c4cce4169c50048", + "name": "torch", + "version": "2.13.0" + }, + { + "direct_url": null, + "metadata_sha256": "cccd2f1c0e5866e63732f58798c8d642ee6d10cd560d6f691e7981b908c246c9", + "name": "torch_c_dlpack_ext", + "version": "0.1.5" + }, + { + "direct_url": "{\"dir_info\": {}, \"url\": \"file:///torch_memory_saver\"}", + "metadata_sha256": "6276cef17dedbb5ee0d6157bbf63b832e916026281328d995ad3d488c2539618", + "name": "torch_memory_saver", + "version": "0.0.9.post1+slime" + }, + { + "direct_url": null, + "metadata_sha256": "29809ca2c86dda5079654f1f70564a64435e9d08f1964a2412b6f514e1b5ff64", + "name": "torchaudio", + "version": "2.11.0" + }, + { + "direct_url": null, + "metadata_sha256": "7e9be0f3a290e3fd9370d8fe010c7ffd006d5d3d05ab8bdf7df8f92f0fca9c39", + "name": "torchcodec", + "version": "0.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "181fa5e6b399c378711eddcdacd756d3c51317916f8eb160ee36cae7fae9589f", + "name": "torchvision", + "version": "0.28.0" + }, + { + "direct_url": null, + "metadata_sha256": "43d1261aff90cf3d5b1b40cf1f94234d61409b14e59f3766f457c1eec7f7ac15", + "name": "tqdm", + "version": "4.70.1" + }, + { + "direct_url": "{\"archive_info\": {\"hash\": \"sha256=3e1d9f534781c8e608240da0b495b8246317a36382f7609017cbaa7fb1d53f7b\", \"hashes\": {\"sha256\": \"3e1d9f534781c8e608240da0b495b8246317a36382f7609017cbaa7fb1d53f7b\"}}, \"url\": \"file:///wheels/transformer_engine-2.16.1%2Bc9877beb-cp312-cp312-linux_x86_64.whl\"}", + "metadata_sha256": "d882f743161d9d9f35dee4e1a8cc9136fa495f7c660caace01ab8f5602d76aa7", + "name": "transformer_engine", + "version": "2.16.1+c9877beb" + }, + { + "direct_url": null, + "metadata_sha256": "465797a59706d83b45c93fde750b228c3b6e1addc44115de2c4c02ad66d9c5ea", + "name": "transformers", + "version": "5.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "a91982ca086667c592a951973434f7c5a9f27a8300bc97af78dfb496afe53e71", + "name": "triton", + "version": "3.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "d26fbb244532c4051e715f9047cd943e2cc4abb0ac6f2a517fa2986eb1ea726a", + "name": "truststore", + "version": "0.10.4" + }, + { + "direct_url": null, + "metadata_sha256": "c84af1a069084b1b440b3594068dec29200d52d4c1a9b652030448717f270158", + "name": "typer", + "version": "0.27.2" + }, + { + "direct_url": null, + "metadata_sha256": "0ad6653b7439f4bb6a596cb7b01ed1b716458467525c4dc40b75d62bdb943c98", + "name": "typing-inspection", + "version": "0.4.4" + }, + { + "direct_url": null, + "metadata_sha256": "d005280aa13b334ac942d20219102865e559f69ffd06c35c248b2f0d0da3b933", + "name": "typing_extensions", + "version": "4.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "fba2930e9030a18965d243f8d330748db2e67572a81b3b68710462fb5110332a", + "name": "urllib3", + "version": "2.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "bc5717bd6524a33838f285261868bcc8e311e8c29fdb19e41d56c38b04890e84", + "name": "uvicorn", + "version": "0.54.0" + }, + { + "direct_url": null, + "metadata_sha256": "741c006d8441f562aa853a5430df236fbb4af923445491f396bf09943bd30258", + "name": "uvloop", + "version": "0.22.1" + }, + { + "direct_url": "{\"dir_info\": {\"editable\": true}, \"url\": \"file:///vime\"}", + "metadata_sha256": "f85aa01dfdc868756a6583434bbff040f29eb511d47d5b25ada063a84353aac6", + "name": "vime", + "version": "0.3.2" + }, + { + "direct_url": null, + "metadata_sha256": "c25431aaf1950971fe96292f395a41a55b403127bfca0d0b8f7dc9cff5dab75d", + "name": "virtualenv", + "version": "21.14.1" + }, + { + "direct_url": null, + "metadata_sha256": "4e3ee0a31d85e56268640aae853bcee4794dfe8c0483c5c6370517e480c81ae0", + "name": "virtualenv", + "version": "21.14.5" + }, + { + "direct_url": null, + "metadata_sha256": "d4ed5c7551cddb8c1aeff2f9f27b3491f6ad2c9afda8e7bb9779c33fa12a536c", + "name": "vllm", + "version": "0.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "84b482e09bac949e992594757214a1920c667a5d898ee320e309250697f6d26e", + "name": "vllm-router", + "version": "0.1.15" + }, + { + "direct_url": null, + "metadata_sha256": "9b16c871eb1060a5218e9b9a9ad33288d94844cfaf43f08dbb6c32423bde8fe3", + "name": "wandb", + "version": "0.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "8e4f2be437dfe4eb3c6c959e517ac20b75d06525563f1ebcbf06f9ec648bd7c1", + "name": "watchdog", + "version": "6.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "15218afb42938907c2ca74c54e3d8e3a5406493c4761e29e38e82bfec0f84296", + "name": "watchfiles", + "version": "1.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "8863af96e88b7db9990da99aa6c46816eacc3d2f9ae1297b53381b033cd70119", + "name": "wcmatch", + "version": "11.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "f46e6bd6cfafb2b684c29587b017b7096fd9155b74eda25a22eca784b9803ab7", + "name": "websockets", + "version": "16.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "ce82db5ccfefa4bfbe4e25a36e1f91e8e7d51fcaeb31586c4d48e1c69f99168b", + "name": "websockets", + "version": "17.1" + }, + { + "direct_url": null, + "metadata_sha256": "0f142a2c09eac643c7d0bfe77f3f121184c0b17914afbd32af669ed19b2b02ef", + "name": "wheel", + "version": "0.47.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd58938e51a3c5cb363f6f22eaa2a8a7accc1ce373388de167a82f77d3e5783f", + "name": "wrapt", + "version": "2.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "b0b72c1941f04499ca7e1a3a6e479aee8df902c3d49979624b59dba8c3228d37", + "name": "xgrammar", + "version": "0.2.8" + }, + { + "direct_url": null, + "metadata_sha256": "ef8861f39e5c36255966a36032651f937d890d55f31f1c26304b488f1ba34332", + "name": "xxhash", + "version": "4.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "740c08057b6eb69c58402c87d652af0a471e46325d811f2c605632a18817152f", + "name": "yarl", + "version": "1.25.1" + }, + { + "direct_url": null, + "metadata_sha256": "7b060e4d24394b5431875e2f74fec8e6bffa79d2e6b4cb8c7e2a5187dd2d8d69", + "name": "z3-solver", + "version": "4.15.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "3d76d4fbc95f0851191147db12300938c67a6f8fb1df884886d9601272ccc4e8", + "name": "zipp", + "version": "4.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "d3de2651e4e908dbb7c9d80508e5179590217dfac4993dc8b04381c5b9718c4c", + "name": "zstandard", + "version": "0.25.0" + } + ], + "executable": "", + "installed_provider_sources": { + "vllm/compilation/__init__.py": { + "path": "/vllm/compilation/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/backends.py": { + "path": "/vllm/compilation/backends.py", + "sha256": "fa4bff8920b363efbbde9456f135fa9d2c004a5bde1898877f177418b2d8b008" + }, + "vllm/compilation/base_static_graph.py": { + "path": "/vllm/compilation/base_static_graph.py", + "sha256": "5cfe8e06db84aa42cd41cdd93ebe93af00b3a242c8011042057530e2922b523a" + }, + "vllm/compilation/breakable_cudagraph.py": { + "path": "/vllm/compilation/breakable_cudagraph.py", + "sha256": "3cc427612a08e2b9b3fee47548026400c1d0776e2d4747535e59ef5512bdf1e8" + }, + "vllm/compilation/caching.py": { + "path": "/vllm/compilation/caching.py", + "sha256": "71d212452dde742fbf28b8a01ed29d3c08a7457ff7f8da2a20ce9d17e902c2cf" + }, + "vllm/compilation/codegen.py": { + "path": "/vllm/compilation/codegen.py", + "sha256": "e04833bec88cf9d1a13aa7341e30e3233d1138bfe23424e0fd34d664b3fedb9f" + }, + "vllm/compilation/compiler_interface.py": { + "path": "/vllm/compilation/compiler_interface.py", + "sha256": "8d84e2864bf83f754bae9e9f77119e0287cca9f97f5fa5ec2535e07b5ad88944" + }, + "vllm/compilation/counter.py": { + "path": "/vllm/compilation/counter.py", + "sha256": "d8158c54dd36a357bf24f6f84dc22f572d3a27f4875f3d5779b12bc5d454ff76" + }, + "vllm/compilation/cuda_graph.py": { + "path": "/vllm/compilation/cuda_graph.py", + "sha256": "05c86392d7fae967ac73076dba7e01990a0e3ae619e4866450a0c1be56bd1192" + }, + "vllm/compilation/decorators.py": { + "path": "/vllm/compilation/decorators.py", + "sha256": "cab6962e8a1fead59c75f5ed8cb4732f9e5441ff972030c2f4b1c4ba0c58de3c" + }, + "vllm/compilation/monitor.py": { + "path": "/vllm/compilation/monitor.py", + "sha256": "43b24c5cb1bc4d32dc979f3222596905c7b3acc58415328a234402e6edc76abf" + }, + "vllm/compilation/partition_rules.py": { + "path": "/vllm/compilation/partition_rules.py", + "sha256": "857d2fb06dc871ea1d3717cd01fbd4e5205984100d98b7b72a2933d6ff1cfa4d" + }, + "vllm/compilation/passes/__init__.py": { + "path": "/vllm/compilation/passes/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/fusion/__init__.py": { + "path": "/vllm/compilation/passes/fusion/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/fusion/act_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/act_quant_fusion.py", + "sha256": "1fa9c3ca4fb424685b7053c3dda89dda16c98dc5645d85f0f28dca58429792b3" + }, + "vllm/compilation/passes/fusion/add_rms_fusion.py": { + "path": "/vllm/compilation/passes/fusion/add_rms_fusion.py", + "sha256": "e46998552628aa5cd5962fc39ea39ae824fd97e6aeba1d176e9cc7cade39837b" + }, + "vllm/compilation/passes/fusion/allreduce_rms_fusion.py": { + "path": "/vllm/compilation/passes/fusion/allreduce_rms_fusion.py", + "sha256": "0af193505880cec0f6ffa224c688bce3c9ddc318dccdf04a696b4e4b4506a963" + }, + "vllm/compilation/passes/fusion/attn_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/attn_quant_fusion.py", + "sha256": "ecc64e82be4481954c9cac6c23d7794846ab19486b570f2dda07ab5ad67c5a49" + }, + "vllm/compilation/passes/fusion/collective_fusion.py": { + "path": "/vllm/compilation/passes/fusion/collective_fusion.py", + "sha256": "1e2c8539d6960b45907fb3bf0482441ea7250e97c56ffdea1500514efa0b164d" + }, + "vllm/compilation/passes/fusion/matcher_utils.py": { + "path": "/vllm/compilation/passes/fusion/matcher_utils.py", + "sha256": "50ac5714ce1bb113520de769ea6234316acc470a8cdf2537a996ce9a9d54337d" + }, + "vllm/compilation/passes/fusion/mla_attn_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/mla_attn_quant_fusion.py", + "sha256": "a966fe7f58bf9228379f793f5fd851735a97f9639722766b2a20cb79a9e4baec" + }, + "vllm/compilation/passes/fusion/mla_rope_kvcache_cat_fusion.py": { + "path": "/vllm/compilation/passes/fusion/mla_rope_kvcache_cat_fusion.py", + "sha256": "1602cc28055ffa8d1123ddb1d256bf0bd12006fd06ea7e16a986c55746dbe0dc" + }, + "vllm/compilation/passes/fusion/qk_norm_rope_fusion.py": { + "path": "/vllm/compilation/passes/fusion/qk_norm_rope_fusion.py", + "sha256": "aebc7d1a5189b65ac665afcc169e7baebd53efe719c48e35e7c5babe85af0d39" + }, + "vllm/compilation/passes/fusion/qk_norm_rope_kvcache_fusion.py": { + "path": "/vllm/compilation/passes/fusion/qk_norm_rope_kvcache_fusion.py", + "sha256": "f0cfd0d83ec4acb09f9bf91d199b114e9d4995e3059c13eb23a6978ce7c07eb2" + }, + "vllm/compilation/passes/fusion/rms_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rms_quant_fusion.py", + "sha256": "4852aa44e0e2087043fdac271bda9b8d9bfe3201bb84ce3919b8ed454d8083c4" + }, + "vllm/compilation/passes/fusion/rocm_aiter_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rocm_aiter_fusion.py", + "sha256": "372e76c68c75209a085deec6dd22b3816be633613ca82f6f2925c1b3773d61a0" + }, + "vllm/compilation/passes/fusion/rope_kvcache_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rope_kvcache_fusion.py", + "sha256": "3a756e9049593537143b5a56ab9185a6bc83f57ed81d84226d7791a46a984b53" + }, + "vllm/compilation/passes/fusion/sequence_parallelism.py": { + "path": "/vllm/compilation/passes/fusion/sequence_parallelism.py", + "sha256": "3af7e420dcb35fff0bae0f8f599d0f1bda34445ebe194059892a434b2976d654" + }, + "vllm/compilation/passes/fx_utils.py": { + "path": "/vllm/compilation/passes/fx_utils.py", + "sha256": "730708213acf9d1b5f3176b433dfc197a5f3c81b5ce443f0923c526924833003" + }, + "vllm/compilation/passes/inductor_pass.py": { + "path": "/vllm/compilation/passes/inductor_pass.py", + "sha256": "1f380aacf7adabb8bf8b7d41c0a93473947f0716f7445bd910fd448f6c08e672" + }, + "vllm/compilation/passes/ir/__init__.py": { + "path": "/vllm/compilation/passes/ir/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/ir/clone_elimination.py": { + "path": "/vllm/compilation/passes/ir/clone_elimination.py", + "sha256": "5297078f5cddce081faba5215814275381d2083b32318fcfeb2bf9d69fedb7c7" + }, + "vllm/compilation/passes/ir/inplace_functionalization.py": { + "path": "/vllm/compilation/passes/ir/inplace_functionalization.py", + "sha256": "2dc4f22c6f05224828c2941479185b1452d4490f488b7f0bfd124334e7809fed" + }, + "vllm/compilation/passes/ir/lowering_pass.py": { + "path": "/vllm/compilation/passes/ir/lowering_pass.py", + "sha256": "d9c3d90f63138420f0e5489447b5996573fcfbbab939da2efccd00848492b172" + }, + "vllm/compilation/passes/ir/utils.py": { + "path": "/vllm/compilation/passes/ir/utils.py", + "sha256": "f59d33a6c7d0616cbeec1e9fb1d6c948881bf81fe124caeb906eac2e2197ea21" + }, + "vllm/compilation/passes/pass_manager.py": { + "path": "/vllm/compilation/passes/pass_manager.py", + "sha256": "486979a058aa2e20ebedcbb6e039f7a59f38d2efd2cda11219fae4067be0968d" + }, + "vllm/compilation/passes/utility/__init__.py": { + "path": "/vllm/compilation/passes/utility/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/utility/fix_functionalization.py": { + "path": "/vllm/compilation/passes/utility/fix_functionalization.py", + "sha256": "ad5b504a05ccee023869b0c8df70ec2fff9a4a80d25fd903e2b532f470e7203f" + }, + "vllm/compilation/passes/utility/noop_elimination.py": { + "path": "/vllm/compilation/passes/utility/noop_elimination.py", + "sha256": "8abf85d28c13f95059f2acbc0275b9b9ed2ad4990f7c5763bbe3067a4aa629ce" + }, + "vllm/compilation/passes/utility/post_cleanup.py": { + "path": "/vllm/compilation/passes/utility/post_cleanup.py", + "sha256": "1c38b14fc209165cbcf8ca763a17ac4e528b97f59b573e5d52df2cce7d758de3" + }, + "vllm/compilation/passes/utility/scatter_split_replace.py": { + "path": "/vllm/compilation/passes/utility/scatter_split_replace.py", + "sha256": "138402cc3097768a32e9e5b8d1a054b6176e494bddc8684e23ca2dc5fdc3fdda" + }, + "vllm/compilation/passes/utility/split_coalescing.py": { + "path": "/vllm/compilation/passes/utility/split_coalescing.py", + "sha256": "0b02acd9e1ad43d7b3e128b914e969b9580773f2818078846dfbf163a8bd0871" + }, + "vllm/compilation/passes/vllm_inductor_pass.py": { + "path": "/vllm/compilation/passes/vllm_inductor_pass.py", + "sha256": "4f83ffb67f834a214221d810c7843a8e41eb4e5930eb40adbd8cf054ff6fb9c6" + }, + "vllm/compilation/piecewise_backend.py": { + "path": "/vllm/compilation/piecewise_backend.py", + "sha256": "6525318ff3ca2e4978e24dd9232a7ae0a02e920e19604b83db6f6043d1f8a54d" + }, + "vllm/compilation/wrapper.py": { + "path": "/vllm/compilation/wrapper.py", + "sha256": "c1b1fca679ea16aa07a696831a810c0d531da2bb0ea32dd6f1a95cdaef36de07" + }, + "vllm/config/__init__.py": { + "path": "/vllm/config/__init__.py", + "sha256": "56fb0cb1598d297e4f95a97e5d86dc624145d1532f5faa432b7d2834d7155bd5" + }, + "vllm/config/attention.py": { + "path": "/vllm/config/attention.py", + "sha256": "c41f345b512d9b7df882328257eb3a6381f41088c11ae83b5ecd8a9e8265d1bc" + }, + "vllm/config/cache.py": { + "path": "/vllm/config/cache.py", + "sha256": "f1c226ba679c884930dbfcaf41a57248b137a9a20d3ed8e3d3b31752bb484c07" + }, + "vllm/config/compilation.py": { + "path": "/vllm/config/compilation.py", + "sha256": "c9cec5c7200e8e559810ec8c30113ad61dab6780f9f7fb3c116bd0d9b5a43065" + }, + "vllm/config/device.py": { + "path": "/vllm/config/device.py", + "sha256": "7b82eee02ceb5842337451a27a3d5729920c47e25e8f6bf3997f5146f9330a9c" + }, + "vllm/config/diffusion.py": { + "path": "/vllm/config/diffusion.py", + "sha256": "1fa9fd2478a866098a28a3586b55af2f9738656b7813a55d76539c10dd99fe8d" + }, + "vllm/config/ec_manager_config.py": { + "path": "/vllm/config/ec_manager_config.py", + "sha256": "418b387dbe7bdf67deddce331c205768a2d42aea37141f59fb02a8a1528e3552" + }, + "vllm/config/ec_transfer.py": { + "path": "/vllm/config/ec_transfer.py", + "sha256": "0eabb2c25194676d23c6acf59562672a1dd24415043ac5737d621ce0d681ec70" + }, + "vllm/config/engram.py": { + "path": "/vllm/config/engram.py", + "sha256": "34043a22385a041d4e9be8857f64174c990c2ca8308b97b6a952b5ab96c20ee5" + }, + "vllm/config/fault_tolerance.py": { + "path": "/vllm/config/fault_tolerance.py", + "sha256": "b166b24373d599fb15ddc575e3061cf0dcb42174d0369d8468008e7ffbb2a4e2" + }, + "vllm/config/kernel.py": { + "path": "/vllm/config/kernel.py", + "sha256": "27e23c584cf862f4091858db6dc85bbc2a01f4baf9dca3f232ae6f3bac02390e" + }, + "vllm/config/kv_events.py": { + "path": "/vllm/config/kv_events.py", + "sha256": "b1dbaee3e6830e381e9157fe3bab0d65c357da88ff7cdf8b1e4b3a4e75c82a87" + }, + "vllm/config/kv_transfer.py": { + "path": "/vllm/config/kv_transfer.py", + "sha256": "506fae7a9d7f32cb3646156cf9249a856f6317dff6c4c85db70efd34418c429b" + }, + "vllm/config/load.py": { + "path": "/vllm/config/load.py", + "sha256": "bd6431c22e078362d749a56a2c84145432ebf2605d8bcfa2ac679182d18ed630" + }, + "vllm/config/lora.py": { + "path": "/vllm/config/lora.py", + "sha256": "ed6cf6575f5950f079a62f904caeae93d1a4745dd8c21788b74367883bcd4b08" + }, + "vllm/config/mamba.py": { + "path": "/vllm/config/mamba.py", + "sha256": "2090f791201ca45dd4f1d72b8651268890eb07574b6084721194eb8fdf612c48" + }, + "vllm/config/model.py": { + "path": "/vllm/config/model.py", + "sha256": "f4168b67cc93ce72ff2a6d4c66974223e32fd0f1fab4c05e44bd68a275e18d69" + }, + "vllm/config/model_arch.py": { + "path": "/vllm/config/model_arch.py", + "sha256": "2babe28329d7b60b4e205f6d72c687f0f66e6535aa2f20411469e5ec362f6b5f" + }, + "vllm/config/multimodal.py": { + "path": "/vllm/config/multimodal.py", + "sha256": "271911aee151f17f092228cecee82af0713e9a47340ffdf66834ca7638a50d22" + }, + "vllm/config/observability.py": { + "path": "/vllm/config/observability.py", + "sha256": "d57c59ec776477ab0a20e9f2b945bc954d8ea3737c869259480e9aa10dfb9f6d" + }, + "vllm/config/offload.py": { + "path": "/vllm/config/offload.py", + "sha256": "6f2db3d9a2730588473d5155811690c6241b167a21dcb62fbbd9ebb6386de42c" + }, + "vllm/config/parallel.py": { + "path": "/vllm/config/parallel.py", + "sha256": "f012ace89e3fb730a467f729f602679bc145c49f0d10721811c9d818570e7b2b" + }, + "vllm/config/pooler.py": { + "path": "/vllm/config/pooler.py", + "sha256": "9f01913dcb7bccbf9b672b16643f18471ae202455992e8afaf0725a17f2b3d08" + }, + "vllm/config/profiler.py": { + "path": "/vllm/config/profiler.py", + "sha256": "04d24fa1dc7cfedca6b5c7d9115f7f7021722fc46a5b15234a1e3b3a506c93e5" + }, + "vllm/config/quantization.py": { + "path": "/vllm/config/quantization.py", + "sha256": "acffc52f525b39a88efd656f1ed705ce3a1b758298bb0684fac7694776bc10b4" + }, + "vllm/config/reasoning.py": { + "path": "/vllm/config/reasoning.py", + "sha256": "2c4f7bdee48a9fb3d93787c4c32361c2411417cce452cfde86808d8759977861" + }, + "vllm/config/scheduler.py": { + "path": "/vllm/config/scheduler.py", + "sha256": "822179da62be4bca0619c8590082ae09123f5c4415f9cc2037be673748239edb" + }, + "vllm/config/speculative.py": { + "path": "/vllm/config/speculative.py", + "sha256": "9c642a87264339c0dbc1d0b57330572149df0f9d5e16c6893b9895e50a619e19" + }, + "vllm/config/speech_to_text.py": { + "path": "/vllm/config/speech_to_text.py", + "sha256": "bf4a566fbde6a1cec1e209070b739650c3302c12696739c88049cb8f723a4c3f" + }, + "vllm/config/structured_outputs.py": { + "path": "/vllm/config/structured_outputs.py", + "sha256": "55649776594349b8b4aa3e08fc4c88068366732a486d6fb235079188044aa829" + }, + "vllm/config/utils.py": { + "path": "/vllm/config/utils.py", + "sha256": "d035e9e488ba92b6c47a96cf05d9b2a850d53eda8a05115b22ff9af8dbc2fc64" + }, + "vllm/config/vllm.py": { + "path": "/vllm/config/vllm.py", + "sha256": "956b812e5a719bcbfa3a3958801361b38b9c928c96b8c073311bbb96376dfb7a" + }, + "vllm/config/watermarking.py": { + "path": "/vllm/config/watermarking.py", + "sha256": "30e6620a3cd7529f0736ad55e38bc326a6a78dee4552f0722208400041c94a1f" + }, + "vllm/config/weight_transfer.py": { + "path": "/vllm/config/weight_transfer.py", + "sha256": "92edd9e5ea90c97a8f3c5f20abf1734a105ee1f3f89e306e7ba87e758f1f767e" + }, + "vllm/distributed/__init__.py": { + "path": "/vllm/distributed/__init__.py", + "sha256": "97f28c30b32662af8cab163939e4ee423037f11630752e13b55cbc25a7d0ab71" + }, + "vllm/distributed/communication_op.py": { + "path": "/vllm/distributed/communication_op.py", + "sha256": "3c3f8ac60db38ece891d39dc1e2f6f1947ad438685893d2e5777d072320bd1b8" + }, + "vllm/distributed/device_communicators/__init__.py": { + "path": "/vllm/distributed/device_communicators/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/device_communicators/aiter_custom_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/aiter_custom_all_reduce.py", + "sha256": "f8eb027ce7a85d94af6260960ceb7f36fc6f1406c9af9c9b6285fddb3f178009" + }, + "vllm/distributed/device_communicators/all2all.py": { + "path": "/vllm/distributed/device_communicators/all2all.py", + "sha256": "1f1b69236acd3cd7bd94520fd6d591bfd31b57c4bc7c9f9f4161ea8bbd0c5f26" + }, + "vllm/distributed/device_communicators/all_reduce_utils.py": { + "path": "/vllm/distributed/device_communicators/all_reduce_utils.py", + "sha256": "ed0ab4dd05b2519a6313892e68824c97b540034664d7f8c3d031b322e33e1bfc" + }, + "vllm/distributed/device_communicators/base_device_communicator.py": { + "path": "/vllm/distributed/device_communicators/base_device_communicator.py", + "sha256": "4a7670f12ed7c7621b25d476e2687c24ca01f3be183fff4a6a25337596fe506b" + }, + "vllm/distributed/device_communicators/cpu_communicator.py": { + "path": "/vllm/distributed/device_communicators/cpu_communicator.py", + "sha256": "e1856c8e91cfbbb4d9ce990c1236e258ba4021e226afcbab645653380b38d64b" + }, + "vllm/distributed/device_communicators/cuda_communicator.py": { + "path": "/vllm/distributed/device_communicators/cuda_communicator.py", + "sha256": "102d95c67ec798cf352b817ba92e8abc9da37f30d1bbdf3aab45d3927b627b93" + }, + "vllm/distributed/device_communicators/cuda_wrapper.py": { + "path": "/vllm/distributed/device_communicators/cuda_wrapper.py", + "sha256": "333b6d9ed173e7a18c7f2b6627a3c9c9ed88892ce52015f05e29d6d245e48ee3" + }, + "vllm/distributed/device_communicators/custom_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/custom_all_reduce.py", + "sha256": "a048c1327c23580805600c0c951831bec333b1ffc4eb26a0e3d34119c4f0c445" + }, + "vllm/distributed/device_communicators/flashinfer_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/flashinfer_all_reduce.py", + "sha256": "b4359760e9b55963676109a5c3a015fb82e190d4df1d021de9ee01e7814cbdda" + }, + "vllm/distributed/device_communicators/flashinfer_pcie_ipc_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/flashinfer_pcie_ipc_all_reduce.py", + "sha256": "8b67b0fc356a565095f56b475cc89c513e3a5eff051ab1c52e5beb0c1a79e9f2" + }, + "vllm/distributed/device_communicators/mnnvl_compat.py": { + "path": "/vllm/distributed/device_communicators/mnnvl_compat.py", + "sha256": "72ee1e6f9571b4c8ecbd9f60cd469d1b565cb79cab519a688a93f290906a2615" + }, + "vllm/distributed/device_communicators/pynccl.py": { + "path": "/vllm/distributed/device_communicators/pynccl.py", + "sha256": "882fb83c5a3c565a3f8fd664b79f5ceae566dca180019ecafd74bc8c11d9f8cf" + }, + "vllm/distributed/device_communicators/pynccl_allocator.py": { + "path": "/vllm/distributed/device_communicators/pynccl_allocator.py", + "sha256": "390e2576cbf4ae06341ca4dab24fc7e4d4f7c24dd444329ed05d828a9ce91460" + }, + "vllm/distributed/device_communicators/pynccl_wrapper.py": { + "path": "/vllm/distributed/device_communicators/pynccl_wrapper.py", + "sha256": "ce63c8da57bb88d4cf89956bd70bb63f0f44bfad468ddb37b765611551f6d99f" + }, + "vllm/distributed/device_communicators/quick_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/quick_all_reduce.py", + "sha256": "8aacb23e7c297b0ae2f80d99c5affd2e7517115d7874be51069d14a44db7b5f2" + }, + "vllm/distributed/device_communicators/ray_communicator.py": { + "path": "/vllm/distributed/device_communicators/ray_communicator.py", + "sha256": "332c37f65495b60564d61db59bc2d30ca0236adc33442d01464790bde9aec897" + }, + "vllm/distributed/device_communicators/shm_broadcast.py": { + "path": "/vllm/distributed/device_communicators/shm_broadcast.py", + "sha256": "f3e7a3f3ff713fccbd535e0d41650ee05bdf8677e83d4b90519910645022c30b" + }, + "vllm/distributed/device_communicators/shm_object_storage.py": { + "path": "/vllm/distributed/device_communicators/shm_object_storage.py", + "sha256": "e097bf7ac0141fe8db4131e8fd553ca2ad5b0600b22a56f3924af6b795e7207c" + }, + "vllm/distributed/device_communicators/symm_mem.py": { + "path": "/vllm/distributed/device_communicators/symm_mem.py", + "sha256": "b06e3ddb9ae880a30ec4a103ce32eb9794223bb0293832e89572af28adaaa544" + }, + "vllm/distributed/device_communicators/xpu_communicator.py": { + "path": "/vllm/distributed/device_communicators/xpu_communicator.py", + "sha256": "527cbfb250760abc62096ee7cd612307b821f21b72dee1687ad866620ec89b6d" + }, + "vllm/distributed/ec_transfer/__init__.py": { + "path": "/vllm/distributed/ec_transfer/__init__.py", + "sha256": "061405bb51df7409c9938b62e25caa8bd6ebf85da6d1700dbd4affe2a0825135" + }, + "vllm/distributed/ec_transfer/ec_connector/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/base.py", + "sha256": "22d4913375bb622473fbe1a77f9376b804949cd8a7e31e9518208f9561d161e2" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/common.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/common.py", + "sha256": "e2267abd8d00a6d2605e1a82ea5c73396a71b427452eab469fcca0134c334e7c" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/connector.py", + "sha256": "72cd35d9fd754a2992dd090a8af13c91e0789b4038ac29276750d823120235db" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/base.py", + "sha256": "19e8df88b0fa831997896355ecdd49e0d86cb074cd7ae28aed0b328b0bb3ab2e" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/zmq.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/zmq.py", + "sha256": "435641c0e37551ab4937855abd067be26905b91215e759cbd9d28a419a34ff9a" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/base.py", + "sha256": "3be698aeb67d32ee3741e76b2fb71806941c587578583acf8fbc42fbf22b46a5" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/nixl.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/nixl.py", + "sha256": "03af8f6549a6027b7262a482907af591e45f28b9b1c5a3408bbc6600e38797e5" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/ec_shared_region.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/ec_shared_region.py", + "sha256": "e40607952c9920024455eca2f419e8c3ef1de9a4d8b27c147a33bb941b8c08b1" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/protocol.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/protocol.py", + "sha256": "05878336884396bfbef77b96b0fa6359f6fa0aba912961f14a84f5a436f27038" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/__init__.py", + "sha256": "01c42385bf3a55cff09cc05ba956f6dd4b8b6b986bf4d6eca4e566cb045b48e0" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/embedding_cache.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/embedding_cache.py", + "sha256": "7359fb980af1fc30b3253681310ef636e2b4a19134e04a93270c9c45de2572d8" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/session.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/session.py", + "sha256": "5973548a919e13c866222b91d502686a6757a31e5a5664b879bf2887ed9fb212" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/utils.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/utils.py", + "sha256": "160ac665f20f2c75b343c1e784084f2b0b4d1cf8fdb28ee15deee4dc8ed0ce45" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/worker/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/worker/__init__.py", + "sha256": "f08d296d3560c42173ae8af961af4a768033ccf1e36e9c17c0cdd53013d0c52e" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/worker/descriptor_buffers.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/worker/descriptor_buffers.py", + "sha256": "be7c81be214e995da8499105ba485854d9c19d6f8e905f8f1b87b83694ca0864" + }, + "vllm/distributed/ec_transfer/ec_connector/example_connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/example_connector.py", + "sha256": "09022ce07a89114bb65d9befd2e60873453aed11bbac8c0a75c1e6084e785a5f" + }, + "vllm/distributed/ec_transfer/ec_connector/factory.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/factory.py", + "sha256": "d6cedca0a99c3dd2b03cd1c15d17472b983e3f7d8f5baf4a12eecaf6abedb817" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/__init__.py", + "sha256": "1cbfc2f95f8f4d48a9253056eb1fd4b562062884e3fd5cb6571583c352fc16f3" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/config.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/config.py", + "sha256": "98c60696f79d1de67d2364cd9e8a42a393b5c8e17ed9af2f971368e47891d7b3" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/control.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/control.py", + "sha256": "58e0d1a423fbe958bfa586ac26a17107e08d0b31d044b4c74ab4dde880e7ca9b" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/memory.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/memory.py", + "sha256": "d5e90b1348de670a70f110d58eedcbdbd053db72c21dd007c3f5275c53951149" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/metadata.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/metadata.py", + "sha256": "497a7e6dfffb7fce80a41d5989f96119b970c143df77bb9d0f9c91d7a46e8c42" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/producer.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/producer.py", + "sha256": "97fa4d0b19475574778eab02f55fad73db9642beb9156da890314fd53fa1a7ab" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/reservation.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/reservation.py", + "sha256": "4790bc65cde4db5f17733ca2c2910980ba594a8a9b79ee27c5b957dffd4c1113" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/scheduler.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/scheduler.py", + "sha256": "53004b62529a31fdd80dfb2e6026610b95041a77e91f731ae526fefd84e7968d" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/state.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/state.py", + "sha256": "92f375d6c5cc9c83dbe95a7977ad8eb0f1b5629ccee92968bcacdc94eee15d65" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/transfer.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/transfer.py", + "sha256": "ada2113a5402054f1149d3edc2537f4e5e1bd696c9b17291c9f2b4cbf6b59753" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/worker.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/worker.py", + "sha256": "89eb91bb64845b3b121d502972a6b04d448714253becd2ea662e5691cd5acdd7" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake_ec_connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake_ec_connector.py", + "sha256": "aaebab4711bc00dd0c622dfbfd8639fc41e7ed5d1658d7d68fe33e4d5fbef3ba" + }, + "vllm/distributed/ec_transfer/ec_connector/utils.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/utils.py", + "sha256": "11b9014b9c0697f8846deff1a55a22fa86a15dc2ac3e139442fb6d513ac03059" + }, + "vllm/distributed/ec_transfer/ec_transfer_state.py": { + "path": "/vllm/distributed/ec_transfer/ec_transfer_state.py", + "sha256": "9487a41f23fa1a4fa6dfca8b42b8e97a0ee19d8406ffd1dcf4bef66315180827" + }, + "vllm/distributed/elastic_ep/__init__.py": { + "path": "/vllm/distributed/elastic_ep/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/elastic_ep/elastic_execute.py": { + "path": "/vllm/distributed/elastic_ep/elastic_execute.py", + "sha256": "b8f60a4183c79ff6051095b5f95bb385bc7fea0cffe8cd9ebc9087ab0e9f01b5" + }, + "vllm/distributed/elastic_ep/elastic_state.py": { + "path": "/vllm/distributed/elastic_ep/elastic_state.py", + "sha256": "fbf049199841a086fdf2fc1ab8498ef017ad3bf319db65c3ae61acbb536d2e10" + }, + "vllm/distributed/elastic_ep/standby_state.py": { + "path": "/vllm/distributed/elastic_ep/standby_state.py", + "sha256": "15282597550ebd0e07b8492ff192aea1ec0dcec8f0ad34009123e1002cc140c1" + }, + "vllm/distributed/eplb/__init__.py": { + "path": "/vllm/distributed/eplb/__init__.py", + "sha256": "1b9c2ee22abb5888c354c5aa01f0944f253e5e24e135d019778398bbe495a628" + }, + "vllm/distributed/eplb/async_worker.py": { + "path": "/vllm/distributed/eplb/async_worker.py", + "sha256": "424328600ad1003286fc5dfffa1f9482007314c060947818b2f94a8b97811f5e" + }, + "vllm/distributed/eplb/eplb_communicator.py": { + "path": "/vllm/distributed/eplb/eplb_communicator.py", + "sha256": "ba30d9d40e7b81d3f42aa9041d2f328edca4073cfe2de920285eb68375501ed8" + }, + "vllm/distributed/eplb/eplb_state.py": { + "path": "/vllm/distributed/eplb/eplb_state.py", + "sha256": "2f06bc8c63f3fdf55edb5032ae55c0ffcac3e67720ce74ea312e3d141b12acf4" + }, + "vllm/distributed/eplb/eplb_utils.py": { + "path": "/vllm/distributed/eplb/eplb_utils.py", + "sha256": "058af6104faa6d4085c1dca80bbe60d92bf0a7ec9cd92c775a180546c9d8c9c3" + }, + "vllm/distributed/eplb/policy/__init__.py": { + "path": "/vllm/distributed/eplb/policy/__init__.py", + "sha256": "daeb266c88442832b1ab8c8c4cc064891b38b9e9ba00aea324f926c87dc6d37e" + }, + "vllm/distributed/eplb/policy/abstract.py": { + "path": "/vllm/distributed/eplb/policy/abstract.py", + "sha256": "b9fd34c28bbfdded03360d7f3f6f8fb978e82689190d7ae4501dfe520e958c62" + }, + "vllm/distributed/eplb/policy/default.py": { + "path": "/vllm/distributed/eplb/policy/default.py", + "sha256": "3b54229e6240d050480390f6b29d4744fd38437d23719f78a6decf7002296a29" + }, + "vllm/distributed/eplb/rebalance_execute.py": { + "path": "/vllm/distributed/eplb/rebalance_execute.py", + "sha256": "b387e228791149018536eee96cf955b33ba79d801cdc36849d1b47a580ec2597" + }, + "vllm/distributed/kv_events.py": { + "path": "/vllm/distributed/kv_events.py", + "sha256": "de08f01e8736881560256c350a3b6418999dd4aa30f9c6ec9159527f7ed6899a" + }, + "vllm/distributed/kv_transfer/__init__.py": { + "path": "/vllm/distributed/kv_transfer/__init__.py", + "sha256": "c1be4e58ec6923bae607a355ad22891c740f056a69ff7358b1e10ea3fd2680ea" + }, + "vllm/distributed/kv_transfer/kv_connector/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/base.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/base.py", + "sha256": "2ae2a2c48f5731f3533166a75440fe91e764332305b5d713df840edba970789d" + }, + "vllm/distributed/kv_transfer/kv_connector/factory.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/factory.py", + "sha256": "add99c93c587b0098b90b1f8fd6940bdd1f15c236c5c6f1a258411863cb902d3" + }, + "vllm/distributed/kv_transfer/kv_connector/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/utils.py", + "sha256": "317ed40dc837671ca6e666165222e641a0f9b3992aea63bbf54de7e13d40b3a4" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/__init__.py", + "sha256": "5beb6ccad12fdcfe1581982da6f18321caca50e73a6b3259ebf3c8dc8b3ffcca" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/base.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/base.py", + "sha256": "97af64220475c6c9e8273438d7b5138b105ebe6944beb783facb36a3bb76f31b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/decode_bench_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/decode_bench_connector.py", + "sha256": "b4151c88cdec28f1ff9259047abc17baf23b892f4b68769a93bf26e0442b9017" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/example_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/example_connector.py", + "sha256": "6226876ef52d10d0d284d29c337ab44698e8bac6abdb2e0ece53b5756c55d068" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/example_hidden_states_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/example_hidden_states_connector.py", + "sha256": "58c22534dcad0fb73599a2d70a2fb104d5b612a4723be5e777f56a56fe07892c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/flexkv_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/flexkv_connector.py", + "sha256": "de4f68c3bd565ed898e47e0b2980049b966ff31888f1957050d30995d4953762" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_client.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_client.py", + "sha256": "bea6ecff2be281c7e96c1551c7bf463cbb01f2964696067c0ebdb683844f9aab" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_connector.py", + "sha256": "e67ed58015090e5eea9d499883f2a9422673d07f8bdbe0ccff7db15d2460de13" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_metadata_server.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_metadata_server.py", + "sha256": "6800e5cf37809f8a8e28c469c14a434db288bc3bf83a8b62ee06910a20c2da19" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/common.py", + "sha256": "8f2c02c08227a9093e6aeb183961aba36b7812cfc29b8c047a2b2c9d82f79c15" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/gather_scatter_helper.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/gather_scatter_helper.py", + "sha256": "08c1b43de34fbeca77357d7576ac1d17cba974b59d695562f68bb713061e7b54" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/hf3fs_mock_client.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/hf3fs_mock_client.py", + "sha256": "bec61a9b0c4b9124b2292d7646d76411da44396389349b53cdcbc46353c8780e" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/connector.py", + "sha256": "8c61094ce0a3a702908f9576f69482e6bf314738a2cbe33a7d3b47258fa0ab43" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/stats.py", + "sha256": "d9383a6ad6ab6b8f812d29d90495407b770eeddb79b86e9d0e3216c0bd16e0ed" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/worker.py", + "sha256": "251c0d8e57e4739c03ce3e1c899a95ff5b1752eb27676c28ab88c4ebd62c4776" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_connector.py", + "sha256": "5991f9ff8832df32bd421eb67e48237270ea0a408180e523810bb43606acf8f3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/__init__.py", + "sha256": "c53be9796e76cde637514bfc40a525d8c09bb2784b406cb516790d8285dfe433" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/multi_process_adapter.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/multi_process_adapter.py", + "sha256": "6480d67b31ed603027a83edf327880a38aee45eaeee2da9a4efa93e95527c166" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/utils.py", + "sha256": "e204fa6a853ac9c122d7a4e9d146902230f81c48d4321ed5edfdbf979dd49ba2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/vllm_v1_adapter.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/vllm_v1_adapter.py", + "sha256": "e6fe55049c6b007248516d69640e2f3a4809f9d286091a1014ae0949987fa8f1" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py", + "sha256": "c712c386a7c57bf0355a1441ba574232c3aa5498fcb70713a2b3f5d18b64f9c1" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/metrics.py", + "sha256": "de1b1797d0448f74370919dbb0278767f390e8f59e00a0c0528abefb302babc2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_connector.py", + "sha256": "516be01320e64b0110e102eeb69a6ba766dd5ac8cb3036db6b97b7d54413323d" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_utils.py", + "sha256": "26877610463fa8e9d6b092772f2551bcc0c3ac794cbe63996df0414666a8ebba" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/rdma_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/rdma_utils.py", + "sha256": "716e5042edecaba36c7ca763474988f32fa09c2668b8260260149df610af8f83" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/stats.py", + "sha256": "f39b2f0b1db2e4f922e27e684a3f7bbf5bb279b82a0a8c3bb0c7ae69b6d14d24" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/connector.py", + "sha256": "17a350bdb89e17e415d6c52a48684dc15c35a804378daf03e1f3bee1b1b123a3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/coordinator.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/coordinator.py", + "sha256": "a8eb6c2157a96e8d25233b82347ac8409a41d6390b4f2c64242119c05911010c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/data.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/data.py", + "sha256": "d3cfefdb4165a24995749cba452641b318065baa95bb1bae62f922a2f8886e7b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/metrics.py", + "sha256": "f2b9ef8927632d142aad11a374d0725c6e619ea0bb7fea9eda3f3895eb7d277a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/protocol.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/protocol.py", + "sha256": "ccb1cf6a84a932a375215627d2aaac482c351a05df015d636d05373a6845b7c8" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/scheduler.py", + "sha256": "283849ff581ec206444cdf5621622377f1c925e8d7e05cb9294af2f3a5094e79" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/worker.py", + "sha256": "55f1682dfd1ed7af689166421337126a0e1d08afa4774a242e098d79e0c1e95b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_common.py", + "sha256": "549bb4fe22dca5095515b9c0712c31cc81a9d4923881e9f112317640fd8c04ab" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_connector.py", + "sha256": "c0f474bc34b579d889fae92eaf43eaca241be51a4697a187a942f0df4e6b6a98" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_engine.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_engine.py", + "sha256": "d842f3772fc6588d5a329a67572324cb74709aa3df4033e64c791a1e706c8e88" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_layout.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_layout.py", + "sha256": "2b4ec046a78897236b0626939bb828b6ec095355097d10bca39e5f3e1c992553" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/multi_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/multi_connector.py", + "sha256": "12d8387239f3194f2cb63ccbd64824648047210323572d66671e6a1eed349fc3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/__init__.py", + "sha256": "cc3145fe3b6d219a267bf40a0f7c0cc9430e4289f94acab2df761b99b671e7ba" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py", + "sha256": "7a1db8c54e4cd846bdac747344f2aea2c2fcf507817928796063225223b7e169" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_worker.py", + "sha256": "49a2e4faf99bef146b5a1d4d18d48f240b1e561c438252274494b359db96ef52" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/connector.py", + "sha256": "b6a0dc916d052f344be72ecfcb111509c13580102c11a860fa726cf0888949a9" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/metadata.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/metadata.py", + "sha256": "2b23a07c1ec5ac5490c3b818737c7192e344ea9f52cd5623f75939f741ab4e21" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_scheduler.py", + "sha256": "ac3daf8e2246581fec84ab28f2133569421b62c32a120be4923e2f4d0f2f9de9" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_worker.py", + "sha256": "e5060c9b6cf022de35ca3d1da7a369cd6a6a2dea26219af9f7633aaf78af8a76" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_scheduler.py", + "sha256": "2d9008e33937a4d6c5cf9cc2f96160f2bdbc8e987fe37f0798a7fd7eb84c9572" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_worker.py", + "sha256": "87de3ea383dd3aa95fb2c287ea26ded8a330859cc1295f9faa69047e80865c2c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/scheduler.py", + "sha256": "09f1bfe7075b926b26a94529480e33b62c3ac273ff826f6c502084f08b1b2a08" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/stats.py", + "sha256": "3e710654e0b68d1a8592f0c4735c81b22f4bf698fb1a2dfea126d35bf2dd1ef2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/tp_mapping.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/tp_mapping.py", + "sha256": "2d43607f98701b2fad6cc0ac2767619a80b7fc2b3a3c2eb6ed0da4fb05dcd8f6" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/utils.py", + "sha256": "93de863fc8307a61d40b62f1b176b57ae93c363d34b9e9ddc8e666265b6d45dc" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/worker.py", + "sha256": "5134a36ac100ce7a64f5311029a37ac12c38d91093f63100f51f7fe53ea7c3ee" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/canonical_mapping.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/canonical_mapping.py", + "sha256": "e0b3c6f9806a650e0370c43c5068fc31c0fec94615089e15fdf270d7d96f2b64" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/common.py", + "sha256": "9b3f042c6fa1581d10e8f688d2d9bc927bb41b780a9ea01f514d57228e20c978" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/config.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/config.py", + "sha256": "aea82e60889e78dcad8564ec8285b65a6a372824a1545a98ea8e78b6f4fd418a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/events.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/events.py", + "sha256": "d7039b67be95fd444966628184040a94880873c0611c0e6e7525a22650ffdefb" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/metrics.py", + "sha256": "13d76df014e86691f58dc89a879f9808b124690c9267dd5fa3b2d4004d4c5fdf" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py", + "sha256": "2c5282f4a3165cd787fb355e215e3869f1bdd3f2c795b2155fc537c9d135191a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/worker.py", + "sha256": "acc2df53262441dfc6421a3af7f0cbd68cbfaedbd42bbc384d8e1da2d965d194" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading_connector.py", + "sha256": "cdc16ca7339a10e1993bd6220e6273f86a4e99779f58f25098a24ad31bb0dbd8" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/simple_cpu_offload_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/simple_cpu_offload_connector.py", + "sha256": "96238ca82ccf07a1eeb59b8f66de17b09034e3eb993ad9a0a836511d3f69706b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/ssm_conv_transfer_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/ssm_conv_transfer_utils.py", + "sha256": "59a949709482e65a007fbe5352fe9b4bb54c2dcc10ad2c1c41f754b6e13299f4" + }, + "vllm/distributed/kv_transfer/kv_transfer_state.py": { + "path": "/vllm/distributed/kv_transfer/kv_transfer_state.py", + "sha256": "2e5fe09438d6e2ee642f8a26cf7dcf632e870d955d30baf002b76a8bfe836d05" + }, + "vllm/distributed/nixl_utils.py": { + "path": "/vllm/distributed/nixl_utils.py", + "sha256": "0bffa3c052c9f67472b1c0bc3816114891b010c968bf4b8a292e7da4d687db53" + }, + "vllm/distributed/parallel_state.py": { + "path": "/vllm/distributed/parallel_state.py", + "sha256": "d9b10ad56833ebc08a753e1a050ef0989c30d4134021b7b7b00150b7bd01adc6" + }, + "vllm/distributed/stateless_coordinator.py": { + "path": "/vllm/distributed/stateless_coordinator.py", + "sha256": "f52848fbe985ed47b1f3e3ca555314736ca06436e8d738ab4390101f0672dcb0" + }, + "vllm/distributed/utils.py": { + "path": "/vllm/distributed/utils.py", + "sha256": "792146b357139e705064a68d3b66858de8a0baaca4dc7db1232fa217d45db231" + }, + "vllm/distributed/weight_transfer/__init__.py": { + "path": "/vllm/distributed/weight_transfer/__init__.py", + "sha256": "3fb9d4712b7c131d522f5e76e73cd8c333f3cc7af86e2d5ecf9b61b57b3b7f5a" + }, + "vllm/distributed/weight_transfer/base.py": { + "path": "/vllm/distributed/weight_transfer/base.py", + "sha256": "8ab06feb04f1379d0558fbdb77fde46bc84f179e0a26742cabab937e88caa38d" + }, + "vllm/distributed/weight_transfer/clients.py": { + "path": "/vllm/distributed/weight_transfer/clients.py", + "sha256": "ff85c79c350241e6d2749ca23c9d295a3289b4b62bfdf0257d32eb94a0151d36" + }, + "vllm/distributed/weight_transfer/factory.py": { + "path": "/vllm/distributed/weight_transfer/factory.py", + "sha256": "4e979eeac8c5bcdbffb10eb4765cfb30120fa7595c6c2561d3fa1a966ced61c8" + }, + "vllm/distributed/weight_transfer/ipc_engine.py": { + "path": "/vllm/distributed/weight_transfer/ipc_engine.py", + "sha256": "1af578293f387a19073c322b24143c3ae4716ce0c5d2bac2a4ef26fe20119330" + }, + "vllm/distributed/weight_transfer/nccl_common.py": { + "path": "/vllm/distributed/weight_transfer/nccl_common.py", + "sha256": "7b2ef7dc7481c3f478f17c49aa36c7bed54142ec5c93d36ed8426c8fdf09e500" + }, + "vllm/distributed/weight_transfer/nccl_engine.py": { + "path": "/vllm/distributed/weight_transfer/nccl_engine.py", + "sha256": "7fd020c919dc7b4723fb78e64da977b180d0fef0cd21df955a037b848dbaa008" + }, + "vllm/distributed/weight_transfer/packed_tensor.py": { + "path": "/vllm/distributed/weight_transfer/packed_tensor.py", + "sha256": "d0a27fb0be1dc029bd5a1d44fdb57a5e54aa4cd74308bedc339e86ac02c7494c" + }, + "vllm/distributed/weight_transfer/sharded_rdt_common.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_common.py", + "sha256": "be0b13801f24e7b62999b19d733c030510353603a2d5320d5dc98ee02daf22a2" + }, + "vllm/distributed/weight_transfer/sharded_rdt_engine.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_engine.py", + "sha256": "2f791970b4815511a7578ef6c957e7da97b071d26a39087a09a17475909791ee" + }, + "vllm/distributed/weight_transfer/sharded_rdt_fake.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_fake.py", + "sha256": "ee11164e17b5f2793252ce77741b8b94e0583046abf896a590131b2008d1fbb9" + }, + "vllm/distributed/weight_transfer/sharded_rdt_trainer.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_trainer.py", + "sha256": "dd413ff461d41826ccd3eb87d3df22f6cd7f24e09aac7644e3e5b40d7beec484" + }, + "vllm/distributed/weight_transfer/sparse_nccl_engine.py": { + "path": "/vllm/distributed/weight_transfer/sparse_nccl_engine.py", + "sha256": "e11b409454dda2b05ea34e8115ac19027c5e65cb2a5e9682c494f16a50e978f4" + }, + "vllm/model_executor/determinism/__init__.py": { + "path": "/vllm/model_executor/determinism/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/determinism/batch_invariant.py": { + "path": "/vllm/model_executor/determinism/batch_invariant.py", + "sha256": "af8f8d256a48fc214edf426fbe891fb15bd8b1d7ae98b811c736ff1eb0fae798" + }, + "vllm/model_executor/determinism/batch_invariant_configs.py": { + "path": "/vllm/model_executor/determinism/batch_invariant_configs.py", + "sha256": "72ea0d4df0ab5ae288abb7df5c203d2ad5f1709c7295d87ec72da775fddc1b7a" + }, + "vllm/model_executor/layers/fused_moe/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/__init__.py", + "sha256": "64a32665be6d5afcfbaf7a0915717267278b66b880b908b0263ea58f08e51b5e" + }, + "vllm/model_executor/layers/fused_moe/activation.py": { + "path": "/vllm/model_executor/layers/fused_moe/activation.py", + "sha256": "78dec0e85e0c040304515f64ccf8f2c6a7a2e5b9f1124a2138a97d9a02585541" + }, + "vllm/model_executor/layers/fused_moe/all2all_utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/all2all_utils.py", + "sha256": "dc4750a446f7de31d09a46034da5fdf479bc169af90f47aa9af8ae15e67b0828" + }, + "vllm/model_executor/layers/fused_moe/b12x.py": { + "path": "/vllm/model_executor/layers/fused_moe/b12x.py", + "sha256": "ee76cc6aa801e24be8ec78a9e8502061ad48667d5ff8711e43f68fba912425bd" + }, + "vllm/model_executor/layers/fused_moe/config.py": { + "path": "/vllm/model_executor/layers/fused_moe/config.py", + "sha256": "a3a87cebcc7ac85d73f471dcfafc2d899c6fc08f264777b74a0e919adac9e03f" + }, + "vllm/model_executor/layers/fused_moe/deep_gemm_utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/deep_gemm_utils.py", + "sha256": "8fdcd857eb333f9c68902105f157568d52067c94ba1e2df6dbfe0474ef1f4c02" + }, + "vllm/model_executor/layers/fused_moe/eep_reconfigure.py": { + "path": "/vllm/model_executor/layers/fused_moe/eep_reconfigure.py", + "sha256": "9d7580265e8563e1140c2bb4c3a81a35ddd54903f5ec0a2720ffc064681f02f9" + }, + "vllm/model_executor/layers/fused_moe/expert_map_manager.py": { + "path": "/vllm/model_executor/layers/fused_moe/expert_map_manager.py", + "sha256": "308c00f63fcb6f44518ec3a56d8f902c7bba75928c2e3aea30fbe1f3f473973b" + }, + "vllm/model_executor/layers/fused_moe/experts/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a16_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a16_moe.py", + "sha256": "53deea255175171971422d14082ad139b5ec7b62e21429a4c7cc0ebbefd29cdc" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a8_moe.py", + "sha256": "f3fc51b95ed89862381908a0134e326228827f44854248db9585a9c4899c34f4" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp8_moe.py", + "sha256": "af6db1760961a5a71234f8b1cdf42e9e30a236e13601b0826a75110b79724948" + }, + "vllm/model_executor/layers/fused_moe/experts/batched_deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/batched_deep_gemm_moe.py", + "sha256": "b0cd4ea706583518dc608fb56f832fc3595f24bd863b03ef1e8c22b36b873508" + }, + "vllm/model_executor/layers/fused_moe/experts/cpu_int4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cpu_int4_moe.py", + "sha256": "67170af3ba9dc4c4f71d78a72efc3fa4e366eac614936a79911dae5c75ac1864" + }, + "vllm/model_executor/layers/fused_moe/experts/cpu_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cpu_moe.py", + "sha256": "0754cd4ff1b28e6d3932a67609d335acefd28f95a841f0492923813356a6d81e" + }, + "vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py", + "sha256": "db901bdbcd3fdac23a1d74e39c51e67f14a82be787b2fd704ed1e787372ae868" + }, + "vllm/model_executor/layers/fused_moe/experts/deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/deep_gemm_moe.py", + "sha256": "16911a64a72eafc26a1bcb544a91f90144d85dc41e3ee57cf20e89925227bbb7" + }, + "vllm/model_executor/layers/fused_moe/experts/fallback.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fallback.py", + "sha256": "1bdd0a4f2ebaa40ec96a5aacc07aee61511af59e6324ce456aa65003b6e2991a" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_b12x_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_b12x_moe.py", + "sha256": "e613afe5da2742e42c717c1a0a56bd9e1c7e3e0452a828db0013d81063518954" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_batched_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_batched_moe.py", + "sha256": "295254dfeeec8df3eb8110e6f659a946cb9cded3de1565ecad4d741b3c3f3e00" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_moe.py", + "sha256": "08578bcd0cf72d6a470e40950175e73639efaa6d8d23c6da0869345312b229c9" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutlass_moe.py", + "sha256": "52887cec5fe628e0a4e7793deb546b40f6c29f7362b3b436c10ca36934ab9826" + }, + "vllm/model_executor/layers/fused_moe/experts/fused_batched_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fused_batched_moe.py", + "sha256": "2435587fc7f8fe8ea341ea0eb8f14c11f3f5b31fbbb9b29ce569ad3bace6e6a0" + }, + "vllm/model_executor/layers/fused_moe/experts/fused_humming_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fused_humming_moe.py", + "sha256": "a6830a76ff7f4cd3479b9c8372a30d03e8301604555cbdbcd9ac89a813b7431a" + }, + "vllm/model_executor/layers/fused_moe/experts/gpt_oss_triton_kernels_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/gpt_oss_triton_kernels_moe.py", + "sha256": "1613a7a6b256e8faee6fdcfae84f293492db6229d28ceb3e8a8d6093af480e36" + }, + "vllm/model_executor/layers/fused_moe/experts/int4_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/int4_emulation_moe.py", + "sha256": "f12857caf0671a341687ad3c5f48616b816ed51e1bcbdefa0a7edbecdb81a79d" + }, + "vllm/model_executor/layers/fused_moe/experts/lora_context.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/lora_context.py", + "sha256": "9b41eefaaa57c5dd0dc54217ef95978821b0c52e90ea4db8b0752e08452bd3e5" + }, + "vllm/model_executor/layers/fused_moe/experts/lora_experts_mixin.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/lora_experts_mixin.py", + "sha256": "b2bc55ed6be98b526c6a5698e2d98300650e78555f56b1820e58c04888e2a373" + }, + "vllm/model_executor/layers/fused_moe/experts/marlin_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/marlin_moe.py", + "sha256": "93916b721548e6194dc70cf6cec224b4b1456a0cc0980235e97beba7bf36541d" + }, + "vllm/model_executor/layers/fused_moe/experts/mxfp8_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/mxfp8_emulation_moe.py", + "sha256": "d09c62ad1398c51ff6f515f2a61014ee9e9a9798d0fe9762c47f446efc5edbef" + }, + "vllm/model_executor/layers/fused_moe/experts/mxfp8_native_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/mxfp8_native_moe.py", + "sha256": "01a42cebf18189e566034111b2145573c655319e8af1a56db60d53a319c40613" + }, + "vllm/model_executor/layers/fused_moe/experts/nvfp4_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/nvfp4_emulation_moe.py", + "sha256": "f24467762b60702f0df122ed64786be839a838a9b6cafaecbd04d35fbfedb189" + }, + "vllm/model_executor/layers/fused_moe/experts/ocp_mx_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/ocp_mx_emulation_moe.py", + "sha256": "dcaa60a9ebdb0bd8223b37af41f018ce7f95716ec7cd8526850f4433a579213b" + }, + "vllm/model_executor/layers/fused_moe/experts/rdna3_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/rdna3_moe.py", + "sha256": "e4abd802dc2f0ad9b338ebde397633c761d881c37813e2dc229902c526b597d8" + }, + "vllm/model_executor/layers/fused_moe/experts/rocm_aiter_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/rocm_aiter_moe.py", + "sha256": "bf09a7b783f5752d61cab76221b32b598d8846d801ee39dc9209d636c9659c6f" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_cutlass_moe.py", + "sha256": "ffce5ad627c540940d122d8df7981644b2eb35d07d480995c0f4f30517815fac" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_deep_gemm_moe.py", + "sha256": "c7209fa5e1ccb184a68b37a0706fc571a76696c2ae79802ddc7f889b1c29684d" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_moe.py", + "sha256": "806fbccfe30f5fbd578acf773add99bdf022b12d617958bd6281aef6de369701" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_bf16_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_bf16_moe.py", + "sha256": "76256de96fefece9c41ffb1108487919e24da364cf4412c6c3474498aba59137" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.py", + "sha256": "b54c7ceb45e5d07aa905f42ea44caccf85ca35ba9fb825d4c01947764510f68b" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_lora_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_lora_moe.py", + "sha256": "dd35a9e4242c0dc8d691168813e14bd5543e591f02ee529d0691e07651942c5a" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_mxfp4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_mxfp4_moe.py", + "sha256": "fe780f125a3dc3ba919659e9b85340bd32afcbfe47733a002bfdfb92eadf400c" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_mxint4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_mxint4_moe.py", + "sha256": "2106d67c2951aa690c4656ca58240d09c366cffe8cb4d9fd575df016c377cc30" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_nvfp4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_nvfp4_moe.py", + "sha256": "e938ac9f058f7c90b41c9610513239bec54a95304bfb5ff5f6897ebd54733d7e" + }, + "vllm/model_executor/layers/fused_moe/experts/xpu_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/xpu_moe.py", + "sha256": "2a11bac0cf9274d963315efd6eebdc62978b0b7aa02e8849ff2a562742f0b86d" + }, + "vllm/model_executor/layers/fused_moe/fused_flydsl_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_flydsl_moe.py", + "sha256": "0e74879ee5c72f616ae4064b9dff3b3a0b583b7fc70b8f92f1e8b730ecd5d39b" + }, + "vllm/model_executor/layers/fused_moe/fused_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe.py", + "sha256": "7072eb06237be9d33dcb0ef7101410f886a6363c98cbee70a014c68b70f639cb" + }, + "vllm/model_executor/layers/fused_moe/fused_moe_method_base.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe_method_base.py", + "sha256": "18dcfc469d3252749801bbf943857f58da85de1f2db8fdff5a9f4986a925dc68" + }, + "vllm/model_executor/layers/fused_moe/fused_moe_modular_method.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe_modular_method.py", + "sha256": "321c744eac1fcaffd6b1b2971204c8baa57dfec53e91e5d24140014d72d64f83" + }, + "vllm/model_executor/layers/fused_moe/hpc_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/hpc_moe.py", + "sha256": "2ca9c5d71b6fd91651027905e2b83103a8823845e053e7153e148cb8e0ee666d" + }, + "vllm/model_executor/layers/fused_moe/layer.py": { + "path": "/vllm/model_executor/layers/fused_moe/layer.py", + "sha256": "def0b4e13bcc1e4e21ee10644e647e2eda1acbf0cc01e76d6128abb59ea08224" + }, + "vllm/model_executor/layers/fused_moe/modular_kernel.py": { + "path": "/vllm/model_executor/layers/fused_moe/modular_kernel.py", + "sha256": "8dc4e0dbbf35b3aac8add63ca6f2a7bbfdadaabbd60826e24598b22c7d8e5c22" + }, + "vllm/model_executor/layers/fused_moe/moe_align_block_size.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_align_block_size.py", + "sha256": "c3f7fc2087836f0160a32ab99ceb1d8f6e87c793679da34dd672e225cb7fa31b" + }, + "vllm/model_executor/layers/fused_moe/moe_fused_mul_sum.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_fused_mul_sum.py", + "sha256": "112e72578002c3bff538418dac64b3b56d995994a2fc5e32b18d2cf3b8392a13" + }, + "vllm/model_executor/layers/fused_moe/moe_output.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_output.py", + "sha256": "6ea4cbd78f9efc7f842c5df246f553f08b991c3479b8b04b89902ed08aaf8e8f" + }, + "vllm/model_executor/layers/fused_moe/moe_permute_unpermute.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_permute_unpermute.py", + "sha256": "1adc592c6254d0c877d66be5406afbc822459c18a838f4bbd094a992e7609d06" + }, + "vllm/model_executor/layers/fused_moe/oracle/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/__init__.py", + "sha256": "4dcf941d50d48bb812de0f39e9194bf17a76b8035fe324889c6038f710fdc453" + }, + "vllm/model_executor/layers/fused_moe/oracle/base.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/base.py", + "sha256": "555bbcd18a3744e64eee4e953daabef3bd268a1bd4faf967d4cfd14d6074f685" + }, + "vllm/model_executor/layers/fused_moe/oracle/fp8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/fp8.py", + "sha256": "245bd36c285df1e6f7c51e52dcda31ad247894577a9f8d765613c2c2feae9aee" + }, + "vllm/model_executor/layers/fused_moe/oracle/int8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/int8.py", + "sha256": "c1b67886511bd966b162db5bca8930f04895fb37a969818a4a10f0726c59547f" + }, + "vllm/model_executor/layers/fused_moe/oracle/int_wna16.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/int_wna16.py", + "sha256": "cfffe8b8b290330be9d18ffa07aeecf296484395ff04df3147d99393e48b55c1" + }, + "vllm/model_executor/layers/fused_moe/oracle/mxfp4.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/mxfp4.py", + "sha256": "b7915e6779b5c88e7dcd2d227f003a8e45071d6d86877013067142d4feb64a8c" + }, + "vllm/model_executor/layers/fused_moe/oracle/mxfp8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/mxfp8.py", + "sha256": "9cfdc8102a04bb844dcd7ed88043bba96ec751794bc093da76c69aa8cf88cf48" + }, + "vllm/model_executor/layers/fused_moe/oracle/nvfp4.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/nvfp4.py", + "sha256": "735b4cdeb1258f11fb02320fc0c70cab5edaca468dd60b07b2d369389d2b0313" + }, + "vllm/model_executor/layers/fused_moe/oracle/unquantized.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/unquantized.py", + "sha256": "c8b8203bd0b73bb7f586f703607394d663f14c05711416ad42d45af564382223" + }, + "vllm/model_executor/layers/fused_moe/oracle/w4a8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/w4a8.py", + "sha256": "d7fa6e2982f20b34d5ce9c5ce28a61122762a3fcdd53d249479472a4f2316c6a" + }, + "vllm/model_executor/layers/fused_moe/oracle/w4a8_int8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/w4a8_int8.py", + "sha256": "6d6f9ca2e67b630002873de2f8d8a231d091c5c2f0f3354a9e8209449b481a4c" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/__init__.py", + "sha256": "2800113263a83c2632e522fb22790b29f63384da75d43de32f0ae2f95e8ae4c1" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/batched.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/batched.py", + "sha256": "d52425dd8c08e47cf8d9c3088daf3b1cc721c8667de4c738d04ba997f9a08ccb" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ht.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ht.py", + "sha256": "465cdf1d6cee91b2ee8c2e43abbea6e8408976e3048c10f44c089f34b415bc60" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ll.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ll.py", + "sha256": "f704922b1db680c4c212982a096e09d6b3eb97d89110313f86ed958a00df21b7" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_v2.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_v2.py", + "sha256": "8d690b016bbcfbc9eb599bcc36a6f798b2f1720c828f4347ea742e218c0cc60d" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_one_sided.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_one_sided.py", + "sha256": "acb57d8342af62bb5672036871cd4b27ecc7f37dfa7c894850bb860e6152a1f0" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_two_sided.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_two_sided.py", + "sha256": "cc5b00d6a157b6eca5afaaf7435165dbd1b4524d6d88bf75808cbe074a389f79" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/mori.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/mori.py", + "sha256": "8e9c3b5b1f0de13f467d95bf2f451cba0e4b0d9a1bdcf98da0988a3a9a79a045" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/naive_dp_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/naive_dp_ep.py", + "sha256": "db015e5b18750bbbf5b2bbaceca877dd6f3f3e74c2a94e8dc185f7413b387f91" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/nixl_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/nixl_ep.py", + "sha256": "1f71d70ac509bf5d3d67a8d95a8ee108a50af6bb5d4bde7181ca28e286f6ffce" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/no_dp_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/no_dp_ep.py", + "sha256": "adbbf529cd22059c95b5380952943a70cf11e05e321dcd707f296bebde61a6e7" + }, + "vllm/model_executor/layers/fused_moe/routed_experts.py": { + "path": "/vllm/model_executor/layers/fused_moe/routed_experts.py", + "sha256": "68c48e5df0ea4a7cc1f04436b7b9153eb53802ecd9bb55d38db8738508daac6d" + }, + "vllm/model_executor/layers/fused_moe/routed_experts_capturer.py": { + "path": "/vllm/model_executor/layers/fused_moe/routed_experts_capturer.py", + "sha256": "cd006bc1a1703418cca3b589fafb2abc4268a086fb3db044bbb64348aeac8b13" + }, + "vllm/model_executor/layers/fused_moe/router/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/layers/fused_moe/router/aiter_shared_routed_fused_moe_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/aiter_shared_routed_fused_moe_router.py", + "sha256": "f47046db1275601a2c67c9232afc7b866c9623a19639d5be867e4c7914a35069" + }, + "vllm/model_executor/layers/fused_moe/router/base_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/base_router.py", + "sha256": "47fa2324bcd9b6ebdc138d69ae6b6ecc0f2463d34bda8c5988bdb0a2a76d3fae" + }, + "vllm/model_executor/layers/fused_moe/router/bf16x3_router_gemm_cutedsl.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/bf16x3_router_gemm_cutedsl.py", + "sha256": "d0f1edd1ebc48d88e490bdb3c93db49bdc0a135ff83e7e0b57130e9f8255fc32" + }, + "vllm/model_executor/layers/fused_moe/router/cpu_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/cpu_router.py", + "sha256": "bff36b15818c87bfbb7ee3def7dc7f6396860abbe5893ff6148801fe941a4b92" + }, + "vllm/model_executor/layers/fused_moe/router/custom_routing_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/custom_routing_router.py", + "sha256": "1a40c7054e3c3a1b3ee2e98f6bc9efa9dfdc11f316a8edf7357dd91533487bfe" + }, + "vllm/model_executor/layers/fused_moe/router/dsv4_topk.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/dsv4_topk.py", + "sha256": "14f7c8487b9aef652dd61c91e0e3c3640b643bf9cd0d8a7184157d71f4beb63e" + }, + "vllm/model_executor/layers/fused_moe/router/fused_moe_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_moe_router.py", + "sha256": "0daa0dc05b931d66767feca444a4cd57ecf140f59b40ea0e8ad213eef6da2b36" + }, + "vllm/model_executor/layers/fused_moe/router/fused_topk_bias_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_topk_bias_router.py", + "sha256": "8fdc28cc248180ad4f11bb4bcda3df47926ec12665a0d84bb712fe83fc6b9376" + }, + "vllm/model_executor/layers/fused_moe/router/fused_topk_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_topk_router.py", + "sha256": "1c80f4af4d781fd66b12aa6a7a0fd30082bc521df40f1252987a8ac4c0bef51c" + }, + "vllm/model_executor/layers/fused_moe/router/gate_linear.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/gate_linear.py", + "sha256": "faa43362c2e7c568498a923c682ca18cae75e87f48d00882770821cb19c21198" + }, + "vllm/model_executor/layers/fused_moe/router/grouped_topk_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/grouped_topk_router.py", + "sha256": "048339e1799cdd42c9dae686a6cb891046577fb391b500f0d12eed73c8f61e52" + }, + "vllm/model_executor/layers/fused_moe/router/rocm_fp32_router_gemm.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/rocm_fp32_router_gemm.py", + "sha256": "9c331ef3d0bb2fb6954387d77ac62a99c5c76d2753c7438bfbb5115f68aae5ac" + }, + "vllm/model_executor/layers/fused_moe/router/router_factory.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/router_factory.py", + "sha256": "019bc8adaa7642abab82843efd53cd1a378f62c652521a1de2b781480eb88742" + }, + "vllm/model_executor/layers/fused_moe/router/routing_simulator_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/routing_simulator_router.py", + "sha256": "a7345df5add00cf3bd93024492d6fc1189fd3ecf2754a11cef1b03a295d791f7" + }, + "vllm/model_executor/layers/fused_moe/router/zero_expert_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/zero_expert_router.py", + "sha256": "dea306edd92e2b9c1b43f982ede8e1e10770d2c66220f5a106e0ed0165276e9c" + }, + "vllm/model_executor/layers/fused_moe/runner/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/layers/fused_moe/runner/moe_runner.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/moe_runner.py", + "sha256": "05893188402fe37229bf72d75088d66193c417d5d502daafd3a55e1bfedaa60c" + }, + "vllm/model_executor/layers/fused_moe/runner/moe_runner_interface.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/moe_runner_interface.py", + "sha256": "189cad01611124eb44594713cbf5918d16fc70196dc81a525ae0a7a97a5fcc51" + }, + "vllm/model_executor/layers/fused_moe/runner/shared_experts.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/shared_experts.py", + "sha256": "d89e4c79c46f6fe61262c51f3facf102e71ce1e4eb3db67f72b6bd8470937be9" + }, + "vllm/model_executor/layers/fused_moe/topk_weight_and_reduce.py": { + "path": "/vllm/model_executor/layers/fused_moe/topk_weight_and_reduce.py", + "sha256": "3dfede72d52bf99af40997994704e6c502ee3bab2bd39bfaa8a68d7dae440203" + }, + "vllm/model_executor/layers/fused_moe/unquantized_fused_moe_method.py": { + "path": "/vllm/model_executor/layers/fused_moe/unquantized_fused_moe_method.py", + "sha256": "182a5ec1874ece2091a24c5303f6ab9ea64a9a61adf325b863927f0cdd83e5d3" + }, + "vllm/model_executor/layers/fused_moe/utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/utils.py", + "sha256": "a93a0bded4008db19d8b38370526ae34fafb9c8278e5b4f60acb6acc8fdc1850" + }, + "vllm/model_executor/layers/mamba/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/abstract.py": { + "path": "/vllm/model_executor/layers/mamba/abstract.py", + "sha256": "dfdc8c836894f574e41d93d76ab989cacd3d7ecf59c97a929abfa48d9364e8ad" + }, + "vllm/model_executor/layers/mamba/gdn/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/gdn/base.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/base.py", + "sha256": "7fec748fc74131f5a45bcaf2644b3fa3a0598fd437d7347f8207ea3644a951c5" + }, + "vllm/model_executor/layers/mamba/gdn/kimi_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/kimi_gdn_linear_attn.py", + "sha256": "1cec4da5c9da73557e192bfb36cd540aae51d3e91283b554449c4a97f0f89bd9" + }, + "vllm/model_executor/layers/mamba/gdn/olmo_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/olmo_gdn_linear_attn.py", + "sha256": "60873ca3bb0c4d17c33bd259b62b658db4883cd23138f47dd4ead62cd2ff0605" + }, + "vllm/model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py", + "sha256": "b80f8e6f3fff442fb880aebb3209c52f814f66490009f4ac4003de603576d10a" + }, + "vllm/model_executor/layers/mamba/linear/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/linear/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/linear/bailing_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/linear/bailing_linear_attn.py", + "sha256": "3c480ddd6eba0766ed012a1074bbec5f241d868a87b020b0f6312222c32f93eb" + }, + "vllm/model_executor/layers/mamba/linear/base.py": { + "path": "/vllm/model_executor/layers/mamba/linear/base.py", + "sha256": "26125cd427225954e1846ca361cdaf43f2b56f11b1e217cf26e91a80ef0edb6a" + }, + "vllm/model_executor/layers/mamba/linear/minimax_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/linear/minimax_linear_attn.py", + "sha256": "4adc00f54893b5bc6c31c613deda152a19af3b1bba04153ab5924c3bf2a3aaae" + }, + "vllm/model_executor/layers/mamba/mamba_mixer.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_mixer.py", + "sha256": "a485e937ad9db14d3ad03fde5a9fe795cfa863649563e52fc7e6c52ef631164e" + }, + "vllm/model_executor/layers/mamba/mamba_mixer2.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_mixer2.py", + "sha256": "d58d93e90d9eb90bc5133b79f07c7c62d0032b35d6cf916e3fe34367b81c5cd5" + }, + "vllm/model_executor/layers/mamba/mamba_utils.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_utils.py", + "sha256": "ce9845b4a4ef4bc46577a33038ed69d59ceccb52f30e9c5bdaa36e48be3b2ca4" + }, + "vllm/model_executor/layers/mamba/ops/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/ops/causal_conv1d.py": { + "path": "/vllm/model_executor/layers/mamba/ops/causal_conv1d.py", + "sha256": "044d005cfe59fd0818ed421274e04f3e8dd679b8cdb64fca9f4422f2643484b2" + }, + "vllm/model_executor/layers/mamba/ops/cpu/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/ops/cpu/causal_conv1d.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/causal_conv1d.py", + "sha256": "64104672890ac2ef240c20c7f8059beeade707178574809dbca8721dff5ea6fa" + }, + "vllm/model_executor/layers/mamba/ops/cpu/gdn_attention.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/gdn_attention.py", + "sha256": "a50288945bf5b102ad3025ae536638dcc32d84cf7c22aaf3a85326b0c1c56c1f" + }, + "vllm/model_executor/layers/mamba/ops/cpu/mamba_ssm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/mamba_ssm.py", + "sha256": "5839e576172a3246337f5e4fb1bc19eb583b3e2b2f7e35dd060dc3041eb8372d" + }, + "vllm/model_executor/layers/mamba/ops/gather_initial_states.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gather_initial_states.py", + "sha256": "5198bb6de6d91c583a5f65d926412a76ee04a06fa72aaba76eaf156b27cd0523" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/__init__.py", + "sha256": "b88b52e71fcb21bd3fa215ea171dcd2ad2ff17c97788cfe64caa7ba45c7ecf97" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_h.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_h.py", + "sha256": "f50bbe5c0b6382323ec5dfc24a5e0c7971113d59727515e60c9fe3689734e5ba" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_kkt_inv_uw.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_kkt_inv_uw.py", + "sha256": "b4a65dd194907db08865e0596fe254f915e670a9e6b27ffa2933c1026dde9b1e" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_o.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_o.py", + "sha256": "629f7843a7e611efb9390f2ebb7a4b924b2c328d48a317fddfaa96af4d9bc60a" + }, + "vllm/model_executor/layers/mamba/ops/layernorm_gated.py": { + "path": "/vllm/model_executor/layers/mamba/ops/layernorm_gated.py", + "sha256": "3433f2e3b87c2b2ccf8e9794ce40762c86a6da38a94ecee001f439ea0d0373dd" + }, + "vllm/model_executor/layers/mamba/ops/mamba_ssm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/mamba_ssm.py", + "sha256": "a4515ec7895b40ed878cf380445034b25faa61fbaa799d96c49217bbdfd7e400" + }, + "vllm/model_executor/layers/mamba/ops/replayssm_config.py": { + "path": "/vllm/model_executor/layers/mamba/ops/replayssm_config.py", + "sha256": "5fe9d5d7aa2de6a65875b3796a919b22bc435fd76055ba054bbff43aa005bc44" + }, + "vllm/model_executor/layers/mamba/ops/scatter_states.py": { + "path": "/vllm/model_executor/layers/mamba/ops/scatter_states.py", + "sha256": "f3bb004c73edaba56337747893eb07faf29b270dc8bb9c893ee9b1044e4ead9a" + }, + "vllm/model_executor/layers/mamba/ops/selective_state_update_replayssm_output_only.py": { + "path": "/vllm/model_executor/layers/mamba/ops/selective_state_update_replayssm_output_only.py", + "sha256": "cea7fd3063ca9dcc4e33f180d01ea379195ec515cedc9d0b03b11dc67670d695" + }, + "vllm/model_executor/layers/mamba/ops/ssd_bmm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_bmm.py", + "sha256": "26983d97a7f5c5f9197a16a6bee7b1294839b9ae31a14c14aaee38b43523e630" + }, + "vllm/model_executor/layers/mamba/ops/ssd_chunk_scan.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_chunk_scan.py", + "sha256": "d5ef32e8cb47e2ce71984579df78ab69754895f891766394daf327867cfa4f8f" + }, + "vllm/model_executor/layers/mamba/ops/ssd_chunk_state.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_chunk_state.py", + "sha256": "177e3aa7fe72647133bbd86135533e8688a5802678d4d1564aa549410362316f" + }, + "vllm/model_executor/layers/mamba/ops/ssd_combined.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_combined.py", + "sha256": "1317bbb668d3c60dfe0658850f9968614f03fa5eb61196f8ce6ac17dbb31b480" + }, + "vllm/model_executor/layers/mamba/ops/ssd_state_passing.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_state_passing.py", + "sha256": "36b8c8edba437916a5b789717c61fc22077de01e77892cb96dbff3b00a57410e" + }, + "vllm/model_executor/layers/mamba/ops/ssu_dispatch.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssu_dispatch.py", + "sha256": "bbe0f0e61da87f3ddfead19a79ca376516b63f1ea868be3485333c63fa20ef41" + }, + "vllm/model_executor/layers/mamba/ops/triton_helpers.py": { + "path": "/vllm/model_executor/layers/mamba/ops/triton_helpers.py", + "sha256": "a8795532f22c37a93e82c9d8e3fadcb5f4da98673d7b321fe8481305eaafad30" + }, + "vllm/model_executor/layers/mamba/short_conv.py": { + "path": "/vllm/model_executor/layers/mamba/short_conv.py", + "sha256": "228494efab185ee17374f762874f4c8b9a26aac9decfa8c906ce38446e0de51a" + }, + "vllm/model_executor/models/qwen3_next.py": { + "path": "/vllm/model_executor/models/qwen3_next.py", + "sha256": "4fa5112ac2bf7886d41d9e1f6c3da8793620d1ec49c961b31e9609459a6a7f7a" + }, + "vllm/third_party/flash_linear_attention/__init__.py": { + "path": "/vllm/third_party/flash_linear_attention/__init__.py", + "sha256": "5dbbfa3fc286edb2e970e175ef33cee4f6181c89b0784f5a8986201b2312f54e" + }, + "vllm/third_party/flash_linear_attention/ops/__init__.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/__init__.py", + "sha256": "dd738dc1d08045e76455cdbe16052a5b769e0eb11d6e87ff28353994f880cd6c" + }, + "vllm/third_party/flash_linear_attention/ops/chunk.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk.py", + "sha256": "c105ead259e86aedc248c53e7c4cef07034d0ff12da608d80265d1dd0990803f" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_delta_h.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_delta_h.py", + "sha256": "1b3ad391f939d9443c6b7adb19e57fe381bd5dccea064e8417a4f85b0e713b26" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_o.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_o.py", + "sha256": "3b63b836a8cc561723c23db5a528a0b474d9cd78508d610f0b348c585a889a19" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_scaled_dot_kkt.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_scaled_dot_kkt.py", + "sha256": "7ae41df3755acc7e925a134d848f78bb5fc00b90069039d86403c5853323ea42" + }, + "vllm/third_party/flash_linear_attention/ops/cumsum.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/cumsum.py", + "sha256": "d818215669b451868823202ac0bcea77e7a9d75957254c7c1060a73a55dc39b6" + }, + "vllm/third_party/flash_linear_attention/ops/fused_gdn_prefill_post_conv.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_gdn_prefill_post_conv.py", + "sha256": "590717b2107abc90d72548de06b5d315229eb2775c94614f3f545df11cc2b5df" + }, + "vllm/third_party/flash_linear_attention/ops/fused_norm_gate.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_norm_gate.py", + "sha256": "e6eb90467f29d8a0a04f2a364d20a2c3191b6ab857841bfb82076b33a6022d1a" + }, + "vllm/third_party/flash_linear_attention/ops/fused_recurrent.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_recurrent.py", + "sha256": "fe6f1311014809040497aa0a623e7fa97f4b3457cdc7ee1f1f8aed21f326f755" + }, + "vllm/third_party/flash_linear_attention/ops/fused_sigmoid_gating.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_sigmoid_gating.py", + "sha256": "000ab8996af9788fdb8843a6a3b91833e7a14c8acc0e1ea073a536330f64cb6f" + }, + "vllm/third_party/flash_linear_attention/ops/index.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/index.py", + "sha256": "a4f8b2c052635cb519a80099e8a85411d1d5d6880b38f466788259bbe66b154d" + }, + "vllm/third_party/flash_linear_attention/ops/kda.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/kda.py", + "sha256": "e1f31aaa89b91f8e5db6d070b229e2c81c7206e8caec67de41db97d06be0c476" + }, + "vllm/third_party/flash_linear_attention/ops/l2norm.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/l2norm.py", + "sha256": "520f4513ef4fc97e6b88dc07877cca8e29da0d34e44673fe989e3af002d86381" + }, + "vllm/third_party/flash_linear_attention/ops/layernorm_guard.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/layernorm_guard.py", + "sha256": "42af29be26e8fc94a4658e053c095fcdab9ffdc1bc2446a01e787deda2a298c0" + }, + "vllm/third_party/flash_linear_attention/ops/op.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/op.py", + "sha256": "456da84fd12411cf53c96a90dd4f78f49afb454c3d51d2c524ea8e7106fe8ae5" + }, + "vllm/third_party/flash_linear_attention/ops/solve_tril.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/solve_tril.py", + "sha256": "d1a4ff27623a938825052500afa7e2aa24fadd2fa4c9be6376c9128824f86f82" + }, + "vllm/third_party/flash_linear_attention/ops/utils.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/utils.py", + "sha256": "d6c90d36505e02086954c23ca4dd2fea82a69416d68ff1d0501e16b3148b5b0c" + }, + "vllm/third_party/flash_linear_attention/ops/wy_fast.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/wy_fast.py", + "sha256": "c9fc8259db0a8746dc04f1d799cb73333457118cf89a0bdce8dde8a80a28cd96" + }, + "vllm/v1/attention/__init__.py": { + "path": "/vllm/v1/attention/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backend.py": { + "path": "/vllm/v1/attention/backend.py", + "sha256": "01ac364372afa75fdb22486aa3a9c7cf9aebb742e3471dfb9e0f9d9d36b734bc" + }, + "vllm/v1/attention/backends/__init__.py": { + "path": "/vllm/v1/attention/backends/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backends/b12x.py": { + "path": "/vllm/v1/attention/backends/b12x.py", + "sha256": "443f0a98738fdfefe5b9ab151d278bfd43a8ac807eb2b0b9b2a13d51922afbf9" + }, + "vllm/v1/attention/backends/composite.py": { + "path": "/vllm/v1/attention/backends/composite.py", + "sha256": "4cf3d66dca891562709eed4f50aa14b0ae6c8240d9ea86504a3304b2f356cce0" + }, + "vllm/v1/attention/backends/cpu_attn.py": { + "path": "/vllm/v1/attention/backends/cpu_attn.py", + "sha256": "76fb02a6bd725125565d84bf04f627cf16da5f7ff8f31f87c01ed6a1439398c7" + }, + "vllm/v1/attention/backends/fa_utils.py": { + "path": "/vllm/v1/attention/backends/fa_utils.py", + "sha256": "08fa6e231d3af3a71a6e59162dd12328aa8beb28548165ae58f130a92adb5a83" + }, + "vllm/v1/attention/backends/flash_attn.py": { + "path": "/vllm/v1/attention/backends/flash_attn.py", + "sha256": "b170a4789e18104c1bee35bea70df51abe6766693d8f4726a59f2e6f5c4282aa" + }, + "vllm/v1/attention/backends/flash_attn_diffkv.py": { + "path": "/vllm/v1/attention/backends/flash_attn_diffkv.py", + "sha256": "e4627c88c3ba8caee260540e994cc8137fd2ff7cd7813356b36387c6c88ce30a" + }, + "vllm/v1/attention/backends/flashinfer.py": { + "path": "/vllm/v1/attention/backends/flashinfer.py", + "sha256": "8ee541fde43ed92a417b3f01ea1e6fc64af8ab2eb54cbfc28308a49aaca4ed7f" + }, + "vllm/v1/attention/backends/flex_attention.py": { + "path": "/vllm/v1/attention/backends/flex_attention.py", + "sha256": "ad07f0ad73aeeadc3534b3a05c14f88a62cb3638874239ae9823c49b36276dc3" + }, + "vllm/v1/attention/backends/gdn_attn.py": { + "path": "/vllm/v1/attention/backends/gdn_attn.py", + "sha256": "3831019404a92200a38b43571c040cffeb6638bbdc71e4cb5e680dbc6c93d054" + }, + "vllm/v1/attention/backends/hpc_attn.py": { + "path": "/vllm/v1/attention/backends/hpc_attn.py", + "sha256": "af9e2aec1b498f0ee48a2dce3cf5646edf1976466980b2fd927c0e82b875427c" + }, + "vllm/v1/attention/backends/linear_attn.py": { + "path": "/vllm/v1/attention/backends/linear_attn.py", + "sha256": "bc42144fcd027434c6a10dc9f4c5f991db8899d387af5f6485402ce097eb0513" + }, + "vllm/v1/attention/backends/mamba1_attn.py": { + "path": "/vllm/v1/attention/backends/mamba1_attn.py", + "sha256": "32159dae11cab3c8c576b9514ad97d5108c8d1b4cac9fcfe345ec6a76223aee7" + }, + "vllm/v1/attention/backends/mamba2_attn.py": { + "path": "/vllm/v1/attention/backends/mamba2_attn.py", + "sha256": "a5bcdecb7b9547137023e1c77a386003358fa940eaf5f319ed142211dcdba139" + }, + "vllm/v1/attention/backends/mamba_attn.py": { + "path": "/vllm/v1/attention/backends/mamba_attn.py", + "sha256": "5e7b2c4058fc5e6096d001bff6c789b78368b025bbe4600f191aaca2ff59b59f" + }, + "vllm/v1/attention/backends/mla/__init__.py": { + "path": "/vllm/v1/attention/backends/mla/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backends/mla/aiter_triton_mla.py": { + "path": "/vllm/v1/attention/backends/mla/aiter_triton_mla.py", + "sha256": "ed0e285cdae06a019150c41cc958b3c0b5ceb0e4f299d5318d1c90e2c2395390" + }, + "vllm/v1/attention/backends/mla/amx_mla.py": { + "path": "/vllm/v1/attention/backends/mla/amx_mla.py", + "sha256": "7f5cddec30b2dfe22ccdbd3b9da673c879719bf6da4074317bd60add55f5d15f" + }, + "vllm/v1/attention/backends/mla/compressor_utils.py": { + "path": "/vllm/v1/attention/backends/mla/compressor_utils.py", + "sha256": "3589e94105368ea285c40b82db1a0332682ff5d071fe363627cf4c0d10f3facf" + }, + "vllm/v1/attention/backends/mla/cpu_mla.py": { + "path": "/vllm/v1/attention/backends/mla/cpu_mla.py", + "sha256": "ff2110b9f78e92adf6bab294465cbc294ae1ff71cb1780fed158179e134a4ca6" + }, + "vllm/v1/attention/backends/mla/cutlass_mla.py": { + "path": "/vllm/v1/attention/backends/mla/cutlass_mla.py", + "sha256": "211d298680f9bd793cc468281b316d6633c5f4eb6dcec71d3329b034a23ab9b5" + }, + "vllm/v1/attention/backends/mla/flashattn_mla.py": { + "path": "/vllm/v1/attention/backends/mla/flashattn_mla.py", + "sha256": "ac89e0ad75a37e92566d264bafe324735a80f9ab4709241a4454d17b3d38bb63" + }, + "vllm/v1/attention/backends/mla/flashattn_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashattn_mla_sparse.py", + "sha256": "67dd3ead2e8b9d8cda0825ecc93779cb7d670628bc741c759a7d3cd5d474030f" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla.py", + "sha256": "0c24ff016fb6b0bb41d9e7484b6f1af42f37bcc384ed613473fc3e01ad25f664" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse.py", + "sha256": "2116d965b2067134d8afa5878d4d16c0149b061258f50c4106d993aa13b073cc" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm120.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm120.py", + "sha256": "102ca08793d567f95598eefeb34c3f6ec50b3b9d704f162d1402b97b12b5777b" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm90.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm90.py", + "sha256": "df9fe4970aa3f53cf24784b8534b89e0101a2ca20a35a2ebbc9a12a4463d5993" + }, + "vllm/v1/attention/backends/mla/flashmla.py": { + "path": "/vllm/v1/attention/backends/mla/flashmla.py", + "sha256": "c9d8046a853ecbdeff9ebfc738f5bb34c4f272b278231a09a0fbf73708c7c188" + }, + "vllm/v1/attention/backends/mla/flashmla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashmla_sparse.py", + "sha256": "7a379c717adb9667ce94cbc16c0e3a1fb22a169713db6d7941c141fa84077b3f" + }, + "vllm/v1/attention/backends/mla/index_group.py": { + "path": "/vllm/v1/attention/backends/mla/index_group.py", + "sha256": "c24e028c3c160a9bb92e043da5b5b34c805e84745b7c4b8da6fb8702a0ddd641" + }, + "vllm/v1/attention/backends/mla/indexer.py": { + "path": "/vllm/v1/attention/backends/mla/indexer.py", + "sha256": "2acbc1c4fa57c3424ad95e6ecbe76eb7141747773c3e867ce704f4adccba892a" + }, + "vllm/v1/attention/backends/mla/prefill/__init__.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/__init__.py", + "sha256": "903630eb705dd175bf4ae4558a4bcaa07c110056b6a11eb830fdd2fb21b3c48a" + }, + "vllm/v1/attention/backends/mla/prefill/aiter_flash_attn.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/aiter_flash_attn.py", + "sha256": "571b8a9910c4ea3fefda60659026f3bf0d7b542c34553c8c9a4d43bb82077e61" + }, + "vllm/v1/attention/backends/mla/prefill/base.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/base.py", + "sha256": "138bf3ddaf5a94c3cdbc4e08ac676edcae84b32fc76625e546f3b47f7d8b82ec" + }, + "vllm/v1/attention/backends/mla/prefill/cpu_sdpa.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/cpu_sdpa.py", + "sha256": "1bb686395274a8ec0d9fd7327410a527655fe060cbbc263eab138fea988d96de" + }, + "vllm/v1/attention/backends/mla/prefill/flash_attn.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/flash_attn.py", + "sha256": "5e648c82c82e5f81fe11458eb82b9f90b50fc06df2ade3bf111ee6b7a2ee8481" + }, + "vllm/v1/attention/backends/mla/prefill/flashinfer.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/flashinfer.py", + "sha256": "63861219c35b8abc0ebe01e1f51543c5ed40bd46119ca261d927da7c6826b49b" + }, + "vllm/v1/attention/backends/mla/prefill/registry.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/registry.py", + "sha256": "c8c30b92213d594beaa3cab4d5003da26a85870dbb11d1ab73191962d0645b53" + }, + "vllm/v1/attention/backends/mla/prefill/selector.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/selector.py", + "sha256": "101d9fca7924b0c5d7891a17fe8942611bd6759e32b03a571dc87b14c1430f2f" + }, + "vllm/v1/attention/backends/mla/prefill/tokenspeed_mla.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/tokenspeed_mla.py", + "sha256": "047cf07bfcc83db3b11a6a54ffe189f6146e6ec9ad33ce2fa7d18860bf4210f0" + }, + "vllm/v1/attention/backends/mla/prefill/trtllm_ragged.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/trtllm_ragged.py", + "sha256": "9e13ea6f6a25accedd918c0de64bbb812ccb20ffb95350ab018a6e76d493789b" + }, + "vllm/v1/attention/backends/mla/rocm_aiter_mla.py": { + "path": "/vllm/v1/attention/backends/mla/rocm_aiter_mla.py", + "sha256": "b489f5830c655bfb6299801a70d69b9821513c69568ecab3689db5a7be867be5" + }, + "vllm/v1/attention/backends/mla/rocm_aiter_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/rocm_aiter_mla_sparse.py", + "sha256": "91b1d9b3d860a9720bc01b8ebe9bbe8649a7d6bca20d4b63939bc100309bca19" + }, + "vllm/v1/attention/backends/mla/sparse_swa.py": { + "path": "/vllm/v1/attention/backends/mla/sparse_swa.py", + "sha256": "a47853ad8a3fe40f24704592581ea323a18041b84610df010a5534da634e311e" + }, + "vllm/v1/attention/backends/mla/sparse_utils.py": { + "path": "/vllm/v1/attention/backends/mla/sparse_utils.py", + "sha256": "c3cdf060288c05542243a9fe8b5ad3a963ad75e9ce399009b5e45c1235a88ce4" + }, + "vllm/v1/attention/backends/mla/tokenspeed_mla.py": { + "path": "/vllm/v1/attention/backends/mla/tokenspeed_mla.py", + "sha256": "b9ba523c606430cecb99a88b28c53d98a99dcf5e76105a80664338110a20f1ad" + }, + "vllm/v1/attention/backends/mla/triton_mla.py": { + "path": "/vllm/v1/attention/backends/mla/triton_mla.py", + "sha256": "21b16b3b34470edcc33d0423e560837c1d37d4bab31c7b3b9cfd7faa47864b51" + }, + "vllm/v1/attention/backends/mla/xpu_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/xpu_mla_sparse.py", + "sha256": "559c6240fe466521a6b2df4c94aea02ddf3f5efa5ba6954fa180c5a51c0f12d2" + }, + "vllm/v1/attention/backends/recoverssm_metadata.py": { + "path": "/vllm/v1/attention/backends/recoverssm_metadata.py", + "sha256": "02896a667db0f0308371ceb50048b18e5866c0235d163c0357e9a05dcedb3394" + }, + "vllm/v1/attention/backends/registry.py": { + "path": "/vllm/v1/attention/backends/registry.py", + "sha256": "378e8ee78734bd8c8adbe287d4c0a4058dcbb553195a09fbcce00a3cc30adc29" + }, + "vllm/v1/attention/backends/rocm_aiter_fa.py": { + "path": "/vllm/v1/attention/backends/rocm_aiter_fa.py", + "sha256": "d1418af03bf58209c850f466b712d3ea22a14ebb758c42dd43e65738281841fd" + }, + "vllm/v1/attention/backends/rocm_aiter_unified_attn.py": { + "path": "/vllm/v1/attention/backends/rocm_aiter_unified_attn.py", + "sha256": "59d2645eb4c91dc0567754a7163d066f4f2faf48f1957b254fcdd5604e9d8c8c" + }, + "vllm/v1/attention/backends/rocm_attn.py": { + "path": "/vllm/v1/attention/backends/rocm_attn.py", + "sha256": "4a8f57067073fbceb784af6c3467487c450d00fa3957928fadb99a79f6036292" + }, + "vllm/v1/attention/backends/short_conv_attn.py": { + "path": "/vllm/v1/attention/backends/short_conv_attn.py", + "sha256": "84fc460ef2fbd09743b069bec0c14b39542af6c2254a403e37a048427e151121" + }, + "vllm/v1/attention/backends/triton_attn.py": { + "path": "/vllm/v1/attention/backends/triton_attn.py", + "sha256": "1057663d110e1d5229495a799027b27277c1eca325d5b6780fa2259afbf58a1a" + }, + "vllm/v1/attention/backends/triton_attn_diffkv.py": { + "path": "/vllm/v1/attention/backends/triton_attn_diffkv.py", + "sha256": "de0357eae005246642140f1ab8842ba5ed8bff5c84b18a6d3a7bbf409c578301" + }, + "vllm/v1/attention/backends/triton_flash_attn.py": { + "path": "/vllm/v1/attention/backends/triton_flash_attn.py", + "sha256": "176e45329aeb28a2008362bb607d1b8c89816eb665859ab908b0385a11acf1c2" + }, + "vllm/v1/attention/backends/triton_flashinfer.py": { + "path": "/vllm/v1/attention/backends/triton_flashinfer.py", + "sha256": "48d5f967e388d4e8d6bbec8d827b44d855346bc2fada28adf65768bf6623527b" + }, + "vllm/v1/attention/backends/turboquant_attn.py": { + "path": "/vllm/v1/attention/backends/turboquant_attn.py", + "sha256": "616d16d608d9d1fbf6c29548037e7e9cf330f4d36a01aa3ffabf42a731eb6e2b" + }, + "vllm/v1/attention/backends/utils.py": { + "path": "/vllm/v1/attention/backends/utils.py", + "sha256": "fbc221360d2d54cb21ef3f625dc8711500de345a355801548b4337bb9b8abee0" + }, + "vllm/v1/attention/ops/__init__.py": { + "path": "/vllm/v1/attention/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/ops/chunked_prefill_paged_decode.py": { + "path": "/vllm/v1/attention/ops/chunked_prefill_paged_decode.py", + "sha256": "973db848a790b2e8d99e728b2fc4f44b501bbe58c62747244ddff04cfcf11a85" + }, + "vllm/v1/attention/ops/common.py": { + "path": "/vllm/v1/attention/ops/common.py", + "sha256": "b4b67e7fc0cce471e337d742c097fba06da7563816e8799e27719714e31e1d5b" + }, + "vllm/v1/attention/ops/cp_common.py": { + "path": "/vllm/v1/attention/ops/cp_common.py", + "sha256": "2369181862e96db64b14ef20c5c2e249ed2ea5f3dea2467a2aa388372bb86d9d" + }, + "vllm/v1/attention/ops/dcp.py": { + "path": "/vllm/v1/attention/ops/dcp.py", + "sha256": "a478bdc781460f0582cfaf74d6431f1a826c201f02f39d882d12a96139bc3f28" + }, + "vllm/v1/attention/ops/flashmla.py": { + "path": "/vllm/v1/attention/ops/flashmla.py", + "sha256": "8a40d6e120e3ab25a95fcfeb32b0b5b4c1ea02b984633866628536dcd26ed2e8" + }, + "vllm/v1/attention/ops/flydsl_kernels/__init__.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/attention/ops/flydsl_kernels/tq_decode.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/tq_decode.py", + "sha256": "cc4b7f82897596e0974b3d3a710a1a8bc58c3d22b72cc7f461dd1c4acd2e451b" + }, + "vllm/v1/attention/ops/flydsl_kernels/tq_decode_gqa6.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/tq_decode_gqa6.py", + "sha256": "a983f6d375c325900955e11696dab1e2665770e83f84d51f93d3ed5e1d8880e0" + }, + "vllm/v1/attention/ops/flydsl_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/flydsl_turboquant_decode.py", + "sha256": "7b1dd0ef7c7fb28a6a8831759e00b939ab844d067657155cc11cf75532a22c63" + }, + "vllm/v1/attention/ops/int4_per_token_head.py": { + "path": "/vllm/v1/attention/ops/int4_per_token_head.py", + "sha256": "d91968f280cd8eaed7570ab255f0276b40e833e18a25066d371d9ca8149425f2" + }, + "vllm/v1/attention/ops/merge_attn_states.py": { + "path": "/vllm/v1/attention/ops/merge_attn_states.py", + "sha256": "ad08403d2843fc892f0b0b4b9f5fabb81884556f89f7170dca46ccef498a3539" + }, + "vllm/v1/attention/ops/metadata.py": { + "path": "/vllm/v1/attention/ops/metadata.py", + "sha256": "ca882b84c5aaefb1f77e4d8ea09a00103fbc53defa8671bba036c961c17fc760" + }, + "vllm/v1/attention/ops/paged_attn.py": { + "path": "/vllm/v1/attention/ops/paged_attn.py", + "sha256": "016a95f892ec751c86b37be1e12171bad9f0b4076bbf2219ff336f4e9c503653" + }, + "vllm/v1/attention/ops/pcp.py": { + "path": "/vllm/v1/attention/ops/pcp.py", + "sha256": "dadeff95fe2df2be8028baabeef01b0d2d628cd67de2176915e737ce096de3dd" + }, + "vllm/v1/attention/ops/prefix_prefill.py": { + "path": "/vllm/v1/attention/ops/prefix_prefill.py", + "sha256": "b08ad92db715fc03c11699de3de463d55e411f42f77548e06b41049a61de692f" + }, + "vllm/v1/attention/ops/rocm_aiter_mla_merge.py": { + "path": "/vllm/v1/attention/ops/rocm_aiter_mla_merge.py", + "sha256": "564c66e4877732e48a6f7d52405c43dc952eec0f0ae4353d34886bca056132b9" + }, + "vllm/v1/attention/ops/rocm_aiter_mla_sparse.py": { + "path": "/vllm/v1/attention/ops/rocm_aiter_mla_sparse.py", + "sha256": "feec664be5045fd1ba13b8f6ef83b52c96910ddc78baca0431bcf610c9e8f5cc" + }, + "vllm/v1/attention/ops/triton_attention_helpers.py": { + "path": "/vllm/v1/attention/ops/triton_attention_helpers.py", + "sha256": "35aa993d01345f535d2641cf9dcabb8b64c51b20a19707bc5987e616aaa87ddd" + }, + "vllm/v1/attention/ops/triton_decode_attention.py": { + "path": "/vllm/v1/attention/ops/triton_decode_attention.py", + "sha256": "b9823c65eba22d76abf64dad7d7d16a950f67471c86d6cb5b3e983aaf14381ac" + }, + "vllm/v1/attention/ops/triton_merge_attn_states.py": { + "path": "/vllm/v1/attention/ops/triton_merge_attn_states.py", + "sha256": "f63229162181ab93198550b73a115f1cc1034cfd60e6f58bc8ab3e22a6e8ce60" + }, + "vllm/v1/attention/ops/triton_prefill_attention.py": { + "path": "/vllm/v1/attention/ops/triton_prefill_attention.py", + "sha256": "352c1a4ac86146580040579fb217c2e288268830d6602b735713e154f36d74fe" + }, + "vllm/v1/attention/ops/triton_reshape_and_cache_flash.py": { + "path": "/vllm/v1/attention/ops/triton_reshape_and_cache_flash.py", + "sha256": "6cac51475b8c656992a21b2d150acd3a16a95a7ab7d49aab151a3ef13c24b80d" + }, + "vllm/v1/attention/ops/triton_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/triton_turboquant_decode.py", + "sha256": "8e52678136449e4bbca2195fbcbb87426c955a2b1b8422e7ab9511e45ee5f5c6" + }, + "vllm/v1/attention/ops/triton_turboquant_store.py": { + "path": "/vllm/v1/attention/ops/triton_turboquant_store.py", + "sha256": "6e6e2fe74a307d40f0be786ccbaea76d989e3c7b5985f3144a5218c61bf6d902" + }, + "vllm/v1/attention/ops/triton_unified_attention.py": { + "path": "/vllm/v1/attention/ops/triton_unified_attention.py", + "sha256": "65d0fbcf33d00789df8ca688c0a1c908e710cfaef53471178747ecae11f05829" + }, + "vllm/v1/attention/ops/triton_unified_attention_diffkv.py": { + "path": "/vllm/v1/attention/ops/triton_unified_attention_diffkv.py", + "sha256": "7fa36d7b7441f1c396e0348eac61d691d2e459e5c4c393c4aa262dfb670e68f7" + }, + "vllm/v1/attention/ops/turboquant_soa/__init__.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/__init__.py", + "sha256": "6b43b6fcb2a71c44ceff4ed1edd417a839f4901251ba15831b09ad979baa4984" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode.py", + "sha256": "bf00634191bba14cbf4a23c1d67dc3dcb244c2b8989f08362757b54435830986" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode_v2.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode_v2.py", + "sha256": "28e7ecc15c450d3591983a50c46a03aa6ca6fa99304c17c333940617d9916485" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_store.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_store.py", + "sha256": "dccf93b9fdd34f9b9eacd468e9de35b9d93378594487c335cf50642aaec681f2" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_unified_attention.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_unified_attention.py", + "sha256": "b4b2b5f3985b3a6126fd052e6ec1ed91c610da8a525a9ae7470ac829405bd85c" + }, + "vllm/v1/attention/ops/vit_attn_wrappers.py": { + "path": "/vllm/v1/attention/ops/vit_attn_wrappers.py", + "sha256": "a99d57b58269c7521fa5d7d47af06551f3bab2b5c7358ef78165a7f6e20a92a6" + }, + "vllm/v1/attention/ops/xpu_mla_sparse.py": { + "path": "/vllm/v1/attention/ops/xpu_mla_sparse.py", + "sha256": "d98d17110577c2b7b4d05e07bfdae15faf83321b6342a5daaaecce45b9503f38" + }, + "vllm/v1/attention/selector.py": { + "path": "/vllm/v1/attention/selector.py", + "sha256": "87f653ded7974875183c920e3e4589c28116bcbc99714d1da7cb51ae77c0b182" + }, + "vllm/v1/core/sched/__init__.py": { + "path": "/vllm/v1/core/sched/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/core/sched/async_scheduler.py": { + "path": "/vllm/v1/core/sched/async_scheduler.py", + "sha256": "e586a0ef3c6778be56a93e7f9bb712d4de9de6e7d7fe7e3e1d51dae83ecfc508" + }, + "vllm/v1/core/sched/interface.py": { + "path": "/vllm/v1/core/sched/interface.py", + "sha256": "be6c008664096c5660a8879de72b315bbe479bf1d688be9b25891063ec53a367" + }, + "vllm/v1/core/sched/output.py": { + "path": "/vllm/v1/core/sched/output.py", + "sha256": "3a66c8efaefe10c572f6f33cf1f8aa4610758c945130cad62eb9f7331005677c" + }, + "vllm/v1/core/sched/request_queue.py": { + "path": "/vllm/v1/core/sched/request_queue.py", + "sha256": "4b8d938e5fb8152fe61030b8aa991f983fcac9a405c37ed8908045e05e82ae5e" + }, + "vllm/v1/core/sched/scheduler.py": { + "path": "/vllm/v1/core/sched/scheduler.py", + "sha256": "c1db45f3bbad3a875dd8638331b8870c4380ac1ab4734265ba5c863833a82884" + }, + "vllm/v1/core/sched/utils.py": { + "path": "/vllm/v1/core/sched/utils.py", + "sha256": "1ed988044eb8028c77ede875bd1a5fd05ff6998b455d61e3997d6a3d7fc1c3a7" + }, + "vllm/v1/sample/__init__.py": { + "path": "/vllm/v1/sample/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/sample/logits_processor/__init__.py": { + "path": "/vllm/v1/sample/logits_processor/__init__.py", + "sha256": "1f9b02dae8cf6d44484638037123d3a2dec6b7b9a2bcc9afceef1a9bf3eaedec" + }, + "vllm/v1/sample/logits_processor/builtin.py": { + "path": "/vllm/v1/sample/logits_processor/builtin.py", + "sha256": "6105816ece77e5b1dbee0d07abc90ce039d650bac2ddb85c93280c48b00f2ebe" + }, + "vllm/v1/sample/logits_processor/interface.py": { + "path": "/vllm/v1/sample/logits_processor/interface.py", + "sha256": "171dfc6ef9b5b53128e8eaecc4bdf1de413a706d64bf5be686048f583c66eee1" + }, + "vllm/v1/sample/logits_processor/state.py": { + "path": "/vllm/v1/sample/logits_processor/state.py", + "sha256": "a96411f14362c45f839e181dcb3ac01d5b880812bccb3552fc17863b219f44ac" + }, + "vllm/v1/sample/metadata.py": { + "path": "/vllm/v1/sample/metadata.py", + "sha256": "6582cfe1a240c7ddb975f0ef6dd7dcd28dcf0fc7670394390250013977aa7ffd" + }, + "vllm/v1/sample/ops/__init__.py": { + "path": "/vllm/v1/sample/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/sample/ops/bad_words.py": { + "path": "/vllm/v1/sample/ops/bad_words.py", + "sha256": "0b1d0a9b13b92ddcae2c83393c07a34c0f107813725700dee794caa7fe7f3b12" + }, + "vllm/v1/sample/ops/logprobs.py": { + "path": "/vllm/v1/sample/ops/logprobs.py", + "sha256": "b286f69012a6758bfe9250038b0697294dbffe0d32c6906f284c39f75ee48be3" + }, + "vllm/v1/sample/ops/penalties.py": { + "path": "/vllm/v1/sample/ops/penalties.py", + "sha256": "4debfcf247b3887478d2b9ec98f108756bbed2805462777ef6b56f3bdf4ce682" + }, + "vllm/v1/sample/ops/topk_topp_sampler.py": { + "path": "/vllm/v1/sample/ops/topk_topp_sampler.py", + "sha256": "13ea4359832bc914492330958ec4f5ac140f408b8f410cc05c6eaf7ddcd70be4" + }, + "vllm/v1/sample/ops/topk_topp_triton.py": { + "path": "/vllm/v1/sample/ops/topk_topp_triton.py", + "sha256": "0b5fc337058e22bc28a8530ccec904d6ccd89b9548b02955c657ac429b1669d2" + }, + "vllm/v1/sample/rejection_sampler.py": { + "path": "/vllm/v1/sample/rejection_sampler.py", + "sha256": "0bb9d224887ccb1355e16199005cc23a4afc6fa75156eca419851b7247d99750" + }, + "vllm/v1/sample/sampler.py": { + "path": "/vllm/v1/sample/sampler.py", + "sha256": "f95805b2c6d06218c724826aa5f881a606e8d0a534a566aee7c85948520dd216" + }, + "vllm/v1/sample/thinking_budget_state.py": { + "path": "/vllm/v1/sample/thinking_budget_state.py", + "sha256": "962f8f55210eb0a431cb9c78b013e35f7a7dd58d06d6fb2e7fcff1b457356f8e" + }, + "vllm/v1/worker/__init__.py": { + "path": "/vllm/v1/worker/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/block_table.py": { + "path": "/vllm/v1/worker/block_table.py", + "sha256": "a09b8819e1417b7a186cf3472224e2138fc5d41a291c6692bb7df711b0c44259" + }, + "vllm/v1/worker/cp_utils.py": { + "path": "/vllm/v1/worker/cp_utils.py", + "sha256": "e32625d83a641b8dd8df82e92d1b6fb20af0cdf2e8fbd2fb131aa3c215415448" + }, + "vllm/v1/worker/cpu/__init__.py": { + "path": "/vllm/v1/worker/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/cpu/buffer_utils.py": { + "path": "/vllm/v1/worker/cpu/buffer_utils.py", + "sha256": "e7313fd8c2c76ebfb98d2fa53008bc9691d0f83a7d7c05e87602b5a29fb79e04" + }, + "vllm/v1/worker/cpu/model_runner.py": { + "path": "/vllm/v1/worker/cpu/model_runner.py", + "sha256": "24a1c916550051327dd5893243a6d4200f3824b91b3af8aa6f6c793fd7c68c3e" + }, + "vllm/v1/worker/cpu/shm.py": { + "path": "/vllm/v1/worker/cpu/shm.py", + "sha256": "08491af8ad341399d1375f2d21ad00414d4c89b0a5c03f55de8704914bbfcbd9" + }, + "vllm/v1/worker/cpu_model_runner.py": { + "path": "/vllm/v1/worker/cpu_model_runner.py", + "sha256": "92111aba92f00571f1a3c4c6e43cf1da6ccb4d2afac2f4d5abc018a4a6e7e8bd" + }, + "vllm/v1/worker/cpu_worker.py": { + "path": "/vllm/v1/worker/cpu_worker.py", + "sha256": "a8051b9e510ef0af9cc34004f2cbe5c0f902bd0cebc32c9464e744344dfdf849" + }, + "vllm/v1/worker/dp_utils.py": { + "path": "/vllm/v1/worker/dp_utils.py", + "sha256": "8cd19f1bfbc5c4f6ec60df89aea7c8a19b400ebc264f372b103014152e92158c" + }, + "vllm/v1/worker/ec_connector_model_runner_mixin.py": { + "path": "/vllm/v1/worker/ec_connector_model_runner_mixin.py", + "sha256": "fe9b11cebb8562f1bfe98b98a5647b2b081a6e424cb60d4ffe2412c91a99215e" + }, + "vllm/v1/worker/encoder_cudagraph.py": { + "path": "/vllm/v1/worker/encoder_cudagraph.py", + "sha256": "6a08d3779bca1b47dbf9daf6eafe2d3c70dbcb8aeb7d63ba7efacc68241ee3bc" + }, + "vllm/v1/worker/encoder_cudagraph_defs.py": { + "path": "/vllm/v1/worker/encoder_cudagraph_defs.py", + "sha256": "bb7be050fcaa8868e7816c84caec875da57050d65fe7eaf00f3d41473df25e3a" + }, + "vllm/v1/worker/gpu/__init__.py": { + "path": "/vllm/v1/worker/gpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/async_utils.py": { + "path": "/vllm/v1/worker/gpu/async_utils.py", + "sha256": "77e17a4570ead2be30ae9b00888cf077a3b873018c12ca0549b853bfda02c1ba" + }, + "vllm/v1/worker/gpu/attn_utils.py": { + "path": "/vllm/v1/worker/gpu/attn_utils.py", + "sha256": "b9b81e59dda2720b1f9c434471381f879228832443e52756e469b4ad4905888f" + }, + "vllm/v1/worker/gpu/block_table.py": { + "path": "/vllm/v1/worker/gpu/block_table.py", + "sha256": "61c004315d5af7e7eae4e2a9e6be92ea82c520327690a7f55a73bb9ce95f520a" + }, + "vllm/v1/worker/gpu/buffer_utils.py": { + "path": "/vllm/v1/worker/gpu/buffer_utils.py", + "sha256": "6597f701a30261bf250e9ad5a29737264624a1caa20527aeea0dad630325b093" + }, + "vllm/v1/worker/gpu/cp_utils.py": { + "path": "/vllm/v1/worker/gpu/cp_utils.py", + "sha256": "456c1bb7e262d99ff555522a4f134e5a9b42aee23290be25455eaef36ee8eaaf" + }, + "vllm/v1/worker/gpu/cudagraph_utils.py": { + "path": "/vllm/v1/worker/gpu/cudagraph_utils.py", + "sha256": "6e9c042890603535e300a40df8ee159dbed1058a64a83ae50ff0329e332e05ff" + }, + "vllm/v1/worker/gpu/dp_utils.py": { + "path": "/vllm/v1/worker/gpu/dp_utils.py", + "sha256": "e26867bc89e6bfc933cabc5ed13e5dc7b8d2d3030118ca1ca64c8785dabc0fc1" + }, + "vllm/v1/worker/gpu/ec_connector.py": { + "path": "/vllm/v1/worker/gpu/ec_connector.py", + "sha256": "2afe6e641f4ae3eb3b8da336c74eaa7479bf617b27cfb39a1fcbe487686f0a08" + }, + "vllm/v1/worker/gpu/eplb_utils.py": { + "path": "/vllm/v1/worker/gpu/eplb_utils.py", + "sha256": "1829fac11464aed4649179b302df198de51b95d0589f4e56bea305a876a63e26" + }, + "vllm/v1/worker/gpu/input_batch.py": { + "path": "/vllm/v1/worker/gpu/input_batch.py", + "sha256": "d5dd956eb319bd69dd9e762047833d81ad40b21fce619fcb2133759e73620694" + }, + "vllm/v1/worker/gpu/kv_connector.py": { + "path": "/vllm/v1/worker/gpu/kv_connector.py", + "sha256": "b89a4333f1e552d86e1815674b59e9f1335f0f49c0a7b46082439076f62c6a81" + }, + "vllm/v1/worker/gpu/lora_utils.py": { + "path": "/vllm/v1/worker/gpu/lora_utils.py", + "sha256": "1e90eddd9ddb4ca55e574bb28e87ae3a6f6750175a62d373102426543f4ccd66" + }, + "vllm/v1/worker/gpu/metrics/__init__.py": { + "path": "/vllm/v1/worker/gpu/metrics/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/metrics/logits.py": { + "path": "/vllm/v1/worker/gpu/metrics/logits.py", + "sha256": "ea058d7510a077a55f8ac7e4c3d596508346244e908cb372865d7159f62edc89" + }, + "vllm/v1/worker/gpu/mm/__init__.py": { + "path": "/vllm/v1/worker/gpu/mm/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/mm/encoder_cache.py": { + "path": "/vllm/v1/worker/gpu/mm/encoder_cache.py", + "sha256": "89c500338fddbeee7c4fca978a3a7c4c566a03e848e399d303fbee3c80631cd2" + }, + "vllm/v1/worker/gpu/mm/encoder_runner.py": { + "path": "/vllm/v1/worker/gpu/mm/encoder_runner.py", + "sha256": "0981e352d70301b7154a217a48665ffe35f215d053ec5740c2515a3e1e11b4e6" + }, + "vllm/v1/worker/gpu/mm/lora.py": { + "path": "/vllm/v1/worker/gpu/mm/lora.py", + "sha256": "a3eddfad6ad64de276964240c28dc080888df4a56dd5eac18f89428f2cbb7a01" + }, + "vllm/v1/worker/gpu/mm/rope.py": { + "path": "/vllm/v1/worker/gpu/mm/rope.py", + "sha256": "0924375bcb367267e783b57dd2ad9de1189d97025ce4313baaa54f2911eaaf1e" + }, + "vllm/v1/worker/gpu/model_runner.py": { + "path": "/vllm/v1/worker/gpu/model_runner.py", + "sha256": "174c93db921c23cf0396eee4764be25b2bd2d4b6a06e9fa41ce3598b884ce8ce" + }, + "vllm/v1/worker/gpu/model_states/__init__.py": { + "path": "/vllm/v1/worker/gpu/model_states/__init__.py", + "sha256": "07815d0b788fc88185772f581bbf892a675259f9288375571f29887622f8d93c" + }, + "vllm/v1/worker/gpu/model_states/default.py": { + "path": "/vllm/v1/worker/gpu/model_states/default.py", + "sha256": "bb614f814780f052e869f9acf31dfbfa68718ee7dc6252eefa901b5730ee8a2a" + }, + "vllm/v1/worker/gpu/model_states/encoder_decoder.py": { + "path": "/vllm/v1/worker/gpu/model_states/encoder_decoder.py", + "sha256": "a5868059d8af672548b41d0e623e884320e6ed61e6aaca2d2828ff5be0356f2f" + }, + "vllm/v1/worker/gpu/model_states/encoder_only.py": { + "path": "/vllm/v1/worker/gpu/model_states/encoder_only.py", + "sha256": "84e96b55a2639e2a73fa4a0308acc89c8d053dc715481180b237e0196dcef99f" + }, + "vllm/v1/worker/gpu/model_states/interface.py": { + "path": "/vllm/v1/worker/gpu/model_states/interface.py", + "sha256": "5675b6fedc7403a9ab410b1e5565974e78fac23c42ab4253ae1da52d6e09b594" + }, + "vllm/v1/worker/gpu/model_states/mamba_hybrid.py": { + "path": "/vllm/v1/worker/gpu/model_states/mamba_hybrid.py", + "sha256": "573e130ac5587d4822fabf97adad1ad0fda02ff83c5e70df879a5bb175ae845c" + }, + "vllm/v1/worker/gpu/model_states/mm_pruning.py": { + "path": "/vllm/v1/worker/gpu/model_states/mm_pruning.py", + "sha256": "b150940b12ae76048f050a8eeb54d532bbdc530a18ffbf320ddeeb0cfaa90f93" + }, + "vllm/v1/worker/gpu/model_states/prompt_embeds.py": { + "path": "/vllm/v1/worker/gpu/model_states/prompt_embeds.py", + "sha256": "11f9e270925c2df6a505557605ac2b859bb145cf3420b0111e7482a1c544f9b1" + }, + "vllm/v1/worker/gpu/model_states/recoverssm.py": { + "path": "/vllm/v1/worker/gpu/model_states/recoverssm.py", + "sha256": "b4b660e62eaf33f4fe8271f83ed1fb6de6bc08f800a8073b27803e42fb29a645" + }, + "vllm/v1/worker/gpu/pcp_manager.py": { + "path": "/vllm/v1/worker/gpu/pcp_manager.py", + "sha256": "2d80df0ed5b18a2069f9d0689cb59923ffe324ba200fcafe242da23da3a6ddaa" + }, + "vllm/v1/worker/gpu/pool/__init__.py": { + "path": "/vllm/v1/worker/gpu/pool/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/pool/pooling_runner.py": { + "path": "/vllm/v1/worker/gpu/pool/pooling_runner.py", + "sha256": "f8463f7648cce0f3f29418a4d9fee61634ead760957cf236d06d61cf8cd986e7" + }, + "vllm/v1/worker/gpu/pp_utils.py": { + "path": "/vllm/v1/worker/gpu/pp_utils.py", + "sha256": "dadeef0bebf61d0ad44a28d06372208ec4e6389224d6017f412683b026bdbb5c" + }, + "vllm/v1/worker/gpu/sample/__init__.py": { + "path": "/vllm/v1/worker/gpu/sample/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/sample/bad_words.py": { + "path": "/vllm/v1/worker/gpu/sample/bad_words.py", + "sha256": "8d3cbd5613398260314d94739d8ee0e1ac0c22abf2f960f541d3c0d4e39d360b" + }, + "vllm/v1/worker/gpu/sample/batch_shard.py": { + "path": "/vllm/v1/worker/gpu/sample/batch_shard.py", + "sha256": "c30274a3a04e6a03e89be9cd7c62de602b1aba4d412f64540ab6201036de3928" + }, + "vllm/v1/worker/gpu/sample/gumbel.py": { + "path": "/vllm/v1/worker/gpu/sample/gumbel.py", + "sha256": "3ec1df510bdad13e8b0a457b5b67c98affdf6e57369e56cb471246cc8f40dd34" + }, + "vllm/v1/worker/gpu/sample/logit_bias.py": { + "path": "/vllm/v1/worker/gpu/sample/logit_bias.py", + "sha256": "9e80a3fe6f3c7474723408cfff52183f4585fdeedd9c2312843ee98d0b12724c" + }, + "vllm/v1/worker/gpu/sample/logprob.py": { + "path": "/vllm/v1/worker/gpu/sample/logprob.py", + "sha256": "f47479a818192acb6b297c79fa67a3b2f9820e3492a394d5adda777e9b7c832e" + }, + "vllm/v1/worker/gpu/sample/min_p.py": { + "path": "/vllm/v1/worker/gpu/sample/min_p.py", + "sha256": "4cb5e2f45e1ced6f9685283a7a5c8cfd7204d9a249822e866cfff756c7f04f62" + }, + "vllm/v1/worker/gpu/sample/output.py": { + "path": "/vllm/v1/worker/gpu/sample/output.py", + "sha256": "d6e298c0f197d487a8faaf7200f500fa83df1d7a4bbf4339cadd6a18008f7f9c" + }, + "vllm/v1/worker/gpu/sample/penalties.py": { + "path": "/vllm/v1/worker/gpu/sample/penalties.py", + "sha256": "46c29434caf5f415129ef4a9bb2b8d4f62d2765596e3e07f73ad2b198c7def1b" + }, + "vllm/v1/worker/gpu/sample/prompt_logprob.py": { + "path": "/vllm/v1/worker/gpu/sample/prompt_logprob.py", + "sha256": "4cf22d390e7bf59e44c458cff7180268db63e95d06af2f1e14d720a2d77c9663" + }, + "vllm/v1/worker/gpu/sample/sampler.py": { + "path": "/vllm/v1/worker/gpu/sample/sampler.py", + "sha256": "832c9945d201a1e730ff9b4b52076aa83bd4a5064e1e4cfea952cf84d4a8d1f0" + }, + "vllm/v1/worker/gpu/sample/states.py": { + "path": "/vllm/v1/worker/gpu/sample/states.py", + "sha256": "4e3671f93695ba5a48fad7d2d13beb231ac8741034904ed5a15d9f7b9b86662e" + }, + "vllm/v1/worker/gpu/sample/thinking_budget.py": { + "path": "/vllm/v1/worker/gpu/sample/thinking_budget.py", + "sha256": "020513e1d3406f367de6ad995a95055008fd0c28f2873647e8283c9870e22404" + }, + "vllm/v1/worker/gpu/sample/trace_replay.py": { + "path": "/vllm/v1/worker/gpu/sample/trace_replay.py", + "sha256": "d2a7d3b3b55379efabe4740a4b7f14030126dc11be36f6ea974164ce42316a50" + }, + "vllm/v1/worker/gpu/sample/watermark.py": { + "path": "/vllm/v1/worker/gpu/sample/watermark.py", + "sha256": "a3581458169dab9153eb09fd67218e0ee5585406537a9de80ad528ae62b030c0" + }, + "vllm/v1/worker/gpu/shutdown.py": { + "path": "/vllm/v1/worker/gpu/shutdown.py", + "sha256": "bb470f14b17c7e52571ef8938b2a9527e7c2846852ae8a3a94b69cd1c30aa4b1" + }, + "vllm/v1/worker/gpu/spec_decode/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/__init__.py", + "sha256": "1f1f84bfe6f4f5af3a7e21a7a8716ecf7b9013da1d03327668a3ee36afc24c32" + }, + "vllm/v1/worker/gpu/spec_decode/acceptance_estimator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/acceptance_estimator.py", + "sha256": "505b843bdd75928b03793b395b47b8be914bd7fe2a3351c8ec04339baeebb1c2" + }, + "vllm/v1/worker/gpu/spec_decode/adaptive_verification.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/adaptive_verification.py", + "sha256": "276b2fec56758a94c71b717f6786b8a6f126db2e20cf964350202feee61a0a39" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py", + "sha256": "13392ef0a9ed59eb9c2b2bad43d7c61beb212a8805849e46b5130c230275d0a5" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/speculator.py", + "sha256": "5b97f54e20ddf65b98e939832d050745f67ef43cfa145786da300f1a8322e3c6" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/cudagraph.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/cudagraph.py", + "sha256": "beab567ae2df6a2ba2cd92fe7ee452c6b959b8a7037a4b5f493993a1824619bb" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/speculator.py", + "sha256": "f9c100f42f9326e48eb84e89281897e859ba761943f54d593523555ccd98dc63" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/utils.py", + "sha256": "53d2c3ad474d290d2c6df027446bbd80ac7447684e5242ab2c3c5337d2abd383" + }, + "vllm/v1/worker/gpu/spec_decode/dflash2/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash2/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/dflash2/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash2/speculator.py", + "sha256": "b70043550938a1df9aecc85d8c8224c38c929ca34f68834572f6e723854d2027" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/speculator.py", + "sha256": "dcf4abdedbd2bddd0d76be198ccf5b4e467c46f645038c35fcab821491a35b03" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/utils.py", + "sha256": "86af2bf30604a184312e8f076097b91ecfec704f409f9d68d634b03d6b318070" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/eagle3_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/eagle3_utils.py", + "sha256": "201ee875fcc3d076a8fc1f3876dcbf85736b221a368555243a8987ff26a1674e" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/speculator.py", + "sha256": "746e318a4f266d75522ff7f3731ea9b4527b7b4824f71364d1a62184ea1f7b3d" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/utils.py", + "sha256": "94de6f55a1761f24f4aa1388cbc3b3763d4ab3ee53260330056ad31ce0b78236" + }, + "vllm/v1/worker/gpu/spec_decode/extract_hidden_states.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/extract_hidden_states.py", + "sha256": "93c4233be7b2d2290b33902ea9b3bb5274c11701830851d03967a22144536e2d" + }, + "vllm/v1/worker/gpu/spec_decode/gemma4/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/gemma4/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/gemma4/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/gemma4/speculator.py", + "sha256": "9991210d7babd2caf2cd10797ca8688543dedeafbc3b86bc7c979c1a6ae9f949" + }, + "vllm/v1/worker/gpu/spec_decode/mtp/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/mtp/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/mtp/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/mtp/speculator.py", + "sha256": "926d6c9ffdb368c971647911a60493820d056ce236fcae9d94a42fa2e006255d" + }, + "vllm/v1/worker/gpu/spec_decode/multi_module_mtp/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/multi_module_mtp/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/multi_module_mtp/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/multi_module_mtp/speculator.py", + "sha256": "d9d4735b9b33829332b0e845b6d3073b2f0436045ed693b25c6434f351644127" + }, + "vllm/v1/worker/gpu/spec_decode/rejection_sampler.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/rejection_sampler.py", + "sha256": "030db5bfca162cc1f305112f299de5d6d61c59d3ed0807fee46575441ca4086d" + }, + "vllm/v1/worker/gpu/spec_decode/rejection_sampler_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/rejection_sampler_utils.py", + "sha256": "214b61fa0abe88573beb779872c035b3954e5651a85bd438d99ee5905d3a62ec" + }, + "vllm/v1/worker/gpu/spec_decode/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/speculator.py", + "sha256": "3a1ab15bf8b20918852eb835fe9755046e99dcbac6ba6ca3d414949fc8bc695a" + }, + "vllm/v1/worker/gpu/spec_decode/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/utils.py", + "sha256": "282f2929eddae9ca7312269f799be07472334b6df9fd91878b5e839ec05e418c" + }, + "vllm/v1/worker/gpu/states.py": { + "path": "/vllm/v1/worker/gpu/states.py", + "sha256": "99418f5df43ca612ded72609fee011620b065b2cab2f249ccb387096bf4ae71a" + }, + "vllm/v1/worker/gpu/structured_outputs.py": { + "path": "/vllm/v1/worker/gpu/structured_outputs.py", + "sha256": "18a10532db7e66b55e334acacd1fd989ad6361adf31dd0de9a9a65e23db25951" + }, + "vllm/v1/worker/gpu/ubatch_utils.py": { + "path": "/vllm/v1/worker/gpu/ubatch_utils.py", + "sha256": "5092e2e58af0561c8dc12e62847cfc6dda9ca20dfbd33e7f0cd77a83fe87f7c5" + }, + "vllm/v1/worker/gpu/warmup.py": { + "path": "/vllm/v1/worker/gpu/warmup.py", + "sha256": "423ac32d58fe008c228cfa223e4fcebfcf87e3463a9dbdf80a083c0578d73723" + }, + "vllm/v1/worker/gpu_input_batch.py": { + "path": "/vllm/v1/worker/gpu_input_batch.py", + "sha256": "18cf455c9d0eea61cc581c7932f2e6cd09786914e82dd35eef1c1430da359a0f" + }, + "vllm/v1/worker/gpu_model_runner.py": { + "path": "/vllm/v1/worker/gpu_model_runner.py", + "sha256": "87c29d08c0bbf66993d8b984811e7325e35e6436242a773feb55ec88f16b2c51" + }, + "vllm/v1/worker/gpu_ubatch_wrapper.py": { + "path": "/vllm/v1/worker/gpu_ubatch_wrapper.py", + "sha256": "4233cfbe8c9884b042c4363890108f616483b694ebe9a6e69578dcf89c6dac5c" + }, + "vllm/v1/worker/gpu_worker.py": { + "path": "/vllm/v1/worker/gpu_worker.py", + "sha256": "6994436e4547c0996ab555b3e814e8ccea26b650dfc1b378b97d640745309347" + }, + "vllm/v1/worker/kv_connector_model_runner_mixin.py": { + "path": "/vllm/v1/worker/kv_connector_model_runner_mixin.py", + "sha256": "e1cc76d065a7e60aacddb190ae795a480b65cd02ba71a1fc699a02a85c1a3de2" + }, + "vllm/v1/worker/lora_model_runner_mixin.py": { + "path": "/vllm/v1/worker/lora_model_runner_mixin.py", + "sha256": "fef6092a15d8d37f6fa22495e6106e2e5280180908d61ce43d9ff5bf4eef3f2f" + }, + "vllm/v1/worker/mamba_utils.py": { + "path": "/vllm/v1/worker/mamba_utils.py", + "sha256": "23fdaa4e8f63ee8f938eaa1a2b39f803cb04fa6ecd69789563254b1a0691413a" + }, + "vllm/v1/worker/mm_encoder_model_runner.py": { + "path": "/vllm/v1/worker/mm_encoder_model_runner.py", + "sha256": "780c41be84ad022205c21c1decb6bb8d5afb03bc7be120c1f7df03b710acc3d7" + }, + "vllm/v1/worker/sentinel/__init__.py": { + "path": "/vllm/v1/worker/sentinel/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/sentinel/gpu_worker_sentinel.py": { + "path": "/vllm/v1/worker/sentinel/gpu_worker_sentinel.py", + "sha256": "3959b8619d052c5dd247815074e03ec21ec9b43cc424ff2d296abc19b227b852" + }, + "vllm/v1/worker/startup_plan.py": { + "path": "/vllm/v1/worker/startup_plan.py", + "sha256": "84bcbb4f7a9fd7c8d10c9c895aadd9673d44c767b9132368d11eb5e017afe86b" + }, + "vllm/v1/worker/ubatch_utils.py": { + "path": "/vllm/v1/worker/ubatch_utils.py", + "sha256": "b34dce551b5195c414e6a3a997c75961cc7a17f24c7c980487fe3d3e2ba7a798" + }, + "vllm/v1/worker/ubatching.py": { + "path": "/vllm/v1/worker/ubatching.py", + "sha256": "40391241c564feb5f16c77898ae6ae152ed6e71a4682e2a406387785d8de02d7" + }, + "vllm/v1/worker/utils.py": { + "path": "/vllm/v1/worker/utils.py", + "sha256": "0ca3ec6bf4d20076145b7fe64e564962adebedc8f75a856b517ba0b2f2d77acf" + }, + "vllm/v1/worker/worker_base.py": { + "path": "/vllm/v1/worker/worker_base.py", + "sha256": "4a1a5266b912fe97991d8dc89d92b923990da9f6cb4b817d00d52e9c0d26dd7c" + }, + "vllm/v1/worker/workspace.py": { + "path": "/vllm/v1/worker/workspace.py", + "sha256": "d21c08167d1d0d1c0cddaa80453a53a0b4dec5d81b5a537c94a21324344976b3" + }, + "vllm/v1/worker/xpu_model_runner.py": { + "path": "/vllm/v1/worker/xpu_model_runner.py", + "sha256": "07fa0390d28f2b8c3c3c0019eb9c3b126e2397aea268ba47c889f06b423deb23" + }, + "vllm/v1/worker/xpu_worker.py": { + "path": "/vllm/v1/worker/xpu_worker.py", + "sha256": "711b56432506b58041cd86e71320c3960413f7bd61061990b66488421d81cfc3" + } + }, + "prefix": "", + "pth": { + "/__editable__.megatron_core-0.16.0rc0.pth": "d55c9b64480b34aae3d4d31e7706b93391c969dec6e0498e50963b03445a57b0", + "/__editable__.rl_kernel-0.1.0.pth": "1454c4987b35762a0d189d4e901c5d077fde62a1944fbaabecea230e57f3923a", + "/__editable__.vime-0.3.2.pth": "77eec5d06d628cb952e65edd813ca88d8db67ccc785083e1b7b29011b92bec4f", + "/distutils-precedence.pth": "2638ce9e2500e572a5e0de7faed6661eb569d1b696fcba07b0dd223da5f5d224", + "/qwen3_next_cuda_runtime.pth": "e0d3ab57dd3ff4f5d55fcf76e83c549cc00b3c813e6f717c540d5ded79fa2f49", + "/qwen3_next_megatron_source.pth": "8556ac057538e82856cb76cbbc954f58312a3f45373daec3eec826031cfd2709", + "/__editable__.rl_kernel-0.1.0.pth": "1454c4987b35762a0d189d4e901c5d077fde62a1944fbaabecea230e57f3923a", + "/distutils-precedence.pth": "2638ce9e2500e572a5e0de7faed6661eb569d1b696fcba07b0dd223da5f5d224", + "/nvidia_cutlass_dsl_packages.pth": "cc710b99ddb3d76361a70461461d274212a979d00c381d821fce5bb3ad9cf246" + }, + "pyvenv_cfg_sha256": "48579f2c6d35c3d535c2690d7d426587c4b8e92021463f0266b38d35dfbbb834", + "sources": { + "/Megatron-LM-training": { + "patch_sha256": "f66035f12501aa1d08e8884e0dea5a22d59825d717aeda73c3e83876e3efd79f", + "path": "/Megatron-LM-training", + "tree": "731fc44a368d6cac8c6171a29d5c687ff0d95bd1" + }, + "/vime": { + "patch_sha256": "66949839d4c18329444f4f9f6dcd702b53ce1b94e9aa15ed111f28743bfaa4b9", + "path": "/vime", + "tree": "f5174e67dbcdaef983eecd45f215fef2d8429dd0" + } + }, + "version": "3.12.14 | packaged by Anaconda, Inc. | (main, Aug 27 2026, 14:46:43) [GCC 14.3.0]" + }, + "sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca" + }, + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "cuda_identity": { + "home": "", + "nvcc_sha256": "b8e2347d9d7fcadf8812a27324d515de99d033d3e48611811ece7e66d7895f8a" + }, + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "operator_requirements": { + "suite": "all", + "case_ids": [ + "tests/check_qwen3_next_attention.py::test_d256_backward_with_cached_prefix_matches_float64_formula", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[1024]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[256]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[64]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[8]", + "tests/check_qwen3_next_attention.py::test_d256_input_device_guard_and_nondefault_stream", + "tests/check_qwen3_next_attention.py::test_native_backward_rejects_malformed_probability_and_gradient_buffers", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[0]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[2]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_target_inputs_do_not_depend_on_companions", + "tests/check_qwen3_next_batch_invariance.py::test_triton_chunked_prefill_is_batch_invariant", + "tests/check_qwen3_next_conv_bridge.py::test_chunked_and_reordered_sequences_match", + "tests/check_qwen3_next_conv_bridge.py::test_empty_sequence_preserves_cache_and_gradients", + "tests/check_qwen3_next_conv_bridge.py::test_response_gradient_reaches_prompt_and_convolution_weight", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths0]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths1]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths2]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-4]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[1]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[4]", + "tests/check_qwen3_next_core_matrix.py::test_variable_lengths_empty_and_mixed_step_match_independent_sequences", + "tests/check_qwen3_next_forward.py::test_combine_has_fixed_route_order_and_differentiable_weights", + "tests/check_qwen3_next_forward.py::test_full_vocabulary_logprob_entropy_modes_and_gradient", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_fail_closed_on_the_tensor_descriptor_path", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[128]", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[512]", + "tests/check_qwen3_next_forward.py::test_logprob_nan_rejected_before_comparison", + "tests/check_qwen3_next_forward.py::test_moe_vjp_matches_independent_double_formula", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[1024-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[128-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-16]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-256]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-3072]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-37984]", + "tests/check_qwen3_next_forward.py::test_qwen_moe_actual_tp4_shapes_and_independent_training_forward", + "tests/check_qwen3_next_forward.py::test_route_weights_are_batch_invariant", + "tests/check_qwen3_next_forward.py::test_shared_linear_vjp_and_empty_tokens", + "tests/check_qwen3_next_forward.py::test_stable_route_tie_boundary_and_router_gradient", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_backward_matches_recomputed_recurrence_vjp", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_forward_is_provider_exact_and_does_not_mutate_inputs", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_keeps_prompt_state_gradient_through_response", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[False]", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[True]", + "tests/check_qwen3_next_gdn_bridge.py::test_initial_state_vjp_matches_provider_directional_difference", + "tests/check_qwen3_next_gdn_sequence.py::test_1024_token_chunk_continuation_is_bitwise_exact", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad0]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad1]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad2]", + "tests/check_qwen3_next_gdn_sequence.py::test_chunk_boundary_retains_prompt_and_initial_state_gradients", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths0]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths1]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths2]", + "tests/check_qwen3_next_gdn_sequence.py::test_reserved_and_duplicate_slots_are_rejected", + "tests/check_qwen3_next_norm_providers.py::test_custom_op_has_distinct_native_and_cuda_paths", + "tests/check_qwen3_next_norm_providers.py::test_gdn_decode_provider_env_defaults_are_recorded", + "tests/check_qwen3_next_norm_providers.py::test_our_gated_op_is_batch_invariant", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_cuda]", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_native]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots0]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots2]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots3]", + "tests/check_qwen3_next_shared_core.py::test_independent_training_forward_matches_inference_and_retains_gradients", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[1024]", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[8]", + "tests/check_qwen3_next_shared_core.py::test_unimplemented_provider_profile_is_rejected", + "tests/test_qwen3_next_norm.py::test_bad_weight_shape_raises", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[16]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[1]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[2]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[32]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[48]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[64]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[8]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[128]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[2048]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_with_padding", + "tests/test_qwen3_next_norm.py::test_call_matches_forward", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[128]", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[2048]", + "tests/test_qwen3_next_norm.py::test_cuda_default_offset_preserves_plain_convention", + "tests/test_qwen3_next_norm.py::test_cuda_gated_backward_matches_autograd_golden", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_matches_golden_within_contract", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_bad_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_mismatched_gate", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_backward_uses_the_sigmoid_derivative", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_swish_is_an_alias_for_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_unit_weight_is_plain_norm_times_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_weight_offset_is_applied_in_fp32", + "tests/test_qwen3_next_norm.py::test_cuda_gated_wrapper_rejects_equal_numel_wrong_shape", + "tests/test_qwen3_next_norm.py::test_cuda_gated_zero_gate_zeroes_output", + "tests/test_qwen3_next_norm.py::test_cuda_offset_equals_explicit_fp32_weight", + "tests/test_qwen3_next_norm.py::test_cuda_offset_is_not_folded_through_bfloat16", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_backward_is_offset_aware", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_within_tolerance_of_golden", + "tests/test_qwen3_next_norm.py::test_deterministic_repeat", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype0]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype1]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype2]", + "tests/test_qwen3_next_norm.py::test_eps_inside_sqrt", + "tests/test_qwen3_next_norm.py::test_gated_batch_invariance_slice", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedHFOp]", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedOp]", + "tests/test_qwen3_next_norm.py::test_gated_conventions_diverge_in_low_precision", + "tests/test_qwen3_next_norm.py::test_gated_cuda_op_rejects_bad_activation_at_construction", + "tests/test_qwen3_next_norm.py::test_gated_extension_handles_empty_batch_and_nondefault_stream", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[dy_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[gate_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[rstd_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_shape]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_matches_hf_formula_fp32", + "tests/test_qwen3_next_norm.py::test_gated_shape_mismatch_raises", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_strict_matches_vllm_formula_fp32", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[128]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[2048]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_offset_applied_in_fp32_not_folded_into_bf16", + "tests/test_qwen3_next_norm.py::test_op_batch_invariance_on_device", + "tests/test_qwen3_next_norm.py::test_plain_reference_is_unchanged_by_the_offset_plumbing", + "tests/test_qwen3_next_norm.py::test_weight_offset_is_one", + "tests/test_qwen3_next_norm.py::test_zero_centred_cuda_constructor_rejects_missing_extension", + "tests/test_qwen3_next_norm.py::test_zero_centred_op_inherits_the_plain_reference", + "tests/test_qwen3_next_norm.py::test_zero_weight_is_identity_scaling" + ], + "case_ids_sha256": "694c931b65f9cfa5db963f2eca6d11bd309546c824a1df52f9da2ab128e83e0f", + "norm_gates": [ + "qwen3_next_rms_norm-forward.json", + "qwen3_next_rms_norm-gradient.json", + "rms_norm_gated-forward.json", + "rms_norm_gated-gradient.json" + ] + }, + "layer_requirements": { + "schema_version": 1, + "gates": { + "gdn": { + "script": "scripts/qwen3_next_tp_gdn_check.py", + "output_option": "--output", + "scope": "tp4_gdn_layer0", + "groups": { + "cases": [ + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "prompt-gradient", + "replicated-norm-gradient", + "hf-load-export" + ] + }, + "script_sha256": "cc4338893f90af004c51c20fc67d1a9a3f4bf8d26775277f72671c02983e4df5" + }, + "attention": { + "script": "scripts/qwen3_next_tp_attention_check.py", + "output_option": "--output", + "scope": "tp4_full_attention_layer3", + "groups": { + "attention.cases": [ + "hf-load-export", + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "batch4-varlen-reorder", + "sixteen-token-decode", + "prompt-gradient", + "kv-pair-gradient", + "qk-norm-gradient" + ] + }, + "script_sha256": "d27d43efb05415a8ef5892c3c2238a2b9744a4821f5466faf46c6510e6e01bec" + }, + "moe": { + "script": "scripts/qwen3_next_tp_moe_check.py", + "output_option": "--output", + "scope": "tp4_moe_block_layer0", + "groups": { + "moe.cases": [ + "hf-load-export-all512experts", + "routes-replicated-8", + "full-chunk-reorder-8", + "routes-replicated-64", + "full-chunk-reorder-64", + "routes-replicated-256", + "full-chunk-reorder-256", + "routes-replicated-1024", + "full-chunk-reorder-1024", + "training-forward", + "all-parameter-gradient", + "replicated-router-gradient" + ] + }, + "script_sha256": "d5c1bbbb82e408b65871b0cb1638d7a6cf8cfe07f0a3315a657b7dc232d544be" + }, + "adapters": { + "script": "scripts/qwen3_next_adapter_check.py", + "output_option": "--out", + "scope": "gdn_engine_adapter_component", + "groups": { + "cases": [ + "batch1-length8", + "batch1-length64", + "batch1-length256", + "batch1-length1024", + "batch4-length8", + "batch4-length64", + "batch4-length256", + "batch4-length1024", + "mixed-prefill-decode16-reorder" + ] + }, + "fields": { + "prompt_gradient": "passed", + "hf_conv_roundtrip": "passed", + "batch_invariance_capability_registered": false + }, + "script_sha256": "3ce45bb317237c1a06533116d65fb77c2a23b6f503ae46406ede543036eb0f20" + }, + "heads": { + "script": "scripts/qwen3_next_tp_head_check.py", + "output_option": "--output", + "scope": "tp4_embedding_lm_head_only", + "groups": { + "cases": [ + "hf-embedding-roundtrip", + "hf-lm-head-roundtrip", + "replicated-norm-gradient", + "nonzero-finite-embedding-head-gradient", + "embedding-repeat-100", + "batch-invariant-prompt8", + "batch-invariant-prompt64", + "batch-invariant-prompt256", + "batch-invariant-prompt1024", + "logprob-original-and-promoted-logits", + "entropy-interface" + ] + }, + "script_sha256": "0504185d21a75405c8e994bc57b016cf4ec357d8b16e7430772c11934f2af876" + } + }, + "scheduler_case_ids": [ + "p0008-b1-full", + "p0008-b1-chunked", + "p0008-b4-full", + "p0008-b4-chunked", + "p0064-b1-full", + "p0064-b1-chunked", + "p0064-b4-full", + "p0064-b4-chunked", + "p0256-b1-full", + "p0256-b1-chunked", + "p0256-b4-full", + "p0256-b4-chunked", + "p1024-b1-full", + "p1024-b1-chunked", + "p1024-b4-full", + "p1024-b4-chunked" + ], + "registry_sha256": "e3949a750cb27c1897a000f3b023f912629906612ae8949c1575d0acc36df5ec", + "case_ids_per_rank": [ + "adapters/cases/batch1-length1024", + "adapters/cases/batch1-length256", + "adapters/cases/batch1-length64", + "adapters/cases/batch1-length8", + "adapters/cases/batch4-length1024", + "adapters/cases/batch4-length256", + "adapters/cases/batch4-length64", + "adapters/cases/batch4-length8", + "adapters/cases/mixed-prefill-decode16-reorder", + "attention/attention.cases/batch4-varlen-reorder", + "attention/attention.cases/full-chunk-1024", + "attention/attention.cases/full-chunk-256", + "attention/attention.cases/full-chunk-64", + "attention/attention.cases/full-chunk-8", + "attention/attention.cases/hf-load-export", + "attention/attention.cases/kv-pair-gradient", + "attention/attention.cases/prompt-gradient", + "attention/attention.cases/qk-norm-gradient", + "attention/attention.cases/sixteen-token-decode", + "gdn/cases/full-chunk-1024", + "gdn/cases/full-chunk-256", + "gdn/cases/full-chunk-64", + "gdn/cases/full-chunk-8", + "gdn/cases/hf-load-export", + "gdn/cases/prompt-gradient", + "gdn/cases/replicated-norm-gradient", + "heads/cases/batch-invariant-prompt1024", + "heads/cases/batch-invariant-prompt256", + "heads/cases/batch-invariant-prompt64", + "heads/cases/batch-invariant-prompt8", + "heads/cases/embedding-repeat-100", + "heads/cases/entropy-interface", + "heads/cases/hf-embedding-roundtrip", + "heads/cases/hf-lm-head-roundtrip", + "heads/cases/logprob-original-and-promoted-logits", + "heads/cases/nonzero-finite-embedding-head-gradient", + "heads/cases/replicated-norm-gradient", + "moe/moe.cases/all-parameter-gradient", + "moe/moe.cases/full-chunk-reorder-1024", + "moe/moe.cases/full-chunk-reorder-256", + "moe/moe.cases/full-chunk-reorder-64", + "moe/moe.cases/full-chunk-reorder-8", + "moe/moe.cases/hf-load-export-all512experts", + "moe/moe.cases/replicated-router-gradient", + "moe/moe.cases/routes-replicated-1024", + "moe/moe.cases/routes-replicated-256", + "moe/moe.cases/routes-replicated-64", + "moe/moe.cases/routes-replicated-8", + "moe/moe.cases/training-forward" + ], + "case_ids_sha256": "be74417dfbd6031ba27978d06d04bb15daaab2aeb57d132c7e0d41176b28b46e" + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "scheduler_profile_certificate": { + "path": "/result.json", + "sha256": "fbfb9aca512a01d150f5b6bf4a1f12c77c3292ba279bd7d63e24dbf3a7231ce9" + } +} diff --git a/docs/usage/evidence/qwen3-next-batch-invariance-b200/layers/checkpoint.json b/docs/usage/evidence/qwen3-next-batch-invariance-b200/layers/checkpoint.json new file mode 100644 index 000000000..4488f19f1 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-batch-invariance-b200/layers/checkpoint.json @@ -0,0 +1,14 @@ +{ + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "shards_verified": 41, + "metadata_sha256": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + } +} diff --git a/docs/usage/evidence/qwen3-next-batch-invariance-b200/layers/environment.json b/docs/usage/evidence/qwen3-next-batch-invariance-b200/layers/environment.json new file mode 100644 index 000000000..f43503b9c --- /dev/null +++ b/docs/usage/evidence/qwen3-next-batch-invariance-b200/layers/environment.json @@ -0,0 +1,4511 @@ +{ + "environment": { + "identity": { + "base_prefix": "/miniconda3/envs/rlkernel", + "binary": "/python3.12", + "binary_sha256": "6a1eb3ffc29f3a6b0ece607b016b4cfa5ca3ac57b34f17ed3266b404f78d2729", + "build_tools": { + "ninja": { + "path": "/miniconda3/envs/rlkernel/bin/ninja", + "sha256": "08639e194fffa7f08b259fc4abfa4803aff66b64de52549cee42ec527d55cea6" + } + }, + "distributions": [ + { + "direct_url": null, + "metadata_sha256": "6f1038270be40f9b8c0bcf391c627e7d7f41ccdd19aa192d6eac1dbfc3b19abc", + "name": "GitPython", + "version": "3.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "3f71971502087521f123c9daa26bc12d31d3466738b567390b8602acad3be22a", + "name": "Jinja2", + "version": "3.1.6" + }, + { + "direct_url": null, + "metadata_sha256": "818fb343b7b6b99a32771bf4813521ae6440b4c7579b3ae46e32dd02da0afeee", + "name": "Markdown", + "version": "3.11" + }, + { + "direct_url": null, + "metadata_sha256": "dc1ee42cf8ecfeee0ab60b15b21d291833e0732548efcb7bb5b3564dca3e5bf7", + "name": "MarkupSafe", + "version": "3.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "de7389b142450a0014234286b0876f328439b823c355c73d0aed41fd67ec208c", + "name": "PyJWT", + "version": "2.15.1" + }, + { + "direct_url": null, + "metadata_sha256": "ffcad4415cafb22b8b536a61595e9ee13438b51d31b0763c1b273ce3bc58e840", + "name": "PyYAML", + "version": "6.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "8562d701cc52d9cafbb418942b0e072fc087ed8ddcf35cd10224c1b2ed8bdd91", + "name": "Pygments", + "version": "2.21.0" + }, + { + "direct_url": null, + "metadata_sha256": "b6c25fcfdcc495edf248a10ca4ad28327ef2ed6047a6ec5c6346e121414c7f21", + "name": "Werkzeug", + "version": "3.1.9" + }, + { + "direct_url": null, + "metadata_sha256": "55c400d24c71b581d9c0992f71df6047cf6c878bebe61a7d45d6e02dc0e4c510", + "name": "absl-py", + "version": "2.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "13db521f90a6a882027b2388eaa2ebf252945f9c2adb7e7e371da18239da4df0", + "name": "accelerate", + "version": "1.15.0" + }, + { + "direct_url": null, + "metadata_sha256": "86fe44e38e67872dd895c729044942ba2c2f934ae439a899fb83a186206b7fd4", + "name": "agent-detector", + "version": "2.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "afe11fe9f5aa54e734cdd51659bed8c89dc6bcd5aef0ad96f2d20149c8de5456", + "name": "aiohappyeyeballs", + "version": "2.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "570b307bc0b53fbbd3ed2ce0b7eca6bbf2fa73bf75e24a480f1034d8c0b832bf", + "name": "aiohttp", + "version": "3.14.3" + }, + { + "direct_url": null, + "metadata_sha256": "44b7f8e14c4770793e747fad50c9e0a6ee7357651d878554f192d94768dc14a8", + "name": "aiohttp-cors", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "648813a44a9ae0ab2f20ee86d2404dcc38e3f9e80c63316cf6e536735df14e54", + "name": "aiosignal", + "version": "1.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "f6a3f6668bacef7f73a2c19ccb2be910b2363d1731c4725cb04364d99e24935a", + "name": "annotated-doc", + "version": "0.0.5" + }, + { + "direct_url": null, + "metadata_sha256": "fc6d752cde6a6a4bff03474386de750e130b75da3c7815ee909f45b51fea98c8", + "name": "annotated-types", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "4e89d670a4b20029da30e5a9e8ebcbc844deff9c44209552bafd5537249c8b9e", + "name": "anthropic", + "version": "1.9.0" + }, + { + "direct_url": null, + "metadata_sha256": "b5a6f00800956387fcddab1fe1b5aa8502c249b86cfb16d58ed700f282f60142", + "name": "antlr4-python3-runtime", + "version": "4.9.3" + }, + { + "direct_url": null, + "metadata_sha256": "a6008defa9492cd08250217b134782cad1db4580e1d7ddf69cc2a2a48cea24e0", + "name": "anyio", + "version": "4.15.1" + }, + { + "direct_url": null, + "metadata_sha256": "7877c64ce8957237363f2df313819bb07f50752df016d14c5a5a99bec10f5deb", + "name": "apache-tvm-ffi", + "version": "0.1.11" + }, + { + "direct_url": null, + "metadata_sha256": "3543ca8f0e072c00ab111b20eba99ce86dbf93ada28988775bc2677284b3c07a", + "name": "astor", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "d4b328c09c024fe1e4d788a9c7715ad726095131b815cd35fd933268226f6269", + "name": "attrs", + "version": "26.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "4850c4d696a5e2a2ecbb3dd792b060acc1de79e09800669b0b9fc3a22c055e6d", + "name": "av", + "version": "19.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "863ff92208d0a02dabfa008bfe91846a5c401ded301e5687dca7dc63c911865f", + "name": "babel", + "version": "2.18.0" + }, + { + "direct_url": null, + "metadata_sha256": "f32e6df3197f05202e586624d95c5e217003d80cee655c165d533102f628df21", + "name": "backrefs", + "version": "8.0" + }, + { + "direct_url": null, + "metadata_sha256": "905c362f655fbc6d37a24686efc2b3bfbd3123b8ee5a443a43f6750d87455e90", + "name": "blake3", + "version": "1.0.10" + }, + { + "direct_url": null, + "metadata_sha256": "07c85682b6aefd5c9b48890d306c1604311902295704892ede48e5a83219a8d3", + "name": "blobfile", + "version": "3.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "2d582941a7081625a35f35a0c4a2e80f7737312e29c38e5fdb6fc08f9c113077", + "name": "bracex", + "version": "3.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "3b60c55bae0d0340c3a3fd918635bbfa3087579da66e0fd7f6be7a3782c0da3d", + "name": "cachetools", + "version": "7.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "5d11a6878d5bc3f22290281a19ef7b36daa95c910780950608b95cd788c7e12e", + "name": "cbor2", + "version": "6.1.4" + }, + { + "direct_url": null, + "metadata_sha256": "362c9942c48051f168ed2b9f2146266b7792d3c05e164cd6afc3f3b65884fdc9", + "name": "certifi", + "version": "2026.7.22" + }, + { + "direct_url": null, + "metadata_sha256": "b4abf1bcf1c1d8e0272d8007fc974499ea59e5f2a5b98af3c78a5e67515a9d87", + "name": "cffi", + "version": "2.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "766120f13c177446f51929a4d201104bc935b6d5a2a176cd6716edce757d3d95", + "name": "cfgv", + "version": "3.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "610e9a9d03ce837ffe6e42be5e02e70087f73863f7350bf7bb7f0511edcc5ec0", + "name": "charset-normalizer", + "version": "3.5.2" + }, + { + "direct_url": null, + "metadata_sha256": "7ad836b3147c9702546d9c28b4fa5be23b24445439db5d0d2a58d17281c84daa", + "name": "click", + "version": "8.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "4c5f00599ebcbf11d337e48a72784d256ca3d704fa9e9f5daadd60065e6776b7", + "name": "cloudpickle", + "version": "3.1.2" + }, + { + "direct_url": null, + "metadata_sha256": "a0970189e3ab7a596d6902d5f61f93b414f138f03d3cf19029145657bfceb382", + "name": "cmake", + "version": "4.1.2" + }, + { + "direct_url": null, + "metadata_sha256": "94a6ebf9718e55f254a43ce0d2f04e0d6d44e7141b6f3144a84feb6519a77bfd", + "name": "colorama", + "version": "0.4.6" + }, + { + "direct_url": null, + "metadata_sha256": "ca8ec227f406d970a645ec482b20619128dd34b9cf71159cc24e27db461a2711", + "name": "colorful", + "version": "0.5.8" + }, + { + "direct_url": null, + "metadata_sha256": "bbaa51b7e4d8f142bd075d01257c0572c0c844796d51426e35c8096a13e8da76", + "name": "compressed-tensors", + "version": "0.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "6063d8ff7ebc458d63a4332853d7ababf4ee2b86336362c8d2b12be6e998eb6b", + "name": "connectrpc", + "version": "0.11.1" + }, + { + "direct_url": null, + "metadata_sha256": "ac5f4b5a5f68080bd9c3fe77399fe8a1bff2ee5923c49db1df544dd054cbf15b", + "name": "cryptography", + "version": "50.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "f41d2f6b4616accca2f5e1dd47aa9e8937c28076cde698226d93e727751f3099", + "name": "cuda-bindings", + "version": "13.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "e5ca6ed34c687c6f4a4d157ad0a2cf06ec0316fe8c4c0ddeb666ad76dd6f30f4", + "name": "cuda-core", + "version": "1.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "89baadd9da23dce9990481519544115615ba3cbd2d1a41e09feea7756fffb378", + "name": "cuda-pathfinder", + "version": "1.8.2" + }, + { + "direct_url": null, + "metadata_sha256": "1ab914b9a57ca601df2e3cfe9608427b15d8afb78029076ace5d1caf9fd45f08", + "name": "cuda-python", + "version": "13.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "73d97a5eb578223b4895ef4f234574d14219cef9999ff7d0e92a3d0dd057bd3f", + "name": "cuda-tile", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "ae6f957fe66ed63081d1d83ee6e8838f3a0af2c6fce1223629d0dd6264565ead", + "name": "cuda-toolkit", + "version": "13.0.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "1f8e0ae51ad5feea63f58ed2e24f3da6f23ed548043235a14f7623d961dd9b64", + "name": "datasets", + "version": "5.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "153f4a4d6ff03dbe5c8ad7fe54bc2e7b989a4947b70f7aa77fbf652b394f2a2e", + "name": "depyf", + "version": "0.20.0" + }, + { + "direct_url": null, + "metadata_sha256": "ee09fc752d7271aac93079cfd63409957dc6b536c1ffd9355a01bf7297e72aa6", + "name": "detect-installer", + "version": "0.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "a7feab2c4f69fd5f85e5a3cb495a7f1870a6bf8199dcee5339e8118f7acbdc09", + "name": "dill", + "version": "0.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "fef3fde661fe30ba7bd1d78841a797136b2b3461705bb4eb92dc54f8308bbaae", + "name": "distlib", + "version": "0.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "fef3fde661fe30ba7bd1d78841a797136b2b3461705bb4eb92dc54f8308bbaae", + "name": "distlib", + "version": "0.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "a3ca2e39abe76c4a33d5fe4a2a84375ec9f25cdfdb7e1d8ea406bd6f1603205c", + "name": "dnspython", + "version": "2.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "92a07daad5e6ff461199de14e845d9b376e309ef916ce5379f3c9cd4e3b1623f", + "name": "dockerfile-parse", + "version": "2.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "5b566b25f0cbe4955d0b16844a7cc6d2002caa3bde2dfda7f301fd8870cbaa56", + "name": "docstring_parser", + "version": "0.18.0" + }, + { + "direct_url": null, + "metadata_sha256": "5a1080b5768c6c591e1c4f9c9812cafa808781b9eeb198043bf185e22d4a1613", + "name": "e2b", + "version": "2.51.0" + }, + { + "direct_url": null, + "metadata_sha256": "0a63979e0b946e16238e4339e60d9c1eb5a7ce3ea93dae78b5da9c65a6190540", + "name": "einops", + "version": "0.8.2" + }, + { + "direct_url": null, + "metadata_sha256": "16cbe67a57558f1d4bfdbc22a454434ba301750c57a62b1d3f5361c9e5cddc00", + "name": "email-validator", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "0617ddb55b90b42ddc9398dc7e91d61fe928a2504939f76526dc15b22d238caa", + "name": "fastapi", + "version": "0.136.3" + }, + { + "direct_url": null, + "metadata_sha256": "ddd82b9666c21988e234d623e2575e1b89fd4133260eeab43fc9a7c074f7024a", + "name": "fastapi-cli", + "version": "0.0.32" + }, + { + "direct_url": null, + "metadata_sha256": "611602e834d42e10433155ff5f5581358d732fa6b6f6f7820a8f79e74b1ce1f9", + "name": "fastapi-cloud-cli", + "version": "0.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "794524e4a9659bda6043721d848d028ea49996085a33326094fbaaa3f6e6b895", + "name": "fastar", + "version": "0.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "711401d36e60e10e35beb4d0f1bb42bf0c4d86339ae52f32b9aa4a4d790530dd", + "name": "fastsafetensors", + "version": "0.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "efaea9742e348c4c4bdcc6f616a33cc5aa3ae926494a72a46690b7da2f08ed5c", + "name": "filelock", + "version": "4.0.7" + }, + { + "direct_url": null, + "metadata_sha256": "99bd6c3f10781d3d2d350f2c3c9fc4765b55f25de8a6d6dd1f71501802d1255e", + "name": "fla-core", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "0a6ef979b75295cee2b5293ad4942b0cf2682e9e38680203064e0b70249c1a96", + "name": "flash-linear-attention", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "76b70a11ca82ea4606b529e7a8658cb3fe71412afa46f2ed57101dd91ba27558", + "name": "flashinfer-python", + "version": "0.6.18.post1" + }, + { + "direct_url": null, + "metadata_sha256": "ba8ff415192b5cbb90efce046e2271a00c8184afc362d8b47fbbc84d5e558b05", + "name": "frozenlist", + "version": "1.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "e7712831c80eb13b08fb7f7cc33988a8f24654af9eba7c6f5f943b2636e4306a", + "name": "fsspec", + "version": "2026.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "025de85c794878d0caa737869307447595f514ebf9599eacb5b1a501bae479b6", + "name": "fsspec", + "version": "2026.9.0" + }, + { + "direct_url": null, + "metadata_sha256": "ca94883bdeaa3740b45b6994443b445fd67c6e4a8064ac3bf9d92d2a5221eee8", + "name": "ghp-import", + "version": "2.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "a7e90983562a035cf767baa63d8c32bc37e1de7cad71ac7b6b2bc70a95bba4eb", + "name": "gitdb", + "version": "4.0.12" + }, + { + "direct_url": null, + "metadata_sha256": "dd96143ec79178bef685c1f5c0a58a87a66d003b421e605de65697308321d518", + "name": "google-api-core", + "version": "2.40.0" + }, + { + "direct_url": null, + "metadata_sha256": "0735d57088a83df2355e16843107fb0112abe2178fc5bb8132947a7ad962aa41", + "name": "google-auth", + "version": "2.59.1" + }, + { + "direct_url": null, + "metadata_sha256": "2f3aa9d9500d329560440e6a5a152e420aad5f5bbb23701f45b740be721784a1", + "name": "googleapis-common-protos", + "version": "1.75.5" + }, + { + "direct_url": null, + "metadata_sha256": "06d74ab04fdc03fad368868907f0d10e7d9f397aab58d58965c0b78ffaec34cc", + "name": "griffelib", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "7ee1c179e2c68a62968308b2f96f4f3469176ee3ac8bdb494ac80188d4d41271", + "name": "grpcio", + "version": "1.84.0" + }, + { + "direct_url": null, + "metadata_sha256": "04cf3a4a91575850f386f4fcfdedd8e7fbfba08feff038fbc1296d1e854db2dd", + "name": "h11", + "version": "0.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "b954a6ba4739c0cc878bb8ea27ea7c7154a48bb4b7c06dba9e9cf880cf0ec930", + "name": "h2", + "version": "4.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "6f0d7bf86e75d0bda1ceccc82367c0145ad0ec522c4d4f51bb454f467faadcc9", + "name": "hf-xet", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "f991b847550cf8225f69562902b5ccb591b2ce9a08fe07ef6e6d701bdb4694a7", + "name": "hpack", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "314d194165c4700034c1c67cee847d549a6d7091374c71f2cef0186ec56a3eb9", + "name": "httpcore", + "version": "1.0.9" + }, + { + "direct_url": null, + "metadata_sha256": "aed9767360bed1bcbda71e3b1a3c996603f86558bc77a1693ee3d09973d20cad", + "name": "httpcore2", + "version": "2.13.1" + }, + { + "direct_url": null, + "metadata_sha256": "8fa3bf3510c35e2eea9f523a1cace7120079cf51d76c4acea97de95806aaa14a", + "name": "httptools", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "3bf4804c215d111b6a4702cf9000021ab39807d1ed3207dd011b14b2843b2d14", + "name": "httpx", + "version": "0.28.1" + }, + { + "direct_url": null, + "metadata_sha256": "d11dd50813b8914bd9455e8b2b591171cd2b1618883943153afadc8bb9224678", + "name": "httpx2", + "version": "2.13.1" + }, + { + "direct_url": null, + "metadata_sha256": "43b119c34ad2b2aacc032a1a6a8feb142fdb5ca407a3519325d74dd53d8904df", + "name": "huggingface_hub", + "version": "1.33.0" + }, + { + "direct_url": null, + "metadata_sha256": "9ce850d5a6b775e5ef4a335f907e579a878e058213121b6eec567781ea68c585", + "name": "humming-kernels", + "version": "0.1.12" + }, + { + "direct_url": null, + "metadata_sha256": "67aa4f6717d82446a51ce350e7c4769eba0c4a22d2f428255cddd9d24b11a914", + "name": "hyperframe", + "version": "6.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd9511ede42f63b995c3f71944f908cb8f014048b63ecc1c8d420525a3354b59", + "name": "identify", + "version": "2.6.20" + }, + { + "direct_url": null, + "metadata_sha256": "af3c3a62bb5d82d6a43454684e0b1dedde27a21ea90eacfb1bed9814619f06d0", + "name": "idna", + "version": "3.20" + }, + { + "direct_url": null, + "metadata_sha256": "cf71393f3d079ce2e859384573e65aaacd1709bef700701f629df32398b598f0", + "name": "ijson", + "version": "3.5.1" + }, + { + "direct_url": null, + "metadata_sha256": "9305763e93d03df0e36516b1125fa046a6ebe37d44589e200e0593cf4bdfd980", + "name": "importlib_metadata", + "version": "9.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "32860c3c19b2e91f6cb5bd83400b5870cda051bc74a5a08822c8c666af0990db", + "name": "iniconfig", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "560faabb3d45d779e445a74e7e806a786f95f2200fa06d979603b7f0ee1cfb39", + "name": "instanttensor", + "version": "0.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "f6fc1f0d389e4245fc2a1a0fdfee09422e56200cb6f94659668456997ff4f7a9", + "name": "interegular", + "version": "0.3.3" + }, + { + "direct_url": null, + "metadata_sha256": "d10f300731197a4829b77f0c883bb3cf8a37ae8c76a302e095fa95d6427706d0", + "name": "jiter", + "version": "0.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "5b0c8d4b4c535a2432fb206223d774509b6e20af374c6a4b6f98bf72a7de6702", + "name": "jmespath", + "version": "1.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "6c4032c2e74273452cd77399af2ee85198f49c22da897983f26d2ed6f787c4e8", + "name": "jsonschema", + "version": "4.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "aaa6cd66f423729e8da397c9d533b7d731f6b25f3d6371b9338c36bdb9be74a0", + "name": "jsonschema-specifications", + "version": "2025.9.1" + }, + { + "direct_url": null, + "metadata_sha256": "f7c0687c032593106a2e5a3c241cf8043e7e2c222bddb0022b4cb2bf5de67115", + "name": "lark", + "version": "1.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "4511c6b04efc57a5f5333edc1f5f48b9f5412c3923d4bc19b715bdf47977511c", + "name": "linkify-it-py", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "be929870f6ecae18a819c56118f1101f3076e25ac6a4843ca6f4707ebd1e87c6", + "name": "llguidance", + "version": "1.7.6" + }, + { + "direct_url": null, + "metadata_sha256": "cf2b87669bead3e76ec54207f3354c13f73b50c32fcd13c8d627084b3379139e", + "name": "llvmlite", + "version": "0.47.0" + }, + { + "direct_url": null, + "metadata_sha256": "0a416d79c5543d94d2b18807626293d4f47655d1d22724c7ae296e413078aaba", + "name": "lm-format-enforcer", + "version": "0.11.3" + }, + { + "direct_url": null, + "metadata_sha256": "16bc1f59e34fd2a6633bd395276052eacd2c777b2cf72781e76b203f013a8fac", + "name": "loguru", + "version": "0.7.3" + }, + { + "direct_url": null, + "metadata_sha256": "5216d5acfd039a7b581a826186309594b228d37d2c8d56864124ea666689fe4e", + "name": "lxml", + "version": "6.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "f59d772b35315a928672bfcccfb89d82c0aac672c5275c048f7a93b79015bcea", + "name": "markdown-it-py", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "b137367ef0056711cbf5e53015df9168cab80373104e7899b1c0263a21d9c99c", + "name": "mcp", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "38e0b9edaae09e58cd1461fc961ced22672038a697930bedef153a74befb3de1", + "name": "mcp-types", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "799f49685865fd9cc8915fdb92a33e102eeeffad562b03b4aeffb6f422b771c1", + "name": "mdit-py-plugins", + "version": "0.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "481f9cbe08596c6eaba6343e0efa1b13b2362c30dce0610f7c08523f1d98388d", + "name": "mdurl", + "version": "0.1.2" + }, + { + "direct_url": "{\"dir_info\": {\"editable\": true}, \"url\": \"file:///Megatron-LM-training\"}", + "metadata_sha256": "2876c0c760bbfc93bd7d737bf0db2866a937308a7c1707c3a2bb59d4795986ff", + "name": "megatron-core", + "version": "0.16.0rc0" + }, + { + "direct_url": null, + "metadata_sha256": "a6e34d488c879f57ce042bec38f8864ba3ea7d6ecf0ab757fc88fe8dc0a22f26", + "name": "memray", + "version": "1.20.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd26d80dc9676b1fb8c894355bd525fbe7f49a6a86a555c72e9ec6d927247c33", + "name": "mergedeep", + "version": "1.3.4" + }, + { + "direct_url": null, + "metadata_sha256": "dd1b3b89e88d1c65a26e6e72dd075eabbc220bfb138769ec8b64578ee911795c", + "name": "mistral_common", + "version": "1.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "4859847a9f6321daf8849cf7fd1542ff430db6563a2abf9ac0d62a5b21bd951d", + "name": "mkdocs", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "1729fc31479f2582486cdc85397417659dd3b2fb3f920553de66cfe59d5f0b3e", + "name": "mkdocs-awesome-nav", + "version": "3.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "88b4b7b7c0aba5547befdedaf515c8df4867361daf55ff60b72578464d72dcbe", + "name": "mkdocs-get-deps", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "ad33bb33fb16b1f69689c4682550e97232154e367e2c8c8aee9dad0f10d269ce", + "name": "mkdocs-git-revision-date-localized-plugin", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "ed69fbfb9ac00c10c5a383a12ff9d2b9919ae184e408554434199211643d6040", + "name": "mkdocs-material", + "version": "9.7.7" + }, + { + "direct_url": null, + "metadata_sha256": "d1c549b61701148b97f8246bc924b2840e504b37b0ce7a27e78ddf81261e5363", + "name": "mkdocs-material-extensions", + "version": "1.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "4ad6171f3bf6812e4de90670ff0089d445093d4fe1d05d55f17b96a4a192a816", + "name": "ml_dtypes", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "4ad6171f3bf6812e4de90670ff0089d445093d4fe1d05d55f17b96a4a192a816", + "name": "ml_dtypes", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "b0dbdfa30ab6b1ce637a794899c9e43019182b6d1ab2d07b90f647f7331eba6b", + "name": "model-hosting-container-standards", + "version": "0.1.16" + }, + { + "direct_url": null, + "metadata_sha256": "95424470e481cfa8d18b30963b6de3aafe16614b1ea0414e184a008571dde84f", + "name": "mpmath", + "version": "1.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "eb184d83489401903615ce8a78d98d5b933dec0f7246811d396a529915fe797c", + "name": "msgpack", + "version": "1.2.3" + }, + { + "direct_url": null, + "metadata_sha256": "520006303d6a0e859970b83f7d452196e2e8f6dab08f6dcf1ba5823c1230025f", + "name": "msgspec", + "version": "0.22.0" + }, + { + "direct_url": null, + "metadata_sha256": "010d2fe039006070a711a476b171b7b7da5c29ccad3c4eecd77ef3711b07c2d0", + "name": "multidict", + "version": "6.9.1" + }, + { + "direct_url": null, + "metadata_sha256": "235634cc7ebda45f8a84dfdb1b9b35ac1a77a1888b34650c3a616d23e4a7e93f", + "name": "multiprocess", + "version": "0.70.19" + }, + { + "direct_url": null, + "metadata_sha256": "7c545b4b3e5e83d3fde41352272c10cb9deeaba5b7138fbf24383e952af8822e", + "name": "natsort", + "version": "8.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "311ee8cdaeaf9f11acf51cda9c3b5b191f76ce9d98bc3418164c3189bbc37a08", + "name": "nccl4py", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "66360539217852c3b44b37f409eade7e1559baf018bb363bacb2aa3a9759b203", + "name": "networkx", + "version": "3.7" + }, + { + "direct_url": null, + "metadata_sha256": "e8b0b1746808b87816c47e4531780ded7f246bed9575a89e8b40200aa81e9a13", + "name": "ninja", + "version": "1.13.2" + }, + { + "direct_url": null, + "metadata_sha256": "77c1117f0dbc41560ddc6e6b37b542fb4e88afcd4ef82ec06593e5bbd5f37121", + "name": "nodeenv", + "version": "1.11.0" + }, + { + "direct_url": null, + "metadata_sha256": "9af629898406c9eaa69897fe09220dc483270cdba89f6b20bf0165cdf0e1668e", + "name": "numba", + "version": "0.65.0" + }, + { + "direct_url": null, + "metadata_sha256": "0c7281a81cf76e40b27c1385ffd8a215d7227adc219f177ce807ead9e91994a5", + "name": "numpy", + "version": "2.3.5" + }, + { + "direct_url": null, + "metadata_sha256": "0c7281a81cf76e40b27c1385ffd8a215d7227adc219f177ce807ead9e91994a5", + "name": "numpy", + "version": "2.3.5" + }, + { + "direct_url": null, + "metadata_sha256": "bab990ced4537ce74ef5961ca933c4c6fd604fd09a5827a4a428c55bcb0be35b", + "name": "nvdlfw_inspect", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "10f6595146332d35f7f15a000e08b5c81432528c5d026470c1d03f0c1399fb70", + "name": "nvidia-cublas", + "version": "13.1.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "58e933b4ac8e49f098b16ab7480d03bd792afc3d1db10d0aacbdcc2c62e48fa3", + "name": "nvidia-cuda-cccl", + "version": "13.3.4.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "baac937970681d41aa0c3708b3d55d73f8d29e70aceaac0e71fe6d1548e94a09", + "name": "nvidia-cuda-crt", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "8d51e5c76ef5707b0b80d5ec9a791c0f11a480ab721820cf100a3cc566017eef", + "name": "nvidia-cuda-cupti", + "version": "13.0.85" + }, + { + "direct_url": null, + "metadata_sha256": "724bf56e61ddef5d4c2482ff64103a973b911b110b668acaea5373f6c83c1c5c", + "name": "nvidia-cuda-nvcc", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "c54801dbd815d534519a761f1f328325aa0f1d1f1659aa969fa74e7a2c76eee9", + "name": "nvidia-cuda-nvdisasm", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "af51f248363020b9fdfd2743704e901bf3d19a1a1ce1fe44fb98ba148bfc0157", + "name": "nvidia-cuda-nvrtc", + "version": "13.0.88" + }, + { + "direct_url": null, + "metadata_sha256": "055f7fc69a5a2159de82cd0718da02c8852e81c8a71ebb117b8e799badd7167e", + "name": "nvidia-cuda-runtime", + "version": "13.0.96" + }, + { + "direct_url": null, + "metadata_sha256": "df18686dbdb3074ca375a1d6c623a04102fd348950c67a721397349c6d4f0477", + "name": "nvidia-cudnn-cu13", + "version": "9.20.0.48" + }, + { + "direct_url": null, + "metadata_sha256": "abd0ca3f67af19a4d383ff2a012ae0090d4731c6492fd47236615308a50b3981", + "name": "nvidia-cudnn-frontend", + "version": "1.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "4a78545d424d0c5038353f7046a8ae40ceaf312045d71399eac9511f5fc15434", + "name": "nvidia-cufft", + "version": "12.0.0.61" + }, + { + "direct_url": null, + "metadata_sha256": "e49b909195c03ddbe203729d9b31dd88e3f207368333d1909c67c6b130a0c696", + "name": "nvidia-cufile", + "version": "1.15.1.6" + }, + { + "direct_url": null, + "metadata_sha256": "bb15a754c6be32c23aaac13c1cfa7a8ce53d92bc26652ec3b609f7a5cce3e7d1", + "name": "nvidia-curand", + "version": "10.4.0.35" + }, + { + "direct_url": null, + "metadata_sha256": "0dd58f677811eac04901a793740932e5a2a8fff2f5453aa6351614eb18391bb6", + "name": "nvidia-cusolver", + "version": "12.0.4.66" + }, + { + "direct_url": null, + "metadata_sha256": "8aeb284782ef6883095a5d1c110e221cad023a99afcfd5cdb4969a25e146d562", + "name": "nvidia-cusparse", + "version": "12.6.3.3" + }, + { + "direct_url": null, + "metadata_sha256": "09555246122896eaca3b8313eecfca4b339fefd3b597874cb9fe3bf29dab38c9", + "name": "nvidia-cusparselt-cu13", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "ac77bac79fbfb0c52ac6e2e5abc936b1e127be2192f0cbc27b00be3125fa86ae", + "name": "nvidia-cutlass-dsl", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "1ec968ec7c4083f7fe4e1fb8384c7e9b853a81491fef9f4cb1cf755961aaedf6", + "name": "nvidia-cutlass-dsl-libs-base", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "cc6f3846cd820013eaa6e2665c493d70c607be6ce7349b939eb4742888470585", + "name": "nvidia-cutlass-dsl-libs-core", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "2357d0df2d0d17c0b16663b8a89df53f751b19721f66821fd88fa78112c08e55", + "name": "nvidia-cutlass-dsl-libs-cu12", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "244590c25662dcf777b1daae97a858afe1a1aec62e5e6678b217007a459ab552", + "name": "nvidia-cutlass-dsl-libs-cu13", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "c3a25ada01f57418c1b897406c3abab18834e6adc573ab7b060620c453afb6db", + "name": "nvidia-ml-py", + "version": "13.615.71" + }, + { + "direct_url": null, + "metadata_sha256": "56baad4e7f699902b03b17580933f7bd50b6ea97b7df9d7e807750973da7529c", + "name": "nvidia-nccl-cu13", + "version": "2.29.7" + }, + { + "direct_url": null, + "metadata_sha256": "98810ef0ab8badc369e6a46a038f8ee9f412c0c753fb5ad580544f23a0aa7962", + "name": "nvidia-nvjitlink", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "b0f54ee21909d19640a58e05da755c91763eb5725f544fd0d4b84b2f5f94deba", + "name": "nvidia-nvshmem-cu13", + "version": "3.4.5" + }, + { + "direct_url": null, + "metadata_sha256": "06dc1a593c7e8b8c3f29184228c83f8f7ef57787ad91f3e5bcae1d238dd3092a", + "name": "nvidia-nvtx", + "version": "13.0.85" + }, + { + "direct_url": null, + "metadata_sha256": "32ee63450a437b6a6ed227ff6549144aa596197a322993521ec7af826ebd413e", + "name": "nvidia-nvvm", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "32c2efdcd2c673b3b7f35ca9c2cccefaad36f1f0a920648a13cad85f6a5767b2", + "name": "nvtx", + "version": "0.2.15" + }, + { + "direct_url": null, + "metadata_sha256": "3419d80e114a2c19fa9bd3582939a3942f19673055707ba6ca2ca489d58b41e0", + "name": "omegaconf", + "version": "2.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "28971076ce9c279d4b889496b046d55a1e05b02fb9851ceb717e9a10df799572", + "name": "onnx", + "version": "1.23.1" + }, + { + "direct_url": null, + "metadata_sha256": "1246f5a4d8295907a42e809ed9173ede2510ec9d260d2168989d126564897fa5", + "name": "onnx-ir", + "version": "1.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "e14643636835759700dff286f949c5ec34e7eac7ac47f44096414f0e0f1c3101", + "name": "onnxscript", + "version": "0.7.2" + }, + { + "direct_url": null, + "metadata_sha256": "00f847e99939207bd70dfd806428f6b20a3d01074b59325e4c76149a2e19be26", + "name": "openai", + "version": "3.22.1" + }, + { + "direct_url": null, + "metadata_sha256": "598d3ad5a22a14a7c4f1d218b43e345f32b0ba094b753467bae8a3f708fd48cb", + "name": "openai-agents", + "version": "0.22.3" + }, + { + "direct_url": null, + "metadata_sha256": "5a0afcb1ce845e05da12beb1767f5d2749bbc9e9050718c6b9fa3c225713c9eb", + "name": "openai-harmony", + "version": "0.0.8" + }, + { + "direct_url": null, + "metadata_sha256": "e86a6b6fcbbe152805f782c57df321002892e163019574877e9829272e25eb4e", + "name": "opencensus", + "version": "0.11.4" + }, + { + "direct_url": null, + "metadata_sha256": "53d669c8bd3d32d3275153b454e515ca5cc6dec92fae3a98309b5a2b19fe6d2d", + "name": "opencensus-context", + "version": "0.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "19778b6d66b0e45bf73e11fa37a208949d5b393aef914627394d5601455546a6", + "name": "opencv-python-headless", + "version": "5.0.0.93" + }, + { + "direct_url": null, + "metadata_sha256": "19778b6d66b0e45bf73e11fa37a208949d5b393aef914627394d5601455546a6", + "name": "opencv-python-headless", + "version": "5.0.0.93" + }, + { + "direct_url": null, + "metadata_sha256": "a3f5434fa7c80f7f7abc82173da639c8e9c59d30b4027182645562bd3d2f4f97", + "name": "opentelemetry-api", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "8611977ea596e4827874582e86250618444e1c718229dddfc16e5ea437ce5fcb", + "name": "opentelemetry-exporter-http-transport", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "2cfd41e5ca33292d987ba71fa6186d11e16ed66888f3a26f8a3a99060c4b5e90", + "name": "opentelemetry-exporter-otlp", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "3bb4494220732d4bf10e1dba231ea7638cedaa5362e1f23a50d34a14f520fea8", + "name": "opentelemetry-exporter-otlp-common", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "27fb1c8aa5c2cd07776f9f3281fc618cd3feb96017757c33d2b3586fb7fec88b", + "name": "opentelemetry-exporter-otlp-proto-common", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "5cba6098cdd0bfb06853a6c704a2451c4f82c9dea376a30b59ecd279296648ad", + "name": "opentelemetry-exporter-otlp-proto-grpc", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "6f53ef1c172ebf87af69b9ef390aa908506d0cd14bc7811985fdd937a4058808", + "name": "opentelemetry-exporter-otlp-proto-http", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "1910f4e7ebd497e98b6d231e10275288fda2cd1885117575706c62f45e065889", + "name": "opentelemetry-exporter-prometheus", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "fab18b721e30be41448be252e1dca43b48e7f15d971e0bb552492c0ef4b07bee", + "name": "opentelemetry-proto", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "3644a79f55762a646799ff52b9d837e01c8192b7b28f735a383f55c90edb9bc2", + "name": "opentelemetry-sdk", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "add3db481f7f401f65cfbddb058fde3bb4c9dd7b61064a84f8598ad7efe0b11c", + "name": "opentelemetry-semantic-conventions", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "0dfff30e912520a226bcf7a547393484cfcd8c738439c7b48418f61c95109480", + "name": "opentelemetry-semantic-conventions-ai", + "version": "0.5.1" + }, + { + "direct_url": null, + "metadata_sha256": "210ce26bad0a245a72831b4fa029708c245d4d670a88c8d5a69b1446c24a95e4", + "name": "orjson", + "version": "3.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "35ff73511848f5f934ccc39d538014716ec4579e76d54e0e407ff51794a7939c", + "name": "outlines_core", + "version": "0.2.14" + }, + { + "direct_url": null, + "metadata_sha256": "8ee2f7138ade46b6e348a6d099612f5bd6caff13511f3b4144327f37ce50eacf", + "name": "packaging", + "version": "26.3" + }, + { + "direct_url": null, + "metadata_sha256": "a4ab87bf8083001f25ccdc46095f05b678b3569dd58edc2cf941e3e7f64d7c88", + "name": "paginate", + "version": "0.5.7" + }, + { + "direct_url": null, + "metadata_sha256": "1de96a6c28c2e5613c9c87cd4ad9484791001cf58df43cf2ba74d5c4f85f0ad2", + "name": "pandas", + "version": "3.0.6" + }, + { + "direct_url": null, + "metadata_sha256": "d05b8d05da9f78176b2eefaacdfaa5e96708ec4f488daea8bbc52e3ed1bc3954", + "name": "partial-json-parser", + "version": "0.2.1.1.post7" + }, + { + "direct_url": null, + "metadata_sha256": "c1d126edceac2685e29403a8ae3a27c47143dce1f0252fa3931771562f1e2b4f", + "name": "pathspec", + "version": "1.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "30325dc8ce17bc64f9dbc0a449232fd35841a019df22a6f481007c9c5a28c1cb", + "name": "pillow", + "version": "12.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "cbc0b7b6e63b50dcb7c17cf3526a9304f285d9a31353adf3b22acc2059ab23f5", + "name": "pip", + "version": "25.0.1" + }, + { + "direct_url": "{\"dir_info\": {}, \"url\": \"file:///work\"}", + "metadata_sha256": "6ba03b5bc457a2a3d92468729501b5892a0d38ebcc36766c58859449498c5743", + "name": "pip", + "version": "26.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "0421937c4410b61c5325233d5b7671ae933bae8de174f87586ac55aa804851ea", + "name": "platformdirs", + "version": "4.12.2" + }, + { + "direct_url": null, + "metadata_sha256": "2bcffab42626e1fb50d6329765619312d30fe7f4880e98dcee99c92ebd283bb4", + "name": "pluggy", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "7e7562ba7c032f8edd02641ae71b1ac2d8f388103a68d777a7e907d19e75bc17", + "name": "pre_commit", + "version": "4.6.2" + }, + { + "direct_url": null, + "metadata_sha256": "bbe0a7662602ddd23f929fe0ee98e9d04406e138aeee18ce4861af186ea6060d", + "name": "prometheus-fastapi-instrumentator", + "version": "8.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "ece4a61f3ffb92a083fd5e47e180e3e070342e60a3bd93876a879e79a643e821", + "name": "prometheus_client", + "version": "0.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "5feba21a58eaa126e7e7739e57e2572e5bb251fcbf56e439e508acc47d769314", + "name": "propcache", + "version": "0.5.4" + }, + { + "direct_url": null, + "metadata_sha256": "3f136dbf7239c987a7685acd33440cc5efd6c4107b4b11c425201b4de70ae36f", + "name": "proto-plus", + "version": "1.29.0" + }, + { + "direct_url": null, + "metadata_sha256": "118b5ad013120a7a6e24714595ad776bf264d7b0060389133310d18ea1480902", + "name": "protobuf", + "version": "7.36.2" + }, + { + "direct_url": null, + "metadata_sha256": "0849f5a519bf9bc23ef204443fdd8d6d10678863acac7ca9340fc11bfba5a856", + "name": "protobuf-py", + "version": "0.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "eab5f2f4fd98f67a710a8fb1975b64ffa880a4f977566f022c567e08e324ccd6", + "name": "protobuf-py-ext", + "version": "0.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "39009938840de3a8b2a37eb4668d2601aae8c74e4b74743f73e59996b5b7e6e1", + "name": "psutil", + "version": "7.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "df44b58e8a4cfe57f65773ec47f7bdf2a14c8f5f73a7abf331a6b6237d6d691a", + "name": "py-cpuinfo", + "version": "9.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "2fd4a9efc5e5c74ae4c2fcf1970193c524c62ab22af8d5e66ebf7df9e6e46e83", + "name": "py-spy", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "d2ccdeb15cddedc81637a83e40baa6397fe269023b738d0fc3cb2d90722e290b", + "name": "pyarrow", + "version": "25.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "47b9f28e971a56f5adf949e0bcf105b0bf6587946566ecf197a2819d8848cc01", + "name": "pyasn1", + "version": "0.6.4" + }, + { + "direct_url": null, + "metadata_sha256": "82ce4c01c6d36841b9801fcdabab9bfe61d0b5e4e440c275941d8a2d4a790730", + "name": "pyasn1_modules", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "45cb345e4c12f63bc843b8c88902cc44c4d624a55aaef8cd5ffbc0ad16356fbe", + "name": "pybase64", + "version": "1.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "d311ae661edeac8ff029ab2960d065a7e792ebf8f79af682daa53109fe81318b", + "name": "pybind11", + "version": "3.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "cce9c0d440d065d4cdfb0d00004b8ddd65cf363a740efc5b0920b29201a59cd9", + "name": "pycountry", + "version": "26.2.16" + }, + { + "direct_url": null, + "metadata_sha256": "a1e33542883c249bf6c263b0023b9ea8a6131a77d9cb2cbc88316968e5eada83", + "name": "pycparser", + "version": "3.0" + }, + { + "direct_url": null, + "metadata_sha256": "faffcc4d7d359cb1047a9f67f7c65096b838c6db6c62852ef20fb27d55649a95", + "name": "pycryptodomex", + "version": "3.23.0" + }, + { + "direct_url": null, + "metadata_sha256": "98929f4cb80451dc3c6c8cd541a3081dccf0dee94afe7d9fa5c214a18ff236ce", + "name": "pydantic", + "version": "2.13.5" + }, + { + "direct_url": null, + "metadata_sha256": "8eccadbe707db97c397fb79073fe791b7998ef3a85f04f817f8991f7697b190b", + "name": "pydantic-extra-types", + "version": "2.11.1" + }, + { + "direct_url": null, + "metadata_sha256": "8f00c91deb34399316a5386eb2e76fe09f14a08dc3045f2e7dce9bf8573796bd", + "name": "pydantic-settings", + "version": "2.15.0" + }, + { + "direct_url": null, + "metadata_sha256": "66c729edddc20bf2764bb18bd87d907b08690e50355f39b97acc737b26d1d164", + "name": "pydantic_core", + "version": "2.46.5" + }, + { + "direct_url": null, + "metadata_sha256": "394500d78a0c1a433ae8ca3693152c08f6a901121d4b069cf1540a19759e2950", + "name": "pylatexenc", + "version": "2.11" + }, + { + "direct_url": null, + "metadata_sha256": "df2e9e9847a2aea0ae6e20fd325aeb16cf3ce7f8913462db6c2398363cd0c0bf", + "name": "pymdown-extensions", + "version": "12.1" + }, + { + "direct_url": null, + "metadata_sha256": "82fcfe724db9f0b51348da89f4f5cdc0b08d08882b1bbc0ca4913d3a0a93bcb9", + "name": "pynvvideocodec", + "version": "2.0.4" + }, + { + "direct_url": null, + "metadata_sha256": "3722422cc1478b175879143dfb78f98b7a5f53f4f684d71b7054fe2e8acd3b89", + "name": "pyqwest", + "version": "0.10.0" + }, + { + "direct_url": null, + "metadata_sha256": "7d1d1c276b7c372d55d17ac7d30f0a4b80a746e147347b8510d1355eea7f80c8", + "name": "pytest", + "version": "9.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "89e7c1c932e52b74bdcaf504389d2d1a2d7ca559b02bf5a09fc80ebd58ad10f7", + "name": "python-dateutil", + "version": "2.9.0.post0" + }, + { + "direct_url": null, + "metadata_sha256": "54f30f811841b6d772f31715712c85bfe0041839cb071f78daf41c700a98642b", + "name": "python-discovery", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "54f30f811841b6d772f31715712c85bfe0041839cb071f78daf41c700a98642b", + "name": "python-discovery", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "0cc19efd76cfbf3bcb2cb0d3ab82191036855859455aa3812c5e9e591e3f34e8", + "name": "python-dotenv", + "version": "1.2.3" + }, + { + "direct_url": null, + "metadata_sha256": "1d866c6124631b9ce1797ad412fff298ab53fc2d95210281d7c8f20e920753fa", + "name": "python-json-logger", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "2d18a1e7286d92a656ead5ec6f83d5ae6dc858634624f6b264703ae88d24d718", + "name": "python-multipart", + "version": "0.0.32" + }, + { + "direct_url": null, + "metadata_sha256": "beaa0efe9ba4b34843f5a0fc7379a73f10e95adb8cc0c31f359ab6f3a42b4def", + "name": "pyyaml_env_tag", + "version": "1.1" + }, + { + "direct_url": null, + "metadata_sha256": "238dc769e22d4f5626750cdff36e920e4a8d69c10d88de6d79b40a59cc13d873", + "name": "pyzmq", + "version": "27.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "de0a5e855bb5bb78b7acdcd2ca60619c6a0c109814881589caf158ec07155662", + "name": "quack-kernels", + "version": "0.6.5" + }, + { + "direct_url": null, + "metadata_sha256": "961ffef199b876fb4d7b10903d78e79f359d703b1638834c61d70b9879932918", + "name": "qwen-vl-utils", + "version": "0.0.14" + }, + { + "direct_url": null, + "metadata_sha256": "faf6ab9027d12de992827a2d8a224996fe6747a8c5f7d31ae495983dc73eefe9", + "name": "ray", + "version": "2.54.0" + }, + { + "direct_url": null, + "metadata_sha256": "c50d8b3ff4d113925b60dc47d1d28e87248a3338024241b0a3a66c8794fbce0c", + "name": "referencing", + "version": "0.37.0" + }, + { + "direct_url": null, + "metadata_sha256": "02acdc52d6f21d5f4b172254daaa94edfaa44c9ebe14d1c00cc4c8fe99b0e1df", + "name": "regex", + "version": "2026.9.29" + }, + { + "direct_url": null, + "metadata_sha256": "ac08207697217d1ffde8a161b424d77d6e2af6b62630fa26d75d08f11076cdca", + "name": "requests", + "version": "2.34.2" + }, + { + "direct_url": null, + "metadata_sha256": "f1abd635c3dff607a4fd654c62a88d9d4c21843cfc9176116c156f4269ca21b5", + "name": "rich", + "version": "15.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "932ff7743a756d0efcc45528d64c275ac3cb40a8dd1787ea10cb303907f0ae4f", + "name": "rich-toolkit", + "version": "0.20.5" + }, + { + "direct_url": null, + "metadata_sha256": "294a1405c0fa34b5f735bcb46459050436849a1e584c643544de99c07c529fb7", + "name": "rignore", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "5e54dd00b4ad336c5161d47de2a5c2212090c44629c28b6538b156256e49282d", + "name": "rpds-py", + "version": "2026.6.3" + }, + { + "direct_url": null, + "metadata_sha256": "0d5895abd80bfc0027c02943abaea4547061b9004bd134950d640d619a697835", + "name": "safetensors", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "91d5de3f641f33a8fbb4b6e91772da68d50b68686971d7b66af2068f2e77b694", + "name": "scipy", + "version": "1.17.1" + }, + { + "direct_url": null, + "metadata_sha256": "297fb30f701a800489c12893a951da3e5bd1f80061a1f43f0d3e9f1d4c6bc6fd", + "name": "sentencepiece", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "4245e0388ddf2048a38ae2a24a3d2c583408b2454aadc680d3c3beede639db3f", + "name": "sentry-sdk", + "version": "2.71.0" + }, + { + "direct_url": null, + "metadata_sha256": "ae8a9e6feec1a76e954d65ea48ac57842c9a7bfb5ac6e5ea82400a5ba9f71a98", + "name": "setproctitle", + "version": "1.3.7" + }, + { + "direct_url": null, + "metadata_sha256": "341d00772017437d0f6e3c943ae353f243c39fedfba403aea47cced927a76516", + "name": "setuptools", + "version": "79.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "ff4bcfb192bd542ed8f1794fb32ffc9eabd932d6e03cb00a4ad5e35a2469af88", + "name": "setuptools", + "version": "80.10.2" + }, + { + "direct_url": null, + "metadata_sha256": "f1e5a532fb8cda0bbc370e3db6cb9cea72a065d12ddd6a14976ba3cf66264221", + "name": "shellingham", + "version": "1.5.4" + }, + { + "direct_url": null, + "metadata_sha256": "2aba2cfd9c2ad7625a5d374d141af317d8f92d3534997bf98d127e52848dfc81", + "name": "six", + "version": "1.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "69ae2dfe547624be97fae348e1cfa3793f8854eed32cc1603badedc7d48fb36e", + "name": "smart_open", + "version": "8.0.2" + }, + { + "direct_url": null, + "metadata_sha256": "d415e6c6de7dee117d254a342668c489931bc88eac7ec8678b452078e366da6e", + "name": "smmap", + "version": "5.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "093bc4f0740a6fc28692e616aa8fe68d7e1d76426cc5a5faf9ea722a8ee7aaae", + "name": "sniffio", + "version": "1.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "b3cef071eb1dbeaa76a1273fe2ca2cc8ef36e835165253952d93780962529ac1", + "name": "sse-starlette", + "version": "3.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "3c01ca830e213f0311fe37bc3b46b8ab230a5e7acb894bf0fc8785cb7ccfed48", + "name": "starlette", + "version": "1.7.0" + }, + { + "direct_url": null, + "metadata_sha256": "6017ca508a293cf47a88a78cb330e9cbd131d74ec3c7fbf89bd4300ed3129d30", + "name": "supervisor", + "version": "4.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "fd5eb4925b04f9bffbc6c4f92bf8aea7243b918b43cd359493fce48a7dd3b336", + "name": "sympy", + "version": "1.14.0" + }, + { + "direct_url": null, + "metadata_sha256": "f09f0e24282c5a86346bcd5b10ae5ff81869fa8ef69c3ba524bd0a817a87dda9", + "name": "tabulate", + "version": "0.10.0" + }, + { + "direct_url": null, + "metadata_sha256": "519fa19c146fd58a0a75ecf1461e4bd98f9c06d01800c37d4a80f5fef095f4e1", + "name": "tensorboard", + "version": "2.21.0" + }, + { + "direct_url": null, + "metadata_sha256": "1af7ad76e4073b01ab147eb3c1d8e38b95d38062c6c9bc63890150738642e8eb", + "name": "tensorboard-data-server", + "version": "0.7.2" + }, + { + "direct_url": null, + "metadata_sha256": "9e597f62fc07e3b931d5c8fb0e90706fb6d45465cfb5d01dbd27ba7fc135c02c", + "name": "tensorstore", + "version": "0.1.80" + }, + { + "direct_url": null, + "metadata_sha256": "0da993d16ef6326f471796fcb065622f309c5c1aae6c6295b488ea64bb5c880c", + "name": "textual", + "version": "8.2.8" + }, + { + "direct_url": null, + "metadata_sha256": "52ca6148d4fd1497254855fa610cfdde99191cd42bce7a452fd3a68855504ac0", + "name": "tiktoken", + "version": "0.14.0" + }, + { + "direct_url": null, + "metadata_sha256": "0df9eb495cfb477dcbdfbdcd8c04d952d3eb00d77831630760571e13545398e5", + "name": "tilelang", + "version": "0.1.12" + }, + { + "direct_url": null, + "metadata_sha256": "802b576e011dc61bd2681593e8d802714b6c4ce636a9cf87035026db32ce6262", + "name": "tokenizers", + "version": "0.23.2" + }, + { + "direct_url": null, + "metadata_sha256": "4e1631b2164a49ff9a848d86ce504fdcc15e3540dbb262df8f33a2681a8de513", + "name": "tokenspeed-mla", + "version": "0.1.8" + }, + { + "direct_url": null, + "metadata_sha256": "05086095a775c5dca70998dcf442a848c13f9c68b54a54c510c3542c5abb6563", + "name": "tokenspeed-triton", + "version": "3.8.10.post20260920" + }, + { + "direct_url": null, + "metadata_sha256": "71daba472d0c5ffc25c0231dc29688ab0cb13d5bc7e7d93f6c4cce4169c50048", + "name": "torch", + "version": "2.13.0" + }, + { + "direct_url": null, + "metadata_sha256": "cccd2f1c0e5866e63732f58798c8d642ee6d10cd560d6f691e7981b908c246c9", + "name": "torch_c_dlpack_ext", + "version": "0.1.5" + }, + { + "direct_url": "{\"dir_info\": {}, \"url\": \"file:///torch_memory_saver\"}", + "metadata_sha256": "6276cef17dedbb5ee0d6157bbf63b832e916026281328d995ad3d488c2539618", + "name": "torch_memory_saver", + "version": "0.0.9.post1+slime" + }, + { + "direct_url": null, + "metadata_sha256": "29809ca2c86dda5079654f1f70564a64435e9d08f1964a2412b6f514e1b5ff64", + "name": "torchaudio", + "version": "2.11.0" + }, + { + "direct_url": null, + "metadata_sha256": "7e9be0f3a290e3fd9370d8fe010c7ffd006d5d3d05ab8bdf7df8f92f0fca9c39", + "name": "torchcodec", + "version": "0.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "181fa5e6b399c378711eddcdacd756d3c51317916f8eb160ee36cae7fae9589f", + "name": "torchvision", + "version": "0.28.0" + }, + { + "direct_url": null, + "metadata_sha256": "43d1261aff90cf3d5b1b40cf1f94234d61409b14e59f3766f457c1eec7f7ac15", + "name": "tqdm", + "version": "4.70.1" + }, + { + "direct_url": "{\"archive_info\": {\"hash\": \"sha256=3e1d9f534781c8e608240da0b495b8246317a36382f7609017cbaa7fb1d53f7b\", \"hashes\": {\"sha256\": \"3e1d9f534781c8e608240da0b495b8246317a36382f7609017cbaa7fb1d53f7b\"}}, \"url\": \"file:///wheels/transformer_engine-2.16.1%2Bc9877beb-cp312-cp312-linux_x86_64.whl\"}", + "metadata_sha256": "d882f743161d9d9f35dee4e1a8cc9136fa495f7c660caace01ab8f5602d76aa7", + "name": "transformer_engine", + "version": "2.16.1+c9877beb" + }, + { + "direct_url": null, + "metadata_sha256": "465797a59706d83b45c93fde750b228c3b6e1addc44115de2c4c02ad66d9c5ea", + "name": "transformers", + "version": "5.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "a91982ca086667c592a951973434f7c5a9f27a8300bc97af78dfb496afe53e71", + "name": "triton", + "version": "3.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "d26fbb244532c4051e715f9047cd943e2cc4abb0ac6f2a517fa2986eb1ea726a", + "name": "truststore", + "version": "0.10.4" + }, + { + "direct_url": null, + "metadata_sha256": "c84af1a069084b1b440b3594068dec29200d52d4c1a9b652030448717f270158", + "name": "typer", + "version": "0.27.2" + }, + { + "direct_url": null, + "metadata_sha256": "0ad6653b7439f4bb6a596cb7b01ed1b716458467525c4dc40b75d62bdb943c98", + "name": "typing-inspection", + "version": "0.4.4" + }, + { + "direct_url": null, + "metadata_sha256": "d005280aa13b334ac942d20219102865e559f69ffd06c35c248b2f0d0da3b933", + "name": "typing_extensions", + "version": "4.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "fba2930e9030a18965d243f8d330748db2e67572a81b3b68710462fb5110332a", + "name": "urllib3", + "version": "2.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "bc5717bd6524a33838f285261868bcc8e311e8c29fdb19e41d56c38b04890e84", + "name": "uvicorn", + "version": "0.54.0" + }, + { + "direct_url": null, + "metadata_sha256": "741c006d8441f562aa853a5430df236fbb4af923445491f396bf09943bd30258", + "name": "uvloop", + "version": "0.22.1" + }, + { + "direct_url": "{\"dir_info\": {\"editable\": true}, \"url\": \"file:///vime\"}", + "metadata_sha256": "f85aa01dfdc868756a6583434bbff040f29eb511d47d5b25ada063a84353aac6", + "name": "vime", + "version": "0.3.2" + }, + { + "direct_url": null, + "metadata_sha256": "c25431aaf1950971fe96292f395a41a55b403127bfca0d0b8f7dc9cff5dab75d", + "name": "virtualenv", + "version": "21.14.1" + }, + { + "direct_url": null, + "metadata_sha256": "4e3ee0a31d85e56268640aae853bcee4794dfe8c0483c5c6370517e480c81ae0", + "name": "virtualenv", + "version": "21.14.5" + }, + { + "direct_url": null, + "metadata_sha256": "d4ed5c7551cddb8c1aeff2f9f27b3491f6ad2c9afda8e7bb9779c33fa12a536c", + "name": "vllm", + "version": "0.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "84b482e09bac949e992594757214a1920c667a5d898ee320e309250697f6d26e", + "name": "vllm-router", + "version": "0.1.15" + }, + { + "direct_url": null, + "metadata_sha256": "9b16c871eb1060a5218e9b9a9ad33288d94844cfaf43f08dbb6c32423bde8fe3", + "name": "wandb", + "version": "0.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "8e4f2be437dfe4eb3c6c959e517ac20b75d06525563f1ebcbf06f9ec648bd7c1", + "name": "watchdog", + "version": "6.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "15218afb42938907c2ca74c54e3d8e3a5406493c4761e29e38e82bfec0f84296", + "name": "watchfiles", + "version": "1.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "8863af96e88b7db9990da99aa6c46816eacc3d2f9ae1297b53381b033cd70119", + "name": "wcmatch", + "version": "11.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "f46e6bd6cfafb2b684c29587b017b7096fd9155b74eda25a22eca784b9803ab7", + "name": "websockets", + "version": "16.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "ce82db5ccfefa4bfbe4e25a36e1f91e8e7d51fcaeb31586c4d48e1c69f99168b", + "name": "websockets", + "version": "17.1" + }, + { + "direct_url": null, + "metadata_sha256": "0f142a2c09eac643c7d0bfe77f3f121184c0b17914afbd32af669ed19b2b02ef", + "name": "wheel", + "version": "0.47.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd58938e51a3c5cb363f6f22eaa2a8a7accc1ce373388de167a82f77d3e5783f", + "name": "wrapt", + "version": "2.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "b0b72c1941f04499ca7e1a3a6e479aee8df902c3d49979624b59dba8c3228d37", + "name": "xgrammar", + "version": "0.2.8" + }, + { + "direct_url": null, + "metadata_sha256": "ef8861f39e5c36255966a36032651f937d890d55f31f1c26304b488f1ba34332", + "name": "xxhash", + "version": "4.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "740c08057b6eb69c58402c87d652af0a471e46325d811f2c605632a18817152f", + "name": "yarl", + "version": "1.25.1" + }, + { + "direct_url": null, + "metadata_sha256": "7b060e4d24394b5431875e2f74fec8e6bffa79d2e6b4cb8c7e2a5187dd2d8d69", + "name": "z3-solver", + "version": "4.15.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "3d76d4fbc95f0851191147db12300938c67a6f8fb1df884886d9601272ccc4e8", + "name": "zipp", + "version": "4.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "d3de2651e4e908dbb7c9d80508e5179590217dfac4993dc8b04381c5b9718c4c", + "name": "zstandard", + "version": "0.25.0" + } + ], + "executable": "", + "installed_provider_sources": { + "vllm/compilation/__init__.py": { + "path": "/vllm/compilation/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/backends.py": { + "path": "/vllm/compilation/backends.py", + "sha256": "fa4bff8920b363efbbde9456f135fa9d2c004a5bde1898877f177418b2d8b008" + }, + "vllm/compilation/base_static_graph.py": { + "path": "/vllm/compilation/base_static_graph.py", + "sha256": "5cfe8e06db84aa42cd41cdd93ebe93af00b3a242c8011042057530e2922b523a" + }, + "vllm/compilation/breakable_cudagraph.py": { + "path": "/vllm/compilation/breakable_cudagraph.py", + "sha256": "3cc427612a08e2b9b3fee47548026400c1d0776e2d4747535e59ef5512bdf1e8" + }, + "vllm/compilation/caching.py": { + "path": "/vllm/compilation/caching.py", + "sha256": "71d212452dde742fbf28b8a01ed29d3c08a7457ff7f8da2a20ce9d17e902c2cf" + }, + "vllm/compilation/codegen.py": { + "path": "/vllm/compilation/codegen.py", + "sha256": "e04833bec88cf9d1a13aa7341e30e3233d1138bfe23424e0fd34d664b3fedb9f" + }, + "vllm/compilation/compiler_interface.py": { + "path": "/vllm/compilation/compiler_interface.py", + "sha256": "8d84e2864bf83f754bae9e9f77119e0287cca9f97f5fa5ec2535e07b5ad88944" + }, + "vllm/compilation/counter.py": { + "path": "/vllm/compilation/counter.py", + "sha256": "d8158c54dd36a357bf24f6f84dc22f572d3a27f4875f3d5779b12bc5d454ff76" + }, + "vllm/compilation/cuda_graph.py": { + "path": "/vllm/compilation/cuda_graph.py", + "sha256": "05c86392d7fae967ac73076dba7e01990a0e3ae619e4866450a0c1be56bd1192" + }, + "vllm/compilation/decorators.py": { + "path": "/vllm/compilation/decorators.py", + "sha256": "cab6962e8a1fead59c75f5ed8cb4732f9e5441ff972030c2f4b1c4ba0c58de3c" + }, + "vllm/compilation/monitor.py": { + "path": "/vllm/compilation/monitor.py", + "sha256": "43b24c5cb1bc4d32dc979f3222596905c7b3acc58415328a234402e6edc76abf" + }, + "vllm/compilation/partition_rules.py": { + "path": "/vllm/compilation/partition_rules.py", + "sha256": "857d2fb06dc871ea1d3717cd01fbd4e5205984100d98b7b72a2933d6ff1cfa4d" + }, + "vllm/compilation/passes/__init__.py": { + "path": "/vllm/compilation/passes/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/fusion/__init__.py": { + "path": "/vllm/compilation/passes/fusion/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/fusion/act_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/act_quant_fusion.py", + "sha256": "1fa9c3ca4fb424685b7053c3dda89dda16c98dc5645d85f0f28dca58429792b3" + }, + "vllm/compilation/passes/fusion/add_rms_fusion.py": { + "path": "/vllm/compilation/passes/fusion/add_rms_fusion.py", + "sha256": "e46998552628aa5cd5962fc39ea39ae824fd97e6aeba1d176e9cc7cade39837b" + }, + "vllm/compilation/passes/fusion/allreduce_rms_fusion.py": { + "path": "/vllm/compilation/passes/fusion/allreduce_rms_fusion.py", + "sha256": "0af193505880cec0f6ffa224c688bce3c9ddc318dccdf04a696b4e4b4506a963" + }, + "vllm/compilation/passes/fusion/attn_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/attn_quant_fusion.py", + "sha256": "ecc64e82be4481954c9cac6c23d7794846ab19486b570f2dda07ab5ad67c5a49" + }, + "vllm/compilation/passes/fusion/collective_fusion.py": { + "path": "/vllm/compilation/passes/fusion/collective_fusion.py", + "sha256": "1e2c8539d6960b45907fb3bf0482441ea7250e97c56ffdea1500514efa0b164d" + }, + "vllm/compilation/passes/fusion/matcher_utils.py": { + "path": "/vllm/compilation/passes/fusion/matcher_utils.py", + "sha256": "50ac5714ce1bb113520de769ea6234316acc470a8cdf2537a996ce9a9d54337d" + }, + "vllm/compilation/passes/fusion/mla_attn_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/mla_attn_quant_fusion.py", + "sha256": "a966fe7f58bf9228379f793f5fd851735a97f9639722766b2a20cb79a9e4baec" + }, + "vllm/compilation/passes/fusion/mla_rope_kvcache_cat_fusion.py": { + "path": "/vllm/compilation/passes/fusion/mla_rope_kvcache_cat_fusion.py", + "sha256": "1602cc28055ffa8d1123ddb1d256bf0bd12006fd06ea7e16a986c55746dbe0dc" + }, + "vllm/compilation/passes/fusion/qk_norm_rope_fusion.py": { + "path": "/vllm/compilation/passes/fusion/qk_norm_rope_fusion.py", + "sha256": "aebc7d1a5189b65ac665afcc169e7baebd53efe719c48e35e7c5babe85af0d39" + }, + "vllm/compilation/passes/fusion/qk_norm_rope_kvcache_fusion.py": { + "path": "/vllm/compilation/passes/fusion/qk_norm_rope_kvcache_fusion.py", + "sha256": "f0cfd0d83ec4acb09f9bf91d199b114e9d4995e3059c13eb23a6978ce7c07eb2" + }, + "vllm/compilation/passes/fusion/rms_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rms_quant_fusion.py", + "sha256": "4852aa44e0e2087043fdac271bda9b8d9bfe3201bb84ce3919b8ed454d8083c4" + }, + "vllm/compilation/passes/fusion/rocm_aiter_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rocm_aiter_fusion.py", + "sha256": "372e76c68c75209a085deec6dd22b3816be633613ca82f6f2925c1b3773d61a0" + }, + "vllm/compilation/passes/fusion/rope_kvcache_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rope_kvcache_fusion.py", + "sha256": "3a756e9049593537143b5a56ab9185a6bc83f57ed81d84226d7791a46a984b53" + }, + "vllm/compilation/passes/fusion/sequence_parallelism.py": { + "path": "/vllm/compilation/passes/fusion/sequence_parallelism.py", + "sha256": "3af7e420dcb35fff0bae0f8f599d0f1bda34445ebe194059892a434b2976d654" + }, + "vllm/compilation/passes/fx_utils.py": { + "path": "/vllm/compilation/passes/fx_utils.py", + "sha256": "730708213acf9d1b5f3176b433dfc197a5f3c81b5ce443f0923c526924833003" + }, + "vllm/compilation/passes/inductor_pass.py": { + "path": "/vllm/compilation/passes/inductor_pass.py", + "sha256": "1f380aacf7adabb8bf8b7d41c0a93473947f0716f7445bd910fd448f6c08e672" + }, + "vllm/compilation/passes/ir/__init__.py": { + "path": "/vllm/compilation/passes/ir/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/ir/clone_elimination.py": { + "path": "/vllm/compilation/passes/ir/clone_elimination.py", + "sha256": "5297078f5cddce081faba5215814275381d2083b32318fcfeb2bf9d69fedb7c7" + }, + "vllm/compilation/passes/ir/inplace_functionalization.py": { + "path": "/vllm/compilation/passes/ir/inplace_functionalization.py", + "sha256": "2dc4f22c6f05224828c2941479185b1452d4490f488b7f0bfd124334e7809fed" + }, + "vllm/compilation/passes/ir/lowering_pass.py": { + "path": "/vllm/compilation/passes/ir/lowering_pass.py", + "sha256": "d9c3d90f63138420f0e5489447b5996573fcfbbab939da2efccd00848492b172" + }, + "vllm/compilation/passes/ir/utils.py": { + "path": "/vllm/compilation/passes/ir/utils.py", + "sha256": "f59d33a6c7d0616cbeec1e9fb1d6c948881bf81fe124caeb906eac2e2197ea21" + }, + "vllm/compilation/passes/pass_manager.py": { + "path": "/vllm/compilation/passes/pass_manager.py", + "sha256": "486979a058aa2e20ebedcbb6e039f7a59f38d2efd2cda11219fae4067be0968d" + }, + "vllm/compilation/passes/utility/__init__.py": { + "path": "/vllm/compilation/passes/utility/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/utility/fix_functionalization.py": { + "path": "/vllm/compilation/passes/utility/fix_functionalization.py", + "sha256": "ad5b504a05ccee023869b0c8df70ec2fff9a4a80d25fd903e2b532f470e7203f" + }, + "vllm/compilation/passes/utility/noop_elimination.py": { + "path": "/vllm/compilation/passes/utility/noop_elimination.py", + "sha256": "8abf85d28c13f95059f2acbc0275b9b9ed2ad4990f7c5763bbe3067a4aa629ce" + }, + "vllm/compilation/passes/utility/post_cleanup.py": { + "path": "/vllm/compilation/passes/utility/post_cleanup.py", + "sha256": "1c38b14fc209165cbcf8ca763a17ac4e528b97f59b573e5d52df2cce7d758de3" + }, + "vllm/compilation/passes/utility/scatter_split_replace.py": { + "path": "/vllm/compilation/passes/utility/scatter_split_replace.py", + "sha256": "138402cc3097768a32e9e5b8d1a054b6176e494bddc8684e23ca2dc5fdc3fdda" + }, + "vllm/compilation/passes/utility/split_coalescing.py": { + "path": "/vllm/compilation/passes/utility/split_coalescing.py", + "sha256": "0b02acd9e1ad43d7b3e128b914e969b9580773f2818078846dfbf163a8bd0871" + }, + "vllm/compilation/passes/vllm_inductor_pass.py": { + "path": "/vllm/compilation/passes/vllm_inductor_pass.py", + "sha256": "4f83ffb67f834a214221d810c7843a8e41eb4e5930eb40adbd8cf054ff6fb9c6" + }, + "vllm/compilation/piecewise_backend.py": { + "path": "/vllm/compilation/piecewise_backend.py", + "sha256": "6525318ff3ca2e4978e24dd9232a7ae0a02e920e19604b83db6f6043d1f8a54d" + }, + "vllm/compilation/wrapper.py": { + "path": "/vllm/compilation/wrapper.py", + "sha256": "c1b1fca679ea16aa07a696831a810c0d531da2bb0ea32dd6f1a95cdaef36de07" + }, + "vllm/config/__init__.py": { + "path": "/vllm/config/__init__.py", + "sha256": "56fb0cb1598d297e4f95a97e5d86dc624145d1532f5faa432b7d2834d7155bd5" + }, + "vllm/config/attention.py": { + "path": "/vllm/config/attention.py", + "sha256": "c41f345b512d9b7df882328257eb3a6381f41088c11ae83b5ecd8a9e8265d1bc" + }, + "vllm/config/cache.py": { + "path": "/vllm/config/cache.py", + "sha256": "f1c226ba679c884930dbfcaf41a57248b137a9a20d3ed8e3d3b31752bb484c07" + }, + "vllm/config/compilation.py": { + "path": "/vllm/config/compilation.py", + "sha256": "c9cec5c7200e8e559810ec8c30113ad61dab6780f9f7fb3c116bd0d9b5a43065" + }, + "vllm/config/device.py": { + "path": "/vllm/config/device.py", + "sha256": "7b82eee02ceb5842337451a27a3d5729920c47e25e8f6bf3997f5146f9330a9c" + }, + "vllm/config/diffusion.py": { + "path": "/vllm/config/diffusion.py", + "sha256": "1fa9fd2478a866098a28a3586b55af2f9738656b7813a55d76539c10dd99fe8d" + }, + "vllm/config/ec_manager_config.py": { + "path": "/vllm/config/ec_manager_config.py", + "sha256": "418b387dbe7bdf67deddce331c205768a2d42aea37141f59fb02a8a1528e3552" + }, + "vllm/config/ec_transfer.py": { + "path": "/vllm/config/ec_transfer.py", + "sha256": "0eabb2c25194676d23c6acf59562672a1dd24415043ac5737d621ce0d681ec70" + }, + "vllm/config/engram.py": { + "path": "/vllm/config/engram.py", + "sha256": "34043a22385a041d4e9be8857f64174c990c2ca8308b97b6a952b5ab96c20ee5" + }, + "vllm/config/fault_tolerance.py": { + "path": "/vllm/config/fault_tolerance.py", + "sha256": "b166b24373d599fb15ddc575e3061cf0dcb42174d0369d8468008e7ffbb2a4e2" + }, + "vllm/config/kernel.py": { + "path": "/vllm/config/kernel.py", + "sha256": "27e23c584cf862f4091858db6dc85bbc2a01f4baf9dca3f232ae6f3bac02390e" + }, + "vllm/config/kv_events.py": { + "path": "/vllm/config/kv_events.py", + "sha256": "b1dbaee3e6830e381e9157fe3bab0d65c357da88ff7cdf8b1e4b3a4e75c82a87" + }, + "vllm/config/kv_transfer.py": { + "path": "/vllm/config/kv_transfer.py", + "sha256": "506fae7a9d7f32cb3646156cf9249a856f6317dff6c4c85db70efd34418c429b" + }, + "vllm/config/load.py": { + "path": "/vllm/config/load.py", + "sha256": "bd6431c22e078362d749a56a2c84145432ebf2605d8bcfa2ac679182d18ed630" + }, + "vllm/config/lora.py": { + "path": "/vllm/config/lora.py", + "sha256": "ed6cf6575f5950f079a62f904caeae93d1a4745dd8c21788b74367883bcd4b08" + }, + "vllm/config/mamba.py": { + "path": "/vllm/config/mamba.py", + "sha256": "2090f791201ca45dd4f1d72b8651268890eb07574b6084721194eb8fdf612c48" + }, + "vllm/config/model.py": { + "path": "/vllm/config/model.py", + "sha256": "f4168b67cc93ce72ff2a6d4c66974223e32fd0f1fab4c05e44bd68a275e18d69" + }, + "vllm/config/model_arch.py": { + "path": "/vllm/config/model_arch.py", + "sha256": "2babe28329d7b60b4e205f6d72c687f0f66e6535aa2f20411469e5ec362f6b5f" + }, + "vllm/config/multimodal.py": { + "path": "/vllm/config/multimodal.py", + "sha256": "271911aee151f17f092228cecee82af0713e9a47340ffdf66834ca7638a50d22" + }, + "vllm/config/observability.py": { + "path": "/vllm/config/observability.py", + "sha256": "d57c59ec776477ab0a20e9f2b945bc954d8ea3737c869259480e9aa10dfb9f6d" + }, + "vllm/config/offload.py": { + "path": "/vllm/config/offload.py", + "sha256": "6f2db3d9a2730588473d5155811690c6241b167a21dcb62fbbd9ebb6386de42c" + }, + "vllm/config/parallel.py": { + "path": "/vllm/config/parallel.py", + "sha256": "f012ace89e3fb730a467f729f602679bc145c49f0d10721811c9d818570e7b2b" + }, + "vllm/config/pooler.py": { + "path": "/vllm/config/pooler.py", + "sha256": "9f01913dcb7bccbf9b672b16643f18471ae202455992e8afaf0725a17f2b3d08" + }, + "vllm/config/profiler.py": { + "path": "/vllm/config/profiler.py", + "sha256": "04d24fa1dc7cfedca6b5c7d9115f7f7021722fc46a5b15234a1e3b3a506c93e5" + }, + "vllm/config/quantization.py": { + "path": "/vllm/config/quantization.py", + "sha256": "acffc52f525b39a88efd656f1ed705ce3a1b758298bb0684fac7694776bc10b4" + }, + "vllm/config/reasoning.py": { + "path": "/vllm/config/reasoning.py", + "sha256": "2c4f7bdee48a9fb3d93787c4c32361c2411417cce452cfde86808d8759977861" + }, + "vllm/config/scheduler.py": { + "path": "/vllm/config/scheduler.py", + "sha256": "822179da62be4bca0619c8590082ae09123f5c4415f9cc2037be673748239edb" + }, + "vllm/config/speculative.py": { + "path": "/vllm/config/speculative.py", + "sha256": "9c642a87264339c0dbc1d0b57330572149df0f9d5e16c6893b9895e50a619e19" + }, + "vllm/config/speech_to_text.py": { + "path": "/vllm/config/speech_to_text.py", + "sha256": "bf4a566fbde6a1cec1e209070b739650c3302c12696739c88049cb8f723a4c3f" + }, + "vllm/config/structured_outputs.py": { + "path": "/vllm/config/structured_outputs.py", + "sha256": "55649776594349b8b4aa3e08fc4c88068366732a486d6fb235079188044aa829" + }, + "vllm/config/utils.py": { + "path": "/vllm/config/utils.py", + "sha256": "d035e9e488ba92b6c47a96cf05d9b2a850d53eda8a05115b22ff9af8dbc2fc64" + }, + "vllm/config/vllm.py": { + "path": "/vllm/config/vllm.py", + "sha256": "956b812e5a719bcbfa3a3958801361b38b9c928c96b8c073311bbb96376dfb7a" + }, + "vllm/config/watermarking.py": { + "path": "/vllm/config/watermarking.py", + "sha256": "30e6620a3cd7529f0736ad55e38bc326a6a78dee4552f0722208400041c94a1f" + }, + "vllm/config/weight_transfer.py": { + "path": "/vllm/config/weight_transfer.py", + "sha256": "92edd9e5ea90c97a8f3c5f20abf1734a105ee1f3f89e306e7ba87e758f1f767e" + }, + "vllm/distributed/__init__.py": { + "path": "/vllm/distributed/__init__.py", + "sha256": "97f28c30b32662af8cab163939e4ee423037f11630752e13b55cbc25a7d0ab71" + }, + "vllm/distributed/communication_op.py": { + "path": "/vllm/distributed/communication_op.py", + "sha256": "3c3f8ac60db38ece891d39dc1e2f6f1947ad438685893d2e5777d072320bd1b8" + }, + "vllm/distributed/device_communicators/__init__.py": { + "path": "/vllm/distributed/device_communicators/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/device_communicators/aiter_custom_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/aiter_custom_all_reduce.py", + "sha256": "f8eb027ce7a85d94af6260960ceb7f36fc6f1406c9af9c9b6285fddb3f178009" + }, + "vllm/distributed/device_communicators/all2all.py": { + "path": "/vllm/distributed/device_communicators/all2all.py", + "sha256": "1f1b69236acd3cd7bd94520fd6d591bfd31b57c4bc7c9f9f4161ea8bbd0c5f26" + }, + "vllm/distributed/device_communicators/all_reduce_utils.py": { + "path": "/vllm/distributed/device_communicators/all_reduce_utils.py", + "sha256": "ed0ab4dd05b2519a6313892e68824c97b540034664d7f8c3d031b322e33e1bfc" + }, + "vllm/distributed/device_communicators/base_device_communicator.py": { + "path": "/vllm/distributed/device_communicators/base_device_communicator.py", + "sha256": "4a7670f12ed7c7621b25d476e2687c24ca01f3be183fff4a6a25337596fe506b" + }, + "vllm/distributed/device_communicators/cpu_communicator.py": { + "path": "/vllm/distributed/device_communicators/cpu_communicator.py", + "sha256": "e1856c8e91cfbbb4d9ce990c1236e258ba4021e226afcbab645653380b38d64b" + }, + "vllm/distributed/device_communicators/cuda_communicator.py": { + "path": "/vllm/distributed/device_communicators/cuda_communicator.py", + "sha256": "102d95c67ec798cf352b817ba92e8abc9da37f30d1bbdf3aab45d3927b627b93" + }, + "vllm/distributed/device_communicators/cuda_wrapper.py": { + "path": "/vllm/distributed/device_communicators/cuda_wrapper.py", + "sha256": "333b6d9ed173e7a18c7f2b6627a3c9c9ed88892ce52015f05e29d6d245e48ee3" + }, + "vllm/distributed/device_communicators/custom_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/custom_all_reduce.py", + "sha256": "a048c1327c23580805600c0c951831bec333b1ffc4eb26a0e3d34119c4f0c445" + }, + "vllm/distributed/device_communicators/flashinfer_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/flashinfer_all_reduce.py", + "sha256": "b4359760e9b55963676109a5c3a015fb82e190d4df1d021de9ee01e7814cbdda" + }, + "vllm/distributed/device_communicators/flashinfer_pcie_ipc_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/flashinfer_pcie_ipc_all_reduce.py", + "sha256": "8b67b0fc356a565095f56b475cc89c513e3a5eff051ab1c52e5beb0c1a79e9f2" + }, + "vllm/distributed/device_communicators/mnnvl_compat.py": { + "path": "/vllm/distributed/device_communicators/mnnvl_compat.py", + "sha256": "72ee1e6f9571b4c8ecbd9f60cd469d1b565cb79cab519a688a93f290906a2615" + }, + "vllm/distributed/device_communicators/pynccl.py": { + "path": "/vllm/distributed/device_communicators/pynccl.py", + "sha256": "882fb83c5a3c565a3f8fd664b79f5ceae566dca180019ecafd74bc8c11d9f8cf" + }, + "vllm/distributed/device_communicators/pynccl_allocator.py": { + "path": "/vllm/distributed/device_communicators/pynccl_allocator.py", + "sha256": "390e2576cbf4ae06341ca4dab24fc7e4d4f7c24dd444329ed05d828a9ce91460" + }, + "vllm/distributed/device_communicators/pynccl_wrapper.py": { + "path": "/vllm/distributed/device_communicators/pynccl_wrapper.py", + "sha256": "ce63c8da57bb88d4cf89956bd70bb63f0f44bfad468ddb37b765611551f6d99f" + }, + "vllm/distributed/device_communicators/quick_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/quick_all_reduce.py", + "sha256": "8aacb23e7c297b0ae2f80d99c5affd2e7517115d7874be51069d14a44db7b5f2" + }, + "vllm/distributed/device_communicators/ray_communicator.py": { + "path": "/vllm/distributed/device_communicators/ray_communicator.py", + "sha256": "332c37f65495b60564d61db59bc2d30ca0236adc33442d01464790bde9aec897" + }, + "vllm/distributed/device_communicators/shm_broadcast.py": { + "path": "/vllm/distributed/device_communicators/shm_broadcast.py", + "sha256": "f3e7a3f3ff713fccbd535e0d41650ee05bdf8677e83d4b90519910645022c30b" + }, + "vllm/distributed/device_communicators/shm_object_storage.py": { + "path": "/vllm/distributed/device_communicators/shm_object_storage.py", + "sha256": "e097bf7ac0141fe8db4131e8fd553ca2ad5b0600b22a56f3924af6b795e7207c" + }, + "vllm/distributed/device_communicators/symm_mem.py": { + "path": "/vllm/distributed/device_communicators/symm_mem.py", + "sha256": "b06e3ddb9ae880a30ec4a103ce32eb9794223bb0293832e89572af28adaaa544" + }, + "vllm/distributed/device_communicators/xpu_communicator.py": { + "path": "/vllm/distributed/device_communicators/xpu_communicator.py", + "sha256": "527cbfb250760abc62096ee7cd612307b821f21b72dee1687ad866620ec89b6d" + }, + "vllm/distributed/ec_transfer/__init__.py": { + "path": "/vllm/distributed/ec_transfer/__init__.py", + "sha256": "061405bb51df7409c9938b62e25caa8bd6ebf85da6d1700dbd4affe2a0825135" + }, + "vllm/distributed/ec_transfer/ec_connector/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/base.py", + "sha256": "22d4913375bb622473fbe1a77f9376b804949cd8a7e31e9518208f9561d161e2" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/common.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/common.py", + "sha256": "e2267abd8d00a6d2605e1a82ea5c73396a71b427452eab469fcca0134c334e7c" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/connector.py", + "sha256": "72cd35d9fd754a2992dd090a8af13c91e0789b4038ac29276750d823120235db" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/base.py", + "sha256": "19e8df88b0fa831997896355ecdd49e0d86cb074cd7ae28aed0b328b0bb3ab2e" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/zmq.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/zmq.py", + "sha256": "435641c0e37551ab4937855abd067be26905b91215e759cbd9d28a419a34ff9a" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/base.py", + "sha256": "3be698aeb67d32ee3741e76b2fb71806941c587578583acf8fbc42fbf22b46a5" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/nixl.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/nixl.py", + "sha256": "03af8f6549a6027b7262a482907af591e45f28b9b1c5a3408bbc6600e38797e5" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/ec_shared_region.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/ec_shared_region.py", + "sha256": "e40607952c9920024455eca2f419e8c3ef1de9a4d8b27c147a33bb941b8c08b1" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/protocol.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/protocol.py", + "sha256": "05878336884396bfbef77b96b0fa6359f6fa0aba912961f14a84f5a436f27038" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/__init__.py", + "sha256": "01c42385bf3a55cff09cc05ba956f6dd4b8b6b986bf4d6eca4e566cb045b48e0" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/embedding_cache.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/embedding_cache.py", + "sha256": "7359fb980af1fc30b3253681310ef636e2b4a19134e04a93270c9c45de2572d8" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/session.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/session.py", + "sha256": "5973548a919e13c866222b91d502686a6757a31e5a5664b879bf2887ed9fb212" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/utils.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/utils.py", + "sha256": "160ac665f20f2c75b343c1e784084f2b0b4d1cf8fdb28ee15deee4dc8ed0ce45" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/worker/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/worker/__init__.py", + "sha256": "f08d296d3560c42173ae8af961af4a768033ccf1e36e9c17c0cdd53013d0c52e" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/worker/descriptor_buffers.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/worker/descriptor_buffers.py", + "sha256": "be7c81be214e995da8499105ba485854d9c19d6f8e905f8f1b87b83694ca0864" + }, + "vllm/distributed/ec_transfer/ec_connector/example_connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/example_connector.py", + "sha256": "09022ce07a89114bb65d9befd2e60873453aed11bbac8c0a75c1e6084e785a5f" + }, + "vllm/distributed/ec_transfer/ec_connector/factory.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/factory.py", + "sha256": "d6cedca0a99c3dd2b03cd1c15d17472b983e3f7d8f5baf4a12eecaf6abedb817" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/__init__.py", + "sha256": "1cbfc2f95f8f4d48a9253056eb1fd4b562062884e3fd5cb6571583c352fc16f3" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/config.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/config.py", + "sha256": "98c60696f79d1de67d2364cd9e8a42a393b5c8e17ed9af2f971368e47891d7b3" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/control.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/control.py", + "sha256": "58e0d1a423fbe958bfa586ac26a17107e08d0b31d044b4c74ab4dde880e7ca9b" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/memory.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/memory.py", + "sha256": "d5e90b1348de670a70f110d58eedcbdbd053db72c21dd007c3f5275c53951149" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/metadata.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/metadata.py", + "sha256": "497a7e6dfffb7fce80a41d5989f96119b970c143df77bb9d0f9c91d7a46e8c42" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/producer.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/producer.py", + "sha256": "97fa4d0b19475574778eab02f55fad73db9642beb9156da890314fd53fa1a7ab" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/reservation.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/reservation.py", + "sha256": "4790bc65cde4db5f17733ca2c2910980ba594a8a9b79ee27c5b957dffd4c1113" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/scheduler.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/scheduler.py", + "sha256": "53004b62529a31fdd80dfb2e6026610b95041a77e91f731ae526fefd84e7968d" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/state.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/state.py", + "sha256": "92f375d6c5cc9c83dbe95a7977ad8eb0f1b5629ccee92968bcacdc94eee15d65" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/transfer.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/transfer.py", + "sha256": "ada2113a5402054f1149d3edc2537f4e5e1bd696c9b17291c9f2b4cbf6b59753" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/worker.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/worker.py", + "sha256": "89eb91bb64845b3b121d502972a6b04d448714253becd2ea662e5691cd5acdd7" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake_ec_connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake_ec_connector.py", + "sha256": "aaebab4711bc00dd0c622dfbfd8639fc41e7ed5d1658d7d68fe33e4d5fbef3ba" + }, + "vllm/distributed/ec_transfer/ec_connector/utils.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/utils.py", + "sha256": "11b9014b9c0697f8846deff1a55a22fa86a15dc2ac3e139442fb6d513ac03059" + }, + "vllm/distributed/ec_transfer/ec_transfer_state.py": { + "path": "/vllm/distributed/ec_transfer/ec_transfer_state.py", + "sha256": "9487a41f23fa1a4fa6dfca8b42b8e97a0ee19d8406ffd1dcf4bef66315180827" + }, + "vllm/distributed/elastic_ep/__init__.py": { + "path": "/vllm/distributed/elastic_ep/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/elastic_ep/elastic_execute.py": { + "path": "/vllm/distributed/elastic_ep/elastic_execute.py", + "sha256": "b8f60a4183c79ff6051095b5f95bb385bc7fea0cffe8cd9ebc9087ab0e9f01b5" + }, + "vllm/distributed/elastic_ep/elastic_state.py": { + "path": "/vllm/distributed/elastic_ep/elastic_state.py", + "sha256": "fbf049199841a086fdf2fc1ab8498ef017ad3bf319db65c3ae61acbb536d2e10" + }, + "vllm/distributed/elastic_ep/standby_state.py": { + "path": "/vllm/distributed/elastic_ep/standby_state.py", + "sha256": "15282597550ebd0e07b8492ff192aea1ec0dcec8f0ad34009123e1002cc140c1" + }, + "vllm/distributed/eplb/__init__.py": { + "path": "/vllm/distributed/eplb/__init__.py", + "sha256": "1b9c2ee22abb5888c354c5aa01f0944f253e5e24e135d019778398bbe495a628" + }, + "vllm/distributed/eplb/async_worker.py": { + "path": "/vllm/distributed/eplb/async_worker.py", + "sha256": "424328600ad1003286fc5dfffa1f9482007314c060947818b2f94a8b97811f5e" + }, + "vllm/distributed/eplb/eplb_communicator.py": { + "path": "/vllm/distributed/eplb/eplb_communicator.py", + "sha256": "ba30d9d40e7b81d3f42aa9041d2f328edca4073cfe2de920285eb68375501ed8" + }, + "vllm/distributed/eplb/eplb_state.py": { + "path": "/vllm/distributed/eplb/eplb_state.py", + "sha256": "2f06bc8c63f3fdf55edb5032ae55c0ffcac3e67720ce74ea312e3d141b12acf4" + }, + "vllm/distributed/eplb/eplb_utils.py": { + "path": "/vllm/distributed/eplb/eplb_utils.py", + "sha256": "058af6104faa6d4085c1dca80bbe60d92bf0a7ec9cd92c775a180546c9d8c9c3" + }, + "vllm/distributed/eplb/policy/__init__.py": { + "path": "/vllm/distributed/eplb/policy/__init__.py", + "sha256": "daeb266c88442832b1ab8c8c4cc064891b38b9e9ba00aea324f926c87dc6d37e" + }, + "vllm/distributed/eplb/policy/abstract.py": { + "path": "/vllm/distributed/eplb/policy/abstract.py", + "sha256": "b9fd34c28bbfdded03360d7f3f6f8fb978e82689190d7ae4501dfe520e958c62" + }, + "vllm/distributed/eplb/policy/default.py": { + "path": "/vllm/distributed/eplb/policy/default.py", + "sha256": "3b54229e6240d050480390f6b29d4744fd38437d23719f78a6decf7002296a29" + }, + "vllm/distributed/eplb/rebalance_execute.py": { + "path": "/vllm/distributed/eplb/rebalance_execute.py", + "sha256": "b387e228791149018536eee96cf955b33ba79d801cdc36849d1b47a580ec2597" + }, + "vllm/distributed/kv_events.py": { + "path": "/vllm/distributed/kv_events.py", + "sha256": "de08f01e8736881560256c350a3b6418999dd4aa30f9c6ec9159527f7ed6899a" + }, + "vllm/distributed/kv_transfer/__init__.py": { + "path": "/vllm/distributed/kv_transfer/__init__.py", + "sha256": "c1be4e58ec6923bae607a355ad22891c740f056a69ff7358b1e10ea3fd2680ea" + }, + "vllm/distributed/kv_transfer/kv_connector/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/base.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/base.py", + "sha256": "2ae2a2c48f5731f3533166a75440fe91e764332305b5d713df840edba970789d" + }, + "vllm/distributed/kv_transfer/kv_connector/factory.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/factory.py", + "sha256": "add99c93c587b0098b90b1f8fd6940bdd1f15c236c5c6f1a258411863cb902d3" + }, + "vllm/distributed/kv_transfer/kv_connector/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/utils.py", + "sha256": "317ed40dc837671ca6e666165222e641a0f9b3992aea63bbf54de7e13d40b3a4" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/__init__.py", + "sha256": "5beb6ccad12fdcfe1581982da6f18321caca50e73a6b3259ebf3c8dc8b3ffcca" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/base.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/base.py", + "sha256": "97af64220475c6c9e8273438d7b5138b105ebe6944beb783facb36a3bb76f31b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/decode_bench_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/decode_bench_connector.py", + "sha256": "b4151c88cdec28f1ff9259047abc17baf23b892f4b68769a93bf26e0442b9017" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/example_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/example_connector.py", + "sha256": "6226876ef52d10d0d284d29c337ab44698e8bac6abdb2e0ece53b5756c55d068" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/example_hidden_states_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/example_hidden_states_connector.py", + "sha256": "58c22534dcad0fb73599a2d70a2fb104d5b612a4723be5e777f56a56fe07892c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/flexkv_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/flexkv_connector.py", + "sha256": "de4f68c3bd565ed898e47e0b2980049b966ff31888f1957050d30995d4953762" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_client.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_client.py", + "sha256": "bea6ecff2be281c7e96c1551c7bf463cbb01f2964696067c0ebdb683844f9aab" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_connector.py", + "sha256": "e67ed58015090e5eea9d499883f2a9422673d07f8bdbe0ccff7db15d2460de13" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_metadata_server.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_metadata_server.py", + "sha256": "6800e5cf37809f8a8e28c469c14a434db288bc3bf83a8b62ee06910a20c2da19" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/common.py", + "sha256": "8f2c02c08227a9093e6aeb183961aba36b7812cfc29b8c047a2b2c9d82f79c15" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/gather_scatter_helper.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/gather_scatter_helper.py", + "sha256": "08c1b43de34fbeca77357d7576ac1d17cba974b59d695562f68bb713061e7b54" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/hf3fs_mock_client.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/hf3fs_mock_client.py", + "sha256": "bec61a9b0c4b9124b2292d7646d76411da44396389349b53cdcbc46353c8780e" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/connector.py", + "sha256": "8c61094ce0a3a702908f9576f69482e6bf314738a2cbe33a7d3b47258fa0ab43" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/stats.py", + "sha256": "d9383a6ad6ab6b8f812d29d90495407b770eeddb79b86e9d0e3216c0bd16e0ed" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/worker.py", + "sha256": "251c0d8e57e4739c03ce3e1c899a95ff5b1752eb27676c28ab88c4ebd62c4776" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_connector.py", + "sha256": "5991f9ff8832df32bd421eb67e48237270ea0a408180e523810bb43606acf8f3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/__init__.py", + "sha256": "c53be9796e76cde637514bfc40a525d8c09bb2784b406cb516790d8285dfe433" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/multi_process_adapter.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/multi_process_adapter.py", + "sha256": "6480d67b31ed603027a83edf327880a38aee45eaeee2da9a4efa93e95527c166" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/utils.py", + "sha256": "e204fa6a853ac9c122d7a4e9d146902230f81c48d4321ed5edfdbf979dd49ba2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/vllm_v1_adapter.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/vllm_v1_adapter.py", + "sha256": "e6fe55049c6b007248516d69640e2f3a4809f9d286091a1014ae0949987fa8f1" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py", + "sha256": "c712c386a7c57bf0355a1441ba574232c3aa5498fcb70713a2b3f5d18b64f9c1" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/metrics.py", + "sha256": "de1b1797d0448f74370919dbb0278767f390e8f59e00a0c0528abefb302babc2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_connector.py", + "sha256": "516be01320e64b0110e102eeb69a6ba766dd5ac8cb3036db6b97b7d54413323d" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_utils.py", + "sha256": "26877610463fa8e9d6b092772f2551bcc0c3ac794cbe63996df0414666a8ebba" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/rdma_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/rdma_utils.py", + "sha256": "716e5042edecaba36c7ca763474988f32fa09c2668b8260260149df610af8f83" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/stats.py", + "sha256": "f39b2f0b1db2e4f922e27e684a3f7bbf5bb279b82a0a8c3bb0c7ae69b6d14d24" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/connector.py", + "sha256": "17a350bdb89e17e415d6c52a48684dc15c35a804378daf03e1f3bee1b1b123a3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/coordinator.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/coordinator.py", + "sha256": "a8eb6c2157a96e8d25233b82347ac8409a41d6390b4f2c64242119c05911010c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/data.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/data.py", + "sha256": "d3cfefdb4165a24995749cba452641b318065baa95bb1bae62f922a2f8886e7b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/metrics.py", + "sha256": "f2b9ef8927632d142aad11a374d0725c6e619ea0bb7fea9eda3f3895eb7d277a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/protocol.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/protocol.py", + "sha256": "ccb1cf6a84a932a375215627d2aaac482c351a05df015d636d05373a6845b7c8" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/scheduler.py", + "sha256": "283849ff581ec206444cdf5621622377f1c925e8d7e05cb9294af2f3a5094e79" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/worker.py", + "sha256": "55f1682dfd1ed7af689166421337126a0e1d08afa4774a242e098d79e0c1e95b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_common.py", + "sha256": "549bb4fe22dca5095515b9c0712c31cc81a9d4923881e9f112317640fd8c04ab" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_connector.py", + "sha256": "c0f474bc34b579d889fae92eaf43eaca241be51a4697a187a942f0df4e6b6a98" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_engine.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_engine.py", + "sha256": "d842f3772fc6588d5a329a67572324cb74709aa3df4033e64c791a1e706c8e88" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_layout.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_layout.py", + "sha256": "2b4ec046a78897236b0626939bb828b6ec095355097d10bca39e5f3e1c992553" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/multi_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/multi_connector.py", + "sha256": "12d8387239f3194f2cb63ccbd64824648047210323572d66671e6a1eed349fc3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/__init__.py", + "sha256": "cc3145fe3b6d219a267bf40a0f7c0cc9430e4289f94acab2df761b99b671e7ba" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py", + "sha256": "7a1db8c54e4cd846bdac747344f2aea2c2fcf507817928796063225223b7e169" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_worker.py", + "sha256": "49a2e4faf99bef146b5a1d4d18d48f240b1e561c438252274494b359db96ef52" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/connector.py", + "sha256": "b6a0dc916d052f344be72ecfcb111509c13580102c11a860fa726cf0888949a9" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/metadata.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/metadata.py", + "sha256": "2b23a07c1ec5ac5490c3b818737c7192e344ea9f52cd5623f75939f741ab4e21" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_scheduler.py", + "sha256": "ac3daf8e2246581fec84ab28f2133569421b62c32a120be4923e2f4d0f2f9de9" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_worker.py", + "sha256": "e5060c9b6cf022de35ca3d1da7a369cd6a6a2dea26219af9f7633aaf78af8a76" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_scheduler.py", + "sha256": "2d9008e33937a4d6c5cf9cc2f96160f2bdbc8e987fe37f0798a7fd7eb84c9572" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_worker.py", + "sha256": "87de3ea383dd3aa95fb2c287ea26ded8a330859cc1295f9faa69047e80865c2c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/scheduler.py", + "sha256": "09f1bfe7075b926b26a94529480e33b62c3ac273ff826f6c502084f08b1b2a08" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/stats.py", + "sha256": "3e710654e0b68d1a8592f0c4735c81b22f4bf698fb1a2dfea126d35bf2dd1ef2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/tp_mapping.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/tp_mapping.py", + "sha256": "2d43607f98701b2fad6cc0ac2767619a80b7fc2b3a3c2eb6ed0da4fb05dcd8f6" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/utils.py", + "sha256": "93de863fc8307a61d40b62f1b176b57ae93c363d34b9e9ddc8e666265b6d45dc" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/worker.py", + "sha256": "5134a36ac100ce7a64f5311029a37ac12c38d91093f63100f51f7fe53ea7c3ee" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/canonical_mapping.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/canonical_mapping.py", + "sha256": "e0b3c6f9806a650e0370c43c5068fc31c0fec94615089e15fdf270d7d96f2b64" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/common.py", + "sha256": "9b3f042c6fa1581d10e8f688d2d9bc927bb41b780a9ea01f514d57228e20c978" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/config.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/config.py", + "sha256": "aea82e60889e78dcad8564ec8285b65a6a372824a1545a98ea8e78b6f4fd418a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/events.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/events.py", + "sha256": "d7039b67be95fd444966628184040a94880873c0611c0e6e7525a22650ffdefb" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/metrics.py", + "sha256": "13d76df014e86691f58dc89a879f9808b124690c9267dd5fa3b2d4004d4c5fdf" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py", + "sha256": "2c5282f4a3165cd787fb355e215e3869f1bdd3f2c795b2155fc537c9d135191a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/worker.py", + "sha256": "acc2df53262441dfc6421a3af7f0cbd68cbfaedbd42bbc384d8e1da2d965d194" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading_connector.py", + "sha256": "cdc16ca7339a10e1993bd6220e6273f86a4e99779f58f25098a24ad31bb0dbd8" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/simple_cpu_offload_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/simple_cpu_offload_connector.py", + "sha256": "96238ca82ccf07a1eeb59b8f66de17b09034e3eb993ad9a0a836511d3f69706b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/ssm_conv_transfer_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/ssm_conv_transfer_utils.py", + "sha256": "59a949709482e65a007fbe5352fe9b4bb54c2dcc10ad2c1c41f754b6e13299f4" + }, + "vllm/distributed/kv_transfer/kv_transfer_state.py": { + "path": "/vllm/distributed/kv_transfer/kv_transfer_state.py", + "sha256": "2e5fe09438d6e2ee642f8a26cf7dcf632e870d955d30baf002b76a8bfe836d05" + }, + "vllm/distributed/nixl_utils.py": { + "path": "/vllm/distributed/nixl_utils.py", + "sha256": "0bffa3c052c9f67472b1c0bc3816114891b010c968bf4b8a292e7da4d687db53" + }, + "vllm/distributed/parallel_state.py": { + "path": "/vllm/distributed/parallel_state.py", + "sha256": "d9b10ad56833ebc08a753e1a050ef0989c30d4134021b7b7b00150b7bd01adc6" + }, + "vllm/distributed/stateless_coordinator.py": { + "path": "/vllm/distributed/stateless_coordinator.py", + "sha256": "f52848fbe985ed47b1f3e3ca555314736ca06436e8d738ab4390101f0672dcb0" + }, + "vllm/distributed/utils.py": { + "path": "/vllm/distributed/utils.py", + "sha256": "792146b357139e705064a68d3b66858de8a0baaca4dc7db1232fa217d45db231" + }, + "vllm/distributed/weight_transfer/__init__.py": { + "path": "/vllm/distributed/weight_transfer/__init__.py", + "sha256": "3fb9d4712b7c131d522f5e76e73cd8c333f3cc7af86e2d5ecf9b61b57b3b7f5a" + }, + "vllm/distributed/weight_transfer/base.py": { + "path": "/vllm/distributed/weight_transfer/base.py", + "sha256": "8ab06feb04f1379d0558fbdb77fde46bc84f179e0a26742cabab937e88caa38d" + }, + "vllm/distributed/weight_transfer/clients.py": { + "path": "/vllm/distributed/weight_transfer/clients.py", + "sha256": "ff85c79c350241e6d2749ca23c9d295a3289b4b62bfdf0257d32eb94a0151d36" + }, + "vllm/distributed/weight_transfer/factory.py": { + "path": "/vllm/distributed/weight_transfer/factory.py", + "sha256": "4e979eeac8c5bcdbffb10eb4765cfb30120fa7595c6c2561d3fa1a966ced61c8" + }, + "vllm/distributed/weight_transfer/ipc_engine.py": { + "path": "/vllm/distributed/weight_transfer/ipc_engine.py", + "sha256": "1af578293f387a19073c322b24143c3ae4716ce0c5d2bac2a4ef26fe20119330" + }, + "vllm/distributed/weight_transfer/nccl_common.py": { + "path": "/vllm/distributed/weight_transfer/nccl_common.py", + "sha256": "7b2ef7dc7481c3f478f17c49aa36c7bed54142ec5c93d36ed8426c8fdf09e500" + }, + "vllm/distributed/weight_transfer/nccl_engine.py": { + "path": "/vllm/distributed/weight_transfer/nccl_engine.py", + "sha256": "7fd020c919dc7b4723fb78e64da977b180d0fef0cd21df955a037b848dbaa008" + }, + "vllm/distributed/weight_transfer/packed_tensor.py": { + "path": "/vllm/distributed/weight_transfer/packed_tensor.py", + "sha256": "d0a27fb0be1dc029bd5a1d44fdb57a5e54aa4cd74308bedc339e86ac02c7494c" + }, + "vllm/distributed/weight_transfer/sharded_rdt_common.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_common.py", + "sha256": "be0b13801f24e7b62999b19d733c030510353603a2d5320d5dc98ee02daf22a2" + }, + "vllm/distributed/weight_transfer/sharded_rdt_engine.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_engine.py", + "sha256": "2f791970b4815511a7578ef6c957e7da97b071d26a39087a09a17475909791ee" + }, + "vllm/distributed/weight_transfer/sharded_rdt_fake.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_fake.py", + "sha256": "ee11164e17b5f2793252ce77741b8b94e0583046abf896a590131b2008d1fbb9" + }, + "vllm/distributed/weight_transfer/sharded_rdt_trainer.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_trainer.py", + "sha256": "dd413ff461d41826ccd3eb87d3df22f6cd7f24e09aac7644e3e5b40d7beec484" + }, + "vllm/distributed/weight_transfer/sparse_nccl_engine.py": { + "path": "/vllm/distributed/weight_transfer/sparse_nccl_engine.py", + "sha256": "e11b409454dda2b05ea34e8115ac19027c5e65cb2a5e9682c494f16a50e978f4" + }, + "vllm/model_executor/determinism/__init__.py": { + "path": "/vllm/model_executor/determinism/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/determinism/batch_invariant.py": { + "path": "/vllm/model_executor/determinism/batch_invariant.py", + "sha256": "af8f8d256a48fc214edf426fbe891fb15bd8b1d7ae98b811c736ff1eb0fae798" + }, + "vllm/model_executor/determinism/batch_invariant_configs.py": { + "path": "/vllm/model_executor/determinism/batch_invariant_configs.py", + "sha256": "72ea0d4df0ab5ae288abb7df5c203d2ad5f1709c7295d87ec72da775fddc1b7a" + }, + "vllm/model_executor/layers/fused_moe/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/__init__.py", + "sha256": "64a32665be6d5afcfbaf7a0915717267278b66b880b908b0263ea58f08e51b5e" + }, + "vllm/model_executor/layers/fused_moe/activation.py": { + "path": "/vllm/model_executor/layers/fused_moe/activation.py", + "sha256": "78dec0e85e0c040304515f64ccf8f2c6a7a2e5b9f1124a2138a97d9a02585541" + }, + "vllm/model_executor/layers/fused_moe/all2all_utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/all2all_utils.py", + "sha256": "dc4750a446f7de31d09a46034da5fdf479bc169af90f47aa9af8ae15e67b0828" + }, + "vllm/model_executor/layers/fused_moe/b12x.py": { + "path": "/vllm/model_executor/layers/fused_moe/b12x.py", + "sha256": "ee76cc6aa801e24be8ec78a9e8502061ad48667d5ff8711e43f68fba912425bd" + }, + "vllm/model_executor/layers/fused_moe/config.py": { + "path": "/vllm/model_executor/layers/fused_moe/config.py", + "sha256": "a3a87cebcc7ac85d73f471dcfafc2d899c6fc08f264777b74a0e919adac9e03f" + }, + "vllm/model_executor/layers/fused_moe/deep_gemm_utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/deep_gemm_utils.py", + "sha256": "8fdcd857eb333f9c68902105f157568d52067c94ba1e2df6dbfe0474ef1f4c02" + }, + "vllm/model_executor/layers/fused_moe/eep_reconfigure.py": { + "path": "/vllm/model_executor/layers/fused_moe/eep_reconfigure.py", + "sha256": "9d7580265e8563e1140c2bb4c3a81a35ddd54903f5ec0a2720ffc064681f02f9" + }, + "vllm/model_executor/layers/fused_moe/expert_map_manager.py": { + "path": "/vllm/model_executor/layers/fused_moe/expert_map_manager.py", + "sha256": "308c00f63fcb6f44518ec3a56d8f902c7bba75928c2e3aea30fbe1f3f473973b" + }, + "vllm/model_executor/layers/fused_moe/experts/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a16_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a16_moe.py", + "sha256": "53deea255175171971422d14082ad139b5ec7b62e21429a4c7cc0ebbefd29cdc" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a8_moe.py", + "sha256": "f3fc51b95ed89862381908a0134e326228827f44854248db9585a9c4899c34f4" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp8_moe.py", + "sha256": "af6db1760961a5a71234f8b1cdf42e9e30a236e13601b0826a75110b79724948" + }, + "vllm/model_executor/layers/fused_moe/experts/batched_deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/batched_deep_gemm_moe.py", + "sha256": "b0cd4ea706583518dc608fb56f832fc3595f24bd863b03ef1e8c22b36b873508" + }, + "vllm/model_executor/layers/fused_moe/experts/cpu_int4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cpu_int4_moe.py", + "sha256": "67170af3ba9dc4c4f71d78a72efc3fa4e366eac614936a79911dae5c75ac1864" + }, + "vllm/model_executor/layers/fused_moe/experts/cpu_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cpu_moe.py", + "sha256": "0754cd4ff1b28e6d3932a67609d335acefd28f95a841f0492923813356a6d81e" + }, + "vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py", + "sha256": "db901bdbcd3fdac23a1d74e39c51e67f14a82be787b2fd704ed1e787372ae868" + }, + "vllm/model_executor/layers/fused_moe/experts/deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/deep_gemm_moe.py", + "sha256": "16911a64a72eafc26a1bcb544a91f90144d85dc41e3ee57cf20e89925227bbb7" + }, + "vllm/model_executor/layers/fused_moe/experts/fallback.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fallback.py", + "sha256": "1bdd0a4f2ebaa40ec96a5aacc07aee61511af59e6324ce456aa65003b6e2991a" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_b12x_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_b12x_moe.py", + "sha256": "e613afe5da2742e42c717c1a0a56bd9e1c7e3e0452a828db0013d81063518954" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_batched_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_batched_moe.py", + "sha256": "295254dfeeec8df3eb8110e6f659a946cb9cded3de1565ecad4d741b3c3f3e00" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_moe.py", + "sha256": "08578bcd0cf72d6a470e40950175e73639efaa6d8d23c6da0869345312b229c9" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutlass_moe.py", + "sha256": "52887cec5fe628e0a4e7793deb546b40f6c29f7362b3b436c10ca36934ab9826" + }, + "vllm/model_executor/layers/fused_moe/experts/fused_batched_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fused_batched_moe.py", + "sha256": "2435587fc7f8fe8ea341ea0eb8f14c11f3f5b31fbbb9b29ce569ad3bace6e6a0" + }, + "vllm/model_executor/layers/fused_moe/experts/fused_humming_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fused_humming_moe.py", + "sha256": "a6830a76ff7f4cd3479b9c8372a30d03e8301604555cbdbcd9ac89a813b7431a" + }, + "vllm/model_executor/layers/fused_moe/experts/gpt_oss_triton_kernels_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/gpt_oss_triton_kernels_moe.py", + "sha256": "1613a7a6b256e8faee6fdcfae84f293492db6229d28ceb3e8a8d6093af480e36" + }, + "vllm/model_executor/layers/fused_moe/experts/int4_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/int4_emulation_moe.py", + "sha256": "f12857caf0671a341687ad3c5f48616b816ed51e1bcbdefa0a7edbecdb81a79d" + }, + "vllm/model_executor/layers/fused_moe/experts/lora_context.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/lora_context.py", + "sha256": "9b41eefaaa57c5dd0dc54217ef95978821b0c52e90ea4db8b0752e08452bd3e5" + }, + "vllm/model_executor/layers/fused_moe/experts/lora_experts_mixin.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/lora_experts_mixin.py", + "sha256": "b2bc55ed6be98b526c6a5698e2d98300650e78555f56b1820e58c04888e2a373" + }, + "vllm/model_executor/layers/fused_moe/experts/marlin_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/marlin_moe.py", + "sha256": "93916b721548e6194dc70cf6cec224b4b1456a0cc0980235e97beba7bf36541d" + }, + "vllm/model_executor/layers/fused_moe/experts/mxfp8_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/mxfp8_emulation_moe.py", + "sha256": "d09c62ad1398c51ff6f515f2a61014ee9e9a9798d0fe9762c47f446efc5edbef" + }, + "vllm/model_executor/layers/fused_moe/experts/mxfp8_native_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/mxfp8_native_moe.py", + "sha256": "01a42cebf18189e566034111b2145573c655319e8af1a56db60d53a319c40613" + }, + "vllm/model_executor/layers/fused_moe/experts/nvfp4_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/nvfp4_emulation_moe.py", + "sha256": "f24467762b60702f0df122ed64786be839a838a9b6cafaecbd04d35fbfedb189" + }, + "vllm/model_executor/layers/fused_moe/experts/ocp_mx_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/ocp_mx_emulation_moe.py", + "sha256": "dcaa60a9ebdb0bd8223b37af41f018ce7f95716ec7cd8526850f4433a579213b" + }, + "vllm/model_executor/layers/fused_moe/experts/rdna3_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/rdna3_moe.py", + "sha256": "e4abd802dc2f0ad9b338ebde397633c761d881c37813e2dc229902c526b597d8" + }, + "vllm/model_executor/layers/fused_moe/experts/rocm_aiter_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/rocm_aiter_moe.py", + "sha256": "bf09a7b783f5752d61cab76221b32b598d8846d801ee39dc9209d636c9659c6f" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_cutlass_moe.py", + "sha256": "ffce5ad627c540940d122d8df7981644b2eb35d07d480995c0f4f30517815fac" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_deep_gemm_moe.py", + "sha256": "c7209fa5e1ccb184a68b37a0706fc571a76696c2ae79802ddc7f889b1c29684d" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_moe.py", + "sha256": "806fbccfe30f5fbd578acf773add99bdf022b12d617958bd6281aef6de369701" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_bf16_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_bf16_moe.py", + "sha256": "76256de96fefece9c41ffb1108487919e24da364cf4412c6c3474498aba59137" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.py", + "sha256": "b54c7ceb45e5d07aa905f42ea44caccf85ca35ba9fb825d4c01947764510f68b" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_lora_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_lora_moe.py", + "sha256": "dd35a9e4242c0dc8d691168813e14bd5543e591f02ee529d0691e07651942c5a" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_mxfp4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_mxfp4_moe.py", + "sha256": "fe780f125a3dc3ba919659e9b85340bd32afcbfe47733a002bfdfb92eadf400c" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_mxint4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_mxint4_moe.py", + "sha256": "2106d67c2951aa690c4656ca58240d09c366cffe8cb4d9fd575df016c377cc30" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_nvfp4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_nvfp4_moe.py", + "sha256": "e938ac9f058f7c90b41c9610513239bec54a95304bfb5ff5f6897ebd54733d7e" + }, + "vllm/model_executor/layers/fused_moe/experts/xpu_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/xpu_moe.py", + "sha256": "2a11bac0cf9274d963315efd6eebdc62978b0b7aa02e8849ff2a562742f0b86d" + }, + "vllm/model_executor/layers/fused_moe/fused_flydsl_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_flydsl_moe.py", + "sha256": "0e74879ee5c72f616ae4064b9dff3b3a0b583b7fc70b8f92f1e8b730ecd5d39b" + }, + "vllm/model_executor/layers/fused_moe/fused_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe.py", + "sha256": "7072eb06237be9d33dcb0ef7101410f886a6363c98cbee70a014c68b70f639cb" + }, + "vllm/model_executor/layers/fused_moe/fused_moe_method_base.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe_method_base.py", + "sha256": "18dcfc469d3252749801bbf943857f58da85de1f2db8fdff5a9f4986a925dc68" + }, + "vllm/model_executor/layers/fused_moe/fused_moe_modular_method.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe_modular_method.py", + "sha256": "321c744eac1fcaffd6b1b2971204c8baa57dfec53e91e5d24140014d72d64f83" + }, + "vllm/model_executor/layers/fused_moe/hpc_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/hpc_moe.py", + "sha256": "2ca9c5d71b6fd91651027905e2b83103a8823845e053e7153e148cb8e0ee666d" + }, + "vllm/model_executor/layers/fused_moe/layer.py": { + "path": "/vllm/model_executor/layers/fused_moe/layer.py", + "sha256": "def0b4e13bcc1e4e21ee10644e647e2eda1acbf0cc01e76d6128abb59ea08224" + }, + "vllm/model_executor/layers/fused_moe/modular_kernel.py": { + "path": "/vllm/model_executor/layers/fused_moe/modular_kernel.py", + "sha256": "8dc4e0dbbf35b3aac8add63ca6f2a7bbfdadaabbd60826e24598b22c7d8e5c22" + }, + "vllm/model_executor/layers/fused_moe/moe_align_block_size.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_align_block_size.py", + "sha256": "c3f7fc2087836f0160a32ab99ceb1d8f6e87c793679da34dd672e225cb7fa31b" + }, + "vllm/model_executor/layers/fused_moe/moe_fused_mul_sum.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_fused_mul_sum.py", + "sha256": "112e72578002c3bff538418dac64b3b56d995994a2fc5e32b18d2cf3b8392a13" + }, + "vllm/model_executor/layers/fused_moe/moe_output.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_output.py", + "sha256": "6ea4cbd78f9efc7f842c5df246f553f08b991c3479b8b04b89902ed08aaf8e8f" + }, + "vllm/model_executor/layers/fused_moe/moe_permute_unpermute.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_permute_unpermute.py", + "sha256": "1adc592c6254d0c877d66be5406afbc822459c18a838f4bbd094a992e7609d06" + }, + "vllm/model_executor/layers/fused_moe/oracle/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/__init__.py", + "sha256": "4dcf941d50d48bb812de0f39e9194bf17a76b8035fe324889c6038f710fdc453" + }, + "vllm/model_executor/layers/fused_moe/oracle/base.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/base.py", + "sha256": "555bbcd18a3744e64eee4e953daabef3bd268a1bd4faf967d4cfd14d6074f685" + }, + "vllm/model_executor/layers/fused_moe/oracle/fp8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/fp8.py", + "sha256": "245bd36c285df1e6f7c51e52dcda31ad247894577a9f8d765613c2c2feae9aee" + }, + "vllm/model_executor/layers/fused_moe/oracle/int8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/int8.py", + "sha256": "c1b67886511bd966b162db5bca8930f04895fb37a969818a4a10f0726c59547f" + }, + "vllm/model_executor/layers/fused_moe/oracle/int_wna16.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/int_wna16.py", + "sha256": "cfffe8b8b290330be9d18ffa07aeecf296484395ff04df3147d99393e48b55c1" + }, + "vllm/model_executor/layers/fused_moe/oracle/mxfp4.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/mxfp4.py", + "sha256": "b7915e6779b5c88e7dcd2d227f003a8e45071d6d86877013067142d4feb64a8c" + }, + "vllm/model_executor/layers/fused_moe/oracle/mxfp8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/mxfp8.py", + "sha256": "9cfdc8102a04bb844dcd7ed88043bba96ec751794bc093da76c69aa8cf88cf48" + }, + "vllm/model_executor/layers/fused_moe/oracle/nvfp4.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/nvfp4.py", + "sha256": "735b4cdeb1258f11fb02320fc0c70cab5edaca468dd60b07b2d369389d2b0313" + }, + "vllm/model_executor/layers/fused_moe/oracle/unquantized.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/unquantized.py", + "sha256": "c8b8203bd0b73bb7f586f703607394d663f14c05711416ad42d45af564382223" + }, + "vllm/model_executor/layers/fused_moe/oracle/w4a8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/w4a8.py", + "sha256": "d7fa6e2982f20b34d5ce9c5ce28a61122762a3fcdd53d249479472a4f2316c6a" + }, + "vllm/model_executor/layers/fused_moe/oracle/w4a8_int8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/w4a8_int8.py", + "sha256": "6d6f9ca2e67b630002873de2f8d8a231d091c5c2f0f3354a9e8209449b481a4c" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/__init__.py", + "sha256": "2800113263a83c2632e522fb22790b29f63384da75d43de32f0ae2f95e8ae4c1" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/batched.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/batched.py", + "sha256": "d52425dd8c08e47cf8d9c3088daf3b1cc721c8667de4c738d04ba997f9a08ccb" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ht.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ht.py", + "sha256": "465cdf1d6cee91b2ee8c2e43abbea6e8408976e3048c10f44c089f34b415bc60" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ll.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ll.py", + "sha256": "f704922b1db680c4c212982a096e09d6b3eb97d89110313f86ed958a00df21b7" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_v2.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_v2.py", + "sha256": "8d690b016bbcfbc9eb599bcc36a6f798b2f1720c828f4347ea742e218c0cc60d" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_one_sided.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_one_sided.py", + "sha256": "acb57d8342af62bb5672036871cd4b27ecc7f37dfa7c894850bb860e6152a1f0" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_two_sided.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_two_sided.py", + "sha256": "cc5b00d6a157b6eca5afaaf7435165dbd1b4524d6d88bf75808cbe074a389f79" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/mori.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/mori.py", + "sha256": "8e9c3b5b1f0de13f467d95bf2f451cba0e4b0d9a1bdcf98da0988a3a9a79a045" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/naive_dp_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/naive_dp_ep.py", + "sha256": "db015e5b18750bbbf5b2bbaceca877dd6f3f3e74c2a94e8dc185f7413b387f91" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/nixl_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/nixl_ep.py", + "sha256": "1f71d70ac509bf5d3d67a8d95a8ee108a50af6bb5d4bde7181ca28e286f6ffce" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/no_dp_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/no_dp_ep.py", + "sha256": "adbbf529cd22059c95b5380952943a70cf11e05e321dcd707f296bebde61a6e7" + }, + "vllm/model_executor/layers/fused_moe/routed_experts.py": { + "path": "/vllm/model_executor/layers/fused_moe/routed_experts.py", + "sha256": "68c48e5df0ea4a7cc1f04436b7b9153eb53802ecd9bb55d38db8738508daac6d" + }, + "vllm/model_executor/layers/fused_moe/routed_experts_capturer.py": { + "path": "/vllm/model_executor/layers/fused_moe/routed_experts_capturer.py", + "sha256": "cd006bc1a1703418cca3b589fafb2abc4268a086fb3db044bbb64348aeac8b13" + }, + "vllm/model_executor/layers/fused_moe/router/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/layers/fused_moe/router/aiter_shared_routed_fused_moe_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/aiter_shared_routed_fused_moe_router.py", + "sha256": "f47046db1275601a2c67c9232afc7b866c9623a19639d5be867e4c7914a35069" + }, + "vllm/model_executor/layers/fused_moe/router/base_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/base_router.py", + "sha256": "47fa2324bcd9b6ebdc138d69ae6b6ecc0f2463d34bda8c5988bdb0a2a76d3fae" + }, + "vllm/model_executor/layers/fused_moe/router/bf16x3_router_gemm_cutedsl.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/bf16x3_router_gemm_cutedsl.py", + "sha256": "d0f1edd1ebc48d88e490bdb3c93db49bdc0a135ff83e7e0b57130e9f8255fc32" + }, + "vllm/model_executor/layers/fused_moe/router/cpu_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/cpu_router.py", + "sha256": "bff36b15818c87bfbb7ee3def7dc7f6396860abbe5893ff6148801fe941a4b92" + }, + "vllm/model_executor/layers/fused_moe/router/custom_routing_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/custom_routing_router.py", + "sha256": "1a40c7054e3c3a1b3ee2e98f6bc9efa9dfdc11f316a8edf7357dd91533487bfe" + }, + "vllm/model_executor/layers/fused_moe/router/dsv4_topk.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/dsv4_topk.py", + "sha256": "14f7c8487b9aef652dd61c91e0e3c3640b643bf9cd0d8a7184157d71f4beb63e" + }, + "vllm/model_executor/layers/fused_moe/router/fused_moe_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_moe_router.py", + "sha256": "0daa0dc05b931d66767feca444a4cd57ecf140f59b40ea0e8ad213eef6da2b36" + }, + "vllm/model_executor/layers/fused_moe/router/fused_topk_bias_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_topk_bias_router.py", + "sha256": "8fdc28cc248180ad4f11bb4bcda3df47926ec12665a0d84bb712fe83fc6b9376" + }, + "vllm/model_executor/layers/fused_moe/router/fused_topk_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_topk_router.py", + "sha256": "1c80f4af4d781fd66b12aa6a7a0fd30082bc521df40f1252987a8ac4c0bef51c" + }, + "vllm/model_executor/layers/fused_moe/router/gate_linear.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/gate_linear.py", + "sha256": "faa43362c2e7c568498a923c682ca18cae75e87f48d00882770821cb19c21198" + }, + "vllm/model_executor/layers/fused_moe/router/grouped_topk_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/grouped_topk_router.py", + "sha256": "048339e1799cdd42c9dae686a6cb891046577fb391b500f0d12eed73c8f61e52" + }, + "vllm/model_executor/layers/fused_moe/router/rocm_fp32_router_gemm.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/rocm_fp32_router_gemm.py", + "sha256": "9c331ef3d0bb2fb6954387d77ac62a99c5c76d2753c7438bfbb5115f68aae5ac" + }, + "vllm/model_executor/layers/fused_moe/router/router_factory.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/router_factory.py", + "sha256": "019bc8adaa7642abab82843efd53cd1a378f62c652521a1de2b781480eb88742" + }, + "vllm/model_executor/layers/fused_moe/router/routing_simulator_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/routing_simulator_router.py", + "sha256": "a7345df5add00cf3bd93024492d6fc1189fd3ecf2754a11cef1b03a295d791f7" + }, + "vllm/model_executor/layers/fused_moe/router/zero_expert_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/zero_expert_router.py", + "sha256": "dea306edd92e2b9c1b43f982ede8e1e10770d2c66220f5a106e0ed0165276e9c" + }, + "vllm/model_executor/layers/fused_moe/runner/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/layers/fused_moe/runner/moe_runner.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/moe_runner.py", + "sha256": "05893188402fe37229bf72d75088d66193c417d5d502daafd3a55e1bfedaa60c" + }, + "vllm/model_executor/layers/fused_moe/runner/moe_runner_interface.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/moe_runner_interface.py", + "sha256": "189cad01611124eb44594713cbf5918d16fc70196dc81a525ae0a7a97a5fcc51" + }, + "vllm/model_executor/layers/fused_moe/runner/shared_experts.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/shared_experts.py", + "sha256": "d89e4c79c46f6fe61262c51f3facf102e71ce1e4eb3db67f72b6bd8470937be9" + }, + "vllm/model_executor/layers/fused_moe/topk_weight_and_reduce.py": { + "path": "/vllm/model_executor/layers/fused_moe/topk_weight_and_reduce.py", + "sha256": "3dfede72d52bf99af40997994704e6c502ee3bab2bd39bfaa8a68d7dae440203" + }, + "vllm/model_executor/layers/fused_moe/unquantized_fused_moe_method.py": { + "path": "/vllm/model_executor/layers/fused_moe/unquantized_fused_moe_method.py", + "sha256": "182a5ec1874ece2091a24c5303f6ab9ea64a9a61adf325b863927f0cdd83e5d3" + }, + "vllm/model_executor/layers/fused_moe/utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/utils.py", + "sha256": "a93a0bded4008db19d8b38370526ae34fafb9c8278e5b4f60acb6acc8fdc1850" + }, + "vllm/model_executor/layers/mamba/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/abstract.py": { + "path": "/vllm/model_executor/layers/mamba/abstract.py", + "sha256": "dfdc8c836894f574e41d93d76ab989cacd3d7ecf59c97a929abfa48d9364e8ad" + }, + "vllm/model_executor/layers/mamba/gdn/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/gdn/base.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/base.py", + "sha256": "7fec748fc74131f5a45bcaf2644b3fa3a0598fd437d7347f8207ea3644a951c5" + }, + "vllm/model_executor/layers/mamba/gdn/kimi_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/kimi_gdn_linear_attn.py", + "sha256": "1cec4da5c9da73557e192bfb36cd540aae51d3e91283b554449c4a97f0f89bd9" + }, + "vllm/model_executor/layers/mamba/gdn/olmo_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/olmo_gdn_linear_attn.py", + "sha256": "60873ca3bb0c4d17c33bd259b62b658db4883cd23138f47dd4ead62cd2ff0605" + }, + "vllm/model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py", + "sha256": "b80f8e6f3fff442fb880aebb3209c52f814f66490009f4ac4003de603576d10a" + }, + "vllm/model_executor/layers/mamba/linear/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/linear/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/linear/bailing_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/linear/bailing_linear_attn.py", + "sha256": "3c480ddd6eba0766ed012a1074bbec5f241d868a87b020b0f6312222c32f93eb" + }, + "vllm/model_executor/layers/mamba/linear/base.py": { + "path": "/vllm/model_executor/layers/mamba/linear/base.py", + "sha256": "26125cd427225954e1846ca361cdaf43f2b56f11b1e217cf26e91a80ef0edb6a" + }, + "vllm/model_executor/layers/mamba/linear/minimax_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/linear/minimax_linear_attn.py", + "sha256": "4adc00f54893b5bc6c31c613deda152a19af3b1bba04153ab5924c3bf2a3aaae" + }, + "vllm/model_executor/layers/mamba/mamba_mixer.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_mixer.py", + "sha256": "a485e937ad9db14d3ad03fde5a9fe795cfa863649563e52fc7e6c52ef631164e" + }, + "vllm/model_executor/layers/mamba/mamba_mixer2.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_mixer2.py", + "sha256": "d58d93e90d9eb90bc5133b79f07c7c62d0032b35d6cf916e3fe34367b81c5cd5" + }, + "vllm/model_executor/layers/mamba/mamba_utils.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_utils.py", + "sha256": "ce9845b4a4ef4bc46577a33038ed69d59ceccb52f30e9c5bdaa36e48be3b2ca4" + }, + "vllm/model_executor/layers/mamba/ops/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/ops/causal_conv1d.py": { + "path": "/vllm/model_executor/layers/mamba/ops/causal_conv1d.py", + "sha256": "044d005cfe59fd0818ed421274e04f3e8dd679b8cdb64fca9f4422f2643484b2" + }, + "vllm/model_executor/layers/mamba/ops/cpu/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/ops/cpu/causal_conv1d.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/causal_conv1d.py", + "sha256": "64104672890ac2ef240c20c7f8059beeade707178574809dbca8721dff5ea6fa" + }, + "vllm/model_executor/layers/mamba/ops/cpu/gdn_attention.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/gdn_attention.py", + "sha256": "a50288945bf5b102ad3025ae536638dcc32d84cf7c22aaf3a85326b0c1c56c1f" + }, + "vllm/model_executor/layers/mamba/ops/cpu/mamba_ssm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/mamba_ssm.py", + "sha256": "5839e576172a3246337f5e4fb1bc19eb583b3e2b2f7e35dd060dc3041eb8372d" + }, + "vllm/model_executor/layers/mamba/ops/gather_initial_states.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gather_initial_states.py", + "sha256": "5198bb6de6d91c583a5f65d926412a76ee04a06fa72aaba76eaf156b27cd0523" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/__init__.py", + "sha256": "b88b52e71fcb21bd3fa215ea171dcd2ad2ff17c97788cfe64caa7ba45c7ecf97" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_h.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_h.py", + "sha256": "f50bbe5c0b6382323ec5dfc24a5e0c7971113d59727515e60c9fe3689734e5ba" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_kkt_inv_uw.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_kkt_inv_uw.py", + "sha256": "b4a65dd194907db08865e0596fe254f915e670a9e6b27ffa2933c1026dde9b1e" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_o.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_o.py", + "sha256": "629f7843a7e611efb9390f2ebb7a4b924b2c328d48a317fddfaa96af4d9bc60a" + }, + "vllm/model_executor/layers/mamba/ops/layernorm_gated.py": { + "path": "/vllm/model_executor/layers/mamba/ops/layernorm_gated.py", + "sha256": "3433f2e3b87c2b2ccf8e9794ce40762c86a6da38a94ecee001f439ea0d0373dd" + }, + "vllm/model_executor/layers/mamba/ops/mamba_ssm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/mamba_ssm.py", + "sha256": "a4515ec7895b40ed878cf380445034b25faa61fbaa799d96c49217bbdfd7e400" + }, + "vllm/model_executor/layers/mamba/ops/replayssm_config.py": { + "path": "/vllm/model_executor/layers/mamba/ops/replayssm_config.py", + "sha256": "5fe9d5d7aa2de6a65875b3796a919b22bc435fd76055ba054bbff43aa005bc44" + }, + "vllm/model_executor/layers/mamba/ops/scatter_states.py": { + "path": "/vllm/model_executor/layers/mamba/ops/scatter_states.py", + "sha256": "f3bb004c73edaba56337747893eb07faf29b270dc8bb9c893ee9b1044e4ead9a" + }, + "vllm/model_executor/layers/mamba/ops/selective_state_update_replayssm_output_only.py": { + "path": "/vllm/model_executor/layers/mamba/ops/selective_state_update_replayssm_output_only.py", + "sha256": "cea7fd3063ca9dcc4e33f180d01ea379195ec515cedc9d0b03b11dc67670d695" + }, + "vllm/model_executor/layers/mamba/ops/ssd_bmm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_bmm.py", + "sha256": "26983d97a7f5c5f9197a16a6bee7b1294839b9ae31a14c14aaee38b43523e630" + }, + "vllm/model_executor/layers/mamba/ops/ssd_chunk_scan.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_chunk_scan.py", + "sha256": "d5ef32e8cb47e2ce71984579df78ab69754895f891766394daf327867cfa4f8f" + }, + "vllm/model_executor/layers/mamba/ops/ssd_chunk_state.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_chunk_state.py", + "sha256": "177e3aa7fe72647133bbd86135533e8688a5802678d4d1564aa549410362316f" + }, + "vllm/model_executor/layers/mamba/ops/ssd_combined.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_combined.py", + "sha256": "1317bbb668d3c60dfe0658850f9968614f03fa5eb61196f8ce6ac17dbb31b480" + }, + "vllm/model_executor/layers/mamba/ops/ssd_state_passing.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_state_passing.py", + "sha256": "36b8c8edba437916a5b789717c61fc22077de01e77892cb96dbff3b00a57410e" + }, + "vllm/model_executor/layers/mamba/ops/ssu_dispatch.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssu_dispatch.py", + "sha256": "bbe0f0e61da87f3ddfead19a79ca376516b63f1ea868be3485333c63fa20ef41" + }, + "vllm/model_executor/layers/mamba/ops/triton_helpers.py": { + "path": "/vllm/model_executor/layers/mamba/ops/triton_helpers.py", + "sha256": "a8795532f22c37a93e82c9d8e3fadcb5f4da98673d7b321fe8481305eaafad30" + }, + "vllm/model_executor/layers/mamba/short_conv.py": { + "path": "/vllm/model_executor/layers/mamba/short_conv.py", + "sha256": "228494efab185ee17374f762874f4c8b9a26aac9decfa8c906ce38446e0de51a" + }, + "vllm/model_executor/models/qwen3_next.py": { + "path": "/vllm/model_executor/models/qwen3_next.py", + "sha256": "4fa5112ac2bf7886d41d9e1f6c3da8793620d1ec49c961b31e9609459a6a7f7a" + }, + "vllm/third_party/flash_linear_attention/__init__.py": { + "path": "/vllm/third_party/flash_linear_attention/__init__.py", + "sha256": "5dbbfa3fc286edb2e970e175ef33cee4f6181c89b0784f5a8986201b2312f54e" + }, + "vllm/third_party/flash_linear_attention/ops/__init__.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/__init__.py", + "sha256": "dd738dc1d08045e76455cdbe16052a5b769e0eb11d6e87ff28353994f880cd6c" + }, + "vllm/third_party/flash_linear_attention/ops/chunk.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk.py", + "sha256": "c105ead259e86aedc248c53e7c4cef07034d0ff12da608d80265d1dd0990803f" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_delta_h.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_delta_h.py", + "sha256": "1b3ad391f939d9443c6b7adb19e57fe381bd5dccea064e8417a4f85b0e713b26" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_o.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_o.py", + "sha256": "3b63b836a8cc561723c23db5a528a0b474d9cd78508d610f0b348c585a889a19" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_scaled_dot_kkt.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_scaled_dot_kkt.py", + "sha256": "7ae41df3755acc7e925a134d848f78bb5fc00b90069039d86403c5853323ea42" + }, + "vllm/third_party/flash_linear_attention/ops/cumsum.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/cumsum.py", + "sha256": "d818215669b451868823202ac0bcea77e7a9d75957254c7c1060a73a55dc39b6" + }, + "vllm/third_party/flash_linear_attention/ops/fused_gdn_prefill_post_conv.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_gdn_prefill_post_conv.py", + "sha256": "590717b2107abc90d72548de06b5d315229eb2775c94614f3f545df11cc2b5df" + }, + "vllm/third_party/flash_linear_attention/ops/fused_norm_gate.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_norm_gate.py", + "sha256": "e6eb90467f29d8a0a04f2a364d20a2c3191b6ab857841bfb82076b33a6022d1a" + }, + "vllm/third_party/flash_linear_attention/ops/fused_recurrent.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_recurrent.py", + "sha256": "fe6f1311014809040497aa0a623e7fa97f4b3457cdc7ee1f1f8aed21f326f755" + }, + "vllm/third_party/flash_linear_attention/ops/fused_sigmoid_gating.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_sigmoid_gating.py", + "sha256": "000ab8996af9788fdb8843a6a3b91833e7a14c8acc0e1ea073a536330f64cb6f" + }, + "vllm/third_party/flash_linear_attention/ops/index.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/index.py", + "sha256": "a4f8b2c052635cb519a80099e8a85411d1d5d6880b38f466788259bbe66b154d" + }, + "vllm/third_party/flash_linear_attention/ops/kda.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/kda.py", + "sha256": "e1f31aaa89b91f8e5db6d070b229e2c81c7206e8caec67de41db97d06be0c476" + }, + "vllm/third_party/flash_linear_attention/ops/l2norm.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/l2norm.py", + "sha256": "520f4513ef4fc97e6b88dc07877cca8e29da0d34e44673fe989e3af002d86381" + }, + "vllm/third_party/flash_linear_attention/ops/layernorm_guard.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/layernorm_guard.py", + "sha256": "42af29be26e8fc94a4658e053c095fcdab9ffdc1bc2446a01e787deda2a298c0" + }, + "vllm/third_party/flash_linear_attention/ops/op.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/op.py", + "sha256": "456da84fd12411cf53c96a90dd4f78f49afb454c3d51d2c524ea8e7106fe8ae5" + }, + "vllm/third_party/flash_linear_attention/ops/solve_tril.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/solve_tril.py", + "sha256": "d1a4ff27623a938825052500afa7e2aa24fadd2fa4c9be6376c9128824f86f82" + }, + "vllm/third_party/flash_linear_attention/ops/utils.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/utils.py", + "sha256": "d6c90d36505e02086954c23ca4dd2fea82a69416d68ff1d0501e16b3148b5b0c" + }, + "vllm/third_party/flash_linear_attention/ops/wy_fast.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/wy_fast.py", + "sha256": "c9fc8259db0a8746dc04f1d799cb73333457118cf89a0bdce8dde8a80a28cd96" + }, + "vllm/v1/attention/__init__.py": { + "path": "/vllm/v1/attention/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backend.py": { + "path": "/vllm/v1/attention/backend.py", + "sha256": "01ac364372afa75fdb22486aa3a9c7cf9aebb742e3471dfb9e0f9d9d36b734bc" + }, + "vllm/v1/attention/backends/__init__.py": { + "path": "/vllm/v1/attention/backends/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backends/b12x.py": { + "path": "/vllm/v1/attention/backends/b12x.py", + "sha256": "443f0a98738fdfefe5b9ab151d278bfd43a8ac807eb2b0b9b2a13d51922afbf9" + }, + "vllm/v1/attention/backends/composite.py": { + "path": "/vllm/v1/attention/backends/composite.py", + "sha256": "4cf3d66dca891562709eed4f50aa14b0ae6c8240d9ea86504a3304b2f356cce0" + }, + "vllm/v1/attention/backends/cpu_attn.py": { + "path": "/vllm/v1/attention/backends/cpu_attn.py", + "sha256": "76fb02a6bd725125565d84bf04f627cf16da5f7ff8f31f87c01ed6a1439398c7" + }, + "vllm/v1/attention/backends/fa_utils.py": { + "path": "/vllm/v1/attention/backends/fa_utils.py", + "sha256": "08fa6e231d3af3a71a6e59162dd12328aa8beb28548165ae58f130a92adb5a83" + }, + "vllm/v1/attention/backends/flash_attn.py": { + "path": "/vllm/v1/attention/backends/flash_attn.py", + "sha256": "b170a4789e18104c1bee35bea70df51abe6766693d8f4726a59f2e6f5c4282aa" + }, + "vllm/v1/attention/backends/flash_attn_diffkv.py": { + "path": "/vllm/v1/attention/backends/flash_attn_diffkv.py", + "sha256": "e4627c88c3ba8caee260540e994cc8137fd2ff7cd7813356b36387c6c88ce30a" + }, + "vllm/v1/attention/backends/flashinfer.py": { + "path": "/vllm/v1/attention/backends/flashinfer.py", + "sha256": "8ee541fde43ed92a417b3f01ea1e6fc64af8ab2eb54cbfc28308a49aaca4ed7f" + }, + "vllm/v1/attention/backends/flex_attention.py": { + "path": "/vllm/v1/attention/backends/flex_attention.py", + "sha256": "ad07f0ad73aeeadc3534b3a05c14f88a62cb3638874239ae9823c49b36276dc3" + }, + "vllm/v1/attention/backends/gdn_attn.py": { + "path": "/vllm/v1/attention/backends/gdn_attn.py", + "sha256": "3831019404a92200a38b43571c040cffeb6638bbdc71e4cb5e680dbc6c93d054" + }, + "vllm/v1/attention/backends/hpc_attn.py": { + "path": "/vllm/v1/attention/backends/hpc_attn.py", + "sha256": "af9e2aec1b498f0ee48a2dce3cf5646edf1976466980b2fd927c0e82b875427c" + }, + "vllm/v1/attention/backends/linear_attn.py": { + "path": "/vllm/v1/attention/backends/linear_attn.py", + "sha256": "bc42144fcd027434c6a10dc9f4c5f991db8899d387af5f6485402ce097eb0513" + }, + "vllm/v1/attention/backends/mamba1_attn.py": { + "path": "/vllm/v1/attention/backends/mamba1_attn.py", + "sha256": "32159dae11cab3c8c576b9514ad97d5108c8d1b4cac9fcfe345ec6a76223aee7" + }, + "vllm/v1/attention/backends/mamba2_attn.py": { + "path": "/vllm/v1/attention/backends/mamba2_attn.py", + "sha256": "a5bcdecb7b9547137023e1c77a386003358fa940eaf5f319ed142211dcdba139" + }, + "vllm/v1/attention/backends/mamba_attn.py": { + "path": "/vllm/v1/attention/backends/mamba_attn.py", + "sha256": "5e7b2c4058fc5e6096d001bff6c789b78368b025bbe4600f191aaca2ff59b59f" + }, + "vllm/v1/attention/backends/mla/__init__.py": { + "path": "/vllm/v1/attention/backends/mla/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backends/mla/aiter_triton_mla.py": { + "path": "/vllm/v1/attention/backends/mla/aiter_triton_mla.py", + "sha256": "ed0e285cdae06a019150c41cc958b3c0b5ceb0e4f299d5318d1c90e2c2395390" + }, + "vllm/v1/attention/backends/mla/amx_mla.py": { + "path": "/vllm/v1/attention/backends/mla/amx_mla.py", + "sha256": "7f5cddec30b2dfe22ccdbd3b9da673c879719bf6da4074317bd60add55f5d15f" + }, + "vllm/v1/attention/backends/mla/compressor_utils.py": { + "path": "/vllm/v1/attention/backends/mla/compressor_utils.py", + "sha256": "3589e94105368ea285c40b82db1a0332682ff5d071fe363627cf4c0d10f3facf" + }, + "vllm/v1/attention/backends/mla/cpu_mla.py": { + "path": "/vllm/v1/attention/backends/mla/cpu_mla.py", + "sha256": "ff2110b9f78e92adf6bab294465cbc294ae1ff71cb1780fed158179e134a4ca6" + }, + "vllm/v1/attention/backends/mla/cutlass_mla.py": { + "path": "/vllm/v1/attention/backends/mla/cutlass_mla.py", + "sha256": "211d298680f9bd793cc468281b316d6633c5f4eb6dcec71d3329b034a23ab9b5" + }, + "vllm/v1/attention/backends/mla/flashattn_mla.py": { + "path": "/vllm/v1/attention/backends/mla/flashattn_mla.py", + "sha256": "ac89e0ad75a37e92566d264bafe324735a80f9ab4709241a4454d17b3d38bb63" + }, + "vllm/v1/attention/backends/mla/flashattn_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashattn_mla_sparse.py", + "sha256": "67dd3ead2e8b9d8cda0825ecc93779cb7d670628bc741c759a7d3cd5d474030f" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla.py", + "sha256": "0c24ff016fb6b0bb41d9e7484b6f1af42f37bcc384ed613473fc3e01ad25f664" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse.py", + "sha256": "2116d965b2067134d8afa5878d4d16c0149b061258f50c4106d993aa13b073cc" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm120.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm120.py", + "sha256": "102ca08793d567f95598eefeb34c3f6ec50b3b9d704f162d1402b97b12b5777b" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm90.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm90.py", + "sha256": "df9fe4970aa3f53cf24784b8534b89e0101a2ca20a35a2ebbc9a12a4463d5993" + }, + "vllm/v1/attention/backends/mla/flashmla.py": { + "path": "/vllm/v1/attention/backends/mla/flashmla.py", + "sha256": "c9d8046a853ecbdeff9ebfc738f5bb34c4f272b278231a09a0fbf73708c7c188" + }, + "vllm/v1/attention/backends/mla/flashmla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashmla_sparse.py", + "sha256": "7a379c717adb9667ce94cbc16c0e3a1fb22a169713db6d7941c141fa84077b3f" + }, + "vllm/v1/attention/backends/mla/index_group.py": { + "path": "/vllm/v1/attention/backends/mla/index_group.py", + "sha256": "c24e028c3c160a9bb92e043da5b5b34c805e84745b7c4b8da6fb8702a0ddd641" + }, + "vllm/v1/attention/backends/mla/indexer.py": { + "path": "/vllm/v1/attention/backends/mla/indexer.py", + "sha256": "2acbc1c4fa57c3424ad95e6ecbe76eb7141747773c3e867ce704f4adccba892a" + }, + "vllm/v1/attention/backends/mla/prefill/__init__.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/__init__.py", + "sha256": "903630eb705dd175bf4ae4558a4bcaa07c110056b6a11eb830fdd2fb21b3c48a" + }, + "vllm/v1/attention/backends/mla/prefill/aiter_flash_attn.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/aiter_flash_attn.py", + "sha256": "571b8a9910c4ea3fefda60659026f3bf0d7b542c34553c8c9a4d43bb82077e61" + }, + "vllm/v1/attention/backends/mla/prefill/base.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/base.py", + "sha256": "138bf3ddaf5a94c3cdbc4e08ac676edcae84b32fc76625e546f3b47f7d8b82ec" + }, + "vllm/v1/attention/backends/mla/prefill/cpu_sdpa.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/cpu_sdpa.py", + "sha256": "1bb686395274a8ec0d9fd7327410a527655fe060cbbc263eab138fea988d96de" + }, + "vllm/v1/attention/backends/mla/prefill/flash_attn.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/flash_attn.py", + "sha256": "5e648c82c82e5f81fe11458eb82b9f90b50fc06df2ade3bf111ee6b7a2ee8481" + }, + "vllm/v1/attention/backends/mla/prefill/flashinfer.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/flashinfer.py", + "sha256": "63861219c35b8abc0ebe01e1f51543c5ed40bd46119ca261d927da7c6826b49b" + }, + "vllm/v1/attention/backends/mla/prefill/registry.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/registry.py", + "sha256": "c8c30b92213d594beaa3cab4d5003da26a85870dbb11d1ab73191962d0645b53" + }, + "vllm/v1/attention/backends/mla/prefill/selector.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/selector.py", + "sha256": "101d9fca7924b0c5d7891a17fe8942611bd6759e32b03a571dc87b14c1430f2f" + }, + "vllm/v1/attention/backends/mla/prefill/tokenspeed_mla.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/tokenspeed_mla.py", + "sha256": "047cf07bfcc83db3b11a6a54ffe189f6146e6ec9ad33ce2fa7d18860bf4210f0" + }, + "vllm/v1/attention/backends/mla/prefill/trtllm_ragged.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/trtllm_ragged.py", + "sha256": "9e13ea6f6a25accedd918c0de64bbb812ccb20ffb95350ab018a6e76d493789b" + }, + "vllm/v1/attention/backends/mla/rocm_aiter_mla.py": { + "path": "/vllm/v1/attention/backends/mla/rocm_aiter_mla.py", + "sha256": "b489f5830c655bfb6299801a70d69b9821513c69568ecab3689db5a7be867be5" + }, + "vllm/v1/attention/backends/mla/rocm_aiter_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/rocm_aiter_mla_sparse.py", + "sha256": "91b1d9b3d860a9720bc01b8ebe9bbe8649a7d6bca20d4b63939bc100309bca19" + }, + "vllm/v1/attention/backends/mla/sparse_swa.py": { + "path": "/vllm/v1/attention/backends/mla/sparse_swa.py", + "sha256": "a47853ad8a3fe40f24704592581ea323a18041b84610df010a5534da634e311e" + }, + "vllm/v1/attention/backends/mla/sparse_utils.py": { + "path": "/vllm/v1/attention/backends/mla/sparse_utils.py", + "sha256": "c3cdf060288c05542243a9fe8b5ad3a963ad75e9ce399009b5e45c1235a88ce4" + }, + "vllm/v1/attention/backends/mla/tokenspeed_mla.py": { + "path": "/vllm/v1/attention/backends/mla/tokenspeed_mla.py", + "sha256": "b9ba523c606430cecb99a88b28c53d98a99dcf5e76105a80664338110a20f1ad" + }, + "vllm/v1/attention/backends/mla/triton_mla.py": { + "path": "/vllm/v1/attention/backends/mla/triton_mla.py", + "sha256": "21b16b3b34470edcc33d0423e560837c1d37d4bab31c7b3b9cfd7faa47864b51" + }, + "vllm/v1/attention/backends/mla/xpu_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/xpu_mla_sparse.py", + "sha256": "559c6240fe466521a6b2df4c94aea02ddf3f5efa5ba6954fa180c5a51c0f12d2" + }, + "vllm/v1/attention/backends/recoverssm_metadata.py": { + "path": "/vllm/v1/attention/backends/recoverssm_metadata.py", + "sha256": "02896a667db0f0308371ceb50048b18e5866c0235d163c0357e9a05dcedb3394" + }, + "vllm/v1/attention/backends/registry.py": { + "path": "/vllm/v1/attention/backends/registry.py", + "sha256": "378e8ee78734bd8c8adbe287d4c0a4058dcbb553195a09fbcce00a3cc30adc29" + }, + "vllm/v1/attention/backends/rocm_aiter_fa.py": { + "path": "/vllm/v1/attention/backends/rocm_aiter_fa.py", + "sha256": "d1418af03bf58209c850f466b712d3ea22a14ebb758c42dd43e65738281841fd" + }, + "vllm/v1/attention/backends/rocm_aiter_unified_attn.py": { + "path": "/vllm/v1/attention/backends/rocm_aiter_unified_attn.py", + "sha256": "59d2645eb4c91dc0567754a7163d066f4f2faf48f1957b254fcdd5604e9d8c8c" + }, + "vllm/v1/attention/backends/rocm_attn.py": { + "path": "/vllm/v1/attention/backends/rocm_attn.py", + "sha256": "4a8f57067073fbceb784af6c3467487c450d00fa3957928fadb99a79f6036292" + }, + "vllm/v1/attention/backends/short_conv_attn.py": { + "path": "/vllm/v1/attention/backends/short_conv_attn.py", + "sha256": "84fc460ef2fbd09743b069bec0c14b39542af6c2254a403e37a048427e151121" + }, + "vllm/v1/attention/backends/triton_attn.py": { + "path": "/vllm/v1/attention/backends/triton_attn.py", + "sha256": "1057663d110e1d5229495a799027b27277c1eca325d5b6780fa2259afbf58a1a" + }, + "vllm/v1/attention/backends/triton_attn_diffkv.py": { + "path": "/vllm/v1/attention/backends/triton_attn_diffkv.py", + "sha256": "de0357eae005246642140f1ab8842ba5ed8bff5c84b18a6d3a7bbf409c578301" + }, + "vllm/v1/attention/backends/triton_flash_attn.py": { + "path": "/vllm/v1/attention/backends/triton_flash_attn.py", + "sha256": "176e45329aeb28a2008362bb607d1b8c89816eb665859ab908b0385a11acf1c2" + }, + "vllm/v1/attention/backends/triton_flashinfer.py": { + "path": "/vllm/v1/attention/backends/triton_flashinfer.py", + "sha256": "48d5f967e388d4e8d6bbec8d827b44d855346bc2fada28adf65768bf6623527b" + }, + "vllm/v1/attention/backends/turboquant_attn.py": { + "path": "/vllm/v1/attention/backends/turboquant_attn.py", + "sha256": "616d16d608d9d1fbf6c29548037e7e9cf330f4d36a01aa3ffabf42a731eb6e2b" + }, + "vllm/v1/attention/backends/utils.py": { + "path": "/vllm/v1/attention/backends/utils.py", + "sha256": "fbc221360d2d54cb21ef3f625dc8711500de345a355801548b4337bb9b8abee0" + }, + "vllm/v1/attention/ops/__init__.py": { + "path": "/vllm/v1/attention/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/ops/chunked_prefill_paged_decode.py": { + "path": "/vllm/v1/attention/ops/chunked_prefill_paged_decode.py", + "sha256": "973db848a790b2e8d99e728b2fc4f44b501bbe58c62747244ddff04cfcf11a85" + }, + "vllm/v1/attention/ops/common.py": { + "path": "/vllm/v1/attention/ops/common.py", + "sha256": "b4b67e7fc0cce471e337d742c097fba06da7563816e8799e27719714e31e1d5b" + }, + "vllm/v1/attention/ops/cp_common.py": { + "path": "/vllm/v1/attention/ops/cp_common.py", + "sha256": "2369181862e96db64b14ef20c5c2e249ed2ea5f3dea2467a2aa388372bb86d9d" + }, + "vllm/v1/attention/ops/dcp.py": { + "path": "/vllm/v1/attention/ops/dcp.py", + "sha256": "a478bdc781460f0582cfaf74d6431f1a826c201f02f39d882d12a96139bc3f28" + }, + "vllm/v1/attention/ops/flashmla.py": { + "path": "/vllm/v1/attention/ops/flashmla.py", + "sha256": "8a40d6e120e3ab25a95fcfeb32b0b5b4c1ea02b984633866628536dcd26ed2e8" + }, + "vllm/v1/attention/ops/flydsl_kernels/__init__.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/attention/ops/flydsl_kernels/tq_decode.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/tq_decode.py", + "sha256": "cc4b7f82897596e0974b3d3a710a1a8bc58c3d22b72cc7f461dd1c4acd2e451b" + }, + "vllm/v1/attention/ops/flydsl_kernels/tq_decode_gqa6.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/tq_decode_gqa6.py", + "sha256": "a983f6d375c325900955e11696dab1e2665770e83f84d51f93d3ed5e1d8880e0" + }, + "vllm/v1/attention/ops/flydsl_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/flydsl_turboquant_decode.py", + "sha256": "7b1dd0ef7c7fb28a6a8831759e00b939ab844d067657155cc11cf75532a22c63" + }, + "vllm/v1/attention/ops/int4_per_token_head.py": { + "path": "/vllm/v1/attention/ops/int4_per_token_head.py", + "sha256": "d91968f280cd8eaed7570ab255f0276b40e833e18a25066d371d9ca8149425f2" + }, + "vllm/v1/attention/ops/merge_attn_states.py": { + "path": "/vllm/v1/attention/ops/merge_attn_states.py", + "sha256": "ad08403d2843fc892f0b0b4b9f5fabb81884556f89f7170dca46ccef498a3539" + }, + "vllm/v1/attention/ops/metadata.py": { + "path": "/vllm/v1/attention/ops/metadata.py", + "sha256": "ca882b84c5aaefb1f77e4d8ea09a00103fbc53defa8671bba036c961c17fc760" + }, + "vllm/v1/attention/ops/paged_attn.py": { + "path": "/vllm/v1/attention/ops/paged_attn.py", + "sha256": "016a95f892ec751c86b37be1e12171bad9f0b4076bbf2219ff336f4e9c503653" + }, + "vllm/v1/attention/ops/pcp.py": { + "path": "/vllm/v1/attention/ops/pcp.py", + "sha256": "dadeff95fe2df2be8028baabeef01b0d2d628cd67de2176915e737ce096de3dd" + }, + "vllm/v1/attention/ops/prefix_prefill.py": { + "path": "/vllm/v1/attention/ops/prefix_prefill.py", + "sha256": "b08ad92db715fc03c11699de3de463d55e411f42f77548e06b41049a61de692f" + }, + "vllm/v1/attention/ops/rocm_aiter_mla_merge.py": { + "path": "/vllm/v1/attention/ops/rocm_aiter_mla_merge.py", + "sha256": "564c66e4877732e48a6f7d52405c43dc952eec0f0ae4353d34886bca056132b9" + }, + "vllm/v1/attention/ops/rocm_aiter_mla_sparse.py": { + "path": "/vllm/v1/attention/ops/rocm_aiter_mla_sparse.py", + "sha256": "feec664be5045fd1ba13b8f6ef83b52c96910ddc78baca0431bcf610c9e8f5cc" + }, + "vllm/v1/attention/ops/triton_attention_helpers.py": { + "path": "/vllm/v1/attention/ops/triton_attention_helpers.py", + "sha256": "35aa993d01345f535d2641cf9dcabb8b64c51b20a19707bc5987e616aaa87ddd" + }, + "vllm/v1/attention/ops/triton_decode_attention.py": { + "path": "/vllm/v1/attention/ops/triton_decode_attention.py", + "sha256": "b9823c65eba22d76abf64dad7d7d16a950f67471c86d6cb5b3e983aaf14381ac" + }, + "vllm/v1/attention/ops/triton_merge_attn_states.py": { + "path": "/vllm/v1/attention/ops/triton_merge_attn_states.py", + "sha256": "f63229162181ab93198550b73a115f1cc1034cfd60e6f58bc8ab3e22a6e8ce60" + }, + "vllm/v1/attention/ops/triton_prefill_attention.py": { + "path": "/vllm/v1/attention/ops/triton_prefill_attention.py", + "sha256": "352c1a4ac86146580040579fb217c2e288268830d6602b735713e154f36d74fe" + }, + "vllm/v1/attention/ops/triton_reshape_and_cache_flash.py": { + "path": "/vllm/v1/attention/ops/triton_reshape_and_cache_flash.py", + "sha256": "6cac51475b8c656992a21b2d150acd3a16a95a7ab7d49aab151a3ef13c24b80d" + }, + "vllm/v1/attention/ops/triton_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/triton_turboquant_decode.py", + "sha256": "8e52678136449e4bbca2195fbcbb87426c955a2b1b8422e7ab9511e45ee5f5c6" + }, + "vllm/v1/attention/ops/triton_turboquant_store.py": { + "path": "/vllm/v1/attention/ops/triton_turboquant_store.py", + "sha256": "6e6e2fe74a307d40f0be786ccbaea76d989e3c7b5985f3144a5218c61bf6d902" + }, + "vllm/v1/attention/ops/triton_unified_attention.py": { + "path": "/vllm/v1/attention/ops/triton_unified_attention.py", + "sha256": "65d0fbcf33d00789df8ca688c0a1c908e710cfaef53471178747ecae11f05829" + }, + "vllm/v1/attention/ops/triton_unified_attention_diffkv.py": { + "path": "/vllm/v1/attention/ops/triton_unified_attention_diffkv.py", + "sha256": "7fa36d7b7441f1c396e0348eac61d691d2e459e5c4c393c4aa262dfb670e68f7" + }, + "vllm/v1/attention/ops/turboquant_soa/__init__.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/__init__.py", + "sha256": "6b43b6fcb2a71c44ceff4ed1edd417a839f4901251ba15831b09ad979baa4984" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode.py", + "sha256": "bf00634191bba14cbf4a23c1d67dc3dcb244c2b8989f08362757b54435830986" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode_v2.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode_v2.py", + "sha256": "28e7ecc15c450d3591983a50c46a03aa6ca6fa99304c17c333940617d9916485" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_store.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_store.py", + "sha256": "dccf93b9fdd34f9b9eacd468e9de35b9d93378594487c335cf50642aaec681f2" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_unified_attention.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_unified_attention.py", + "sha256": "b4b2b5f3985b3a6126fd052e6ec1ed91c610da8a525a9ae7470ac829405bd85c" + }, + "vllm/v1/attention/ops/vit_attn_wrappers.py": { + "path": "/vllm/v1/attention/ops/vit_attn_wrappers.py", + "sha256": "a99d57b58269c7521fa5d7d47af06551f3bab2b5c7358ef78165a7f6e20a92a6" + }, + "vllm/v1/attention/ops/xpu_mla_sparse.py": { + "path": "/vllm/v1/attention/ops/xpu_mla_sparse.py", + "sha256": "d98d17110577c2b7b4d05e07bfdae15faf83321b6342a5daaaecce45b9503f38" + }, + "vllm/v1/attention/selector.py": { + "path": "/vllm/v1/attention/selector.py", + "sha256": "87f653ded7974875183c920e3e4589c28116bcbc99714d1da7cb51ae77c0b182" + }, + "vllm/v1/core/sched/__init__.py": { + "path": "/vllm/v1/core/sched/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/core/sched/async_scheduler.py": { + "path": "/vllm/v1/core/sched/async_scheduler.py", + "sha256": "e586a0ef3c6778be56a93e7f9bb712d4de9de6e7d7fe7e3e1d51dae83ecfc508" + }, + "vllm/v1/core/sched/interface.py": { + "path": "/vllm/v1/core/sched/interface.py", + "sha256": "be6c008664096c5660a8879de72b315bbe479bf1d688be9b25891063ec53a367" + }, + "vllm/v1/core/sched/output.py": { + "path": "/vllm/v1/core/sched/output.py", + "sha256": "3a66c8efaefe10c572f6f33cf1f8aa4610758c945130cad62eb9f7331005677c" + }, + "vllm/v1/core/sched/request_queue.py": { + "path": "/vllm/v1/core/sched/request_queue.py", + "sha256": "4b8d938e5fb8152fe61030b8aa991f983fcac9a405c37ed8908045e05e82ae5e" + }, + "vllm/v1/core/sched/scheduler.py": { + "path": "/vllm/v1/core/sched/scheduler.py", + "sha256": "c1db45f3bbad3a875dd8638331b8870c4380ac1ab4734265ba5c863833a82884" + }, + "vllm/v1/core/sched/utils.py": { + "path": "/vllm/v1/core/sched/utils.py", + "sha256": "1ed988044eb8028c77ede875bd1a5fd05ff6998b455d61e3997d6a3d7fc1c3a7" + }, + "vllm/v1/sample/__init__.py": { + "path": "/vllm/v1/sample/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/sample/logits_processor/__init__.py": { + "path": "/vllm/v1/sample/logits_processor/__init__.py", + "sha256": "1f9b02dae8cf6d44484638037123d3a2dec6b7b9a2bcc9afceef1a9bf3eaedec" + }, + "vllm/v1/sample/logits_processor/builtin.py": { + "path": "/vllm/v1/sample/logits_processor/builtin.py", + "sha256": "6105816ece77e5b1dbee0d07abc90ce039d650bac2ddb85c93280c48b00f2ebe" + }, + "vllm/v1/sample/logits_processor/interface.py": { + "path": "/vllm/v1/sample/logits_processor/interface.py", + "sha256": "171dfc6ef9b5b53128e8eaecc4bdf1de413a706d64bf5be686048f583c66eee1" + }, + "vllm/v1/sample/logits_processor/state.py": { + "path": "/vllm/v1/sample/logits_processor/state.py", + "sha256": "a96411f14362c45f839e181dcb3ac01d5b880812bccb3552fc17863b219f44ac" + }, + "vllm/v1/sample/metadata.py": { + "path": "/vllm/v1/sample/metadata.py", + "sha256": "6582cfe1a240c7ddb975f0ef6dd7dcd28dcf0fc7670394390250013977aa7ffd" + }, + "vllm/v1/sample/ops/__init__.py": { + "path": "/vllm/v1/sample/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/sample/ops/bad_words.py": { + "path": "/vllm/v1/sample/ops/bad_words.py", + "sha256": "0b1d0a9b13b92ddcae2c83393c07a34c0f107813725700dee794caa7fe7f3b12" + }, + "vllm/v1/sample/ops/logprobs.py": { + "path": "/vllm/v1/sample/ops/logprobs.py", + "sha256": "b286f69012a6758bfe9250038b0697294dbffe0d32c6906f284c39f75ee48be3" + }, + "vllm/v1/sample/ops/penalties.py": { + "path": "/vllm/v1/sample/ops/penalties.py", + "sha256": "4debfcf247b3887478d2b9ec98f108756bbed2805462777ef6b56f3bdf4ce682" + }, + "vllm/v1/sample/ops/topk_topp_sampler.py": { + "path": "/vllm/v1/sample/ops/topk_topp_sampler.py", + "sha256": "13ea4359832bc914492330958ec4f5ac140f408b8f410cc05c6eaf7ddcd70be4" + }, + "vllm/v1/sample/ops/topk_topp_triton.py": { + "path": "/vllm/v1/sample/ops/topk_topp_triton.py", + "sha256": "0b5fc337058e22bc28a8530ccec904d6ccd89b9548b02955c657ac429b1669d2" + }, + "vllm/v1/sample/rejection_sampler.py": { + "path": "/vllm/v1/sample/rejection_sampler.py", + "sha256": "0bb9d224887ccb1355e16199005cc23a4afc6fa75156eca419851b7247d99750" + }, + "vllm/v1/sample/sampler.py": { + "path": "/vllm/v1/sample/sampler.py", + "sha256": "f95805b2c6d06218c724826aa5f881a606e8d0a534a566aee7c85948520dd216" + }, + "vllm/v1/sample/thinking_budget_state.py": { + "path": "/vllm/v1/sample/thinking_budget_state.py", + "sha256": "962f8f55210eb0a431cb9c78b013e35f7a7dd58d06d6fb2e7fcff1b457356f8e" + }, + "vllm/v1/worker/__init__.py": { + "path": "/vllm/v1/worker/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/block_table.py": { + "path": "/vllm/v1/worker/block_table.py", + "sha256": "a09b8819e1417b7a186cf3472224e2138fc5d41a291c6692bb7df711b0c44259" + }, + "vllm/v1/worker/cp_utils.py": { + "path": "/vllm/v1/worker/cp_utils.py", + "sha256": "e32625d83a641b8dd8df82e92d1b6fb20af0cdf2e8fbd2fb131aa3c215415448" + }, + "vllm/v1/worker/cpu/__init__.py": { + "path": "/vllm/v1/worker/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/cpu/buffer_utils.py": { + "path": "/vllm/v1/worker/cpu/buffer_utils.py", + "sha256": "e7313fd8c2c76ebfb98d2fa53008bc9691d0f83a7d7c05e87602b5a29fb79e04" + }, + "vllm/v1/worker/cpu/model_runner.py": { + "path": "/vllm/v1/worker/cpu/model_runner.py", + "sha256": "24a1c916550051327dd5893243a6d4200f3824b91b3af8aa6f6c793fd7c68c3e" + }, + "vllm/v1/worker/cpu/shm.py": { + "path": "/vllm/v1/worker/cpu/shm.py", + "sha256": "08491af8ad341399d1375f2d21ad00414d4c89b0a5c03f55de8704914bbfcbd9" + }, + "vllm/v1/worker/cpu_model_runner.py": { + "path": "/vllm/v1/worker/cpu_model_runner.py", + "sha256": "92111aba92f00571f1a3c4c6e43cf1da6ccb4d2afac2f4d5abc018a4a6e7e8bd" + }, + "vllm/v1/worker/cpu_worker.py": { + "path": "/vllm/v1/worker/cpu_worker.py", + "sha256": "a8051b9e510ef0af9cc34004f2cbe5c0f902bd0cebc32c9464e744344dfdf849" + }, + "vllm/v1/worker/dp_utils.py": { + "path": "/vllm/v1/worker/dp_utils.py", + "sha256": "8cd19f1bfbc5c4f6ec60df89aea7c8a19b400ebc264f372b103014152e92158c" + }, + "vllm/v1/worker/ec_connector_model_runner_mixin.py": { + "path": "/vllm/v1/worker/ec_connector_model_runner_mixin.py", + "sha256": "fe9b11cebb8562f1bfe98b98a5647b2b081a6e424cb60d4ffe2412c91a99215e" + }, + "vllm/v1/worker/encoder_cudagraph.py": { + "path": "/vllm/v1/worker/encoder_cudagraph.py", + "sha256": "6a08d3779bca1b47dbf9daf6eafe2d3c70dbcb8aeb7d63ba7efacc68241ee3bc" + }, + "vllm/v1/worker/encoder_cudagraph_defs.py": { + "path": "/vllm/v1/worker/encoder_cudagraph_defs.py", + "sha256": "bb7be050fcaa8868e7816c84caec875da57050d65fe7eaf00f3d41473df25e3a" + }, + "vllm/v1/worker/gpu/__init__.py": { + "path": "/vllm/v1/worker/gpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/async_utils.py": { + "path": "/vllm/v1/worker/gpu/async_utils.py", + "sha256": "77e17a4570ead2be30ae9b00888cf077a3b873018c12ca0549b853bfda02c1ba" + }, + "vllm/v1/worker/gpu/attn_utils.py": { + "path": "/vllm/v1/worker/gpu/attn_utils.py", + "sha256": "b9b81e59dda2720b1f9c434471381f879228832443e52756e469b4ad4905888f" + }, + "vllm/v1/worker/gpu/block_table.py": { + "path": "/vllm/v1/worker/gpu/block_table.py", + "sha256": "61c004315d5af7e7eae4e2a9e6be92ea82c520327690a7f55a73bb9ce95f520a" + }, + "vllm/v1/worker/gpu/buffer_utils.py": { + "path": "/vllm/v1/worker/gpu/buffer_utils.py", + "sha256": "6597f701a30261bf250e9ad5a29737264624a1caa20527aeea0dad630325b093" + }, + "vllm/v1/worker/gpu/cp_utils.py": { + "path": "/vllm/v1/worker/gpu/cp_utils.py", + "sha256": "456c1bb7e262d99ff555522a4f134e5a9b42aee23290be25455eaef36ee8eaaf" + }, + "vllm/v1/worker/gpu/cudagraph_utils.py": { + "path": "/vllm/v1/worker/gpu/cudagraph_utils.py", + "sha256": "6e9c042890603535e300a40df8ee159dbed1058a64a83ae50ff0329e332e05ff" + }, + "vllm/v1/worker/gpu/dp_utils.py": { + "path": "/vllm/v1/worker/gpu/dp_utils.py", + "sha256": "e26867bc89e6bfc933cabc5ed13e5dc7b8d2d3030118ca1ca64c8785dabc0fc1" + }, + "vllm/v1/worker/gpu/ec_connector.py": { + "path": "/vllm/v1/worker/gpu/ec_connector.py", + "sha256": "2afe6e641f4ae3eb3b8da336c74eaa7479bf617b27cfb39a1fcbe487686f0a08" + }, + "vllm/v1/worker/gpu/eplb_utils.py": { + "path": "/vllm/v1/worker/gpu/eplb_utils.py", + "sha256": "1829fac11464aed4649179b302df198de51b95d0589f4e56bea305a876a63e26" + }, + "vllm/v1/worker/gpu/input_batch.py": { + "path": "/vllm/v1/worker/gpu/input_batch.py", + "sha256": "d5dd956eb319bd69dd9e762047833d81ad40b21fce619fcb2133759e73620694" + }, + "vllm/v1/worker/gpu/kv_connector.py": { + "path": "/vllm/v1/worker/gpu/kv_connector.py", + "sha256": "b89a4333f1e552d86e1815674b59e9f1335f0f49c0a7b46082439076f62c6a81" + }, + "vllm/v1/worker/gpu/lora_utils.py": { + "path": "/vllm/v1/worker/gpu/lora_utils.py", + "sha256": "1e90eddd9ddb4ca55e574bb28e87ae3a6f6750175a62d373102426543f4ccd66" + }, + "vllm/v1/worker/gpu/metrics/__init__.py": { + "path": "/vllm/v1/worker/gpu/metrics/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/metrics/logits.py": { + "path": "/vllm/v1/worker/gpu/metrics/logits.py", + "sha256": "ea058d7510a077a55f8ac7e4c3d596508346244e908cb372865d7159f62edc89" + }, + "vllm/v1/worker/gpu/mm/__init__.py": { + "path": "/vllm/v1/worker/gpu/mm/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/mm/encoder_cache.py": { + "path": "/vllm/v1/worker/gpu/mm/encoder_cache.py", + "sha256": "89c500338fddbeee7c4fca978a3a7c4c566a03e848e399d303fbee3c80631cd2" + }, + "vllm/v1/worker/gpu/mm/encoder_runner.py": { + "path": "/vllm/v1/worker/gpu/mm/encoder_runner.py", + "sha256": "0981e352d70301b7154a217a48665ffe35f215d053ec5740c2515a3e1e11b4e6" + }, + "vllm/v1/worker/gpu/mm/lora.py": { + "path": "/vllm/v1/worker/gpu/mm/lora.py", + "sha256": "a3eddfad6ad64de276964240c28dc080888df4a56dd5eac18f89428f2cbb7a01" + }, + "vllm/v1/worker/gpu/mm/rope.py": { + "path": "/vllm/v1/worker/gpu/mm/rope.py", + "sha256": "0924375bcb367267e783b57dd2ad9de1189d97025ce4313baaa54f2911eaaf1e" + }, + "vllm/v1/worker/gpu/model_runner.py": { + "path": "/vllm/v1/worker/gpu/model_runner.py", + "sha256": "174c93db921c23cf0396eee4764be25b2bd2d4b6a06e9fa41ce3598b884ce8ce" + }, + "vllm/v1/worker/gpu/model_states/__init__.py": { + "path": "/vllm/v1/worker/gpu/model_states/__init__.py", + "sha256": "07815d0b788fc88185772f581bbf892a675259f9288375571f29887622f8d93c" + }, + "vllm/v1/worker/gpu/model_states/default.py": { + "path": "/vllm/v1/worker/gpu/model_states/default.py", + "sha256": "bb614f814780f052e869f9acf31dfbfa68718ee7dc6252eefa901b5730ee8a2a" + }, + "vllm/v1/worker/gpu/model_states/encoder_decoder.py": { + "path": "/vllm/v1/worker/gpu/model_states/encoder_decoder.py", + "sha256": "a5868059d8af672548b41d0e623e884320e6ed61e6aaca2d2828ff5be0356f2f" + }, + "vllm/v1/worker/gpu/model_states/encoder_only.py": { + "path": "/vllm/v1/worker/gpu/model_states/encoder_only.py", + "sha256": "84e96b55a2639e2a73fa4a0308acc89c8d053dc715481180b237e0196dcef99f" + }, + "vllm/v1/worker/gpu/model_states/interface.py": { + "path": "/vllm/v1/worker/gpu/model_states/interface.py", + "sha256": "5675b6fedc7403a9ab410b1e5565974e78fac23c42ab4253ae1da52d6e09b594" + }, + "vllm/v1/worker/gpu/model_states/mamba_hybrid.py": { + "path": "/vllm/v1/worker/gpu/model_states/mamba_hybrid.py", + "sha256": "573e130ac5587d4822fabf97adad1ad0fda02ff83c5e70df879a5bb175ae845c" + }, + "vllm/v1/worker/gpu/model_states/mm_pruning.py": { + "path": "/vllm/v1/worker/gpu/model_states/mm_pruning.py", + "sha256": "b150940b12ae76048f050a8eeb54d532bbdc530a18ffbf320ddeeb0cfaa90f93" + }, + "vllm/v1/worker/gpu/model_states/prompt_embeds.py": { + "path": "/vllm/v1/worker/gpu/model_states/prompt_embeds.py", + "sha256": "11f9e270925c2df6a505557605ac2b859bb145cf3420b0111e7482a1c544f9b1" + }, + "vllm/v1/worker/gpu/model_states/recoverssm.py": { + "path": "/vllm/v1/worker/gpu/model_states/recoverssm.py", + "sha256": "b4b660e62eaf33f4fe8271f83ed1fb6de6bc08f800a8073b27803e42fb29a645" + }, + "vllm/v1/worker/gpu/pcp_manager.py": { + "path": "/vllm/v1/worker/gpu/pcp_manager.py", + "sha256": "2d80df0ed5b18a2069f9d0689cb59923ffe324ba200fcafe242da23da3a6ddaa" + }, + "vllm/v1/worker/gpu/pool/__init__.py": { + "path": "/vllm/v1/worker/gpu/pool/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/pool/pooling_runner.py": { + "path": "/vllm/v1/worker/gpu/pool/pooling_runner.py", + "sha256": "f8463f7648cce0f3f29418a4d9fee61634ead760957cf236d06d61cf8cd986e7" + }, + "vllm/v1/worker/gpu/pp_utils.py": { + "path": "/vllm/v1/worker/gpu/pp_utils.py", + "sha256": "dadeef0bebf61d0ad44a28d06372208ec4e6389224d6017f412683b026bdbb5c" + }, + "vllm/v1/worker/gpu/sample/__init__.py": { + "path": "/vllm/v1/worker/gpu/sample/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/sample/bad_words.py": { + "path": "/vllm/v1/worker/gpu/sample/bad_words.py", + "sha256": "8d3cbd5613398260314d94739d8ee0e1ac0c22abf2f960f541d3c0d4e39d360b" + }, + "vllm/v1/worker/gpu/sample/batch_shard.py": { + "path": "/vllm/v1/worker/gpu/sample/batch_shard.py", + "sha256": "c30274a3a04e6a03e89be9cd7c62de602b1aba4d412f64540ab6201036de3928" + }, + "vllm/v1/worker/gpu/sample/gumbel.py": { + "path": "/vllm/v1/worker/gpu/sample/gumbel.py", + "sha256": "3ec1df510bdad13e8b0a457b5b67c98affdf6e57369e56cb471246cc8f40dd34" + }, + "vllm/v1/worker/gpu/sample/logit_bias.py": { + "path": "/vllm/v1/worker/gpu/sample/logit_bias.py", + "sha256": "9e80a3fe6f3c7474723408cfff52183f4585fdeedd9c2312843ee98d0b12724c" + }, + "vllm/v1/worker/gpu/sample/logprob.py": { + "path": "/vllm/v1/worker/gpu/sample/logprob.py", + "sha256": "f47479a818192acb6b297c79fa67a3b2f9820e3492a394d5adda777e9b7c832e" + }, + "vllm/v1/worker/gpu/sample/min_p.py": { + "path": "/vllm/v1/worker/gpu/sample/min_p.py", + "sha256": "4cb5e2f45e1ced6f9685283a7a5c8cfd7204d9a249822e866cfff756c7f04f62" + }, + "vllm/v1/worker/gpu/sample/output.py": { + "path": "/vllm/v1/worker/gpu/sample/output.py", + "sha256": "d6e298c0f197d487a8faaf7200f500fa83df1d7a4bbf4339cadd6a18008f7f9c" + }, + "vllm/v1/worker/gpu/sample/penalties.py": { + "path": "/vllm/v1/worker/gpu/sample/penalties.py", + "sha256": "46c29434caf5f415129ef4a9bb2b8d4f62d2765596e3e07f73ad2b198c7def1b" + }, + "vllm/v1/worker/gpu/sample/prompt_logprob.py": { + "path": "/vllm/v1/worker/gpu/sample/prompt_logprob.py", + "sha256": "4cf22d390e7bf59e44c458cff7180268db63e95d06af2f1e14d720a2d77c9663" + }, + "vllm/v1/worker/gpu/sample/sampler.py": { + "path": "/vllm/v1/worker/gpu/sample/sampler.py", + "sha256": "832c9945d201a1e730ff9b4b52076aa83bd4a5064e1e4cfea952cf84d4a8d1f0" + }, + "vllm/v1/worker/gpu/sample/states.py": { + "path": "/vllm/v1/worker/gpu/sample/states.py", + "sha256": "4e3671f93695ba5a48fad7d2d13beb231ac8741034904ed5a15d9f7b9b86662e" + }, + "vllm/v1/worker/gpu/sample/thinking_budget.py": { + "path": "/vllm/v1/worker/gpu/sample/thinking_budget.py", + "sha256": "020513e1d3406f367de6ad995a95055008fd0c28f2873647e8283c9870e22404" + }, + "vllm/v1/worker/gpu/sample/trace_replay.py": { + "path": "/vllm/v1/worker/gpu/sample/trace_replay.py", + "sha256": "d2a7d3b3b55379efabe4740a4b7f14030126dc11be36f6ea974164ce42316a50" + }, + "vllm/v1/worker/gpu/sample/watermark.py": { + "path": "/vllm/v1/worker/gpu/sample/watermark.py", + "sha256": "a3581458169dab9153eb09fd67218e0ee5585406537a9de80ad528ae62b030c0" + }, + "vllm/v1/worker/gpu/shutdown.py": { + "path": "/vllm/v1/worker/gpu/shutdown.py", + "sha256": "bb470f14b17c7e52571ef8938b2a9527e7c2846852ae8a3a94b69cd1c30aa4b1" + }, + "vllm/v1/worker/gpu/spec_decode/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/__init__.py", + "sha256": "1f1f84bfe6f4f5af3a7e21a7a8716ecf7b9013da1d03327668a3ee36afc24c32" + }, + "vllm/v1/worker/gpu/spec_decode/acceptance_estimator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/acceptance_estimator.py", + "sha256": "505b843bdd75928b03793b395b47b8be914bd7fe2a3351c8ec04339baeebb1c2" + }, + "vllm/v1/worker/gpu/spec_decode/adaptive_verification.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/adaptive_verification.py", + "sha256": "276b2fec56758a94c71b717f6786b8a6f126db2e20cf964350202feee61a0a39" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py", + "sha256": "13392ef0a9ed59eb9c2b2bad43d7c61beb212a8805849e46b5130c230275d0a5" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/speculator.py", + "sha256": "5b97f54e20ddf65b98e939832d050745f67ef43cfa145786da300f1a8322e3c6" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/cudagraph.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/cudagraph.py", + "sha256": "beab567ae2df6a2ba2cd92fe7ee452c6b959b8a7037a4b5f493993a1824619bb" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/speculator.py", + "sha256": "f9c100f42f9326e48eb84e89281897e859ba761943f54d593523555ccd98dc63" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/utils.py", + "sha256": "53d2c3ad474d290d2c6df027446bbd80ac7447684e5242ab2c3c5337d2abd383" + }, + "vllm/v1/worker/gpu/spec_decode/dflash2/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash2/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/dflash2/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash2/speculator.py", + "sha256": "b70043550938a1df9aecc85d8c8224c38c929ca34f68834572f6e723854d2027" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/speculator.py", + "sha256": "dcf4abdedbd2bddd0d76be198ccf5b4e467c46f645038c35fcab821491a35b03" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/utils.py", + "sha256": "86af2bf30604a184312e8f076097b91ecfec704f409f9d68d634b03d6b318070" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/eagle3_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/eagle3_utils.py", + "sha256": "201ee875fcc3d076a8fc1f3876dcbf85736b221a368555243a8987ff26a1674e" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/speculator.py", + "sha256": "746e318a4f266d75522ff7f3731ea9b4527b7b4824f71364d1a62184ea1f7b3d" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/utils.py", + "sha256": "94de6f55a1761f24f4aa1388cbc3b3763d4ab3ee53260330056ad31ce0b78236" + }, + "vllm/v1/worker/gpu/spec_decode/extract_hidden_states.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/extract_hidden_states.py", + "sha256": "93c4233be7b2d2290b33902ea9b3bb5274c11701830851d03967a22144536e2d" + }, + "vllm/v1/worker/gpu/spec_decode/gemma4/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/gemma4/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/gemma4/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/gemma4/speculator.py", + "sha256": "9991210d7babd2caf2cd10797ca8688543dedeafbc3b86bc7c979c1a6ae9f949" + }, + "vllm/v1/worker/gpu/spec_decode/mtp/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/mtp/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/mtp/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/mtp/speculator.py", + "sha256": "926d6c9ffdb368c971647911a60493820d056ce236fcae9d94a42fa2e006255d" + }, + "vllm/v1/worker/gpu/spec_decode/multi_module_mtp/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/multi_module_mtp/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/multi_module_mtp/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/multi_module_mtp/speculator.py", + "sha256": "d9d4735b9b33829332b0e845b6d3073b2f0436045ed693b25c6434f351644127" + }, + "vllm/v1/worker/gpu/spec_decode/rejection_sampler.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/rejection_sampler.py", + "sha256": "030db5bfca162cc1f305112f299de5d6d61c59d3ed0807fee46575441ca4086d" + }, + "vllm/v1/worker/gpu/spec_decode/rejection_sampler_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/rejection_sampler_utils.py", + "sha256": "214b61fa0abe88573beb779872c035b3954e5651a85bd438d99ee5905d3a62ec" + }, + "vllm/v1/worker/gpu/spec_decode/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/speculator.py", + "sha256": "3a1ab15bf8b20918852eb835fe9755046e99dcbac6ba6ca3d414949fc8bc695a" + }, + "vllm/v1/worker/gpu/spec_decode/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/utils.py", + "sha256": "282f2929eddae9ca7312269f799be07472334b6df9fd91878b5e839ec05e418c" + }, + "vllm/v1/worker/gpu/states.py": { + "path": "/vllm/v1/worker/gpu/states.py", + "sha256": "99418f5df43ca612ded72609fee011620b065b2cab2f249ccb387096bf4ae71a" + }, + "vllm/v1/worker/gpu/structured_outputs.py": { + "path": "/vllm/v1/worker/gpu/structured_outputs.py", + "sha256": "18a10532db7e66b55e334acacd1fd989ad6361adf31dd0de9a9a65e23db25951" + }, + "vllm/v1/worker/gpu/ubatch_utils.py": { + "path": "/vllm/v1/worker/gpu/ubatch_utils.py", + "sha256": "5092e2e58af0561c8dc12e62847cfc6dda9ca20dfbd33e7f0cd77a83fe87f7c5" + }, + "vllm/v1/worker/gpu/warmup.py": { + "path": "/vllm/v1/worker/gpu/warmup.py", + "sha256": "423ac32d58fe008c228cfa223e4fcebfcf87e3463a9dbdf80a083c0578d73723" + }, + "vllm/v1/worker/gpu_input_batch.py": { + "path": "/vllm/v1/worker/gpu_input_batch.py", + "sha256": "18cf455c9d0eea61cc581c7932f2e6cd09786914e82dd35eef1c1430da359a0f" + }, + "vllm/v1/worker/gpu_model_runner.py": { + "path": "/vllm/v1/worker/gpu_model_runner.py", + "sha256": "87c29d08c0bbf66993d8b984811e7325e35e6436242a773feb55ec88f16b2c51" + }, + "vllm/v1/worker/gpu_ubatch_wrapper.py": { + "path": "/vllm/v1/worker/gpu_ubatch_wrapper.py", + "sha256": "4233cfbe8c9884b042c4363890108f616483b694ebe9a6e69578dcf89c6dac5c" + }, + "vllm/v1/worker/gpu_worker.py": { + "path": "/vllm/v1/worker/gpu_worker.py", + "sha256": "6994436e4547c0996ab555b3e814e8ccea26b650dfc1b378b97d640745309347" + }, + "vllm/v1/worker/kv_connector_model_runner_mixin.py": { + "path": "/vllm/v1/worker/kv_connector_model_runner_mixin.py", + "sha256": "e1cc76d065a7e60aacddb190ae795a480b65cd02ba71a1fc699a02a85c1a3de2" + }, + "vllm/v1/worker/lora_model_runner_mixin.py": { + "path": "/vllm/v1/worker/lora_model_runner_mixin.py", + "sha256": "fef6092a15d8d37f6fa22495e6106e2e5280180908d61ce43d9ff5bf4eef3f2f" + }, + "vllm/v1/worker/mamba_utils.py": { + "path": "/vllm/v1/worker/mamba_utils.py", + "sha256": "23fdaa4e8f63ee8f938eaa1a2b39f803cb04fa6ecd69789563254b1a0691413a" + }, + "vllm/v1/worker/mm_encoder_model_runner.py": { + "path": "/vllm/v1/worker/mm_encoder_model_runner.py", + "sha256": "780c41be84ad022205c21c1decb6bb8d5afb03bc7be120c1f7df03b710acc3d7" + }, + "vllm/v1/worker/sentinel/__init__.py": { + "path": "/vllm/v1/worker/sentinel/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/sentinel/gpu_worker_sentinel.py": { + "path": "/vllm/v1/worker/sentinel/gpu_worker_sentinel.py", + "sha256": "3959b8619d052c5dd247815074e03ec21ec9b43cc424ff2d296abc19b227b852" + }, + "vllm/v1/worker/startup_plan.py": { + "path": "/vllm/v1/worker/startup_plan.py", + "sha256": "84bcbb4f7a9fd7c8d10c9c895aadd9673d44c767b9132368d11eb5e017afe86b" + }, + "vllm/v1/worker/ubatch_utils.py": { + "path": "/vllm/v1/worker/ubatch_utils.py", + "sha256": "b34dce551b5195c414e6a3a997c75961cc7a17f24c7c980487fe3d3e2ba7a798" + }, + "vllm/v1/worker/ubatching.py": { + "path": "/vllm/v1/worker/ubatching.py", + "sha256": "40391241c564feb5f16c77898ae6ae152ed6e71a4682e2a406387785d8de02d7" + }, + "vllm/v1/worker/utils.py": { + "path": "/vllm/v1/worker/utils.py", + "sha256": "0ca3ec6bf4d20076145b7fe64e564962adebedc8f75a856b517ba0b2f2d77acf" + }, + "vllm/v1/worker/worker_base.py": { + "path": "/vllm/v1/worker/worker_base.py", + "sha256": "4a1a5266b912fe97991d8dc89d92b923990da9f6cb4b817d00d52e9c0d26dd7c" + }, + "vllm/v1/worker/workspace.py": { + "path": "/vllm/v1/worker/workspace.py", + "sha256": "d21c08167d1d0d1c0cddaa80453a53a0b4dec5d81b5a537c94a21324344976b3" + }, + "vllm/v1/worker/xpu_model_runner.py": { + "path": "/vllm/v1/worker/xpu_model_runner.py", + "sha256": "07fa0390d28f2b8c3c3c0019eb9c3b126e2397aea268ba47c889f06b423deb23" + }, + "vllm/v1/worker/xpu_worker.py": { + "path": "/vllm/v1/worker/xpu_worker.py", + "sha256": "711b56432506b58041cd86e71320c3960413f7bd61061990b66488421d81cfc3" + } + }, + "prefix": "", + "pth": { + "/__editable__.megatron_core-0.16.0rc0.pth": "d55c9b64480b34aae3d4d31e7706b93391c969dec6e0498e50963b03445a57b0", + "/__editable__.rl_kernel-0.1.0.pth": "1454c4987b35762a0d189d4e901c5d077fde62a1944fbaabecea230e57f3923a", + "/__editable__.vime-0.3.2.pth": "77eec5d06d628cb952e65edd813ca88d8db67ccc785083e1b7b29011b92bec4f", + "/distutils-precedence.pth": "2638ce9e2500e572a5e0de7faed6661eb569d1b696fcba07b0dd223da5f5d224", + "/qwen3_next_cuda_runtime.pth": "e0d3ab57dd3ff4f5d55fcf76e83c549cc00b3c813e6f717c540d5ded79fa2f49", + "/qwen3_next_megatron_source.pth": "8556ac057538e82856cb76cbbc954f58312a3f45373daec3eec826031cfd2709", + "/__editable__.rl_kernel-0.1.0.pth": "1454c4987b35762a0d189d4e901c5d077fde62a1944fbaabecea230e57f3923a", + "/distutils-precedence.pth": "2638ce9e2500e572a5e0de7faed6661eb569d1b696fcba07b0dd223da5f5d224", + "/nvidia_cutlass_dsl_packages.pth": "cc710b99ddb3d76361a70461461d274212a979d00c381d821fce5bb3ad9cf246" + }, + "pyvenv_cfg_sha256": "48579f2c6d35c3d535c2690d7d426587c4b8e92021463f0266b38d35dfbbb834", + "sources": { + "/Megatron-LM-training": { + "patch_sha256": "f66035f12501aa1d08e8884e0dea5a22d59825d717aeda73c3e83876e3efd79f", + "path": "/Megatron-LM-training", + "tree": "731fc44a368d6cac8c6171a29d5c687ff0d95bd1" + }, + "/vime": { + "patch_sha256": "66949839d4c18329444f4f9f6dcd702b53ce1b94e9aa15ed111f28743bfaa4b9", + "path": "/vime", + "tree": "f5174e67dbcdaef983eecd45f215fef2d8429dd0" + } + }, + "version": "3.12.14 | packaged by Anaconda, Inc. | (main, Aug 27 2026, 14:46:43) [GCC 14.3.0]" + }, + "sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca" + }, + "memory": { + "limits": { + "/memory.limit_in_bytes": "9223372036854771712", + "/memory.limit_in_bytes": "9223372036854771712", + "/memory.limit_in_bytes": "9223372036854771712" + }, + "cgroup_bytes": null, + "declared_bytes": 549755813888, + "effective_bytes": 549755813888, + "available_bytes": 2082522755072 + }, + "gpu_uuids": [ + "dcc07b03-a36e-3e74-6bac-083b8fbb1ef2", + "7ed20e71-9918-90c0-e6e8-5b63679fc495", + "4e306531-0253-eb59-707b-cb5bd20b2690", + "4159b731-34fc-94af-0054-0b53d5ee025c" + ], + "execution_gpus": 4 +} diff --git a/docs/usage/evidence/qwen3-next-batch-invariance-b200/layers/layers.json b/docs/usage/evidence/qwen3-next-batch-invariance-b200/layers/layers.json new file mode 100644 index 000000000..d992b1b31 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-batch-invariance-b200/layers/layers.json @@ -0,0 +1,457 @@ +{ + "schema_version": 1, + "status": "passed", + "phase": "complete", + "scope": "qwen3_next_layer_and_scheduler_gates", + "full_model_l2": "not_evaluated", + "identity": { + "source_commit": "759755e08f8a801d617a273fe23b55831f8de194", + "source_tree": "d8da35c889c3ffe57d8569fd9d2c51b063de16ce", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "checkpoint": "", + "weight_version": "baseline", + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "architecture_layers": 48, + "weights_dtype": "bfloat16", + "recurrent_state_dtype": "float32" + }, + "requirements_sha256": "b1513a1392b9f5d668d697ac529541f4aee0efa18d6d2e0b6909a6987f50f762", + "gates": { + "gdn": { + "pid": 249245, + "exit_code": 0, + "log": "/attempts/0/gdn.log", + "gpu_release_verified": true, + "ranks": { + "0": { + "path": "/attempts/0/gdn/rank-0.json", + "sha256": "f647e940b3aebc345c2c360aef1b58475c2fe7bbb7b88d4fce6045e41c1a8a3c" + }, + "1": { + "path": "/attempts/0/gdn/rank-1.json", + "sha256": "e79964f7f879bbbb13a2a92e46326c4c8629b9991e0f1b0b8bc2bcc7757821ab" + }, + "2": { + "path": "/attempts/0/gdn/rank-2.json", + "sha256": "d46af4484264c1d2ab508c98e1c1e0a14db1f6f5437551d20ca6f4ec016af800" + }, + "3": { + "path": "/attempts/0/gdn/rank-3.json", + "sha256": "974def6eb872f8bd9c79fda967db47e6a5b97dd9d61fd1073f99aeeaa6025d24" + } + } + }, + "attention": { + "pid": 251095, + "exit_code": 0, + "log": "/attempts/0/attention.log", + "gpu_release_verified": true, + "ranks": { + "0": { + "path": "/attempts/0/attention/rank-0.json", + "sha256": "89e3021c6fe0d41510d4e62132b4ae938b3338579bde2057c3bbf44977ea2d9d" + }, + "1": { + "path": "/attempts/0/attention/rank-1.json", + "sha256": "e507b71d6dc11ba64f7ac73427fea4926db6b945ca013def22f640f2fb78f6ff" + }, + "2": { + "path": "/attempts/0/attention/rank-2.json", + "sha256": "e25b3e97bdc7e0689ca3e08c2d7a69f956d9502605a9dcd0bd89c67569325eea" + }, + "3": { + "path": "/attempts/0/attention/rank-3.json", + "sha256": "5da3bd623239a1fd880cce9c9691b314761da5bfeac21cd74bdf617619419482" + } + } + }, + "moe": { + "pid": 252036, + "exit_code": 0, + "log": "/attempts/0/moe.log", + "gpu_release_verified": true, + "ranks": { + "0": { + "path": "/attempts/0/moe/rank-0.json", + "sha256": "aa6795591c8b3ba626b66ca7455a7841172715b2be276f4552c90411f0db7623" + }, + "1": { + "path": "/attempts/0/moe/rank-1.json", + "sha256": "c6b3c74ba81473b8f617f7d3d550a92aac659b21f60320bd855e897c143c0aaf" + }, + "2": { + "path": "/attempts/0/moe/rank-2.json", + "sha256": "d8681690f8175185619b5c548028cc0171fdf7bb7767344abfeff9a2ab3e2ef3" + }, + "3": { + "path": "/attempts/0/moe/rank-3.json", + "sha256": "95c2618b47cc0b90049036698f8ba9ddc19a56609ae6f73b7ffda94a0503cf01" + } + } + }, + "adapters": { + "pid": 253975, + "exit_code": 0, + "log": "/attempts/0/adapters.log", + "gpu_release_verified": true, + "ranks": { + "0": { + "path": "/attempts/0/adapters/rank-0.json", + "sha256": "c489d209679af14beab0e224a650413fb90e0294f04f428f101f24725b10b60e" + }, + "1": { + "path": "/attempts/0/adapters/rank-1.json", + "sha256": "9b39fc683c48dd56e83cd618f1ee5f6e14d35e029e6bc023080617923201a478" + }, + "2": { + "path": "/attempts/0/adapters/rank-2.json", + "sha256": "beb980510b3395758b0796e403cf66722c60bbd3c3d67fa9a9fc6ae86b0987ac" + }, + "3": { + "path": "/attempts/0/adapters/rank-3.json", + "sha256": "087613115e0e17f2f1dd0f60477822ddf8e39950833b19864405823cd5d13c9d" + } + } + }, + "heads": { + "pid": 256923, + "exit_code": 0, + "log": "/attempts/0/heads.log", + "gpu_release_verified": true, + "ranks": { + "0": { + "path": "/attempts/0/heads/rank-0.json", + "sha256": "a47bc4866edf46cce30d6dd49bb747c3c62b64a3c1ba1dcdd34ff6b337afbdb7" + }, + "1": { + "path": "/attempts/0/heads/rank-1.json", + "sha256": "e7addbd294ee25875d22edc7f3c28e59762ceef47da6760140c617c1a6d3e536" + }, + "2": { + "path": "/attempts/0/heads/rank-2.json", + "sha256": "b8364fff462d2851b9f1e4491953bf7cf3cc5e70194689fb9477876c9458ba19" + }, + "3": { + "path": "/attempts/0/heads/rank-3.json", + "sha256": "cc7f8eaf22dacacfbe6b57ec0b378fc710b185779545734889b6b2af2a5163b5" + } + } + } + }, + "provider_binary": { + "path": "/attempts/0/provider-binary.json", + "sha256": "69675741f6c0d9acecfa93cd842d68d7105a577773124e1f03c85a2006cd2339" + }, + "scheduler": { + "path": "/attempts/0/scheduler-report.json", + "sha256": "5fd9efb662fa950e6e7dfc1693b9c88b5abbdf246a46c378fc249b8f99792097" + } +} diff --git a/docs/usage/evidence/qwen3-next-batch-invariance-b200/layers/operators.json b/docs/usage/evidence/qwen3-next-batch-invariance-b200/layers/operators.json new file mode 100644 index 000000000..a6e914e66 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-batch-invariance-b200/layers/operators.json @@ -0,0 +1,304 @@ +{ + "scope": "qwen3_next_operators_only", + "status": "passed", + "suite": "all", + "diagnostic_only": false, + "full_model_l2": "not_evaluated", + "git_commit": "759755e08f8a801d617a273fe23b55831f8de194", + "git_dirty": false, + "versions": { + "torch": "2.13.0", + "vllm": "0.30.0", + "transformers": "5.17.0", + "triton": "3.7.1" + }, + "mandatory_case_ids": [ + "tests/check_qwen3_next_attention.py::test_d256_backward_with_cached_prefix_matches_float64_formula", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[1024]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[256]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[64]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[8]", + "tests/check_qwen3_next_attention.py::test_d256_input_device_guard_and_nondefault_stream", + "tests/check_qwen3_next_attention.py::test_native_backward_rejects_malformed_probability_and_gradient_buffers", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[0]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[2]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_target_inputs_do_not_depend_on_companions", + "tests/check_qwen3_next_batch_invariance.py::test_triton_chunked_prefill_is_batch_invariant", + "tests/check_qwen3_next_conv_bridge.py::test_chunked_and_reordered_sequences_match", + "tests/check_qwen3_next_conv_bridge.py::test_empty_sequence_preserves_cache_and_gradients", + "tests/check_qwen3_next_conv_bridge.py::test_response_gradient_reaches_prompt_and_convolution_weight", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths0]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths1]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths2]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-4]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[1]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[4]", + "tests/check_qwen3_next_core_matrix.py::test_variable_lengths_empty_and_mixed_step_match_independent_sequences", + "tests/check_qwen3_next_forward.py::test_combine_has_fixed_route_order_and_differentiable_weights", + "tests/check_qwen3_next_forward.py::test_full_vocabulary_logprob_entropy_modes_and_gradient", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_fail_closed_on_the_tensor_descriptor_path", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[128]", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[512]", + "tests/check_qwen3_next_forward.py::test_logprob_nan_rejected_before_comparison", + "tests/check_qwen3_next_forward.py::test_moe_vjp_matches_independent_double_formula", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[1024-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[128-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-16]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-256]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-3072]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-37984]", + "tests/check_qwen3_next_forward.py::test_qwen_moe_actual_tp4_shapes_and_independent_training_forward", + "tests/check_qwen3_next_forward.py::test_route_weights_are_batch_invariant", + "tests/check_qwen3_next_forward.py::test_shared_linear_vjp_and_empty_tokens", + "tests/check_qwen3_next_forward.py::test_stable_route_tie_boundary_and_router_gradient", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_backward_matches_recomputed_recurrence_vjp", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_forward_is_provider_exact_and_does_not_mutate_inputs", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_keeps_prompt_state_gradient_through_response", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[False]", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[True]", + "tests/check_qwen3_next_gdn_bridge.py::test_initial_state_vjp_matches_provider_directional_difference", + "tests/check_qwen3_next_gdn_sequence.py::test_1024_token_chunk_continuation_is_bitwise_exact", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad0]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad1]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad2]", + "tests/check_qwen3_next_gdn_sequence.py::test_chunk_boundary_retains_prompt_and_initial_state_gradients", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths0]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths1]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths2]", + "tests/check_qwen3_next_gdn_sequence.py::test_reserved_and_duplicate_slots_are_rejected", + "tests/check_qwen3_next_norm_providers.py::test_custom_op_has_distinct_native_and_cuda_paths", + "tests/check_qwen3_next_norm_providers.py::test_gdn_decode_provider_env_defaults_are_recorded", + "tests/check_qwen3_next_norm_providers.py::test_our_gated_op_is_batch_invariant", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_cuda]", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_native]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots0]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots2]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots3]", + "tests/check_qwen3_next_shared_core.py::test_independent_training_forward_matches_inference_and_retains_gradients", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[1024]", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[8]", + "tests/check_qwen3_next_shared_core.py::test_unimplemented_provider_profile_is_rejected", + "tests/test_qwen3_next_norm.py::test_bad_weight_shape_raises", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[16]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[1]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[2]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[32]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[48]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[64]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[8]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[128]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[2048]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_with_padding", + "tests/test_qwen3_next_norm.py::test_call_matches_forward", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[128]", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[2048]", + "tests/test_qwen3_next_norm.py::test_cuda_default_offset_preserves_plain_convention", + "tests/test_qwen3_next_norm.py::test_cuda_gated_backward_matches_autograd_golden", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_matches_golden_within_contract", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_bad_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_mismatched_gate", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_backward_uses_the_sigmoid_derivative", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_swish_is_an_alias_for_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_unit_weight_is_plain_norm_times_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_weight_offset_is_applied_in_fp32", + "tests/test_qwen3_next_norm.py::test_cuda_gated_wrapper_rejects_equal_numel_wrong_shape", + "tests/test_qwen3_next_norm.py::test_cuda_gated_zero_gate_zeroes_output", + "tests/test_qwen3_next_norm.py::test_cuda_offset_equals_explicit_fp32_weight", + "tests/test_qwen3_next_norm.py::test_cuda_offset_is_not_folded_through_bfloat16", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_backward_is_offset_aware", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_within_tolerance_of_golden", + "tests/test_qwen3_next_norm.py::test_deterministic_repeat", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype0]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype1]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype2]", + "tests/test_qwen3_next_norm.py::test_eps_inside_sqrt", + "tests/test_qwen3_next_norm.py::test_gated_batch_invariance_slice", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedHFOp]", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedOp]", + "tests/test_qwen3_next_norm.py::test_gated_conventions_diverge_in_low_precision", + "tests/test_qwen3_next_norm.py::test_gated_cuda_op_rejects_bad_activation_at_construction", + "tests/test_qwen3_next_norm.py::test_gated_extension_handles_empty_batch_and_nondefault_stream", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[dy_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[gate_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[rstd_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_shape]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_matches_hf_formula_fp32", + "tests/test_qwen3_next_norm.py::test_gated_shape_mismatch_raises", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_strict_matches_vllm_formula_fp32", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[128]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[2048]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_offset_applied_in_fp32_not_folded_into_bf16", + "tests/test_qwen3_next_norm.py::test_op_batch_invariance_on_device", + "tests/test_qwen3_next_norm.py::test_plain_reference_is_unchanged_by_the_offset_plumbing", + "tests/test_qwen3_next_norm.py::test_weight_offset_is_one", + "tests/test_qwen3_next_norm.py::test_zero_centred_cuda_constructor_rejects_missing_extension", + "tests/test_qwen3_next_norm.py::test_zero_centred_op_inherits_the_plain_reference", + "tests/test_qwen3_next_norm.py::test_zero_weight_is_identity_scaling" + ], + "case_ids_sha256": "694c931b65f9cfa5db963f2eca6d11bd309546c824a1df52f9da2ab128e83e0f", + "pytest_exit_code": 0, + "provider_tests": { + "tests": 233, + "failures": 0, + "errors": 0, + "skipped": 0 + }, + "norm_gates": { + "qwen3_next_rms_norm-forward.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + }, + "qwen3_next_rms_norm-gradient.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + }, + "rms_norm_gated-forward.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + }, + "rms_norm_gated-gradient.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + } + } +} diff --git a/docs/usage/evidence/qwen3-next-batch-invariance-b200/layers/provider_binary.json b/docs/usage/evidence/qwen3-next-batch-invariance-b200/layers/provider_binary.json new file mode 100644 index 000000000..34ba0d006 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-batch-invariance-b200/layers/provider_binary.json @@ -0,0 +1,13 @@ +{ + "schema_version": 1, + "source_tree": "d8da35c889c3ffe57d8569fd9d2c51b063de16ce", + "actual": { + "module": "rl_engine._C", + "path": "/source/rl_engine/_C.cpython-312-x86_64-linux-gnu.so", + "sha256": "762ea57b45978be9217a7d0ecb850287d08c38144d6e9f136a26e63df7aff053" + }, + "archive": { + "path": "/attempts/0/provider-binary.so", + "sha256": "762ea57b45978be9217a7d0ecb850287d08c38144d6e9f136a26e63df7aff053" + } +} diff --git a/docs/usage/evidence/qwen3-next-batch-invariance-b200/layers/result.json b/docs/usage/evidence/qwen3-next-batch-invariance-b200/layers/result.json new file mode 100644 index 000000000..4d6ab93a3 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-batch-invariance-b200/layers/result.json @@ -0,0 +1,775 @@ +{ + "contract_version": 4, + "source_tree": "d8da35c889c3ffe57d8569fd9d2c51b063de16ce", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "cuda_identity": { + "home": "", + "nvcc_sha256": "b8e2347d9d7fcadf8812a27324d515de99d033d3e48611811ece7e66d7895f8a" + }, + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "operator_requirements": { + "suite": "all", + "case_ids": [ + "tests/check_qwen3_next_attention.py::test_d256_backward_with_cached_prefix_matches_float64_formula", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[1024]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[256]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[64]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[8]", + "tests/check_qwen3_next_attention.py::test_d256_input_device_guard_and_nondefault_stream", + "tests/check_qwen3_next_attention.py::test_native_backward_rejects_malformed_probability_and_gradient_buffers", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[0]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[2]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_target_inputs_do_not_depend_on_companions", + "tests/check_qwen3_next_batch_invariance.py::test_triton_chunked_prefill_is_batch_invariant", + "tests/check_qwen3_next_conv_bridge.py::test_chunked_and_reordered_sequences_match", + "tests/check_qwen3_next_conv_bridge.py::test_empty_sequence_preserves_cache_and_gradients", + "tests/check_qwen3_next_conv_bridge.py::test_response_gradient_reaches_prompt_and_convolution_weight", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths0]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths1]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths2]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-4]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[1]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[4]", + "tests/check_qwen3_next_core_matrix.py::test_variable_lengths_empty_and_mixed_step_match_independent_sequences", + "tests/check_qwen3_next_forward.py::test_combine_has_fixed_route_order_and_differentiable_weights", + "tests/check_qwen3_next_forward.py::test_full_vocabulary_logprob_entropy_modes_and_gradient", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_fail_closed_on_the_tensor_descriptor_path", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[128]", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[512]", + "tests/check_qwen3_next_forward.py::test_logprob_nan_rejected_before_comparison", + "tests/check_qwen3_next_forward.py::test_moe_vjp_matches_independent_double_formula", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[1024-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[128-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-16]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-256]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-3072]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-37984]", + "tests/check_qwen3_next_forward.py::test_qwen_moe_actual_tp4_shapes_and_independent_training_forward", + "tests/check_qwen3_next_forward.py::test_route_weights_are_batch_invariant", + "tests/check_qwen3_next_forward.py::test_shared_linear_vjp_and_empty_tokens", + "tests/check_qwen3_next_forward.py::test_stable_route_tie_boundary_and_router_gradient", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_backward_matches_recomputed_recurrence_vjp", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_forward_is_provider_exact_and_does_not_mutate_inputs", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_keeps_prompt_state_gradient_through_response", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[False]", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[True]", + "tests/check_qwen3_next_gdn_bridge.py::test_initial_state_vjp_matches_provider_directional_difference", + "tests/check_qwen3_next_gdn_sequence.py::test_1024_token_chunk_continuation_is_bitwise_exact", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad0]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad1]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad2]", + "tests/check_qwen3_next_gdn_sequence.py::test_chunk_boundary_retains_prompt_and_initial_state_gradients", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths0]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths1]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths2]", + "tests/check_qwen3_next_gdn_sequence.py::test_reserved_and_duplicate_slots_are_rejected", + "tests/check_qwen3_next_norm_providers.py::test_custom_op_has_distinct_native_and_cuda_paths", + "tests/check_qwen3_next_norm_providers.py::test_gdn_decode_provider_env_defaults_are_recorded", + "tests/check_qwen3_next_norm_providers.py::test_our_gated_op_is_batch_invariant", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_cuda]", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_native]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots0]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots2]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots3]", + "tests/check_qwen3_next_shared_core.py::test_independent_training_forward_matches_inference_and_retains_gradients", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[1024]", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[8]", + "tests/check_qwen3_next_shared_core.py::test_unimplemented_provider_profile_is_rejected", + "tests/test_qwen3_next_norm.py::test_bad_weight_shape_raises", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[16]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[1]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[2]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[32]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[48]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[64]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[8]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[128]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[2048]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_with_padding", + "tests/test_qwen3_next_norm.py::test_call_matches_forward", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[128]", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[2048]", + "tests/test_qwen3_next_norm.py::test_cuda_default_offset_preserves_plain_convention", + "tests/test_qwen3_next_norm.py::test_cuda_gated_backward_matches_autograd_golden", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_matches_golden_within_contract", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_bad_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_mismatched_gate", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_backward_uses_the_sigmoid_derivative", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_swish_is_an_alias_for_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_unit_weight_is_plain_norm_times_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_weight_offset_is_applied_in_fp32", + "tests/test_qwen3_next_norm.py::test_cuda_gated_wrapper_rejects_equal_numel_wrong_shape", + "tests/test_qwen3_next_norm.py::test_cuda_gated_zero_gate_zeroes_output", + "tests/test_qwen3_next_norm.py::test_cuda_offset_equals_explicit_fp32_weight", + "tests/test_qwen3_next_norm.py::test_cuda_offset_is_not_folded_through_bfloat16", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_backward_is_offset_aware", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_within_tolerance_of_golden", + "tests/test_qwen3_next_norm.py::test_deterministic_repeat", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype0]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype1]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype2]", + "tests/test_qwen3_next_norm.py::test_eps_inside_sqrt", + "tests/test_qwen3_next_norm.py::test_gated_batch_invariance_slice", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedHFOp]", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedOp]", + "tests/test_qwen3_next_norm.py::test_gated_conventions_diverge_in_low_precision", + "tests/test_qwen3_next_norm.py::test_gated_cuda_op_rejects_bad_activation_at_construction", + "tests/test_qwen3_next_norm.py::test_gated_extension_handles_empty_batch_and_nondefault_stream", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[dy_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[gate_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[rstd_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_shape]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_matches_hf_formula_fp32", + "tests/test_qwen3_next_norm.py::test_gated_shape_mismatch_raises", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_strict_matches_vllm_formula_fp32", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[128]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[2048]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_offset_applied_in_fp32_not_folded_into_bf16", + "tests/test_qwen3_next_norm.py::test_op_batch_invariance_on_device", + "tests/test_qwen3_next_norm.py::test_plain_reference_is_unchanged_by_the_offset_plumbing", + "tests/test_qwen3_next_norm.py::test_weight_offset_is_one", + "tests/test_qwen3_next_norm.py::test_zero_centred_cuda_constructor_rejects_missing_extension", + "tests/test_qwen3_next_norm.py::test_zero_centred_op_inherits_the_plain_reference", + "tests/test_qwen3_next_norm.py::test_zero_weight_is_identity_scaling" + ], + "case_ids_sha256": "694c931b65f9cfa5db963f2eca6d11bd309546c824a1df52f9da2ab128e83e0f", + "norm_gates": [ + "qwen3_next_rms_norm-forward.json", + "qwen3_next_rms_norm-gradient.json", + "rms_norm_gated-forward.json", + "rms_norm_gated-gradient.json" + ] + }, + "layer_requirements": { + "schema_version": 1, + "gates": { + "gdn": { + "script": "scripts/qwen3_next_tp_gdn_check.py", + "output_option": "--output", + "scope": "tp4_gdn_layer0", + "groups": { + "cases": [ + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "prompt-gradient", + "replicated-norm-gradient", + "hf-load-export" + ] + }, + "script_sha256": "cc4338893f90af004c51c20fc67d1a9a3f4bf8d26775277f72671c02983e4df5" + }, + "attention": { + "script": "scripts/qwen3_next_tp_attention_check.py", + "output_option": "--output", + "scope": "tp4_full_attention_layer3", + "groups": { + "attention.cases": [ + "hf-load-export", + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "batch4-varlen-reorder", + "sixteen-token-decode", + "prompt-gradient", + "kv-pair-gradient", + "qk-norm-gradient" + ] + }, + "script_sha256": "d27d43efb05415a8ef5892c3c2238a2b9744a4821f5466faf46c6510e6e01bec" + }, + "moe": { + "script": "scripts/qwen3_next_tp_moe_check.py", + "output_option": "--output", + "scope": "tp4_moe_block_layer0", + "groups": { + "moe.cases": [ + "hf-load-export-all512experts", + "routes-replicated-8", + "full-chunk-reorder-8", + "routes-replicated-64", + "full-chunk-reorder-64", + "routes-replicated-256", + "full-chunk-reorder-256", + "routes-replicated-1024", + "full-chunk-reorder-1024", + "training-forward", + "all-parameter-gradient", + "replicated-router-gradient" + ] + }, + "script_sha256": "d5c1bbbb82e408b65871b0cb1638d7a6cf8cfe07f0a3315a657b7dc232d544be" + }, + "adapters": { + "script": "scripts/qwen3_next_adapter_check.py", + "output_option": "--out", + "scope": "gdn_engine_adapter_component", + "groups": { + "cases": [ + "batch1-length8", + "batch1-length64", + "batch1-length256", + "batch1-length1024", + "batch4-length8", + "batch4-length64", + "batch4-length256", + "batch4-length1024", + "mixed-prefill-decode16-reorder" + ] + }, + "fields": { + "prompt_gradient": "passed", + "hf_conv_roundtrip": "passed", + "batch_invariance_capability_registered": false + }, + "script_sha256": "3ce45bb317237c1a06533116d65fb77c2a23b6f503ae46406ede543036eb0f20" + }, + "heads": { + "script": "scripts/qwen3_next_tp_head_check.py", + "output_option": "--output", + "scope": "tp4_embedding_lm_head_only", + "groups": { + "cases": [ + "hf-embedding-roundtrip", + "hf-lm-head-roundtrip", + "replicated-norm-gradient", + "nonzero-finite-embedding-head-gradient", + "embedding-repeat-100", + "batch-invariant-prompt8", + "batch-invariant-prompt64", + "batch-invariant-prompt256", + "batch-invariant-prompt1024", + "logprob-original-and-promoted-logits", + "entropy-interface" + ] + }, + "script_sha256": "0504185d21a75405c8e994bc57b016cf4ec357d8b16e7430772c11934f2af876" + } + }, + "scheduler_case_ids": [ + "p0008-b1-full", + "p0008-b1-chunked", + "p0008-b4-full", + "p0008-b4-chunked", + "p0064-b1-full", + "p0064-b1-chunked", + "p0064-b4-full", + "p0064-b4-chunked", + "p0256-b1-full", + "p0256-b1-chunked", + "p0256-b4-full", + "p0256-b4-chunked", + "p1024-b1-full", + "p1024-b1-chunked", + "p1024-b4-full", + "p1024-b4-chunked" + ], + "registry_sha256": "e3949a750cb27c1897a000f3b023f912629906612ae8949c1575d0acc36df5ec", + "case_ids_per_rank": [ + "adapters/cases/batch1-length1024", + "adapters/cases/batch1-length256", + "adapters/cases/batch1-length64", + "adapters/cases/batch1-length8", + "adapters/cases/batch4-length1024", + "adapters/cases/batch4-length256", + "adapters/cases/batch4-length64", + "adapters/cases/batch4-length8", + "adapters/cases/mixed-prefill-decode16-reorder", + "attention/attention.cases/batch4-varlen-reorder", + "attention/attention.cases/full-chunk-1024", + "attention/attention.cases/full-chunk-256", + "attention/attention.cases/full-chunk-64", + "attention/attention.cases/full-chunk-8", + "attention/attention.cases/hf-load-export", + "attention/attention.cases/kv-pair-gradient", + "attention/attention.cases/prompt-gradient", + "attention/attention.cases/qk-norm-gradient", + "attention/attention.cases/sixteen-token-decode", + "gdn/cases/full-chunk-1024", + "gdn/cases/full-chunk-256", + "gdn/cases/full-chunk-64", + "gdn/cases/full-chunk-8", + "gdn/cases/hf-load-export", + "gdn/cases/prompt-gradient", + "gdn/cases/replicated-norm-gradient", + "heads/cases/batch-invariant-prompt1024", + "heads/cases/batch-invariant-prompt256", + "heads/cases/batch-invariant-prompt64", + "heads/cases/batch-invariant-prompt8", + "heads/cases/embedding-repeat-100", + "heads/cases/entropy-interface", + "heads/cases/hf-embedding-roundtrip", + "heads/cases/hf-lm-head-roundtrip", + "heads/cases/logprob-original-and-promoted-logits", + "heads/cases/nonzero-finite-embedding-head-gradient", + "heads/cases/replicated-norm-gradient", + "moe/moe.cases/all-parameter-gradient", + "moe/moe.cases/full-chunk-reorder-1024", + "moe/moe.cases/full-chunk-reorder-256", + "moe/moe.cases/full-chunk-reorder-64", + "moe/moe.cases/full-chunk-reorder-8", + "moe/moe.cases/hf-load-export-all512experts", + "moe/moe.cases/replicated-router-gradient", + "moe/moe.cases/routes-replicated-1024", + "moe/moe.cases/routes-replicated-256", + "moe/moe.cases/routes-replicated-64", + "moe/moe.cases/routes-replicated-8", + "moe/moe.cases/training-forward" + ], + "case_ids_sha256": "be74417dfbd6031ba27978d06d04bb15daaab2aeb57d132c7e0d41176b28b46e" + }, + "source_commit": "759755e08f8a801d617a273fe23b55831f8de194", + "run_id": "20261009T052932Z-layers-759755e0-cb5e9870", + "stage": "layers", + "suite": "all", + "execution_id": "cb5e9870d45442a3b93cdf8cee8ab4db", + "attempt": "0", + "status": "passed", + "phase": "complete", + "scope": "qwen3_next_layer_and_scheduler_gates", + "full_model_l2": "not_evaluated", + "evidence": { + "operators": { + "path": "attempts/0/operators.json", + "sha256": "bb96af8122ba0c79d94ba00fc8f67c18d1d5cb1d3806a4c372ec0f0f19ab52c5" + }, + "environment": { + "path": "attempts/0/environment.json", + "sha256": "f2495d1225e64c81904fb96b41456314bbff5c7cd985b5e4aaf9ce2725cd3f78" + }, + "layers": { + "path": "attempts/0/layers.json", + "sha256": "3ab14412123e093409ab5e419565d5f190ee069b5a21e421e74f7ad2530ab610" + }, + "checkpoint": { + "path": "attempts/0/weight-verification.json", + "sha256": "7ceb9dab2ce8c0a2551a970819f9f0adbb538f04c4124982458a42f997d7c934" + }, + "provider_binary": { + "path": "attempts/0/provider-binary.json", + "sha256": "69675741f6c0d9acecfa93cd842d68d7105a577773124e1f03c85a2006cd2339" + } + } +} diff --git a/docs/usage/evidence/qwen3-next-batch-invariance-b200/layers/run.json b/docs/usage/evidence/qwen3-next-batch-invariance-b200/layers/run.json new file mode 100644 index 000000000..ae5126282 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-batch-invariance-b200/layers/run.json @@ -0,0 +1,5248 @@ +{ + "run_id": "20261009T052932Z-layers-759755e0-cb5e9870", + "execution_id": "cb5e9870d45442a3b93cdf8cee8ab4db", + "contract_version": 4, + "suite": "all", + "execution_gpus": 4, + "source_tree": "d8da35c889c3ffe57d8569fd9d2c51b063de16ce", + "stage": "layers", + "source_commit": "759755e08f8a801d617a273fe23b55831f8de194", + "source": "/source", + "python": "", + "cuda_home": "", + "checkpoint": "", + "memory": "512G", + "previous": "", + "status": "prepared", + "full_model_l2": "not_evaluated", + "environment": { + "identity": { + "base_prefix": "/miniconda3/envs/rlkernel", + "binary": "/python3.12", + "binary_sha256": "6a1eb3ffc29f3a6b0ece607b016b4cfa5ca3ac57b34f17ed3266b404f78d2729", + "build_tools": { + "ninja": { + "path": "/miniconda3/envs/rlkernel/bin/ninja", + "sha256": "08639e194fffa7f08b259fc4abfa4803aff66b64de52549cee42ec527d55cea6" + } + }, + "distributions": [ + { + "direct_url": null, + "metadata_sha256": "6f1038270be40f9b8c0bcf391c627e7d7f41ccdd19aa192d6eac1dbfc3b19abc", + "name": "GitPython", + "version": "3.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "3f71971502087521f123c9daa26bc12d31d3466738b567390b8602acad3be22a", + "name": "Jinja2", + "version": "3.1.6" + }, + { + "direct_url": null, + "metadata_sha256": "818fb343b7b6b99a32771bf4813521ae6440b4c7579b3ae46e32dd02da0afeee", + "name": "Markdown", + "version": "3.11" + }, + { + "direct_url": null, + "metadata_sha256": "dc1ee42cf8ecfeee0ab60b15b21d291833e0732548efcb7bb5b3564dca3e5bf7", + "name": "MarkupSafe", + "version": "3.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "de7389b142450a0014234286b0876f328439b823c355c73d0aed41fd67ec208c", + "name": "PyJWT", + "version": "2.15.1" + }, + { + "direct_url": null, + "metadata_sha256": "ffcad4415cafb22b8b536a61595e9ee13438b51d31b0763c1b273ce3bc58e840", + "name": "PyYAML", + "version": "6.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "8562d701cc52d9cafbb418942b0e072fc087ed8ddcf35cd10224c1b2ed8bdd91", + "name": "Pygments", + "version": "2.21.0" + }, + { + "direct_url": null, + "metadata_sha256": "b6c25fcfdcc495edf248a10ca4ad28327ef2ed6047a6ec5c6346e121414c7f21", + "name": "Werkzeug", + "version": "3.1.9" + }, + { + "direct_url": null, + "metadata_sha256": "55c400d24c71b581d9c0992f71df6047cf6c878bebe61a7d45d6e02dc0e4c510", + "name": "absl-py", + "version": "2.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "13db521f90a6a882027b2388eaa2ebf252945f9c2adb7e7e371da18239da4df0", + "name": "accelerate", + "version": "1.15.0" + }, + { + "direct_url": null, + "metadata_sha256": "86fe44e38e67872dd895c729044942ba2c2f934ae439a899fb83a186206b7fd4", + "name": "agent-detector", + "version": "2.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "afe11fe9f5aa54e734cdd51659bed8c89dc6bcd5aef0ad96f2d20149c8de5456", + "name": "aiohappyeyeballs", + "version": "2.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "570b307bc0b53fbbd3ed2ce0b7eca6bbf2fa73bf75e24a480f1034d8c0b832bf", + "name": "aiohttp", + "version": "3.14.3" + }, + { + "direct_url": null, + "metadata_sha256": "44b7f8e14c4770793e747fad50c9e0a6ee7357651d878554f192d94768dc14a8", + "name": "aiohttp-cors", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "648813a44a9ae0ab2f20ee86d2404dcc38e3f9e80c63316cf6e536735df14e54", + "name": "aiosignal", + "version": "1.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "f6a3f6668bacef7f73a2c19ccb2be910b2363d1731c4725cb04364d99e24935a", + "name": "annotated-doc", + "version": "0.0.5" + }, + { + "direct_url": null, + "metadata_sha256": "fc6d752cde6a6a4bff03474386de750e130b75da3c7815ee909f45b51fea98c8", + "name": "annotated-types", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "4e89d670a4b20029da30e5a9e8ebcbc844deff9c44209552bafd5537249c8b9e", + "name": "anthropic", + "version": "1.9.0" + }, + { + "direct_url": null, + "metadata_sha256": "b5a6f00800956387fcddab1fe1b5aa8502c249b86cfb16d58ed700f282f60142", + "name": "antlr4-python3-runtime", + "version": "4.9.3" + }, + { + "direct_url": null, + "metadata_sha256": "a6008defa9492cd08250217b134782cad1db4580e1d7ddf69cc2a2a48cea24e0", + "name": "anyio", + "version": "4.15.1" + }, + { + "direct_url": null, + "metadata_sha256": "7877c64ce8957237363f2df313819bb07f50752df016d14c5a5a99bec10f5deb", + "name": "apache-tvm-ffi", + "version": "0.1.11" + }, + { + "direct_url": null, + "metadata_sha256": "3543ca8f0e072c00ab111b20eba99ce86dbf93ada28988775bc2677284b3c07a", + "name": "astor", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "d4b328c09c024fe1e4d788a9c7715ad726095131b815cd35fd933268226f6269", + "name": "attrs", + "version": "26.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "4850c4d696a5e2a2ecbb3dd792b060acc1de79e09800669b0b9fc3a22c055e6d", + "name": "av", + "version": "19.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "863ff92208d0a02dabfa008bfe91846a5c401ded301e5687dca7dc63c911865f", + "name": "babel", + "version": "2.18.0" + }, + { + "direct_url": null, + "metadata_sha256": "f32e6df3197f05202e586624d95c5e217003d80cee655c165d533102f628df21", + "name": "backrefs", + "version": "8.0" + }, + { + "direct_url": null, + "metadata_sha256": "905c362f655fbc6d37a24686efc2b3bfbd3123b8ee5a443a43f6750d87455e90", + "name": "blake3", + "version": "1.0.10" + }, + { + "direct_url": null, + "metadata_sha256": "07c85682b6aefd5c9b48890d306c1604311902295704892ede48e5a83219a8d3", + "name": "blobfile", + "version": "3.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "2d582941a7081625a35f35a0c4a2e80f7737312e29c38e5fdb6fc08f9c113077", + "name": "bracex", + "version": "3.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "3b60c55bae0d0340c3a3fd918635bbfa3087579da66e0fd7f6be7a3782c0da3d", + "name": "cachetools", + "version": "7.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "5d11a6878d5bc3f22290281a19ef7b36daa95c910780950608b95cd788c7e12e", + "name": "cbor2", + "version": "6.1.4" + }, + { + "direct_url": null, + "metadata_sha256": "362c9942c48051f168ed2b9f2146266b7792d3c05e164cd6afc3f3b65884fdc9", + "name": "certifi", + "version": "2026.7.22" + }, + { + "direct_url": null, + "metadata_sha256": "b4abf1bcf1c1d8e0272d8007fc974499ea59e5f2a5b98af3c78a5e67515a9d87", + "name": "cffi", + "version": "2.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "766120f13c177446f51929a4d201104bc935b6d5a2a176cd6716edce757d3d95", + "name": "cfgv", + "version": "3.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "610e9a9d03ce837ffe6e42be5e02e70087f73863f7350bf7bb7f0511edcc5ec0", + "name": "charset-normalizer", + "version": "3.5.2" + }, + { + "direct_url": null, + "metadata_sha256": "7ad836b3147c9702546d9c28b4fa5be23b24445439db5d0d2a58d17281c84daa", + "name": "click", + "version": "8.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "4c5f00599ebcbf11d337e48a72784d256ca3d704fa9e9f5daadd60065e6776b7", + "name": "cloudpickle", + "version": "3.1.2" + }, + { + "direct_url": null, + "metadata_sha256": "a0970189e3ab7a596d6902d5f61f93b414f138f03d3cf19029145657bfceb382", + "name": "cmake", + "version": "4.1.2" + }, + { + "direct_url": null, + "metadata_sha256": "94a6ebf9718e55f254a43ce0d2f04e0d6d44e7141b6f3144a84feb6519a77bfd", + "name": "colorama", + "version": "0.4.6" + }, + { + "direct_url": null, + "metadata_sha256": "ca8ec227f406d970a645ec482b20619128dd34b9cf71159cc24e27db461a2711", + "name": "colorful", + "version": "0.5.8" + }, + { + "direct_url": null, + "metadata_sha256": "bbaa51b7e4d8f142bd075d01257c0572c0c844796d51426e35c8096a13e8da76", + "name": "compressed-tensors", + "version": "0.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "6063d8ff7ebc458d63a4332853d7ababf4ee2b86336362c8d2b12be6e998eb6b", + "name": "connectrpc", + "version": "0.11.1" + }, + { + "direct_url": null, + "metadata_sha256": "ac5f4b5a5f68080bd9c3fe77399fe8a1bff2ee5923c49db1df544dd054cbf15b", + "name": "cryptography", + "version": "50.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "f41d2f6b4616accca2f5e1dd47aa9e8937c28076cde698226d93e727751f3099", + "name": "cuda-bindings", + "version": "13.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "e5ca6ed34c687c6f4a4d157ad0a2cf06ec0316fe8c4c0ddeb666ad76dd6f30f4", + "name": "cuda-core", + "version": "1.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "89baadd9da23dce9990481519544115615ba3cbd2d1a41e09feea7756fffb378", + "name": "cuda-pathfinder", + "version": "1.8.2" + }, + { + "direct_url": null, + "metadata_sha256": "1ab914b9a57ca601df2e3cfe9608427b15d8afb78029076ace5d1caf9fd45f08", + "name": "cuda-python", + "version": "13.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "73d97a5eb578223b4895ef4f234574d14219cef9999ff7d0e92a3d0dd057bd3f", + "name": "cuda-tile", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "ae6f957fe66ed63081d1d83ee6e8838f3a0af2c6fce1223629d0dd6264565ead", + "name": "cuda-toolkit", + "version": "13.0.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "1f8e0ae51ad5feea63f58ed2e24f3da6f23ed548043235a14f7623d961dd9b64", + "name": "datasets", + "version": "5.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "153f4a4d6ff03dbe5c8ad7fe54bc2e7b989a4947b70f7aa77fbf652b394f2a2e", + "name": "depyf", + "version": "0.20.0" + }, + { + "direct_url": null, + "metadata_sha256": "ee09fc752d7271aac93079cfd63409957dc6b536c1ffd9355a01bf7297e72aa6", + "name": "detect-installer", + "version": "0.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "a7feab2c4f69fd5f85e5a3cb495a7f1870a6bf8199dcee5339e8118f7acbdc09", + "name": "dill", + "version": "0.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "fef3fde661fe30ba7bd1d78841a797136b2b3461705bb4eb92dc54f8308bbaae", + "name": "distlib", + "version": "0.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "fef3fde661fe30ba7bd1d78841a797136b2b3461705bb4eb92dc54f8308bbaae", + "name": "distlib", + "version": "0.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "a3ca2e39abe76c4a33d5fe4a2a84375ec9f25cdfdb7e1d8ea406bd6f1603205c", + "name": "dnspython", + "version": "2.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "92a07daad5e6ff461199de14e845d9b376e309ef916ce5379f3c9cd4e3b1623f", + "name": "dockerfile-parse", + "version": "2.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "5b566b25f0cbe4955d0b16844a7cc6d2002caa3bde2dfda7f301fd8870cbaa56", + "name": "docstring_parser", + "version": "0.18.0" + }, + { + "direct_url": null, + "metadata_sha256": "5a1080b5768c6c591e1c4f9c9812cafa808781b9eeb198043bf185e22d4a1613", + "name": "e2b", + "version": "2.51.0" + }, + { + "direct_url": null, + "metadata_sha256": "0a63979e0b946e16238e4339e60d9c1eb5a7ce3ea93dae78b5da9c65a6190540", + "name": "einops", + "version": "0.8.2" + }, + { + "direct_url": null, + "metadata_sha256": "16cbe67a57558f1d4bfdbc22a454434ba301750c57a62b1d3f5361c9e5cddc00", + "name": "email-validator", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "0617ddb55b90b42ddc9398dc7e91d61fe928a2504939f76526dc15b22d238caa", + "name": "fastapi", + "version": "0.136.3" + }, + { + "direct_url": null, + "metadata_sha256": "ddd82b9666c21988e234d623e2575e1b89fd4133260eeab43fc9a7c074f7024a", + "name": "fastapi-cli", + "version": "0.0.32" + }, + { + "direct_url": null, + "metadata_sha256": "611602e834d42e10433155ff5f5581358d732fa6b6f6f7820a8f79e74b1ce1f9", + "name": "fastapi-cloud-cli", + "version": "0.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "794524e4a9659bda6043721d848d028ea49996085a33326094fbaaa3f6e6b895", + "name": "fastar", + "version": "0.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "711401d36e60e10e35beb4d0f1bb42bf0c4d86339ae52f32b9aa4a4d790530dd", + "name": "fastsafetensors", + "version": "0.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "efaea9742e348c4c4bdcc6f616a33cc5aa3ae926494a72a46690b7da2f08ed5c", + "name": "filelock", + "version": "4.0.7" + }, + { + "direct_url": null, + "metadata_sha256": "99bd6c3f10781d3d2d350f2c3c9fc4765b55f25de8a6d6dd1f71501802d1255e", + "name": "fla-core", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "0a6ef979b75295cee2b5293ad4942b0cf2682e9e38680203064e0b70249c1a96", + "name": "flash-linear-attention", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "76b70a11ca82ea4606b529e7a8658cb3fe71412afa46f2ed57101dd91ba27558", + "name": "flashinfer-python", + "version": "0.6.18.post1" + }, + { + "direct_url": null, + "metadata_sha256": "ba8ff415192b5cbb90efce046e2271a00c8184afc362d8b47fbbc84d5e558b05", + "name": "frozenlist", + "version": "1.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "e7712831c80eb13b08fb7f7cc33988a8f24654af9eba7c6f5f943b2636e4306a", + "name": "fsspec", + "version": "2026.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "025de85c794878d0caa737869307447595f514ebf9599eacb5b1a501bae479b6", + "name": "fsspec", + "version": "2026.9.0" + }, + { + "direct_url": null, + "metadata_sha256": "ca94883bdeaa3740b45b6994443b445fd67c6e4a8064ac3bf9d92d2a5221eee8", + "name": "ghp-import", + "version": "2.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "a7e90983562a035cf767baa63d8c32bc37e1de7cad71ac7b6b2bc70a95bba4eb", + "name": "gitdb", + "version": "4.0.12" + }, + { + "direct_url": null, + "metadata_sha256": "dd96143ec79178bef685c1f5c0a58a87a66d003b421e605de65697308321d518", + "name": "google-api-core", + "version": "2.40.0" + }, + { + "direct_url": null, + "metadata_sha256": "0735d57088a83df2355e16843107fb0112abe2178fc5bb8132947a7ad962aa41", + "name": "google-auth", + "version": "2.59.1" + }, + { + "direct_url": null, + "metadata_sha256": "2f3aa9d9500d329560440e6a5a152e420aad5f5bbb23701f45b740be721784a1", + "name": "googleapis-common-protos", + "version": "1.75.5" + }, + { + "direct_url": null, + "metadata_sha256": "06d74ab04fdc03fad368868907f0d10e7d9f397aab58d58965c0b78ffaec34cc", + "name": "griffelib", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "7ee1c179e2c68a62968308b2f96f4f3469176ee3ac8bdb494ac80188d4d41271", + "name": "grpcio", + "version": "1.84.0" + }, + { + "direct_url": null, + "metadata_sha256": "04cf3a4a91575850f386f4fcfdedd8e7fbfba08feff038fbc1296d1e854db2dd", + "name": "h11", + "version": "0.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "b954a6ba4739c0cc878bb8ea27ea7c7154a48bb4b7c06dba9e9cf880cf0ec930", + "name": "h2", + "version": "4.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "6f0d7bf86e75d0bda1ceccc82367c0145ad0ec522c4d4f51bb454f467faadcc9", + "name": "hf-xet", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "f991b847550cf8225f69562902b5ccb591b2ce9a08fe07ef6e6d701bdb4694a7", + "name": "hpack", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "314d194165c4700034c1c67cee847d549a6d7091374c71f2cef0186ec56a3eb9", + "name": "httpcore", + "version": "1.0.9" + }, + { + "direct_url": null, + "metadata_sha256": "aed9767360bed1bcbda71e3b1a3c996603f86558bc77a1693ee3d09973d20cad", + "name": "httpcore2", + "version": "2.13.1" + }, + { + "direct_url": null, + "metadata_sha256": "8fa3bf3510c35e2eea9f523a1cace7120079cf51d76c4acea97de95806aaa14a", + "name": "httptools", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "3bf4804c215d111b6a4702cf9000021ab39807d1ed3207dd011b14b2843b2d14", + "name": "httpx", + "version": "0.28.1" + }, + { + "direct_url": null, + "metadata_sha256": "d11dd50813b8914bd9455e8b2b591171cd2b1618883943153afadc8bb9224678", + "name": "httpx2", + "version": "2.13.1" + }, + { + "direct_url": null, + "metadata_sha256": "43b119c34ad2b2aacc032a1a6a8feb142fdb5ca407a3519325d74dd53d8904df", + "name": "huggingface_hub", + "version": "1.33.0" + }, + { + "direct_url": null, + "metadata_sha256": "9ce850d5a6b775e5ef4a335f907e579a878e058213121b6eec567781ea68c585", + "name": "humming-kernels", + "version": "0.1.12" + }, + { + "direct_url": null, + "metadata_sha256": "67aa4f6717d82446a51ce350e7c4769eba0c4a22d2f428255cddd9d24b11a914", + "name": "hyperframe", + "version": "6.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd9511ede42f63b995c3f71944f908cb8f014048b63ecc1c8d420525a3354b59", + "name": "identify", + "version": "2.6.20" + }, + { + "direct_url": null, + "metadata_sha256": "af3c3a62bb5d82d6a43454684e0b1dedde27a21ea90eacfb1bed9814619f06d0", + "name": "idna", + "version": "3.20" + }, + { + "direct_url": null, + "metadata_sha256": "cf71393f3d079ce2e859384573e65aaacd1709bef700701f629df32398b598f0", + "name": "ijson", + "version": "3.5.1" + }, + { + "direct_url": null, + "metadata_sha256": "9305763e93d03df0e36516b1125fa046a6ebe37d44589e200e0593cf4bdfd980", + "name": "importlib_metadata", + "version": "9.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "32860c3c19b2e91f6cb5bd83400b5870cda051bc74a5a08822c8c666af0990db", + "name": "iniconfig", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "560faabb3d45d779e445a74e7e806a786f95f2200fa06d979603b7f0ee1cfb39", + "name": "instanttensor", + "version": "0.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "f6fc1f0d389e4245fc2a1a0fdfee09422e56200cb6f94659668456997ff4f7a9", + "name": "interegular", + "version": "0.3.3" + }, + { + "direct_url": null, + "metadata_sha256": "d10f300731197a4829b77f0c883bb3cf8a37ae8c76a302e095fa95d6427706d0", + "name": "jiter", + "version": "0.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "5b0c8d4b4c535a2432fb206223d774509b6e20af374c6a4b6f98bf72a7de6702", + "name": "jmespath", + "version": "1.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "6c4032c2e74273452cd77399af2ee85198f49c22da897983f26d2ed6f787c4e8", + "name": "jsonschema", + "version": "4.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "aaa6cd66f423729e8da397c9d533b7d731f6b25f3d6371b9338c36bdb9be74a0", + "name": "jsonschema-specifications", + "version": "2025.9.1" + }, + { + "direct_url": null, + "metadata_sha256": "f7c0687c032593106a2e5a3c241cf8043e7e2c222bddb0022b4cb2bf5de67115", + "name": "lark", + "version": "1.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "4511c6b04efc57a5f5333edc1f5f48b9f5412c3923d4bc19b715bdf47977511c", + "name": "linkify-it-py", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "be929870f6ecae18a819c56118f1101f3076e25ac6a4843ca6f4707ebd1e87c6", + "name": "llguidance", + "version": "1.7.6" + }, + { + "direct_url": null, + "metadata_sha256": "cf2b87669bead3e76ec54207f3354c13f73b50c32fcd13c8d627084b3379139e", + "name": "llvmlite", + "version": "0.47.0" + }, + { + "direct_url": null, + "metadata_sha256": "0a416d79c5543d94d2b18807626293d4f47655d1d22724c7ae296e413078aaba", + "name": "lm-format-enforcer", + "version": "0.11.3" + }, + { + "direct_url": null, + "metadata_sha256": "16bc1f59e34fd2a6633bd395276052eacd2c777b2cf72781e76b203f013a8fac", + "name": "loguru", + "version": "0.7.3" + }, + { + "direct_url": null, + "metadata_sha256": "5216d5acfd039a7b581a826186309594b228d37d2c8d56864124ea666689fe4e", + "name": "lxml", + "version": "6.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "f59d772b35315a928672bfcccfb89d82c0aac672c5275c048f7a93b79015bcea", + "name": "markdown-it-py", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "b137367ef0056711cbf5e53015df9168cab80373104e7899b1c0263a21d9c99c", + "name": "mcp", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "38e0b9edaae09e58cd1461fc961ced22672038a697930bedef153a74befb3de1", + "name": "mcp-types", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "799f49685865fd9cc8915fdb92a33e102eeeffad562b03b4aeffb6f422b771c1", + "name": "mdit-py-plugins", + "version": "0.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "481f9cbe08596c6eaba6343e0efa1b13b2362c30dce0610f7c08523f1d98388d", + "name": "mdurl", + "version": "0.1.2" + }, + { + "direct_url": "{\"dir_info\": {\"editable\": true}, \"url\": \"file:///Megatron-LM-training\"}", + "metadata_sha256": "2876c0c760bbfc93bd7d737bf0db2866a937308a7c1707c3a2bb59d4795986ff", + "name": "megatron-core", + "version": "0.16.0rc0" + }, + { + "direct_url": null, + "metadata_sha256": "a6e34d488c879f57ce042bec38f8864ba3ea7d6ecf0ab757fc88fe8dc0a22f26", + "name": "memray", + "version": "1.20.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd26d80dc9676b1fb8c894355bd525fbe7f49a6a86a555c72e9ec6d927247c33", + "name": "mergedeep", + "version": "1.3.4" + }, + { + "direct_url": null, + "metadata_sha256": "dd1b3b89e88d1c65a26e6e72dd075eabbc220bfb138769ec8b64578ee911795c", + "name": "mistral_common", + "version": "1.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "4859847a9f6321daf8849cf7fd1542ff430db6563a2abf9ac0d62a5b21bd951d", + "name": "mkdocs", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "1729fc31479f2582486cdc85397417659dd3b2fb3f920553de66cfe59d5f0b3e", + "name": "mkdocs-awesome-nav", + "version": "3.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "88b4b7b7c0aba5547befdedaf515c8df4867361daf55ff60b72578464d72dcbe", + "name": "mkdocs-get-deps", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "ad33bb33fb16b1f69689c4682550e97232154e367e2c8c8aee9dad0f10d269ce", + "name": "mkdocs-git-revision-date-localized-plugin", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "ed69fbfb9ac00c10c5a383a12ff9d2b9919ae184e408554434199211643d6040", + "name": "mkdocs-material", + "version": "9.7.7" + }, + { + "direct_url": null, + "metadata_sha256": "d1c549b61701148b97f8246bc924b2840e504b37b0ce7a27e78ddf81261e5363", + "name": "mkdocs-material-extensions", + "version": "1.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "4ad6171f3bf6812e4de90670ff0089d445093d4fe1d05d55f17b96a4a192a816", + "name": "ml_dtypes", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "4ad6171f3bf6812e4de90670ff0089d445093d4fe1d05d55f17b96a4a192a816", + "name": "ml_dtypes", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "b0dbdfa30ab6b1ce637a794899c9e43019182b6d1ab2d07b90f647f7331eba6b", + "name": "model-hosting-container-standards", + "version": "0.1.16" + }, + { + "direct_url": null, + "metadata_sha256": "95424470e481cfa8d18b30963b6de3aafe16614b1ea0414e184a008571dde84f", + "name": "mpmath", + "version": "1.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "eb184d83489401903615ce8a78d98d5b933dec0f7246811d396a529915fe797c", + "name": "msgpack", + "version": "1.2.3" + }, + { + "direct_url": null, + "metadata_sha256": "520006303d6a0e859970b83f7d452196e2e8f6dab08f6dcf1ba5823c1230025f", + "name": "msgspec", + "version": "0.22.0" + }, + { + "direct_url": null, + "metadata_sha256": "010d2fe039006070a711a476b171b7b7da5c29ccad3c4eecd77ef3711b07c2d0", + "name": "multidict", + "version": "6.9.1" + }, + { + "direct_url": null, + "metadata_sha256": "235634cc7ebda45f8a84dfdb1b9b35ac1a77a1888b34650c3a616d23e4a7e93f", + "name": "multiprocess", + "version": "0.70.19" + }, + { + "direct_url": null, + "metadata_sha256": "7c545b4b3e5e83d3fde41352272c10cb9deeaba5b7138fbf24383e952af8822e", + "name": "natsort", + "version": "8.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "311ee8cdaeaf9f11acf51cda9c3b5b191f76ce9d98bc3418164c3189bbc37a08", + "name": "nccl4py", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "66360539217852c3b44b37f409eade7e1559baf018bb363bacb2aa3a9759b203", + "name": "networkx", + "version": "3.7" + }, + { + "direct_url": null, + "metadata_sha256": "e8b0b1746808b87816c47e4531780ded7f246bed9575a89e8b40200aa81e9a13", + "name": "ninja", + "version": "1.13.2" + }, + { + "direct_url": null, + "metadata_sha256": "77c1117f0dbc41560ddc6e6b37b542fb4e88afcd4ef82ec06593e5bbd5f37121", + "name": "nodeenv", + "version": "1.11.0" + }, + { + "direct_url": null, + "metadata_sha256": "9af629898406c9eaa69897fe09220dc483270cdba89f6b20bf0165cdf0e1668e", + "name": "numba", + "version": "0.65.0" + }, + { + "direct_url": null, + "metadata_sha256": "0c7281a81cf76e40b27c1385ffd8a215d7227adc219f177ce807ead9e91994a5", + "name": "numpy", + "version": "2.3.5" + }, + { + "direct_url": null, + "metadata_sha256": "0c7281a81cf76e40b27c1385ffd8a215d7227adc219f177ce807ead9e91994a5", + "name": "numpy", + "version": "2.3.5" + }, + { + "direct_url": null, + "metadata_sha256": "bab990ced4537ce74ef5961ca933c4c6fd604fd09a5827a4a428c55bcb0be35b", + "name": "nvdlfw_inspect", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "10f6595146332d35f7f15a000e08b5c81432528c5d026470c1d03f0c1399fb70", + "name": "nvidia-cublas", + "version": "13.1.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "58e933b4ac8e49f098b16ab7480d03bd792afc3d1db10d0aacbdcc2c62e48fa3", + "name": "nvidia-cuda-cccl", + "version": "13.3.4.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "baac937970681d41aa0c3708b3d55d73f8d29e70aceaac0e71fe6d1548e94a09", + "name": "nvidia-cuda-crt", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "8d51e5c76ef5707b0b80d5ec9a791c0f11a480ab721820cf100a3cc566017eef", + "name": "nvidia-cuda-cupti", + "version": "13.0.85" + }, + { + "direct_url": null, + "metadata_sha256": "724bf56e61ddef5d4c2482ff64103a973b911b110b668acaea5373f6c83c1c5c", + "name": "nvidia-cuda-nvcc", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "c54801dbd815d534519a761f1f328325aa0f1d1f1659aa969fa74e7a2c76eee9", + "name": "nvidia-cuda-nvdisasm", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "af51f248363020b9fdfd2743704e901bf3d19a1a1ce1fe44fb98ba148bfc0157", + "name": "nvidia-cuda-nvrtc", + "version": "13.0.88" + }, + { + "direct_url": null, + "metadata_sha256": "055f7fc69a5a2159de82cd0718da02c8852e81c8a71ebb117b8e799badd7167e", + "name": "nvidia-cuda-runtime", + "version": "13.0.96" + }, + { + "direct_url": null, + "metadata_sha256": "df18686dbdb3074ca375a1d6c623a04102fd348950c67a721397349c6d4f0477", + "name": "nvidia-cudnn-cu13", + "version": "9.20.0.48" + }, + { + "direct_url": null, + "metadata_sha256": "abd0ca3f67af19a4d383ff2a012ae0090d4731c6492fd47236615308a50b3981", + "name": "nvidia-cudnn-frontend", + "version": "1.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "4a78545d424d0c5038353f7046a8ae40ceaf312045d71399eac9511f5fc15434", + "name": "nvidia-cufft", + "version": "12.0.0.61" + }, + { + "direct_url": null, + "metadata_sha256": "e49b909195c03ddbe203729d9b31dd88e3f207368333d1909c67c6b130a0c696", + "name": "nvidia-cufile", + "version": "1.15.1.6" + }, + { + "direct_url": null, + "metadata_sha256": "bb15a754c6be32c23aaac13c1cfa7a8ce53d92bc26652ec3b609f7a5cce3e7d1", + "name": "nvidia-curand", + "version": "10.4.0.35" + }, + { + "direct_url": null, + "metadata_sha256": "0dd58f677811eac04901a793740932e5a2a8fff2f5453aa6351614eb18391bb6", + "name": "nvidia-cusolver", + "version": "12.0.4.66" + }, + { + "direct_url": null, + "metadata_sha256": "8aeb284782ef6883095a5d1c110e221cad023a99afcfd5cdb4969a25e146d562", + "name": "nvidia-cusparse", + "version": "12.6.3.3" + }, + { + "direct_url": null, + "metadata_sha256": "09555246122896eaca3b8313eecfca4b339fefd3b597874cb9fe3bf29dab38c9", + "name": "nvidia-cusparselt-cu13", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "ac77bac79fbfb0c52ac6e2e5abc936b1e127be2192f0cbc27b00be3125fa86ae", + "name": "nvidia-cutlass-dsl", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "1ec968ec7c4083f7fe4e1fb8384c7e9b853a81491fef9f4cb1cf755961aaedf6", + "name": "nvidia-cutlass-dsl-libs-base", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "cc6f3846cd820013eaa6e2665c493d70c607be6ce7349b939eb4742888470585", + "name": "nvidia-cutlass-dsl-libs-core", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "2357d0df2d0d17c0b16663b8a89df53f751b19721f66821fd88fa78112c08e55", + "name": "nvidia-cutlass-dsl-libs-cu12", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "244590c25662dcf777b1daae97a858afe1a1aec62e5e6678b217007a459ab552", + "name": "nvidia-cutlass-dsl-libs-cu13", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "c3a25ada01f57418c1b897406c3abab18834e6adc573ab7b060620c453afb6db", + "name": "nvidia-ml-py", + "version": "13.615.71" + }, + { + "direct_url": null, + "metadata_sha256": "56baad4e7f699902b03b17580933f7bd50b6ea97b7df9d7e807750973da7529c", + "name": "nvidia-nccl-cu13", + "version": "2.29.7" + }, + { + "direct_url": null, + "metadata_sha256": "98810ef0ab8badc369e6a46a038f8ee9f412c0c753fb5ad580544f23a0aa7962", + "name": "nvidia-nvjitlink", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "b0f54ee21909d19640a58e05da755c91763eb5725f544fd0d4b84b2f5f94deba", + "name": "nvidia-nvshmem-cu13", + "version": "3.4.5" + }, + { + "direct_url": null, + "metadata_sha256": "06dc1a593c7e8b8c3f29184228c83f8f7ef57787ad91f3e5bcae1d238dd3092a", + "name": "nvidia-nvtx", + "version": "13.0.85" + }, + { + "direct_url": null, + "metadata_sha256": "32ee63450a437b6a6ed227ff6549144aa596197a322993521ec7af826ebd413e", + "name": "nvidia-nvvm", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "32c2efdcd2c673b3b7f35ca9c2cccefaad36f1f0a920648a13cad85f6a5767b2", + "name": "nvtx", + "version": "0.2.15" + }, + { + "direct_url": null, + "metadata_sha256": "3419d80e114a2c19fa9bd3582939a3942f19673055707ba6ca2ca489d58b41e0", + "name": "omegaconf", + "version": "2.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "28971076ce9c279d4b889496b046d55a1e05b02fb9851ceb717e9a10df799572", + "name": "onnx", + "version": "1.23.1" + }, + { + "direct_url": null, + "metadata_sha256": "1246f5a4d8295907a42e809ed9173ede2510ec9d260d2168989d126564897fa5", + "name": "onnx-ir", + "version": "1.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "e14643636835759700dff286f949c5ec34e7eac7ac47f44096414f0e0f1c3101", + "name": "onnxscript", + "version": "0.7.2" + }, + { + "direct_url": null, + "metadata_sha256": "00f847e99939207bd70dfd806428f6b20a3d01074b59325e4c76149a2e19be26", + "name": "openai", + "version": "3.22.1" + }, + { + "direct_url": null, + "metadata_sha256": "598d3ad5a22a14a7c4f1d218b43e345f32b0ba094b753467bae8a3f708fd48cb", + "name": "openai-agents", + "version": "0.22.3" + }, + { + "direct_url": null, + "metadata_sha256": "5a0afcb1ce845e05da12beb1767f5d2749bbc9e9050718c6b9fa3c225713c9eb", + "name": "openai-harmony", + "version": "0.0.8" + }, + { + "direct_url": null, + "metadata_sha256": "e86a6b6fcbbe152805f782c57df321002892e163019574877e9829272e25eb4e", + "name": "opencensus", + "version": "0.11.4" + }, + { + "direct_url": null, + "metadata_sha256": "53d669c8bd3d32d3275153b454e515ca5cc6dec92fae3a98309b5a2b19fe6d2d", + "name": "opencensus-context", + "version": "0.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "19778b6d66b0e45bf73e11fa37a208949d5b393aef914627394d5601455546a6", + "name": "opencv-python-headless", + "version": "5.0.0.93" + }, + { + "direct_url": null, + "metadata_sha256": "19778b6d66b0e45bf73e11fa37a208949d5b393aef914627394d5601455546a6", + "name": "opencv-python-headless", + "version": "5.0.0.93" + }, + { + "direct_url": null, + "metadata_sha256": "a3f5434fa7c80f7f7abc82173da639c8e9c59d30b4027182645562bd3d2f4f97", + "name": "opentelemetry-api", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "8611977ea596e4827874582e86250618444e1c718229dddfc16e5ea437ce5fcb", + "name": "opentelemetry-exporter-http-transport", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "2cfd41e5ca33292d987ba71fa6186d11e16ed66888f3a26f8a3a99060c4b5e90", + "name": "opentelemetry-exporter-otlp", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "3bb4494220732d4bf10e1dba231ea7638cedaa5362e1f23a50d34a14f520fea8", + "name": "opentelemetry-exporter-otlp-common", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "27fb1c8aa5c2cd07776f9f3281fc618cd3feb96017757c33d2b3586fb7fec88b", + "name": "opentelemetry-exporter-otlp-proto-common", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "5cba6098cdd0bfb06853a6c704a2451c4f82c9dea376a30b59ecd279296648ad", + "name": "opentelemetry-exporter-otlp-proto-grpc", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "6f53ef1c172ebf87af69b9ef390aa908506d0cd14bc7811985fdd937a4058808", + "name": "opentelemetry-exporter-otlp-proto-http", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "1910f4e7ebd497e98b6d231e10275288fda2cd1885117575706c62f45e065889", + "name": "opentelemetry-exporter-prometheus", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "fab18b721e30be41448be252e1dca43b48e7f15d971e0bb552492c0ef4b07bee", + "name": "opentelemetry-proto", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "3644a79f55762a646799ff52b9d837e01c8192b7b28f735a383f55c90edb9bc2", + "name": "opentelemetry-sdk", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "add3db481f7f401f65cfbddb058fde3bb4c9dd7b61064a84f8598ad7efe0b11c", + "name": "opentelemetry-semantic-conventions", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "0dfff30e912520a226bcf7a547393484cfcd8c738439c7b48418f61c95109480", + "name": "opentelemetry-semantic-conventions-ai", + "version": "0.5.1" + }, + { + "direct_url": null, + "metadata_sha256": "210ce26bad0a245a72831b4fa029708c245d4d670a88c8d5a69b1446c24a95e4", + "name": "orjson", + "version": "3.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "35ff73511848f5f934ccc39d538014716ec4579e76d54e0e407ff51794a7939c", + "name": "outlines_core", + "version": "0.2.14" + }, + { + "direct_url": null, + "metadata_sha256": "8ee2f7138ade46b6e348a6d099612f5bd6caff13511f3b4144327f37ce50eacf", + "name": "packaging", + "version": "26.3" + }, + { + "direct_url": null, + "metadata_sha256": "a4ab87bf8083001f25ccdc46095f05b678b3569dd58edc2cf941e3e7f64d7c88", + "name": "paginate", + "version": "0.5.7" + }, + { + "direct_url": null, + "metadata_sha256": "1de96a6c28c2e5613c9c87cd4ad9484791001cf58df43cf2ba74d5c4f85f0ad2", + "name": "pandas", + "version": "3.0.6" + }, + { + "direct_url": null, + "metadata_sha256": "d05b8d05da9f78176b2eefaacdfaa5e96708ec4f488daea8bbc52e3ed1bc3954", + "name": "partial-json-parser", + "version": "0.2.1.1.post7" + }, + { + "direct_url": null, + "metadata_sha256": "c1d126edceac2685e29403a8ae3a27c47143dce1f0252fa3931771562f1e2b4f", + "name": "pathspec", + "version": "1.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "30325dc8ce17bc64f9dbc0a449232fd35841a019df22a6f481007c9c5a28c1cb", + "name": "pillow", + "version": "12.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "cbc0b7b6e63b50dcb7c17cf3526a9304f285d9a31353adf3b22acc2059ab23f5", + "name": "pip", + "version": "25.0.1" + }, + { + "direct_url": "{\"dir_info\": {}, \"url\": \"file:///work\"}", + "metadata_sha256": "6ba03b5bc457a2a3d92468729501b5892a0d38ebcc36766c58859449498c5743", + "name": "pip", + "version": "26.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "0421937c4410b61c5325233d5b7671ae933bae8de174f87586ac55aa804851ea", + "name": "platformdirs", + "version": "4.12.2" + }, + { + "direct_url": null, + "metadata_sha256": "2bcffab42626e1fb50d6329765619312d30fe7f4880e98dcee99c92ebd283bb4", + "name": "pluggy", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "7e7562ba7c032f8edd02641ae71b1ac2d8f388103a68d777a7e907d19e75bc17", + "name": "pre_commit", + "version": "4.6.2" + }, + { + "direct_url": null, + "metadata_sha256": "bbe0a7662602ddd23f929fe0ee98e9d04406e138aeee18ce4861af186ea6060d", + "name": "prometheus-fastapi-instrumentator", + "version": "8.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "ece4a61f3ffb92a083fd5e47e180e3e070342e60a3bd93876a879e79a643e821", + "name": "prometheus_client", + "version": "0.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "5feba21a58eaa126e7e7739e57e2572e5bb251fcbf56e439e508acc47d769314", + "name": "propcache", + "version": "0.5.4" + }, + { + "direct_url": null, + "metadata_sha256": "3f136dbf7239c987a7685acd33440cc5efd6c4107b4b11c425201b4de70ae36f", + "name": "proto-plus", + "version": "1.29.0" + }, + { + "direct_url": null, + "metadata_sha256": "118b5ad013120a7a6e24714595ad776bf264d7b0060389133310d18ea1480902", + "name": "protobuf", + "version": "7.36.2" + }, + { + "direct_url": null, + "metadata_sha256": "0849f5a519bf9bc23ef204443fdd8d6d10678863acac7ca9340fc11bfba5a856", + "name": "protobuf-py", + "version": "0.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "eab5f2f4fd98f67a710a8fb1975b64ffa880a4f977566f022c567e08e324ccd6", + "name": "protobuf-py-ext", + "version": "0.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "39009938840de3a8b2a37eb4668d2601aae8c74e4b74743f73e59996b5b7e6e1", + "name": "psutil", + "version": "7.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "df44b58e8a4cfe57f65773ec47f7bdf2a14c8f5f73a7abf331a6b6237d6d691a", + "name": "py-cpuinfo", + "version": "9.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "2fd4a9efc5e5c74ae4c2fcf1970193c524c62ab22af8d5e66ebf7df9e6e46e83", + "name": "py-spy", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "d2ccdeb15cddedc81637a83e40baa6397fe269023b738d0fc3cb2d90722e290b", + "name": "pyarrow", + "version": "25.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "47b9f28e971a56f5adf949e0bcf105b0bf6587946566ecf197a2819d8848cc01", + "name": "pyasn1", + "version": "0.6.4" + }, + { + "direct_url": null, + "metadata_sha256": "82ce4c01c6d36841b9801fcdabab9bfe61d0b5e4e440c275941d8a2d4a790730", + "name": "pyasn1_modules", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "45cb345e4c12f63bc843b8c88902cc44c4d624a55aaef8cd5ffbc0ad16356fbe", + "name": "pybase64", + "version": "1.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "d311ae661edeac8ff029ab2960d065a7e792ebf8f79af682daa53109fe81318b", + "name": "pybind11", + "version": "3.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "cce9c0d440d065d4cdfb0d00004b8ddd65cf363a740efc5b0920b29201a59cd9", + "name": "pycountry", + "version": "26.2.16" + }, + { + "direct_url": null, + "metadata_sha256": "a1e33542883c249bf6c263b0023b9ea8a6131a77d9cb2cbc88316968e5eada83", + "name": "pycparser", + "version": "3.0" + }, + { + "direct_url": null, + "metadata_sha256": "faffcc4d7d359cb1047a9f67f7c65096b838c6db6c62852ef20fb27d55649a95", + "name": "pycryptodomex", + "version": "3.23.0" + }, + { + "direct_url": null, + "metadata_sha256": "98929f4cb80451dc3c6c8cd541a3081dccf0dee94afe7d9fa5c214a18ff236ce", + "name": "pydantic", + "version": "2.13.5" + }, + { + "direct_url": null, + "metadata_sha256": "8eccadbe707db97c397fb79073fe791b7998ef3a85f04f817f8991f7697b190b", + "name": "pydantic-extra-types", + "version": "2.11.1" + }, + { + "direct_url": null, + "metadata_sha256": "8f00c91deb34399316a5386eb2e76fe09f14a08dc3045f2e7dce9bf8573796bd", + "name": "pydantic-settings", + "version": "2.15.0" + }, + { + "direct_url": null, + "metadata_sha256": "66c729edddc20bf2764bb18bd87d907b08690e50355f39b97acc737b26d1d164", + "name": "pydantic_core", + "version": "2.46.5" + }, + { + "direct_url": null, + "metadata_sha256": "394500d78a0c1a433ae8ca3693152c08f6a901121d4b069cf1540a19759e2950", + "name": "pylatexenc", + "version": "2.11" + }, + { + "direct_url": null, + "metadata_sha256": "df2e9e9847a2aea0ae6e20fd325aeb16cf3ce7f8913462db6c2398363cd0c0bf", + "name": "pymdown-extensions", + "version": "12.1" + }, + { + "direct_url": null, + "metadata_sha256": "82fcfe724db9f0b51348da89f4f5cdc0b08d08882b1bbc0ca4913d3a0a93bcb9", + "name": "pynvvideocodec", + "version": "2.0.4" + }, + { + "direct_url": null, + "metadata_sha256": "3722422cc1478b175879143dfb78f98b7a5f53f4f684d71b7054fe2e8acd3b89", + "name": "pyqwest", + "version": "0.10.0" + }, + { + "direct_url": null, + "metadata_sha256": "7d1d1c276b7c372d55d17ac7d30f0a4b80a746e147347b8510d1355eea7f80c8", + "name": "pytest", + "version": "9.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "89e7c1c932e52b74bdcaf504389d2d1a2d7ca559b02bf5a09fc80ebd58ad10f7", + "name": "python-dateutil", + "version": "2.9.0.post0" + }, + { + "direct_url": null, + "metadata_sha256": "54f30f811841b6d772f31715712c85bfe0041839cb071f78daf41c700a98642b", + "name": "python-discovery", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "54f30f811841b6d772f31715712c85bfe0041839cb071f78daf41c700a98642b", + "name": "python-discovery", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "0cc19efd76cfbf3bcb2cb0d3ab82191036855859455aa3812c5e9e591e3f34e8", + "name": "python-dotenv", + "version": "1.2.3" + }, + { + "direct_url": null, + "metadata_sha256": "1d866c6124631b9ce1797ad412fff298ab53fc2d95210281d7c8f20e920753fa", + "name": "python-json-logger", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "2d18a1e7286d92a656ead5ec6f83d5ae6dc858634624f6b264703ae88d24d718", + "name": "python-multipart", + "version": "0.0.32" + }, + { + "direct_url": null, + "metadata_sha256": "beaa0efe9ba4b34843f5a0fc7379a73f10e95adb8cc0c31f359ab6f3a42b4def", + "name": "pyyaml_env_tag", + "version": "1.1" + }, + { + "direct_url": null, + "metadata_sha256": "238dc769e22d4f5626750cdff36e920e4a8d69c10d88de6d79b40a59cc13d873", + "name": "pyzmq", + "version": "27.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "de0a5e855bb5bb78b7acdcd2ca60619c6a0c109814881589caf158ec07155662", + "name": "quack-kernels", + "version": "0.6.5" + }, + { + "direct_url": null, + "metadata_sha256": "961ffef199b876fb4d7b10903d78e79f359d703b1638834c61d70b9879932918", + "name": "qwen-vl-utils", + "version": "0.0.14" + }, + { + "direct_url": null, + "metadata_sha256": "faf6ab9027d12de992827a2d8a224996fe6747a8c5f7d31ae495983dc73eefe9", + "name": "ray", + "version": "2.54.0" + }, + { + "direct_url": null, + "metadata_sha256": "c50d8b3ff4d113925b60dc47d1d28e87248a3338024241b0a3a66c8794fbce0c", + "name": "referencing", + "version": "0.37.0" + }, + { + "direct_url": null, + "metadata_sha256": "02acdc52d6f21d5f4b172254daaa94edfaa44c9ebe14d1c00cc4c8fe99b0e1df", + "name": "regex", + "version": "2026.9.29" + }, + { + "direct_url": null, + "metadata_sha256": "ac08207697217d1ffde8a161b424d77d6e2af6b62630fa26d75d08f11076cdca", + "name": "requests", + "version": "2.34.2" + }, + { + "direct_url": null, + "metadata_sha256": "f1abd635c3dff607a4fd654c62a88d9d4c21843cfc9176116c156f4269ca21b5", + "name": "rich", + "version": "15.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "932ff7743a756d0efcc45528d64c275ac3cb40a8dd1787ea10cb303907f0ae4f", + "name": "rich-toolkit", + "version": "0.20.5" + }, + { + "direct_url": null, + "metadata_sha256": "294a1405c0fa34b5f735bcb46459050436849a1e584c643544de99c07c529fb7", + "name": "rignore", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "5e54dd00b4ad336c5161d47de2a5c2212090c44629c28b6538b156256e49282d", + "name": "rpds-py", + "version": "2026.6.3" + }, + { + "direct_url": null, + "metadata_sha256": "0d5895abd80bfc0027c02943abaea4547061b9004bd134950d640d619a697835", + "name": "safetensors", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "91d5de3f641f33a8fbb4b6e91772da68d50b68686971d7b66af2068f2e77b694", + "name": "scipy", + "version": "1.17.1" + }, + { + "direct_url": null, + "metadata_sha256": "297fb30f701a800489c12893a951da3e5bd1f80061a1f43f0d3e9f1d4c6bc6fd", + "name": "sentencepiece", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "4245e0388ddf2048a38ae2a24a3d2c583408b2454aadc680d3c3beede639db3f", + "name": "sentry-sdk", + "version": "2.71.0" + }, + { + "direct_url": null, + "metadata_sha256": "ae8a9e6feec1a76e954d65ea48ac57842c9a7bfb5ac6e5ea82400a5ba9f71a98", + "name": "setproctitle", + "version": "1.3.7" + }, + { + "direct_url": null, + "metadata_sha256": "341d00772017437d0f6e3c943ae353f243c39fedfba403aea47cced927a76516", + "name": "setuptools", + "version": "79.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "ff4bcfb192bd542ed8f1794fb32ffc9eabd932d6e03cb00a4ad5e35a2469af88", + "name": "setuptools", + "version": "80.10.2" + }, + { + "direct_url": null, + "metadata_sha256": "f1e5a532fb8cda0bbc370e3db6cb9cea72a065d12ddd6a14976ba3cf66264221", + "name": "shellingham", + "version": "1.5.4" + }, + { + "direct_url": null, + "metadata_sha256": "2aba2cfd9c2ad7625a5d374d141af317d8f92d3534997bf98d127e52848dfc81", + "name": "six", + "version": "1.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "69ae2dfe547624be97fae348e1cfa3793f8854eed32cc1603badedc7d48fb36e", + "name": "smart_open", + "version": "8.0.2" + }, + { + "direct_url": null, + "metadata_sha256": "d415e6c6de7dee117d254a342668c489931bc88eac7ec8678b452078e366da6e", + "name": "smmap", + "version": "5.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "093bc4f0740a6fc28692e616aa8fe68d7e1d76426cc5a5faf9ea722a8ee7aaae", + "name": "sniffio", + "version": "1.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "b3cef071eb1dbeaa76a1273fe2ca2cc8ef36e835165253952d93780962529ac1", + "name": "sse-starlette", + "version": "3.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "3c01ca830e213f0311fe37bc3b46b8ab230a5e7acb894bf0fc8785cb7ccfed48", + "name": "starlette", + "version": "1.7.0" + }, + { + "direct_url": null, + "metadata_sha256": "6017ca508a293cf47a88a78cb330e9cbd131d74ec3c7fbf89bd4300ed3129d30", + "name": "supervisor", + "version": "4.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "fd5eb4925b04f9bffbc6c4f92bf8aea7243b918b43cd359493fce48a7dd3b336", + "name": "sympy", + "version": "1.14.0" + }, + { + "direct_url": null, + "metadata_sha256": "f09f0e24282c5a86346bcd5b10ae5ff81869fa8ef69c3ba524bd0a817a87dda9", + "name": "tabulate", + "version": "0.10.0" + }, + { + "direct_url": null, + "metadata_sha256": "519fa19c146fd58a0a75ecf1461e4bd98f9c06d01800c37d4a80f5fef095f4e1", + "name": "tensorboard", + "version": "2.21.0" + }, + { + "direct_url": null, + "metadata_sha256": "1af7ad76e4073b01ab147eb3c1d8e38b95d38062c6c9bc63890150738642e8eb", + "name": "tensorboard-data-server", + "version": "0.7.2" + }, + { + "direct_url": null, + "metadata_sha256": "9e597f62fc07e3b931d5c8fb0e90706fb6d45465cfb5d01dbd27ba7fc135c02c", + "name": "tensorstore", + "version": "0.1.80" + }, + { + "direct_url": null, + "metadata_sha256": "0da993d16ef6326f471796fcb065622f309c5c1aae6c6295b488ea64bb5c880c", + "name": "textual", + "version": "8.2.8" + }, + { + "direct_url": null, + "metadata_sha256": "52ca6148d4fd1497254855fa610cfdde99191cd42bce7a452fd3a68855504ac0", + "name": "tiktoken", + "version": "0.14.0" + }, + { + "direct_url": null, + "metadata_sha256": "0df9eb495cfb477dcbdfbdcd8c04d952d3eb00d77831630760571e13545398e5", + "name": "tilelang", + "version": "0.1.12" + }, + { + "direct_url": null, + "metadata_sha256": "802b576e011dc61bd2681593e8d802714b6c4ce636a9cf87035026db32ce6262", + "name": "tokenizers", + "version": "0.23.2" + }, + { + "direct_url": null, + "metadata_sha256": "4e1631b2164a49ff9a848d86ce504fdcc15e3540dbb262df8f33a2681a8de513", + "name": "tokenspeed-mla", + "version": "0.1.8" + }, + { + "direct_url": null, + "metadata_sha256": "05086095a775c5dca70998dcf442a848c13f9c68b54a54c510c3542c5abb6563", + "name": "tokenspeed-triton", + "version": "3.8.10.post20260920" + }, + { + "direct_url": null, + "metadata_sha256": "71daba472d0c5ffc25c0231dc29688ab0cb13d5bc7e7d93f6c4cce4169c50048", + "name": "torch", + "version": "2.13.0" + }, + { + "direct_url": null, + "metadata_sha256": "cccd2f1c0e5866e63732f58798c8d642ee6d10cd560d6f691e7981b908c246c9", + "name": "torch_c_dlpack_ext", + "version": "0.1.5" + }, + { + "direct_url": "{\"dir_info\": {}, \"url\": \"file:///torch_memory_saver\"}", + "metadata_sha256": "6276cef17dedbb5ee0d6157bbf63b832e916026281328d995ad3d488c2539618", + "name": "torch_memory_saver", + "version": "0.0.9.post1+slime" + }, + { + "direct_url": null, + "metadata_sha256": "29809ca2c86dda5079654f1f70564a64435e9d08f1964a2412b6f514e1b5ff64", + "name": "torchaudio", + "version": "2.11.0" + }, + { + "direct_url": null, + "metadata_sha256": "7e9be0f3a290e3fd9370d8fe010c7ffd006d5d3d05ab8bdf7df8f92f0fca9c39", + "name": "torchcodec", + "version": "0.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "181fa5e6b399c378711eddcdacd756d3c51317916f8eb160ee36cae7fae9589f", + "name": "torchvision", + "version": "0.28.0" + }, + { + "direct_url": null, + "metadata_sha256": "43d1261aff90cf3d5b1b40cf1f94234d61409b14e59f3766f457c1eec7f7ac15", + "name": "tqdm", + "version": "4.70.1" + }, + { + "direct_url": "{\"archive_info\": {\"hash\": \"sha256=3e1d9f534781c8e608240da0b495b8246317a36382f7609017cbaa7fb1d53f7b\", \"hashes\": {\"sha256\": \"3e1d9f534781c8e608240da0b495b8246317a36382f7609017cbaa7fb1d53f7b\"}}, \"url\": \"file:///wheels/transformer_engine-2.16.1%2Bc9877beb-cp312-cp312-linux_x86_64.whl\"}", + "metadata_sha256": "d882f743161d9d9f35dee4e1a8cc9136fa495f7c660caace01ab8f5602d76aa7", + "name": "transformer_engine", + "version": "2.16.1+c9877beb" + }, + { + "direct_url": null, + "metadata_sha256": "465797a59706d83b45c93fde750b228c3b6e1addc44115de2c4c02ad66d9c5ea", + "name": "transformers", + "version": "5.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "a91982ca086667c592a951973434f7c5a9f27a8300bc97af78dfb496afe53e71", + "name": "triton", + "version": "3.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "d26fbb244532c4051e715f9047cd943e2cc4abb0ac6f2a517fa2986eb1ea726a", + "name": "truststore", + "version": "0.10.4" + }, + { + "direct_url": null, + "metadata_sha256": "c84af1a069084b1b440b3594068dec29200d52d4c1a9b652030448717f270158", + "name": "typer", + "version": "0.27.2" + }, + { + "direct_url": null, + "metadata_sha256": "0ad6653b7439f4bb6a596cb7b01ed1b716458467525c4dc40b75d62bdb943c98", + "name": "typing-inspection", + "version": "0.4.4" + }, + { + "direct_url": null, + "metadata_sha256": "d005280aa13b334ac942d20219102865e559f69ffd06c35c248b2f0d0da3b933", + "name": "typing_extensions", + "version": "4.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "fba2930e9030a18965d243f8d330748db2e67572a81b3b68710462fb5110332a", + "name": "urllib3", + "version": "2.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "bc5717bd6524a33838f285261868bcc8e311e8c29fdb19e41d56c38b04890e84", + "name": "uvicorn", + "version": "0.54.0" + }, + { + "direct_url": null, + "metadata_sha256": "741c006d8441f562aa853a5430df236fbb4af923445491f396bf09943bd30258", + "name": "uvloop", + "version": "0.22.1" + }, + { + "direct_url": "{\"dir_info\": {\"editable\": true}, \"url\": \"file:///vime\"}", + "metadata_sha256": "f85aa01dfdc868756a6583434bbff040f29eb511d47d5b25ada063a84353aac6", + "name": "vime", + "version": "0.3.2" + }, + { + "direct_url": null, + "metadata_sha256": "c25431aaf1950971fe96292f395a41a55b403127bfca0d0b8f7dc9cff5dab75d", + "name": "virtualenv", + "version": "21.14.1" + }, + { + "direct_url": null, + "metadata_sha256": "4e3ee0a31d85e56268640aae853bcee4794dfe8c0483c5c6370517e480c81ae0", + "name": "virtualenv", + "version": "21.14.5" + }, + { + "direct_url": null, + "metadata_sha256": "d4ed5c7551cddb8c1aeff2f9f27b3491f6ad2c9afda8e7bb9779c33fa12a536c", + "name": "vllm", + "version": "0.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "84b482e09bac949e992594757214a1920c667a5d898ee320e309250697f6d26e", + "name": "vllm-router", + "version": "0.1.15" + }, + { + "direct_url": null, + "metadata_sha256": "9b16c871eb1060a5218e9b9a9ad33288d94844cfaf43f08dbb6c32423bde8fe3", + "name": "wandb", + "version": "0.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "8e4f2be437dfe4eb3c6c959e517ac20b75d06525563f1ebcbf06f9ec648bd7c1", + "name": "watchdog", + "version": "6.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "15218afb42938907c2ca74c54e3d8e3a5406493c4761e29e38e82bfec0f84296", + "name": "watchfiles", + "version": "1.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "8863af96e88b7db9990da99aa6c46816eacc3d2f9ae1297b53381b033cd70119", + "name": "wcmatch", + "version": "11.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "f46e6bd6cfafb2b684c29587b017b7096fd9155b74eda25a22eca784b9803ab7", + "name": "websockets", + "version": "16.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "ce82db5ccfefa4bfbe4e25a36e1f91e8e7d51fcaeb31586c4d48e1c69f99168b", + "name": "websockets", + "version": "17.1" + }, + { + "direct_url": null, + "metadata_sha256": "0f142a2c09eac643c7d0bfe77f3f121184c0b17914afbd32af669ed19b2b02ef", + "name": "wheel", + "version": "0.47.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd58938e51a3c5cb363f6f22eaa2a8a7accc1ce373388de167a82f77d3e5783f", + "name": "wrapt", + "version": "2.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "b0b72c1941f04499ca7e1a3a6e479aee8df902c3d49979624b59dba8c3228d37", + "name": "xgrammar", + "version": "0.2.8" + }, + { + "direct_url": null, + "metadata_sha256": "ef8861f39e5c36255966a36032651f937d890d55f31f1c26304b488f1ba34332", + "name": "xxhash", + "version": "4.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "740c08057b6eb69c58402c87d652af0a471e46325d811f2c605632a18817152f", + "name": "yarl", + "version": "1.25.1" + }, + { + "direct_url": null, + "metadata_sha256": "7b060e4d24394b5431875e2f74fec8e6bffa79d2e6b4cb8c7e2a5187dd2d8d69", + "name": "z3-solver", + "version": "4.15.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "3d76d4fbc95f0851191147db12300938c67a6f8fb1df884886d9601272ccc4e8", + "name": "zipp", + "version": "4.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "d3de2651e4e908dbb7c9d80508e5179590217dfac4993dc8b04381c5b9718c4c", + "name": "zstandard", + "version": "0.25.0" + } + ], + "executable": "", + "installed_provider_sources": { + "vllm/compilation/__init__.py": { + "path": "/vllm/compilation/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/backends.py": { + "path": "/vllm/compilation/backends.py", + "sha256": "fa4bff8920b363efbbde9456f135fa9d2c004a5bde1898877f177418b2d8b008" + }, + "vllm/compilation/base_static_graph.py": { + "path": "/vllm/compilation/base_static_graph.py", + "sha256": "5cfe8e06db84aa42cd41cdd93ebe93af00b3a242c8011042057530e2922b523a" + }, + "vllm/compilation/breakable_cudagraph.py": { + "path": "/vllm/compilation/breakable_cudagraph.py", + "sha256": "3cc427612a08e2b9b3fee47548026400c1d0776e2d4747535e59ef5512bdf1e8" + }, + "vllm/compilation/caching.py": { + "path": "/vllm/compilation/caching.py", + "sha256": "71d212452dde742fbf28b8a01ed29d3c08a7457ff7f8da2a20ce9d17e902c2cf" + }, + "vllm/compilation/codegen.py": { + "path": "/vllm/compilation/codegen.py", + "sha256": "e04833bec88cf9d1a13aa7341e30e3233d1138bfe23424e0fd34d664b3fedb9f" + }, + "vllm/compilation/compiler_interface.py": { + "path": "/vllm/compilation/compiler_interface.py", + "sha256": "8d84e2864bf83f754bae9e9f77119e0287cca9f97f5fa5ec2535e07b5ad88944" + }, + "vllm/compilation/counter.py": { + "path": "/vllm/compilation/counter.py", + "sha256": "d8158c54dd36a357bf24f6f84dc22f572d3a27f4875f3d5779b12bc5d454ff76" + }, + "vllm/compilation/cuda_graph.py": { + "path": "/vllm/compilation/cuda_graph.py", + "sha256": "05c86392d7fae967ac73076dba7e01990a0e3ae619e4866450a0c1be56bd1192" + }, + "vllm/compilation/decorators.py": { + "path": "/vllm/compilation/decorators.py", + "sha256": "cab6962e8a1fead59c75f5ed8cb4732f9e5441ff972030c2f4b1c4ba0c58de3c" + }, + "vllm/compilation/monitor.py": { + "path": "/vllm/compilation/monitor.py", + "sha256": "43b24c5cb1bc4d32dc979f3222596905c7b3acc58415328a234402e6edc76abf" + }, + "vllm/compilation/partition_rules.py": { + "path": "/vllm/compilation/partition_rules.py", + "sha256": "857d2fb06dc871ea1d3717cd01fbd4e5205984100d98b7b72a2933d6ff1cfa4d" + }, + "vllm/compilation/passes/__init__.py": { + "path": "/vllm/compilation/passes/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/fusion/__init__.py": { + "path": "/vllm/compilation/passes/fusion/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/fusion/act_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/act_quant_fusion.py", + "sha256": "1fa9c3ca4fb424685b7053c3dda89dda16c98dc5645d85f0f28dca58429792b3" + }, + "vllm/compilation/passes/fusion/add_rms_fusion.py": { + "path": "/vllm/compilation/passes/fusion/add_rms_fusion.py", + "sha256": "e46998552628aa5cd5962fc39ea39ae824fd97e6aeba1d176e9cc7cade39837b" + }, + "vllm/compilation/passes/fusion/allreduce_rms_fusion.py": { + "path": "/vllm/compilation/passes/fusion/allreduce_rms_fusion.py", + "sha256": "0af193505880cec0f6ffa224c688bce3c9ddc318dccdf04a696b4e4b4506a963" + }, + "vllm/compilation/passes/fusion/attn_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/attn_quant_fusion.py", + "sha256": "ecc64e82be4481954c9cac6c23d7794846ab19486b570f2dda07ab5ad67c5a49" + }, + "vllm/compilation/passes/fusion/collective_fusion.py": { + "path": "/vllm/compilation/passes/fusion/collective_fusion.py", + "sha256": "1e2c8539d6960b45907fb3bf0482441ea7250e97c56ffdea1500514efa0b164d" + }, + "vllm/compilation/passes/fusion/matcher_utils.py": { + "path": "/vllm/compilation/passes/fusion/matcher_utils.py", + "sha256": "50ac5714ce1bb113520de769ea6234316acc470a8cdf2537a996ce9a9d54337d" + }, + "vllm/compilation/passes/fusion/mla_attn_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/mla_attn_quant_fusion.py", + "sha256": "a966fe7f58bf9228379f793f5fd851735a97f9639722766b2a20cb79a9e4baec" + }, + "vllm/compilation/passes/fusion/mla_rope_kvcache_cat_fusion.py": { + "path": "/vllm/compilation/passes/fusion/mla_rope_kvcache_cat_fusion.py", + "sha256": "1602cc28055ffa8d1123ddb1d256bf0bd12006fd06ea7e16a986c55746dbe0dc" + }, + "vllm/compilation/passes/fusion/qk_norm_rope_fusion.py": { + "path": "/vllm/compilation/passes/fusion/qk_norm_rope_fusion.py", + "sha256": "aebc7d1a5189b65ac665afcc169e7baebd53efe719c48e35e7c5babe85af0d39" + }, + "vllm/compilation/passes/fusion/qk_norm_rope_kvcache_fusion.py": { + "path": "/vllm/compilation/passes/fusion/qk_norm_rope_kvcache_fusion.py", + "sha256": "f0cfd0d83ec4acb09f9bf91d199b114e9d4995e3059c13eb23a6978ce7c07eb2" + }, + "vllm/compilation/passes/fusion/rms_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rms_quant_fusion.py", + "sha256": "4852aa44e0e2087043fdac271bda9b8d9bfe3201bb84ce3919b8ed454d8083c4" + }, + "vllm/compilation/passes/fusion/rocm_aiter_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rocm_aiter_fusion.py", + "sha256": "372e76c68c75209a085deec6dd22b3816be633613ca82f6f2925c1b3773d61a0" + }, + "vllm/compilation/passes/fusion/rope_kvcache_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rope_kvcache_fusion.py", + "sha256": "3a756e9049593537143b5a56ab9185a6bc83f57ed81d84226d7791a46a984b53" + }, + "vllm/compilation/passes/fusion/sequence_parallelism.py": { + "path": "/vllm/compilation/passes/fusion/sequence_parallelism.py", + "sha256": "3af7e420dcb35fff0bae0f8f599d0f1bda34445ebe194059892a434b2976d654" + }, + "vllm/compilation/passes/fx_utils.py": { + "path": "/vllm/compilation/passes/fx_utils.py", + "sha256": "730708213acf9d1b5f3176b433dfc197a5f3c81b5ce443f0923c526924833003" + }, + "vllm/compilation/passes/inductor_pass.py": { + "path": "/vllm/compilation/passes/inductor_pass.py", + "sha256": "1f380aacf7adabb8bf8b7d41c0a93473947f0716f7445bd910fd448f6c08e672" + }, + "vllm/compilation/passes/ir/__init__.py": { + "path": "/vllm/compilation/passes/ir/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/ir/clone_elimination.py": { + "path": "/vllm/compilation/passes/ir/clone_elimination.py", + "sha256": "5297078f5cddce081faba5215814275381d2083b32318fcfeb2bf9d69fedb7c7" + }, + "vllm/compilation/passes/ir/inplace_functionalization.py": { + "path": "/vllm/compilation/passes/ir/inplace_functionalization.py", + "sha256": "2dc4f22c6f05224828c2941479185b1452d4490f488b7f0bfd124334e7809fed" + }, + "vllm/compilation/passes/ir/lowering_pass.py": { + "path": "/vllm/compilation/passes/ir/lowering_pass.py", + "sha256": "d9c3d90f63138420f0e5489447b5996573fcfbbab939da2efccd00848492b172" + }, + "vllm/compilation/passes/ir/utils.py": { + "path": "/vllm/compilation/passes/ir/utils.py", + "sha256": "f59d33a6c7d0616cbeec1e9fb1d6c948881bf81fe124caeb906eac2e2197ea21" + }, + "vllm/compilation/passes/pass_manager.py": { + "path": "/vllm/compilation/passes/pass_manager.py", + "sha256": "486979a058aa2e20ebedcbb6e039f7a59f38d2efd2cda11219fae4067be0968d" + }, + "vllm/compilation/passes/utility/__init__.py": { + "path": "/vllm/compilation/passes/utility/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/utility/fix_functionalization.py": { + "path": "/vllm/compilation/passes/utility/fix_functionalization.py", + "sha256": "ad5b504a05ccee023869b0c8df70ec2fff9a4a80d25fd903e2b532f470e7203f" + }, + "vllm/compilation/passes/utility/noop_elimination.py": { + "path": "/vllm/compilation/passes/utility/noop_elimination.py", + "sha256": "8abf85d28c13f95059f2acbc0275b9b9ed2ad4990f7c5763bbe3067a4aa629ce" + }, + "vllm/compilation/passes/utility/post_cleanup.py": { + "path": "/vllm/compilation/passes/utility/post_cleanup.py", + "sha256": "1c38b14fc209165cbcf8ca763a17ac4e528b97f59b573e5d52df2cce7d758de3" + }, + "vllm/compilation/passes/utility/scatter_split_replace.py": { + "path": "/vllm/compilation/passes/utility/scatter_split_replace.py", + "sha256": "138402cc3097768a32e9e5b8d1a054b6176e494bddc8684e23ca2dc5fdc3fdda" + }, + "vllm/compilation/passes/utility/split_coalescing.py": { + "path": "/vllm/compilation/passes/utility/split_coalescing.py", + "sha256": "0b02acd9e1ad43d7b3e128b914e969b9580773f2818078846dfbf163a8bd0871" + }, + "vllm/compilation/passes/vllm_inductor_pass.py": { + "path": "/vllm/compilation/passes/vllm_inductor_pass.py", + "sha256": "4f83ffb67f834a214221d810c7843a8e41eb4e5930eb40adbd8cf054ff6fb9c6" + }, + "vllm/compilation/piecewise_backend.py": { + "path": "/vllm/compilation/piecewise_backend.py", + "sha256": "6525318ff3ca2e4978e24dd9232a7ae0a02e920e19604b83db6f6043d1f8a54d" + }, + "vllm/compilation/wrapper.py": { + "path": "/vllm/compilation/wrapper.py", + "sha256": "c1b1fca679ea16aa07a696831a810c0d531da2bb0ea32dd6f1a95cdaef36de07" + }, + "vllm/config/__init__.py": { + "path": "/vllm/config/__init__.py", + "sha256": "56fb0cb1598d297e4f95a97e5d86dc624145d1532f5faa432b7d2834d7155bd5" + }, + "vllm/config/attention.py": { + "path": "/vllm/config/attention.py", + "sha256": "c41f345b512d9b7df882328257eb3a6381f41088c11ae83b5ecd8a9e8265d1bc" + }, + "vllm/config/cache.py": { + "path": "/vllm/config/cache.py", + "sha256": "f1c226ba679c884930dbfcaf41a57248b137a9a20d3ed8e3d3b31752bb484c07" + }, + "vllm/config/compilation.py": { + "path": "/vllm/config/compilation.py", + "sha256": "c9cec5c7200e8e559810ec8c30113ad61dab6780f9f7fb3c116bd0d9b5a43065" + }, + "vllm/config/device.py": { + "path": "/vllm/config/device.py", + "sha256": "7b82eee02ceb5842337451a27a3d5729920c47e25e8f6bf3997f5146f9330a9c" + }, + "vllm/config/diffusion.py": { + "path": "/vllm/config/diffusion.py", + "sha256": "1fa9fd2478a866098a28a3586b55af2f9738656b7813a55d76539c10dd99fe8d" + }, + "vllm/config/ec_manager_config.py": { + "path": "/vllm/config/ec_manager_config.py", + "sha256": "418b387dbe7bdf67deddce331c205768a2d42aea37141f59fb02a8a1528e3552" + }, + "vllm/config/ec_transfer.py": { + "path": "/vllm/config/ec_transfer.py", + "sha256": "0eabb2c25194676d23c6acf59562672a1dd24415043ac5737d621ce0d681ec70" + }, + "vllm/config/engram.py": { + "path": "/vllm/config/engram.py", + "sha256": "34043a22385a041d4e9be8857f64174c990c2ca8308b97b6a952b5ab96c20ee5" + }, + "vllm/config/fault_tolerance.py": { + "path": "/vllm/config/fault_tolerance.py", + "sha256": "b166b24373d599fb15ddc575e3061cf0dcb42174d0369d8468008e7ffbb2a4e2" + }, + "vllm/config/kernel.py": { + "path": "/vllm/config/kernel.py", + "sha256": "27e23c584cf862f4091858db6dc85bbc2a01f4baf9dca3f232ae6f3bac02390e" + }, + "vllm/config/kv_events.py": { + "path": "/vllm/config/kv_events.py", + "sha256": "b1dbaee3e6830e381e9157fe3bab0d65c357da88ff7cdf8b1e4b3a4e75c82a87" + }, + "vllm/config/kv_transfer.py": { + "path": "/vllm/config/kv_transfer.py", + "sha256": "506fae7a9d7f32cb3646156cf9249a856f6317dff6c4c85db70efd34418c429b" + }, + "vllm/config/load.py": { + "path": "/vllm/config/load.py", + "sha256": "bd6431c22e078362d749a56a2c84145432ebf2605d8bcfa2ac679182d18ed630" + }, + "vllm/config/lora.py": { + "path": "/vllm/config/lora.py", + "sha256": "ed6cf6575f5950f079a62f904caeae93d1a4745dd8c21788b74367883bcd4b08" + }, + "vllm/config/mamba.py": { + "path": "/vllm/config/mamba.py", + "sha256": "2090f791201ca45dd4f1d72b8651268890eb07574b6084721194eb8fdf612c48" + }, + "vllm/config/model.py": { + "path": "/vllm/config/model.py", + "sha256": "f4168b67cc93ce72ff2a6d4c66974223e32fd0f1fab4c05e44bd68a275e18d69" + }, + "vllm/config/model_arch.py": { + "path": "/vllm/config/model_arch.py", + "sha256": "2babe28329d7b60b4e205f6d72c687f0f66e6535aa2f20411469e5ec362f6b5f" + }, + "vllm/config/multimodal.py": { + "path": "/vllm/config/multimodal.py", + "sha256": "271911aee151f17f092228cecee82af0713e9a47340ffdf66834ca7638a50d22" + }, + "vllm/config/observability.py": { + "path": "/vllm/config/observability.py", + "sha256": "d57c59ec776477ab0a20e9f2b945bc954d8ea3737c869259480e9aa10dfb9f6d" + }, + "vllm/config/offload.py": { + "path": "/vllm/config/offload.py", + "sha256": "6f2db3d9a2730588473d5155811690c6241b167a21dcb62fbbd9ebb6386de42c" + }, + "vllm/config/parallel.py": { + "path": "/vllm/config/parallel.py", + "sha256": "f012ace89e3fb730a467f729f602679bc145c49f0d10721811c9d818570e7b2b" + }, + "vllm/config/pooler.py": { + "path": "/vllm/config/pooler.py", + "sha256": "9f01913dcb7bccbf9b672b16643f18471ae202455992e8afaf0725a17f2b3d08" + }, + "vllm/config/profiler.py": { + "path": "/vllm/config/profiler.py", + "sha256": "04d24fa1dc7cfedca6b5c7d9115f7f7021722fc46a5b15234a1e3b3a506c93e5" + }, + "vllm/config/quantization.py": { + "path": "/vllm/config/quantization.py", + "sha256": "acffc52f525b39a88efd656f1ed705ce3a1b758298bb0684fac7694776bc10b4" + }, + "vllm/config/reasoning.py": { + "path": "/vllm/config/reasoning.py", + "sha256": "2c4f7bdee48a9fb3d93787c4c32361c2411417cce452cfde86808d8759977861" + }, + "vllm/config/scheduler.py": { + "path": "/vllm/config/scheduler.py", + "sha256": "822179da62be4bca0619c8590082ae09123f5c4415f9cc2037be673748239edb" + }, + "vllm/config/speculative.py": { + "path": "/vllm/config/speculative.py", + "sha256": "9c642a87264339c0dbc1d0b57330572149df0f9d5e16c6893b9895e50a619e19" + }, + "vllm/config/speech_to_text.py": { + "path": "/vllm/config/speech_to_text.py", + "sha256": "bf4a566fbde6a1cec1e209070b739650c3302c12696739c88049cb8f723a4c3f" + }, + "vllm/config/structured_outputs.py": { + "path": "/vllm/config/structured_outputs.py", + "sha256": "55649776594349b8b4aa3e08fc4c88068366732a486d6fb235079188044aa829" + }, + "vllm/config/utils.py": { + "path": "/vllm/config/utils.py", + "sha256": "d035e9e488ba92b6c47a96cf05d9b2a850d53eda8a05115b22ff9af8dbc2fc64" + }, + "vllm/config/vllm.py": { + "path": "/vllm/config/vllm.py", + "sha256": "956b812e5a719bcbfa3a3958801361b38b9c928c96b8c073311bbb96376dfb7a" + }, + "vllm/config/watermarking.py": { + "path": "/vllm/config/watermarking.py", + "sha256": "30e6620a3cd7529f0736ad55e38bc326a6a78dee4552f0722208400041c94a1f" + }, + "vllm/config/weight_transfer.py": { + "path": "/vllm/config/weight_transfer.py", + "sha256": "92edd9e5ea90c97a8f3c5f20abf1734a105ee1f3f89e306e7ba87e758f1f767e" + }, + "vllm/distributed/__init__.py": { + "path": "/vllm/distributed/__init__.py", + "sha256": "97f28c30b32662af8cab163939e4ee423037f11630752e13b55cbc25a7d0ab71" + }, + "vllm/distributed/communication_op.py": { + "path": "/vllm/distributed/communication_op.py", + "sha256": "3c3f8ac60db38ece891d39dc1e2f6f1947ad438685893d2e5777d072320bd1b8" + }, + "vllm/distributed/device_communicators/__init__.py": { + "path": "/vllm/distributed/device_communicators/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/device_communicators/aiter_custom_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/aiter_custom_all_reduce.py", + "sha256": "f8eb027ce7a85d94af6260960ceb7f36fc6f1406c9af9c9b6285fddb3f178009" + }, + "vllm/distributed/device_communicators/all2all.py": { + "path": "/vllm/distributed/device_communicators/all2all.py", + "sha256": "1f1b69236acd3cd7bd94520fd6d591bfd31b57c4bc7c9f9f4161ea8bbd0c5f26" + }, + "vllm/distributed/device_communicators/all_reduce_utils.py": { + "path": "/vllm/distributed/device_communicators/all_reduce_utils.py", + "sha256": "ed0ab4dd05b2519a6313892e68824c97b540034664d7f8c3d031b322e33e1bfc" + }, + "vllm/distributed/device_communicators/base_device_communicator.py": { + "path": "/vllm/distributed/device_communicators/base_device_communicator.py", + "sha256": "4a7670f12ed7c7621b25d476e2687c24ca01f3be183fff4a6a25337596fe506b" + }, + "vllm/distributed/device_communicators/cpu_communicator.py": { + "path": "/vllm/distributed/device_communicators/cpu_communicator.py", + "sha256": "e1856c8e91cfbbb4d9ce990c1236e258ba4021e226afcbab645653380b38d64b" + }, + "vllm/distributed/device_communicators/cuda_communicator.py": { + "path": "/vllm/distributed/device_communicators/cuda_communicator.py", + "sha256": "102d95c67ec798cf352b817ba92e8abc9da37f30d1bbdf3aab45d3927b627b93" + }, + "vllm/distributed/device_communicators/cuda_wrapper.py": { + "path": "/vllm/distributed/device_communicators/cuda_wrapper.py", + "sha256": "333b6d9ed173e7a18c7f2b6627a3c9c9ed88892ce52015f05e29d6d245e48ee3" + }, + "vllm/distributed/device_communicators/custom_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/custom_all_reduce.py", + "sha256": "a048c1327c23580805600c0c951831bec333b1ffc4eb26a0e3d34119c4f0c445" + }, + "vllm/distributed/device_communicators/flashinfer_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/flashinfer_all_reduce.py", + "sha256": "b4359760e9b55963676109a5c3a015fb82e190d4df1d021de9ee01e7814cbdda" + }, + "vllm/distributed/device_communicators/flashinfer_pcie_ipc_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/flashinfer_pcie_ipc_all_reduce.py", + "sha256": "8b67b0fc356a565095f56b475cc89c513e3a5eff051ab1c52e5beb0c1a79e9f2" + }, + "vllm/distributed/device_communicators/mnnvl_compat.py": { + "path": "/vllm/distributed/device_communicators/mnnvl_compat.py", + "sha256": "72ee1e6f9571b4c8ecbd9f60cd469d1b565cb79cab519a688a93f290906a2615" + }, + "vllm/distributed/device_communicators/pynccl.py": { + "path": "/vllm/distributed/device_communicators/pynccl.py", + "sha256": "882fb83c5a3c565a3f8fd664b79f5ceae566dca180019ecafd74bc8c11d9f8cf" + }, + "vllm/distributed/device_communicators/pynccl_allocator.py": { + "path": "/vllm/distributed/device_communicators/pynccl_allocator.py", + "sha256": "390e2576cbf4ae06341ca4dab24fc7e4d4f7c24dd444329ed05d828a9ce91460" + }, + "vllm/distributed/device_communicators/pynccl_wrapper.py": { + "path": "/vllm/distributed/device_communicators/pynccl_wrapper.py", + "sha256": "ce63c8da57bb88d4cf89956bd70bb63f0f44bfad468ddb37b765611551f6d99f" + }, + "vllm/distributed/device_communicators/quick_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/quick_all_reduce.py", + "sha256": "8aacb23e7c297b0ae2f80d99c5affd2e7517115d7874be51069d14a44db7b5f2" + }, + "vllm/distributed/device_communicators/ray_communicator.py": { + "path": "/vllm/distributed/device_communicators/ray_communicator.py", + "sha256": "332c37f65495b60564d61db59bc2d30ca0236adc33442d01464790bde9aec897" + }, + "vllm/distributed/device_communicators/shm_broadcast.py": { + "path": "/vllm/distributed/device_communicators/shm_broadcast.py", + "sha256": "f3e7a3f3ff713fccbd535e0d41650ee05bdf8677e83d4b90519910645022c30b" + }, + "vllm/distributed/device_communicators/shm_object_storage.py": { + "path": "/vllm/distributed/device_communicators/shm_object_storage.py", + "sha256": "e097bf7ac0141fe8db4131e8fd553ca2ad5b0600b22a56f3924af6b795e7207c" + }, + "vllm/distributed/device_communicators/symm_mem.py": { + "path": "/vllm/distributed/device_communicators/symm_mem.py", + "sha256": "b06e3ddb9ae880a30ec4a103ce32eb9794223bb0293832e89572af28adaaa544" + }, + "vllm/distributed/device_communicators/xpu_communicator.py": { + "path": "/vllm/distributed/device_communicators/xpu_communicator.py", + "sha256": "527cbfb250760abc62096ee7cd612307b821f21b72dee1687ad866620ec89b6d" + }, + "vllm/distributed/ec_transfer/__init__.py": { + "path": "/vllm/distributed/ec_transfer/__init__.py", + "sha256": "061405bb51df7409c9938b62e25caa8bd6ebf85da6d1700dbd4affe2a0825135" + }, + "vllm/distributed/ec_transfer/ec_connector/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/base.py", + "sha256": "22d4913375bb622473fbe1a77f9376b804949cd8a7e31e9518208f9561d161e2" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/common.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/common.py", + "sha256": "e2267abd8d00a6d2605e1a82ea5c73396a71b427452eab469fcca0134c334e7c" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/connector.py", + "sha256": "72cd35d9fd754a2992dd090a8af13c91e0789b4038ac29276750d823120235db" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/base.py", + "sha256": "19e8df88b0fa831997896355ecdd49e0d86cb074cd7ae28aed0b328b0bb3ab2e" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/zmq.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/zmq.py", + "sha256": "435641c0e37551ab4937855abd067be26905b91215e759cbd9d28a419a34ff9a" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/base.py", + "sha256": "3be698aeb67d32ee3741e76b2fb71806941c587578583acf8fbc42fbf22b46a5" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/nixl.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/nixl.py", + "sha256": "03af8f6549a6027b7262a482907af591e45f28b9b1c5a3408bbc6600e38797e5" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/ec_shared_region.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/ec_shared_region.py", + "sha256": "e40607952c9920024455eca2f419e8c3ef1de9a4d8b27c147a33bb941b8c08b1" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/protocol.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/protocol.py", + "sha256": "05878336884396bfbef77b96b0fa6359f6fa0aba912961f14a84f5a436f27038" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/__init__.py", + "sha256": "01c42385bf3a55cff09cc05ba956f6dd4b8b6b986bf4d6eca4e566cb045b48e0" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/embedding_cache.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/embedding_cache.py", + "sha256": "7359fb980af1fc30b3253681310ef636e2b4a19134e04a93270c9c45de2572d8" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/session.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/session.py", + "sha256": "5973548a919e13c866222b91d502686a6757a31e5a5664b879bf2887ed9fb212" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/utils.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/utils.py", + "sha256": "160ac665f20f2c75b343c1e784084f2b0b4d1cf8fdb28ee15deee4dc8ed0ce45" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/worker/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/worker/__init__.py", + "sha256": "f08d296d3560c42173ae8af961af4a768033ccf1e36e9c17c0cdd53013d0c52e" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/worker/descriptor_buffers.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/worker/descriptor_buffers.py", + "sha256": "be7c81be214e995da8499105ba485854d9c19d6f8e905f8f1b87b83694ca0864" + }, + "vllm/distributed/ec_transfer/ec_connector/example_connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/example_connector.py", + "sha256": "09022ce07a89114bb65d9befd2e60873453aed11bbac8c0a75c1e6084e785a5f" + }, + "vllm/distributed/ec_transfer/ec_connector/factory.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/factory.py", + "sha256": "d6cedca0a99c3dd2b03cd1c15d17472b983e3f7d8f5baf4a12eecaf6abedb817" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/__init__.py", + "sha256": "1cbfc2f95f8f4d48a9253056eb1fd4b562062884e3fd5cb6571583c352fc16f3" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/config.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/config.py", + "sha256": "98c60696f79d1de67d2364cd9e8a42a393b5c8e17ed9af2f971368e47891d7b3" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/control.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/control.py", + "sha256": "58e0d1a423fbe958bfa586ac26a17107e08d0b31d044b4c74ab4dde880e7ca9b" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/memory.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/memory.py", + "sha256": "d5e90b1348de670a70f110d58eedcbdbd053db72c21dd007c3f5275c53951149" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/metadata.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/metadata.py", + "sha256": "497a7e6dfffb7fce80a41d5989f96119b970c143df77bb9d0f9c91d7a46e8c42" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/producer.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/producer.py", + "sha256": "97fa4d0b19475574778eab02f55fad73db9642beb9156da890314fd53fa1a7ab" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/reservation.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/reservation.py", + "sha256": "4790bc65cde4db5f17733ca2c2910980ba594a8a9b79ee27c5b957dffd4c1113" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/scheduler.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/scheduler.py", + "sha256": "53004b62529a31fdd80dfb2e6026610b95041a77e91f731ae526fefd84e7968d" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/state.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/state.py", + "sha256": "92f375d6c5cc9c83dbe95a7977ad8eb0f1b5629ccee92968bcacdc94eee15d65" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/transfer.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/transfer.py", + "sha256": "ada2113a5402054f1149d3edc2537f4e5e1bd696c9b17291c9f2b4cbf6b59753" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/worker.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/worker.py", + "sha256": "89eb91bb64845b3b121d502972a6b04d448714253becd2ea662e5691cd5acdd7" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake_ec_connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake_ec_connector.py", + "sha256": "aaebab4711bc00dd0c622dfbfd8639fc41e7ed5d1658d7d68fe33e4d5fbef3ba" + }, + "vllm/distributed/ec_transfer/ec_connector/utils.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/utils.py", + "sha256": "11b9014b9c0697f8846deff1a55a22fa86a15dc2ac3e139442fb6d513ac03059" + }, + "vllm/distributed/ec_transfer/ec_transfer_state.py": { + "path": "/vllm/distributed/ec_transfer/ec_transfer_state.py", + "sha256": "9487a41f23fa1a4fa6dfca8b42b8e97a0ee19d8406ffd1dcf4bef66315180827" + }, + "vllm/distributed/elastic_ep/__init__.py": { + "path": "/vllm/distributed/elastic_ep/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/elastic_ep/elastic_execute.py": { + "path": "/vllm/distributed/elastic_ep/elastic_execute.py", + "sha256": "b8f60a4183c79ff6051095b5f95bb385bc7fea0cffe8cd9ebc9087ab0e9f01b5" + }, + "vllm/distributed/elastic_ep/elastic_state.py": { + "path": "/vllm/distributed/elastic_ep/elastic_state.py", + "sha256": "fbf049199841a086fdf2fc1ab8498ef017ad3bf319db65c3ae61acbb536d2e10" + }, + "vllm/distributed/elastic_ep/standby_state.py": { + "path": "/vllm/distributed/elastic_ep/standby_state.py", + "sha256": "15282597550ebd0e07b8492ff192aea1ec0dcec8f0ad34009123e1002cc140c1" + }, + "vllm/distributed/eplb/__init__.py": { + "path": "/vllm/distributed/eplb/__init__.py", + "sha256": "1b9c2ee22abb5888c354c5aa01f0944f253e5e24e135d019778398bbe495a628" + }, + "vllm/distributed/eplb/async_worker.py": { + "path": "/vllm/distributed/eplb/async_worker.py", + "sha256": "424328600ad1003286fc5dfffa1f9482007314c060947818b2f94a8b97811f5e" + }, + "vllm/distributed/eplb/eplb_communicator.py": { + "path": "/vllm/distributed/eplb/eplb_communicator.py", + "sha256": "ba30d9d40e7b81d3f42aa9041d2f328edca4073cfe2de920285eb68375501ed8" + }, + "vllm/distributed/eplb/eplb_state.py": { + "path": "/vllm/distributed/eplb/eplb_state.py", + "sha256": "2f06bc8c63f3fdf55edb5032ae55c0ffcac3e67720ce74ea312e3d141b12acf4" + }, + "vllm/distributed/eplb/eplb_utils.py": { + "path": "/vllm/distributed/eplb/eplb_utils.py", + "sha256": "058af6104faa6d4085c1dca80bbe60d92bf0a7ec9cd92c775a180546c9d8c9c3" + }, + "vllm/distributed/eplb/policy/__init__.py": { + "path": "/vllm/distributed/eplb/policy/__init__.py", + "sha256": "daeb266c88442832b1ab8c8c4cc064891b38b9e9ba00aea324f926c87dc6d37e" + }, + "vllm/distributed/eplb/policy/abstract.py": { + "path": "/vllm/distributed/eplb/policy/abstract.py", + "sha256": "b9fd34c28bbfdded03360d7f3f6f8fb978e82689190d7ae4501dfe520e958c62" + }, + "vllm/distributed/eplb/policy/default.py": { + "path": "/vllm/distributed/eplb/policy/default.py", + "sha256": "3b54229e6240d050480390f6b29d4744fd38437d23719f78a6decf7002296a29" + }, + "vllm/distributed/eplb/rebalance_execute.py": { + "path": "/vllm/distributed/eplb/rebalance_execute.py", + "sha256": "b387e228791149018536eee96cf955b33ba79d801cdc36849d1b47a580ec2597" + }, + "vllm/distributed/kv_events.py": { + "path": "/vllm/distributed/kv_events.py", + "sha256": "de08f01e8736881560256c350a3b6418999dd4aa30f9c6ec9159527f7ed6899a" + }, + "vllm/distributed/kv_transfer/__init__.py": { + "path": "/vllm/distributed/kv_transfer/__init__.py", + "sha256": "c1be4e58ec6923bae607a355ad22891c740f056a69ff7358b1e10ea3fd2680ea" + }, + "vllm/distributed/kv_transfer/kv_connector/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/base.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/base.py", + "sha256": "2ae2a2c48f5731f3533166a75440fe91e764332305b5d713df840edba970789d" + }, + "vllm/distributed/kv_transfer/kv_connector/factory.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/factory.py", + "sha256": "add99c93c587b0098b90b1f8fd6940bdd1f15c236c5c6f1a258411863cb902d3" + }, + "vllm/distributed/kv_transfer/kv_connector/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/utils.py", + "sha256": "317ed40dc837671ca6e666165222e641a0f9b3992aea63bbf54de7e13d40b3a4" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/__init__.py", + "sha256": "5beb6ccad12fdcfe1581982da6f18321caca50e73a6b3259ebf3c8dc8b3ffcca" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/base.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/base.py", + "sha256": "97af64220475c6c9e8273438d7b5138b105ebe6944beb783facb36a3bb76f31b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/decode_bench_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/decode_bench_connector.py", + "sha256": "b4151c88cdec28f1ff9259047abc17baf23b892f4b68769a93bf26e0442b9017" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/example_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/example_connector.py", + "sha256": "6226876ef52d10d0d284d29c337ab44698e8bac6abdb2e0ece53b5756c55d068" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/example_hidden_states_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/example_hidden_states_connector.py", + "sha256": "58c22534dcad0fb73599a2d70a2fb104d5b612a4723be5e777f56a56fe07892c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/flexkv_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/flexkv_connector.py", + "sha256": "de4f68c3bd565ed898e47e0b2980049b966ff31888f1957050d30995d4953762" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_client.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_client.py", + "sha256": "bea6ecff2be281c7e96c1551c7bf463cbb01f2964696067c0ebdb683844f9aab" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_connector.py", + "sha256": "e67ed58015090e5eea9d499883f2a9422673d07f8bdbe0ccff7db15d2460de13" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_metadata_server.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_metadata_server.py", + "sha256": "6800e5cf37809f8a8e28c469c14a434db288bc3bf83a8b62ee06910a20c2da19" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/common.py", + "sha256": "8f2c02c08227a9093e6aeb183961aba36b7812cfc29b8c047a2b2c9d82f79c15" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/gather_scatter_helper.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/gather_scatter_helper.py", + "sha256": "08c1b43de34fbeca77357d7576ac1d17cba974b59d695562f68bb713061e7b54" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/hf3fs_mock_client.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/hf3fs_mock_client.py", + "sha256": "bec61a9b0c4b9124b2292d7646d76411da44396389349b53cdcbc46353c8780e" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/connector.py", + "sha256": "8c61094ce0a3a702908f9576f69482e6bf314738a2cbe33a7d3b47258fa0ab43" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/stats.py", + "sha256": "d9383a6ad6ab6b8f812d29d90495407b770eeddb79b86e9d0e3216c0bd16e0ed" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/worker.py", + "sha256": "251c0d8e57e4739c03ce3e1c899a95ff5b1752eb27676c28ab88c4ebd62c4776" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_connector.py", + "sha256": "5991f9ff8832df32bd421eb67e48237270ea0a408180e523810bb43606acf8f3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/__init__.py", + "sha256": "c53be9796e76cde637514bfc40a525d8c09bb2784b406cb516790d8285dfe433" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/multi_process_adapter.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/multi_process_adapter.py", + "sha256": "6480d67b31ed603027a83edf327880a38aee45eaeee2da9a4efa93e95527c166" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/utils.py", + "sha256": "e204fa6a853ac9c122d7a4e9d146902230f81c48d4321ed5edfdbf979dd49ba2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/vllm_v1_adapter.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/vllm_v1_adapter.py", + "sha256": "e6fe55049c6b007248516d69640e2f3a4809f9d286091a1014ae0949987fa8f1" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py", + "sha256": "c712c386a7c57bf0355a1441ba574232c3aa5498fcb70713a2b3f5d18b64f9c1" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/metrics.py", + "sha256": "de1b1797d0448f74370919dbb0278767f390e8f59e00a0c0528abefb302babc2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_connector.py", + "sha256": "516be01320e64b0110e102eeb69a6ba766dd5ac8cb3036db6b97b7d54413323d" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_utils.py", + "sha256": "26877610463fa8e9d6b092772f2551bcc0c3ac794cbe63996df0414666a8ebba" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/rdma_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/rdma_utils.py", + "sha256": "716e5042edecaba36c7ca763474988f32fa09c2668b8260260149df610af8f83" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/stats.py", + "sha256": "f39b2f0b1db2e4f922e27e684a3f7bbf5bb279b82a0a8c3bb0c7ae69b6d14d24" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/connector.py", + "sha256": "17a350bdb89e17e415d6c52a48684dc15c35a804378daf03e1f3bee1b1b123a3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/coordinator.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/coordinator.py", + "sha256": "a8eb6c2157a96e8d25233b82347ac8409a41d6390b4f2c64242119c05911010c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/data.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/data.py", + "sha256": "d3cfefdb4165a24995749cba452641b318065baa95bb1bae62f922a2f8886e7b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/metrics.py", + "sha256": "f2b9ef8927632d142aad11a374d0725c6e619ea0bb7fea9eda3f3895eb7d277a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/protocol.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/protocol.py", + "sha256": "ccb1cf6a84a932a375215627d2aaac482c351a05df015d636d05373a6845b7c8" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/scheduler.py", + "sha256": "283849ff581ec206444cdf5621622377f1c925e8d7e05cb9294af2f3a5094e79" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/worker.py", + "sha256": "55f1682dfd1ed7af689166421337126a0e1d08afa4774a242e098d79e0c1e95b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_common.py", + "sha256": "549bb4fe22dca5095515b9c0712c31cc81a9d4923881e9f112317640fd8c04ab" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_connector.py", + "sha256": "c0f474bc34b579d889fae92eaf43eaca241be51a4697a187a942f0df4e6b6a98" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_engine.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_engine.py", + "sha256": "d842f3772fc6588d5a329a67572324cb74709aa3df4033e64c791a1e706c8e88" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_layout.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_layout.py", + "sha256": "2b4ec046a78897236b0626939bb828b6ec095355097d10bca39e5f3e1c992553" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/multi_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/multi_connector.py", + "sha256": "12d8387239f3194f2cb63ccbd64824648047210323572d66671e6a1eed349fc3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/__init__.py", + "sha256": "cc3145fe3b6d219a267bf40a0f7c0cc9430e4289f94acab2df761b99b671e7ba" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py", + "sha256": "7a1db8c54e4cd846bdac747344f2aea2c2fcf507817928796063225223b7e169" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_worker.py", + "sha256": "49a2e4faf99bef146b5a1d4d18d48f240b1e561c438252274494b359db96ef52" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/connector.py", + "sha256": "b6a0dc916d052f344be72ecfcb111509c13580102c11a860fa726cf0888949a9" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/metadata.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/metadata.py", + "sha256": "2b23a07c1ec5ac5490c3b818737c7192e344ea9f52cd5623f75939f741ab4e21" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_scheduler.py", + "sha256": "ac3daf8e2246581fec84ab28f2133569421b62c32a120be4923e2f4d0f2f9de9" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_worker.py", + "sha256": "e5060c9b6cf022de35ca3d1da7a369cd6a6a2dea26219af9f7633aaf78af8a76" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_scheduler.py", + "sha256": "2d9008e33937a4d6c5cf9cc2f96160f2bdbc8e987fe37f0798a7fd7eb84c9572" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_worker.py", + "sha256": "87de3ea383dd3aa95fb2c287ea26ded8a330859cc1295f9faa69047e80865c2c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/scheduler.py", + "sha256": "09f1bfe7075b926b26a94529480e33b62c3ac273ff826f6c502084f08b1b2a08" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/stats.py", + "sha256": "3e710654e0b68d1a8592f0c4735c81b22f4bf698fb1a2dfea126d35bf2dd1ef2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/tp_mapping.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/tp_mapping.py", + "sha256": "2d43607f98701b2fad6cc0ac2767619a80b7fc2b3a3c2eb6ed0da4fb05dcd8f6" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/utils.py", + "sha256": "93de863fc8307a61d40b62f1b176b57ae93c363d34b9e9ddc8e666265b6d45dc" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/worker.py", + "sha256": "5134a36ac100ce7a64f5311029a37ac12c38d91093f63100f51f7fe53ea7c3ee" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/canonical_mapping.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/canonical_mapping.py", + "sha256": "e0b3c6f9806a650e0370c43c5068fc31c0fec94615089e15fdf270d7d96f2b64" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/common.py", + "sha256": "9b3f042c6fa1581d10e8f688d2d9bc927bb41b780a9ea01f514d57228e20c978" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/config.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/config.py", + "sha256": "aea82e60889e78dcad8564ec8285b65a6a372824a1545a98ea8e78b6f4fd418a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/events.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/events.py", + "sha256": "d7039b67be95fd444966628184040a94880873c0611c0e6e7525a22650ffdefb" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/metrics.py", + "sha256": "13d76df014e86691f58dc89a879f9808b124690c9267dd5fa3b2d4004d4c5fdf" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py", + "sha256": "2c5282f4a3165cd787fb355e215e3869f1bdd3f2c795b2155fc537c9d135191a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/worker.py", + "sha256": "acc2df53262441dfc6421a3af7f0cbd68cbfaedbd42bbc384d8e1da2d965d194" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading_connector.py", + "sha256": "cdc16ca7339a10e1993bd6220e6273f86a4e99779f58f25098a24ad31bb0dbd8" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/simple_cpu_offload_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/simple_cpu_offload_connector.py", + "sha256": "96238ca82ccf07a1eeb59b8f66de17b09034e3eb993ad9a0a836511d3f69706b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/ssm_conv_transfer_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/ssm_conv_transfer_utils.py", + "sha256": "59a949709482e65a007fbe5352fe9b4bb54c2dcc10ad2c1c41f754b6e13299f4" + }, + "vllm/distributed/kv_transfer/kv_transfer_state.py": { + "path": "/vllm/distributed/kv_transfer/kv_transfer_state.py", + "sha256": "2e5fe09438d6e2ee642f8a26cf7dcf632e870d955d30baf002b76a8bfe836d05" + }, + "vllm/distributed/nixl_utils.py": { + "path": "/vllm/distributed/nixl_utils.py", + "sha256": "0bffa3c052c9f67472b1c0bc3816114891b010c968bf4b8a292e7da4d687db53" + }, + "vllm/distributed/parallel_state.py": { + "path": "/vllm/distributed/parallel_state.py", + "sha256": "d9b10ad56833ebc08a753e1a050ef0989c30d4134021b7b7b00150b7bd01adc6" + }, + "vllm/distributed/stateless_coordinator.py": { + "path": "/vllm/distributed/stateless_coordinator.py", + "sha256": "f52848fbe985ed47b1f3e3ca555314736ca06436e8d738ab4390101f0672dcb0" + }, + "vllm/distributed/utils.py": { + "path": "/vllm/distributed/utils.py", + "sha256": "792146b357139e705064a68d3b66858de8a0baaca4dc7db1232fa217d45db231" + }, + "vllm/distributed/weight_transfer/__init__.py": { + "path": "/vllm/distributed/weight_transfer/__init__.py", + "sha256": "3fb9d4712b7c131d522f5e76e73cd8c333f3cc7af86e2d5ecf9b61b57b3b7f5a" + }, + "vllm/distributed/weight_transfer/base.py": { + "path": "/vllm/distributed/weight_transfer/base.py", + "sha256": "8ab06feb04f1379d0558fbdb77fde46bc84f179e0a26742cabab937e88caa38d" + }, + "vllm/distributed/weight_transfer/clients.py": { + "path": "/vllm/distributed/weight_transfer/clients.py", + "sha256": "ff85c79c350241e6d2749ca23c9d295a3289b4b62bfdf0257d32eb94a0151d36" + }, + "vllm/distributed/weight_transfer/factory.py": { + "path": "/vllm/distributed/weight_transfer/factory.py", + "sha256": "4e979eeac8c5bcdbffb10eb4765cfb30120fa7595c6c2561d3fa1a966ced61c8" + }, + "vllm/distributed/weight_transfer/ipc_engine.py": { + "path": "/vllm/distributed/weight_transfer/ipc_engine.py", + "sha256": "1af578293f387a19073c322b24143c3ae4716ce0c5d2bac2a4ef26fe20119330" + }, + "vllm/distributed/weight_transfer/nccl_common.py": { + "path": "/vllm/distributed/weight_transfer/nccl_common.py", + "sha256": "7b2ef7dc7481c3f478f17c49aa36c7bed54142ec5c93d36ed8426c8fdf09e500" + }, + "vllm/distributed/weight_transfer/nccl_engine.py": { + "path": "/vllm/distributed/weight_transfer/nccl_engine.py", + "sha256": "7fd020c919dc7b4723fb78e64da977b180d0fef0cd21df955a037b848dbaa008" + }, + "vllm/distributed/weight_transfer/packed_tensor.py": { + "path": "/vllm/distributed/weight_transfer/packed_tensor.py", + "sha256": "d0a27fb0be1dc029bd5a1d44fdb57a5e54aa4cd74308bedc339e86ac02c7494c" + }, + "vllm/distributed/weight_transfer/sharded_rdt_common.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_common.py", + "sha256": "be0b13801f24e7b62999b19d733c030510353603a2d5320d5dc98ee02daf22a2" + }, + "vllm/distributed/weight_transfer/sharded_rdt_engine.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_engine.py", + "sha256": "2f791970b4815511a7578ef6c957e7da97b071d26a39087a09a17475909791ee" + }, + "vllm/distributed/weight_transfer/sharded_rdt_fake.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_fake.py", + "sha256": "ee11164e17b5f2793252ce77741b8b94e0583046abf896a590131b2008d1fbb9" + }, + "vllm/distributed/weight_transfer/sharded_rdt_trainer.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_trainer.py", + "sha256": "dd413ff461d41826ccd3eb87d3df22f6cd7f24e09aac7644e3e5b40d7beec484" + }, + "vllm/distributed/weight_transfer/sparse_nccl_engine.py": { + "path": "/vllm/distributed/weight_transfer/sparse_nccl_engine.py", + "sha256": "e11b409454dda2b05ea34e8115ac19027c5e65cb2a5e9682c494f16a50e978f4" + }, + "vllm/model_executor/determinism/__init__.py": { + "path": "/vllm/model_executor/determinism/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/determinism/batch_invariant.py": { + "path": "/vllm/model_executor/determinism/batch_invariant.py", + "sha256": "af8f8d256a48fc214edf426fbe891fb15bd8b1d7ae98b811c736ff1eb0fae798" + }, + "vllm/model_executor/determinism/batch_invariant_configs.py": { + "path": "/vllm/model_executor/determinism/batch_invariant_configs.py", + "sha256": "72ea0d4df0ab5ae288abb7df5c203d2ad5f1709c7295d87ec72da775fddc1b7a" + }, + "vllm/model_executor/layers/fused_moe/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/__init__.py", + "sha256": "64a32665be6d5afcfbaf7a0915717267278b66b880b908b0263ea58f08e51b5e" + }, + "vllm/model_executor/layers/fused_moe/activation.py": { + "path": "/vllm/model_executor/layers/fused_moe/activation.py", + "sha256": "78dec0e85e0c040304515f64ccf8f2c6a7a2e5b9f1124a2138a97d9a02585541" + }, + "vllm/model_executor/layers/fused_moe/all2all_utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/all2all_utils.py", + "sha256": "dc4750a446f7de31d09a46034da5fdf479bc169af90f47aa9af8ae15e67b0828" + }, + "vllm/model_executor/layers/fused_moe/b12x.py": { + "path": "/vllm/model_executor/layers/fused_moe/b12x.py", + "sha256": "ee76cc6aa801e24be8ec78a9e8502061ad48667d5ff8711e43f68fba912425bd" + }, + "vllm/model_executor/layers/fused_moe/config.py": { + "path": "/vllm/model_executor/layers/fused_moe/config.py", + "sha256": "a3a87cebcc7ac85d73f471dcfafc2d899c6fc08f264777b74a0e919adac9e03f" + }, + "vllm/model_executor/layers/fused_moe/deep_gemm_utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/deep_gemm_utils.py", + "sha256": "8fdcd857eb333f9c68902105f157568d52067c94ba1e2df6dbfe0474ef1f4c02" + }, + "vllm/model_executor/layers/fused_moe/eep_reconfigure.py": { + "path": "/vllm/model_executor/layers/fused_moe/eep_reconfigure.py", + "sha256": "9d7580265e8563e1140c2bb4c3a81a35ddd54903f5ec0a2720ffc064681f02f9" + }, + "vllm/model_executor/layers/fused_moe/expert_map_manager.py": { + "path": "/vllm/model_executor/layers/fused_moe/expert_map_manager.py", + "sha256": "308c00f63fcb6f44518ec3a56d8f902c7bba75928c2e3aea30fbe1f3f473973b" + }, + "vllm/model_executor/layers/fused_moe/experts/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a16_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a16_moe.py", + "sha256": "53deea255175171971422d14082ad139b5ec7b62e21429a4c7cc0ebbefd29cdc" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a8_moe.py", + "sha256": "f3fc51b95ed89862381908a0134e326228827f44854248db9585a9c4899c34f4" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp8_moe.py", + "sha256": "af6db1760961a5a71234f8b1cdf42e9e30a236e13601b0826a75110b79724948" + }, + "vllm/model_executor/layers/fused_moe/experts/batched_deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/batched_deep_gemm_moe.py", + "sha256": "b0cd4ea706583518dc608fb56f832fc3595f24bd863b03ef1e8c22b36b873508" + }, + "vllm/model_executor/layers/fused_moe/experts/cpu_int4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cpu_int4_moe.py", + "sha256": "67170af3ba9dc4c4f71d78a72efc3fa4e366eac614936a79911dae5c75ac1864" + }, + "vllm/model_executor/layers/fused_moe/experts/cpu_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cpu_moe.py", + "sha256": "0754cd4ff1b28e6d3932a67609d335acefd28f95a841f0492923813356a6d81e" + }, + "vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py", + "sha256": "db901bdbcd3fdac23a1d74e39c51e67f14a82be787b2fd704ed1e787372ae868" + }, + "vllm/model_executor/layers/fused_moe/experts/deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/deep_gemm_moe.py", + "sha256": "16911a64a72eafc26a1bcb544a91f90144d85dc41e3ee57cf20e89925227bbb7" + }, + "vllm/model_executor/layers/fused_moe/experts/fallback.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fallback.py", + "sha256": "1bdd0a4f2ebaa40ec96a5aacc07aee61511af59e6324ce456aa65003b6e2991a" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_b12x_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_b12x_moe.py", + "sha256": "e613afe5da2742e42c717c1a0a56bd9e1c7e3e0452a828db0013d81063518954" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_batched_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_batched_moe.py", + "sha256": "295254dfeeec8df3eb8110e6f659a946cb9cded3de1565ecad4d741b3c3f3e00" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_moe.py", + "sha256": "08578bcd0cf72d6a470e40950175e73639efaa6d8d23c6da0869345312b229c9" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutlass_moe.py", + "sha256": "52887cec5fe628e0a4e7793deb546b40f6c29f7362b3b436c10ca36934ab9826" + }, + "vllm/model_executor/layers/fused_moe/experts/fused_batched_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fused_batched_moe.py", + "sha256": "2435587fc7f8fe8ea341ea0eb8f14c11f3f5b31fbbb9b29ce569ad3bace6e6a0" + }, + "vllm/model_executor/layers/fused_moe/experts/fused_humming_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fused_humming_moe.py", + "sha256": "a6830a76ff7f4cd3479b9c8372a30d03e8301604555cbdbcd9ac89a813b7431a" + }, + "vllm/model_executor/layers/fused_moe/experts/gpt_oss_triton_kernels_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/gpt_oss_triton_kernels_moe.py", + "sha256": "1613a7a6b256e8faee6fdcfae84f293492db6229d28ceb3e8a8d6093af480e36" + }, + "vllm/model_executor/layers/fused_moe/experts/int4_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/int4_emulation_moe.py", + "sha256": "f12857caf0671a341687ad3c5f48616b816ed51e1bcbdefa0a7edbecdb81a79d" + }, + "vllm/model_executor/layers/fused_moe/experts/lora_context.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/lora_context.py", + "sha256": "9b41eefaaa57c5dd0dc54217ef95978821b0c52e90ea4db8b0752e08452bd3e5" + }, + "vllm/model_executor/layers/fused_moe/experts/lora_experts_mixin.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/lora_experts_mixin.py", + "sha256": "b2bc55ed6be98b526c6a5698e2d98300650e78555f56b1820e58c04888e2a373" + }, + "vllm/model_executor/layers/fused_moe/experts/marlin_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/marlin_moe.py", + "sha256": "93916b721548e6194dc70cf6cec224b4b1456a0cc0980235e97beba7bf36541d" + }, + "vllm/model_executor/layers/fused_moe/experts/mxfp8_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/mxfp8_emulation_moe.py", + "sha256": "d09c62ad1398c51ff6f515f2a61014ee9e9a9798d0fe9762c47f446efc5edbef" + }, + "vllm/model_executor/layers/fused_moe/experts/mxfp8_native_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/mxfp8_native_moe.py", + "sha256": "01a42cebf18189e566034111b2145573c655319e8af1a56db60d53a319c40613" + }, + "vllm/model_executor/layers/fused_moe/experts/nvfp4_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/nvfp4_emulation_moe.py", + "sha256": "f24467762b60702f0df122ed64786be839a838a9b6cafaecbd04d35fbfedb189" + }, + "vllm/model_executor/layers/fused_moe/experts/ocp_mx_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/ocp_mx_emulation_moe.py", + "sha256": "dcaa60a9ebdb0bd8223b37af41f018ce7f95716ec7cd8526850f4433a579213b" + }, + "vllm/model_executor/layers/fused_moe/experts/rdna3_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/rdna3_moe.py", + "sha256": "e4abd802dc2f0ad9b338ebde397633c761d881c37813e2dc229902c526b597d8" + }, + "vllm/model_executor/layers/fused_moe/experts/rocm_aiter_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/rocm_aiter_moe.py", + "sha256": "bf09a7b783f5752d61cab76221b32b598d8846d801ee39dc9209d636c9659c6f" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_cutlass_moe.py", + "sha256": "ffce5ad627c540940d122d8df7981644b2eb35d07d480995c0f4f30517815fac" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_deep_gemm_moe.py", + "sha256": "c7209fa5e1ccb184a68b37a0706fc571a76696c2ae79802ddc7f889b1c29684d" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_moe.py", + "sha256": "806fbccfe30f5fbd578acf773add99bdf022b12d617958bd6281aef6de369701" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_bf16_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_bf16_moe.py", + "sha256": "76256de96fefece9c41ffb1108487919e24da364cf4412c6c3474498aba59137" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.py", + "sha256": "b54c7ceb45e5d07aa905f42ea44caccf85ca35ba9fb825d4c01947764510f68b" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_lora_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_lora_moe.py", + "sha256": "dd35a9e4242c0dc8d691168813e14bd5543e591f02ee529d0691e07651942c5a" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_mxfp4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_mxfp4_moe.py", + "sha256": "fe780f125a3dc3ba919659e9b85340bd32afcbfe47733a002bfdfb92eadf400c" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_mxint4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_mxint4_moe.py", + "sha256": "2106d67c2951aa690c4656ca58240d09c366cffe8cb4d9fd575df016c377cc30" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_nvfp4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_nvfp4_moe.py", + "sha256": "e938ac9f058f7c90b41c9610513239bec54a95304bfb5ff5f6897ebd54733d7e" + }, + "vllm/model_executor/layers/fused_moe/experts/xpu_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/xpu_moe.py", + "sha256": "2a11bac0cf9274d963315efd6eebdc62978b0b7aa02e8849ff2a562742f0b86d" + }, + "vllm/model_executor/layers/fused_moe/fused_flydsl_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_flydsl_moe.py", + "sha256": "0e74879ee5c72f616ae4064b9dff3b3a0b583b7fc70b8f92f1e8b730ecd5d39b" + }, + "vllm/model_executor/layers/fused_moe/fused_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe.py", + "sha256": "7072eb06237be9d33dcb0ef7101410f886a6363c98cbee70a014c68b70f639cb" + }, + "vllm/model_executor/layers/fused_moe/fused_moe_method_base.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe_method_base.py", + "sha256": "18dcfc469d3252749801bbf943857f58da85de1f2db8fdff5a9f4986a925dc68" + }, + "vllm/model_executor/layers/fused_moe/fused_moe_modular_method.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe_modular_method.py", + "sha256": "321c744eac1fcaffd6b1b2971204c8baa57dfec53e91e5d24140014d72d64f83" + }, + "vllm/model_executor/layers/fused_moe/hpc_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/hpc_moe.py", + "sha256": "2ca9c5d71b6fd91651027905e2b83103a8823845e053e7153e148cb8e0ee666d" + }, + "vllm/model_executor/layers/fused_moe/layer.py": { + "path": "/vllm/model_executor/layers/fused_moe/layer.py", + "sha256": "def0b4e13bcc1e4e21ee10644e647e2eda1acbf0cc01e76d6128abb59ea08224" + }, + "vllm/model_executor/layers/fused_moe/modular_kernel.py": { + "path": "/vllm/model_executor/layers/fused_moe/modular_kernel.py", + "sha256": "8dc4e0dbbf35b3aac8add63ca6f2a7bbfdadaabbd60826e24598b22c7d8e5c22" + }, + "vllm/model_executor/layers/fused_moe/moe_align_block_size.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_align_block_size.py", + "sha256": "c3f7fc2087836f0160a32ab99ceb1d8f6e87c793679da34dd672e225cb7fa31b" + }, + "vllm/model_executor/layers/fused_moe/moe_fused_mul_sum.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_fused_mul_sum.py", + "sha256": "112e72578002c3bff538418dac64b3b56d995994a2fc5e32b18d2cf3b8392a13" + }, + "vllm/model_executor/layers/fused_moe/moe_output.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_output.py", + "sha256": "6ea4cbd78f9efc7f842c5df246f553f08b991c3479b8b04b89902ed08aaf8e8f" + }, + "vllm/model_executor/layers/fused_moe/moe_permute_unpermute.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_permute_unpermute.py", + "sha256": "1adc592c6254d0c877d66be5406afbc822459c18a838f4bbd094a992e7609d06" + }, + "vllm/model_executor/layers/fused_moe/oracle/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/__init__.py", + "sha256": "4dcf941d50d48bb812de0f39e9194bf17a76b8035fe324889c6038f710fdc453" + }, + "vllm/model_executor/layers/fused_moe/oracle/base.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/base.py", + "sha256": "555bbcd18a3744e64eee4e953daabef3bd268a1bd4faf967d4cfd14d6074f685" + }, + "vllm/model_executor/layers/fused_moe/oracle/fp8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/fp8.py", + "sha256": "245bd36c285df1e6f7c51e52dcda31ad247894577a9f8d765613c2c2feae9aee" + }, + "vllm/model_executor/layers/fused_moe/oracle/int8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/int8.py", + "sha256": "c1b67886511bd966b162db5bca8930f04895fb37a969818a4a10f0726c59547f" + }, + "vllm/model_executor/layers/fused_moe/oracle/int_wna16.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/int_wna16.py", + "sha256": "cfffe8b8b290330be9d18ffa07aeecf296484395ff04df3147d99393e48b55c1" + }, + "vllm/model_executor/layers/fused_moe/oracle/mxfp4.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/mxfp4.py", + "sha256": "b7915e6779b5c88e7dcd2d227f003a8e45071d6d86877013067142d4feb64a8c" + }, + "vllm/model_executor/layers/fused_moe/oracle/mxfp8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/mxfp8.py", + "sha256": "9cfdc8102a04bb844dcd7ed88043bba96ec751794bc093da76c69aa8cf88cf48" + }, + "vllm/model_executor/layers/fused_moe/oracle/nvfp4.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/nvfp4.py", + "sha256": "735b4cdeb1258f11fb02320fc0c70cab5edaca468dd60b07b2d369389d2b0313" + }, + "vllm/model_executor/layers/fused_moe/oracle/unquantized.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/unquantized.py", + "sha256": "c8b8203bd0b73bb7f586f703607394d663f14c05711416ad42d45af564382223" + }, + "vllm/model_executor/layers/fused_moe/oracle/w4a8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/w4a8.py", + "sha256": "d7fa6e2982f20b34d5ce9c5ce28a61122762a3fcdd53d249479472a4f2316c6a" + }, + "vllm/model_executor/layers/fused_moe/oracle/w4a8_int8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/w4a8_int8.py", + "sha256": "6d6f9ca2e67b630002873de2f8d8a231d091c5c2f0f3354a9e8209449b481a4c" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/__init__.py", + "sha256": "2800113263a83c2632e522fb22790b29f63384da75d43de32f0ae2f95e8ae4c1" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/batched.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/batched.py", + "sha256": "d52425dd8c08e47cf8d9c3088daf3b1cc721c8667de4c738d04ba997f9a08ccb" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ht.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ht.py", + "sha256": "465cdf1d6cee91b2ee8c2e43abbea6e8408976e3048c10f44c089f34b415bc60" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ll.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ll.py", + "sha256": "f704922b1db680c4c212982a096e09d6b3eb97d89110313f86ed958a00df21b7" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_v2.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_v2.py", + "sha256": "8d690b016bbcfbc9eb599bcc36a6f798b2f1720c828f4347ea742e218c0cc60d" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_one_sided.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_one_sided.py", + "sha256": "acb57d8342af62bb5672036871cd4b27ecc7f37dfa7c894850bb860e6152a1f0" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_two_sided.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_two_sided.py", + "sha256": "cc5b00d6a157b6eca5afaaf7435165dbd1b4524d6d88bf75808cbe074a389f79" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/mori.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/mori.py", + "sha256": "8e9c3b5b1f0de13f467d95bf2f451cba0e4b0d9a1bdcf98da0988a3a9a79a045" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/naive_dp_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/naive_dp_ep.py", + "sha256": "db015e5b18750bbbf5b2bbaceca877dd6f3f3e74c2a94e8dc185f7413b387f91" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/nixl_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/nixl_ep.py", + "sha256": "1f71d70ac509bf5d3d67a8d95a8ee108a50af6bb5d4bde7181ca28e286f6ffce" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/no_dp_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/no_dp_ep.py", + "sha256": "adbbf529cd22059c95b5380952943a70cf11e05e321dcd707f296bebde61a6e7" + }, + "vllm/model_executor/layers/fused_moe/routed_experts.py": { + "path": "/vllm/model_executor/layers/fused_moe/routed_experts.py", + "sha256": "68c48e5df0ea4a7cc1f04436b7b9153eb53802ecd9bb55d38db8738508daac6d" + }, + "vllm/model_executor/layers/fused_moe/routed_experts_capturer.py": { + "path": "/vllm/model_executor/layers/fused_moe/routed_experts_capturer.py", + "sha256": "cd006bc1a1703418cca3b589fafb2abc4268a086fb3db044bbb64348aeac8b13" + }, + "vllm/model_executor/layers/fused_moe/router/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/layers/fused_moe/router/aiter_shared_routed_fused_moe_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/aiter_shared_routed_fused_moe_router.py", + "sha256": "f47046db1275601a2c67c9232afc7b866c9623a19639d5be867e4c7914a35069" + }, + "vllm/model_executor/layers/fused_moe/router/base_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/base_router.py", + "sha256": "47fa2324bcd9b6ebdc138d69ae6b6ecc0f2463d34bda8c5988bdb0a2a76d3fae" + }, + "vllm/model_executor/layers/fused_moe/router/bf16x3_router_gemm_cutedsl.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/bf16x3_router_gemm_cutedsl.py", + "sha256": "d0f1edd1ebc48d88e490bdb3c93db49bdc0a135ff83e7e0b57130e9f8255fc32" + }, + "vllm/model_executor/layers/fused_moe/router/cpu_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/cpu_router.py", + "sha256": "bff36b15818c87bfbb7ee3def7dc7f6396860abbe5893ff6148801fe941a4b92" + }, + "vllm/model_executor/layers/fused_moe/router/custom_routing_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/custom_routing_router.py", + "sha256": "1a40c7054e3c3a1b3ee2e98f6bc9efa9dfdc11f316a8edf7357dd91533487bfe" + }, + "vllm/model_executor/layers/fused_moe/router/dsv4_topk.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/dsv4_topk.py", + "sha256": "14f7c8487b9aef652dd61c91e0e3c3640b643bf9cd0d8a7184157d71f4beb63e" + }, + "vllm/model_executor/layers/fused_moe/router/fused_moe_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_moe_router.py", + "sha256": "0daa0dc05b931d66767feca444a4cd57ecf140f59b40ea0e8ad213eef6da2b36" + }, + "vllm/model_executor/layers/fused_moe/router/fused_topk_bias_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_topk_bias_router.py", + "sha256": "8fdc28cc248180ad4f11bb4bcda3df47926ec12665a0d84bb712fe83fc6b9376" + }, + "vllm/model_executor/layers/fused_moe/router/fused_topk_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_topk_router.py", + "sha256": "1c80f4af4d781fd66b12aa6a7a0fd30082bc521df40f1252987a8ac4c0bef51c" + }, + "vllm/model_executor/layers/fused_moe/router/gate_linear.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/gate_linear.py", + "sha256": "faa43362c2e7c568498a923c682ca18cae75e87f48d00882770821cb19c21198" + }, + "vllm/model_executor/layers/fused_moe/router/grouped_topk_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/grouped_topk_router.py", + "sha256": "048339e1799cdd42c9dae686a6cb891046577fb391b500f0d12eed73c8f61e52" + }, + "vllm/model_executor/layers/fused_moe/router/rocm_fp32_router_gemm.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/rocm_fp32_router_gemm.py", + "sha256": "9c331ef3d0bb2fb6954387d77ac62a99c5c76d2753c7438bfbb5115f68aae5ac" + }, + "vllm/model_executor/layers/fused_moe/router/router_factory.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/router_factory.py", + "sha256": "019bc8adaa7642abab82843efd53cd1a378f62c652521a1de2b781480eb88742" + }, + "vllm/model_executor/layers/fused_moe/router/routing_simulator_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/routing_simulator_router.py", + "sha256": "a7345df5add00cf3bd93024492d6fc1189fd3ecf2754a11cef1b03a295d791f7" + }, + "vllm/model_executor/layers/fused_moe/router/zero_expert_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/zero_expert_router.py", + "sha256": "dea306edd92e2b9c1b43f982ede8e1e10770d2c66220f5a106e0ed0165276e9c" + }, + "vllm/model_executor/layers/fused_moe/runner/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/layers/fused_moe/runner/moe_runner.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/moe_runner.py", + "sha256": "05893188402fe37229bf72d75088d66193c417d5d502daafd3a55e1bfedaa60c" + }, + "vllm/model_executor/layers/fused_moe/runner/moe_runner_interface.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/moe_runner_interface.py", + "sha256": "189cad01611124eb44594713cbf5918d16fc70196dc81a525ae0a7a97a5fcc51" + }, + "vllm/model_executor/layers/fused_moe/runner/shared_experts.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/shared_experts.py", + "sha256": "d89e4c79c46f6fe61262c51f3facf102e71ce1e4eb3db67f72b6bd8470937be9" + }, + "vllm/model_executor/layers/fused_moe/topk_weight_and_reduce.py": { + "path": "/vllm/model_executor/layers/fused_moe/topk_weight_and_reduce.py", + "sha256": "3dfede72d52bf99af40997994704e6c502ee3bab2bd39bfaa8a68d7dae440203" + }, + "vllm/model_executor/layers/fused_moe/unquantized_fused_moe_method.py": { + "path": "/vllm/model_executor/layers/fused_moe/unquantized_fused_moe_method.py", + "sha256": "182a5ec1874ece2091a24c5303f6ab9ea64a9a61adf325b863927f0cdd83e5d3" + }, + "vllm/model_executor/layers/fused_moe/utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/utils.py", + "sha256": "a93a0bded4008db19d8b38370526ae34fafb9c8278e5b4f60acb6acc8fdc1850" + }, + "vllm/model_executor/layers/mamba/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/abstract.py": { + "path": "/vllm/model_executor/layers/mamba/abstract.py", + "sha256": "dfdc8c836894f574e41d93d76ab989cacd3d7ecf59c97a929abfa48d9364e8ad" + }, + "vllm/model_executor/layers/mamba/gdn/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/gdn/base.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/base.py", + "sha256": "7fec748fc74131f5a45bcaf2644b3fa3a0598fd437d7347f8207ea3644a951c5" + }, + "vllm/model_executor/layers/mamba/gdn/kimi_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/kimi_gdn_linear_attn.py", + "sha256": "1cec4da5c9da73557e192bfb36cd540aae51d3e91283b554449c4a97f0f89bd9" + }, + "vllm/model_executor/layers/mamba/gdn/olmo_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/olmo_gdn_linear_attn.py", + "sha256": "60873ca3bb0c4d17c33bd259b62b658db4883cd23138f47dd4ead62cd2ff0605" + }, + "vllm/model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py", + "sha256": "b80f8e6f3fff442fb880aebb3209c52f814f66490009f4ac4003de603576d10a" + }, + "vllm/model_executor/layers/mamba/linear/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/linear/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/linear/bailing_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/linear/bailing_linear_attn.py", + "sha256": "3c480ddd6eba0766ed012a1074bbec5f241d868a87b020b0f6312222c32f93eb" + }, + "vllm/model_executor/layers/mamba/linear/base.py": { + "path": "/vllm/model_executor/layers/mamba/linear/base.py", + "sha256": "26125cd427225954e1846ca361cdaf43f2b56f11b1e217cf26e91a80ef0edb6a" + }, + "vllm/model_executor/layers/mamba/linear/minimax_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/linear/minimax_linear_attn.py", + "sha256": "4adc00f54893b5bc6c31c613deda152a19af3b1bba04153ab5924c3bf2a3aaae" + }, + "vllm/model_executor/layers/mamba/mamba_mixer.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_mixer.py", + "sha256": "a485e937ad9db14d3ad03fde5a9fe795cfa863649563e52fc7e6c52ef631164e" + }, + "vllm/model_executor/layers/mamba/mamba_mixer2.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_mixer2.py", + "sha256": "d58d93e90d9eb90bc5133b79f07c7c62d0032b35d6cf916e3fe34367b81c5cd5" + }, + "vllm/model_executor/layers/mamba/mamba_utils.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_utils.py", + "sha256": "ce9845b4a4ef4bc46577a33038ed69d59ceccb52f30e9c5bdaa36e48be3b2ca4" + }, + "vllm/model_executor/layers/mamba/ops/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/ops/causal_conv1d.py": { + "path": "/vllm/model_executor/layers/mamba/ops/causal_conv1d.py", + "sha256": "044d005cfe59fd0818ed421274e04f3e8dd679b8cdb64fca9f4422f2643484b2" + }, + "vllm/model_executor/layers/mamba/ops/cpu/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/ops/cpu/causal_conv1d.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/causal_conv1d.py", + "sha256": "64104672890ac2ef240c20c7f8059beeade707178574809dbca8721dff5ea6fa" + }, + "vllm/model_executor/layers/mamba/ops/cpu/gdn_attention.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/gdn_attention.py", + "sha256": "a50288945bf5b102ad3025ae536638dcc32d84cf7c22aaf3a85326b0c1c56c1f" + }, + "vllm/model_executor/layers/mamba/ops/cpu/mamba_ssm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/mamba_ssm.py", + "sha256": "5839e576172a3246337f5e4fb1bc19eb583b3e2b2f7e35dd060dc3041eb8372d" + }, + "vllm/model_executor/layers/mamba/ops/gather_initial_states.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gather_initial_states.py", + "sha256": "5198bb6de6d91c583a5f65d926412a76ee04a06fa72aaba76eaf156b27cd0523" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/__init__.py", + "sha256": "b88b52e71fcb21bd3fa215ea171dcd2ad2ff17c97788cfe64caa7ba45c7ecf97" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_h.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_h.py", + "sha256": "f50bbe5c0b6382323ec5dfc24a5e0c7971113d59727515e60c9fe3689734e5ba" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_kkt_inv_uw.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_kkt_inv_uw.py", + "sha256": "b4a65dd194907db08865e0596fe254f915e670a9e6b27ffa2933c1026dde9b1e" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_o.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_o.py", + "sha256": "629f7843a7e611efb9390f2ebb7a4b924b2c328d48a317fddfaa96af4d9bc60a" + }, + "vllm/model_executor/layers/mamba/ops/layernorm_gated.py": { + "path": "/vllm/model_executor/layers/mamba/ops/layernorm_gated.py", + "sha256": "3433f2e3b87c2b2ccf8e9794ce40762c86a6da38a94ecee001f439ea0d0373dd" + }, + "vllm/model_executor/layers/mamba/ops/mamba_ssm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/mamba_ssm.py", + "sha256": "a4515ec7895b40ed878cf380445034b25faa61fbaa799d96c49217bbdfd7e400" + }, + "vllm/model_executor/layers/mamba/ops/replayssm_config.py": { + "path": "/vllm/model_executor/layers/mamba/ops/replayssm_config.py", + "sha256": "5fe9d5d7aa2de6a65875b3796a919b22bc435fd76055ba054bbff43aa005bc44" + }, + "vllm/model_executor/layers/mamba/ops/scatter_states.py": { + "path": "/vllm/model_executor/layers/mamba/ops/scatter_states.py", + "sha256": "f3bb004c73edaba56337747893eb07faf29b270dc8bb9c893ee9b1044e4ead9a" + }, + "vllm/model_executor/layers/mamba/ops/selective_state_update_replayssm_output_only.py": { + "path": "/vllm/model_executor/layers/mamba/ops/selective_state_update_replayssm_output_only.py", + "sha256": "cea7fd3063ca9dcc4e33f180d01ea379195ec515cedc9d0b03b11dc67670d695" + }, + "vllm/model_executor/layers/mamba/ops/ssd_bmm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_bmm.py", + "sha256": "26983d97a7f5c5f9197a16a6bee7b1294839b9ae31a14c14aaee38b43523e630" + }, + "vllm/model_executor/layers/mamba/ops/ssd_chunk_scan.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_chunk_scan.py", + "sha256": "d5ef32e8cb47e2ce71984579df78ab69754895f891766394daf327867cfa4f8f" + }, + "vllm/model_executor/layers/mamba/ops/ssd_chunk_state.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_chunk_state.py", + "sha256": "177e3aa7fe72647133bbd86135533e8688a5802678d4d1564aa549410362316f" + }, + "vllm/model_executor/layers/mamba/ops/ssd_combined.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_combined.py", + "sha256": "1317bbb668d3c60dfe0658850f9968614f03fa5eb61196f8ce6ac17dbb31b480" + }, + "vllm/model_executor/layers/mamba/ops/ssd_state_passing.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_state_passing.py", + "sha256": "36b8c8edba437916a5b789717c61fc22077de01e77892cb96dbff3b00a57410e" + }, + "vllm/model_executor/layers/mamba/ops/ssu_dispatch.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssu_dispatch.py", + "sha256": "bbe0f0e61da87f3ddfead19a79ca376516b63f1ea868be3485333c63fa20ef41" + }, + "vllm/model_executor/layers/mamba/ops/triton_helpers.py": { + "path": "/vllm/model_executor/layers/mamba/ops/triton_helpers.py", + "sha256": "a8795532f22c37a93e82c9d8e3fadcb5f4da98673d7b321fe8481305eaafad30" + }, + "vllm/model_executor/layers/mamba/short_conv.py": { + "path": "/vllm/model_executor/layers/mamba/short_conv.py", + "sha256": "228494efab185ee17374f762874f4c8b9a26aac9decfa8c906ce38446e0de51a" + }, + "vllm/model_executor/models/qwen3_next.py": { + "path": "/vllm/model_executor/models/qwen3_next.py", + "sha256": "4fa5112ac2bf7886d41d9e1f6c3da8793620d1ec49c961b31e9609459a6a7f7a" + }, + "vllm/third_party/flash_linear_attention/__init__.py": { + "path": "/vllm/third_party/flash_linear_attention/__init__.py", + "sha256": "5dbbfa3fc286edb2e970e175ef33cee4f6181c89b0784f5a8986201b2312f54e" + }, + "vllm/third_party/flash_linear_attention/ops/__init__.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/__init__.py", + "sha256": "dd738dc1d08045e76455cdbe16052a5b769e0eb11d6e87ff28353994f880cd6c" + }, + "vllm/third_party/flash_linear_attention/ops/chunk.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk.py", + "sha256": "c105ead259e86aedc248c53e7c4cef07034d0ff12da608d80265d1dd0990803f" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_delta_h.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_delta_h.py", + "sha256": "1b3ad391f939d9443c6b7adb19e57fe381bd5dccea064e8417a4f85b0e713b26" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_o.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_o.py", + "sha256": "3b63b836a8cc561723c23db5a528a0b474d9cd78508d610f0b348c585a889a19" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_scaled_dot_kkt.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_scaled_dot_kkt.py", + "sha256": "7ae41df3755acc7e925a134d848f78bb5fc00b90069039d86403c5853323ea42" + }, + "vllm/third_party/flash_linear_attention/ops/cumsum.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/cumsum.py", + "sha256": "d818215669b451868823202ac0bcea77e7a9d75957254c7c1060a73a55dc39b6" + }, + "vllm/third_party/flash_linear_attention/ops/fused_gdn_prefill_post_conv.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_gdn_prefill_post_conv.py", + "sha256": "590717b2107abc90d72548de06b5d315229eb2775c94614f3f545df11cc2b5df" + }, + "vllm/third_party/flash_linear_attention/ops/fused_norm_gate.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_norm_gate.py", + "sha256": "e6eb90467f29d8a0a04f2a364d20a2c3191b6ab857841bfb82076b33a6022d1a" + }, + "vllm/third_party/flash_linear_attention/ops/fused_recurrent.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_recurrent.py", + "sha256": "fe6f1311014809040497aa0a623e7fa97f4b3457cdc7ee1f1f8aed21f326f755" + }, + "vllm/third_party/flash_linear_attention/ops/fused_sigmoid_gating.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_sigmoid_gating.py", + "sha256": "000ab8996af9788fdb8843a6a3b91833e7a14c8acc0e1ea073a536330f64cb6f" + }, + "vllm/third_party/flash_linear_attention/ops/index.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/index.py", + "sha256": "a4f8b2c052635cb519a80099e8a85411d1d5d6880b38f466788259bbe66b154d" + }, + "vllm/third_party/flash_linear_attention/ops/kda.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/kda.py", + "sha256": "e1f31aaa89b91f8e5db6d070b229e2c81c7206e8caec67de41db97d06be0c476" + }, + "vllm/third_party/flash_linear_attention/ops/l2norm.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/l2norm.py", + "sha256": "520f4513ef4fc97e6b88dc07877cca8e29da0d34e44673fe989e3af002d86381" + }, + "vllm/third_party/flash_linear_attention/ops/layernorm_guard.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/layernorm_guard.py", + "sha256": "42af29be26e8fc94a4658e053c095fcdab9ffdc1bc2446a01e787deda2a298c0" + }, + "vllm/third_party/flash_linear_attention/ops/op.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/op.py", + "sha256": "456da84fd12411cf53c96a90dd4f78f49afb454c3d51d2c524ea8e7106fe8ae5" + }, + "vllm/third_party/flash_linear_attention/ops/solve_tril.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/solve_tril.py", + "sha256": "d1a4ff27623a938825052500afa7e2aa24fadd2fa4c9be6376c9128824f86f82" + }, + "vllm/third_party/flash_linear_attention/ops/utils.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/utils.py", + "sha256": "d6c90d36505e02086954c23ca4dd2fea82a69416d68ff1d0501e16b3148b5b0c" + }, + "vllm/third_party/flash_linear_attention/ops/wy_fast.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/wy_fast.py", + "sha256": "c9fc8259db0a8746dc04f1d799cb73333457118cf89a0bdce8dde8a80a28cd96" + }, + "vllm/v1/attention/__init__.py": { + "path": "/vllm/v1/attention/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backend.py": { + "path": "/vllm/v1/attention/backend.py", + "sha256": "01ac364372afa75fdb22486aa3a9c7cf9aebb742e3471dfb9e0f9d9d36b734bc" + }, + "vllm/v1/attention/backends/__init__.py": { + "path": "/vllm/v1/attention/backends/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backends/b12x.py": { + "path": "/vllm/v1/attention/backends/b12x.py", + "sha256": "443f0a98738fdfefe5b9ab151d278bfd43a8ac807eb2b0b9b2a13d51922afbf9" + }, + "vllm/v1/attention/backends/composite.py": { + "path": "/vllm/v1/attention/backends/composite.py", + "sha256": "4cf3d66dca891562709eed4f50aa14b0ae6c8240d9ea86504a3304b2f356cce0" + }, + "vllm/v1/attention/backends/cpu_attn.py": { + "path": "/vllm/v1/attention/backends/cpu_attn.py", + "sha256": "76fb02a6bd725125565d84bf04f627cf16da5f7ff8f31f87c01ed6a1439398c7" + }, + "vllm/v1/attention/backends/fa_utils.py": { + "path": "/vllm/v1/attention/backends/fa_utils.py", + "sha256": "08fa6e231d3af3a71a6e59162dd12328aa8beb28548165ae58f130a92adb5a83" + }, + "vllm/v1/attention/backends/flash_attn.py": { + "path": "/vllm/v1/attention/backends/flash_attn.py", + "sha256": "b170a4789e18104c1bee35bea70df51abe6766693d8f4726a59f2e6f5c4282aa" + }, + "vllm/v1/attention/backends/flash_attn_diffkv.py": { + "path": "/vllm/v1/attention/backends/flash_attn_diffkv.py", + "sha256": "e4627c88c3ba8caee260540e994cc8137fd2ff7cd7813356b36387c6c88ce30a" + }, + "vllm/v1/attention/backends/flashinfer.py": { + "path": "/vllm/v1/attention/backends/flashinfer.py", + "sha256": "8ee541fde43ed92a417b3f01ea1e6fc64af8ab2eb54cbfc28308a49aaca4ed7f" + }, + "vllm/v1/attention/backends/flex_attention.py": { + "path": "/vllm/v1/attention/backends/flex_attention.py", + "sha256": "ad07f0ad73aeeadc3534b3a05c14f88a62cb3638874239ae9823c49b36276dc3" + }, + "vllm/v1/attention/backends/gdn_attn.py": { + "path": "/vllm/v1/attention/backends/gdn_attn.py", + "sha256": "3831019404a92200a38b43571c040cffeb6638bbdc71e4cb5e680dbc6c93d054" + }, + "vllm/v1/attention/backends/hpc_attn.py": { + "path": "/vllm/v1/attention/backends/hpc_attn.py", + "sha256": "af9e2aec1b498f0ee48a2dce3cf5646edf1976466980b2fd927c0e82b875427c" + }, + "vllm/v1/attention/backends/linear_attn.py": { + "path": "/vllm/v1/attention/backends/linear_attn.py", + "sha256": "bc42144fcd027434c6a10dc9f4c5f991db8899d387af5f6485402ce097eb0513" + }, + "vllm/v1/attention/backends/mamba1_attn.py": { + "path": "/vllm/v1/attention/backends/mamba1_attn.py", + "sha256": "32159dae11cab3c8c576b9514ad97d5108c8d1b4cac9fcfe345ec6a76223aee7" + }, + "vllm/v1/attention/backends/mamba2_attn.py": { + "path": "/vllm/v1/attention/backends/mamba2_attn.py", + "sha256": "a5bcdecb7b9547137023e1c77a386003358fa940eaf5f319ed142211dcdba139" + }, + "vllm/v1/attention/backends/mamba_attn.py": { + "path": "/vllm/v1/attention/backends/mamba_attn.py", + "sha256": "5e7b2c4058fc5e6096d001bff6c789b78368b025bbe4600f191aaca2ff59b59f" + }, + "vllm/v1/attention/backends/mla/__init__.py": { + "path": "/vllm/v1/attention/backends/mla/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backends/mla/aiter_triton_mla.py": { + "path": "/vllm/v1/attention/backends/mla/aiter_triton_mla.py", + "sha256": "ed0e285cdae06a019150c41cc958b3c0b5ceb0e4f299d5318d1c90e2c2395390" + }, + "vllm/v1/attention/backends/mla/amx_mla.py": { + "path": "/vllm/v1/attention/backends/mla/amx_mla.py", + "sha256": "7f5cddec30b2dfe22ccdbd3b9da673c879719bf6da4074317bd60add55f5d15f" + }, + "vllm/v1/attention/backends/mla/compressor_utils.py": { + "path": "/vllm/v1/attention/backends/mla/compressor_utils.py", + "sha256": "3589e94105368ea285c40b82db1a0332682ff5d071fe363627cf4c0d10f3facf" + }, + "vllm/v1/attention/backends/mla/cpu_mla.py": { + "path": "/vllm/v1/attention/backends/mla/cpu_mla.py", + "sha256": "ff2110b9f78e92adf6bab294465cbc294ae1ff71cb1780fed158179e134a4ca6" + }, + "vllm/v1/attention/backends/mla/cutlass_mla.py": { + "path": "/vllm/v1/attention/backends/mla/cutlass_mla.py", + "sha256": "211d298680f9bd793cc468281b316d6633c5f4eb6dcec71d3329b034a23ab9b5" + }, + "vllm/v1/attention/backends/mla/flashattn_mla.py": { + "path": "/vllm/v1/attention/backends/mla/flashattn_mla.py", + "sha256": "ac89e0ad75a37e92566d264bafe324735a80f9ab4709241a4454d17b3d38bb63" + }, + "vllm/v1/attention/backends/mla/flashattn_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashattn_mla_sparse.py", + "sha256": "67dd3ead2e8b9d8cda0825ecc93779cb7d670628bc741c759a7d3cd5d474030f" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla.py", + "sha256": "0c24ff016fb6b0bb41d9e7484b6f1af42f37bcc384ed613473fc3e01ad25f664" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse.py", + "sha256": "2116d965b2067134d8afa5878d4d16c0149b061258f50c4106d993aa13b073cc" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm120.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm120.py", + "sha256": "102ca08793d567f95598eefeb34c3f6ec50b3b9d704f162d1402b97b12b5777b" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm90.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm90.py", + "sha256": "df9fe4970aa3f53cf24784b8534b89e0101a2ca20a35a2ebbc9a12a4463d5993" + }, + "vllm/v1/attention/backends/mla/flashmla.py": { + "path": "/vllm/v1/attention/backends/mla/flashmla.py", + "sha256": "c9d8046a853ecbdeff9ebfc738f5bb34c4f272b278231a09a0fbf73708c7c188" + }, + "vllm/v1/attention/backends/mla/flashmla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashmla_sparse.py", + "sha256": "7a379c717adb9667ce94cbc16c0e3a1fb22a169713db6d7941c141fa84077b3f" + }, + "vllm/v1/attention/backends/mla/index_group.py": { + "path": "/vllm/v1/attention/backends/mla/index_group.py", + "sha256": "c24e028c3c160a9bb92e043da5b5b34c805e84745b7c4b8da6fb8702a0ddd641" + }, + "vllm/v1/attention/backends/mla/indexer.py": { + "path": "/vllm/v1/attention/backends/mla/indexer.py", + "sha256": "2acbc1c4fa57c3424ad95e6ecbe76eb7141747773c3e867ce704f4adccba892a" + }, + "vllm/v1/attention/backends/mla/prefill/__init__.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/__init__.py", + "sha256": "903630eb705dd175bf4ae4558a4bcaa07c110056b6a11eb830fdd2fb21b3c48a" + }, + "vllm/v1/attention/backends/mla/prefill/aiter_flash_attn.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/aiter_flash_attn.py", + "sha256": "571b8a9910c4ea3fefda60659026f3bf0d7b542c34553c8c9a4d43bb82077e61" + }, + "vllm/v1/attention/backends/mla/prefill/base.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/base.py", + "sha256": "138bf3ddaf5a94c3cdbc4e08ac676edcae84b32fc76625e546f3b47f7d8b82ec" + }, + "vllm/v1/attention/backends/mla/prefill/cpu_sdpa.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/cpu_sdpa.py", + "sha256": "1bb686395274a8ec0d9fd7327410a527655fe060cbbc263eab138fea988d96de" + }, + "vllm/v1/attention/backends/mla/prefill/flash_attn.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/flash_attn.py", + "sha256": "5e648c82c82e5f81fe11458eb82b9f90b50fc06df2ade3bf111ee6b7a2ee8481" + }, + "vllm/v1/attention/backends/mla/prefill/flashinfer.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/flashinfer.py", + "sha256": "63861219c35b8abc0ebe01e1f51543c5ed40bd46119ca261d927da7c6826b49b" + }, + "vllm/v1/attention/backends/mla/prefill/registry.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/registry.py", + "sha256": "c8c30b92213d594beaa3cab4d5003da26a85870dbb11d1ab73191962d0645b53" + }, + "vllm/v1/attention/backends/mla/prefill/selector.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/selector.py", + "sha256": "101d9fca7924b0c5d7891a17fe8942611bd6759e32b03a571dc87b14c1430f2f" + }, + "vllm/v1/attention/backends/mla/prefill/tokenspeed_mla.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/tokenspeed_mla.py", + "sha256": "047cf07bfcc83db3b11a6a54ffe189f6146e6ec9ad33ce2fa7d18860bf4210f0" + }, + "vllm/v1/attention/backends/mla/prefill/trtllm_ragged.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/trtllm_ragged.py", + "sha256": "9e13ea6f6a25accedd918c0de64bbb812ccb20ffb95350ab018a6e76d493789b" + }, + "vllm/v1/attention/backends/mla/rocm_aiter_mla.py": { + "path": "/vllm/v1/attention/backends/mla/rocm_aiter_mla.py", + "sha256": "b489f5830c655bfb6299801a70d69b9821513c69568ecab3689db5a7be867be5" + }, + "vllm/v1/attention/backends/mla/rocm_aiter_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/rocm_aiter_mla_sparse.py", + "sha256": "91b1d9b3d860a9720bc01b8ebe9bbe8649a7d6bca20d4b63939bc100309bca19" + }, + "vllm/v1/attention/backends/mla/sparse_swa.py": { + "path": "/vllm/v1/attention/backends/mla/sparse_swa.py", + "sha256": "a47853ad8a3fe40f24704592581ea323a18041b84610df010a5534da634e311e" + }, + "vllm/v1/attention/backends/mla/sparse_utils.py": { + "path": "/vllm/v1/attention/backends/mla/sparse_utils.py", + "sha256": "c3cdf060288c05542243a9fe8b5ad3a963ad75e9ce399009b5e45c1235a88ce4" + }, + "vllm/v1/attention/backends/mla/tokenspeed_mla.py": { + "path": "/vllm/v1/attention/backends/mla/tokenspeed_mla.py", + "sha256": "b9ba523c606430cecb99a88b28c53d98a99dcf5e76105a80664338110a20f1ad" + }, + "vllm/v1/attention/backends/mla/triton_mla.py": { + "path": "/vllm/v1/attention/backends/mla/triton_mla.py", + "sha256": "21b16b3b34470edcc33d0423e560837c1d37d4bab31c7b3b9cfd7faa47864b51" + }, + "vllm/v1/attention/backends/mla/xpu_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/xpu_mla_sparse.py", + "sha256": "559c6240fe466521a6b2df4c94aea02ddf3f5efa5ba6954fa180c5a51c0f12d2" + }, + "vllm/v1/attention/backends/recoverssm_metadata.py": { + "path": "/vllm/v1/attention/backends/recoverssm_metadata.py", + "sha256": "02896a667db0f0308371ceb50048b18e5866c0235d163c0357e9a05dcedb3394" + }, + "vllm/v1/attention/backends/registry.py": { + "path": "/vllm/v1/attention/backends/registry.py", + "sha256": "378e8ee78734bd8c8adbe287d4c0a4058dcbb553195a09fbcce00a3cc30adc29" + }, + "vllm/v1/attention/backends/rocm_aiter_fa.py": { + "path": "/vllm/v1/attention/backends/rocm_aiter_fa.py", + "sha256": "d1418af03bf58209c850f466b712d3ea22a14ebb758c42dd43e65738281841fd" + }, + "vllm/v1/attention/backends/rocm_aiter_unified_attn.py": { + "path": "/vllm/v1/attention/backends/rocm_aiter_unified_attn.py", + "sha256": "59d2645eb4c91dc0567754a7163d066f4f2faf48f1957b254fcdd5604e9d8c8c" + }, + "vllm/v1/attention/backends/rocm_attn.py": { + "path": "/vllm/v1/attention/backends/rocm_attn.py", + "sha256": "4a8f57067073fbceb784af6c3467487c450d00fa3957928fadb99a79f6036292" + }, + "vllm/v1/attention/backends/short_conv_attn.py": { + "path": "/vllm/v1/attention/backends/short_conv_attn.py", + "sha256": "84fc460ef2fbd09743b069bec0c14b39542af6c2254a403e37a048427e151121" + }, + "vllm/v1/attention/backends/triton_attn.py": { + "path": "/vllm/v1/attention/backends/triton_attn.py", + "sha256": "1057663d110e1d5229495a799027b27277c1eca325d5b6780fa2259afbf58a1a" + }, + "vllm/v1/attention/backends/triton_attn_diffkv.py": { + "path": "/vllm/v1/attention/backends/triton_attn_diffkv.py", + "sha256": "de0357eae005246642140f1ab8842ba5ed8bff5c84b18a6d3a7bbf409c578301" + }, + "vllm/v1/attention/backends/triton_flash_attn.py": { + "path": "/vllm/v1/attention/backends/triton_flash_attn.py", + "sha256": "176e45329aeb28a2008362bb607d1b8c89816eb665859ab908b0385a11acf1c2" + }, + "vllm/v1/attention/backends/triton_flashinfer.py": { + "path": "/vllm/v1/attention/backends/triton_flashinfer.py", + "sha256": "48d5f967e388d4e8d6bbec8d827b44d855346bc2fada28adf65768bf6623527b" + }, + "vllm/v1/attention/backends/turboquant_attn.py": { + "path": "/vllm/v1/attention/backends/turboquant_attn.py", + "sha256": "616d16d608d9d1fbf6c29548037e7e9cf330f4d36a01aa3ffabf42a731eb6e2b" + }, + "vllm/v1/attention/backends/utils.py": { + "path": "/vllm/v1/attention/backends/utils.py", + "sha256": "fbc221360d2d54cb21ef3f625dc8711500de345a355801548b4337bb9b8abee0" + }, + "vllm/v1/attention/ops/__init__.py": { + "path": "/vllm/v1/attention/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/ops/chunked_prefill_paged_decode.py": { + "path": "/vllm/v1/attention/ops/chunked_prefill_paged_decode.py", + "sha256": "973db848a790b2e8d99e728b2fc4f44b501bbe58c62747244ddff04cfcf11a85" + }, + "vllm/v1/attention/ops/common.py": { + "path": "/vllm/v1/attention/ops/common.py", + "sha256": "b4b67e7fc0cce471e337d742c097fba06da7563816e8799e27719714e31e1d5b" + }, + "vllm/v1/attention/ops/cp_common.py": { + "path": "/vllm/v1/attention/ops/cp_common.py", + "sha256": "2369181862e96db64b14ef20c5c2e249ed2ea5f3dea2467a2aa388372bb86d9d" + }, + "vllm/v1/attention/ops/dcp.py": { + "path": "/vllm/v1/attention/ops/dcp.py", + "sha256": "a478bdc781460f0582cfaf74d6431f1a826c201f02f39d882d12a96139bc3f28" + }, + "vllm/v1/attention/ops/flashmla.py": { + "path": "/vllm/v1/attention/ops/flashmla.py", + "sha256": "8a40d6e120e3ab25a95fcfeb32b0b5b4c1ea02b984633866628536dcd26ed2e8" + }, + "vllm/v1/attention/ops/flydsl_kernels/__init__.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/attention/ops/flydsl_kernels/tq_decode.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/tq_decode.py", + "sha256": "cc4b7f82897596e0974b3d3a710a1a8bc58c3d22b72cc7f461dd1c4acd2e451b" + }, + "vllm/v1/attention/ops/flydsl_kernels/tq_decode_gqa6.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/tq_decode_gqa6.py", + "sha256": "a983f6d375c325900955e11696dab1e2665770e83f84d51f93d3ed5e1d8880e0" + }, + "vllm/v1/attention/ops/flydsl_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/flydsl_turboquant_decode.py", + "sha256": "7b1dd0ef7c7fb28a6a8831759e00b939ab844d067657155cc11cf75532a22c63" + }, + "vllm/v1/attention/ops/int4_per_token_head.py": { + "path": "/vllm/v1/attention/ops/int4_per_token_head.py", + "sha256": "d91968f280cd8eaed7570ab255f0276b40e833e18a25066d371d9ca8149425f2" + }, + "vllm/v1/attention/ops/merge_attn_states.py": { + "path": "/vllm/v1/attention/ops/merge_attn_states.py", + "sha256": "ad08403d2843fc892f0b0b4b9f5fabb81884556f89f7170dca46ccef498a3539" + }, + "vllm/v1/attention/ops/metadata.py": { + "path": "/vllm/v1/attention/ops/metadata.py", + "sha256": "ca882b84c5aaefb1f77e4d8ea09a00103fbc53defa8671bba036c961c17fc760" + }, + "vllm/v1/attention/ops/paged_attn.py": { + "path": "/vllm/v1/attention/ops/paged_attn.py", + "sha256": "016a95f892ec751c86b37be1e12171bad9f0b4076bbf2219ff336f4e9c503653" + }, + "vllm/v1/attention/ops/pcp.py": { + "path": "/vllm/v1/attention/ops/pcp.py", + "sha256": "dadeff95fe2df2be8028baabeef01b0d2d628cd67de2176915e737ce096de3dd" + }, + "vllm/v1/attention/ops/prefix_prefill.py": { + "path": "/vllm/v1/attention/ops/prefix_prefill.py", + "sha256": "b08ad92db715fc03c11699de3de463d55e411f42f77548e06b41049a61de692f" + }, + "vllm/v1/attention/ops/rocm_aiter_mla_merge.py": { + "path": "/vllm/v1/attention/ops/rocm_aiter_mla_merge.py", + "sha256": "564c66e4877732e48a6f7d52405c43dc952eec0f0ae4353d34886bca056132b9" + }, + "vllm/v1/attention/ops/rocm_aiter_mla_sparse.py": { + "path": "/vllm/v1/attention/ops/rocm_aiter_mla_sparse.py", + "sha256": "feec664be5045fd1ba13b8f6ef83b52c96910ddc78baca0431bcf610c9e8f5cc" + }, + "vllm/v1/attention/ops/triton_attention_helpers.py": { + "path": "/vllm/v1/attention/ops/triton_attention_helpers.py", + "sha256": "35aa993d01345f535d2641cf9dcabb8b64c51b20a19707bc5987e616aaa87ddd" + }, + "vllm/v1/attention/ops/triton_decode_attention.py": { + "path": "/vllm/v1/attention/ops/triton_decode_attention.py", + "sha256": "b9823c65eba22d76abf64dad7d7d16a950f67471c86d6cb5b3e983aaf14381ac" + }, + "vllm/v1/attention/ops/triton_merge_attn_states.py": { + "path": "/vllm/v1/attention/ops/triton_merge_attn_states.py", + "sha256": "f63229162181ab93198550b73a115f1cc1034cfd60e6f58bc8ab3e22a6e8ce60" + }, + "vllm/v1/attention/ops/triton_prefill_attention.py": { + "path": "/vllm/v1/attention/ops/triton_prefill_attention.py", + "sha256": "352c1a4ac86146580040579fb217c2e288268830d6602b735713e154f36d74fe" + }, + "vllm/v1/attention/ops/triton_reshape_and_cache_flash.py": { + "path": "/vllm/v1/attention/ops/triton_reshape_and_cache_flash.py", + "sha256": "6cac51475b8c656992a21b2d150acd3a16a95a7ab7d49aab151a3ef13c24b80d" + }, + "vllm/v1/attention/ops/triton_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/triton_turboquant_decode.py", + "sha256": "8e52678136449e4bbca2195fbcbb87426c955a2b1b8422e7ab9511e45ee5f5c6" + }, + "vllm/v1/attention/ops/triton_turboquant_store.py": { + "path": "/vllm/v1/attention/ops/triton_turboquant_store.py", + "sha256": "6e6e2fe74a307d40f0be786ccbaea76d989e3c7b5985f3144a5218c61bf6d902" + }, + "vllm/v1/attention/ops/triton_unified_attention.py": { + "path": "/vllm/v1/attention/ops/triton_unified_attention.py", + "sha256": "65d0fbcf33d00789df8ca688c0a1c908e710cfaef53471178747ecae11f05829" + }, + "vllm/v1/attention/ops/triton_unified_attention_diffkv.py": { + "path": "/vllm/v1/attention/ops/triton_unified_attention_diffkv.py", + "sha256": "7fa36d7b7441f1c396e0348eac61d691d2e459e5c4c393c4aa262dfb670e68f7" + }, + "vllm/v1/attention/ops/turboquant_soa/__init__.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/__init__.py", + "sha256": "6b43b6fcb2a71c44ceff4ed1edd417a839f4901251ba15831b09ad979baa4984" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode.py", + "sha256": "bf00634191bba14cbf4a23c1d67dc3dcb244c2b8989f08362757b54435830986" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode_v2.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode_v2.py", + "sha256": "28e7ecc15c450d3591983a50c46a03aa6ca6fa99304c17c333940617d9916485" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_store.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_store.py", + "sha256": "dccf93b9fdd34f9b9eacd468e9de35b9d93378594487c335cf50642aaec681f2" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_unified_attention.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_unified_attention.py", + "sha256": "b4b2b5f3985b3a6126fd052e6ec1ed91c610da8a525a9ae7470ac829405bd85c" + }, + "vllm/v1/attention/ops/vit_attn_wrappers.py": { + "path": "/vllm/v1/attention/ops/vit_attn_wrappers.py", + "sha256": "a99d57b58269c7521fa5d7d47af06551f3bab2b5c7358ef78165a7f6e20a92a6" + }, + "vllm/v1/attention/ops/xpu_mla_sparse.py": { + "path": "/vllm/v1/attention/ops/xpu_mla_sparse.py", + "sha256": "d98d17110577c2b7b4d05e07bfdae15faf83321b6342a5daaaecce45b9503f38" + }, + "vllm/v1/attention/selector.py": { + "path": "/vllm/v1/attention/selector.py", + "sha256": "87f653ded7974875183c920e3e4589c28116bcbc99714d1da7cb51ae77c0b182" + }, + "vllm/v1/core/sched/__init__.py": { + "path": "/vllm/v1/core/sched/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/core/sched/async_scheduler.py": { + "path": "/vllm/v1/core/sched/async_scheduler.py", + "sha256": "e586a0ef3c6778be56a93e7f9bb712d4de9de6e7d7fe7e3e1d51dae83ecfc508" + }, + "vllm/v1/core/sched/interface.py": { + "path": "/vllm/v1/core/sched/interface.py", + "sha256": "be6c008664096c5660a8879de72b315bbe479bf1d688be9b25891063ec53a367" + }, + "vllm/v1/core/sched/output.py": { + "path": "/vllm/v1/core/sched/output.py", + "sha256": "3a66c8efaefe10c572f6f33cf1f8aa4610758c945130cad62eb9f7331005677c" + }, + "vllm/v1/core/sched/request_queue.py": { + "path": "/vllm/v1/core/sched/request_queue.py", + "sha256": "4b8d938e5fb8152fe61030b8aa991f983fcac9a405c37ed8908045e05e82ae5e" + }, + "vllm/v1/core/sched/scheduler.py": { + "path": "/vllm/v1/core/sched/scheduler.py", + "sha256": "c1db45f3bbad3a875dd8638331b8870c4380ac1ab4734265ba5c863833a82884" + }, + "vllm/v1/core/sched/utils.py": { + "path": "/vllm/v1/core/sched/utils.py", + "sha256": "1ed988044eb8028c77ede875bd1a5fd05ff6998b455d61e3997d6a3d7fc1c3a7" + }, + "vllm/v1/sample/__init__.py": { + "path": "/vllm/v1/sample/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/sample/logits_processor/__init__.py": { + "path": "/vllm/v1/sample/logits_processor/__init__.py", + "sha256": "1f9b02dae8cf6d44484638037123d3a2dec6b7b9a2bcc9afceef1a9bf3eaedec" + }, + "vllm/v1/sample/logits_processor/builtin.py": { + "path": "/vllm/v1/sample/logits_processor/builtin.py", + "sha256": "6105816ece77e5b1dbee0d07abc90ce039d650bac2ddb85c93280c48b00f2ebe" + }, + "vllm/v1/sample/logits_processor/interface.py": { + "path": "/vllm/v1/sample/logits_processor/interface.py", + "sha256": "171dfc6ef9b5b53128e8eaecc4bdf1de413a706d64bf5be686048f583c66eee1" + }, + "vllm/v1/sample/logits_processor/state.py": { + "path": "/vllm/v1/sample/logits_processor/state.py", + "sha256": "a96411f14362c45f839e181dcb3ac01d5b880812bccb3552fc17863b219f44ac" + }, + "vllm/v1/sample/metadata.py": { + "path": "/vllm/v1/sample/metadata.py", + "sha256": "6582cfe1a240c7ddb975f0ef6dd7dcd28dcf0fc7670394390250013977aa7ffd" + }, + "vllm/v1/sample/ops/__init__.py": { + "path": "/vllm/v1/sample/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/sample/ops/bad_words.py": { + "path": "/vllm/v1/sample/ops/bad_words.py", + "sha256": "0b1d0a9b13b92ddcae2c83393c07a34c0f107813725700dee794caa7fe7f3b12" + }, + "vllm/v1/sample/ops/logprobs.py": { + "path": "/vllm/v1/sample/ops/logprobs.py", + "sha256": "b286f69012a6758bfe9250038b0697294dbffe0d32c6906f284c39f75ee48be3" + }, + "vllm/v1/sample/ops/penalties.py": { + "path": "/vllm/v1/sample/ops/penalties.py", + "sha256": "4debfcf247b3887478d2b9ec98f108756bbed2805462777ef6b56f3bdf4ce682" + }, + "vllm/v1/sample/ops/topk_topp_sampler.py": { + "path": "/vllm/v1/sample/ops/topk_topp_sampler.py", + "sha256": "13ea4359832bc914492330958ec4f5ac140f408b8f410cc05c6eaf7ddcd70be4" + }, + "vllm/v1/sample/ops/topk_topp_triton.py": { + "path": "/vllm/v1/sample/ops/topk_topp_triton.py", + "sha256": "0b5fc337058e22bc28a8530ccec904d6ccd89b9548b02955c657ac429b1669d2" + }, + "vllm/v1/sample/rejection_sampler.py": { + "path": "/vllm/v1/sample/rejection_sampler.py", + "sha256": "0bb9d224887ccb1355e16199005cc23a4afc6fa75156eca419851b7247d99750" + }, + "vllm/v1/sample/sampler.py": { + "path": "/vllm/v1/sample/sampler.py", + "sha256": "f95805b2c6d06218c724826aa5f881a606e8d0a534a566aee7c85948520dd216" + }, + "vllm/v1/sample/thinking_budget_state.py": { + "path": "/vllm/v1/sample/thinking_budget_state.py", + "sha256": "962f8f55210eb0a431cb9c78b013e35f7a7dd58d06d6fb2e7fcff1b457356f8e" + }, + "vllm/v1/worker/__init__.py": { + "path": "/vllm/v1/worker/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/block_table.py": { + "path": "/vllm/v1/worker/block_table.py", + "sha256": "a09b8819e1417b7a186cf3472224e2138fc5d41a291c6692bb7df711b0c44259" + }, + "vllm/v1/worker/cp_utils.py": { + "path": "/vllm/v1/worker/cp_utils.py", + "sha256": "e32625d83a641b8dd8df82e92d1b6fb20af0cdf2e8fbd2fb131aa3c215415448" + }, + "vllm/v1/worker/cpu/__init__.py": { + "path": "/vllm/v1/worker/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/cpu/buffer_utils.py": { + "path": "/vllm/v1/worker/cpu/buffer_utils.py", + "sha256": "e7313fd8c2c76ebfb98d2fa53008bc9691d0f83a7d7c05e87602b5a29fb79e04" + }, + "vllm/v1/worker/cpu/model_runner.py": { + "path": "/vllm/v1/worker/cpu/model_runner.py", + "sha256": "24a1c916550051327dd5893243a6d4200f3824b91b3af8aa6f6c793fd7c68c3e" + }, + "vllm/v1/worker/cpu/shm.py": { + "path": "/vllm/v1/worker/cpu/shm.py", + "sha256": "08491af8ad341399d1375f2d21ad00414d4c89b0a5c03f55de8704914bbfcbd9" + }, + "vllm/v1/worker/cpu_model_runner.py": { + "path": "/vllm/v1/worker/cpu_model_runner.py", + "sha256": "92111aba92f00571f1a3c4c6e43cf1da6ccb4d2afac2f4d5abc018a4a6e7e8bd" + }, + "vllm/v1/worker/cpu_worker.py": { + "path": "/vllm/v1/worker/cpu_worker.py", + "sha256": "a8051b9e510ef0af9cc34004f2cbe5c0f902bd0cebc32c9464e744344dfdf849" + }, + "vllm/v1/worker/dp_utils.py": { + "path": "/vllm/v1/worker/dp_utils.py", + "sha256": "8cd19f1bfbc5c4f6ec60df89aea7c8a19b400ebc264f372b103014152e92158c" + }, + "vllm/v1/worker/ec_connector_model_runner_mixin.py": { + "path": "/vllm/v1/worker/ec_connector_model_runner_mixin.py", + "sha256": "fe9b11cebb8562f1bfe98b98a5647b2b081a6e424cb60d4ffe2412c91a99215e" + }, + "vllm/v1/worker/encoder_cudagraph.py": { + "path": "/vllm/v1/worker/encoder_cudagraph.py", + "sha256": "6a08d3779bca1b47dbf9daf6eafe2d3c70dbcb8aeb7d63ba7efacc68241ee3bc" + }, + "vllm/v1/worker/encoder_cudagraph_defs.py": { + "path": "/vllm/v1/worker/encoder_cudagraph_defs.py", + "sha256": "bb7be050fcaa8868e7816c84caec875da57050d65fe7eaf00f3d41473df25e3a" + }, + "vllm/v1/worker/gpu/__init__.py": { + "path": "/vllm/v1/worker/gpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/async_utils.py": { + "path": "/vllm/v1/worker/gpu/async_utils.py", + "sha256": "77e17a4570ead2be30ae9b00888cf077a3b873018c12ca0549b853bfda02c1ba" + }, + "vllm/v1/worker/gpu/attn_utils.py": { + "path": "/vllm/v1/worker/gpu/attn_utils.py", + "sha256": "b9b81e59dda2720b1f9c434471381f879228832443e52756e469b4ad4905888f" + }, + "vllm/v1/worker/gpu/block_table.py": { + "path": "/vllm/v1/worker/gpu/block_table.py", + "sha256": "61c004315d5af7e7eae4e2a9e6be92ea82c520327690a7f55a73bb9ce95f520a" + }, + "vllm/v1/worker/gpu/buffer_utils.py": { + "path": "/vllm/v1/worker/gpu/buffer_utils.py", + "sha256": "6597f701a30261bf250e9ad5a29737264624a1caa20527aeea0dad630325b093" + }, + "vllm/v1/worker/gpu/cp_utils.py": { + "path": "/vllm/v1/worker/gpu/cp_utils.py", + "sha256": "456c1bb7e262d99ff555522a4f134e5a9b42aee23290be25455eaef36ee8eaaf" + }, + "vllm/v1/worker/gpu/cudagraph_utils.py": { + "path": "/vllm/v1/worker/gpu/cudagraph_utils.py", + "sha256": "6e9c042890603535e300a40df8ee159dbed1058a64a83ae50ff0329e332e05ff" + }, + "vllm/v1/worker/gpu/dp_utils.py": { + "path": "/vllm/v1/worker/gpu/dp_utils.py", + "sha256": "e26867bc89e6bfc933cabc5ed13e5dc7b8d2d3030118ca1ca64c8785dabc0fc1" + }, + "vllm/v1/worker/gpu/ec_connector.py": { + "path": "/vllm/v1/worker/gpu/ec_connector.py", + "sha256": "2afe6e641f4ae3eb3b8da336c74eaa7479bf617b27cfb39a1fcbe487686f0a08" + }, + "vllm/v1/worker/gpu/eplb_utils.py": { + "path": "/vllm/v1/worker/gpu/eplb_utils.py", + "sha256": "1829fac11464aed4649179b302df198de51b95d0589f4e56bea305a876a63e26" + }, + "vllm/v1/worker/gpu/input_batch.py": { + "path": "/vllm/v1/worker/gpu/input_batch.py", + "sha256": "d5dd956eb319bd69dd9e762047833d81ad40b21fce619fcb2133759e73620694" + }, + "vllm/v1/worker/gpu/kv_connector.py": { + "path": "/vllm/v1/worker/gpu/kv_connector.py", + "sha256": "b89a4333f1e552d86e1815674b59e9f1335f0f49c0a7b46082439076f62c6a81" + }, + "vllm/v1/worker/gpu/lora_utils.py": { + "path": "/vllm/v1/worker/gpu/lora_utils.py", + "sha256": "1e90eddd9ddb4ca55e574bb28e87ae3a6f6750175a62d373102426543f4ccd66" + }, + "vllm/v1/worker/gpu/metrics/__init__.py": { + "path": "/vllm/v1/worker/gpu/metrics/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/metrics/logits.py": { + "path": "/vllm/v1/worker/gpu/metrics/logits.py", + "sha256": "ea058d7510a077a55f8ac7e4c3d596508346244e908cb372865d7159f62edc89" + }, + "vllm/v1/worker/gpu/mm/__init__.py": { + "path": "/vllm/v1/worker/gpu/mm/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/mm/encoder_cache.py": { + "path": "/vllm/v1/worker/gpu/mm/encoder_cache.py", + "sha256": "89c500338fddbeee7c4fca978a3a7c4c566a03e848e399d303fbee3c80631cd2" + }, + "vllm/v1/worker/gpu/mm/encoder_runner.py": { + "path": "/vllm/v1/worker/gpu/mm/encoder_runner.py", + "sha256": "0981e352d70301b7154a217a48665ffe35f215d053ec5740c2515a3e1e11b4e6" + }, + "vllm/v1/worker/gpu/mm/lora.py": { + "path": "/vllm/v1/worker/gpu/mm/lora.py", + "sha256": "a3eddfad6ad64de276964240c28dc080888df4a56dd5eac18f89428f2cbb7a01" + }, + "vllm/v1/worker/gpu/mm/rope.py": { + "path": "/vllm/v1/worker/gpu/mm/rope.py", + "sha256": "0924375bcb367267e783b57dd2ad9de1189d97025ce4313baaa54f2911eaaf1e" + }, + "vllm/v1/worker/gpu/model_runner.py": { + "path": "/vllm/v1/worker/gpu/model_runner.py", + "sha256": "174c93db921c23cf0396eee4764be25b2bd2d4b6a06e9fa41ce3598b884ce8ce" + }, + "vllm/v1/worker/gpu/model_states/__init__.py": { + "path": "/vllm/v1/worker/gpu/model_states/__init__.py", + "sha256": "07815d0b788fc88185772f581bbf892a675259f9288375571f29887622f8d93c" + }, + "vllm/v1/worker/gpu/model_states/default.py": { + "path": "/vllm/v1/worker/gpu/model_states/default.py", + "sha256": "bb614f814780f052e869f9acf31dfbfa68718ee7dc6252eefa901b5730ee8a2a" + }, + "vllm/v1/worker/gpu/model_states/encoder_decoder.py": { + "path": "/vllm/v1/worker/gpu/model_states/encoder_decoder.py", + "sha256": "a5868059d8af672548b41d0e623e884320e6ed61e6aaca2d2828ff5be0356f2f" + }, + "vllm/v1/worker/gpu/model_states/encoder_only.py": { + "path": "/vllm/v1/worker/gpu/model_states/encoder_only.py", + "sha256": "84e96b55a2639e2a73fa4a0308acc89c8d053dc715481180b237e0196dcef99f" + }, + "vllm/v1/worker/gpu/model_states/interface.py": { + "path": "/vllm/v1/worker/gpu/model_states/interface.py", + "sha256": "5675b6fedc7403a9ab410b1e5565974e78fac23c42ab4253ae1da52d6e09b594" + }, + "vllm/v1/worker/gpu/model_states/mamba_hybrid.py": { + "path": "/vllm/v1/worker/gpu/model_states/mamba_hybrid.py", + "sha256": "573e130ac5587d4822fabf97adad1ad0fda02ff83c5e70df879a5bb175ae845c" + }, + "vllm/v1/worker/gpu/model_states/mm_pruning.py": { + "path": "/vllm/v1/worker/gpu/model_states/mm_pruning.py", + "sha256": "b150940b12ae76048f050a8eeb54d532bbdc530a18ffbf320ddeeb0cfaa90f93" + }, + "vllm/v1/worker/gpu/model_states/prompt_embeds.py": { + "path": "/vllm/v1/worker/gpu/model_states/prompt_embeds.py", + "sha256": "11f9e270925c2df6a505557605ac2b859bb145cf3420b0111e7482a1c544f9b1" + }, + "vllm/v1/worker/gpu/model_states/recoverssm.py": { + "path": "/vllm/v1/worker/gpu/model_states/recoverssm.py", + "sha256": "b4b660e62eaf33f4fe8271f83ed1fb6de6bc08f800a8073b27803e42fb29a645" + }, + "vllm/v1/worker/gpu/pcp_manager.py": { + "path": "/vllm/v1/worker/gpu/pcp_manager.py", + "sha256": "2d80df0ed5b18a2069f9d0689cb59923ffe324ba200fcafe242da23da3a6ddaa" + }, + "vllm/v1/worker/gpu/pool/__init__.py": { + "path": "/vllm/v1/worker/gpu/pool/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/pool/pooling_runner.py": { + "path": "/vllm/v1/worker/gpu/pool/pooling_runner.py", + "sha256": "f8463f7648cce0f3f29418a4d9fee61634ead760957cf236d06d61cf8cd986e7" + }, + "vllm/v1/worker/gpu/pp_utils.py": { + "path": "/vllm/v1/worker/gpu/pp_utils.py", + "sha256": "dadeef0bebf61d0ad44a28d06372208ec4e6389224d6017f412683b026bdbb5c" + }, + "vllm/v1/worker/gpu/sample/__init__.py": { + "path": "/vllm/v1/worker/gpu/sample/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/sample/bad_words.py": { + "path": "/vllm/v1/worker/gpu/sample/bad_words.py", + "sha256": "8d3cbd5613398260314d94739d8ee0e1ac0c22abf2f960f541d3c0d4e39d360b" + }, + "vllm/v1/worker/gpu/sample/batch_shard.py": { + "path": "/vllm/v1/worker/gpu/sample/batch_shard.py", + "sha256": "c30274a3a04e6a03e89be9cd7c62de602b1aba4d412f64540ab6201036de3928" + }, + "vllm/v1/worker/gpu/sample/gumbel.py": { + "path": "/vllm/v1/worker/gpu/sample/gumbel.py", + "sha256": "3ec1df510bdad13e8b0a457b5b67c98affdf6e57369e56cb471246cc8f40dd34" + }, + "vllm/v1/worker/gpu/sample/logit_bias.py": { + "path": "/vllm/v1/worker/gpu/sample/logit_bias.py", + "sha256": "9e80a3fe6f3c7474723408cfff52183f4585fdeedd9c2312843ee98d0b12724c" + }, + "vllm/v1/worker/gpu/sample/logprob.py": { + "path": "/vllm/v1/worker/gpu/sample/logprob.py", + "sha256": "f47479a818192acb6b297c79fa67a3b2f9820e3492a394d5adda777e9b7c832e" + }, + "vllm/v1/worker/gpu/sample/min_p.py": { + "path": "/vllm/v1/worker/gpu/sample/min_p.py", + "sha256": "4cb5e2f45e1ced6f9685283a7a5c8cfd7204d9a249822e866cfff756c7f04f62" + }, + "vllm/v1/worker/gpu/sample/output.py": { + "path": "/vllm/v1/worker/gpu/sample/output.py", + "sha256": "d6e298c0f197d487a8faaf7200f500fa83df1d7a4bbf4339cadd6a18008f7f9c" + }, + "vllm/v1/worker/gpu/sample/penalties.py": { + "path": "/vllm/v1/worker/gpu/sample/penalties.py", + "sha256": "46c29434caf5f415129ef4a9bb2b8d4f62d2765596e3e07f73ad2b198c7def1b" + }, + "vllm/v1/worker/gpu/sample/prompt_logprob.py": { + "path": "/vllm/v1/worker/gpu/sample/prompt_logprob.py", + "sha256": "4cf22d390e7bf59e44c458cff7180268db63e95d06af2f1e14d720a2d77c9663" + }, + "vllm/v1/worker/gpu/sample/sampler.py": { + "path": "/vllm/v1/worker/gpu/sample/sampler.py", + "sha256": "832c9945d201a1e730ff9b4b52076aa83bd4a5064e1e4cfea952cf84d4a8d1f0" + }, + "vllm/v1/worker/gpu/sample/states.py": { + "path": "/vllm/v1/worker/gpu/sample/states.py", + "sha256": "4e3671f93695ba5a48fad7d2d13beb231ac8741034904ed5a15d9f7b9b86662e" + }, + "vllm/v1/worker/gpu/sample/thinking_budget.py": { + "path": "/vllm/v1/worker/gpu/sample/thinking_budget.py", + "sha256": "020513e1d3406f367de6ad995a95055008fd0c28f2873647e8283c9870e22404" + }, + "vllm/v1/worker/gpu/sample/trace_replay.py": { + "path": "/vllm/v1/worker/gpu/sample/trace_replay.py", + "sha256": "d2a7d3b3b55379efabe4740a4b7f14030126dc11be36f6ea974164ce42316a50" + }, + "vllm/v1/worker/gpu/sample/watermark.py": { + "path": "/vllm/v1/worker/gpu/sample/watermark.py", + "sha256": "a3581458169dab9153eb09fd67218e0ee5585406537a9de80ad528ae62b030c0" + }, + "vllm/v1/worker/gpu/shutdown.py": { + "path": "/vllm/v1/worker/gpu/shutdown.py", + "sha256": "bb470f14b17c7e52571ef8938b2a9527e7c2846852ae8a3a94b69cd1c30aa4b1" + }, + "vllm/v1/worker/gpu/spec_decode/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/__init__.py", + "sha256": "1f1f84bfe6f4f5af3a7e21a7a8716ecf7b9013da1d03327668a3ee36afc24c32" + }, + "vllm/v1/worker/gpu/spec_decode/acceptance_estimator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/acceptance_estimator.py", + "sha256": "505b843bdd75928b03793b395b47b8be914bd7fe2a3351c8ec04339baeebb1c2" + }, + "vllm/v1/worker/gpu/spec_decode/adaptive_verification.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/adaptive_verification.py", + "sha256": "276b2fec56758a94c71b717f6786b8a6f126db2e20cf964350202feee61a0a39" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py", + "sha256": "13392ef0a9ed59eb9c2b2bad43d7c61beb212a8805849e46b5130c230275d0a5" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/speculator.py", + "sha256": "5b97f54e20ddf65b98e939832d050745f67ef43cfa145786da300f1a8322e3c6" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/cudagraph.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/cudagraph.py", + "sha256": "beab567ae2df6a2ba2cd92fe7ee452c6b959b8a7037a4b5f493993a1824619bb" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/speculator.py", + "sha256": "f9c100f42f9326e48eb84e89281897e859ba761943f54d593523555ccd98dc63" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/utils.py", + "sha256": "53d2c3ad474d290d2c6df027446bbd80ac7447684e5242ab2c3c5337d2abd383" + }, + "vllm/v1/worker/gpu/spec_decode/dflash2/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash2/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/dflash2/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash2/speculator.py", + "sha256": "b70043550938a1df9aecc85d8c8224c38c929ca34f68834572f6e723854d2027" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/speculator.py", + "sha256": "dcf4abdedbd2bddd0d76be198ccf5b4e467c46f645038c35fcab821491a35b03" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/utils.py", + "sha256": "86af2bf30604a184312e8f076097b91ecfec704f409f9d68d634b03d6b318070" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/eagle3_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/eagle3_utils.py", + "sha256": "201ee875fcc3d076a8fc1f3876dcbf85736b221a368555243a8987ff26a1674e" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/speculator.py", + "sha256": "746e318a4f266d75522ff7f3731ea9b4527b7b4824f71364d1a62184ea1f7b3d" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/utils.py", + "sha256": "94de6f55a1761f24f4aa1388cbc3b3763d4ab3ee53260330056ad31ce0b78236" + }, + "vllm/v1/worker/gpu/spec_decode/extract_hidden_states.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/extract_hidden_states.py", + "sha256": "93c4233be7b2d2290b33902ea9b3bb5274c11701830851d03967a22144536e2d" + }, + "vllm/v1/worker/gpu/spec_decode/gemma4/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/gemma4/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/gemma4/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/gemma4/speculator.py", + "sha256": "9991210d7babd2caf2cd10797ca8688543dedeafbc3b86bc7c979c1a6ae9f949" + }, + "vllm/v1/worker/gpu/spec_decode/mtp/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/mtp/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/mtp/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/mtp/speculator.py", + "sha256": "926d6c9ffdb368c971647911a60493820d056ce236fcae9d94a42fa2e006255d" + }, + "vllm/v1/worker/gpu/spec_decode/multi_module_mtp/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/multi_module_mtp/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/multi_module_mtp/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/multi_module_mtp/speculator.py", + "sha256": "d9d4735b9b33829332b0e845b6d3073b2f0436045ed693b25c6434f351644127" + }, + "vllm/v1/worker/gpu/spec_decode/rejection_sampler.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/rejection_sampler.py", + "sha256": "030db5bfca162cc1f305112f299de5d6d61c59d3ed0807fee46575441ca4086d" + }, + "vllm/v1/worker/gpu/spec_decode/rejection_sampler_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/rejection_sampler_utils.py", + "sha256": "214b61fa0abe88573beb779872c035b3954e5651a85bd438d99ee5905d3a62ec" + }, + "vllm/v1/worker/gpu/spec_decode/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/speculator.py", + "sha256": "3a1ab15bf8b20918852eb835fe9755046e99dcbac6ba6ca3d414949fc8bc695a" + }, + "vllm/v1/worker/gpu/spec_decode/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/utils.py", + "sha256": "282f2929eddae9ca7312269f799be07472334b6df9fd91878b5e839ec05e418c" + }, + "vllm/v1/worker/gpu/states.py": { + "path": "/vllm/v1/worker/gpu/states.py", + "sha256": "99418f5df43ca612ded72609fee011620b065b2cab2f249ccb387096bf4ae71a" + }, + "vllm/v1/worker/gpu/structured_outputs.py": { + "path": "/vllm/v1/worker/gpu/structured_outputs.py", + "sha256": "18a10532db7e66b55e334acacd1fd989ad6361adf31dd0de9a9a65e23db25951" + }, + "vllm/v1/worker/gpu/ubatch_utils.py": { + "path": "/vllm/v1/worker/gpu/ubatch_utils.py", + "sha256": "5092e2e58af0561c8dc12e62847cfc6dda9ca20dfbd33e7f0cd77a83fe87f7c5" + }, + "vllm/v1/worker/gpu/warmup.py": { + "path": "/vllm/v1/worker/gpu/warmup.py", + "sha256": "423ac32d58fe008c228cfa223e4fcebfcf87e3463a9dbdf80a083c0578d73723" + }, + "vllm/v1/worker/gpu_input_batch.py": { + "path": "/vllm/v1/worker/gpu_input_batch.py", + "sha256": "18cf455c9d0eea61cc581c7932f2e6cd09786914e82dd35eef1c1430da359a0f" + }, + "vllm/v1/worker/gpu_model_runner.py": { + "path": "/vllm/v1/worker/gpu_model_runner.py", + "sha256": "87c29d08c0bbf66993d8b984811e7325e35e6436242a773feb55ec88f16b2c51" + }, + "vllm/v1/worker/gpu_ubatch_wrapper.py": { + "path": "/vllm/v1/worker/gpu_ubatch_wrapper.py", + "sha256": "4233cfbe8c9884b042c4363890108f616483b694ebe9a6e69578dcf89c6dac5c" + }, + "vllm/v1/worker/gpu_worker.py": { + "path": "/vllm/v1/worker/gpu_worker.py", + "sha256": "6994436e4547c0996ab555b3e814e8ccea26b650dfc1b378b97d640745309347" + }, + "vllm/v1/worker/kv_connector_model_runner_mixin.py": { + "path": "/vllm/v1/worker/kv_connector_model_runner_mixin.py", + "sha256": "e1cc76d065a7e60aacddb190ae795a480b65cd02ba71a1fc699a02a85c1a3de2" + }, + "vllm/v1/worker/lora_model_runner_mixin.py": { + "path": "/vllm/v1/worker/lora_model_runner_mixin.py", + "sha256": "fef6092a15d8d37f6fa22495e6106e2e5280180908d61ce43d9ff5bf4eef3f2f" + }, + "vllm/v1/worker/mamba_utils.py": { + "path": "/vllm/v1/worker/mamba_utils.py", + "sha256": "23fdaa4e8f63ee8f938eaa1a2b39f803cb04fa6ecd69789563254b1a0691413a" + }, + "vllm/v1/worker/mm_encoder_model_runner.py": { + "path": "/vllm/v1/worker/mm_encoder_model_runner.py", + "sha256": "780c41be84ad022205c21c1decb6bb8d5afb03bc7be120c1f7df03b710acc3d7" + }, + "vllm/v1/worker/sentinel/__init__.py": { + "path": "/vllm/v1/worker/sentinel/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/sentinel/gpu_worker_sentinel.py": { + "path": "/vllm/v1/worker/sentinel/gpu_worker_sentinel.py", + "sha256": "3959b8619d052c5dd247815074e03ec21ec9b43cc424ff2d296abc19b227b852" + }, + "vllm/v1/worker/startup_plan.py": { + "path": "/vllm/v1/worker/startup_plan.py", + "sha256": "84bcbb4f7a9fd7c8d10c9c895aadd9673d44c767b9132368d11eb5e017afe86b" + }, + "vllm/v1/worker/ubatch_utils.py": { + "path": "/vllm/v1/worker/ubatch_utils.py", + "sha256": "b34dce551b5195c414e6a3a997c75961cc7a17f24c7c980487fe3d3e2ba7a798" + }, + "vllm/v1/worker/ubatching.py": { + "path": "/vllm/v1/worker/ubatching.py", + "sha256": "40391241c564feb5f16c77898ae6ae152ed6e71a4682e2a406387785d8de02d7" + }, + "vllm/v1/worker/utils.py": { + "path": "/vllm/v1/worker/utils.py", + "sha256": "0ca3ec6bf4d20076145b7fe64e564962adebedc8f75a856b517ba0b2f2d77acf" + }, + "vllm/v1/worker/worker_base.py": { + "path": "/vllm/v1/worker/worker_base.py", + "sha256": "4a1a5266b912fe97991d8dc89d92b923990da9f6cb4b817d00d52e9c0d26dd7c" + }, + "vllm/v1/worker/workspace.py": { + "path": "/vllm/v1/worker/workspace.py", + "sha256": "d21c08167d1d0d1c0cddaa80453a53a0b4dec5d81b5a537c94a21324344976b3" + }, + "vllm/v1/worker/xpu_model_runner.py": { + "path": "/vllm/v1/worker/xpu_model_runner.py", + "sha256": "07fa0390d28f2b8c3c3c0019eb9c3b126e2397aea268ba47c889f06b423deb23" + }, + "vllm/v1/worker/xpu_worker.py": { + "path": "/vllm/v1/worker/xpu_worker.py", + "sha256": "711b56432506b58041cd86e71320c3960413f7bd61061990b66488421d81cfc3" + } + }, + "prefix": "", + "pth": { + "/__editable__.megatron_core-0.16.0rc0.pth": "d55c9b64480b34aae3d4d31e7706b93391c969dec6e0498e50963b03445a57b0", + "/__editable__.rl_kernel-0.1.0.pth": "1454c4987b35762a0d189d4e901c5d077fde62a1944fbaabecea230e57f3923a", + "/__editable__.vime-0.3.2.pth": "77eec5d06d628cb952e65edd813ca88d8db67ccc785083e1b7b29011b92bec4f", + "/distutils-precedence.pth": "2638ce9e2500e572a5e0de7faed6661eb569d1b696fcba07b0dd223da5f5d224", + "/qwen3_next_cuda_runtime.pth": "e0d3ab57dd3ff4f5d55fcf76e83c549cc00b3c813e6f717c540d5ded79fa2f49", + "/qwen3_next_megatron_source.pth": "8556ac057538e82856cb76cbbc954f58312a3f45373daec3eec826031cfd2709", + "/__editable__.rl_kernel-0.1.0.pth": "1454c4987b35762a0d189d4e901c5d077fde62a1944fbaabecea230e57f3923a", + "/distutils-precedence.pth": "2638ce9e2500e572a5e0de7faed6661eb569d1b696fcba07b0dd223da5f5d224", + "/nvidia_cutlass_dsl_packages.pth": "cc710b99ddb3d76361a70461461d274212a979d00c381d821fce5bb3ad9cf246" + }, + "pyvenv_cfg_sha256": "48579f2c6d35c3d535c2690d7d426587c4b8e92021463f0266b38d35dfbbb834", + "sources": { + "/Megatron-LM-training": { + "patch_sha256": "f66035f12501aa1d08e8884e0dea5a22d59825d717aeda73c3e83876e3efd79f", + "path": "/Megatron-LM-training", + "tree": "731fc44a368d6cac8c6171a29d5c687ff0d95bd1" + }, + "/vime": { + "patch_sha256": "66949839d4c18329444f4f9f6dcd702b53ce1b94e9aa15ed111f28743bfaa4b9", + "path": "/vime", + "tree": "f5174e67dbcdaef983eecd45f215fef2d8429dd0" + } + }, + "version": "3.12.14 | packaged by Anaconda, Inc. | (main, Aug 27 2026, 14:46:43) [GCC 14.3.0]" + }, + "sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca" + }, + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "cuda_identity": { + "home": "", + "nvcc_sha256": "b8e2347d9d7fcadf8812a27324d515de99d033d3e48611811ece7e66d7895f8a" + }, + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "operator_requirements": { + "suite": "all", + "case_ids": [ + "tests/check_qwen3_next_attention.py::test_d256_backward_with_cached_prefix_matches_float64_formula", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[1024]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[256]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[64]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[8]", + "tests/check_qwen3_next_attention.py::test_d256_input_device_guard_and_nondefault_stream", + "tests/check_qwen3_next_attention.py::test_native_backward_rejects_malformed_probability_and_gradient_buffers", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[0]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[2]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_target_inputs_do_not_depend_on_companions", + "tests/check_qwen3_next_batch_invariance.py::test_triton_chunked_prefill_is_batch_invariant", + "tests/check_qwen3_next_conv_bridge.py::test_chunked_and_reordered_sequences_match", + "tests/check_qwen3_next_conv_bridge.py::test_empty_sequence_preserves_cache_and_gradients", + "tests/check_qwen3_next_conv_bridge.py::test_response_gradient_reaches_prompt_and_convolution_weight", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths0]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths1]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths2]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-4]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[1]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[4]", + "tests/check_qwen3_next_core_matrix.py::test_variable_lengths_empty_and_mixed_step_match_independent_sequences", + "tests/check_qwen3_next_forward.py::test_combine_has_fixed_route_order_and_differentiable_weights", + "tests/check_qwen3_next_forward.py::test_full_vocabulary_logprob_entropy_modes_and_gradient", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_fail_closed_on_the_tensor_descriptor_path", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[128]", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[512]", + "tests/check_qwen3_next_forward.py::test_logprob_nan_rejected_before_comparison", + "tests/check_qwen3_next_forward.py::test_moe_vjp_matches_independent_double_formula", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[1024-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[128-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-16]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-256]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-3072]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-37984]", + "tests/check_qwen3_next_forward.py::test_qwen_moe_actual_tp4_shapes_and_independent_training_forward", + "tests/check_qwen3_next_forward.py::test_route_weights_are_batch_invariant", + "tests/check_qwen3_next_forward.py::test_shared_linear_vjp_and_empty_tokens", + "tests/check_qwen3_next_forward.py::test_stable_route_tie_boundary_and_router_gradient", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_backward_matches_recomputed_recurrence_vjp", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_forward_is_provider_exact_and_does_not_mutate_inputs", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_keeps_prompt_state_gradient_through_response", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[False]", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[True]", + "tests/check_qwen3_next_gdn_bridge.py::test_initial_state_vjp_matches_provider_directional_difference", + "tests/check_qwen3_next_gdn_sequence.py::test_1024_token_chunk_continuation_is_bitwise_exact", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad0]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad1]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad2]", + "tests/check_qwen3_next_gdn_sequence.py::test_chunk_boundary_retains_prompt_and_initial_state_gradients", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths0]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths1]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths2]", + "tests/check_qwen3_next_gdn_sequence.py::test_reserved_and_duplicate_slots_are_rejected", + "tests/check_qwen3_next_norm_providers.py::test_custom_op_has_distinct_native_and_cuda_paths", + "tests/check_qwen3_next_norm_providers.py::test_gdn_decode_provider_env_defaults_are_recorded", + "tests/check_qwen3_next_norm_providers.py::test_our_gated_op_is_batch_invariant", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_cuda]", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_native]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots0]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots2]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots3]", + "tests/check_qwen3_next_shared_core.py::test_independent_training_forward_matches_inference_and_retains_gradients", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[1024]", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[8]", + "tests/check_qwen3_next_shared_core.py::test_unimplemented_provider_profile_is_rejected", + "tests/test_qwen3_next_norm.py::test_bad_weight_shape_raises", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[16]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[1]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[2]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[32]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[48]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[64]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[8]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[128]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[2048]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_with_padding", + "tests/test_qwen3_next_norm.py::test_call_matches_forward", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[128]", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[2048]", + "tests/test_qwen3_next_norm.py::test_cuda_default_offset_preserves_plain_convention", + "tests/test_qwen3_next_norm.py::test_cuda_gated_backward_matches_autograd_golden", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_matches_golden_within_contract", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_bad_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_mismatched_gate", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_backward_uses_the_sigmoid_derivative", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_swish_is_an_alias_for_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_unit_weight_is_plain_norm_times_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_weight_offset_is_applied_in_fp32", + "tests/test_qwen3_next_norm.py::test_cuda_gated_wrapper_rejects_equal_numel_wrong_shape", + "tests/test_qwen3_next_norm.py::test_cuda_gated_zero_gate_zeroes_output", + "tests/test_qwen3_next_norm.py::test_cuda_offset_equals_explicit_fp32_weight", + "tests/test_qwen3_next_norm.py::test_cuda_offset_is_not_folded_through_bfloat16", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_backward_is_offset_aware", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_within_tolerance_of_golden", + "tests/test_qwen3_next_norm.py::test_deterministic_repeat", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype0]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype1]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype2]", + "tests/test_qwen3_next_norm.py::test_eps_inside_sqrt", + "tests/test_qwen3_next_norm.py::test_gated_batch_invariance_slice", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedHFOp]", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedOp]", + "tests/test_qwen3_next_norm.py::test_gated_conventions_diverge_in_low_precision", + "tests/test_qwen3_next_norm.py::test_gated_cuda_op_rejects_bad_activation_at_construction", + "tests/test_qwen3_next_norm.py::test_gated_extension_handles_empty_batch_and_nondefault_stream", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[dy_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[gate_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[rstd_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_shape]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_matches_hf_formula_fp32", + "tests/test_qwen3_next_norm.py::test_gated_shape_mismatch_raises", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_strict_matches_vllm_formula_fp32", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[128]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[2048]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_offset_applied_in_fp32_not_folded_into_bf16", + "tests/test_qwen3_next_norm.py::test_op_batch_invariance_on_device", + "tests/test_qwen3_next_norm.py::test_plain_reference_is_unchanged_by_the_offset_plumbing", + "tests/test_qwen3_next_norm.py::test_weight_offset_is_one", + "tests/test_qwen3_next_norm.py::test_zero_centred_cuda_constructor_rejects_missing_extension", + "tests/test_qwen3_next_norm.py::test_zero_centred_op_inherits_the_plain_reference", + "tests/test_qwen3_next_norm.py::test_zero_weight_is_identity_scaling" + ], + "case_ids_sha256": "694c931b65f9cfa5db963f2eca6d11bd309546c824a1df52f9da2ab128e83e0f", + "norm_gates": [ + "qwen3_next_rms_norm-forward.json", + "qwen3_next_rms_norm-gradient.json", + "rms_norm_gated-forward.json", + "rms_norm_gated-gradient.json" + ] + }, + "layer_requirements": { + "schema_version": 1, + "gates": { + "gdn": { + "script": "scripts/qwen3_next_tp_gdn_check.py", + "output_option": "--output", + "scope": "tp4_gdn_layer0", + "groups": { + "cases": [ + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "prompt-gradient", + "replicated-norm-gradient", + "hf-load-export" + ] + }, + "script_sha256": "cc4338893f90af004c51c20fc67d1a9a3f4bf8d26775277f72671c02983e4df5" + }, + "attention": { + "script": "scripts/qwen3_next_tp_attention_check.py", + "output_option": "--output", + "scope": "tp4_full_attention_layer3", + "groups": { + "attention.cases": [ + "hf-load-export", + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "batch4-varlen-reorder", + "sixteen-token-decode", + "prompt-gradient", + "kv-pair-gradient", + "qk-norm-gradient" + ] + }, + "script_sha256": "d27d43efb05415a8ef5892c3c2238a2b9744a4821f5466faf46c6510e6e01bec" + }, + "moe": { + "script": "scripts/qwen3_next_tp_moe_check.py", + "output_option": "--output", + "scope": "tp4_moe_block_layer0", + "groups": { + "moe.cases": [ + "hf-load-export-all512experts", + "routes-replicated-8", + "full-chunk-reorder-8", + "routes-replicated-64", + "full-chunk-reorder-64", + "routes-replicated-256", + "full-chunk-reorder-256", + "routes-replicated-1024", + "full-chunk-reorder-1024", + "training-forward", + "all-parameter-gradient", + "replicated-router-gradient" + ] + }, + "script_sha256": "d5c1bbbb82e408b65871b0cb1638d7a6cf8cfe07f0a3315a657b7dc232d544be" + }, + "adapters": { + "script": "scripts/qwen3_next_adapter_check.py", + "output_option": "--out", + "scope": "gdn_engine_adapter_component", + "groups": { + "cases": [ + "batch1-length8", + "batch1-length64", + "batch1-length256", + "batch1-length1024", + "batch4-length8", + "batch4-length64", + "batch4-length256", + "batch4-length1024", + "mixed-prefill-decode16-reorder" + ] + }, + "fields": { + "prompt_gradient": "passed", + "hf_conv_roundtrip": "passed", + "batch_invariance_capability_registered": false + }, + "script_sha256": "3ce45bb317237c1a06533116d65fb77c2a23b6f503ae46406ede543036eb0f20" + }, + "heads": { + "script": "scripts/qwen3_next_tp_head_check.py", + "output_option": "--output", + "scope": "tp4_embedding_lm_head_only", + "groups": { + "cases": [ + "hf-embedding-roundtrip", + "hf-lm-head-roundtrip", + "replicated-norm-gradient", + "nonzero-finite-embedding-head-gradient", + "embedding-repeat-100", + "batch-invariant-prompt8", + "batch-invariant-prompt64", + "batch-invariant-prompt256", + "batch-invariant-prompt1024", + "logprob-original-and-promoted-logits", + "entropy-interface" + ] + }, + "script_sha256": "0504185d21a75405c8e994bc57b016cf4ec357d8b16e7430772c11934f2af876" + } + }, + "scheduler_case_ids": [ + "p0008-b1-full", + "p0008-b1-chunked", + "p0008-b4-full", + "p0008-b4-chunked", + "p0064-b1-full", + "p0064-b1-chunked", + "p0064-b4-full", + "p0064-b4-chunked", + "p0256-b1-full", + "p0256-b1-chunked", + "p0256-b4-full", + "p0256-b4-chunked", + "p1024-b1-full", + "p1024-b1-chunked", + "p1024-b4-full", + "p1024-b4-chunked" + ], + "registry_sha256": "e3949a750cb27c1897a000f3b023f912629906612ae8949c1575d0acc36df5ec", + "case_ids_per_rank": [ + "adapters/cases/batch1-length1024", + "adapters/cases/batch1-length256", + "adapters/cases/batch1-length64", + "adapters/cases/batch1-length8", + "adapters/cases/batch4-length1024", + "adapters/cases/batch4-length256", + "adapters/cases/batch4-length64", + "adapters/cases/batch4-length8", + "adapters/cases/mixed-prefill-decode16-reorder", + "attention/attention.cases/batch4-varlen-reorder", + "attention/attention.cases/full-chunk-1024", + "attention/attention.cases/full-chunk-256", + "attention/attention.cases/full-chunk-64", + "attention/attention.cases/full-chunk-8", + "attention/attention.cases/hf-load-export", + "attention/attention.cases/kv-pair-gradient", + "attention/attention.cases/prompt-gradient", + "attention/attention.cases/qk-norm-gradient", + "attention/attention.cases/sixteen-token-decode", + "gdn/cases/full-chunk-1024", + "gdn/cases/full-chunk-256", + "gdn/cases/full-chunk-64", + "gdn/cases/full-chunk-8", + "gdn/cases/hf-load-export", + "gdn/cases/prompt-gradient", + "gdn/cases/replicated-norm-gradient", + "heads/cases/batch-invariant-prompt1024", + "heads/cases/batch-invariant-prompt256", + "heads/cases/batch-invariant-prompt64", + "heads/cases/batch-invariant-prompt8", + "heads/cases/embedding-repeat-100", + "heads/cases/entropy-interface", + "heads/cases/hf-embedding-roundtrip", + "heads/cases/hf-lm-head-roundtrip", + "heads/cases/logprob-original-and-promoted-logits", + "heads/cases/nonzero-finite-embedding-head-gradient", + "heads/cases/replicated-norm-gradient", + "moe/moe.cases/all-parameter-gradient", + "moe/moe.cases/full-chunk-reorder-1024", + "moe/moe.cases/full-chunk-reorder-256", + "moe/moe.cases/full-chunk-reorder-64", + "moe/moe.cases/full-chunk-reorder-8", + "moe/moe.cases/hf-load-export-all512experts", + "moe/moe.cases/replicated-router-gradient", + "moe/moe.cases/routes-replicated-1024", + "moe/moe.cases/routes-replicated-256", + "moe/moe.cases/routes-replicated-64", + "moe/moe.cases/routes-replicated-8", + "moe/moe.cases/training-forward" + ], + "case_ids_sha256": "be74417dfbd6031ba27978d06d04bb15daaab2aeb57d132c7e0d41176b28b46e" + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + } +} diff --git a/docs/usage/evidence/qwen3-next-batch-invariance-b200/measured-commit.txt b/docs/usage/evidence/qwen3-next-batch-invariance-b200/measured-commit.txt new file mode 100644 index 000000000..047e12672 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-batch-invariance-b200/measured-commit.txt @@ -0,0 +1 @@ +759755e08f8a801d617a273fe23b55831f8de194 diff --git a/docs/usage/evidence/qwen3-next-batch-invariance-b200/preflight/checkpoint.json b/docs/usage/evidence/qwen3-next-batch-invariance-b200/preflight/checkpoint.json new file mode 100644 index 000000000..4488f19f1 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-batch-invariance-b200/preflight/checkpoint.json @@ -0,0 +1,14 @@ +{ + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "shards_verified": 41, + "metadata_sha256": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + } +} diff --git a/docs/usage/evidence/qwen3-next-batch-invariance-b200/preflight/device_guards.xml b/docs/usage/evidence/qwen3-next-batch-invariance-b200/preflight/device_guards.xml new file mode 100644 index 000000000..3be79ed74 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-batch-invariance-b200/preflight/device_guards.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/usage/evidence/qwen3-next-batch-invariance-b200/preflight/environment.json b/docs/usage/evidence/qwen3-next-batch-invariance-b200/preflight/environment.json new file mode 100644 index 000000000..ab7f3e469 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-batch-invariance-b200/preflight/environment.json @@ -0,0 +1,40 @@ +{ + "source_commit": "759755e08f8a801d617a273fe23b55831f8de194", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "visible_gpu_ids": "0,1,2,3", + "execution_gpus": 4, + "python": "3.12.14 | packaged by Anaconda, Inc. | (main, Aug 27 2026, 14:46:43) [GCC 14.3.0]", + "executable": "", + "platform": "Linux-6.8.0-111-generic-x86_64-with-glibc2.39", + "versions": { + "torch": "2.13.0", + "vllm": "0.30.0", + "triton": "3.7.1", + "transformers": "5.17.0", + "flashinfer-python": "0.6.18.post1", + "safetensors": "0.8.0" + }, + "torch_cuda": "13.0", + "nvcc": "nvcc: NVIDIA (R) Cuda compiler driver\nCopyright (c) 2005-2025 NVIDIA Corporation\nBuilt on Wed_Aug_20_01:58:59_PM_PDT_2025\nCuda compilation tools, release 13.0, V13.0.88\nBuild cuda_13.0.r13.0/compiler.36424714_0\n", + "compiler": "g++ (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0\nCopyright (C) 2023 Free Software Foundation, Inc.\nThis is free software; see the source for copying conditions. There is NO\nwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n", + "nvidia_smi": "Fri Oct 9 05:15:54 2026 \n+-----------------------------------------------------------------------------------------+\n| NVIDIA-SMI 580.126.20 Driver Version: 580.126.20 CUDA Version: 13.0 |\n+-----------------------------------------+------------------------+----------------------+\n| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |\n| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |\n| | | MIG M. |\n|=========================================+========================+======================|\n| 0 NVIDIA B200 On | 00000000:1B:00.0 Off | 0 |\n| N/A 36C P0 248W / 1000W | 0MiB / 183359MiB | 0% Default |\n| | | Disabled |\n+-----------------------------------------+------------------------+----------------------+\n| 1 NVIDIA B200 On | 00000000:43:00.0 Off | 0 |\n| N/A 37C P0 243W / 1000W | 0MiB / 183359MiB | 0% Default |\n| | | Disabled |\n+-----------------------------------------+------------------------+----------------------+\n| 2 NVIDIA B200 On | 00000000:52:00.0 Off | 0 |\n| N/A 42C P0 251W / 1000W | 0MiB / 183359MiB | 0% Default |\n| | | Disabled |\n+-----------------------------------------+------------------------+----------------------+\n| 3 NVIDIA B200 On | 00000000:61:00.0 Off | 0 |\n| N/A 42C P0 260W / 1000W | 0MiB / 183359MiB | 0% Default |\n| | | Disabled |\n+-----------------------------------------+------------------------+----------------------+\n| 4 NVIDIA B200 On | 00000000:9D:00.0 Off | 0 |\n| N/A 37C P0 247W / 1000W | 0MiB / 183359MiB | 0% Default |\n| | | Disabled |\n+-----------------------------------------+------------------------+----------------------+\n| 5 NVIDIA B200 On | 00000000:C3:00.0 Off | 0 |\n| N/A 35C P0 246W / 1000W | 0MiB / 183359MiB | 0% Default |\n| | | Disabled |\n+-----------------------------------------+------------------------+----------------------+\n| 6 NVIDIA B200 On | 00000000:D1:00.0 Off | 0 |\n| N/A 42C P0 253W / 1000W | 0MiB / 183359MiB | 0% Default |\n| | | Disabled |\n+-----------------------------------------+------------------------+----------------------+\n| 7 NVIDIA B200 On | 00000000:DF:00.0 Off | 0 |\n| N/A 42C P0 253W / 1000W | 0MiB / 183359MiB | 0% Default |\n| | | Disabled |\n+-----------------------------------------+------------------------+----------------------+\n\n+-----------------------------------------------------------------------------------------+\n| Processes: |\n| GPU GI CI PID Type Process name GPU Memory |\n| ID ID Usage |\n|=========================================================================================|\n| No running processes found |\n+-----------------------------------------------------------------------------------------+\n", + "gpu_topology": "\t\u001b[4mGPU0\tGPU1\tGPU2\tGPU3\tGPU4\tGPU5\tGPU6\tGPU7\tNIC0\tNIC1\tNIC2\tNIC3\tNIC4\tNIC5\tNIC6\tNIC7\tNIC8\tNIC9\tNIC10\tNIC11\tNIC12\tNIC13\tNIC14\tNIC15\tCPU Affinity\tNUMA Affinity\tGPU NUMA ID\u001b[0m\nGPU0\t X \tNV18\tNV18\tNV18\tNV18\tNV18\tNV18\tNV18\tNODE\tNODE\tNODE\tNODE\tPXB\tNODE\tNODE\tNODE\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\t0-53,112-165\t0\t\tN/A\nGPU1\tNV18\t X \tNV18\tNV18\tNV18\tNV18\tNV18\tNV18\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\tPXB\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\t0-53,112-165\t0\t\tN/A\nGPU2\tNV18\tNV18\t X \tNV18\tNV18\tNV18\tNV18\tNV18\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\tPXB\tNODE\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\t0-53,112-165\t0\t\tN/A\nGPU3\tNV18\tNV18\tNV18\t X \tNV18\tNV18\tNV18\tNV18\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\tPXB\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\t0-53,112-165\t0\t\tN/A\nGPU4\tNV18\tNV18\tNV18\tNV18\t X \tNV18\tNV18\tNV18\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tPXB\tNODE\tNODE\tNODE\tNODE\tNODE\t56-109,168-221\t1\t\tN/A\nGPU5\tNV18\tNV18\tNV18\tNV18\tNV18\t X \tNV18\tNV18\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tNODE\tNODE\tNODE\tPXB\tNODE\tNODE\t56-109,168-221\t1\t\tN/A\nGPU6\tNV18\tNV18\tNV18\tNV18\tNV18\tNV18\t X \tNV18\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tNODE\tNODE\tNODE\tNODE\tPXB\tNODE\t56-109,168-221\t1\t\tN/A\nGPU7\tNV18\tNV18\tNV18\tNV18\tNV18\tNV18\tNV18\t X \tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tNODE\tNODE\tNODE\tNODE\tNODE\tPXB\t56-109,168-221\t1\t\tN/A\nNIC0\tNODE\tNODE\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\t X \tPIX\tPIX\tPIX\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\t\t\t\t\nNIC1\tNODE\tNODE\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tPIX\t X \tPIX\tPIX\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\t\t\t\t\nNIC2\tNODE\tNODE\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tPIX\tPIX\t X \tPIX\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\t\t\t\t\nNIC3\tNODE\tNODE\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tPIX\tPIX\tPIX\t X \tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\t\t\t\t\nNIC4\tPXB\tNODE\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tNODE\tNODE\tNODE\tNODE\t X \tNODE\tNODE\tNODE\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\t\t\t\t\nNIC5\tNODE\tNODE\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tNODE\tNODE\tNODE\tNODE\tNODE\t X \tPIX\tNODE\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\t\t\t\t\nNIC6\tNODE\tNODE\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tNODE\tNODE\tNODE\tNODE\tNODE\tPIX\t X \tNODE\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\t\t\t\t\nNIC7\tNODE\tPXB\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\t X \tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\t\t\t\t\nNIC8\tNODE\tNODE\tPXB\tNODE\tSYS\tSYS\tSYS\tSYS\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\t X \tNODE\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\t\t\t\t\nNIC9\tNODE\tNODE\tNODE\tPXB\tSYS\tSYS\tSYS\tSYS\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\t X \tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\t\t\t\t\nNIC10\tSYS\tSYS\tSYS\tSYS\tPXB\tNODE\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\t X \tNODE\tNODE\tNODE\tNODE\tNODE\t\t\t\t\nNIC11\tSYS\tSYS\tSYS\tSYS\tNODE\tNODE\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tNODE\t X \tPIX\tNODE\tNODE\tNODE\t\t\t\t\nNIC12\tSYS\tSYS\tSYS\tSYS\tNODE\tNODE\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tNODE\tPIX\t X \tNODE\tNODE\tNODE\t\t\t\t\nNIC13\tSYS\tSYS\tSYS\tSYS\tNODE\tPXB\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tNODE\tNODE\tNODE\t X \tNODE\tNODE\t\t\t\t\nNIC14\tSYS\tSYS\tSYS\tSYS\tNODE\tNODE\tPXB\tNODE\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tNODE\tNODE\tNODE\tNODE\t X \tNODE\t\t\t\t\nNIC15\tSYS\tSYS\tSYS\tSYS\tNODE\tNODE\tNODE\tPXB\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tNODE\tNODE\tNODE\tNODE\tNODE\t X \t\t\t\t\n\nLegend:\n\n X = Self\n SYS = Connection traversing PCIe as well as the SMP interconnect between NUMA nodes (e.g., QPI/UPI)\n NODE = Connection traversing PCIe as well as the interconnect between PCIe Host Bridges within a NUMA node\n PHB = Connection traversing PCIe as well as a PCIe Host Bridge (typically the CPU)\n PXB = Connection traversing multiple PCIe bridges (without traversing the PCIe Host Bridge)\n PIX = Connection traversing at most a single PCIe bridge\n NV# = Connection traversing a bonded set of # NVLinks\n\nNIC Legend:\n\n NIC0: mlx5_0\n NIC1: mlx5_1\n NIC2: mlx5_2\n NIC3: mlx5_3\n NIC4: mlx5_4\n NIC5: mlx5_5\n NIC6: mlx5_6\n NIC7: mlx5_7\n NIC8: mlx5_8\n NIC9: mlx5_9\n NIC10: mlx5_10\n NIC11: mlx5_11\n NIC12: mlx5_12\n NIC13: mlx5_13\n NIC14: mlx5_14\n NIC15: mlx5_15\n\n", + "visible_gpus": [ + "_CudaDeviceProperties(name='NVIDIA B200', major=10, minor=0, total_memory=182631MB, multi_processor_count=148, uuid=dcc07b03-a36e-3e74-6bac-083b8fbb1ef2, pci_bus_id=27, pci_device_id=0, pci_domain_id=0, L2_cache_size=126MB)", + "_CudaDeviceProperties(name='NVIDIA B200', major=10, minor=0, total_memory=182631MB, multi_processor_count=148, uuid=7ed20e71-9918-90c0-e6e8-5b63679fc495, pci_bus_id=67, pci_device_id=0, pci_domain_id=0, L2_cache_size=126MB)", + "_CudaDeviceProperties(name='NVIDIA B200', major=10, minor=0, total_memory=182631MB, multi_processor_count=148, uuid=4e306531-0253-eb59-707b-cb5bd20b2690, pci_bus_id=82, pci_device_id=0, pci_domain_id=0, L2_cache_size=126MB)", + "_CudaDeviceProperties(name='NVIDIA B200', major=10, minor=0, total_memory=182631MB, multi_processor_count=148, uuid=4159b731-34fc-94af-0054-0b53d5ee025c, pci_bus_id=97, pci_device_id=0, pci_domain_id=0, L2_cache_size=126MB)" + ], + "memory": { + "limits": { + "/memory.limit_in_bytes": "9223372036854771712", + "/memory.limit_in_bytes": "9223372036854771712", + "/memory.limit_in_bytes": "9223372036854771712" + }, + "cgroup_bytes": null, + "declared_bytes": 549755813888, + "effective_bytes": 549755813888, + "available_bytes": 2086199480320 + }, + "memory_requested": "512G" +} diff --git a/docs/usage/evidence/qwen3-next-batch-invariance-b200/preflight/operators.json b/docs/usage/evidence/qwen3-next-batch-invariance-b200/preflight/operators.json new file mode 100644 index 000000000..a6e914e66 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-batch-invariance-b200/preflight/operators.json @@ -0,0 +1,304 @@ +{ + "scope": "qwen3_next_operators_only", + "status": "passed", + "suite": "all", + "diagnostic_only": false, + "full_model_l2": "not_evaluated", + "git_commit": "759755e08f8a801d617a273fe23b55831f8de194", + "git_dirty": false, + "versions": { + "torch": "2.13.0", + "vllm": "0.30.0", + "transformers": "5.17.0", + "triton": "3.7.1" + }, + "mandatory_case_ids": [ + "tests/check_qwen3_next_attention.py::test_d256_backward_with_cached_prefix_matches_float64_formula", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[1024]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[256]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[64]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[8]", + "tests/check_qwen3_next_attention.py::test_d256_input_device_guard_and_nondefault_stream", + "tests/check_qwen3_next_attention.py::test_native_backward_rejects_malformed_probability_and_gradient_buffers", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[0]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[2]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_target_inputs_do_not_depend_on_companions", + "tests/check_qwen3_next_batch_invariance.py::test_triton_chunked_prefill_is_batch_invariant", + "tests/check_qwen3_next_conv_bridge.py::test_chunked_and_reordered_sequences_match", + "tests/check_qwen3_next_conv_bridge.py::test_empty_sequence_preserves_cache_and_gradients", + "tests/check_qwen3_next_conv_bridge.py::test_response_gradient_reaches_prompt_and_convolution_weight", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths0]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths1]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths2]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-4]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[1]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[4]", + "tests/check_qwen3_next_core_matrix.py::test_variable_lengths_empty_and_mixed_step_match_independent_sequences", + "tests/check_qwen3_next_forward.py::test_combine_has_fixed_route_order_and_differentiable_weights", + "tests/check_qwen3_next_forward.py::test_full_vocabulary_logprob_entropy_modes_and_gradient", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_fail_closed_on_the_tensor_descriptor_path", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[128]", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[512]", + "tests/check_qwen3_next_forward.py::test_logprob_nan_rejected_before_comparison", + "tests/check_qwen3_next_forward.py::test_moe_vjp_matches_independent_double_formula", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[1024-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[128-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-16]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-256]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-3072]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-37984]", + "tests/check_qwen3_next_forward.py::test_qwen_moe_actual_tp4_shapes_and_independent_training_forward", + "tests/check_qwen3_next_forward.py::test_route_weights_are_batch_invariant", + "tests/check_qwen3_next_forward.py::test_shared_linear_vjp_and_empty_tokens", + "tests/check_qwen3_next_forward.py::test_stable_route_tie_boundary_and_router_gradient", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_backward_matches_recomputed_recurrence_vjp", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_forward_is_provider_exact_and_does_not_mutate_inputs", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_keeps_prompt_state_gradient_through_response", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[False]", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[True]", + "tests/check_qwen3_next_gdn_bridge.py::test_initial_state_vjp_matches_provider_directional_difference", + "tests/check_qwen3_next_gdn_sequence.py::test_1024_token_chunk_continuation_is_bitwise_exact", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad0]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad1]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad2]", + "tests/check_qwen3_next_gdn_sequence.py::test_chunk_boundary_retains_prompt_and_initial_state_gradients", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths0]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths1]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths2]", + "tests/check_qwen3_next_gdn_sequence.py::test_reserved_and_duplicate_slots_are_rejected", + "tests/check_qwen3_next_norm_providers.py::test_custom_op_has_distinct_native_and_cuda_paths", + "tests/check_qwen3_next_norm_providers.py::test_gdn_decode_provider_env_defaults_are_recorded", + "tests/check_qwen3_next_norm_providers.py::test_our_gated_op_is_batch_invariant", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_cuda]", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_native]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots0]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots2]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots3]", + "tests/check_qwen3_next_shared_core.py::test_independent_training_forward_matches_inference_and_retains_gradients", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[1024]", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[8]", + "tests/check_qwen3_next_shared_core.py::test_unimplemented_provider_profile_is_rejected", + "tests/test_qwen3_next_norm.py::test_bad_weight_shape_raises", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[16]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[1]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[2]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[32]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[48]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[64]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[8]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[128]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[2048]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_with_padding", + "tests/test_qwen3_next_norm.py::test_call_matches_forward", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[128]", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[2048]", + "tests/test_qwen3_next_norm.py::test_cuda_default_offset_preserves_plain_convention", + "tests/test_qwen3_next_norm.py::test_cuda_gated_backward_matches_autograd_golden", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_matches_golden_within_contract", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_bad_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_mismatched_gate", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_backward_uses_the_sigmoid_derivative", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_swish_is_an_alias_for_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_unit_weight_is_plain_norm_times_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_weight_offset_is_applied_in_fp32", + "tests/test_qwen3_next_norm.py::test_cuda_gated_wrapper_rejects_equal_numel_wrong_shape", + "tests/test_qwen3_next_norm.py::test_cuda_gated_zero_gate_zeroes_output", + "tests/test_qwen3_next_norm.py::test_cuda_offset_equals_explicit_fp32_weight", + "tests/test_qwen3_next_norm.py::test_cuda_offset_is_not_folded_through_bfloat16", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_backward_is_offset_aware", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_within_tolerance_of_golden", + "tests/test_qwen3_next_norm.py::test_deterministic_repeat", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype0]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype1]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype2]", + "tests/test_qwen3_next_norm.py::test_eps_inside_sqrt", + "tests/test_qwen3_next_norm.py::test_gated_batch_invariance_slice", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedHFOp]", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedOp]", + "tests/test_qwen3_next_norm.py::test_gated_conventions_diverge_in_low_precision", + "tests/test_qwen3_next_norm.py::test_gated_cuda_op_rejects_bad_activation_at_construction", + "tests/test_qwen3_next_norm.py::test_gated_extension_handles_empty_batch_and_nondefault_stream", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[dy_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[gate_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[rstd_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_shape]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_matches_hf_formula_fp32", + "tests/test_qwen3_next_norm.py::test_gated_shape_mismatch_raises", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_strict_matches_vllm_formula_fp32", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[128]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[2048]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_offset_applied_in_fp32_not_folded_into_bf16", + "tests/test_qwen3_next_norm.py::test_op_batch_invariance_on_device", + "tests/test_qwen3_next_norm.py::test_plain_reference_is_unchanged_by_the_offset_plumbing", + "tests/test_qwen3_next_norm.py::test_weight_offset_is_one", + "tests/test_qwen3_next_norm.py::test_zero_centred_cuda_constructor_rejects_missing_extension", + "tests/test_qwen3_next_norm.py::test_zero_centred_op_inherits_the_plain_reference", + "tests/test_qwen3_next_norm.py::test_zero_weight_is_identity_scaling" + ], + "case_ids_sha256": "694c931b65f9cfa5db963f2eca6d11bd309546c824a1df52f9da2ab128e83e0f", + "pytest_exit_code": 0, + "provider_tests": { + "tests": 233, + "failures": 0, + "errors": 0, + "skipped": 0 + }, + "norm_gates": { + "qwen3_next_rms_norm-forward.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + }, + "qwen3_next_rms_norm-gradient.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + }, + "rms_norm_gated-forward.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + }, + "rms_norm_gated-gradient.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + } + } +} diff --git a/docs/usage/evidence/qwen3-next-batch-invariance-b200/preflight/result.json b/docs/usage/evidence/qwen3-next-batch-invariance-b200/preflight/result.json new file mode 100644 index 000000000..26660581e --- /dev/null +++ b/docs/usage/evidence/qwen3-next-batch-invariance-b200/preflight/result.json @@ -0,0 +1,797 @@ +{ + "contract_version": 4, + "source_tree": "d8da35c889c3ffe57d8569fd9d2c51b063de16ce", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "cuda_identity": { + "home": "", + "nvcc_sha256": "b8e2347d9d7fcadf8812a27324d515de99d033d3e48611811ece7e66d7895f8a" + }, + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "operator_requirements": { + "suite": "all", + "case_ids": [ + "tests/check_qwen3_next_attention.py::test_d256_backward_with_cached_prefix_matches_float64_formula", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[1024]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[256]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[64]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[8]", + "tests/check_qwen3_next_attention.py::test_d256_input_device_guard_and_nondefault_stream", + "tests/check_qwen3_next_attention.py::test_native_backward_rejects_malformed_probability_and_gradient_buffers", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[0]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[2]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_target_inputs_do_not_depend_on_companions", + "tests/check_qwen3_next_batch_invariance.py::test_triton_chunked_prefill_is_batch_invariant", + "tests/check_qwen3_next_conv_bridge.py::test_chunked_and_reordered_sequences_match", + "tests/check_qwen3_next_conv_bridge.py::test_empty_sequence_preserves_cache_and_gradients", + "tests/check_qwen3_next_conv_bridge.py::test_response_gradient_reaches_prompt_and_convolution_weight", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths0]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths1]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths2]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-4]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[1]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[4]", + "tests/check_qwen3_next_core_matrix.py::test_variable_lengths_empty_and_mixed_step_match_independent_sequences", + "tests/check_qwen3_next_forward.py::test_combine_has_fixed_route_order_and_differentiable_weights", + "tests/check_qwen3_next_forward.py::test_full_vocabulary_logprob_entropy_modes_and_gradient", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_fail_closed_on_the_tensor_descriptor_path", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[128]", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[512]", + "tests/check_qwen3_next_forward.py::test_logprob_nan_rejected_before_comparison", + "tests/check_qwen3_next_forward.py::test_moe_vjp_matches_independent_double_formula", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[1024-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[128-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-16]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-256]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-3072]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-37984]", + "tests/check_qwen3_next_forward.py::test_qwen_moe_actual_tp4_shapes_and_independent_training_forward", + "tests/check_qwen3_next_forward.py::test_route_weights_are_batch_invariant", + "tests/check_qwen3_next_forward.py::test_shared_linear_vjp_and_empty_tokens", + "tests/check_qwen3_next_forward.py::test_stable_route_tie_boundary_and_router_gradient", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_backward_matches_recomputed_recurrence_vjp", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_forward_is_provider_exact_and_does_not_mutate_inputs", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_keeps_prompt_state_gradient_through_response", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[False]", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[True]", + "tests/check_qwen3_next_gdn_bridge.py::test_initial_state_vjp_matches_provider_directional_difference", + "tests/check_qwen3_next_gdn_sequence.py::test_1024_token_chunk_continuation_is_bitwise_exact", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad0]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad1]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad2]", + "tests/check_qwen3_next_gdn_sequence.py::test_chunk_boundary_retains_prompt_and_initial_state_gradients", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths0]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths1]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths2]", + "tests/check_qwen3_next_gdn_sequence.py::test_reserved_and_duplicate_slots_are_rejected", + "tests/check_qwen3_next_norm_providers.py::test_custom_op_has_distinct_native_and_cuda_paths", + "tests/check_qwen3_next_norm_providers.py::test_gdn_decode_provider_env_defaults_are_recorded", + "tests/check_qwen3_next_norm_providers.py::test_our_gated_op_is_batch_invariant", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_cuda]", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_native]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots0]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots2]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots3]", + "tests/check_qwen3_next_shared_core.py::test_independent_training_forward_matches_inference_and_retains_gradients", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[1024]", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[8]", + "tests/check_qwen3_next_shared_core.py::test_unimplemented_provider_profile_is_rejected", + "tests/test_qwen3_next_norm.py::test_bad_weight_shape_raises", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[16]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[1]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[2]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[32]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[48]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[64]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[8]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[128]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[2048]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_with_padding", + "tests/test_qwen3_next_norm.py::test_call_matches_forward", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[128]", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[2048]", + "tests/test_qwen3_next_norm.py::test_cuda_default_offset_preserves_plain_convention", + "tests/test_qwen3_next_norm.py::test_cuda_gated_backward_matches_autograd_golden", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_matches_golden_within_contract", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_bad_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_mismatched_gate", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_backward_uses_the_sigmoid_derivative", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_swish_is_an_alias_for_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_unit_weight_is_plain_norm_times_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_weight_offset_is_applied_in_fp32", + "tests/test_qwen3_next_norm.py::test_cuda_gated_wrapper_rejects_equal_numel_wrong_shape", + "tests/test_qwen3_next_norm.py::test_cuda_gated_zero_gate_zeroes_output", + "tests/test_qwen3_next_norm.py::test_cuda_offset_equals_explicit_fp32_weight", + "tests/test_qwen3_next_norm.py::test_cuda_offset_is_not_folded_through_bfloat16", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_backward_is_offset_aware", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_within_tolerance_of_golden", + "tests/test_qwen3_next_norm.py::test_deterministic_repeat", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype0]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype1]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype2]", + "tests/test_qwen3_next_norm.py::test_eps_inside_sqrt", + "tests/test_qwen3_next_norm.py::test_gated_batch_invariance_slice", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedHFOp]", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedOp]", + "tests/test_qwen3_next_norm.py::test_gated_conventions_diverge_in_low_precision", + "tests/test_qwen3_next_norm.py::test_gated_cuda_op_rejects_bad_activation_at_construction", + "tests/test_qwen3_next_norm.py::test_gated_extension_handles_empty_batch_and_nondefault_stream", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[dy_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[gate_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[rstd_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_shape]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_matches_hf_formula_fp32", + "tests/test_qwen3_next_norm.py::test_gated_shape_mismatch_raises", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_strict_matches_vllm_formula_fp32", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[128]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[2048]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_offset_applied_in_fp32_not_folded_into_bf16", + "tests/test_qwen3_next_norm.py::test_op_batch_invariance_on_device", + "tests/test_qwen3_next_norm.py::test_plain_reference_is_unchanged_by_the_offset_plumbing", + "tests/test_qwen3_next_norm.py::test_weight_offset_is_one", + "tests/test_qwen3_next_norm.py::test_zero_centred_cuda_constructor_rejects_missing_extension", + "tests/test_qwen3_next_norm.py::test_zero_centred_op_inherits_the_plain_reference", + "tests/test_qwen3_next_norm.py::test_zero_weight_is_identity_scaling" + ], + "case_ids_sha256": "694c931b65f9cfa5db963f2eca6d11bd309546c824a1df52f9da2ab128e83e0f", + "norm_gates": [ + "qwen3_next_rms_norm-forward.json", + "qwen3_next_rms_norm-gradient.json", + "rms_norm_gated-forward.json", + "rms_norm_gated-gradient.json" + ] + }, + "layer_requirements": { + "schema_version": 1, + "gates": { + "gdn": { + "script": "scripts/qwen3_next_tp_gdn_check.py", + "output_option": "--output", + "scope": "tp4_gdn_layer0", + "groups": { + "cases": [ + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "prompt-gradient", + "replicated-norm-gradient", + "hf-load-export" + ] + }, + "script_sha256": "cc4338893f90af004c51c20fc67d1a9a3f4bf8d26775277f72671c02983e4df5" + }, + "attention": { + "script": "scripts/qwen3_next_tp_attention_check.py", + "output_option": "--output", + "scope": "tp4_full_attention_layer3", + "groups": { + "attention.cases": [ + "hf-load-export", + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "batch4-varlen-reorder", + "sixteen-token-decode", + "prompt-gradient", + "kv-pair-gradient", + "qk-norm-gradient" + ] + }, + "script_sha256": "d27d43efb05415a8ef5892c3c2238a2b9744a4821f5466faf46c6510e6e01bec" + }, + "moe": { + "script": "scripts/qwen3_next_tp_moe_check.py", + "output_option": "--output", + "scope": "tp4_moe_block_layer0", + "groups": { + "moe.cases": [ + "hf-load-export-all512experts", + "routes-replicated-8", + "full-chunk-reorder-8", + "routes-replicated-64", + "full-chunk-reorder-64", + "routes-replicated-256", + "full-chunk-reorder-256", + "routes-replicated-1024", + "full-chunk-reorder-1024", + "training-forward", + "all-parameter-gradient", + "replicated-router-gradient" + ] + }, + "script_sha256": "d5c1bbbb82e408b65871b0cb1638d7a6cf8cfe07f0a3315a657b7dc232d544be" + }, + "adapters": { + "script": "scripts/qwen3_next_adapter_check.py", + "output_option": "--out", + "scope": "gdn_engine_adapter_component", + "groups": { + "cases": [ + "batch1-length8", + "batch1-length64", + "batch1-length256", + "batch1-length1024", + "batch4-length8", + "batch4-length64", + "batch4-length256", + "batch4-length1024", + "mixed-prefill-decode16-reorder" + ] + }, + "fields": { + "prompt_gradient": "passed", + "hf_conv_roundtrip": "passed", + "batch_invariance_capability_registered": false + }, + "script_sha256": "3ce45bb317237c1a06533116d65fb77c2a23b6f503ae46406ede543036eb0f20" + }, + "heads": { + "script": "scripts/qwen3_next_tp_head_check.py", + "output_option": "--output", + "scope": "tp4_embedding_lm_head_only", + "groups": { + "cases": [ + "hf-embedding-roundtrip", + "hf-lm-head-roundtrip", + "replicated-norm-gradient", + "nonzero-finite-embedding-head-gradient", + "embedding-repeat-100", + "batch-invariant-prompt8", + "batch-invariant-prompt64", + "batch-invariant-prompt256", + "batch-invariant-prompt1024", + "logprob-original-and-promoted-logits", + "entropy-interface" + ] + }, + "script_sha256": "0504185d21a75405c8e994bc57b016cf4ec357d8b16e7430772c11934f2af876" + } + }, + "scheduler_case_ids": [ + "p0008-b1-full", + "p0008-b1-chunked", + "p0008-b4-full", + "p0008-b4-chunked", + "p0064-b1-full", + "p0064-b1-chunked", + "p0064-b4-full", + "p0064-b4-chunked", + "p0256-b1-full", + "p0256-b1-chunked", + "p0256-b4-full", + "p0256-b4-chunked", + "p1024-b1-full", + "p1024-b1-chunked", + "p1024-b4-full", + "p1024-b4-chunked" + ], + "registry_sha256": "e3949a750cb27c1897a000f3b023f912629906612ae8949c1575d0acc36df5ec", + "case_ids_per_rank": [ + "adapters/cases/batch1-length1024", + "adapters/cases/batch1-length256", + "adapters/cases/batch1-length64", + "adapters/cases/batch1-length8", + "adapters/cases/batch4-length1024", + "adapters/cases/batch4-length256", + "adapters/cases/batch4-length64", + "adapters/cases/batch4-length8", + "adapters/cases/mixed-prefill-decode16-reorder", + "attention/attention.cases/batch4-varlen-reorder", + "attention/attention.cases/full-chunk-1024", + "attention/attention.cases/full-chunk-256", + "attention/attention.cases/full-chunk-64", + "attention/attention.cases/full-chunk-8", + "attention/attention.cases/hf-load-export", + "attention/attention.cases/kv-pair-gradient", + "attention/attention.cases/prompt-gradient", + "attention/attention.cases/qk-norm-gradient", + "attention/attention.cases/sixteen-token-decode", + "gdn/cases/full-chunk-1024", + "gdn/cases/full-chunk-256", + "gdn/cases/full-chunk-64", + "gdn/cases/full-chunk-8", + "gdn/cases/hf-load-export", + "gdn/cases/prompt-gradient", + "gdn/cases/replicated-norm-gradient", + "heads/cases/batch-invariant-prompt1024", + "heads/cases/batch-invariant-prompt256", + "heads/cases/batch-invariant-prompt64", + "heads/cases/batch-invariant-prompt8", + "heads/cases/embedding-repeat-100", + "heads/cases/entropy-interface", + "heads/cases/hf-embedding-roundtrip", + "heads/cases/hf-lm-head-roundtrip", + "heads/cases/logprob-original-and-promoted-logits", + "heads/cases/nonzero-finite-embedding-head-gradient", + "heads/cases/replicated-norm-gradient", + "moe/moe.cases/all-parameter-gradient", + "moe/moe.cases/full-chunk-reorder-1024", + "moe/moe.cases/full-chunk-reorder-256", + "moe/moe.cases/full-chunk-reorder-64", + "moe/moe.cases/full-chunk-reorder-8", + "moe/moe.cases/hf-load-export-all512experts", + "moe/moe.cases/replicated-router-gradient", + "moe/moe.cases/routes-replicated-1024", + "moe/moe.cases/routes-replicated-256", + "moe/moe.cases/routes-replicated-64", + "moe/moe.cases/routes-replicated-8", + "moe/moe.cases/training-forward" + ], + "case_ids_sha256": "be74417dfbd6031ba27978d06d04bb15daaab2aeb57d132c7e0d41176b28b46e" + }, + "source_commit": "759755e08f8a801d617a273fe23b55831f8de194", + "run_id": "20261009T051516Z-preflight-759755e0-fcd95b2c", + "stage": "preflight", + "suite": "all", + "execution_id": "fcd95b2c99a74161be94008acc796fb9", + "attempt": "0", + "status": "passed", + "phase": "complete", + "scope": "four_gpu_infrastructure_and_operators_only", + "full_model_l2": "not_evaluated", + "evidence": { + "operators": { + "path": "attempts/0/operators/summary.json", + "sha256": "bb96af8122ba0c79d94ba00fc8f67c18d1d5cb1d3806a4c372ec0f0f19ab52c5" + }, + "environment": { + "path": "attempts/0/environment.json", + "sha256": "244a26624a2bf8522d5a1e2fa1b935c8bcb5bd4906588575b424702203177275" + }, + "device_guards": { + "path": "attempts/0/device-guards.xml", + "sha256": "6b86d1a63a165df3d5d71479f4a5968d2dc69019edeb91554723069c6936b2f7" + }, + "tp4": { + "path": "attempts/0/tp4.json", + "sha256": "94b8471a1b6c0c75c0af44a25f62b50d633bce4429a8f5de40cc7ab3ef721a9e" + }, + "checkpoint": { + "path": "attempts/0/checkpoint.json", + "sha256": "7ceb9dab2ce8c0a2551a970819f9f0adbb538f04c4124982458a42f997d7c934" + }, + "rollout_smoke": { + "path": "attempts/0/rollout-smoke.json", + "sha256": "b885b8a358017e9d5bdcbea26e5b078315f0c22f1174c69d9e469e845ad2cd33" + } + }, + "checkpoint": { + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "shards_verified": 41, + "metadata_sha256": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + } + }, + "provider_paths": { + "norm": "/source/rl_engine/_C.cpython-312-x86_64-linux-gnu.so", + "gdn": "vllm.third_party.flash_linear_attention.ops.fused_recurrent.fused_recurrent_gated_delta_rule_packed_decode" + } +} diff --git a/docs/usage/evidence/qwen3-next-batch-invariance-b200/preflight/rollout_smoke.json b/docs/usage/evidence/qwen3-next-batch-invariance-b200/preflight/rollout_smoke.json new file mode 100644 index 000000000..495b8e7b2 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-batch-invariance-b200/preflight/rollout_smoke.json @@ -0,0 +1,75 @@ +{ + "scope": "rollout_smoke_only", + "full_model_l2": "not_evaluated", + "batch_invariant_requested": false, + "moe_backend": "triton", + "model": "", + "tensor_parallel_size": 4, + "results": [ + { + "prompt_token_ids": [ + 785, + 6722, + 315, + 9625, + 374 + ], + "response_token_ids": [ + 12095, + 13, + 576, + 6722, + 315, + 9856, + 374, + 19846 + ], + "selected_logprobs": [ + -0.13067829608917236, + -0.7456974387168884, + -0.8441466689109802, + -0.4179370403289795, + -0.027504993602633476, + -1.0120117664337158, + -0.000508417550008744, + -0.015414390712976456 + ], + "text": " Paris. The capital of Germany is Berlin" + }, + { + "prompt_token_ids": [ + 47866, + 220, + 22, + 5519, + 220, + 20, + 13, + 576, + 1102, + 374 + ], + "response_token_ids": [ + 510, + 32, + 13, + 220, + 16, + 16, + 198, + 33 + ], + "selected_logprobs": [ + -0.6616742610931396, + -0.00334596517495811, + -0.001652424456551671, + -0.5070273876190186, + -0.07833854109048843, + -1.0462173223495483, + -0.0008942657150328159, + -1.0728830375228426e-06 + ], + "text": ":\nA. 11\nB" + } + ] +} diff --git a/docs/usage/evidence/qwen3-next-batch-invariance-b200/preflight/run.json b/docs/usage/evidence/qwen3-next-batch-invariance-b200/preflight/run.json new file mode 100644 index 000000000..2d0a94b44 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-batch-invariance-b200/preflight/run.json @@ -0,0 +1,5248 @@ +{ + "run_id": "20261009T051516Z-preflight-759755e0-fcd95b2c", + "execution_id": "fcd95b2c99a74161be94008acc796fb9", + "contract_version": 4, + "suite": "all", + "execution_gpus": 4, + "source_tree": "d8da35c889c3ffe57d8569fd9d2c51b063de16ce", + "stage": "preflight", + "source_commit": "759755e08f8a801d617a273fe23b55831f8de194", + "source": "/source", + "python": "", + "cuda_home": "", + "checkpoint": "", + "memory": "512G", + "previous": null, + "status": "prepared", + "full_model_l2": "not_evaluated", + "environment": { + "identity": { + "base_prefix": "/miniconda3/envs/rlkernel", + "binary": "/python3.12", + "binary_sha256": "6a1eb3ffc29f3a6b0ece607b016b4cfa5ca3ac57b34f17ed3266b404f78d2729", + "build_tools": { + "ninja": { + "path": "/miniconda3/envs/rlkernel/bin/ninja", + "sha256": "08639e194fffa7f08b259fc4abfa4803aff66b64de52549cee42ec527d55cea6" + } + }, + "distributions": [ + { + "direct_url": null, + "metadata_sha256": "6f1038270be40f9b8c0bcf391c627e7d7f41ccdd19aa192d6eac1dbfc3b19abc", + "name": "GitPython", + "version": "3.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "3f71971502087521f123c9daa26bc12d31d3466738b567390b8602acad3be22a", + "name": "Jinja2", + "version": "3.1.6" + }, + { + "direct_url": null, + "metadata_sha256": "818fb343b7b6b99a32771bf4813521ae6440b4c7579b3ae46e32dd02da0afeee", + "name": "Markdown", + "version": "3.11" + }, + { + "direct_url": null, + "metadata_sha256": "dc1ee42cf8ecfeee0ab60b15b21d291833e0732548efcb7bb5b3564dca3e5bf7", + "name": "MarkupSafe", + "version": "3.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "de7389b142450a0014234286b0876f328439b823c355c73d0aed41fd67ec208c", + "name": "PyJWT", + "version": "2.15.1" + }, + { + "direct_url": null, + "metadata_sha256": "ffcad4415cafb22b8b536a61595e9ee13438b51d31b0763c1b273ce3bc58e840", + "name": "PyYAML", + "version": "6.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "8562d701cc52d9cafbb418942b0e072fc087ed8ddcf35cd10224c1b2ed8bdd91", + "name": "Pygments", + "version": "2.21.0" + }, + { + "direct_url": null, + "metadata_sha256": "b6c25fcfdcc495edf248a10ca4ad28327ef2ed6047a6ec5c6346e121414c7f21", + "name": "Werkzeug", + "version": "3.1.9" + }, + { + "direct_url": null, + "metadata_sha256": "55c400d24c71b581d9c0992f71df6047cf6c878bebe61a7d45d6e02dc0e4c510", + "name": "absl-py", + "version": "2.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "13db521f90a6a882027b2388eaa2ebf252945f9c2adb7e7e371da18239da4df0", + "name": "accelerate", + "version": "1.15.0" + }, + { + "direct_url": null, + "metadata_sha256": "86fe44e38e67872dd895c729044942ba2c2f934ae439a899fb83a186206b7fd4", + "name": "agent-detector", + "version": "2.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "afe11fe9f5aa54e734cdd51659bed8c89dc6bcd5aef0ad96f2d20149c8de5456", + "name": "aiohappyeyeballs", + "version": "2.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "570b307bc0b53fbbd3ed2ce0b7eca6bbf2fa73bf75e24a480f1034d8c0b832bf", + "name": "aiohttp", + "version": "3.14.3" + }, + { + "direct_url": null, + "metadata_sha256": "44b7f8e14c4770793e747fad50c9e0a6ee7357651d878554f192d94768dc14a8", + "name": "aiohttp-cors", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "648813a44a9ae0ab2f20ee86d2404dcc38e3f9e80c63316cf6e536735df14e54", + "name": "aiosignal", + "version": "1.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "f6a3f6668bacef7f73a2c19ccb2be910b2363d1731c4725cb04364d99e24935a", + "name": "annotated-doc", + "version": "0.0.5" + }, + { + "direct_url": null, + "metadata_sha256": "fc6d752cde6a6a4bff03474386de750e130b75da3c7815ee909f45b51fea98c8", + "name": "annotated-types", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "4e89d670a4b20029da30e5a9e8ebcbc844deff9c44209552bafd5537249c8b9e", + "name": "anthropic", + "version": "1.9.0" + }, + { + "direct_url": null, + "metadata_sha256": "b5a6f00800956387fcddab1fe1b5aa8502c249b86cfb16d58ed700f282f60142", + "name": "antlr4-python3-runtime", + "version": "4.9.3" + }, + { + "direct_url": null, + "metadata_sha256": "a6008defa9492cd08250217b134782cad1db4580e1d7ddf69cc2a2a48cea24e0", + "name": "anyio", + "version": "4.15.1" + }, + { + "direct_url": null, + "metadata_sha256": "7877c64ce8957237363f2df313819bb07f50752df016d14c5a5a99bec10f5deb", + "name": "apache-tvm-ffi", + "version": "0.1.11" + }, + { + "direct_url": null, + "metadata_sha256": "3543ca8f0e072c00ab111b20eba99ce86dbf93ada28988775bc2677284b3c07a", + "name": "astor", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "d4b328c09c024fe1e4d788a9c7715ad726095131b815cd35fd933268226f6269", + "name": "attrs", + "version": "26.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "4850c4d696a5e2a2ecbb3dd792b060acc1de79e09800669b0b9fc3a22c055e6d", + "name": "av", + "version": "19.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "863ff92208d0a02dabfa008bfe91846a5c401ded301e5687dca7dc63c911865f", + "name": "babel", + "version": "2.18.0" + }, + { + "direct_url": null, + "metadata_sha256": "f32e6df3197f05202e586624d95c5e217003d80cee655c165d533102f628df21", + "name": "backrefs", + "version": "8.0" + }, + { + "direct_url": null, + "metadata_sha256": "905c362f655fbc6d37a24686efc2b3bfbd3123b8ee5a443a43f6750d87455e90", + "name": "blake3", + "version": "1.0.10" + }, + { + "direct_url": null, + "metadata_sha256": "07c85682b6aefd5c9b48890d306c1604311902295704892ede48e5a83219a8d3", + "name": "blobfile", + "version": "3.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "2d582941a7081625a35f35a0c4a2e80f7737312e29c38e5fdb6fc08f9c113077", + "name": "bracex", + "version": "3.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "3b60c55bae0d0340c3a3fd918635bbfa3087579da66e0fd7f6be7a3782c0da3d", + "name": "cachetools", + "version": "7.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "5d11a6878d5bc3f22290281a19ef7b36daa95c910780950608b95cd788c7e12e", + "name": "cbor2", + "version": "6.1.4" + }, + { + "direct_url": null, + "metadata_sha256": "362c9942c48051f168ed2b9f2146266b7792d3c05e164cd6afc3f3b65884fdc9", + "name": "certifi", + "version": "2026.7.22" + }, + { + "direct_url": null, + "metadata_sha256": "b4abf1bcf1c1d8e0272d8007fc974499ea59e5f2a5b98af3c78a5e67515a9d87", + "name": "cffi", + "version": "2.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "766120f13c177446f51929a4d201104bc935b6d5a2a176cd6716edce757d3d95", + "name": "cfgv", + "version": "3.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "610e9a9d03ce837ffe6e42be5e02e70087f73863f7350bf7bb7f0511edcc5ec0", + "name": "charset-normalizer", + "version": "3.5.2" + }, + { + "direct_url": null, + "metadata_sha256": "7ad836b3147c9702546d9c28b4fa5be23b24445439db5d0d2a58d17281c84daa", + "name": "click", + "version": "8.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "4c5f00599ebcbf11d337e48a72784d256ca3d704fa9e9f5daadd60065e6776b7", + "name": "cloudpickle", + "version": "3.1.2" + }, + { + "direct_url": null, + "metadata_sha256": "a0970189e3ab7a596d6902d5f61f93b414f138f03d3cf19029145657bfceb382", + "name": "cmake", + "version": "4.1.2" + }, + { + "direct_url": null, + "metadata_sha256": "94a6ebf9718e55f254a43ce0d2f04e0d6d44e7141b6f3144a84feb6519a77bfd", + "name": "colorama", + "version": "0.4.6" + }, + { + "direct_url": null, + "metadata_sha256": "ca8ec227f406d970a645ec482b20619128dd34b9cf71159cc24e27db461a2711", + "name": "colorful", + "version": "0.5.8" + }, + { + "direct_url": null, + "metadata_sha256": "bbaa51b7e4d8f142bd075d01257c0572c0c844796d51426e35c8096a13e8da76", + "name": "compressed-tensors", + "version": "0.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "6063d8ff7ebc458d63a4332853d7ababf4ee2b86336362c8d2b12be6e998eb6b", + "name": "connectrpc", + "version": "0.11.1" + }, + { + "direct_url": null, + "metadata_sha256": "ac5f4b5a5f68080bd9c3fe77399fe8a1bff2ee5923c49db1df544dd054cbf15b", + "name": "cryptography", + "version": "50.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "f41d2f6b4616accca2f5e1dd47aa9e8937c28076cde698226d93e727751f3099", + "name": "cuda-bindings", + "version": "13.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "e5ca6ed34c687c6f4a4d157ad0a2cf06ec0316fe8c4c0ddeb666ad76dd6f30f4", + "name": "cuda-core", + "version": "1.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "89baadd9da23dce9990481519544115615ba3cbd2d1a41e09feea7756fffb378", + "name": "cuda-pathfinder", + "version": "1.8.2" + }, + { + "direct_url": null, + "metadata_sha256": "1ab914b9a57ca601df2e3cfe9608427b15d8afb78029076ace5d1caf9fd45f08", + "name": "cuda-python", + "version": "13.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "73d97a5eb578223b4895ef4f234574d14219cef9999ff7d0e92a3d0dd057bd3f", + "name": "cuda-tile", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "ae6f957fe66ed63081d1d83ee6e8838f3a0af2c6fce1223629d0dd6264565ead", + "name": "cuda-toolkit", + "version": "13.0.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "1f8e0ae51ad5feea63f58ed2e24f3da6f23ed548043235a14f7623d961dd9b64", + "name": "datasets", + "version": "5.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "153f4a4d6ff03dbe5c8ad7fe54bc2e7b989a4947b70f7aa77fbf652b394f2a2e", + "name": "depyf", + "version": "0.20.0" + }, + { + "direct_url": null, + "metadata_sha256": "ee09fc752d7271aac93079cfd63409957dc6b536c1ffd9355a01bf7297e72aa6", + "name": "detect-installer", + "version": "0.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "a7feab2c4f69fd5f85e5a3cb495a7f1870a6bf8199dcee5339e8118f7acbdc09", + "name": "dill", + "version": "0.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "fef3fde661fe30ba7bd1d78841a797136b2b3461705bb4eb92dc54f8308bbaae", + "name": "distlib", + "version": "0.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "fef3fde661fe30ba7bd1d78841a797136b2b3461705bb4eb92dc54f8308bbaae", + "name": "distlib", + "version": "0.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "a3ca2e39abe76c4a33d5fe4a2a84375ec9f25cdfdb7e1d8ea406bd6f1603205c", + "name": "dnspython", + "version": "2.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "92a07daad5e6ff461199de14e845d9b376e309ef916ce5379f3c9cd4e3b1623f", + "name": "dockerfile-parse", + "version": "2.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "5b566b25f0cbe4955d0b16844a7cc6d2002caa3bde2dfda7f301fd8870cbaa56", + "name": "docstring_parser", + "version": "0.18.0" + }, + { + "direct_url": null, + "metadata_sha256": "5a1080b5768c6c591e1c4f9c9812cafa808781b9eeb198043bf185e22d4a1613", + "name": "e2b", + "version": "2.51.0" + }, + { + "direct_url": null, + "metadata_sha256": "0a63979e0b946e16238e4339e60d9c1eb5a7ce3ea93dae78b5da9c65a6190540", + "name": "einops", + "version": "0.8.2" + }, + { + "direct_url": null, + "metadata_sha256": "16cbe67a57558f1d4bfdbc22a454434ba301750c57a62b1d3f5361c9e5cddc00", + "name": "email-validator", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "0617ddb55b90b42ddc9398dc7e91d61fe928a2504939f76526dc15b22d238caa", + "name": "fastapi", + "version": "0.136.3" + }, + { + "direct_url": null, + "metadata_sha256": "ddd82b9666c21988e234d623e2575e1b89fd4133260eeab43fc9a7c074f7024a", + "name": "fastapi-cli", + "version": "0.0.32" + }, + { + "direct_url": null, + "metadata_sha256": "611602e834d42e10433155ff5f5581358d732fa6b6f6f7820a8f79e74b1ce1f9", + "name": "fastapi-cloud-cli", + "version": "0.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "794524e4a9659bda6043721d848d028ea49996085a33326094fbaaa3f6e6b895", + "name": "fastar", + "version": "0.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "711401d36e60e10e35beb4d0f1bb42bf0c4d86339ae52f32b9aa4a4d790530dd", + "name": "fastsafetensors", + "version": "0.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "efaea9742e348c4c4bdcc6f616a33cc5aa3ae926494a72a46690b7da2f08ed5c", + "name": "filelock", + "version": "4.0.7" + }, + { + "direct_url": null, + "metadata_sha256": "99bd6c3f10781d3d2d350f2c3c9fc4765b55f25de8a6d6dd1f71501802d1255e", + "name": "fla-core", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "0a6ef979b75295cee2b5293ad4942b0cf2682e9e38680203064e0b70249c1a96", + "name": "flash-linear-attention", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "76b70a11ca82ea4606b529e7a8658cb3fe71412afa46f2ed57101dd91ba27558", + "name": "flashinfer-python", + "version": "0.6.18.post1" + }, + { + "direct_url": null, + "metadata_sha256": "ba8ff415192b5cbb90efce046e2271a00c8184afc362d8b47fbbc84d5e558b05", + "name": "frozenlist", + "version": "1.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "e7712831c80eb13b08fb7f7cc33988a8f24654af9eba7c6f5f943b2636e4306a", + "name": "fsspec", + "version": "2026.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "025de85c794878d0caa737869307447595f514ebf9599eacb5b1a501bae479b6", + "name": "fsspec", + "version": "2026.9.0" + }, + { + "direct_url": null, + "metadata_sha256": "ca94883bdeaa3740b45b6994443b445fd67c6e4a8064ac3bf9d92d2a5221eee8", + "name": "ghp-import", + "version": "2.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "a7e90983562a035cf767baa63d8c32bc37e1de7cad71ac7b6b2bc70a95bba4eb", + "name": "gitdb", + "version": "4.0.12" + }, + { + "direct_url": null, + "metadata_sha256": "dd96143ec79178bef685c1f5c0a58a87a66d003b421e605de65697308321d518", + "name": "google-api-core", + "version": "2.40.0" + }, + { + "direct_url": null, + "metadata_sha256": "0735d57088a83df2355e16843107fb0112abe2178fc5bb8132947a7ad962aa41", + "name": "google-auth", + "version": "2.59.1" + }, + { + "direct_url": null, + "metadata_sha256": "2f3aa9d9500d329560440e6a5a152e420aad5f5bbb23701f45b740be721784a1", + "name": "googleapis-common-protos", + "version": "1.75.5" + }, + { + "direct_url": null, + "metadata_sha256": "06d74ab04fdc03fad368868907f0d10e7d9f397aab58d58965c0b78ffaec34cc", + "name": "griffelib", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "7ee1c179e2c68a62968308b2f96f4f3469176ee3ac8bdb494ac80188d4d41271", + "name": "grpcio", + "version": "1.84.0" + }, + { + "direct_url": null, + "metadata_sha256": "04cf3a4a91575850f386f4fcfdedd8e7fbfba08feff038fbc1296d1e854db2dd", + "name": "h11", + "version": "0.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "b954a6ba4739c0cc878bb8ea27ea7c7154a48bb4b7c06dba9e9cf880cf0ec930", + "name": "h2", + "version": "4.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "6f0d7bf86e75d0bda1ceccc82367c0145ad0ec522c4d4f51bb454f467faadcc9", + "name": "hf-xet", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "f991b847550cf8225f69562902b5ccb591b2ce9a08fe07ef6e6d701bdb4694a7", + "name": "hpack", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "314d194165c4700034c1c67cee847d549a6d7091374c71f2cef0186ec56a3eb9", + "name": "httpcore", + "version": "1.0.9" + }, + { + "direct_url": null, + "metadata_sha256": "aed9767360bed1bcbda71e3b1a3c996603f86558bc77a1693ee3d09973d20cad", + "name": "httpcore2", + "version": "2.13.1" + }, + { + "direct_url": null, + "metadata_sha256": "8fa3bf3510c35e2eea9f523a1cace7120079cf51d76c4acea97de95806aaa14a", + "name": "httptools", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "3bf4804c215d111b6a4702cf9000021ab39807d1ed3207dd011b14b2843b2d14", + "name": "httpx", + "version": "0.28.1" + }, + { + "direct_url": null, + "metadata_sha256": "d11dd50813b8914bd9455e8b2b591171cd2b1618883943153afadc8bb9224678", + "name": "httpx2", + "version": "2.13.1" + }, + { + "direct_url": null, + "metadata_sha256": "43b119c34ad2b2aacc032a1a6a8feb142fdb5ca407a3519325d74dd53d8904df", + "name": "huggingface_hub", + "version": "1.33.0" + }, + { + "direct_url": null, + "metadata_sha256": "9ce850d5a6b775e5ef4a335f907e579a878e058213121b6eec567781ea68c585", + "name": "humming-kernels", + "version": "0.1.12" + }, + { + "direct_url": null, + "metadata_sha256": "67aa4f6717d82446a51ce350e7c4769eba0c4a22d2f428255cddd9d24b11a914", + "name": "hyperframe", + "version": "6.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd9511ede42f63b995c3f71944f908cb8f014048b63ecc1c8d420525a3354b59", + "name": "identify", + "version": "2.6.20" + }, + { + "direct_url": null, + "metadata_sha256": "af3c3a62bb5d82d6a43454684e0b1dedde27a21ea90eacfb1bed9814619f06d0", + "name": "idna", + "version": "3.20" + }, + { + "direct_url": null, + "metadata_sha256": "cf71393f3d079ce2e859384573e65aaacd1709bef700701f629df32398b598f0", + "name": "ijson", + "version": "3.5.1" + }, + { + "direct_url": null, + "metadata_sha256": "9305763e93d03df0e36516b1125fa046a6ebe37d44589e200e0593cf4bdfd980", + "name": "importlib_metadata", + "version": "9.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "32860c3c19b2e91f6cb5bd83400b5870cda051bc74a5a08822c8c666af0990db", + "name": "iniconfig", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "560faabb3d45d779e445a74e7e806a786f95f2200fa06d979603b7f0ee1cfb39", + "name": "instanttensor", + "version": "0.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "f6fc1f0d389e4245fc2a1a0fdfee09422e56200cb6f94659668456997ff4f7a9", + "name": "interegular", + "version": "0.3.3" + }, + { + "direct_url": null, + "metadata_sha256": "d10f300731197a4829b77f0c883bb3cf8a37ae8c76a302e095fa95d6427706d0", + "name": "jiter", + "version": "0.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "5b0c8d4b4c535a2432fb206223d774509b6e20af374c6a4b6f98bf72a7de6702", + "name": "jmespath", + "version": "1.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "6c4032c2e74273452cd77399af2ee85198f49c22da897983f26d2ed6f787c4e8", + "name": "jsonschema", + "version": "4.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "aaa6cd66f423729e8da397c9d533b7d731f6b25f3d6371b9338c36bdb9be74a0", + "name": "jsonschema-specifications", + "version": "2025.9.1" + }, + { + "direct_url": null, + "metadata_sha256": "f7c0687c032593106a2e5a3c241cf8043e7e2c222bddb0022b4cb2bf5de67115", + "name": "lark", + "version": "1.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "4511c6b04efc57a5f5333edc1f5f48b9f5412c3923d4bc19b715bdf47977511c", + "name": "linkify-it-py", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "be929870f6ecae18a819c56118f1101f3076e25ac6a4843ca6f4707ebd1e87c6", + "name": "llguidance", + "version": "1.7.6" + }, + { + "direct_url": null, + "metadata_sha256": "cf2b87669bead3e76ec54207f3354c13f73b50c32fcd13c8d627084b3379139e", + "name": "llvmlite", + "version": "0.47.0" + }, + { + "direct_url": null, + "metadata_sha256": "0a416d79c5543d94d2b18807626293d4f47655d1d22724c7ae296e413078aaba", + "name": "lm-format-enforcer", + "version": "0.11.3" + }, + { + "direct_url": null, + "metadata_sha256": "16bc1f59e34fd2a6633bd395276052eacd2c777b2cf72781e76b203f013a8fac", + "name": "loguru", + "version": "0.7.3" + }, + { + "direct_url": null, + "metadata_sha256": "5216d5acfd039a7b581a826186309594b228d37d2c8d56864124ea666689fe4e", + "name": "lxml", + "version": "6.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "f59d772b35315a928672bfcccfb89d82c0aac672c5275c048f7a93b79015bcea", + "name": "markdown-it-py", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "b137367ef0056711cbf5e53015df9168cab80373104e7899b1c0263a21d9c99c", + "name": "mcp", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "38e0b9edaae09e58cd1461fc961ced22672038a697930bedef153a74befb3de1", + "name": "mcp-types", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "799f49685865fd9cc8915fdb92a33e102eeeffad562b03b4aeffb6f422b771c1", + "name": "mdit-py-plugins", + "version": "0.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "481f9cbe08596c6eaba6343e0efa1b13b2362c30dce0610f7c08523f1d98388d", + "name": "mdurl", + "version": "0.1.2" + }, + { + "direct_url": "{\"dir_info\": {\"editable\": true}, \"url\": \"file:///Megatron-LM-training\"}", + "metadata_sha256": "2876c0c760bbfc93bd7d737bf0db2866a937308a7c1707c3a2bb59d4795986ff", + "name": "megatron-core", + "version": "0.16.0rc0" + }, + { + "direct_url": null, + "metadata_sha256": "a6e34d488c879f57ce042bec38f8864ba3ea7d6ecf0ab757fc88fe8dc0a22f26", + "name": "memray", + "version": "1.20.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd26d80dc9676b1fb8c894355bd525fbe7f49a6a86a555c72e9ec6d927247c33", + "name": "mergedeep", + "version": "1.3.4" + }, + { + "direct_url": null, + "metadata_sha256": "dd1b3b89e88d1c65a26e6e72dd075eabbc220bfb138769ec8b64578ee911795c", + "name": "mistral_common", + "version": "1.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "4859847a9f6321daf8849cf7fd1542ff430db6563a2abf9ac0d62a5b21bd951d", + "name": "mkdocs", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "1729fc31479f2582486cdc85397417659dd3b2fb3f920553de66cfe59d5f0b3e", + "name": "mkdocs-awesome-nav", + "version": "3.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "88b4b7b7c0aba5547befdedaf515c8df4867361daf55ff60b72578464d72dcbe", + "name": "mkdocs-get-deps", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "ad33bb33fb16b1f69689c4682550e97232154e367e2c8c8aee9dad0f10d269ce", + "name": "mkdocs-git-revision-date-localized-plugin", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "ed69fbfb9ac00c10c5a383a12ff9d2b9919ae184e408554434199211643d6040", + "name": "mkdocs-material", + "version": "9.7.7" + }, + { + "direct_url": null, + "metadata_sha256": "d1c549b61701148b97f8246bc924b2840e504b37b0ce7a27e78ddf81261e5363", + "name": "mkdocs-material-extensions", + "version": "1.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "4ad6171f3bf6812e4de90670ff0089d445093d4fe1d05d55f17b96a4a192a816", + "name": "ml_dtypes", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "4ad6171f3bf6812e4de90670ff0089d445093d4fe1d05d55f17b96a4a192a816", + "name": "ml_dtypes", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "b0dbdfa30ab6b1ce637a794899c9e43019182b6d1ab2d07b90f647f7331eba6b", + "name": "model-hosting-container-standards", + "version": "0.1.16" + }, + { + "direct_url": null, + "metadata_sha256": "95424470e481cfa8d18b30963b6de3aafe16614b1ea0414e184a008571dde84f", + "name": "mpmath", + "version": "1.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "eb184d83489401903615ce8a78d98d5b933dec0f7246811d396a529915fe797c", + "name": "msgpack", + "version": "1.2.3" + }, + { + "direct_url": null, + "metadata_sha256": "520006303d6a0e859970b83f7d452196e2e8f6dab08f6dcf1ba5823c1230025f", + "name": "msgspec", + "version": "0.22.0" + }, + { + "direct_url": null, + "metadata_sha256": "010d2fe039006070a711a476b171b7b7da5c29ccad3c4eecd77ef3711b07c2d0", + "name": "multidict", + "version": "6.9.1" + }, + { + "direct_url": null, + "metadata_sha256": "235634cc7ebda45f8a84dfdb1b9b35ac1a77a1888b34650c3a616d23e4a7e93f", + "name": "multiprocess", + "version": "0.70.19" + }, + { + "direct_url": null, + "metadata_sha256": "7c545b4b3e5e83d3fde41352272c10cb9deeaba5b7138fbf24383e952af8822e", + "name": "natsort", + "version": "8.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "311ee8cdaeaf9f11acf51cda9c3b5b191f76ce9d98bc3418164c3189bbc37a08", + "name": "nccl4py", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "66360539217852c3b44b37f409eade7e1559baf018bb363bacb2aa3a9759b203", + "name": "networkx", + "version": "3.7" + }, + { + "direct_url": null, + "metadata_sha256": "e8b0b1746808b87816c47e4531780ded7f246bed9575a89e8b40200aa81e9a13", + "name": "ninja", + "version": "1.13.2" + }, + { + "direct_url": null, + "metadata_sha256": "77c1117f0dbc41560ddc6e6b37b542fb4e88afcd4ef82ec06593e5bbd5f37121", + "name": "nodeenv", + "version": "1.11.0" + }, + { + "direct_url": null, + "metadata_sha256": "9af629898406c9eaa69897fe09220dc483270cdba89f6b20bf0165cdf0e1668e", + "name": "numba", + "version": "0.65.0" + }, + { + "direct_url": null, + "metadata_sha256": "0c7281a81cf76e40b27c1385ffd8a215d7227adc219f177ce807ead9e91994a5", + "name": "numpy", + "version": "2.3.5" + }, + { + "direct_url": null, + "metadata_sha256": "0c7281a81cf76e40b27c1385ffd8a215d7227adc219f177ce807ead9e91994a5", + "name": "numpy", + "version": "2.3.5" + }, + { + "direct_url": null, + "metadata_sha256": "bab990ced4537ce74ef5961ca933c4c6fd604fd09a5827a4a428c55bcb0be35b", + "name": "nvdlfw_inspect", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "10f6595146332d35f7f15a000e08b5c81432528c5d026470c1d03f0c1399fb70", + "name": "nvidia-cublas", + "version": "13.1.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "58e933b4ac8e49f098b16ab7480d03bd792afc3d1db10d0aacbdcc2c62e48fa3", + "name": "nvidia-cuda-cccl", + "version": "13.3.4.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "baac937970681d41aa0c3708b3d55d73f8d29e70aceaac0e71fe6d1548e94a09", + "name": "nvidia-cuda-crt", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "8d51e5c76ef5707b0b80d5ec9a791c0f11a480ab721820cf100a3cc566017eef", + "name": "nvidia-cuda-cupti", + "version": "13.0.85" + }, + { + "direct_url": null, + "metadata_sha256": "724bf56e61ddef5d4c2482ff64103a973b911b110b668acaea5373f6c83c1c5c", + "name": "nvidia-cuda-nvcc", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "c54801dbd815d534519a761f1f328325aa0f1d1f1659aa969fa74e7a2c76eee9", + "name": "nvidia-cuda-nvdisasm", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "af51f248363020b9fdfd2743704e901bf3d19a1a1ce1fe44fb98ba148bfc0157", + "name": "nvidia-cuda-nvrtc", + "version": "13.0.88" + }, + { + "direct_url": null, + "metadata_sha256": "055f7fc69a5a2159de82cd0718da02c8852e81c8a71ebb117b8e799badd7167e", + "name": "nvidia-cuda-runtime", + "version": "13.0.96" + }, + { + "direct_url": null, + "metadata_sha256": "df18686dbdb3074ca375a1d6c623a04102fd348950c67a721397349c6d4f0477", + "name": "nvidia-cudnn-cu13", + "version": "9.20.0.48" + }, + { + "direct_url": null, + "metadata_sha256": "abd0ca3f67af19a4d383ff2a012ae0090d4731c6492fd47236615308a50b3981", + "name": "nvidia-cudnn-frontend", + "version": "1.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "4a78545d424d0c5038353f7046a8ae40ceaf312045d71399eac9511f5fc15434", + "name": "nvidia-cufft", + "version": "12.0.0.61" + }, + { + "direct_url": null, + "metadata_sha256": "e49b909195c03ddbe203729d9b31dd88e3f207368333d1909c67c6b130a0c696", + "name": "nvidia-cufile", + "version": "1.15.1.6" + }, + { + "direct_url": null, + "metadata_sha256": "bb15a754c6be32c23aaac13c1cfa7a8ce53d92bc26652ec3b609f7a5cce3e7d1", + "name": "nvidia-curand", + "version": "10.4.0.35" + }, + { + "direct_url": null, + "metadata_sha256": "0dd58f677811eac04901a793740932e5a2a8fff2f5453aa6351614eb18391bb6", + "name": "nvidia-cusolver", + "version": "12.0.4.66" + }, + { + "direct_url": null, + "metadata_sha256": "8aeb284782ef6883095a5d1c110e221cad023a99afcfd5cdb4969a25e146d562", + "name": "nvidia-cusparse", + "version": "12.6.3.3" + }, + { + "direct_url": null, + "metadata_sha256": "09555246122896eaca3b8313eecfca4b339fefd3b597874cb9fe3bf29dab38c9", + "name": "nvidia-cusparselt-cu13", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "ac77bac79fbfb0c52ac6e2e5abc936b1e127be2192f0cbc27b00be3125fa86ae", + "name": "nvidia-cutlass-dsl", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "1ec968ec7c4083f7fe4e1fb8384c7e9b853a81491fef9f4cb1cf755961aaedf6", + "name": "nvidia-cutlass-dsl-libs-base", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "cc6f3846cd820013eaa6e2665c493d70c607be6ce7349b939eb4742888470585", + "name": "nvidia-cutlass-dsl-libs-core", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "2357d0df2d0d17c0b16663b8a89df53f751b19721f66821fd88fa78112c08e55", + "name": "nvidia-cutlass-dsl-libs-cu12", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "244590c25662dcf777b1daae97a858afe1a1aec62e5e6678b217007a459ab552", + "name": "nvidia-cutlass-dsl-libs-cu13", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "c3a25ada01f57418c1b897406c3abab18834e6adc573ab7b060620c453afb6db", + "name": "nvidia-ml-py", + "version": "13.615.71" + }, + { + "direct_url": null, + "metadata_sha256": "56baad4e7f699902b03b17580933f7bd50b6ea97b7df9d7e807750973da7529c", + "name": "nvidia-nccl-cu13", + "version": "2.29.7" + }, + { + "direct_url": null, + "metadata_sha256": "98810ef0ab8badc369e6a46a038f8ee9f412c0c753fb5ad580544f23a0aa7962", + "name": "nvidia-nvjitlink", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "b0f54ee21909d19640a58e05da755c91763eb5725f544fd0d4b84b2f5f94deba", + "name": "nvidia-nvshmem-cu13", + "version": "3.4.5" + }, + { + "direct_url": null, + "metadata_sha256": "06dc1a593c7e8b8c3f29184228c83f8f7ef57787ad91f3e5bcae1d238dd3092a", + "name": "nvidia-nvtx", + "version": "13.0.85" + }, + { + "direct_url": null, + "metadata_sha256": "32ee63450a437b6a6ed227ff6549144aa596197a322993521ec7af826ebd413e", + "name": "nvidia-nvvm", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "32c2efdcd2c673b3b7f35ca9c2cccefaad36f1f0a920648a13cad85f6a5767b2", + "name": "nvtx", + "version": "0.2.15" + }, + { + "direct_url": null, + "metadata_sha256": "3419d80e114a2c19fa9bd3582939a3942f19673055707ba6ca2ca489d58b41e0", + "name": "omegaconf", + "version": "2.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "28971076ce9c279d4b889496b046d55a1e05b02fb9851ceb717e9a10df799572", + "name": "onnx", + "version": "1.23.1" + }, + { + "direct_url": null, + "metadata_sha256": "1246f5a4d8295907a42e809ed9173ede2510ec9d260d2168989d126564897fa5", + "name": "onnx-ir", + "version": "1.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "e14643636835759700dff286f949c5ec34e7eac7ac47f44096414f0e0f1c3101", + "name": "onnxscript", + "version": "0.7.2" + }, + { + "direct_url": null, + "metadata_sha256": "00f847e99939207bd70dfd806428f6b20a3d01074b59325e4c76149a2e19be26", + "name": "openai", + "version": "3.22.1" + }, + { + "direct_url": null, + "metadata_sha256": "598d3ad5a22a14a7c4f1d218b43e345f32b0ba094b753467bae8a3f708fd48cb", + "name": "openai-agents", + "version": "0.22.3" + }, + { + "direct_url": null, + "metadata_sha256": "5a0afcb1ce845e05da12beb1767f5d2749bbc9e9050718c6b9fa3c225713c9eb", + "name": "openai-harmony", + "version": "0.0.8" + }, + { + "direct_url": null, + "metadata_sha256": "e86a6b6fcbbe152805f782c57df321002892e163019574877e9829272e25eb4e", + "name": "opencensus", + "version": "0.11.4" + }, + { + "direct_url": null, + "metadata_sha256": "53d669c8bd3d32d3275153b454e515ca5cc6dec92fae3a98309b5a2b19fe6d2d", + "name": "opencensus-context", + "version": "0.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "19778b6d66b0e45bf73e11fa37a208949d5b393aef914627394d5601455546a6", + "name": "opencv-python-headless", + "version": "5.0.0.93" + }, + { + "direct_url": null, + "metadata_sha256": "19778b6d66b0e45bf73e11fa37a208949d5b393aef914627394d5601455546a6", + "name": "opencv-python-headless", + "version": "5.0.0.93" + }, + { + "direct_url": null, + "metadata_sha256": "a3f5434fa7c80f7f7abc82173da639c8e9c59d30b4027182645562bd3d2f4f97", + "name": "opentelemetry-api", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "8611977ea596e4827874582e86250618444e1c718229dddfc16e5ea437ce5fcb", + "name": "opentelemetry-exporter-http-transport", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "2cfd41e5ca33292d987ba71fa6186d11e16ed66888f3a26f8a3a99060c4b5e90", + "name": "opentelemetry-exporter-otlp", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "3bb4494220732d4bf10e1dba231ea7638cedaa5362e1f23a50d34a14f520fea8", + "name": "opentelemetry-exporter-otlp-common", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "27fb1c8aa5c2cd07776f9f3281fc618cd3feb96017757c33d2b3586fb7fec88b", + "name": "opentelemetry-exporter-otlp-proto-common", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "5cba6098cdd0bfb06853a6c704a2451c4f82c9dea376a30b59ecd279296648ad", + "name": "opentelemetry-exporter-otlp-proto-grpc", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "6f53ef1c172ebf87af69b9ef390aa908506d0cd14bc7811985fdd937a4058808", + "name": "opentelemetry-exporter-otlp-proto-http", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "1910f4e7ebd497e98b6d231e10275288fda2cd1885117575706c62f45e065889", + "name": "opentelemetry-exporter-prometheus", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "fab18b721e30be41448be252e1dca43b48e7f15d971e0bb552492c0ef4b07bee", + "name": "opentelemetry-proto", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "3644a79f55762a646799ff52b9d837e01c8192b7b28f735a383f55c90edb9bc2", + "name": "opentelemetry-sdk", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "add3db481f7f401f65cfbddb058fde3bb4c9dd7b61064a84f8598ad7efe0b11c", + "name": "opentelemetry-semantic-conventions", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "0dfff30e912520a226bcf7a547393484cfcd8c738439c7b48418f61c95109480", + "name": "opentelemetry-semantic-conventions-ai", + "version": "0.5.1" + }, + { + "direct_url": null, + "metadata_sha256": "210ce26bad0a245a72831b4fa029708c245d4d670a88c8d5a69b1446c24a95e4", + "name": "orjson", + "version": "3.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "35ff73511848f5f934ccc39d538014716ec4579e76d54e0e407ff51794a7939c", + "name": "outlines_core", + "version": "0.2.14" + }, + { + "direct_url": null, + "metadata_sha256": "8ee2f7138ade46b6e348a6d099612f5bd6caff13511f3b4144327f37ce50eacf", + "name": "packaging", + "version": "26.3" + }, + { + "direct_url": null, + "metadata_sha256": "a4ab87bf8083001f25ccdc46095f05b678b3569dd58edc2cf941e3e7f64d7c88", + "name": "paginate", + "version": "0.5.7" + }, + { + "direct_url": null, + "metadata_sha256": "1de96a6c28c2e5613c9c87cd4ad9484791001cf58df43cf2ba74d5c4f85f0ad2", + "name": "pandas", + "version": "3.0.6" + }, + { + "direct_url": null, + "metadata_sha256": "d05b8d05da9f78176b2eefaacdfaa5e96708ec4f488daea8bbc52e3ed1bc3954", + "name": "partial-json-parser", + "version": "0.2.1.1.post7" + }, + { + "direct_url": null, + "metadata_sha256": "c1d126edceac2685e29403a8ae3a27c47143dce1f0252fa3931771562f1e2b4f", + "name": "pathspec", + "version": "1.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "30325dc8ce17bc64f9dbc0a449232fd35841a019df22a6f481007c9c5a28c1cb", + "name": "pillow", + "version": "12.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "cbc0b7b6e63b50dcb7c17cf3526a9304f285d9a31353adf3b22acc2059ab23f5", + "name": "pip", + "version": "25.0.1" + }, + { + "direct_url": "{\"dir_info\": {}, \"url\": \"file:///work\"}", + "metadata_sha256": "6ba03b5bc457a2a3d92468729501b5892a0d38ebcc36766c58859449498c5743", + "name": "pip", + "version": "26.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "0421937c4410b61c5325233d5b7671ae933bae8de174f87586ac55aa804851ea", + "name": "platformdirs", + "version": "4.12.2" + }, + { + "direct_url": null, + "metadata_sha256": "2bcffab42626e1fb50d6329765619312d30fe7f4880e98dcee99c92ebd283bb4", + "name": "pluggy", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "7e7562ba7c032f8edd02641ae71b1ac2d8f388103a68d777a7e907d19e75bc17", + "name": "pre_commit", + "version": "4.6.2" + }, + { + "direct_url": null, + "metadata_sha256": "bbe0a7662602ddd23f929fe0ee98e9d04406e138aeee18ce4861af186ea6060d", + "name": "prometheus-fastapi-instrumentator", + "version": "8.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "ece4a61f3ffb92a083fd5e47e180e3e070342e60a3bd93876a879e79a643e821", + "name": "prometheus_client", + "version": "0.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "5feba21a58eaa126e7e7739e57e2572e5bb251fcbf56e439e508acc47d769314", + "name": "propcache", + "version": "0.5.4" + }, + { + "direct_url": null, + "metadata_sha256": "3f136dbf7239c987a7685acd33440cc5efd6c4107b4b11c425201b4de70ae36f", + "name": "proto-plus", + "version": "1.29.0" + }, + { + "direct_url": null, + "metadata_sha256": "118b5ad013120a7a6e24714595ad776bf264d7b0060389133310d18ea1480902", + "name": "protobuf", + "version": "7.36.2" + }, + { + "direct_url": null, + "metadata_sha256": "0849f5a519bf9bc23ef204443fdd8d6d10678863acac7ca9340fc11bfba5a856", + "name": "protobuf-py", + "version": "0.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "eab5f2f4fd98f67a710a8fb1975b64ffa880a4f977566f022c567e08e324ccd6", + "name": "protobuf-py-ext", + "version": "0.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "39009938840de3a8b2a37eb4668d2601aae8c74e4b74743f73e59996b5b7e6e1", + "name": "psutil", + "version": "7.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "df44b58e8a4cfe57f65773ec47f7bdf2a14c8f5f73a7abf331a6b6237d6d691a", + "name": "py-cpuinfo", + "version": "9.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "2fd4a9efc5e5c74ae4c2fcf1970193c524c62ab22af8d5e66ebf7df9e6e46e83", + "name": "py-spy", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "d2ccdeb15cddedc81637a83e40baa6397fe269023b738d0fc3cb2d90722e290b", + "name": "pyarrow", + "version": "25.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "47b9f28e971a56f5adf949e0bcf105b0bf6587946566ecf197a2819d8848cc01", + "name": "pyasn1", + "version": "0.6.4" + }, + { + "direct_url": null, + "metadata_sha256": "82ce4c01c6d36841b9801fcdabab9bfe61d0b5e4e440c275941d8a2d4a790730", + "name": "pyasn1_modules", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "45cb345e4c12f63bc843b8c88902cc44c4d624a55aaef8cd5ffbc0ad16356fbe", + "name": "pybase64", + "version": "1.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "d311ae661edeac8ff029ab2960d065a7e792ebf8f79af682daa53109fe81318b", + "name": "pybind11", + "version": "3.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "cce9c0d440d065d4cdfb0d00004b8ddd65cf363a740efc5b0920b29201a59cd9", + "name": "pycountry", + "version": "26.2.16" + }, + { + "direct_url": null, + "metadata_sha256": "a1e33542883c249bf6c263b0023b9ea8a6131a77d9cb2cbc88316968e5eada83", + "name": "pycparser", + "version": "3.0" + }, + { + "direct_url": null, + "metadata_sha256": "faffcc4d7d359cb1047a9f67f7c65096b838c6db6c62852ef20fb27d55649a95", + "name": "pycryptodomex", + "version": "3.23.0" + }, + { + "direct_url": null, + "metadata_sha256": "98929f4cb80451dc3c6c8cd541a3081dccf0dee94afe7d9fa5c214a18ff236ce", + "name": "pydantic", + "version": "2.13.5" + }, + { + "direct_url": null, + "metadata_sha256": "8eccadbe707db97c397fb79073fe791b7998ef3a85f04f817f8991f7697b190b", + "name": "pydantic-extra-types", + "version": "2.11.1" + }, + { + "direct_url": null, + "metadata_sha256": "8f00c91deb34399316a5386eb2e76fe09f14a08dc3045f2e7dce9bf8573796bd", + "name": "pydantic-settings", + "version": "2.15.0" + }, + { + "direct_url": null, + "metadata_sha256": "66c729edddc20bf2764bb18bd87d907b08690e50355f39b97acc737b26d1d164", + "name": "pydantic_core", + "version": "2.46.5" + }, + { + "direct_url": null, + "metadata_sha256": "394500d78a0c1a433ae8ca3693152c08f6a901121d4b069cf1540a19759e2950", + "name": "pylatexenc", + "version": "2.11" + }, + { + "direct_url": null, + "metadata_sha256": "df2e9e9847a2aea0ae6e20fd325aeb16cf3ce7f8913462db6c2398363cd0c0bf", + "name": "pymdown-extensions", + "version": "12.1" + }, + { + "direct_url": null, + "metadata_sha256": "82fcfe724db9f0b51348da89f4f5cdc0b08d08882b1bbc0ca4913d3a0a93bcb9", + "name": "pynvvideocodec", + "version": "2.0.4" + }, + { + "direct_url": null, + "metadata_sha256": "3722422cc1478b175879143dfb78f98b7a5f53f4f684d71b7054fe2e8acd3b89", + "name": "pyqwest", + "version": "0.10.0" + }, + { + "direct_url": null, + "metadata_sha256": "7d1d1c276b7c372d55d17ac7d30f0a4b80a746e147347b8510d1355eea7f80c8", + "name": "pytest", + "version": "9.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "89e7c1c932e52b74bdcaf504389d2d1a2d7ca559b02bf5a09fc80ebd58ad10f7", + "name": "python-dateutil", + "version": "2.9.0.post0" + }, + { + "direct_url": null, + "metadata_sha256": "54f30f811841b6d772f31715712c85bfe0041839cb071f78daf41c700a98642b", + "name": "python-discovery", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "54f30f811841b6d772f31715712c85bfe0041839cb071f78daf41c700a98642b", + "name": "python-discovery", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "0cc19efd76cfbf3bcb2cb0d3ab82191036855859455aa3812c5e9e591e3f34e8", + "name": "python-dotenv", + "version": "1.2.3" + }, + { + "direct_url": null, + "metadata_sha256": "1d866c6124631b9ce1797ad412fff298ab53fc2d95210281d7c8f20e920753fa", + "name": "python-json-logger", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "2d18a1e7286d92a656ead5ec6f83d5ae6dc858634624f6b264703ae88d24d718", + "name": "python-multipart", + "version": "0.0.32" + }, + { + "direct_url": null, + "metadata_sha256": "beaa0efe9ba4b34843f5a0fc7379a73f10e95adb8cc0c31f359ab6f3a42b4def", + "name": "pyyaml_env_tag", + "version": "1.1" + }, + { + "direct_url": null, + "metadata_sha256": "238dc769e22d4f5626750cdff36e920e4a8d69c10d88de6d79b40a59cc13d873", + "name": "pyzmq", + "version": "27.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "de0a5e855bb5bb78b7acdcd2ca60619c6a0c109814881589caf158ec07155662", + "name": "quack-kernels", + "version": "0.6.5" + }, + { + "direct_url": null, + "metadata_sha256": "961ffef199b876fb4d7b10903d78e79f359d703b1638834c61d70b9879932918", + "name": "qwen-vl-utils", + "version": "0.0.14" + }, + { + "direct_url": null, + "metadata_sha256": "faf6ab9027d12de992827a2d8a224996fe6747a8c5f7d31ae495983dc73eefe9", + "name": "ray", + "version": "2.54.0" + }, + { + "direct_url": null, + "metadata_sha256": "c50d8b3ff4d113925b60dc47d1d28e87248a3338024241b0a3a66c8794fbce0c", + "name": "referencing", + "version": "0.37.0" + }, + { + "direct_url": null, + "metadata_sha256": "02acdc52d6f21d5f4b172254daaa94edfaa44c9ebe14d1c00cc4c8fe99b0e1df", + "name": "regex", + "version": "2026.9.29" + }, + { + "direct_url": null, + "metadata_sha256": "ac08207697217d1ffde8a161b424d77d6e2af6b62630fa26d75d08f11076cdca", + "name": "requests", + "version": "2.34.2" + }, + { + "direct_url": null, + "metadata_sha256": "f1abd635c3dff607a4fd654c62a88d9d4c21843cfc9176116c156f4269ca21b5", + "name": "rich", + "version": "15.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "932ff7743a756d0efcc45528d64c275ac3cb40a8dd1787ea10cb303907f0ae4f", + "name": "rich-toolkit", + "version": "0.20.5" + }, + { + "direct_url": null, + "metadata_sha256": "294a1405c0fa34b5f735bcb46459050436849a1e584c643544de99c07c529fb7", + "name": "rignore", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "5e54dd00b4ad336c5161d47de2a5c2212090c44629c28b6538b156256e49282d", + "name": "rpds-py", + "version": "2026.6.3" + }, + { + "direct_url": null, + "metadata_sha256": "0d5895abd80bfc0027c02943abaea4547061b9004bd134950d640d619a697835", + "name": "safetensors", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "91d5de3f641f33a8fbb4b6e91772da68d50b68686971d7b66af2068f2e77b694", + "name": "scipy", + "version": "1.17.1" + }, + { + "direct_url": null, + "metadata_sha256": "297fb30f701a800489c12893a951da3e5bd1f80061a1f43f0d3e9f1d4c6bc6fd", + "name": "sentencepiece", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "4245e0388ddf2048a38ae2a24a3d2c583408b2454aadc680d3c3beede639db3f", + "name": "sentry-sdk", + "version": "2.71.0" + }, + { + "direct_url": null, + "metadata_sha256": "ae8a9e6feec1a76e954d65ea48ac57842c9a7bfb5ac6e5ea82400a5ba9f71a98", + "name": "setproctitle", + "version": "1.3.7" + }, + { + "direct_url": null, + "metadata_sha256": "341d00772017437d0f6e3c943ae353f243c39fedfba403aea47cced927a76516", + "name": "setuptools", + "version": "79.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "ff4bcfb192bd542ed8f1794fb32ffc9eabd932d6e03cb00a4ad5e35a2469af88", + "name": "setuptools", + "version": "80.10.2" + }, + { + "direct_url": null, + "metadata_sha256": "f1e5a532fb8cda0bbc370e3db6cb9cea72a065d12ddd6a14976ba3cf66264221", + "name": "shellingham", + "version": "1.5.4" + }, + { + "direct_url": null, + "metadata_sha256": "2aba2cfd9c2ad7625a5d374d141af317d8f92d3534997bf98d127e52848dfc81", + "name": "six", + "version": "1.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "69ae2dfe547624be97fae348e1cfa3793f8854eed32cc1603badedc7d48fb36e", + "name": "smart_open", + "version": "8.0.2" + }, + { + "direct_url": null, + "metadata_sha256": "d415e6c6de7dee117d254a342668c489931bc88eac7ec8678b452078e366da6e", + "name": "smmap", + "version": "5.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "093bc4f0740a6fc28692e616aa8fe68d7e1d76426cc5a5faf9ea722a8ee7aaae", + "name": "sniffio", + "version": "1.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "b3cef071eb1dbeaa76a1273fe2ca2cc8ef36e835165253952d93780962529ac1", + "name": "sse-starlette", + "version": "3.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "3c01ca830e213f0311fe37bc3b46b8ab230a5e7acb894bf0fc8785cb7ccfed48", + "name": "starlette", + "version": "1.7.0" + }, + { + "direct_url": null, + "metadata_sha256": "6017ca508a293cf47a88a78cb330e9cbd131d74ec3c7fbf89bd4300ed3129d30", + "name": "supervisor", + "version": "4.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "fd5eb4925b04f9bffbc6c4f92bf8aea7243b918b43cd359493fce48a7dd3b336", + "name": "sympy", + "version": "1.14.0" + }, + { + "direct_url": null, + "metadata_sha256": "f09f0e24282c5a86346bcd5b10ae5ff81869fa8ef69c3ba524bd0a817a87dda9", + "name": "tabulate", + "version": "0.10.0" + }, + { + "direct_url": null, + "metadata_sha256": "519fa19c146fd58a0a75ecf1461e4bd98f9c06d01800c37d4a80f5fef095f4e1", + "name": "tensorboard", + "version": "2.21.0" + }, + { + "direct_url": null, + "metadata_sha256": "1af7ad76e4073b01ab147eb3c1d8e38b95d38062c6c9bc63890150738642e8eb", + "name": "tensorboard-data-server", + "version": "0.7.2" + }, + { + "direct_url": null, + "metadata_sha256": "9e597f62fc07e3b931d5c8fb0e90706fb6d45465cfb5d01dbd27ba7fc135c02c", + "name": "tensorstore", + "version": "0.1.80" + }, + { + "direct_url": null, + "metadata_sha256": "0da993d16ef6326f471796fcb065622f309c5c1aae6c6295b488ea64bb5c880c", + "name": "textual", + "version": "8.2.8" + }, + { + "direct_url": null, + "metadata_sha256": "52ca6148d4fd1497254855fa610cfdde99191cd42bce7a452fd3a68855504ac0", + "name": "tiktoken", + "version": "0.14.0" + }, + { + "direct_url": null, + "metadata_sha256": "0df9eb495cfb477dcbdfbdcd8c04d952d3eb00d77831630760571e13545398e5", + "name": "tilelang", + "version": "0.1.12" + }, + { + "direct_url": null, + "metadata_sha256": "802b576e011dc61bd2681593e8d802714b6c4ce636a9cf87035026db32ce6262", + "name": "tokenizers", + "version": "0.23.2" + }, + { + "direct_url": null, + "metadata_sha256": "4e1631b2164a49ff9a848d86ce504fdcc15e3540dbb262df8f33a2681a8de513", + "name": "tokenspeed-mla", + "version": "0.1.8" + }, + { + "direct_url": null, + "metadata_sha256": "05086095a775c5dca70998dcf442a848c13f9c68b54a54c510c3542c5abb6563", + "name": "tokenspeed-triton", + "version": "3.8.10.post20260920" + }, + { + "direct_url": null, + "metadata_sha256": "71daba472d0c5ffc25c0231dc29688ab0cb13d5bc7e7d93f6c4cce4169c50048", + "name": "torch", + "version": "2.13.0" + }, + { + "direct_url": null, + "metadata_sha256": "cccd2f1c0e5866e63732f58798c8d642ee6d10cd560d6f691e7981b908c246c9", + "name": "torch_c_dlpack_ext", + "version": "0.1.5" + }, + { + "direct_url": "{\"dir_info\": {}, \"url\": \"file:///torch_memory_saver\"}", + "metadata_sha256": "6276cef17dedbb5ee0d6157bbf63b832e916026281328d995ad3d488c2539618", + "name": "torch_memory_saver", + "version": "0.0.9.post1+slime" + }, + { + "direct_url": null, + "metadata_sha256": "29809ca2c86dda5079654f1f70564a64435e9d08f1964a2412b6f514e1b5ff64", + "name": "torchaudio", + "version": "2.11.0" + }, + { + "direct_url": null, + "metadata_sha256": "7e9be0f3a290e3fd9370d8fe010c7ffd006d5d3d05ab8bdf7df8f92f0fca9c39", + "name": "torchcodec", + "version": "0.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "181fa5e6b399c378711eddcdacd756d3c51317916f8eb160ee36cae7fae9589f", + "name": "torchvision", + "version": "0.28.0" + }, + { + "direct_url": null, + "metadata_sha256": "43d1261aff90cf3d5b1b40cf1f94234d61409b14e59f3766f457c1eec7f7ac15", + "name": "tqdm", + "version": "4.70.1" + }, + { + "direct_url": "{\"archive_info\": {\"hash\": \"sha256=3e1d9f534781c8e608240da0b495b8246317a36382f7609017cbaa7fb1d53f7b\", \"hashes\": {\"sha256\": \"3e1d9f534781c8e608240da0b495b8246317a36382f7609017cbaa7fb1d53f7b\"}}, \"url\": \"file:///wheels/transformer_engine-2.16.1%2Bc9877beb-cp312-cp312-linux_x86_64.whl\"}", + "metadata_sha256": "d882f743161d9d9f35dee4e1a8cc9136fa495f7c660caace01ab8f5602d76aa7", + "name": "transformer_engine", + "version": "2.16.1+c9877beb" + }, + { + "direct_url": null, + "metadata_sha256": "465797a59706d83b45c93fde750b228c3b6e1addc44115de2c4c02ad66d9c5ea", + "name": "transformers", + "version": "5.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "a91982ca086667c592a951973434f7c5a9f27a8300bc97af78dfb496afe53e71", + "name": "triton", + "version": "3.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "d26fbb244532c4051e715f9047cd943e2cc4abb0ac6f2a517fa2986eb1ea726a", + "name": "truststore", + "version": "0.10.4" + }, + { + "direct_url": null, + "metadata_sha256": "c84af1a069084b1b440b3594068dec29200d52d4c1a9b652030448717f270158", + "name": "typer", + "version": "0.27.2" + }, + { + "direct_url": null, + "metadata_sha256": "0ad6653b7439f4bb6a596cb7b01ed1b716458467525c4dc40b75d62bdb943c98", + "name": "typing-inspection", + "version": "0.4.4" + }, + { + "direct_url": null, + "metadata_sha256": "d005280aa13b334ac942d20219102865e559f69ffd06c35c248b2f0d0da3b933", + "name": "typing_extensions", + "version": "4.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "fba2930e9030a18965d243f8d330748db2e67572a81b3b68710462fb5110332a", + "name": "urllib3", + "version": "2.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "bc5717bd6524a33838f285261868bcc8e311e8c29fdb19e41d56c38b04890e84", + "name": "uvicorn", + "version": "0.54.0" + }, + { + "direct_url": null, + "metadata_sha256": "741c006d8441f562aa853a5430df236fbb4af923445491f396bf09943bd30258", + "name": "uvloop", + "version": "0.22.1" + }, + { + "direct_url": "{\"dir_info\": {\"editable\": true}, \"url\": \"file:///vime\"}", + "metadata_sha256": "f85aa01dfdc868756a6583434bbff040f29eb511d47d5b25ada063a84353aac6", + "name": "vime", + "version": "0.3.2" + }, + { + "direct_url": null, + "metadata_sha256": "c25431aaf1950971fe96292f395a41a55b403127bfca0d0b8f7dc9cff5dab75d", + "name": "virtualenv", + "version": "21.14.1" + }, + { + "direct_url": null, + "metadata_sha256": "4e3ee0a31d85e56268640aae853bcee4794dfe8c0483c5c6370517e480c81ae0", + "name": "virtualenv", + "version": "21.14.5" + }, + { + "direct_url": null, + "metadata_sha256": "d4ed5c7551cddb8c1aeff2f9f27b3491f6ad2c9afda8e7bb9779c33fa12a536c", + "name": "vllm", + "version": "0.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "84b482e09bac949e992594757214a1920c667a5d898ee320e309250697f6d26e", + "name": "vllm-router", + "version": "0.1.15" + }, + { + "direct_url": null, + "metadata_sha256": "9b16c871eb1060a5218e9b9a9ad33288d94844cfaf43f08dbb6c32423bde8fe3", + "name": "wandb", + "version": "0.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "8e4f2be437dfe4eb3c6c959e517ac20b75d06525563f1ebcbf06f9ec648bd7c1", + "name": "watchdog", + "version": "6.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "15218afb42938907c2ca74c54e3d8e3a5406493c4761e29e38e82bfec0f84296", + "name": "watchfiles", + "version": "1.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "8863af96e88b7db9990da99aa6c46816eacc3d2f9ae1297b53381b033cd70119", + "name": "wcmatch", + "version": "11.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "f46e6bd6cfafb2b684c29587b017b7096fd9155b74eda25a22eca784b9803ab7", + "name": "websockets", + "version": "16.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "ce82db5ccfefa4bfbe4e25a36e1f91e8e7d51fcaeb31586c4d48e1c69f99168b", + "name": "websockets", + "version": "17.1" + }, + { + "direct_url": null, + "metadata_sha256": "0f142a2c09eac643c7d0bfe77f3f121184c0b17914afbd32af669ed19b2b02ef", + "name": "wheel", + "version": "0.47.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd58938e51a3c5cb363f6f22eaa2a8a7accc1ce373388de167a82f77d3e5783f", + "name": "wrapt", + "version": "2.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "b0b72c1941f04499ca7e1a3a6e479aee8df902c3d49979624b59dba8c3228d37", + "name": "xgrammar", + "version": "0.2.8" + }, + { + "direct_url": null, + "metadata_sha256": "ef8861f39e5c36255966a36032651f937d890d55f31f1c26304b488f1ba34332", + "name": "xxhash", + "version": "4.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "740c08057b6eb69c58402c87d652af0a471e46325d811f2c605632a18817152f", + "name": "yarl", + "version": "1.25.1" + }, + { + "direct_url": null, + "metadata_sha256": "7b060e4d24394b5431875e2f74fec8e6bffa79d2e6b4cb8c7e2a5187dd2d8d69", + "name": "z3-solver", + "version": "4.15.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "3d76d4fbc95f0851191147db12300938c67a6f8fb1df884886d9601272ccc4e8", + "name": "zipp", + "version": "4.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "d3de2651e4e908dbb7c9d80508e5179590217dfac4993dc8b04381c5b9718c4c", + "name": "zstandard", + "version": "0.25.0" + } + ], + "executable": "", + "installed_provider_sources": { + "vllm/compilation/__init__.py": { + "path": "/vllm/compilation/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/backends.py": { + "path": "/vllm/compilation/backends.py", + "sha256": "fa4bff8920b363efbbde9456f135fa9d2c004a5bde1898877f177418b2d8b008" + }, + "vllm/compilation/base_static_graph.py": { + "path": "/vllm/compilation/base_static_graph.py", + "sha256": "5cfe8e06db84aa42cd41cdd93ebe93af00b3a242c8011042057530e2922b523a" + }, + "vllm/compilation/breakable_cudagraph.py": { + "path": "/vllm/compilation/breakable_cudagraph.py", + "sha256": "3cc427612a08e2b9b3fee47548026400c1d0776e2d4747535e59ef5512bdf1e8" + }, + "vllm/compilation/caching.py": { + "path": "/vllm/compilation/caching.py", + "sha256": "71d212452dde742fbf28b8a01ed29d3c08a7457ff7f8da2a20ce9d17e902c2cf" + }, + "vllm/compilation/codegen.py": { + "path": "/vllm/compilation/codegen.py", + "sha256": "e04833bec88cf9d1a13aa7341e30e3233d1138bfe23424e0fd34d664b3fedb9f" + }, + "vllm/compilation/compiler_interface.py": { + "path": "/vllm/compilation/compiler_interface.py", + "sha256": "8d84e2864bf83f754bae9e9f77119e0287cca9f97f5fa5ec2535e07b5ad88944" + }, + "vllm/compilation/counter.py": { + "path": "/vllm/compilation/counter.py", + "sha256": "d8158c54dd36a357bf24f6f84dc22f572d3a27f4875f3d5779b12bc5d454ff76" + }, + "vllm/compilation/cuda_graph.py": { + "path": "/vllm/compilation/cuda_graph.py", + "sha256": "05c86392d7fae967ac73076dba7e01990a0e3ae619e4866450a0c1be56bd1192" + }, + "vllm/compilation/decorators.py": { + "path": "/vllm/compilation/decorators.py", + "sha256": "cab6962e8a1fead59c75f5ed8cb4732f9e5441ff972030c2f4b1c4ba0c58de3c" + }, + "vllm/compilation/monitor.py": { + "path": "/vllm/compilation/monitor.py", + "sha256": "43b24c5cb1bc4d32dc979f3222596905c7b3acc58415328a234402e6edc76abf" + }, + "vllm/compilation/partition_rules.py": { + "path": "/vllm/compilation/partition_rules.py", + "sha256": "857d2fb06dc871ea1d3717cd01fbd4e5205984100d98b7b72a2933d6ff1cfa4d" + }, + "vllm/compilation/passes/__init__.py": { + "path": "/vllm/compilation/passes/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/fusion/__init__.py": { + "path": "/vllm/compilation/passes/fusion/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/fusion/act_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/act_quant_fusion.py", + "sha256": "1fa9c3ca4fb424685b7053c3dda89dda16c98dc5645d85f0f28dca58429792b3" + }, + "vllm/compilation/passes/fusion/add_rms_fusion.py": { + "path": "/vllm/compilation/passes/fusion/add_rms_fusion.py", + "sha256": "e46998552628aa5cd5962fc39ea39ae824fd97e6aeba1d176e9cc7cade39837b" + }, + "vllm/compilation/passes/fusion/allreduce_rms_fusion.py": { + "path": "/vllm/compilation/passes/fusion/allreduce_rms_fusion.py", + "sha256": "0af193505880cec0f6ffa224c688bce3c9ddc318dccdf04a696b4e4b4506a963" + }, + "vllm/compilation/passes/fusion/attn_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/attn_quant_fusion.py", + "sha256": "ecc64e82be4481954c9cac6c23d7794846ab19486b570f2dda07ab5ad67c5a49" + }, + "vllm/compilation/passes/fusion/collective_fusion.py": { + "path": "/vllm/compilation/passes/fusion/collective_fusion.py", + "sha256": "1e2c8539d6960b45907fb3bf0482441ea7250e97c56ffdea1500514efa0b164d" + }, + "vllm/compilation/passes/fusion/matcher_utils.py": { + "path": "/vllm/compilation/passes/fusion/matcher_utils.py", + "sha256": "50ac5714ce1bb113520de769ea6234316acc470a8cdf2537a996ce9a9d54337d" + }, + "vllm/compilation/passes/fusion/mla_attn_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/mla_attn_quant_fusion.py", + "sha256": "a966fe7f58bf9228379f793f5fd851735a97f9639722766b2a20cb79a9e4baec" + }, + "vllm/compilation/passes/fusion/mla_rope_kvcache_cat_fusion.py": { + "path": "/vllm/compilation/passes/fusion/mla_rope_kvcache_cat_fusion.py", + "sha256": "1602cc28055ffa8d1123ddb1d256bf0bd12006fd06ea7e16a986c55746dbe0dc" + }, + "vllm/compilation/passes/fusion/qk_norm_rope_fusion.py": { + "path": "/vllm/compilation/passes/fusion/qk_norm_rope_fusion.py", + "sha256": "aebc7d1a5189b65ac665afcc169e7baebd53efe719c48e35e7c5babe85af0d39" + }, + "vllm/compilation/passes/fusion/qk_norm_rope_kvcache_fusion.py": { + "path": "/vllm/compilation/passes/fusion/qk_norm_rope_kvcache_fusion.py", + "sha256": "f0cfd0d83ec4acb09f9bf91d199b114e9d4995e3059c13eb23a6978ce7c07eb2" + }, + "vllm/compilation/passes/fusion/rms_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rms_quant_fusion.py", + "sha256": "4852aa44e0e2087043fdac271bda9b8d9bfe3201bb84ce3919b8ed454d8083c4" + }, + "vllm/compilation/passes/fusion/rocm_aiter_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rocm_aiter_fusion.py", + "sha256": "372e76c68c75209a085deec6dd22b3816be633613ca82f6f2925c1b3773d61a0" + }, + "vllm/compilation/passes/fusion/rope_kvcache_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rope_kvcache_fusion.py", + "sha256": "3a756e9049593537143b5a56ab9185a6bc83f57ed81d84226d7791a46a984b53" + }, + "vllm/compilation/passes/fusion/sequence_parallelism.py": { + "path": "/vllm/compilation/passes/fusion/sequence_parallelism.py", + "sha256": "3af7e420dcb35fff0bae0f8f599d0f1bda34445ebe194059892a434b2976d654" + }, + "vllm/compilation/passes/fx_utils.py": { + "path": "/vllm/compilation/passes/fx_utils.py", + "sha256": "730708213acf9d1b5f3176b433dfc197a5f3c81b5ce443f0923c526924833003" + }, + "vllm/compilation/passes/inductor_pass.py": { + "path": "/vllm/compilation/passes/inductor_pass.py", + "sha256": "1f380aacf7adabb8bf8b7d41c0a93473947f0716f7445bd910fd448f6c08e672" + }, + "vllm/compilation/passes/ir/__init__.py": { + "path": "/vllm/compilation/passes/ir/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/ir/clone_elimination.py": { + "path": "/vllm/compilation/passes/ir/clone_elimination.py", + "sha256": "5297078f5cddce081faba5215814275381d2083b32318fcfeb2bf9d69fedb7c7" + }, + "vllm/compilation/passes/ir/inplace_functionalization.py": { + "path": "/vllm/compilation/passes/ir/inplace_functionalization.py", + "sha256": "2dc4f22c6f05224828c2941479185b1452d4490f488b7f0bfd124334e7809fed" + }, + "vllm/compilation/passes/ir/lowering_pass.py": { + "path": "/vllm/compilation/passes/ir/lowering_pass.py", + "sha256": "d9c3d90f63138420f0e5489447b5996573fcfbbab939da2efccd00848492b172" + }, + "vllm/compilation/passes/ir/utils.py": { + "path": "/vllm/compilation/passes/ir/utils.py", + "sha256": "f59d33a6c7d0616cbeec1e9fb1d6c948881bf81fe124caeb906eac2e2197ea21" + }, + "vllm/compilation/passes/pass_manager.py": { + "path": "/vllm/compilation/passes/pass_manager.py", + "sha256": "486979a058aa2e20ebedcbb6e039f7a59f38d2efd2cda11219fae4067be0968d" + }, + "vllm/compilation/passes/utility/__init__.py": { + "path": "/vllm/compilation/passes/utility/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/utility/fix_functionalization.py": { + "path": "/vllm/compilation/passes/utility/fix_functionalization.py", + "sha256": "ad5b504a05ccee023869b0c8df70ec2fff9a4a80d25fd903e2b532f470e7203f" + }, + "vllm/compilation/passes/utility/noop_elimination.py": { + "path": "/vllm/compilation/passes/utility/noop_elimination.py", + "sha256": "8abf85d28c13f95059f2acbc0275b9b9ed2ad4990f7c5763bbe3067a4aa629ce" + }, + "vllm/compilation/passes/utility/post_cleanup.py": { + "path": "/vllm/compilation/passes/utility/post_cleanup.py", + "sha256": "1c38b14fc209165cbcf8ca763a17ac4e528b97f59b573e5d52df2cce7d758de3" + }, + "vllm/compilation/passes/utility/scatter_split_replace.py": { + "path": "/vllm/compilation/passes/utility/scatter_split_replace.py", + "sha256": "138402cc3097768a32e9e5b8d1a054b6176e494bddc8684e23ca2dc5fdc3fdda" + }, + "vllm/compilation/passes/utility/split_coalescing.py": { + "path": "/vllm/compilation/passes/utility/split_coalescing.py", + "sha256": "0b02acd9e1ad43d7b3e128b914e969b9580773f2818078846dfbf163a8bd0871" + }, + "vllm/compilation/passes/vllm_inductor_pass.py": { + "path": "/vllm/compilation/passes/vllm_inductor_pass.py", + "sha256": "4f83ffb67f834a214221d810c7843a8e41eb4e5930eb40adbd8cf054ff6fb9c6" + }, + "vllm/compilation/piecewise_backend.py": { + "path": "/vllm/compilation/piecewise_backend.py", + "sha256": "6525318ff3ca2e4978e24dd9232a7ae0a02e920e19604b83db6f6043d1f8a54d" + }, + "vllm/compilation/wrapper.py": { + "path": "/vllm/compilation/wrapper.py", + "sha256": "c1b1fca679ea16aa07a696831a810c0d531da2bb0ea32dd6f1a95cdaef36de07" + }, + "vllm/config/__init__.py": { + "path": "/vllm/config/__init__.py", + "sha256": "56fb0cb1598d297e4f95a97e5d86dc624145d1532f5faa432b7d2834d7155bd5" + }, + "vllm/config/attention.py": { + "path": "/vllm/config/attention.py", + "sha256": "c41f345b512d9b7df882328257eb3a6381f41088c11ae83b5ecd8a9e8265d1bc" + }, + "vllm/config/cache.py": { + "path": "/vllm/config/cache.py", + "sha256": "f1c226ba679c884930dbfcaf41a57248b137a9a20d3ed8e3d3b31752bb484c07" + }, + "vllm/config/compilation.py": { + "path": "/vllm/config/compilation.py", + "sha256": "c9cec5c7200e8e559810ec8c30113ad61dab6780f9f7fb3c116bd0d9b5a43065" + }, + "vllm/config/device.py": { + "path": "/vllm/config/device.py", + "sha256": "7b82eee02ceb5842337451a27a3d5729920c47e25e8f6bf3997f5146f9330a9c" + }, + "vllm/config/diffusion.py": { + "path": "/vllm/config/diffusion.py", + "sha256": "1fa9fd2478a866098a28a3586b55af2f9738656b7813a55d76539c10dd99fe8d" + }, + "vllm/config/ec_manager_config.py": { + "path": "/vllm/config/ec_manager_config.py", + "sha256": "418b387dbe7bdf67deddce331c205768a2d42aea37141f59fb02a8a1528e3552" + }, + "vllm/config/ec_transfer.py": { + "path": "/vllm/config/ec_transfer.py", + "sha256": "0eabb2c25194676d23c6acf59562672a1dd24415043ac5737d621ce0d681ec70" + }, + "vllm/config/engram.py": { + "path": "/vllm/config/engram.py", + "sha256": "34043a22385a041d4e9be8857f64174c990c2ca8308b97b6a952b5ab96c20ee5" + }, + "vllm/config/fault_tolerance.py": { + "path": "/vllm/config/fault_tolerance.py", + "sha256": "b166b24373d599fb15ddc575e3061cf0dcb42174d0369d8468008e7ffbb2a4e2" + }, + "vllm/config/kernel.py": { + "path": "/vllm/config/kernel.py", + "sha256": "27e23c584cf862f4091858db6dc85bbc2a01f4baf9dca3f232ae6f3bac02390e" + }, + "vllm/config/kv_events.py": { + "path": "/vllm/config/kv_events.py", + "sha256": "b1dbaee3e6830e381e9157fe3bab0d65c357da88ff7cdf8b1e4b3a4e75c82a87" + }, + "vllm/config/kv_transfer.py": { + "path": "/vllm/config/kv_transfer.py", + "sha256": "506fae7a9d7f32cb3646156cf9249a856f6317dff6c4c85db70efd34418c429b" + }, + "vllm/config/load.py": { + "path": "/vllm/config/load.py", + "sha256": "bd6431c22e078362d749a56a2c84145432ebf2605d8bcfa2ac679182d18ed630" + }, + "vllm/config/lora.py": { + "path": "/vllm/config/lora.py", + "sha256": "ed6cf6575f5950f079a62f904caeae93d1a4745dd8c21788b74367883bcd4b08" + }, + "vllm/config/mamba.py": { + "path": "/vllm/config/mamba.py", + "sha256": "2090f791201ca45dd4f1d72b8651268890eb07574b6084721194eb8fdf612c48" + }, + "vllm/config/model.py": { + "path": "/vllm/config/model.py", + "sha256": "f4168b67cc93ce72ff2a6d4c66974223e32fd0f1fab4c05e44bd68a275e18d69" + }, + "vllm/config/model_arch.py": { + "path": "/vllm/config/model_arch.py", + "sha256": "2babe28329d7b60b4e205f6d72c687f0f66e6535aa2f20411469e5ec362f6b5f" + }, + "vllm/config/multimodal.py": { + "path": "/vllm/config/multimodal.py", + "sha256": "271911aee151f17f092228cecee82af0713e9a47340ffdf66834ca7638a50d22" + }, + "vllm/config/observability.py": { + "path": "/vllm/config/observability.py", + "sha256": "d57c59ec776477ab0a20e9f2b945bc954d8ea3737c869259480e9aa10dfb9f6d" + }, + "vllm/config/offload.py": { + "path": "/vllm/config/offload.py", + "sha256": "6f2db3d9a2730588473d5155811690c6241b167a21dcb62fbbd9ebb6386de42c" + }, + "vllm/config/parallel.py": { + "path": "/vllm/config/parallel.py", + "sha256": "f012ace89e3fb730a467f729f602679bc145c49f0d10721811c9d818570e7b2b" + }, + "vllm/config/pooler.py": { + "path": "/vllm/config/pooler.py", + "sha256": "9f01913dcb7bccbf9b672b16643f18471ae202455992e8afaf0725a17f2b3d08" + }, + "vllm/config/profiler.py": { + "path": "/vllm/config/profiler.py", + "sha256": "04d24fa1dc7cfedca6b5c7d9115f7f7021722fc46a5b15234a1e3b3a506c93e5" + }, + "vllm/config/quantization.py": { + "path": "/vllm/config/quantization.py", + "sha256": "acffc52f525b39a88efd656f1ed705ce3a1b758298bb0684fac7694776bc10b4" + }, + "vllm/config/reasoning.py": { + "path": "/vllm/config/reasoning.py", + "sha256": "2c4f7bdee48a9fb3d93787c4c32361c2411417cce452cfde86808d8759977861" + }, + "vllm/config/scheduler.py": { + "path": "/vllm/config/scheduler.py", + "sha256": "822179da62be4bca0619c8590082ae09123f5c4415f9cc2037be673748239edb" + }, + "vllm/config/speculative.py": { + "path": "/vllm/config/speculative.py", + "sha256": "9c642a87264339c0dbc1d0b57330572149df0f9d5e16c6893b9895e50a619e19" + }, + "vllm/config/speech_to_text.py": { + "path": "/vllm/config/speech_to_text.py", + "sha256": "bf4a566fbde6a1cec1e209070b739650c3302c12696739c88049cb8f723a4c3f" + }, + "vllm/config/structured_outputs.py": { + "path": "/vllm/config/structured_outputs.py", + "sha256": "55649776594349b8b4aa3e08fc4c88068366732a486d6fb235079188044aa829" + }, + "vllm/config/utils.py": { + "path": "/vllm/config/utils.py", + "sha256": "d035e9e488ba92b6c47a96cf05d9b2a850d53eda8a05115b22ff9af8dbc2fc64" + }, + "vllm/config/vllm.py": { + "path": "/vllm/config/vllm.py", + "sha256": "956b812e5a719bcbfa3a3958801361b38b9c928c96b8c073311bbb96376dfb7a" + }, + "vllm/config/watermarking.py": { + "path": "/vllm/config/watermarking.py", + "sha256": "30e6620a3cd7529f0736ad55e38bc326a6a78dee4552f0722208400041c94a1f" + }, + "vllm/config/weight_transfer.py": { + "path": "/vllm/config/weight_transfer.py", + "sha256": "92edd9e5ea90c97a8f3c5f20abf1734a105ee1f3f89e306e7ba87e758f1f767e" + }, + "vllm/distributed/__init__.py": { + "path": "/vllm/distributed/__init__.py", + "sha256": "97f28c30b32662af8cab163939e4ee423037f11630752e13b55cbc25a7d0ab71" + }, + "vllm/distributed/communication_op.py": { + "path": "/vllm/distributed/communication_op.py", + "sha256": "3c3f8ac60db38ece891d39dc1e2f6f1947ad438685893d2e5777d072320bd1b8" + }, + "vllm/distributed/device_communicators/__init__.py": { + "path": "/vllm/distributed/device_communicators/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/device_communicators/aiter_custom_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/aiter_custom_all_reduce.py", + "sha256": "f8eb027ce7a85d94af6260960ceb7f36fc6f1406c9af9c9b6285fddb3f178009" + }, + "vllm/distributed/device_communicators/all2all.py": { + "path": "/vllm/distributed/device_communicators/all2all.py", + "sha256": "1f1b69236acd3cd7bd94520fd6d591bfd31b57c4bc7c9f9f4161ea8bbd0c5f26" + }, + "vllm/distributed/device_communicators/all_reduce_utils.py": { + "path": "/vllm/distributed/device_communicators/all_reduce_utils.py", + "sha256": "ed0ab4dd05b2519a6313892e68824c97b540034664d7f8c3d031b322e33e1bfc" + }, + "vllm/distributed/device_communicators/base_device_communicator.py": { + "path": "/vllm/distributed/device_communicators/base_device_communicator.py", + "sha256": "4a7670f12ed7c7621b25d476e2687c24ca01f3be183fff4a6a25337596fe506b" + }, + "vllm/distributed/device_communicators/cpu_communicator.py": { + "path": "/vllm/distributed/device_communicators/cpu_communicator.py", + "sha256": "e1856c8e91cfbbb4d9ce990c1236e258ba4021e226afcbab645653380b38d64b" + }, + "vllm/distributed/device_communicators/cuda_communicator.py": { + "path": "/vllm/distributed/device_communicators/cuda_communicator.py", + "sha256": "102d95c67ec798cf352b817ba92e8abc9da37f30d1bbdf3aab45d3927b627b93" + }, + "vllm/distributed/device_communicators/cuda_wrapper.py": { + "path": "/vllm/distributed/device_communicators/cuda_wrapper.py", + "sha256": "333b6d9ed173e7a18c7f2b6627a3c9c9ed88892ce52015f05e29d6d245e48ee3" + }, + "vllm/distributed/device_communicators/custom_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/custom_all_reduce.py", + "sha256": "a048c1327c23580805600c0c951831bec333b1ffc4eb26a0e3d34119c4f0c445" + }, + "vllm/distributed/device_communicators/flashinfer_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/flashinfer_all_reduce.py", + "sha256": "b4359760e9b55963676109a5c3a015fb82e190d4df1d021de9ee01e7814cbdda" + }, + "vllm/distributed/device_communicators/flashinfer_pcie_ipc_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/flashinfer_pcie_ipc_all_reduce.py", + "sha256": "8b67b0fc356a565095f56b475cc89c513e3a5eff051ab1c52e5beb0c1a79e9f2" + }, + "vllm/distributed/device_communicators/mnnvl_compat.py": { + "path": "/vllm/distributed/device_communicators/mnnvl_compat.py", + "sha256": "72ee1e6f9571b4c8ecbd9f60cd469d1b565cb79cab519a688a93f290906a2615" + }, + "vllm/distributed/device_communicators/pynccl.py": { + "path": "/vllm/distributed/device_communicators/pynccl.py", + "sha256": "882fb83c5a3c565a3f8fd664b79f5ceae566dca180019ecafd74bc8c11d9f8cf" + }, + "vllm/distributed/device_communicators/pynccl_allocator.py": { + "path": "/vllm/distributed/device_communicators/pynccl_allocator.py", + "sha256": "390e2576cbf4ae06341ca4dab24fc7e4d4f7c24dd444329ed05d828a9ce91460" + }, + "vllm/distributed/device_communicators/pynccl_wrapper.py": { + "path": "/vllm/distributed/device_communicators/pynccl_wrapper.py", + "sha256": "ce63c8da57bb88d4cf89956bd70bb63f0f44bfad468ddb37b765611551f6d99f" + }, + "vllm/distributed/device_communicators/quick_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/quick_all_reduce.py", + "sha256": "8aacb23e7c297b0ae2f80d99c5affd2e7517115d7874be51069d14a44db7b5f2" + }, + "vllm/distributed/device_communicators/ray_communicator.py": { + "path": "/vllm/distributed/device_communicators/ray_communicator.py", + "sha256": "332c37f65495b60564d61db59bc2d30ca0236adc33442d01464790bde9aec897" + }, + "vllm/distributed/device_communicators/shm_broadcast.py": { + "path": "/vllm/distributed/device_communicators/shm_broadcast.py", + "sha256": "f3e7a3f3ff713fccbd535e0d41650ee05bdf8677e83d4b90519910645022c30b" + }, + "vllm/distributed/device_communicators/shm_object_storage.py": { + "path": "/vllm/distributed/device_communicators/shm_object_storage.py", + "sha256": "e097bf7ac0141fe8db4131e8fd553ca2ad5b0600b22a56f3924af6b795e7207c" + }, + "vllm/distributed/device_communicators/symm_mem.py": { + "path": "/vllm/distributed/device_communicators/symm_mem.py", + "sha256": "b06e3ddb9ae880a30ec4a103ce32eb9794223bb0293832e89572af28adaaa544" + }, + "vllm/distributed/device_communicators/xpu_communicator.py": { + "path": "/vllm/distributed/device_communicators/xpu_communicator.py", + "sha256": "527cbfb250760abc62096ee7cd612307b821f21b72dee1687ad866620ec89b6d" + }, + "vllm/distributed/ec_transfer/__init__.py": { + "path": "/vllm/distributed/ec_transfer/__init__.py", + "sha256": "061405bb51df7409c9938b62e25caa8bd6ebf85da6d1700dbd4affe2a0825135" + }, + "vllm/distributed/ec_transfer/ec_connector/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/base.py", + "sha256": "22d4913375bb622473fbe1a77f9376b804949cd8a7e31e9518208f9561d161e2" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/common.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/common.py", + "sha256": "e2267abd8d00a6d2605e1a82ea5c73396a71b427452eab469fcca0134c334e7c" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/connector.py", + "sha256": "72cd35d9fd754a2992dd090a8af13c91e0789b4038ac29276750d823120235db" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/base.py", + "sha256": "19e8df88b0fa831997896355ecdd49e0d86cb074cd7ae28aed0b328b0bb3ab2e" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/zmq.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/zmq.py", + "sha256": "435641c0e37551ab4937855abd067be26905b91215e759cbd9d28a419a34ff9a" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/base.py", + "sha256": "3be698aeb67d32ee3741e76b2fb71806941c587578583acf8fbc42fbf22b46a5" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/nixl.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/nixl.py", + "sha256": "03af8f6549a6027b7262a482907af591e45f28b9b1c5a3408bbc6600e38797e5" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/ec_shared_region.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/ec_shared_region.py", + "sha256": "e40607952c9920024455eca2f419e8c3ef1de9a4d8b27c147a33bb941b8c08b1" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/protocol.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/protocol.py", + "sha256": "05878336884396bfbef77b96b0fa6359f6fa0aba912961f14a84f5a436f27038" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/__init__.py", + "sha256": "01c42385bf3a55cff09cc05ba956f6dd4b8b6b986bf4d6eca4e566cb045b48e0" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/embedding_cache.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/embedding_cache.py", + "sha256": "7359fb980af1fc30b3253681310ef636e2b4a19134e04a93270c9c45de2572d8" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/session.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/session.py", + "sha256": "5973548a919e13c866222b91d502686a6757a31e5a5664b879bf2887ed9fb212" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/utils.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/utils.py", + "sha256": "160ac665f20f2c75b343c1e784084f2b0b4d1cf8fdb28ee15deee4dc8ed0ce45" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/worker/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/worker/__init__.py", + "sha256": "f08d296d3560c42173ae8af961af4a768033ccf1e36e9c17c0cdd53013d0c52e" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/worker/descriptor_buffers.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/worker/descriptor_buffers.py", + "sha256": "be7c81be214e995da8499105ba485854d9c19d6f8e905f8f1b87b83694ca0864" + }, + "vllm/distributed/ec_transfer/ec_connector/example_connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/example_connector.py", + "sha256": "09022ce07a89114bb65d9befd2e60873453aed11bbac8c0a75c1e6084e785a5f" + }, + "vllm/distributed/ec_transfer/ec_connector/factory.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/factory.py", + "sha256": "d6cedca0a99c3dd2b03cd1c15d17472b983e3f7d8f5baf4a12eecaf6abedb817" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/__init__.py", + "sha256": "1cbfc2f95f8f4d48a9253056eb1fd4b562062884e3fd5cb6571583c352fc16f3" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/config.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/config.py", + "sha256": "98c60696f79d1de67d2364cd9e8a42a393b5c8e17ed9af2f971368e47891d7b3" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/control.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/control.py", + "sha256": "58e0d1a423fbe958bfa586ac26a17107e08d0b31d044b4c74ab4dde880e7ca9b" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/memory.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/memory.py", + "sha256": "d5e90b1348de670a70f110d58eedcbdbd053db72c21dd007c3f5275c53951149" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/metadata.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/metadata.py", + "sha256": "497a7e6dfffb7fce80a41d5989f96119b970c143df77bb9d0f9c91d7a46e8c42" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/producer.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/producer.py", + "sha256": "97fa4d0b19475574778eab02f55fad73db9642beb9156da890314fd53fa1a7ab" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/reservation.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/reservation.py", + "sha256": "4790bc65cde4db5f17733ca2c2910980ba594a8a9b79ee27c5b957dffd4c1113" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/scheduler.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/scheduler.py", + "sha256": "53004b62529a31fdd80dfb2e6026610b95041a77e91f731ae526fefd84e7968d" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/state.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/state.py", + "sha256": "92f375d6c5cc9c83dbe95a7977ad8eb0f1b5629ccee92968bcacdc94eee15d65" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/transfer.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/transfer.py", + "sha256": "ada2113a5402054f1149d3edc2537f4e5e1bd696c9b17291c9f2b4cbf6b59753" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/worker.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/worker.py", + "sha256": "89eb91bb64845b3b121d502972a6b04d448714253becd2ea662e5691cd5acdd7" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake_ec_connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake_ec_connector.py", + "sha256": "aaebab4711bc00dd0c622dfbfd8639fc41e7ed5d1658d7d68fe33e4d5fbef3ba" + }, + "vllm/distributed/ec_transfer/ec_connector/utils.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/utils.py", + "sha256": "11b9014b9c0697f8846deff1a55a22fa86a15dc2ac3e139442fb6d513ac03059" + }, + "vllm/distributed/ec_transfer/ec_transfer_state.py": { + "path": "/vllm/distributed/ec_transfer/ec_transfer_state.py", + "sha256": "9487a41f23fa1a4fa6dfca8b42b8e97a0ee19d8406ffd1dcf4bef66315180827" + }, + "vllm/distributed/elastic_ep/__init__.py": { + "path": "/vllm/distributed/elastic_ep/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/elastic_ep/elastic_execute.py": { + "path": "/vllm/distributed/elastic_ep/elastic_execute.py", + "sha256": "b8f60a4183c79ff6051095b5f95bb385bc7fea0cffe8cd9ebc9087ab0e9f01b5" + }, + "vllm/distributed/elastic_ep/elastic_state.py": { + "path": "/vllm/distributed/elastic_ep/elastic_state.py", + "sha256": "fbf049199841a086fdf2fc1ab8498ef017ad3bf319db65c3ae61acbb536d2e10" + }, + "vllm/distributed/elastic_ep/standby_state.py": { + "path": "/vllm/distributed/elastic_ep/standby_state.py", + "sha256": "15282597550ebd0e07b8492ff192aea1ec0dcec8f0ad34009123e1002cc140c1" + }, + "vllm/distributed/eplb/__init__.py": { + "path": "/vllm/distributed/eplb/__init__.py", + "sha256": "1b9c2ee22abb5888c354c5aa01f0944f253e5e24e135d019778398bbe495a628" + }, + "vllm/distributed/eplb/async_worker.py": { + "path": "/vllm/distributed/eplb/async_worker.py", + "sha256": "424328600ad1003286fc5dfffa1f9482007314c060947818b2f94a8b97811f5e" + }, + "vllm/distributed/eplb/eplb_communicator.py": { + "path": "/vllm/distributed/eplb/eplb_communicator.py", + "sha256": "ba30d9d40e7b81d3f42aa9041d2f328edca4073cfe2de920285eb68375501ed8" + }, + "vllm/distributed/eplb/eplb_state.py": { + "path": "/vllm/distributed/eplb/eplb_state.py", + "sha256": "2f06bc8c63f3fdf55edb5032ae55c0ffcac3e67720ce74ea312e3d141b12acf4" + }, + "vllm/distributed/eplb/eplb_utils.py": { + "path": "/vllm/distributed/eplb/eplb_utils.py", + "sha256": "058af6104faa6d4085c1dca80bbe60d92bf0a7ec9cd92c775a180546c9d8c9c3" + }, + "vllm/distributed/eplb/policy/__init__.py": { + "path": "/vllm/distributed/eplb/policy/__init__.py", + "sha256": "daeb266c88442832b1ab8c8c4cc064891b38b9e9ba00aea324f926c87dc6d37e" + }, + "vllm/distributed/eplb/policy/abstract.py": { + "path": "/vllm/distributed/eplb/policy/abstract.py", + "sha256": "b9fd34c28bbfdded03360d7f3f6f8fb978e82689190d7ae4501dfe520e958c62" + }, + "vllm/distributed/eplb/policy/default.py": { + "path": "/vllm/distributed/eplb/policy/default.py", + "sha256": "3b54229e6240d050480390f6b29d4744fd38437d23719f78a6decf7002296a29" + }, + "vllm/distributed/eplb/rebalance_execute.py": { + "path": "/vllm/distributed/eplb/rebalance_execute.py", + "sha256": "b387e228791149018536eee96cf955b33ba79d801cdc36849d1b47a580ec2597" + }, + "vllm/distributed/kv_events.py": { + "path": "/vllm/distributed/kv_events.py", + "sha256": "de08f01e8736881560256c350a3b6418999dd4aa30f9c6ec9159527f7ed6899a" + }, + "vllm/distributed/kv_transfer/__init__.py": { + "path": "/vllm/distributed/kv_transfer/__init__.py", + "sha256": "c1be4e58ec6923bae607a355ad22891c740f056a69ff7358b1e10ea3fd2680ea" + }, + "vllm/distributed/kv_transfer/kv_connector/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/base.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/base.py", + "sha256": "2ae2a2c48f5731f3533166a75440fe91e764332305b5d713df840edba970789d" + }, + "vllm/distributed/kv_transfer/kv_connector/factory.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/factory.py", + "sha256": "add99c93c587b0098b90b1f8fd6940bdd1f15c236c5c6f1a258411863cb902d3" + }, + "vllm/distributed/kv_transfer/kv_connector/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/utils.py", + "sha256": "317ed40dc837671ca6e666165222e641a0f9b3992aea63bbf54de7e13d40b3a4" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/__init__.py", + "sha256": "5beb6ccad12fdcfe1581982da6f18321caca50e73a6b3259ebf3c8dc8b3ffcca" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/base.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/base.py", + "sha256": "97af64220475c6c9e8273438d7b5138b105ebe6944beb783facb36a3bb76f31b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/decode_bench_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/decode_bench_connector.py", + "sha256": "b4151c88cdec28f1ff9259047abc17baf23b892f4b68769a93bf26e0442b9017" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/example_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/example_connector.py", + "sha256": "6226876ef52d10d0d284d29c337ab44698e8bac6abdb2e0ece53b5756c55d068" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/example_hidden_states_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/example_hidden_states_connector.py", + "sha256": "58c22534dcad0fb73599a2d70a2fb104d5b612a4723be5e777f56a56fe07892c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/flexkv_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/flexkv_connector.py", + "sha256": "de4f68c3bd565ed898e47e0b2980049b966ff31888f1957050d30995d4953762" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_client.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_client.py", + "sha256": "bea6ecff2be281c7e96c1551c7bf463cbb01f2964696067c0ebdb683844f9aab" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_connector.py", + "sha256": "e67ed58015090e5eea9d499883f2a9422673d07f8bdbe0ccff7db15d2460de13" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_metadata_server.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_metadata_server.py", + "sha256": "6800e5cf37809f8a8e28c469c14a434db288bc3bf83a8b62ee06910a20c2da19" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/common.py", + "sha256": "8f2c02c08227a9093e6aeb183961aba36b7812cfc29b8c047a2b2c9d82f79c15" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/gather_scatter_helper.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/gather_scatter_helper.py", + "sha256": "08c1b43de34fbeca77357d7576ac1d17cba974b59d695562f68bb713061e7b54" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/hf3fs_mock_client.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/hf3fs_mock_client.py", + "sha256": "bec61a9b0c4b9124b2292d7646d76411da44396389349b53cdcbc46353c8780e" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/connector.py", + "sha256": "8c61094ce0a3a702908f9576f69482e6bf314738a2cbe33a7d3b47258fa0ab43" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/stats.py", + "sha256": "d9383a6ad6ab6b8f812d29d90495407b770eeddb79b86e9d0e3216c0bd16e0ed" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/worker.py", + "sha256": "251c0d8e57e4739c03ce3e1c899a95ff5b1752eb27676c28ab88c4ebd62c4776" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_connector.py", + "sha256": "5991f9ff8832df32bd421eb67e48237270ea0a408180e523810bb43606acf8f3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/__init__.py", + "sha256": "c53be9796e76cde637514bfc40a525d8c09bb2784b406cb516790d8285dfe433" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/multi_process_adapter.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/multi_process_adapter.py", + "sha256": "6480d67b31ed603027a83edf327880a38aee45eaeee2da9a4efa93e95527c166" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/utils.py", + "sha256": "e204fa6a853ac9c122d7a4e9d146902230f81c48d4321ed5edfdbf979dd49ba2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/vllm_v1_adapter.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/vllm_v1_adapter.py", + "sha256": "e6fe55049c6b007248516d69640e2f3a4809f9d286091a1014ae0949987fa8f1" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py", + "sha256": "c712c386a7c57bf0355a1441ba574232c3aa5498fcb70713a2b3f5d18b64f9c1" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/metrics.py", + "sha256": "de1b1797d0448f74370919dbb0278767f390e8f59e00a0c0528abefb302babc2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_connector.py", + "sha256": "516be01320e64b0110e102eeb69a6ba766dd5ac8cb3036db6b97b7d54413323d" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_utils.py", + "sha256": "26877610463fa8e9d6b092772f2551bcc0c3ac794cbe63996df0414666a8ebba" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/rdma_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/rdma_utils.py", + "sha256": "716e5042edecaba36c7ca763474988f32fa09c2668b8260260149df610af8f83" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/stats.py", + "sha256": "f39b2f0b1db2e4f922e27e684a3f7bbf5bb279b82a0a8c3bb0c7ae69b6d14d24" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/connector.py", + "sha256": "17a350bdb89e17e415d6c52a48684dc15c35a804378daf03e1f3bee1b1b123a3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/coordinator.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/coordinator.py", + "sha256": "a8eb6c2157a96e8d25233b82347ac8409a41d6390b4f2c64242119c05911010c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/data.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/data.py", + "sha256": "d3cfefdb4165a24995749cba452641b318065baa95bb1bae62f922a2f8886e7b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/metrics.py", + "sha256": "f2b9ef8927632d142aad11a374d0725c6e619ea0bb7fea9eda3f3895eb7d277a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/protocol.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/protocol.py", + "sha256": "ccb1cf6a84a932a375215627d2aaac482c351a05df015d636d05373a6845b7c8" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/scheduler.py", + "sha256": "283849ff581ec206444cdf5621622377f1c925e8d7e05cb9294af2f3a5094e79" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/worker.py", + "sha256": "55f1682dfd1ed7af689166421337126a0e1d08afa4774a242e098d79e0c1e95b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_common.py", + "sha256": "549bb4fe22dca5095515b9c0712c31cc81a9d4923881e9f112317640fd8c04ab" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_connector.py", + "sha256": "c0f474bc34b579d889fae92eaf43eaca241be51a4697a187a942f0df4e6b6a98" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_engine.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_engine.py", + "sha256": "d842f3772fc6588d5a329a67572324cb74709aa3df4033e64c791a1e706c8e88" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_layout.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_layout.py", + "sha256": "2b4ec046a78897236b0626939bb828b6ec095355097d10bca39e5f3e1c992553" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/multi_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/multi_connector.py", + "sha256": "12d8387239f3194f2cb63ccbd64824648047210323572d66671e6a1eed349fc3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/__init__.py", + "sha256": "cc3145fe3b6d219a267bf40a0f7c0cc9430e4289f94acab2df761b99b671e7ba" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py", + "sha256": "7a1db8c54e4cd846bdac747344f2aea2c2fcf507817928796063225223b7e169" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_worker.py", + "sha256": "49a2e4faf99bef146b5a1d4d18d48f240b1e561c438252274494b359db96ef52" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/connector.py", + "sha256": "b6a0dc916d052f344be72ecfcb111509c13580102c11a860fa726cf0888949a9" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/metadata.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/metadata.py", + "sha256": "2b23a07c1ec5ac5490c3b818737c7192e344ea9f52cd5623f75939f741ab4e21" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_scheduler.py", + "sha256": "ac3daf8e2246581fec84ab28f2133569421b62c32a120be4923e2f4d0f2f9de9" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_worker.py", + "sha256": "e5060c9b6cf022de35ca3d1da7a369cd6a6a2dea26219af9f7633aaf78af8a76" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_scheduler.py", + "sha256": "2d9008e33937a4d6c5cf9cc2f96160f2bdbc8e987fe37f0798a7fd7eb84c9572" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_worker.py", + "sha256": "87de3ea383dd3aa95fb2c287ea26ded8a330859cc1295f9faa69047e80865c2c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/scheduler.py", + "sha256": "09f1bfe7075b926b26a94529480e33b62c3ac273ff826f6c502084f08b1b2a08" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/stats.py", + "sha256": "3e710654e0b68d1a8592f0c4735c81b22f4bf698fb1a2dfea126d35bf2dd1ef2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/tp_mapping.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/tp_mapping.py", + "sha256": "2d43607f98701b2fad6cc0ac2767619a80b7fc2b3a3c2eb6ed0da4fb05dcd8f6" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/utils.py", + "sha256": "93de863fc8307a61d40b62f1b176b57ae93c363d34b9e9ddc8e666265b6d45dc" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/worker.py", + "sha256": "5134a36ac100ce7a64f5311029a37ac12c38d91093f63100f51f7fe53ea7c3ee" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/canonical_mapping.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/canonical_mapping.py", + "sha256": "e0b3c6f9806a650e0370c43c5068fc31c0fec94615089e15fdf270d7d96f2b64" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/common.py", + "sha256": "9b3f042c6fa1581d10e8f688d2d9bc927bb41b780a9ea01f514d57228e20c978" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/config.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/config.py", + "sha256": "aea82e60889e78dcad8564ec8285b65a6a372824a1545a98ea8e78b6f4fd418a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/events.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/events.py", + "sha256": "d7039b67be95fd444966628184040a94880873c0611c0e6e7525a22650ffdefb" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/metrics.py", + "sha256": "13d76df014e86691f58dc89a879f9808b124690c9267dd5fa3b2d4004d4c5fdf" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py", + "sha256": "2c5282f4a3165cd787fb355e215e3869f1bdd3f2c795b2155fc537c9d135191a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/worker.py", + "sha256": "acc2df53262441dfc6421a3af7f0cbd68cbfaedbd42bbc384d8e1da2d965d194" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading_connector.py", + "sha256": "cdc16ca7339a10e1993bd6220e6273f86a4e99779f58f25098a24ad31bb0dbd8" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/simple_cpu_offload_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/simple_cpu_offload_connector.py", + "sha256": "96238ca82ccf07a1eeb59b8f66de17b09034e3eb993ad9a0a836511d3f69706b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/ssm_conv_transfer_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/ssm_conv_transfer_utils.py", + "sha256": "59a949709482e65a007fbe5352fe9b4bb54c2dcc10ad2c1c41f754b6e13299f4" + }, + "vllm/distributed/kv_transfer/kv_transfer_state.py": { + "path": "/vllm/distributed/kv_transfer/kv_transfer_state.py", + "sha256": "2e5fe09438d6e2ee642f8a26cf7dcf632e870d955d30baf002b76a8bfe836d05" + }, + "vllm/distributed/nixl_utils.py": { + "path": "/vllm/distributed/nixl_utils.py", + "sha256": "0bffa3c052c9f67472b1c0bc3816114891b010c968bf4b8a292e7da4d687db53" + }, + "vllm/distributed/parallel_state.py": { + "path": "/vllm/distributed/parallel_state.py", + "sha256": "d9b10ad56833ebc08a753e1a050ef0989c30d4134021b7b7b00150b7bd01adc6" + }, + "vllm/distributed/stateless_coordinator.py": { + "path": "/vllm/distributed/stateless_coordinator.py", + "sha256": "f52848fbe985ed47b1f3e3ca555314736ca06436e8d738ab4390101f0672dcb0" + }, + "vllm/distributed/utils.py": { + "path": "/vllm/distributed/utils.py", + "sha256": "792146b357139e705064a68d3b66858de8a0baaca4dc7db1232fa217d45db231" + }, + "vllm/distributed/weight_transfer/__init__.py": { + "path": "/vllm/distributed/weight_transfer/__init__.py", + "sha256": "3fb9d4712b7c131d522f5e76e73cd8c333f3cc7af86e2d5ecf9b61b57b3b7f5a" + }, + "vllm/distributed/weight_transfer/base.py": { + "path": "/vllm/distributed/weight_transfer/base.py", + "sha256": "8ab06feb04f1379d0558fbdb77fde46bc84f179e0a26742cabab937e88caa38d" + }, + "vllm/distributed/weight_transfer/clients.py": { + "path": "/vllm/distributed/weight_transfer/clients.py", + "sha256": "ff85c79c350241e6d2749ca23c9d295a3289b4b62bfdf0257d32eb94a0151d36" + }, + "vllm/distributed/weight_transfer/factory.py": { + "path": "/vllm/distributed/weight_transfer/factory.py", + "sha256": "4e979eeac8c5bcdbffb10eb4765cfb30120fa7595c6c2561d3fa1a966ced61c8" + }, + "vllm/distributed/weight_transfer/ipc_engine.py": { + "path": "/vllm/distributed/weight_transfer/ipc_engine.py", + "sha256": "1af578293f387a19073c322b24143c3ae4716ce0c5d2bac2a4ef26fe20119330" + }, + "vllm/distributed/weight_transfer/nccl_common.py": { + "path": "/vllm/distributed/weight_transfer/nccl_common.py", + "sha256": "7b2ef7dc7481c3f478f17c49aa36c7bed54142ec5c93d36ed8426c8fdf09e500" + }, + "vllm/distributed/weight_transfer/nccl_engine.py": { + "path": "/vllm/distributed/weight_transfer/nccl_engine.py", + "sha256": "7fd020c919dc7b4723fb78e64da977b180d0fef0cd21df955a037b848dbaa008" + }, + "vllm/distributed/weight_transfer/packed_tensor.py": { + "path": "/vllm/distributed/weight_transfer/packed_tensor.py", + "sha256": "d0a27fb0be1dc029bd5a1d44fdb57a5e54aa4cd74308bedc339e86ac02c7494c" + }, + "vllm/distributed/weight_transfer/sharded_rdt_common.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_common.py", + "sha256": "be0b13801f24e7b62999b19d733c030510353603a2d5320d5dc98ee02daf22a2" + }, + "vllm/distributed/weight_transfer/sharded_rdt_engine.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_engine.py", + "sha256": "2f791970b4815511a7578ef6c957e7da97b071d26a39087a09a17475909791ee" + }, + "vllm/distributed/weight_transfer/sharded_rdt_fake.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_fake.py", + "sha256": "ee11164e17b5f2793252ce77741b8b94e0583046abf896a590131b2008d1fbb9" + }, + "vllm/distributed/weight_transfer/sharded_rdt_trainer.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_trainer.py", + "sha256": "dd413ff461d41826ccd3eb87d3df22f6cd7f24e09aac7644e3e5b40d7beec484" + }, + "vllm/distributed/weight_transfer/sparse_nccl_engine.py": { + "path": "/vllm/distributed/weight_transfer/sparse_nccl_engine.py", + "sha256": "e11b409454dda2b05ea34e8115ac19027c5e65cb2a5e9682c494f16a50e978f4" + }, + "vllm/model_executor/determinism/__init__.py": { + "path": "/vllm/model_executor/determinism/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/determinism/batch_invariant.py": { + "path": "/vllm/model_executor/determinism/batch_invariant.py", + "sha256": "af8f8d256a48fc214edf426fbe891fb15bd8b1d7ae98b811c736ff1eb0fae798" + }, + "vllm/model_executor/determinism/batch_invariant_configs.py": { + "path": "/vllm/model_executor/determinism/batch_invariant_configs.py", + "sha256": "72ea0d4df0ab5ae288abb7df5c203d2ad5f1709c7295d87ec72da775fddc1b7a" + }, + "vllm/model_executor/layers/fused_moe/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/__init__.py", + "sha256": "64a32665be6d5afcfbaf7a0915717267278b66b880b908b0263ea58f08e51b5e" + }, + "vllm/model_executor/layers/fused_moe/activation.py": { + "path": "/vllm/model_executor/layers/fused_moe/activation.py", + "sha256": "78dec0e85e0c040304515f64ccf8f2c6a7a2e5b9f1124a2138a97d9a02585541" + }, + "vllm/model_executor/layers/fused_moe/all2all_utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/all2all_utils.py", + "sha256": "dc4750a446f7de31d09a46034da5fdf479bc169af90f47aa9af8ae15e67b0828" + }, + "vllm/model_executor/layers/fused_moe/b12x.py": { + "path": "/vllm/model_executor/layers/fused_moe/b12x.py", + "sha256": "ee76cc6aa801e24be8ec78a9e8502061ad48667d5ff8711e43f68fba912425bd" + }, + "vllm/model_executor/layers/fused_moe/config.py": { + "path": "/vllm/model_executor/layers/fused_moe/config.py", + "sha256": "a3a87cebcc7ac85d73f471dcfafc2d899c6fc08f264777b74a0e919adac9e03f" + }, + "vllm/model_executor/layers/fused_moe/deep_gemm_utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/deep_gemm_utils.py", + "sha256": "8fdcd857eb333f9c68902105f157568d52067c94ba1e2df6dbfe0474ef1f4c02" + }, + "vllm/model_executor/layers/fused_moe/eep_reconfigure.py": { + "path": "/vllm/model_executor/layers/fused_moe/eep_reconfigure.py", + "sha256": "9d7580265e8563e1140c2bb4c3a81a35ddd54903f5ec0a2720ffc064681f02f9" + }, + "vllm/model_executor/layers/fused_moe/expert_map_manager.py": { + "path": "/vllm/model_executor/layers/fused_moe/expert_map_manager.py", + "sha256": "308c00f63fcb6f44518ec3a56d8f902c7bba75928c2e3aea30fbe1f3f473973b" + }, + "vllm/model_executor/layers/fused_moe/experts/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a16_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a16_moe.py", + "sha256": "53deea255175171971422d14082ad139b5ec7b62e21429a4c7cc0ebbefd29cdc" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a8_moe.py", + "sha256": "f3fc51b95ed89862381908a0134e326228827f44854248db9585a9c4899c34f4" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp8_moe.py", + "sha256": "af6db1760961a5a71234f8b1cdf42e9e30a236e13601b0826a75110b79724948" + }, + "vllm/model_executor/layers/fused_moe/experts/batched_deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/batched_deep_gemm_moe.py", + "sha256": "b0cd4ea706583518dc608fb56f832fc3595f24bd863b03ef1e8c22b36b873508" + }, + "vllm/model_executor/layers/fused_moe/experts/cpu_int4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cpu_int4_moe.py", + "sha256": "67170af3ba9dc4c4f71d78a72efc3fa4e366eac614936a79911dae5c75ac1864" + }, + "vllm/model_executor/layers/fused_moe/experts/cpu_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cpu_moe.py", + "sha256": "0754cd4ff1b28e6d3932a67609d335acefd28f95a841f0492923813356a6d81e" + }, + "vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py", + "sha256": "db901bdbcd3fdac23a1d74e39c51e67f14a82be787b2fd704ed1e787372ae868" + }, + "vllm/model_executor/layers/fused_moe/experts/deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/deep_gemm_moe.py", + "sha256": "16911a64a72eafc26a1bcb544a91f90144d85dc41e3ee57cf20e89925227bbb7" + }, + "vllm/model_executor/layers/fused_moe/experts/fallback.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fallback.py", + "sha256": "1bdd0a4f2ebaa40ec96a5aacc07aee61511af59e6324ce456aa65003b6e2991a" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_b12x_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_b12x_moe.py", + "sha256": "e613afe5da2742e42c717c1a0a56bd9e1c7e3e0452a828db0013d81063518954" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_batched_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_batched_moe.py", + "sha256": "295254dfeeec8df3eb8110e6f659a946cb9cded3de1565ecad4d741b3c3f3e00" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_moe.py", + "sha256": "08578bcd0cf72d6a470e40950175e73639efaa6d8d23c6da0869345312b229c9" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutlass_moe.py", + "sha256": "52887cec5fe628e0a4e7793deb546b40f6c29f7362b3b436c10ca36934ab9826" + }, + "vllm/model_executor/layers/fused_moe/experts/fused_batched_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fused_batched_moe.py", + "sha256": "2435587fc7f8fe8ea341ea0eb8f14c11f3f5b31fbbb9b29ce569ad3bace6e6a0" + }, + "vllm/model_executor/layers/fused_moe/experts/fused_humming_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fused_humming_moe.py", + "sha256": "a6830a76ff7f4cd3479b9c8372a30d03e8301604555cbdbcd9ac89a813b7431a" + }, + "vllm/model_executor/layers/fused_moe/experts/gpt_oss_triton_kernels_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/gpt_oss_triton_kernels_moe.py", + "sha256": "1613a7a6b256e8faee6fdcfae84f293492db6229d28ceb3e8a8d6093af480e36" + }, + "vllm/model_executor/layers/fused_moe/experts/int4_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/int4_emulation_moe.py", + "sha256": "f12857caf0671a341687ad3c5f48616b816ed51e1bcbdefa0a7edbecdb81a79d" + }, + "vllm/model_executor/layers/fused_moe/experts/lora_context.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/lora_context.py", + "sha256": "9b41eefaaa57c5dd0dc54217ef95978821b0c52e90ea4db8b0752e08452bd3e5" + }, + "vllm/model_executor/layers/fused_moe/experts/lora_experts_mixin.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/lora_experts_mixin.py", + "sha256": "b2bc55ed6be98b526c6a5698e2d98300650e78555f56b1820e58c04888e2a373" + }, + "vllm/model_executor/layers/fused_moe/experts/marlin_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/marlin_moe.py", + "sha256": "93916b721548e6194dc70cf6cec224b4b1456a0cc0980235e97beba7bf36541d" + }, + "vllm/model_executor/layers/fused_moe/experts/mxfp8_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/mxfp8_emulation_moe.py", + "sha256": "d09c62ad1398c51ff6f515f2a61014ee9e9a9798d0fe9762c47f446efc5edbef" + }, + "vllm/model_executor/layers/fused_moe/experts/mxfp8_native_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/mxfp8_native_moe.py", + "sha256": "01a42cebf18189e566034111b2145573c655319e8af1a56db60d53a319c40613" + }, + "vllm/model_executor/layers/fused_moe/experts/nvfp4_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/nvfp4_emulation_moe.py", + "sha256": "f24467762b60702f0df122ed64786be839a838a9b6cafaecbd04d35fbfedb189" + }, + "vllm/model_executor/layers/fused_moe/experts/ocp_mx_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/ocp_mx_emulation_moe.py", + "sha256": "dcaa60a9ebdb0bd8223b37af41f018ce7f95716ec7cd8526850f4433a579213b" + }, + "vllm/model_executor/layers/fused_moe/experts/rdna3_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/rdna3_moe.py", + "sha256": "e4abd802dc2f0ad9b338ebde397633c761d881c37813e2dc229902c526b597d8" + }, + "vllm/model_executor/layers/fused_moe/experts/rocm_aiter_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/rocm_aiter_moe.py", + "sha256": "bf09a7b783f5752d61cab76221b32b598d8846d801ee39dc9209d636c9659c6f" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_cutlass_moe.py", + "sha256": "ffce5ad627c540940d122d8df7981644b2eb35d07d480995c0f4f30517815fac" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_deep_gemm_moe.py", + "sha256": "c7209fa5e1ccb184a68b37a0706fc571a76696c2ae79802ddc7f889b1c29684d" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_moe.py", + "sha256": "806fbccfe30f5fbd578acf773add99bdf022b12d617958bd6281aef6de369701" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_bf16_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_bf16_moe.py", + "sha256": "76256de96fefece9c41ffb1108487919e24da364cf4412c6c3474498aba59137" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.py", + "sha256": "b54c7ceb45e5d07aa905f42ea44caccf85ca35ba9fb825d4c01947764510f68b" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_lora_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_lora_moe.py", + "sha256": "dd35a9e4242c0dc8d691168813e14bd5543e591f02ee529d0691e07651942c5a" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_mxfp4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_mxfp4_moe.py", + "sha256": "fe780f125a3dc3ba919659e9b85340bd32afcbfe47733a002bfdfb92eadf400c" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_mxint4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_mxint4_moe.py", + "sha256": "2106d67c2951aa690c4656ca58240d09c366cffe8cb4d9fd575df016c377cc30" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_nvfp4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_nvfp4_moe.py", + "sha256": "e938ac9f058f7c90b41c9610513239bec54a95304bfb5ff5f6897ebd54733d7e" + }, + "vllm/model_executor/layers/fused_moe/experts/xpu_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/xpu_moe.py", + "sha256": "2a11bac0cf9274d963315efd6eebdc62978b0b7aa02e8849ff2a562742f0b86d" + }, + "vllm/model_executor/layers/fused_moe/fused_flydsl_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_flydsl_moe.py", + "sha256": "0e74879ee5c72f616ae4064b9dff3b3a0b583b7fc70b8f92f1e8b730ecd5d39b" + }, + "vllm/model_executor/layers/fused_moe/fused_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe.py", + "sha256": "7072eb06237be9d33dcb0ef7101410f886a6363c98cbee70a014c68b70f639cb" + }, + "vllm/model_executor/layers/fused_moe/fused_moe_method_base.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe_method_base.py", + "sha256": "18dcfc469d3252749801bbf943857f58da85de1f2db8fdff5a9f4986a925dc68" + }, + "vllm/model_executor/layers/fused_moe/fused_moe_modular_method.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe_modular_method.py", + "sha256": "321c744eac1fcaffd6b1b2971204c8baa57dfec53e91e5d24140014d72d64f83" + }, + "vllm/model_executor/layers/fused_moe/hpc_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/hpc_moe.py", + "sha256": "2ca9c5d71b6fd91651027905e2b83103a8823845e053e7153e148cb8e0ee666d" + }, + "vllm/model_executor/layers/fused_moe/layer.py": { + "path": "/vllm/model_executor/layers/fused_moe/layer.py", + "sha256": "def0b4e13bcc1e4e21ee10644e647e2eda1acbf0cc01e76d6128abb59ea08224" + }, + "vllm/model_executor/layers/fused_moe/modular_kernel.py": { + "path": "/vllm/model_executor/layers/fused_moe/modular_kernel.py", + "sha256": "8dc4e0dbbf35b3aac8add63ca6f2a7bbfdadaabbd60826e24598b22c7d8e5c22" + }, + "vllm/model_executor/layers/fused_moe/moe_align_block_size.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_align_block_size.py", + "sha256": "c3f7fc2087836f0160a32ab99ceb1d8f6e87c793679da34dd672e225cb7fa31b" + }, + "vllm/model_executor/layers/fused_moe/moe_fused_mul_sum.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_fused_mul_sum.py", + "sha256": "112e72578002c3bff538418dac64b3b56d995994a2fc5e32b18d2cf3b8392a13" + }, + "vllm/model_executor/layers/fused_moe/moe_output.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_output.py", + "sha256": "6ea4cbd78f9efc7f842c5df246f553f08b991c3479b8b04b89902ed08aaf8e8f" + }, + "vllm/model_executor/layers/fused_moe/moe_permute_unpermute.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_permute_unpermute.py", + "sha256": "1adc592c6254d0c877d66be5406afbc822459c18a838f4bbd094a992e7609d06" + }, + "vllm/model_executor/layers/fused_moe/oracle/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/__init__.py", + "sha256": "4dcf941d50d48bb812de0f39e9194bf17a76b8035fe324889c6038f710fdc453" + }, + "vllm/model_executor/layers/fused_moe/oracle/base.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/base.py", + "sha256": "555bbcd18a3744e64eee4e953daabef3bd268a1bd4faf967d4cfd14d6074f685" + }, + "vllm/model_executor/layers/fused_moe/oracle/fp8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/fp8.py", + "sha256": "245bd36c285df1e6f7c51e52dcda31ad247894577a9f8d765613c2c2feae9aee" + }, + "vllm/model_executor/layers/fused_moe/oracle/int8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/int8.py", + "sha256": "c1b67886511bd966b162db5bca8930f04895fb37a969818a4a10f0726c59547f" + }, + "vllm/model_executor/layers/fused_moe/oracle/int_wna16.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/int_wna16.py", + "sha256": "cfffe8b8b290330be9d18ffa07aeecf296484395ff04df3147d99393e48b55c1" + }, + "vllm/model_executor/layers/fused_moe/oracle/mxfp4.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/mxfp4.py", + "sha256": "b7915e6779b5c88e7dcd2d227f003a8e45071d6d86877013067142d4feb64a8c" + }, + "vllm/model_executor/layers/fused_moe/oracle/mxfp8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/mxfp8.py", + "sha256": "9cfdc8102a04bb844dcd7ed88043bba96ec751794bc093da76c69aa8cf88cf48" + }, + "vllm/model_executor/layers/fused_moe/oracle/nvfp4.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/nvfp4.py", + "sha256": "735b4cdeb1258f11fb02320fc0c70cab5edaca468dd60b07b2d369389d2b0313" + }, + "vllm/model_executor/layers/fused_moe/oracle/unquantized.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/unquantized.py", + "sha256": "c8b8203bd0b73bb7f586f703607394d663f14c05711416ad42d45af564382223" + }, + "vllm/model_executor/layers/fused_moe/oracle/w4a8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/w4a8.py", + "sha256": "d7fa6e2982f20b34d5ce9c5ce28a61122762a3fcdd53d249479472a4f2316c6a" + }, + "vllm/model_executor/layers/fused_moe/oracle/w4a8_int8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/w4a8_int8.py", + "sha256": "6d6f9ca2e67b630002873de2f8d8a231d091c5c2f0f3354a9e8209449b481a4c" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/__init__.py", + "sha256": "2800113263a83c2632e522fb22790b29f63384da75d43de32f0ae2f95e8ae4c1" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/batched.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/batched.py", + "sha256": "d52425dd8c08e47cf8d9c3088daf3b1cc721c8667de4c738d04ba997f9a08ccb" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ht.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ht.py", + "sha256": "465cdf1d6cee91b2ee8c2e43abbea6e8408976e3048c10f44c089f34b415bc60" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ll.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ll.py", + "sha256": "f704922b1db680c4c212982a096e09d6b3eb97d89110313f86ed958a00df21b7" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_v2.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_v2.py", + "sha256": "8d690b016bbcfbc9eb599bcc36a6f798b2f1720c828f4347ea742e218c0cc60d" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_one_sided.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_one_sided.py", + "sha256": "acb57d8342af62bb5672036871cd4b27ecc7f37dfa7c894850bb860e6152a1f0" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_two_sided.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_two_sided.py", + "sha256": "cc5b00d6a157b6eca5afaaf7435165dbd1b4524d6d88bf75808cbe074a389f79" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/mori.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/mori.py", + "sha256": "8e9c3b5b1f0de13f467d95bf2f451cba0e4b0d9a1bdcf98da0988a3a9a79a045" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/naive_dp_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/naive_dp_ep.py", + "sha256": "db015e5b18750bbbf5b2bbaceca877dd6f3f3e74c2a94e8dc185f7413b387f91" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/nixl_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/nixl_ep.py", + "sha256": "1f71d70ac509bf5d3d67a8d95a8ee108a50af6bb5d4bde7181ca28e286f6ffce" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/no_dp_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/no_dp_ep.py", + "sha256": "adbbf529cd22059c95b5380952943a70cf11e05e321dcd707f296bebde61a6e7" + }, + "vllm/model_executor/layers/fused_moe/routed_experts.py": { + "path": "/vllm/model_executor/layers/fused_moe/routed_experts.py", + "sha256": "68c48e5df0ea4a7cc1f04436b7b9153eb53802ecd9bb55d38db8738508daac6d" + }, + "vllm/model_executor/layers/fused_moe/routed_experts_capturer.py": { + "path": "/vllm/model_executor/layers/fused_moe/routed_experts_capturer.py", + "sha256": "cd006bc1a1703418cca3b589fafb2abc4268a086fb3db044bbb64348aeac8b13" + }, + "vllm/model_executor/layers/fused_moe/router/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/layers/fused_moe/router/aiter_shared_routed_fused_moe_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/aiter_shared_routed_fused_moe_router.py", + "sha256": "f47046db1275601a2c67c9232afc7b866c9623a19639d5be867e4c7914a35069" + }, + "vllm/model_executor/layers/fused_moe/router/base_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/base_router.py", + "sha256": "47fa2324bcd9b6ebdc138d69ae6b6ecc0f2463d34bda8c5988bdb0a2a76d3fae" + }, + "vllm/model_executor/layers/fused_moe/router/bf16x3_router_gemm_cutedsl.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/bf16x3_router_gemm_cutedsl.py", + "sha256": "d0f1edd1ebc48d88e490bdb3c93db49bdc0a135ff83e7e0b57130e9f8255fc32" + }, + "vllm/model_executor/layers/fused_moe/router/cpu_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/cpu_router.py", + "sha256": "bff36b15818c87bfbb7ee3def7dc7f6396860abbe5893ff6148801fe941a4b92" + }, + "vllm/model_executor/layers/fused_moe/router/custom_routing_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/custom_routing_router.py", + "sha256": "1a40c7054e3c3a1b3ee2e98f6bc9efa9dfdc11f316a8edf7357dd91533487bfe" + }, + "vllm/model_executor/layers/fused_moe/router/dsv4_topk.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/dsv4_topk.py", + "sha256": "14f7c8487b9aef652dd61c91e0e3c3640b643bf9cd0d8a7184157d71f4beb63e" + }, + "vllm/model_executor/layers/fused_moe/router/fused_moe_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_moe_router.py", + "sha256": "0daa0dc05b931d66767feca444a4cd57ecf140f59b40ea0e8ad213eef6da2b36" + }, + "vllm/model_executor/layers/fused_moe/router/fused_topk_bias_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_topk_bias_router.py", + "sha256": "8fdc28cc248180ad4f11bb4bcda3df47926ec12665a0d84bb712fe83fc6b9376" + }, + "vllm/model_executor/layers/fused_moe/router/fused_topk_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_topk_router.py", + "sha256": "1c80f4af4d781fd66b12aa6a7a0fd30082bc521df40f1252987a8ac4c0bef51c" + }, + "vllm/model_executor/layers/fused_moe/router/gate_linear.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/gate_linear.py", + "sha256": "faa43362c2e7c568498a923c682ca18cae75e87f48d00882770821cb19c21198" + }, + "vllm/model_executor/layers/fused_moe/router/grouped_topk_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/grouped_topk_router.py", + "sha256": "048339e1799cdd42c9dae686a6cb891046577fb391b500f0d12eed73c8f61e52" + }, + "vllm/model_executor/layers/fused_moe/router/rocm_fp32_router_gemm.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/rocm_fp32_router_gemm.py", + "sha256": "9c331ef3d0bb2fb6954387d77ac62a99c5c76d2753c7438bfbb5115f68aae5ac" + }, + "vllm/model_executor/layers/fused_moe/router/router_factory.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/router_factory.py", + "sha256": "019bc8adaa7642abab82843efd53cd1a378f62c652521a1de2b781480eb88742" + }, + "vllm/model_executor/layers/fused_moe/router/routing_simulator_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/routing_simulator_router.py", + "sha256": "a7345df5add00cf3bd93024492d6fc1189fd3ecf2754a11cef1b03a295d791f7" + }, + "vllm/model_executor/layers/fused_moe/router/zero_expert_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/zero_expert_router.py", + "sha256": "dea306edd92e2b9c1b43f982ede8e1e10770d2c66220f5a106e0ed0165276e9c" + }, + "vllm/model_executor/layers/fused_moe/runner/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/layers/fused_moe/runner/moe_runner.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/moe_runner.py", + "sha256": "05893188402fe37229bf72d75088d66193c417d5d502daafd3a55e1bfedaa60c" + }, + "vllm/model_executor/layers/fused_moe/runner/moe_runner_interface.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/moe_runner_interface.py", + "sha256": "189cad01611124eb44594713cbf5918d16fc70196dc81a525ae0a7a97a5fcc51" + }, + "vllm/model_executor/layers/fused_moe/runner/shared_experts.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/shared_experts.py", + "sha256": "d89e4c79c46f6fe61262c51f3facf102e71ce1e4eb3db67f72b6bd8470937be9" + }, + "vllm/model_executor/layers/fused_moe/topk_weight_and_reduce.py": { + "path": "/vllm/model_executor/layers/fused_moe/topk_weight_and_reduce.py", + "sha256": "3dfede72d52bf99af40997994704e6c502ee3bab2bd39bfaa8a68d7dae440203" + }, + "vllm/model_executor/layers/fused_moe/unquantized_fused_moe_method.py": { + "path": "/vllm/model_executor/layers/fused_moe/unquantized_fused_moe_method.py", + "sha256": "182a5ec1874ece2091a24c5303f6ab9ea64a9a61adf325b863927f0cdd83e5d3" + }, + "vllm/model_executor/layers/fused_moe/utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/utils.py", + "sha256": "a93a0bded4008db19d8b38370526ae34fafb9c8278e5b4f60acb6acc8fdc1850" + }, + "vllm/model_executor/layers/mamba/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/abstract.py": { + "path": "/vllm/model_executor/layers/mamba/abstract.py", + "sha256": "dfdc8c836894f574e41d93d76ab989cacd3d7ecf59c97a929abfa48d9364e8ad" + }, + "vllm/model_executor/layers/mamba/gdn/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/gdn/base.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/base.py", + "sha256": "7fec748fc74131f5a45bcaf2644b3fa3a0598fd437d7347f8207ea3644a951c5" + }, + "vllm/model_executor/layers/mamba/gdn/kimi_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/kimi_gdn_linear_attn.py", + "sha256": "1cec4da5c9da73557e192bfb36cd540aae51d3e91283b554449c4a97f0f89bd9" + }, + "vllm/model_executor/layers/mamba/gdn/olmo_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/olmo_gdn_linear_attn.py", + "sha256": "60873ca3bb0c4d17c33bd259b62b658db4883cd23138f47dd4ead62cd2ff0605" + }, + "vllm/model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py", + "sha256": "b80f8e6f3fff442fb880aebb3209c52f814f66490009f4ac4003de603576d10a" + }, + "vllm/model_executor/layers/mamba/linear/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/linear/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/linear/bailing_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/linear/bailing_linear_attn.py", + "sha256": "3c480ddd6eba0766ed012a1074bbec5f241d868a87b020b0f6312222c32f93eb" + }, + "vllm/model_executor/layers/mamba/linear/base.py": { + "path": "/vllm/model_executor/layers/mamba/linear/base.py", + "sha256": "26125cd427225954e1846ca361cdaf43f2b56f11b1e217cf26e91a80ef0edb6a" + }, + "vllm/model_executor/layers/mamba/linear/minimax_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/linear/minimax_linear_attn.py", + "sha256": "4adc00f54893b5bc6c31c613deda152a19af3b1bba04153ab5924c3bf2a3aaae" + }, + "vllm/model_executor/layers/mamba/mamba_mixer.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_mixer.py", + "sha256": "a485e937ad9db14d3ad03fde5a9fe795cfa863649563e52fc7e6c52ef631164e" + }, + "vllm/model_executor/layers/mamba/mamba_mixer2.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_mixer2.py", + "sha256": "d58d93e90d9eb90bc5133b79f07c7c62d0032b35d6cf916e3fe34367b81c5cd5" + }, + "vllm/model_executor/layers/mamba/mamba_utils.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_utils.py", + "sha256": "ce9845b4a4ef4bc46577a33038ed69d59ceccb52f30e9c5bdaa36e48be3b2ca4" + }, + "vllm/model_executor/layers/mamba/ops/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/ops/causal_conv1d.py": { + "path": "/vllm/model_executor/layers/mamba/ops/causal_conv1d.py", + "sha256": "044d005cfe59fd0818ed421274e04f3e8dd679b8cdb64fca9f4422f2643484b2" + }, + "vllm/model_executor/layers/mamba/ops/cpu/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/ops/cpu/causal_conv1d.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/causal_conv1d.py", + "sha256": "64104672890ac2ef240c20c7f8059beeade707178574809dbca8721dff5ea6fa" + }, + "vllm/model_executor/layers/mamba/ops/cpu/gdn_attention.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/gdn_attention.py", + "sha256": "a50288945bf5b102ad3025ae536638dcc32d84cf7c22aaf3a85326b0c1c56c1f" + }, + "vllm/model_executor/layers/mamba/ops/cpu/mamba_ssm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/mamba_ssm.py", + "sha256": "5839e576172a3246337f5e4fb1bc19eb583b3e2b2f7e35dd060dc3041eb8372d" + }, + "vllm/model_executor/layers/mamba/ops/gather_initial_states.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gather_initial_states.py", + "sha256": "5198bb6de6d91c583a5f65d926412a76ee04a06fa72aaba76eaf156b27cd0523" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/__init__.py", + "sha256": "b88b52e71fcb21bd3fa215ea171dcd2ad2ff17c97788cfe64caa7ba45c7ecf97" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_h.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_h.py", + "sha256": "f50bbe5c0b6382323ec5dfc24a5e0c7971113d59727515e60c9fe3689734e5ba" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_kkt_inv_uw.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_kkt_inv_uw.py", + "sha256": "b4a65dd194907db08865e0596fe254f915e670a9e6b27ffa2933c1026dde9b1e" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_o.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_o.py", + "sha256": "629f7843a7e611efb9390f2ebb7a4b924b2c328d48a317fddfaa96af4d9bc60a" + }, + "vllm/model_executor/layers/mamba/ops/layernorm_gated.py": { + "path": "/vllm/model_executor/layers/mamba/ops/layernorm_gated.py", + "sha256": "3433f2e3b87c2b2ccf8e9794ce40762c86a6da38a94ecee001f439ea0d0373dd" + }, + "vllm/model_executor/layers/mamba/ops/mamba_ssm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/mamba_ssm.py", + "sha256": "a4515ec7895b40ed878cf380445034b25faa61fbaa799d96c49217bbdfd7e400" + }, + "vllm/model_executor/layers/mamba/ops/replayssm_config.py": { + "path": "/vllm/model_executor/layers/mamba/ops/replayssm_config.py", + "sha256": "5fe9d5d7aa2de6a65875b3796a919b22bc435fd76055ba054bbff43aa005bc44" + }, + "vllm/model_executor/layers/mamba/ops/scatter_states.py": { + "path": "/vllm/model_executor/layers/mamba/ops/scatter_states.py", + "sha256": "f3bb004c73edaba56337747893eb07faf29b270dc8bb9c893ee9b1044e4ead9a" + }, + "vllm/model_executor/layers/mamba/ops/selective_state_update_replayssm_output_only.py": { + "path": "/vllm/model_executor/layers/mamba/ops/selective_state_update_replayssm_output_only.py", + "sha256": "cea7fd3063ca9dcc4e33f180d01ea379195ec515cedc9d0b03b11dc67670d695" + }, + "vllm/model_executor/layers/mamba/ops/ssd_bmm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_bmm.py", + "sha256": "26983d97a7f5c5f9197a16a6bee7b1294839b9ae31a14c14aaee38b43523e630" + }, + "vllm/model_executor/layers/mamba/ops/ssd_chunk_scan.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_chunk_scan.py", + "sha256": "d5ef32e8cb47e2ce71984579df78ab69754895f891766394daf327867cfa4f8f" + }, + "vllm/model_executor/layers/mamba/ops/ssd_chunk_state.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_chunk_state.py", + "sha256": "177e3aa7fe72647133bbd86135533e8688a5802678d4d1564aa549410362316f" + }, + "vllm/model_executor/layers/mamba/ops/ssd_combined.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_combined.py", + "sha256": "1317bbb668d3c60dfe0658850f9968614f03fa5eb61196f8ce6ac17dbb31b480" + }, + "vllm/model_executor/layers/mamba/ops/ssd_state_passing.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_state_passing.py", + "sha256": "36b8c8edba437916a5b789717c61fc22077de01e77892cb96dbff3b00a57410e" + }, + "vllm/model_executor/layers/mamba/ops/ssu_dispatch.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssu_dispatch.py", + "sha256": "bbe0f0e61da87f3ddfead19a79ca376516b63f1ea868be3485333c63fa20ef41" + }, + "vllm/model_executor/layers/mamba/ops/triton_helpers.py": { + "path": "/vllm/model_executor/layers/mamba/ops/triton_helpers.py", + "sha256": "a8795532f22c37a93e82c9d8e3fadcb5f4da98673d7b321fe8481305eaafad30" + }, + "vllm/model_executor/layers/mamba/short_conv.py": { + "path": "/vllm/model_executor/layers/mamba/short_conv.py", + "sha256": "228494efab185ee17374f762874f4c8b9a26aac9decfa8c906ce38446e0de51a" + }, + "vllm/model_executor/models/qwen3_next.py": { + "path": "/vllm/model_executor/models/qwen3_next.py", + "sha256": "4fa5112ac2bf7886d41d9e1f6c3da8793620d1ec49c961b31e9609459a6a7f7a" + }, + "vllm/third_party/flash_linear_attention/__init__.py": { + "path": "/vllm/third_party/flash_linear_attention/__init__.py", + "sha256": "5dbbfa3fc286edb2e970e175ef33cee4f6181c89b0784f5a8986201b2312f54e" + }, + "vllm/third_party/flash_linear_attention/ops/__init__.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/__init__.py", + "sha256": "dd738dc1d08045e76455cdbe16052a5b769e0eb11d6e87ff28353994f880cd6c" + }, + "vllm/third_party/flash_linear_attention/ops/chunk.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk.py", + "sha256": "c105ead259e86aedc248c53e7c4cef07034d0ff12da608d80265d1dd0990803f" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_delta_h.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_delta_h.py", + "sha256": "1b3ad391f939d9443c6b7adb19e57fe381bd5dccea064e8417a4f85b0e713b26" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_o.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_o.py", + "sha256": "3b63b836a8cc561723c23db5a528a0b474d9cd78508d610f0b348c585a889a19" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_scaled_dot_kkt.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_scaled_dot_kkt.py", + "sha256": "7ae41df3755acc7e925a134d848f78bb5fc00b90069039d86403c5853323ea42" + }, + "vllm/third_party/flash_linear_attention/ops/cumsum.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/cumsum.py", + "sha256": "d818215669b451868823202ac0bcea77e7a9d75957254c7c1060a73a55dc39b6" + }, + "vllm/third_party/flash_linear_attention/ops/fused_gdn_prefill_post_conv.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_gdn_prefill_post_conv.py", + "sha256": "590717b2107abc90d72548de06b5d315229eb2775c94614f3f545df11cc2b5df" + }, + "vllm/third_party/flash_linear_attention/ops/fused_norm_gate.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_norm_gate.py", + "sha256": "e6eb90467f29d8a0a04f2a364d20a2c3191b6ab857841bfb82076b33a6022d1a" + }, + "vllm/third_party/flash_linear_attention/ops/fused_recurrent.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_recurrent.py", + "sha256": "fe6f1311014809040497aa0a623e7fa97f4b3457cdc7ee1f1f8aed21f326f755" + }, + "vllm/third_party/flash_linear_attention/ops/fused_sigmoid_gating.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_sigmoid_gating.py", + "sha256": "000ab8996af9788fdb8843a6a3b91833e7a14c8acc0e1ea073a536330f64cb6f" + }, + "vllm/third_party/flash_linear_attention/ops/index.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/index.py", + "sha256": "a4f8b2c052635cb519a80099e8a85411d1d5d6880b38f466788259bbe66b154d" + }, + "vllm/third_party/flash_linear_attention/ops/kda.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/kda.py", + "sha256": "e1f31aaa89b91f8e5db6d070b229e2c81c7206e8caec67de41db97d06be0c476" + }, + "vllm/third_party/flash_linear_attention/ops/l2norm.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/l2norm.py", + "sha256": "520f4513ef4fc97e6b88dc07877cca8e29da0d34e44673fe989e3af002d86381" + }, + "vllm/third_party/flash_linear_attention/ops/layernorm_guard.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/layernorm_guard.py", + "sha256": "42af29be26e8fc94a4658e053c095fcdab9ffdc1bc2446a01e787deda2a298c0" + }, + "vllm/third_party/flash_linear_attention/ops/op.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/op.py", + "sha256": "456da84fd12411cf53c96a90dd4f78f49afb454c3d51d2c524ea8e7106fe8ae5" + }, + "vllm/third_party/flash_linear_attention/ops/solve_tril.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/solve_tril.py", + "sha256": "d1a4ff27623a938825052500afa7e2aa24fadd2fa4c9be6376c9128824f86f82" + }, + "vllm/third_party/flash_linear_attention/ops/utils.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/utils.py", + "sha256": "d6c90d36505e02086954c23ca4dd2fea82a69416d68ff1d0501e16b3148b5b0c" + }, + "vllm/third_party/flash_linear_attention/ops/wy_fast.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/wy_fast.py", + "sha256": "c9fc8259db0a8746dc04f1d799cb73333457118cf89a0bdce8dde8a80a28cd96" + }, + "vllm/v1/attention/__init__.py": { + "path": "/vllm/v1/attention/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backend.py": { + "path": "/vllm/v1/attention/backend.py", + "sha256": "01ac364372afa75fdb22486aa3a9c7cf9aebb742e3471dfb9e0f9d9d36b734bc" + }, + "vllm/v1/attention/backends/__init__.py": { + "path": "/vllm/v1/attention/backends/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backends/b12x.py": { + "path": "/vllm/v1/attention/backends/b12x.py", + "sha256": "443f0a98738fdfefe5b9ab151d278bfd43a8ac807eb2b0b9b2a13d51922afbf9" + }, + "vllm/v1/attention/backends/composite.py": { + "path": "/vllm/v1/attention/backends/composite.py", + "sha256": "4cf3d66dca891562709eed4f50aa14b0ae6c8240d9ea86504a3304b2f356cce0" + }, + "vllm/v1/attention/backends/cpu_attn.py": { + "path": "/vllm/v1/attention/backends/cpu_attn.py", + "sha256": "76fb02a6bd725125565d84bf04f627cf16da5f7ff8f31f87c01ed6a1439398c7" + }, + "vllm/v1/attention/backends/fa_utils.py": { + "path": "/vllm/v1/attention/backends/fa_utils.py", + "sha256": "08fa6e231d3af3a71a6e59162dd12328aa8beb28548165ae58f130a92adb5a83" + }, + "vllm/v1/attention/backends/flash_attn.py": { + "path": "/vllm/v1/attention/backends/flash_attn.py", + "sha256": "b170a4789e18104c1bee35bea70df51abe6766693d8f4726a59f2e6f5c4282aa" + }, + "vllm/v1/attention/backends/flash_attn_diffkv.py": { + "path": "/vllm/v1/attention/backends/flash_attn_diffkv.py", + "sha256": "e4627c88c3ba8caee260540e994cc8137fd2ff7cd7813356b36387c6c88ce30a" + }, + "vllm/v1/attention/backends/flashinfer.py": { + "path": "/vllm/v1/attention/backends/flashinfer.py", + "sha256": "8ee541fde43ed92a417b3f01ea1e6fc64af8ab2eb54cbfc28308a49aaca4ed7f" + }, + "vllm/v1/attention/backends/flex_attention.py": { + "path": "/vllm/v1/attention/backends/flex_attention.py", + "sha256": "ad07f0ad73aeeadc3534b3a05c14f88a62cb3638874239ae9823c49b36276dc3" + }, + "vllm/v1/attention/backends/gdn_attn.py": { + "path": "/vllm/v1/attention/backends/gdn_attn.py", + "sha256": "3831019404a92200a38b43571c040cffeb6638bbdc71e4cb5e680dbc6c93d054" + }, + "vllm/v1/attention/backends/hpc_attn.py": { + "path": "/vllm/v1/attention/backends/hpc_attn.py", + "sha256": "af9e2aec1b498f0ee48a2dce3cf5646edf1976466980b2fd927c0e82b875427c" + }, + "vllm/v1/attention/backends/linear_attn.py": { + "path": "/vllm/v1/attention/backends/linear_attn.py", + "sha256": "bc42144fcd027434c6a10dc9f4c5f991db8899d387af5f6485402ce097eb0513" + }, + "vllm/v1/attention/backends/mamba1_attn.py": { + "path": "/vllm/v1/attention/backends/mamba1_attn.py", + "sha256": "32159dae11cab3c8c576b9514ad97d5108c8d1b4cac9fcfe345ec6a76223aee7" + }, + "vllm/v1/attention/backends/mamba2_attn.py": { + "path": "/vllm/v1/attention/backends/mamba2_attn.py", + "sha256": "a5bcdecb7b9547137023e1c77a386003358fa940eaf5f319ed142211dcdba139" + }, + "vllm/v1/attention/backends/mamba_attn.py": { + "path": "/vllm/v1/attention/backends/mamba_attn.py", + "sha256": "5e7b2c4058fc5e6096d001bff6c789b78368b025bbe4600f191aaca2ff59b59f" + }, + "vllm/v1/attention/backends/mla/__init__.py": { + "path": "/vllm/v1/attention/backends/mla/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backends/mla/aiter_triton_mla.py": { + "path": "/vllm/v1/attention/backends/mla/aiter_triton_mla.py", + "sha256": "ed0e285cdae06a019150c41cc958b3c0b5ceb0e4f299d5318d1c90e2c2395390" + }, + "vllm/v1/attention/backends/mla/amx_mla.py": { + "path": "/vllm/v1/attention/backends/mla/amx_mla.py", + "sha256": "7f5cddec30b2dfe22ccdbd3b9da673c879719bf6da4074317bd60add55f5d15f" + }, + "vllm/v1/attention/backends/mla/compressor_utils.py": { + "path": "/vllm/v1/attention/backends/mla/compressor_utils.py", + "sha256": "3589e94105368ea285c40b82db1a0332682ff5d071fe363627cf4c0d10f3facf" + }, + "vllm/v1/attention/backends/mla/cpu_mla.py": { + "path": "/vllm/v1/attention/backends/mla/cpu_mla.py", + "sha256": "ff2110b9f78e92adf6bab294465cbc294ae1ff71cb1780fed158179e134a4ca6" + }, + "vllm/v1/attention/backends/mla/cutlass_mla.py": { + "path": "/vllm/v1/attention/backends/mla/cutlass_mla.py", + "sha256": "211d298680f9bd793cc468281b316d6633c5f4eb6dcec71d3329b034a23ab9b5" + }, + "vllm/v1/attention/backends/mla/flashattn_mla.py": { + "path": "/vllm/v1/attention/backends/mla/flashattn_mla.py", + "sha256": "ac89e0ad75a37e92566d264bafe324735a80f9ab4709241a4454d17b3d38bb63" + }, + "vllm/v1/attention/backends/mla/flashattn_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashattn_mla_sparse.py", + "sha256": "67dd3ead2e8b9d8cda0825ecc93779cb7d670628bc741c759a7d3cd5d474030f" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla.py", + "sha256": "0c24ff016fb6b0bb41d9e7484b6f1af42f37bcc384ed613473fc3e01ad25f664" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse.py", + "sha256": "2116d965b2067134d8afa5878d4d16c0149b061258f50c4106d993aa13b073cc" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm120.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm120.py", + "sha256": "102ca08793d567f95598eefeb34c3f6ec50b3b9d704f162d1402b97b12b5777b" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm90.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm90.py", + "sha256": "df9fe4970aa3f53cf24784b8534b89e0101a2ca20a35a2ebbc9a12a4463d5993" + }, + "vllm/v1/attention/backends/mla/flashmla.py": { + "path": "/vllm/v1/attention/backends/mla/flashmla.py", + "sha256": "c9d8046a853ecbdeff9ebfc738f5bb34c4f272b278231a09a0fbf73708c7c188" + }, + "vllm/v1/attention/backends/mla/flashmla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashmla_sparse.py", + "sha256": "7a379c717adb9667ce94cbc16c0e3a1fb22a169713db6d7941c141fa84077b3f" + }, + "vllm/v1/attention/backends/mla/index_group.py": { + "path": "/vllm/v1/attention/backends/mla/index_group.py", + "sha256": "c24e028c3c160a9bb92e043da5b5b34c805e84745b7c4b8da6fb8702a0ddd641" + }, + "vllm/v1/attention/backends/mla/indexer.py": { + "path": "/vllm/v1/attention/backends/mla/indexer.py", + "sha256": "2acbc1c4fa57c3424ad95e6ecbe76eb7141747773c3e867ce704f4adccba892a" + }, + "vllm/v1/attention/backends/mla/prefill/__init__.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/__init__.py", + "sha256": "903630eb705dd175bf4ae4558a4bcaa07c110056b6a11eb830fdd2fb21b3c48a" + }, + "vllm/v1/attention/backends/mla/prefill/aiter_flash_attn.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/aiter_flash_attn.py", + "sha256": "571b8a9910c4ea3fefda60659026f3bf0d7b542c34553c8c9a4d43bb82077e61" + }, + "vllm/v1/attention/backends/mla/prefill/base.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/base.py", + "sha256": "138bf3ddaf5a94c3cdbc4e08ac676edcae84b32fc76625e546f3b47f7d8b82ec" + }, + "vllm/v1/attention/backends/mla/prefill/cpu_sdpa.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/cpu_sdpa.py", + "sha256": "1bb686395274a8ec0d9fd7327410a527655fe060cbbc263eab138fea988d96de" + }, + "vllm/v1/attention/backends/mla/prefill/flash_attn.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/flash_attn.py", + "sha256": "5e648c82c82e5f81fe11458eb82b9f90b50fc06df2ade3bf111ee6b7a2ee8481" + }, + "vllm/v1/attention/backends/mla/prefill/flashinfer.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/flashinfer.py", + "sha256": "63861219c35b8abc0ebe01e1f51543c5ed40bd46119ca261d927da7c6826b49b" + }, + "vllm/v1/attention/backends/mla/prefill/registry.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/registry.py", + "sha256": "c8c30b92213d594beaa3cab4d5003da26a85870dbb11d1ab73191962d0645b53" + }, + "vllm/v1/attention/backends/mla/prefill/selector.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/selector.py", + "sha256": "101d9fca7924b0c5d7891a17fe8942611bd6759e32b03a571dc87b14c1430f2f" + }, + "vllm/v1/attention/backends/mla/prefill/tokenspeed_mla.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/tokenspeed_mla.py", + "sha256": "047cf07bfcc83db3b11a6a54ffe189f6146e6ec9ad33ce2fa7d18860bf4210f0" + }, + "vllm/v1/attention/backends/mla/prefill/trtllm_ragged.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/trtllm_ragged.py", + "sha256": "9e13ea6f6a25accedd918c0de64bbb812ccb20ffb95350ab018a6e76d493789b" + }, + "vllm/v1/attention/backends/mla/rocm_aiter_mla.py": { + "path": "/vllm/v1/attention/backends/mla/rocm_aiter_mla.py", + "sha256": "b489f5830c655bfb6299801a70d69b9821513c69568ecab3689db5a7be867be5" + }, + "vllm/v1/attention/backends/mla/rocm_aiter_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/rocm_aiter_mla_sparse.py", + "sha256": "91b1d9b3d860a9720bc01b8ebe9bbe8649a7d6bca20d4b63939bc100309bca19" + }, + "vllm/v1/attention/backends/mla/sparse_swa.py": { + "path": "/vllm/v1/attention/backends/mla/sparse_swa.py", + "sha256": "a47853ad8a3fe40f24704592581ea323a18041b84610df010a5534da634e311e" + }, + "vllm/v1/attention/backends/mla/sparse_utils.py": { + "path": "/vllm/v1/attention/backends/mla/sparse_utils.py", + "sha256": "c3cdf060288c05542243a9fe8b5ad3a963ad75e9ce399009b5e45c1235a88ce4" + }, + "vllm/v1/attention/backends/mla/tokenspeed_mla.py": { + "path": "/vllm/v1/attention/backends/mla/tokenspeed_mla.py", + "sha256": "b9ba523c606430cecb99a88b28c53d98a99dcf5e76105a80664338110a20f1ad" + }, + "vllm/v1/attention/backends/mla/triton_mla.py": { + "path": "/vllm/v1/attention/backends/mla/triton_mla.py", + "sha256": "21b16b3b34470edcc33d0423e560837c1d37d4bab31c7b3b9cfd7faa47864b51" + }, + "vllm/v1/attention/backends/mla/xpu_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/xpu_mla_sparse.py", + "sha256": "559c6240fe466521a6b2df4c94aea02ddf3f5efa5ba6954fa180c5a51c0f12d2" + }, + "vllm/v1/attention/backends/recoverssm_metadata.py": { + "path": "/vllm/v1/attention/backends/recoverssm_metadata.py", + "sha256": "02896a667db0f0308371ceb50048b18e5866c0235d163c0357e9a05dcedb3394" + }, + "vllm/v1/attention/backends/registry.py": { + "path": "/vllm/v1/attention/backends/registry.py", + "sha256": "378e8ee78734bd8c8adbe287d4c0a4058dcbb553195a09fbcce00a3cc30adc29" + }, + "vllm/v1/attention/backends/rocm_aiter_fa.py": { + "path": "/vllm/v1/attention/backends/rocm_aiter_fa.py", + "sha256": "d1418af03bf58209c850f466b712d3ea22a14ebb758c42dd43e65738281841fd" + }, + "vllm/v1/attention/backends/rocm_aiter_unified_attn.py": { + "path": "/vllm/v1/attention/backends/rocm_aiter_unified_attn.py", + "sha256": "59d2645eb4c91dc0567754a7163d066f4f2faf48f1957b254fcdd5604e9d8c8c" + }, + "vllm/v1/attention/backends/rocm_attn.py": { + "path": "/vllm/v1/attention/backends/rocm_attn.py", + "sha256": "4a8f57067073fbceb784af6c3467487c450d00fa3957928fadb99a79f6036292" + }, + "vllm/v1/attention/backends/short_conv_attn.py": { + "path": "/vllm/v1/attention/backends/short_conv_attn.py", + "sha256": "84fc460ef2fbd09743b069bec0c14b39542af6c2254a403e37a048427e151121" + }, + "vllm/v1/attention/backends/triton_attn.py": { + "path": "/vllm/v1/attention/backends/triton_attn.py", + "sha256": "1057663d110e1d5229495a799027b27277c1eca325d5b6780fa2259afbf58a1a" + }, + "vllm/v1/attention/backends/triton_attn_diffkv.py": { + "path": "/vllm/v1/attention/backends/triton_attn_diffkv.py", + "sha256": "de0357eae005246642140f1ab8842ba5ed8bff5c84b18a6d3a7bbf409c578301" + }, + "vllm/v1/attention/backends/triton_flash_attn.py": { + "path": "/vllm/v1/attention/backends/triton_flash_attn.py", + "sha256": "176e45329aeb28a2008362bb607d1b8c89816eb665859ab908b0385a11acf1c2" + }, + "vllm/v1/attention/backends/triton_flashinfer.py": { + "path": "/vllm/v1/attention/backends/triton_flashinfer.py", + "sha256": "48d5f967e388d4e8d6bbec8d827b44d855346bc2fada28adf65768bf6623527b" + }, + "vllm/v1/attention/backends/turboquant_attn.py": { + "path": "/vllm/v1/attention/backends/turboquant_attn.py", + "sha256": "616d16d608d9d1fbf6c29548037e7e9cf330f4d36a01aa3ffabf42a731eb6e2b" + }, + "vllm/v1/attention/backends/utils.py": { + "path": "/vllm/v1/attention/backends/utils.py", + "sha256": "fbc221360d2d54cb21ef3f625dc8711500de345a355801548b4337bb9b8abee0" + }, + "vllm/v1/attention/ops/__init__.py": { + "path": "/vllm/v1/attention/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/ops/chunked_prefill_paged_decode.py": { + "path": "/vllm/v1/attention/ops/chunked_prefill_paged_decode.py", + "sha256": "973db848a790b2e8d99e728b2fc4f44b501bbe58c62747244ddff04cfcf11a85" + }, + "vllm/v1/attention/ops/common.py": { + "path": "/vllm/v1/attention/ops/common.py", + "sha256": "b4b67e7fc0cce471e337d742c097fba06da7563816e8799e27719714e31e1d5b" + }, + "vllm/v1/attention/ops/cp_common.py": { + "path": "/vllm/v1/attention/ops/cp_common.py", + "sha256": "2369181862e96db64b14ef20c5c2e249ed2ea5f3dea2467a2aa388372bb86d9d" + }, + "vllm/v1/attention/ops/dcp.py": { + "path": "/vllm/v1/attention/ops/dcp.py", + "sha256": "a478bdc781460f0582cfaf74d6431f1a826c201f02f39d882d12a96139bc3f28" + }, + "vllm/v1/attention/ops/flashmla.py": { + "path": "/vllm/v1/attention/ops/flashmla.py", + "sha256": "8a40d6e120e3ab25a95fcfeb32b0b5b4c1ea02b984633866628536dcd26ed2e8" + }, + "vllm/v1/attention/ops/flydsl_kernels/__init__.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/attention/ops/flydsl_kernels/tq_decode.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/tq_decode.py", + "sha256": "cc4b7f82897596e0974b3d3a710a1a8bc58c3d22b72cc7f461dd1c4acd2e451b" + }, + "vllm/v1/attention/ops/flydsl_kernels/tq_decode_gqa6.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/tq_decode_gqa6.py", + "sha256": "a983f6d375c325900955e11696dab1e2665770e83f84d51f93d3ed5e1d8880e0" + }, + "vllm/v1/attention/ops/flydsl_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/flydsl_turboquant_decode.py", + "sha256": "7b1dd0ef7c7fb28a6a8831759e00b939ab844d067657155cc11cf75532a22c63" + }, + "vllm/v1/attention/ops/int4_per_token_head.py": { + "path": "/vllm/v1/attention/ops/int4_per_token_head.py", + "sha256": "d91968f280cd8eaed7570ab255f0276b40e833e18a25066d371d9ca8149425f2" + }, + "vllm/v1/attention/ops/merge_attn_states.py": { + "path": "/vllm/v1/attention/ops/merge_attn_states.py", + "sha256": "ad08403d2843fc892f0b0b4b9f5fabb81884556f89f7170dca46ccef498a3539" + }, + "vllm/v1/attention/ops/metadata.py": { + "path": "/vllm/v1/attention/ops/metadata.py", + "sha256": "ca882b84c5aaefb1f77e4d8ea09a00103fbc53defa8671bba036c961c17fc760" + }, + "vllm/v1/attention/ops/paged_attn.py": { + "path": "/vllm/v1/attention/ops/paged_attn.py", + "sha256": "016a95f892ec751c86b37be1e12171bad9f0b4076bbf2219ff336f4e9c503653" + }, + "vllm/v1/attention/ops/pcp.py": { + "path": "/vllm/v1/attention/ops/pcp.py", + "sha256": "dadeff95fe2df2be8028baabeef01b0d2d628cd67de2176915e737ce096de3dd" + }, + "vllm/v1/attention/ops/prefix_prefill.py": { + "path": "/vllm/v1/attention/ops/prefix_prefill.py", + "sha256": "b08ad92db715fc03c11699de3de463d55e411f42f77548e06b41049a61de692f" + }, + "vllm/v1/attention/ops/rocm_aiter_mla_merge.py": { + "path": "/vllm/v1/attention/ops/rocm_aiter_mla_merge.py", + "sha256": "564c66e4877732e48a6f7d52405c43dc952eec0f0ae4353d34886bca056132b9" + }, + "vllm/v1/attention/ops/rocm_aiter_mla_sparse.py": { + "path": "/vllm/v1/attention/ops/rocm_aiter_mla_sparse.py", + "sha256": "feec664be5045fd1ba13b8f6ef83b52c96910ddc78baca0431bcf610c9e8f5cc" + }, + "vllm/v1/attention/ops/triton_attention_helpers.py": { + "path": "/vllm/v1/attention/ops/triton_attention_helpers.py", + "sha256": "35aa993d01345f535d2641cf9dcabb8b64c51b20a19707bc5987e616aaa87ddd" + }, + "vllm/v1/attention/ops/triton_decode_attention.py": { + "path": "/vllm/v1/attention/ops/triton_decode_attention.py", + "sha256": "b9823c65eba22d76abf64dad7d7d16a950f67471c86d6cb5b3e983aaf14381ac" + }, + "vllm/v1/attention/ops/triton_merge_attn_states.py": { + "path": "/vllm/v1/attention/ops/triton_merge_attn_states.py", + "sha256": "f63229162181ab93198550b73a115f1cc1034cfd60e6f58bc8ab3e22a6e8ce60" + }, + "vllm/v1/attention/ops/triton_prefill_attention.py": { + "path": "/vllm/v1/attention/ops/triton_prefill_attention.py", + "sha256": "352c1a4ac86146580040579fb217c2e288268830d6602b735713e154f36d74fe" + }, + "vllm/v1/attention/ops/triton_reshape_and_cache_flash.py": { + "path": "/vllm/v1/attention/ops/triton_reshape_and_cache_flash.py", + "sha256": "6cac51475b8c656992a21b2d150acd3a16a95a7ab7d49aab151a3ef13c24b80d" + }, + "vllm/v1/attention/ops/triton_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/triton_turboquant_decode.py", + "sha256": "8e52678136449e4bbca2195fbcbb87426c955a2b1b8422e7ab9511e45ee5f5c6" + }, + "vllm/v1/attention/ops/triton_turboquant_store.py": { + "path": "/vllm/v1/attention/ops/triton_turboquant_store.py", + "sha256": "6e6e2fe74a307d40f0be786ccbaea76d989e3c7b5985f3144a5218c61bf6d902" + }, + "vllm/v1/attention/ops/triton_unified_attention.py": { + "path": "/vllm/v1/attention/ops/triton_unified_attention.py", + "sha256": "65d0fbcf33d00789df8ca688c0a1c908e710cfaef53471178747ecae11f05829" + }, + "vllm/v1/attention/ops/triton_unified_attention_diffkv.py": { + "path": "/vllm/v1/attention/ops/triton_unified_attention_diffkv.py", + "sha256": "7fa36d7b7441f1c396e0348eac61d691d2e459e5c4c393c4aa262dfb670e68f7" + }, + "vllm/v1/attention/ops/turboquant_soa/__init__.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/__init__.py", + "sha256": "6b43b6fcb2a71c44ceff4ed1edd417a839f4901251ba15831b09ad979baa4984" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode.py", + "sha256": "bf00634191bba14cbf4a23c1d67dc3dcb244c2b8989f08362757b54435830986" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode_v2.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode_v2.py", + "sha256": "28e7ecc15c450d3591983a50c46a03aa6ca6fa99304c17c333940617d9916485" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_store.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_store.py", + "sha256": "dccf93b9fdd34f9b9eacd468e9de35b9d93378594487c335cf50642aaec681f2" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_unified_attention.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_unified_attention.py", + "sha256": "b4b2b5f3985b3a6126fd052e6ec1ed91c610da8a525a9ae7470ac829405bd85c" + }, + "vllm/v1/attention/ops/vit_attn_wrappers.py": { + "path": "/vllm/v1/attention/ops/vit_attn_wrappers.py", + "sha256": "a99d57b58269c7521fa5d7d47af06551f3bab2b5c7358ef78165a7f6e20a92a6" + }, + "vllm/v1/attention/ops/xpu_mla_sparse.py": { + "path": "/vllm/v1/attention/ops/xpu_mla_sparse.py", + "sha256": "d98d17110577c2b7b4d05e07bfdae15faf83321b6342a5daaaecce45b9503f38" + }, + "vllm/v1/attention/selector.py": { + "path": "/vllm/v1/attention/selector.py", + "sha256": "87f653ded7974875183c920e3e4589c28116bcbc99714d1da7cb51ae77c0b182" + }, + "vllm/v1/core/sched/__init__.py": { + "path": "/vllm/v1/core/sched/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/core/sched/async_scheduler.py": { + "path": "/vllm/v1/core/sched/async_scheduler.py", + "sha256": "e586a0ef3c6778be56a93e7f9bb712d4de9de6e7d7fe7e3e1d51dae83ecfc508" + }, + "vllm/v1/core/sched/interface.py": { + "path": "/vllm/v1/core/sched/interface.py", + "sha256": "be6c008664096c5660a8879de72b315bbe479bf1d688be9b25891063ec53a367" + }, + "vllm/v1/core/sched/output.py": { + "path": "/vllm/v1/core/sched/output.py", + "sha256": "3a66c8efaefe10c572f6f33cf1f8aa4610758c945130cad62eb9f7331005677c" + }, + "vllm/v1/core/sched/request_queue.py": { + "path": "/vllm/v1/core/sched/request_queue.py", + "sha256": "4b8d938e5fb8152fe61030b8aa991f983fcac9a405c37ed8908045e05e82ae5e" + }, + "vllm/v1/core/sched/scheduler.py": { + "path": "/vllm/v1/core/sched/scheduler.py", + "sha256": "c1db45f3bbad3a875dd8638331b8870c4380ac1ab4734265ba5c863833a82884" + }, + "vllm/v1/core/sched/utils.py": { + "path": "/vllm/v1/core/sched/utils.py", + "sha256": "1ed988044eb8028c77ede875bd1a5fd05ff6998b455d61e3997d6a3d7fc1c3a7" + }, + "vllm/v1/sample/__init__.py": { + "path": "/vllm/v1/sample/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/sample/logits_processor/__init__.py": { + "path": "/vllm/v1/sample/logits_processor/__init__.py", + "sha256": "1f9b02dae8cf6d44484638037123d3a2dec6b7b9a2bcc9afceef1a9bf3eaedec" + }, + "vllm/v1/sample/logits_processor/builtin.py": { + "path": "/vllm/v1/sample/logits_processor/builtin.py", + "sha256": "6105816ece77e5b1dbee0d07abc90ce039d650bac2ddb85c93280c48b00f2ebe" + }, + "vllm/v1/sample/logits_processor/interface.py": { + "path": "/vllm/v1/sample/logits_processor/interface.py", + "sha256": "171dfc6ef9b5b53128e8eaecc4bdf1de413a706d64bf5be686048f583c66eee1" + }, + "vllm/v1/sample/logits_processor/state.py": { + "path": "/vllm/v1/sample/logits_processor/state.py", + "sha256": "a96411f14362c45f839e181dcb3ac01d5b880812bccb3552fc17863b219f44ac" + }, + "vllm/v1/sample/metadata.py": { + "path": "/vllm/v1/sample/metadata.py", + "sha256": "6582cfe1a240c7ddb975f0ef6dd7dcd28dcf0fc7670394390250013977aa7ffd" + }, + "vllm/v1/sample/ops/__init__.py": { + "path": "/vllm/v1/sample/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/sample/ops/bad_words.py": { + "path": "/vllm/v1/sample/ops/bad_words.py", + "sha256": "0b1d0a9b13b92ddcae2c83393c07a34c0f107813725700dee794caa7fe7f3b12" + }, + "vllm/v1/sample/ops/logprobs.py": { + "path": "/vllm/v1/sample/ops/logprobs.py", + "sha256": "b286f69012a6758bfe9250038b0697294dbffe0d32c6906f284c39f75ee48be3" + }, + "vllm/v1/sample/ops/penalties.py": { + "path": "/vllm/v1/sample/ops/penalties.py", + "sha256": "4debfcf247b3887478d2b9ec98f108756bbed2805462777ef6b56f3bdf4ce682" + }, + "vllm/v1/sample/ops/topk_topp_sampler.py": { + "path": "/vllm/v1/sample/ops/topk_topp_sampler.py", + "sha256": "13ea4359832bc914492330958ec4f5ac140f408b8f410cc05c6eaf7ddcd70be4" + }, + "vllm/v1/sample/ops/topk_topp_triton.py": { + "path": "/vllm/v1/sample/ops/topk_topp_triton.py", + "sha256": "0b5fc337058e22bc28a8530ccec904d6ccd89b9548b02955c657ac429b1669d2" + }, + "vllm/v1/sample/rejection_sampler.py": { + "path": "/vllm/v1/sample/rejection_sampler.py", + "sha256": "0bb9d224887ccb1355e16199005cc23a4afc6fa75156eca419851b7247d99750" + }, + "vllm/v1/sample/sampler.py": { + "path": "/vllm/v1/sample/sampler.py", + "sha256": "f95805b2c6d06218c724826aa5f881a606e8d0a534a566aee7c85948520dd216" + }, + "vllm/v1/sample/thinking_budget_state.py": { + "path": "/vllm/v1/sample/thinking_budget_state.py", + "sha256": "962f8f55210eb0a431cb9c78b013e35f7a7dd58d06d6fb2e7fcff1b457356f8e" + }, + "vllm/v1/worker/__init__.py": { + "path": "/vllm/v1/worker/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/block_table.py": { + "path": "/vllm/v1/worker/block_table.py", + "sha256": "a09b8819e1417b7a186cf3472224e2138fc5d41a291c6692bb7df711b0c44259" + }, + "vllm/v1/worker/cp_utils.py": { + "path": "/vllm/v1/worker/cp_utils.py", + "sha256": "e32625d83a641b8dd8df82e92d1b6fb20af0cdf2e8fbd2fb131aa3c215415448" + }, + "vllm/v1/worker/cpu/__init__.py": { + "path": "/vllm/v1/worker/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/cpu/buffer_utils.py": { + "path": "/vllm/v1/worker/cpu/buffer_utils.py", + "sha256": "e7313fd8c2c76ebfb98d2fa53008bc9691d0f83a7d7c05e87602b5a29fb79e04" + }, + "vllm/v1/worker/cpu/model_runner.py": { + "path": "/vllm/v1/worker/cpu/model_runner.py", + "sha256": "24a1c916550051327dd5893243a6d4200f3824b91b3af8aa6f6c793fd7c68c3e" + }, + "vllm/v1/worker/cpu/shm.py": { + "path": "/vllm/v1/worker/cpu/shm.py", + "sha256": "08491af8ad341399d1375f2d21ad00414d4c89b0a5c03f55de8704914bbfcbd9" + }, + "vllm/v1/worker/cpu_model_runner.py": { + "path": "/vllm/v1/worker/cpu_model_runner.py", + "sha256": "92111aba92f00571f1a3c4c6e43cf1da6ccb4d2afac2f4d5abc018a4a6e7e8bd" + }, + "vllm/v1/worker/cpu_worker.py": { + "path": "/vllm/v1/worker/cpu_worker.py", + "sha256": "a8051b9e510ef0af9cc34004f2cbe5c0f902bd0cebc32c9464e744344dfdf849" + }, + "vllm/v1/worker/dp_utils.py": { + "path": "/vllm/v1/worker/dp_utils.py", + "sha256": "8cd19f1bfbc5c4f6ec60df89aea7c8a19b400ebc264f372b103014152e92158c" + }, + "vllm/v1/worker/ec_connector_model_runner_mixin.py": { + "path": "/vllm/v1/worker/ec_connector_model_runner_mixin.py", + "sha256": "fe9b11cebb8562f1bfe98b98a5647b2b081a6e424cb60d4ffe2412c91a99215e" + }, + "vllm/v1/worker/encoder_cudagraph.py": { + "path": "/vllm/v1/worker/encoder_cudagraph.py", + "sha256": "6a08d3779bca1b47dbf9daf6eafe2d3c70dbcb8aeb7d63ba7efacc68241ee3bc" + }, + "vllm/v1/worker/encoder_cudagraph_defs.py": { + "path": "/vllm/v1/worker/encoder_cudagraph_defs.py", + "sha256": "bb7be050fcaa8868e7816c84caec875da57050d65fe7eaf00f3d41473df25e3a" + }, + "vllm/v1/worker/gpu/__init__.py": { + "path": "/vllm/v1/worker/gpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/async_utils.py": { + "path": "/vllm/v1/worker/gpu/async_utils.py", + "sha256": "77e17a4570ead2be30ae9b00888cf077a3b873018c12ca0549b853bfda02c1ba" + }, + "vllm/v1/worker/gpu/attn_utils.py": { + "path": "/vllm/v1/worker/gpu/attn_utils.py", + "sha256": "b9b81e59dda2720b1f9c434471381f879228832443e52756e469b4ad4905888f" + }, + "vllm/v1/worker/gpu/block_table.py": { + "path": "/vllm/v1/worker/gpu/block_table.py", + "sha256": "61c004315d5af7e7eae4e2a9e6be92ea82c520327690a7f55a73bb9ce95f520a" + }, + "vllm/v1/worker/gpu/buffer_utils.py": { + "path": "/vllm/v1/worker/gpu/buffer_utils.py", + "sha256": "6597f701a30261bf250e9ad5a29737264624a1caa20527aeea0dad630325b093" + }, + "vllm/v1/worker/gpu/cp_utils.py": { + "path": "/vllm/v1/worker/gpu/cp_utils.py", + "sha256": "456c1bb7e262d99ff555522a4f134e5a9b42aee23290be25455eaef36ee8eaaf" + }, + "vllm/v1/worker/gpu/cudagraph_utils.py": { + "path": "/vllm/v1/worker/gpu/cudagraph_utils.py", + "sha256": "6e9c042890603535e300a40df8ee159dbed1058a64a83ae50ff0329e332e05ff" + }, + "vllm/v1/worker/gpu/dp_utils.py": { + "path": "/vllm/v1/worker/gpu/dp_utils.py", + "sha256": "e26867bc89e6bfc933cabc5ed13e5dc7b8d2d3030118ca1ca64c8785dabc0fc1" + }, + "vllm/v1/worker/gpu/ec_connector.py": { + "path": "/vllm/v1/worker/gpu/ec_connector.py", + "sha256": "2afe6e641f4ae3eb3b8da336c74eaa7479bf617b27cfb39a1fcbe487686f0a08" + }, + "vllm/v1/worker/gpu/eplb_utils.py": { + "path": "/vllm/v1/worker/gpu/eplb_utils.py", + "sha256": "1829fac11464aed4649179b302df198de51b95d0589f4e56bea305a876a63e26" + }, + "vllm/v1/worker/gpu/input_batch.py": { + "path": "/vllm/v1/worker/gpu/input_batch.py", + "sha256": "d5dd956eb319bd69dd9e762047833d81ad40b21fce619fcb2133759e73620694" + }, + "vllm/v1/worker/gpu/kv_connector.py": { + "path": "/vllm/v1/worker/gpu/kv_connector.py", + "sha256": "b89a4333f1e552d86e1815674b59e9f1335f0f49c0a7b46082439076f62c6a81" + }, + "vllm/v1/worker/gpu/lora_utils.py": { + "path": "/vllm/v1/worker/gpu/lora_utils.py", + "sha256": "1e90eddd9ddb4ca55e574bb28e87ae3a6f6750175a62d373102426543f4ccd66" + }, + "vllm/v1/worker/gpu/metrics/__init__.py": { + "path": "/vllm/v1/worker/gpu/metrics/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/metrics/logits.py": { + "path": "/vllm/v1/worker/gpu/metrics/logits.py", + "sha256": "ea058d7510a077a55f8ac7e4c3d596508346244e908cb372865d7159f62edc89" + }, + "vllm/v1/worker/gpu/mm/__init__.py": { + "path": "/vllm/v1/worker/gpu/mm/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/mm/encoder_cache.py": { + "path": "/vllm/v1/worker/gpu/mm/encoder_cache.py", + "sha256": "89c500338fddbeee7c4fca978a3a7c4c566a03e848e399d303fbee3c80631cd2" + }, + "vllm/v1/worker/gpu/mm/encoder_runner.py": { + "path": "/vllm/v1/worker/gpu/mm/encoder_runner.py", + "sha256": "0981e352d70301b7154a217a48665ffe35f215d053ec5740c2515a3e1e11b4e6" + }, + "vllm/v1/worker/gpu/mm/lora.py": { + "path": "/vllm/v1/worker/gpu/mm/lora.py", + "sha256": "a3eddfad6ad64de276964240c28dc080888df4a56dd5eac18f89428f2cbb7a01" + }, + "vllm/v1/worker/gpu/mm/rope.py": { + "path": "/vllm/v1/worker/gpu/mm/rope.py", + "sha256": "0924375bcb367267e783b57dd2ad9de1189d97025ce4313baaa54f2911eaaf1e" + }, + "vllm/v1/worker/gpu/model_runner.py": { + "path": "/vllm/v1/worker/gpu/model_runner.py", + "sha256": "174c93db921c23cf0396eee4764be25b2bd2d4b6a06e9fa41ce3598b884ce8ce" + }, + "vllm/v1/worker/gpu/model_states/__init__.py": { + "path": "/vllm/v1/worker/gpu/model_states/__init__.py", + "sha256": "07815d0b788fc88185772f581bbf892a675259f9288375571f29887622f8d93c" + }, + "vllm/v1/worker/gpu/model_states/default.py": { + "path": "/vllm/v1/worker/gpu/model_states/default.py", + "sha256": "bb614f814780f052e869f9acf31dfbfa68718ee7dc6252eefa901b5730ee8a2a" + }, + "vllm/v1/worker/gpu/model_states/encoder_decoder.py": { + "path": "/vllm/v1/worker/gpu/model_states/encoder_decoder.py", + "sha256": "a5868059d8af672548b41d0e623e884320e6ed61e6aaca2d2828ff5be0356f2f" + }, + "vllm/v1/worker/gpu/model_states/encoder_only.py": { + "path": "/vllm/v1/worker/gpu/model_states/encoder_only.py", + "sha256": "84e96b55a2639e2a73fa4a0308acc89c8d053dc715481180b237e0196dcef99f" + }, + "vllm/v1/worker/gpu/model_states/interface.py": { + "path": "/vllm/v1/worker/gpu/model_states/interface.py", + "sha256": "5675b6fedc7403a9ab410b1e5565974e78fac23c42ab4253ae1da52d6e09b594" + }, + "vllm/v1/worker/gpu/model_states/mamba_hybrid.py": { + "path": "/vllm/v1/worker/gpu/model_states/mamba_hybrid.py", + "sha256": "573e130ac5587d4822fabf97adad1ad0fda02ff83c5e70df879a5bb175ae845c" + }, + "vllm/v1/worker/gpu/model_states/mm_pruning.py": { + "path": "/vllm/v1/worker/gpu/model_states/mm_pruning.py", + "sha256": "b150940b12ae76048f050a8eeb54d532bbdc530a18ffbf320ddeeb0cfaa90f93" + }, + "vllm/v1/worker/gpu/model_states/prompt_embeds.py": { + "path": "/vllm/v1/worker/gpu/model_states/prompt_embeds.py", + "sha256": "11f9e270925c2df6a505557605ac2b859bb145cf3420b0111e7482a1c544f9b1" + }, + "vllm/v1/worker/gpu/model_states/recoverssm.py": { + "path": "/vllm/v1/worker/gpu/model_states/recoverssm.py", + "sha256": "b4b660e62eaf33f4fe8271f83ed1fb6de6bc08f800a8073b27803e42fb29a645" + }, + "vllm/v1/worker/gpu/pcp_manager.py": { + "path": "/vllm/v1/worker/gpu/pcp_manager.py", + "sha256": "2d80df0ed5b18a2069f9d0689cb59923ffe324ba200fcafe242da23da3a6ddaa" + }, + "vllm/v1/worker/gpu/pool/__init__.py": { + "path": "/vllm/v1/worker/gpu/pool/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/pool/pooling_runner.py": { + "path": "/vllm/v1/worker/gpu/pool/pooling_runner.py", + "sha256": "f8463f7648cce0f3f29418a4d9fee61634ead760957cf236d06d61cf8cd986e7" + }, + "vllm/v1/worker/gpu/pp_utils.py": { + "path": "/vllm/v1/worker/gpu/pp_utils.py", + "sha256": "dadeef0bebf61d0ad44a28d06372208ec4e6389224d6017f412683b026bdbb5c" + }, + "vllm/v1/worker/gpu/sample/__init__.py": { + "path": "/vllm/v1/worker/gpu/sample/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/sample/bad_words.py": { + "path": "/vllm/v1/worker/gpu/sample/bad_words.py", + "sha256": "8d3cbd5613398260314d94739d8ee0e1ac0c22abf2f960f541d3c0d4e39d360b" + }, + "vllm/v1/worker/gpu/sample/batch_shard.py": { + "path": "/vllm/v1/worker/gpu/sample/batch_shard.py", + "sha256": "c30274a3a04e6a03e89be9cd7c62de602b1aba4d412f64540ab6201036de3928" + }, + "vllm/v1/worker/gpu/sample/gumbel.py": { + "path": "/vllm/v1/worker/gpu/sample/gumbel.py", + "sha256": "3ec1df510bdad13e8b0a457b5b67c98affdf6e57369e56cb471246cc8f40dd34" + }, + "vllm/v1/worker/gpu/sample/logit_bias.py": { + "path": "/vllm/v1/worker/gpu/sample/logit_bias.py", + "sha256": "9e80a3fe6f3c7474723408cfff52183f4585fdeedd9c2312843ee98d0b12724c" + }, + "vllm/v1/worker/gpu/sample/logprob.py": { + "path": "/vllm/v1/worker/gpu/sample/logprob.py", + "sha256": "f47479a818192acb6b297c79fa67a3b2f9820e3492a394d5adda777e9b7c832e" + }, + "vllm/v1/worker/gpu/sample/min_p.py": { + "path": "/vllm/v1/worker/gpu/sample/min_p.py", + "sha256": "4cb5e2f45e1ced6f9685283a7a5c8cfd7204d9a249822e866cfff756c7f04f62" + }, + "vllm/v1/worker/gpu/sample/output.py": { + "path": "/vllm/v1/worker/gpu/sample/output.py", + "sha256": "d6e298c0f197d487a8faaf7200f500fa83df1d7a4bbf4339cadd6a18008f7f9c" + }, + "vllm/v1/worker/gpu/sample/penalties.py": { + "path": "/vllm/v1/worker/gpu/sample/penalties.py", + "sha256": "46c29434caf5f415129ef4a9bb2b8d4f62d2765596e3e07f73ad2b198c7def1b" + }, + "vllm/v1/worker/gpu/sample/prompt_logprob.py": { + "path": "/vllm/v1/worker/gpu/sample/prompt_logprob.py", + "sha256": "4cf22d390e7bf59e44c458cff7180268db63e95d06af2f1e14d720a2d77c9663" + }, + "vllm/v1/worker/gpu/sample/sampler.py": { + "path": "/vllm/v1/worker/gpu/sample/sampler.py", + "sha256": "832c9945d201a1e730ff9b4b52076aa83bd4a5064e1e4cfea952cf84d4a8d1f0" + }, + "vllm/v1/worker/gpu/sample/states.py": { + "path": "/vllm/v1/worker/gpu/sample/states.py", + "sha256": "4e3671f93695ba5a48fad7d2d13beb231ac8741034904ed5a15d9f7b9b86662e" + }, + "vllm/v1/worker/gpu/sample/thinking_budget.py": { + "path": "/vllm/v1/worker/gpu/sample/thinking_budget.py", + "sha256": "020513e1d3406f367de6ad995a95055008fd0c28f2873647e8283c9870e22404" + }, + "vllm/v1/worker/gpu/sample/trace_replay.py": { + "path": "/vllm/v1/worker/gpu/sample/trace_replay.py", + "sha256": "d2a7d3b3b55379efabe4740a4b7f14030126dc11be36f6ea974164ce42316a50" + }, + "vllm/v1/worker/gpu/sample/watermark.py": { + "path": "/vllm/v1/worker/gpu/sample/watermark.py", + "sha256": "a3581458169dab9153eb09fd67218e0ee5585406537a9de80ad528ae62b030c0" + }, + "vllm/v1/worker/gpu/shutdown.py": { + "path": "/vllm/v1/worker/gpu/shutdown.py", + "sha256": "bb470f14b17c7e52571ef8938b2a9527e7c2846852ae8a3a94b69cd1c30aa4b1" + }, + "vllm/v1/worker/gpu/spec_decode/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/__init__.py", + "sha256": "1f1f84bfe6f4f5af3a7e21a7a8716ecf7b9013da1d03327668a3ee36afc24c32" + }, + "vllm/v1/worker/gpu/spec_decode/acceptance_estimator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/acceptance_estimator.py", + "sha256": "505b843bdd75928b03793b395b47b8be914bd7fe2a3351c8ec04339baeebb1c2" + }, + "vllm/v1/worker/gpu/spec_decode/adaptive_verification.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/adaptive_verification.py", + "sha256": "276b2fec56758a94c71b717f6786b8a6f126db2e20cf964350202feee61a0a39" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py", + "sha256": "13392ef0a9ed59eb9c2b2bad43d7c61beb212a8805849e46b5130c230275d0a5" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/speculator.py", + "sha256": "5b97f54e20ddf65b98e939832d050745f67ef43cfa145786da300f1a8322e3c6" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/cudagraph.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/cudagraph.py", + "sha256": "beab567ae2df6a2ba2cd92fe7ee452c6b959b8a7037a4b5f493993a1824619bb" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/speculator.py", + "sha256": "f9c100f42f9326e48eb84e89281897e859ba761943f54d593523555ccd98dc63" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/utils.py", + "sha256": "53d2c3ad474d290d2c6df027446bbd80ac7447684e5242ab2c3c5337d2abd383" + }, + "vllm/v1/worker/gpu/spec_decode/dflash2/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash2/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/dflash2/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash2/speculator.py", + "sha256": "b70043550938a1df9aecc85d8c8224c38c929ca34f68834572f6e723854d2027" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/speculator.py", + "sha256": "dcf4abdedbd2bddd0d76be198ccf5b4e467c46f645038c35fcab821491a35b03" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/utils.py", + "sha256": "86af2bf30604a184312e8f076097b91ecfec704f409f9d68d634b03d6b318070" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/eagle3_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/eagle3_utils.py", + "sha256": "201ee875fcc3d076a8fc1f3876dcbf85736b221a368555243a8987ff26a1674e" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/speculator.py", + "sha256": "746e318a4f266d75522ff7f3731ea9b4527b7b4824f71364d1a62184ea1f7b3d" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/utils.py", + "sha256": "94de6f55a1761f24f4aa1388cbc3b3763d4ab3ee53260330056ad31ce0b78236" + }, + "vllm/v1/worker/gpu/spec_decode/extract_hidden_states.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/extract_hidden_states.py", + "sha256": "93c4233be7b2d2290b33902ea9b3bb5274c11701830851d03967a22144536e2d" + }, + "vllm/v1/worker/gpu/spec_decode/gemma4/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/gemma4/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/gemma4/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/gemma4/speculator.py", + "sha256": "9991210d7babd2caf2cd10797ca8688543dedeafbc3b86bc7c979c1a6ae9f949" + }, + "vllm/v1/worker/gpu/spec_decode/mtp/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/mtp/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/mtp/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/mtp/speculator.py", + "sha256": "926d6c9ffdb368c971647911a60493820d056ce236fcae9d94a42fa2e006255d" + }, + "vllm/v1/worker/gpu/spec_decode/multi_module_mtp/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/multi_module_mtp/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/multi_module_mtp/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/multi_module_mtp/speculator.py", + "sha256": "d9d4735b9b33829332b0e845b6d3073b2f0436045ed693b25c6434f351644127" + }, + "vllm/v1/worker/gpu/spec_decode/rejection_sampler.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/rejection_sampler.py", + "sha256": "030db5bfca162cc1f305112f299de5d6d61c59d3ed0807fee46575441ca4086d" + }, + "vllm/v1/worker/gpu/spec_decode/rejection_sampler_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/rejection_sampler_utils.py", + "sha256": "214b61fa0abe88573beb779872c035b3954e5651a85bd438d99ee5905d3a62ec" + }, + "vllm/v1/worker/gpu/spec_decode/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/speculator.py", + "sha256": "3a1ab15bf8b20918852eb835fe9755046e99dcbac6ba6ca3d414949fc8bc695a" + }, + "vllm/v1/worker/gpu/spec_decode/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/utils.py", + "sha256": "282f2929eddae9ca7312269f799be07472334b6df9fd91878b5e839ec05e418c" + }, + "vllm/v1/worker/gpu/states.py": { + "path": "/vllm/v1/worker/gpu/states.py", + "sha256": "99418f5df43ca612ded72609fee011620b065b2cab2f249ccb387096bf4ae71a" + }, + "vllm/v1/worker/gpu/structured_outputs.py": { + "path": "/vllm/v1/worker/gpu/structured_outputs.py", + "sha256": "18a10532db7e66b55e334acacd1fd989ad6361adf31dd0de9a9a65e23db25951" + }, + "vllm/v1/worker/gpu/ubatch_utils.py": { + "path": "/vllm/v1/worker/gpu/ubatch_utils.py", + "sha256": "5092e2e58af0561c8dc12e62847cfc6dda9ca20dfbd33e7f0cd77a83fe87f7c5" + }, + "vllm/v1/worker/gpu/warmup.py": { + "path": "/vllm/v1/worker/gpu/warmup.py", + "sha256": "423ac32d58fe008c228cfa223e4fcebfcf87e3463a9dbdf80a083c0578d73723" + }, + "vllm/v1/worker/gpu_input_batch.py": { + "path": "/vllm/v1/worker/gpu_input_batch.py", + "sha256": "18cf455c9d0eea61cc581c7932f2e6cd09786914e82dd35eef1c1430da359a0f" + }, + "vllm/v1/worker/gpu_model_runner.py": { + "path": "/vllm/v1/worker/gpu_model_runner.py", + "sha256": "87c29d08c0bbf66993d8b984811e7325e35e6436242a773feb55ec88f16b2c51" + }, + "vllm/v1/worker/gpu_ubatch_wrapper.py": { + "path": "/vllm/v1/worker/gpu_ubatch_wrapper.py", + "sha256": "4233cfbe8c9884b042c4363890108f616483b694ebe9a6e69578dcf89c6dac5c" + }, + "vllm/v1/worker/gpu_worker.py": { + "path": "/vllm/v1/worker/gpu_worker.py", + "sha256": "6994436e4547c0996ab555b3e814e8ccea26b650dfc1b378b97d640745309347" + }, + "vllm/v1/worker/kv_connector_model_runner_mixin.py": { + "path": "/vllm/v1/worker/kv_connector_model_runner_mixin.py", + "sha256": "e1cc76d065a7e60aacddb190ae795a480b65cd02ba71a1fc699a02a85c1a3de2" + }, + "vllm/v1/worker/lora_model_runner_mixin.py": { + "path": "/vllm/v1/worker/lora_model_runner_mixin.py", + "sha256": "fef6092a15d8d37f6fa22495e6106e2e5280180908d61ce43d9ff5bf4eef3f2f" + }, + "vllm/v1/worker/mamba_utils.py": { + "path": "/vllm/v1/worker/mamba_utils.py", + "sha256": "23fdaa4e8f63ee8f938eaa1a2b39f803cb04fa6ecd69789563254b1a0691413a" + }, + "vllm/v1/worker/mm_encoder_model_runner.py": { + "path": "/vllm/v1/worker/mm_encoder_model_runner.py", + "sha256": "780c41be84ad022205c21c1decb6bb8d5afb03bc7be120c1f7df03b710acc3d7" + }, + "vllm/v1/worker/sentinel/__init__.py": { + "path": "/vllm/v1/worker/sentinel/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/sentinel/gpu_worker_sentinel.py": { + "path": "/vllm/v1/worker/sentinel/gpu_worker_sentinel.py", + "sha256": "3959b8619d052c5dd247815074e03ec21ec9b43cc424ff2d296abc19b227b852" + }, + "vllm/v1/worker/startup_plan.py": { + "path": "/vllm/v1/worker/startup_plan.py", + "sha256": "84bcbb4f7a9fd7c8d10c9c895aadd9673d44c767b9132368d11eb5e017afe86b" + }, + "vllm/v1/worker/ubatch_utils.py": { + "path": "/vllm/v1/worker/ubatch_utils.py", + "sha256": "b34dce551b5195c414e6a3a997c75961cc7a17f24c7c980487fe3d3e2ba7a798" + }, + "vllm/v1/worker/ubatching.py": { + "path": "/vllm/v1/worker/ubatching.py", + "sha256": "40391241c564feb5f16c77898ae6ae152ed6e71a4682e2a406387785d8de02d7" + }, + "vllm/v1/worker/utils.py": { + "path": "/vllm/v1/worker/utils.py", + "sha256": "0ca3ec6bf4d20076145b7fe64e564962adebedc8f75a856b517ba0b2f2d77acf" + }, + "vllm/v1/worker/worker_base.py": { + "path": "/vllm/v1/worker/worker_base.py", + "sha256": "4a1a5266b912fe97991d8dc89d92b923990da9f6cb4b817d00d52e9c0d26dd7c" + }, + "vllm/v1/worker/workspace.py": { + "path": "/vllm/v1/worker/workspace.py", + "sha256": "d21c08167d1d0d1c0cddaa80453a53a0b4dec5d81b5a537c94a21324344976b3" + }, + "vllm/v1/worker/xpu_model_runner.py": { + "path": "/vllm/v1/worker/xpu_model_runner.py", + "sha256": "07fa0390d28f2b8c3c3c0019eb9c3b126e2397aea268ba47c889f06b423deb23" + }, + "vllm/v1/worker/xpu_worker.py": { + "path": "/vllm/v1/worker/xpu_worker.py", + "sha256": "711b56432506b58041cd86e71320c3960413f7bd61061990b66488421d81cfc3" + } + }, + "prefix": "", + "pth": { + "/__editable__.megatron_core-0.16.0rc0.pth": "d55c9b64480b34aae3d4d31e7706b93391c969dec6e0498e50963b03445a57b0", + "/__editable__.rl_kernel-0.1.0.pth": "1454c4987b35762a0d189d4e901c5d077fde62a1944fbaabecea230e57f3923a", + "/__editable__.vime-0.3.2.pth": "77eec5d06d628cb952e65edd813ca88d8db67ccc785083e1b7b29011b92bec4f", + "/distutils-precedence.pth": "2638ce9e2500e572a5e0de7faed6661eb569d1b696fcba07b0dd223da5f5d224", + "/qwen3_next_cuda_runtime.pth": "e0d3ab57dd3ff4f5d55fcf76e83c549cc00b3c813e6f717c540d5ded79fa2f49", + "/qwen3_next_megatron_source.pth": "8556ac057538e82856cb76cbbc954f58312a3f45373daec3eec826031cfd2709", + "/__editable__.rl_kernel-0.1.0.pth": "1454c4987b35762a0d189d4e901c5d077fde62a1944fbaabecea230e57f3923a", + "/distutils-precedence.pth": "2638ce9e2500e572a5e0de7faed6661eb569d1b696fcba07b0dd223da5f5d224", + "/nvidia_cutlass_dsl_packages.pth": "cc710b99ddb3d76361a70461461d274212a979d00c381d821fce5bb3ad9cf246" + }, + "pyvenv_cfg_sha256": "48579f2c6d35c3d535c2690d7d426587c4b8e92021463f0266b38d35dfbbb834", + "sources": { + "/Megatron-LM-training": { + "patch_sha256": "f66035f12501aa1d08e8884e0dea5a22d59825d717aeda73c3e83876e3efd79f", + "path": "/Megatron-LM-training", + "tree": "731fc44a368d6cac8c6171a29d5c687ff0d95bd1" + }, + "/vime": { + "patch_sha256": "66949839d4c18329444f4f9f6dcd702b53ce1b94e9aa15ed111f28743bfaa4b9", + "path": "/vime", + "tree": "f5174e67dbcdaef983eecd45f215fef2d8429dd0" + } + }, + "version": "3.12.14 | packaged by Anaconda, Inc. | (main, Aug 27 2026, 14:46:43) [GCC 14.3.0]" + }, + "sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca" + }, + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "cuda_identity": { + "home": "", + "nvcc_sha256": "b8e2347d9d7fcadf8812a27324d515de99d033d3e48611811ece7e66d7895f8a" + }, + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "operator_requirements": { + "suite": "all", + "case_ids": [ + "tests/check_qwen3_next_attention.py::test_d256_backward_with_cached_prefix_matches_float64_formula", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[1024]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[256]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[64]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[8]", + "tests/check_qwen3_next_attention.py::test_d256_input_device_guard_and_nondefault_stream", + "tests/check_qwen3_next_attention.py::test_native_backward_rejects_malformed_probability_and_gradient_buffers", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[0]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[2]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_target_inputs_do_not_depend_on_companions", + "tests/check_qwen3_next_batch_invariance.py::test_triton_chunked_prefill_is_batch_invariant", + "tests/check_qwen3_next_conv_bridge.py::test_chunked_and_reordered_sequences_match", + "tests/check_qwen3_next_conv_bridge.py::test_empty_sequence_preserves_cache_and_gradients", + "tests/check_qwen3_next_conv_bridge.py::test_response_gradient_reaches_prompt_and_convolution_weight", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths0]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths1]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths2]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-4]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[1]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[4]", + "tests/check_qwen3_next_core_matrix.py::test_variable_lengths_empty_and_mixed_step_match_independent_sequences", + "tests/check_qwen3_next_forward.py::test_combine_has_fixed_route_order_and_differentiable_weights", + "tests/check_qwen3_next_forward.py::test_full_vocabulary_logprob_entropy_modes_and_gradient", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_fail_closed_on_the_tensor_descriptor_path", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[128]", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[512]", + "tests/check_qwen3_next_forward.py::test_logprob_nan_rejected_before_comparison", + "tests/check_qwen3_next_forward.py::test_moe_vjp_matches_independent_double_formula", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[1024-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[128-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-16]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-256]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-3072]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-37984]", + "tests/check_qwen3_next_forward.py::test_qwen_moe_actual_tp4_shapes_and_independent_training_forward", + "tests/check_qwen3_next_forward.py::test_route_weights_are_batch_invariant", + "tests/check_qwen3_next_forward.py::test_shared_linear_vjp_and_empty_tokens", + "tests/check_qwen3_next_forward.py::test_stable_route_tie_boundary_and_router_gradient", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_backward_matches_recomputed_recurrence_vjp", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_forward_is_provider_exact_and_does_not_mutate_inputs", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_keeps_prompt_state_gradient_through_response", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[False]", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[True]", + "tests/check_qwen3_next_gdn_bridge.py::test_initial_state_vjp_matches_provider_directional_difference", + "tests/check_qwen3_next_gdn_sequence.py::test_1024_token_chunk_continuation_is_bitwise_exact", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad0]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad1]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad2]", + "tests/check_qwen3_next_gdn_sequence.py::test_chunk_boundary_retains_prompt_and_initial_state_gradients", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths0]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths1]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths2]", + "tests/check_qwen3_next_gdn_sequence.py::test_reserved_and_duplicate_slots_are_rejected", + "tests/check_qwen3_next_norm_providers.py::test_custom_op_has_distinct_native_and_cuda_paths", + "tests/check_qwen3_next_norm_providers.py::test_gdn_decode_provider_env_defaults_are_recorded", + "tests/check_qwen3_next_norm_providers.py::test_our_gated_op_is_batch_invariant", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_cuda]", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_native]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots0]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots2]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots3]", + "tests/check_qwen3_next_shared_core.py::test_independent_training_forward_matches_inference_and_retains_gradients", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[1024]", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[8]", + "tests/check_qwen3_next_shared_core.py::test_unimplemented_provider_profile_is_rejected", + "tests/test_qwen3_next_norm.py::test_bad_weight_shape_raises", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[16]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[1]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[2]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[32]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[48]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[64]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[8]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[128]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[2048]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_with_padding", + "tests/test_qwen3_next_norm.py::test_call_matches_forward", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[128]", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[2048]", + "tests/test_qwen3_next_norm.py::test_cuda_default_offset_preserves_plain_convention", + "tests/test_qwen3_next_norm.py::test_cuda_gated_backward_matches_autograd_golden", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_matches_golden_within_contract", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_bad_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_mismatched_gate", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_backward_uses_the_sigmoid_derivative", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_swish_is_an_alias_for_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_unit_weight_is_plain_norm_times_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_weight_offset_is_applied_in_fp32", + "tests/test_qwen3_next_norm.py::test_cuda_gated_wrapper_rejects_equal_numel_wrong_shape", + "tests/test_qwen3_next_norm.py::test_cuda_gated_zero_gate_zeroes_output", + "tests/test_qwen3_next_norm.py::test_cuda_offset_equals_explicit_fp32_weight", + "tests/test_qwen3_next_norm.py::test_cuda_offset_is_not_folded_through_bfloat16", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_backward_is_offset_aware", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_within_tolerance_of_golden", + "tests/test_qwen3_next_norm.py::test_deterministic_repeat", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype0]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype1]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype2]", + "tests/test_qwen3_next_norm.py::test_eps_inside_sqrt", + "tests/test_qwen3_next_norm.py::test_gated_batch_invariance_slice", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedHFOp]", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedOp]", + "tests/test_qwen3_next_norm.py::test_gated_conventions_diverge_in_low_precision", + "tests/test_qwen3_next_norm.py::test_gated_cuda_op_rejects_bad_activation_at_construction", + "tests/test_qwen3_next_norm.py::test_gated_extension_handles_empty_batch_and_nondefault_stream", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[dy_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[gate_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[rstd_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_shape]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_matches_hf_formula_fp32", + "tests/test_qwen3_next_norm.py::test_gated_shape_mismatch_raises", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_strict_matches_vllm_formula_fp32", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[128]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[2048]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_offset_applied_in_fp32_not_folded_into_bf16", + "tests/test_qwen3_next_norm.py::test_op_batch_invariance_on_device", + "tests/test_qwen3_next_norm.py::test_plain_reference_is_unchanged_by_the_offset_plumbing", + "tests/test_qwen3_next_norm.py::test_weight_offset_is_one", + "tests/test_qwen3_next_norm.py::test_zero_centred_cuda_constructor_rejects_missing_extension", + "tests/test_qwen3_next_norm.py::test_zero_centred_op_inherits_the_plain_reference", + "tests/test_qwen3_next_norm.py::test_zero_weight_is_identity_scaling" + ], + "case_ids_sha256": "694c931b65f9cfa5db963f2eca6d11bd309546c824a1df52f9da2ab128e83e0f", + "norm_gates": [ + "qwen3_next_rms_norm-forward.json", + "qwen3_next_rms_norm-gradient.json", + "rms_norm_gated-forward.json", + "rms_norm_gated-gradient.json" + ] + }, + "layer_requirements": { + "schema_version": 1, + "gates": { + "gdn": { + "script": "scripts/qwen3_next_tp_gdn_check.py", + "output_option": "--output", + "scope": "tp4_gdn_layer0", + "groups": { + "cases": [ + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "prompt-gradient", + "replicated-norm-gradient", + "hf-load-export" + ] + }, + "script_sha256": "cc4338893f90af004c51c20fc67d1a9a3f4bf8d26775277f72671c02983e4df5" + }, + "attention": { + "script": "scripts/qwen3_next_tp_attention_check.py", + "output_option": "--output", + "scope": "tp4_full_attention_layer3", + "groups": { + "attention.cases": [ + "hf-load-export", + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "batch4-varlen-reorder", + "sixteen-token-decode", + "prompt-gradient", + "kv-pair-gradient", + "qk-norm-gradient" + ] + }, + "script_sha256": "d27d43efb05415a8ef5892c3c2238a2b9744a4821f5466faf46c6510e6e01bec" + }, + "moe": { + "script": "scripts/qwen3_next_tp_moe_check.py", + "output_option": "--output", + "scope": "tp4_moe_block_layer0", + "groups": { + "moe.cases": [ + "hf-load-export-all512experts", + "routes-replicated-8", + "full-chunk-reorder-8", + "routes-replicated-64", + "full-chunk-reorder-64", + "routes-replicated-256", + "full-chunk-reorder-256", + "routes-replicated-1024", + "full-chunk-reorder-1024", + "training-forward", + "all-parameter-gradient", + "replicated-router-gradient" + ] + }, + "script_sha256": "d5c1bbbb82e408b65871b0cb1638d7a6cf8cfe07f0a3315a657b7dc232d544be" + }, + "adapters": { + "script": "scripts/qwen3_next_adapter_check.py", + "output_option": "--out", + "scope": "gdn_engine_adapter_component", + "groups": { + "cases": [ + "batch1-length8", + "batch1-length64", + "batch1-length256", + "batch1-length1024", + "batch4-length8", + "batch4-length64", + "batch4-length256", + "batch4-length1024", + "mixed-prefill-decode16-reorder" + ] + }, + "fields": { + "prompt_gradient": "passed", + "hf_conv_roundtrip": "passed", + "batch_invariance_capability_registered": false + }, + "script_sha256": "3ce45bb317237c1a06533116d65fb77c2a23b6f503ae46406ede543036eb0f20" + }, + "heads": { + "script": "scripts/qwen3_next_tp_head_check.py", + "output_option": "--output", + "scope": "tp4_embedding_lm_head_only", + "groups": { + "cases": [ + "hf-embedding-roundtrip", + "hf-lm-head-roundtrip", + "replicated-norm-gradient", + "nonzero-finite-embedding-head-gradient", + "embedding-repeat-100", + "batch-invariant-prompt8", + "batch-invariant-prompt64", + "batch-invariant-prompt256", + "batch-invariant-prompt1024", + "logprob-original-and-promoted-logits", + "entropy-interface" + ] + }, + "script_sha256": "0504185d21a75405c8e994bc57b016cf4ec357d8b16e7430772c11934f2af876" + } + }, + "scheduler_case_ids": [ + "p0008-b1-full", + "p0008-b1-chunked", + "p0008-b4-full", + "p0008-b4-chunked", + "p0064-b1-full", + "p0064-b1-chunked", + "p0064-b4-full", + "p0064-b4-chunked", + "p0256-b1-full", + "p0256-b1-chunked", + "p0256-b4-full", + "p0256-b4-chunked", + "p1024-b1-full", + "p1024-b1-chunked", + "p1024-b4-full", + "p1024-b4-chunked" + ], + "registry_sha256": "e3949a750cb27c1897a000f3b023f912629906612ae8949c1575d0acc36df5ec", + "case_ids_per_rank": [ + "adapters/cases/batch1-length1024", + "adapters/cases/batch1-length256", + "adapters/cases/batch1-length64", + "adapters/cases/batch1-length8", + "adapters/cases/batch4-length1024", + "adapters/cases/batch4-length256", + "adapters/cases/batch4-length64", + "adapters/cases/batch4-length8", + "adapters/cases/mixed-prefill-decode16-reorder", + "attention/attention.cases/batch4-varlen-reorder", + "attention/attention.cases/full-chunk-1024", + "attention/attention.cases/full-chunk-256", + "attention/attention.cases/full-chunk-64", + "attention/attention.cases/full-chunk-8", + "attention/attention.cases/hf-load-export", + "attention/attention.cases/kv-pair-gradient", + "attention/attention.cases/prompt-gradient", + "attention/attention.cases/qk-norm-gradient", + "attention/attention.cases/sixteen-token-decode", + "gdn/cases/full-chunk-1024", + "gdn/cases/full-chunk-256", + "gdn/cases/full-chunk-64", + "gdn/cases/full-chunk-8", + "gdn/cases/hf-load-export", + "gdn/cases/prompt-gradient", + "gdn/cases/replicated-norm-gradient", + "heads/cases/batch-invariant-prompt1024", + "heads/cases/batch-invariant-prompt256", + "heads/cases/batch-invariant-prompt64", + "heads/cases/batch-invariant-prompt8", + "heads/cases/embedding-repeat-100", + "heads/cases/entropy-interface", + "heads/cases/hf-embedding-roundtrip", + "heads/cases/hf-lm-head-roundtrip", + "heads/cases/logprob-original-and-promoted-logits", + "heads/cases/nonzero-finite-embedding-head-gradient", + "heads/cases/replicated-norm-gradient", + "moe/moe.cases/all-parameter-gradient", + "moe/moe.cases/full-chunk-reorder-1024", + "moe/moe.cases/full-chunk-reorder-256", + "moe/moe.cases/full-chunk-reorder-64", + "moe/moe.cases/full-chunk-reorder-8", + "moe/moe.cases/hf-load-export-all512experts", + "moe/moe.cases/replicated-router-gradient", + "moe/moe.cases/routes-replicated-1024", + "moe/moe.cases/routes-replicated-256", + "moe/moe.cases/routes-replicated-64", + "moe/moe.cases/routes-replicated-8", + "moe/moe.cases/training-forward" + ], + "case_ids_sha256": "be74417dfbd6031ba27978d06d04bb15daaab2aeb57d132c7e0d41176b28b46e" + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + } +} diff --git a/docs/usage/evidence/qwen3-next-batch-invariance-b200/preflight/tp4.json b/docs/usage/evidence/qwen3-next-batch-invariance-b200/preflight/tp4.json new file mode 100644 index 000000000..38447a87b --- /dev/null +++ b/docs/usage/evidence/qwen3-next-batch-invariance-b200/preflight/tp4.json @@ -0,0 +1,49 @@ +{ + "status": "passed", + "ranks": [ + { + "status": "passed", + "rank": 0, + "world_size": 4, + "device": "NVIDIA B200", + "nccl": [ + 2, + 29, + 7 + ] + }, + { + "status": "passed", + "rank": 1, + "world_size": 4, + "device": "NVIDIA B200", + "nccl": [ + 2, + 29, + 7 + ] + }, + { + "status": "passed", + "rank": 2, + "world_size": 4, + "device": "NVIDIA B200", + "nccl": [ + 2, + 29, + 7 + ] + }, + { + "status": "passed", + "rank": 3, + "world_size": 4, + "device": "NVIDIA B200", + "nccl": [ + 2, + 29, + 7 + ] + } + ] +} diff --git a/docs/usage/evidence/qwen3-next-batch-invariance-b200/redaction.json b/docs/usage/evidence/qwen3-next-batch-invariance-b200/redaction.json new file mode 100644 index 000000000..b2e471edd --- /dev/null +++ b/docs/usage/evidence/qwen3-next-batch-invariance-b200/redaction.json @@ -0,0 +1,14 @@ +{ + "placeholders": { + "": 12, + "": 8, + "": 12, + "": 4529, + "": 1, + "": 63, + "": 12, + "": 56, + "": 84, + "": 4557 + } +} From c58816bf54940195b543beda14e0de65a71182c6 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Fri, 9 Oct 2026 19:49:38 +0000 Subject: [PATCH 55/70] test(qwen3-next): measure Megatron-core/TE and SGLang in the MoE prior-art runner - Megatron-core 0.16 MoELayer with Transformer Engine grouped GEMM and fused permute, configured as VIME runs Qwen3-Next (FP32 softmax router, top-10, all-to-all dispatcher), including its backward. - SGLang 0.5.21 Triton fused_moe in default and deterministic-inference mode. sgl_kernel cannot load next to torch 2.13, so its two kernels on this path are replaced by SGLang's own Triton moe_sum_reduce and JIT moe_align_block_size; any other sgl_kernel call fails loudly. - --only and --merge combine reports from different Python environments. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- rl_engine/testing/qwen3_next_moe_prior_art.py | 264 +++++++++++++++++- scripts/plot_qwen3_next_moe_prior_art.py | 5 +- scripts/qwen3_next_moe_prior_art.py | 31 +- 3 files changed, 290 insertions(+), 10 deletions(-) diff --git a/rl_engine/testing/qwen3_next_moe_prior_art.py b/rl_engine/testing/qwen3_next_moe_prior_art.py index d8ad92234..90ed6dea3 100644 --- a/rl_engine/testing/qwen3_next_moe_prior_art.py +++ b/rl_engine/testing/qwen3_next_moe_prior_art.py @@ -298,6 +298,224 @@ def fwd(x): } +def _megatron_layer(w): + """Megatron-core MoELayer configured as VIME runs Qwen3-Next. + + VIME's ``scripts/models/qwen3-next-80B-A3B.sh``: + + Softmax router computed in FP32, top-10 of 512, all-to-all dispatcher, TE + grouped GEMM and TE fused permute, no auxiliary loss. Single process, TP1/EP1. + """ + import os + + import torch.distributed as dist + from megatron.core import parallel_state + from megatron.core.models.gpt.moe_module_specs import get_moe_module_spec + from megatron.core.tensor_parallel.random import model_parallel_cuda_manual_seed + from megatron.core.transformer.spec_utils import build_module + from megatron.core.transformer.transformer_config import TransformerConfig + + if not dist.is_initialized(): + os.environ.setdefault("MASTER_ADDR", "127.0.0.1") + os.environ.setdefault("MASTER_PORT", "29531") + device = torch.device("cuda", torch.cuda.current_device()) + dist.init_process_group("nccl", rank=0, world_size=1, device_id=device) + if not parallel_state.model_parallel_is_initialized(): + parallel_state.initialize_model_parallel(1, 1) + model_parallel_cuda_manual_seed(0) + config = TransformerConfig( + num_layers=1, + hidden_size=HIDDEN, + num_attention_heads=16, + ffn_hidden_size=WIDTH, + moe_ffn_hidden_size=WIDTH, + num_moe_experts=EXPERTS, + moe_router_topk=TOPK, + moe_router_score_function="softmax", + moe_router_dtype="fp32", + moe_token_dispatcher_type="alltoall", + moe_grouped_gemm=True, + moe_permute_fusion=True, + moe_aux_loss_coeff=0.0, + moe_router_load_balancing_type="none", + add_bias_linear=False, + gated_linear_unit=True, + activation_func=F.silu, + bf16=True, + params_dtype=torch.bfloat16, + ) + spec = get_moe_module_spec(use_te=True, num_experts=EXPERTS, moe_grouped_gemm=True) + layer = build_module(spec, config=config).cuda() + with torch.no_grad(): + layer.router.weight.copy_(w["router"]) + for expert in range(EXPERTS): + getattr(layer.experts.linear_fc1, f"weight{expert}").copy_(w["gate_up"][expert]) + getattr(layer.experts.linear_fc2, f"weight{expert}").copy_(w["down"][expert]) + return layer + + +def _megatron(w): + import megatron.core + import transformer_engine + + layer = _megatron_layer(w) + gate_up = [getattr(layer.experts.linear_fc1, f"weight{e}") for e in range(EXPERTS)] + down = [getattr(layer.experts.linear_fc2, f"weight{e}") for e in range(EXPERTS)] + + def route(x): + with torch.no_grad(): + probs, routing_map = layer.router(x) + weights, ids = probs.topk(TOPK, dim=-1) + if not bool(routing_map.gather(1, ids).all()): + raise RuntimeError("Megatron routing map disagrees with its routed probabilities") + return ids, weights + + def call(x): + return layer(x.unsqueeze(1))[0].squeeze(1) + + def fwd(x): + with torch.no_grad(): + return call(x) + + def grads(x, dy): + leaf = x.detach().clone().requires_grad_(True) + dx, *dw = torch.autograd.grad(call(leaf), [leaf, *gate_up, *down], dy) + return dx, torch.stack(dw[:EXPERTS]), torch.stack(dw[EXPERTS:]) + + return { + "name": "Megatron-core MoELayer + TE grouped GEMM (VIME's Qwen3-Next config)", + "source": f"megatron-core {megatron.core.__version__}, " + f"transformer-engine {transformer_engine.__version__}", + "route": route, + "fwd": fwd, + "grads": grads, + } + + +def _sglang_shims(): + """Make SGLang's Triton MoE path importable next to torch 2.13. + + ``sgl_kernel`` 0.3.21 is built against another libtorch ABI and cannot load + here. On CUDA, SGLang's Triton MoE calls two of its kernels; both are + replaced by SGLang's own implementations of the same operation: the Triton + ``moe_sum_reduce_triton`` and the JIT ``moe_align_block_size`` that SGLang + registers with the same signature. Every other ``sgl_kernel`` symbol only + has to import; calling one raises. + """ + import importlib.abc + import importlib.machinery + import sys + import types + + class Missing: + def __init__(self, name): + self.name = name + + def __getattr__(self, name): + if name.startswith("__"): + raise AttributeError(name) + return Missing(f"{self.name}.{name}") + + def __call__(self, *args, **kwargs): + raise RuntimeError(f"{self.name} called, but sgl_kernel cannot load next to torch 2.13") + + class Stub(types.ModuleType): + def __getattr__(self, name): + if name.startswith("__"): + raise AttributeError(name) + return Missing(f"{self.__name__}.{name}") + + class Finder(importlib.abc.MetaPathFinder, importlib.abc.Loader): + def find_spec(self, name, path=None, target=None): + if name in ("sgl_kernel", "gguf") or name.startswith("sgl_kernel."): + return importlib.machinery.ModuleSpec(name, self, is_package=True) + + def create_module(self, spec): + module = Stub(spec.name) + module.__path__ = [] + return module + + def exec_module(self, module): + pass + + if not any(type(f).__name__ == "Finder" for f in sys.meta_path): + sys.meta_path.insert(0, Finder()) + import sgl_kernel + import sglang.kernels.ops.moe as moe_ops + from sglang.kernels.ops.moe.fused_moe_triton_kernels import moe_sum_reduce_triton + from sglang.kernels.spec import KernelBackend + + sgl_kernel.moe_sum_reduce = moe_sum_reduce_triton + lookup = moe_ops.get_kernel + moe_ops.get_kernel = lambda op, backend: lookup( + op, KernelBackend.JIT if op == "moe.moe_align_block_size" else backend + ) + + +def _sglang(w, deterministic: bool): + import sglang + + _sglang_shims() + from sglang.srt.layers.moe.moe_runner.base import MoeRunnerConfig + from sglang.srt.layers.moe.moe_runner.triton_utils import fused_moe as fm + from sglang.srt.layers.moe.moe_runner.triton_utils import fused_moe_triton_config as fc + from sglang.srt.layers.moe.topk import StandardTopKOutput, fused_topk_torch_native + + class Bag: + def __init__(self, **values): + self.__dict__.update(values) + + def __getattr__(self, name): + return False + + # SGLang reads these switches from its published server config; publishing + # needs a full server (and sgl_kernel). Only the deterministic switch matters. + settings = Bag(deterministic=Bag(enable_deterministic_inference=deterministic), moe=Bag()) + from sglang.srt.batch_invariant_ops import batch_invariant_ops as bio + + def linear(x, weight): + # Deterministic mode: what enable_batch_invariant_mode() installs for aten::mm, + # called directly so the override does not leak into other candidates. + return bio.mm_batch_invariant(x, weight.t()) if deterministic else F.linear(x, weight) + + config = MoeRunnerConfig( + num_experts=EXPERTS, + num_local_experts=EXPERTS, + hidden_size=HIDDEN, + intermediate_size_per_partition=WIDTH, + top_k=TOPK, + params_dtype=torch.bfloat16, + inplace=False, + ) + + def set_mode(): + fm.get_exec = fc.get_exec = lambda: settings + fm.is_batch_invariant_mode_enabled = lambda: deterministic + # One process, no TP group: symmetric memory is disabled, the group unused. + fm.get_parallel = lambda: Bag(tp_group=None) + fm.is_allocation_symmetric = lambda: False + + def route(x): + set_mode() + logits = linear(x, w["router"]) + weights, ids = fused_topk_torch_native(x, logits, TOPK, renormalize=True)[:2] + return ids.long(), weights + + def fwd(x): + with torch.no_grad(): + ids, weights = route(x) + topk = StandardTopKOutput(weights, ids.int(), None) + return fm.fused_experts(x, w["gate_up"], w["down"], topk, config) + + mode = "deterministic inference" if deterministic else "default" + return { + "name": f"SGLang fused_moe (Triton), {mode}", + "source": f"sglang {sglang.__version__} moe_runner/triton_utils", + "route": route, + "fwd": fwd, + } + + def candidates(w) -> list[dict[str, Any]]: return [ _guard("rl_kernel_cuda", lambda: _rl_kernel(w)), @@ -305,6 +523,9 @@ def candidates(w) -> list[dict[str, Any]]: _guard("vllm_bi0", lambda: _vllm(w, False)), _guard("vllm_bi1", lambda: _vllm(w, True)), _guard("flashinfer_cutlass", lambda: _flashinfer(w)), + _guard("megatron_te", lambda: _megatron(w)), + _guard("sglang_triton", lambda: _sglang(w, False)), + _guard("sglang_deterministic", lambda: _sglang(w, True)), ] @@ -338,14 +559,25 @@ def _rows_bi(fn, x) -> dict[str, bool]: return result +def has_backward(cand) -> bool: + return "graph" in cand or "grads" in cand + + +def cand_grads(cand, rows, dy_rows): + """``(dx, d gate_up, d down)`` of one backward.""" + if "grads" in cand: + return cand["grads"](rows, dy_rows) + y, leaves = cand["graph"](rows) + return torch.autograd.grad(y, leaves, dy_rows) + + def _grad_bi(cand, x) -> dict[str, Any]: """dx of the probe rows, and dW with zero-gradient rows appended.""" g = torch.Generator(device="cuda").manual_seed(7) dy = torch.randn(x.shape, device="cuda", generator=g).to(torch.bfloat16) def grads(rows, dy_rows): - y, leaves = cand["graph"](rows) - return torch.autograd.grad(y, leaves, dy_rows) + return cand_grads(cand, rows, dy_rows) alone = grads(x[:PROBE], dy[:PROBE]) dx, dw = {}, {} @@ -380,7 +612,7 @@ def _one(cand, x, w) -> dict[str, Any]: out["route_rows_bitwise"] = _rows_bi(cand["route"], x) out["output_rows_bitwise"] = _rows_bi(cand["fwd"], x) out["repeatable"] = bool(_bitwise(cand["fwd"](x[:256]), cand["fwd"](x[:256]))) - if "graph" in cand: + if has_backward(cand): out.update(_grad_bi(cand, x)) out["accuracy"] = _accuracy(cand, x[:256], w) except Exception as exc: # noqa: BLE001 - a crash is a result, not a harness failure @@ -414,23 +646,39 @@ def _latency(cands, tokens) -> dict[str, Any]: dy = torch.randn_like(x) calls = {} for cand in ready: - if "graph" not in cand: + if not has_backward(cand): continue def step(c=cand): - y, leaves = c["graph"](x) - torch.autograd.grad(y, leaves, dy) + cand_grads(c, x, dy) calls[cand["key"]] = step backward[str(count)] = time_interleaved(calls, warmup=2, iters=10) return {"forward_us": forward, "forward_plus_backward_us": backward} -def moe_report() -> dict[str, Any]: +def moe_report(only=None) -> dict[str, Any]: + """The report for every candidate, or only for the keys in ``only``. + + Some candidates need another Python environment (SGLang's pinned torch ABI, + Megatron's training stack); run each environment with ``only`` and merge. + """ torch.manual_seed(0) w = make_weights() x = make_tokens(max(BI_SIZES), seed=1) - cands = candidates(w) + keys = [ + "rl_kernel_cuda", + "hf_transformers", + "vllm_bi0", + "vllm_bi1", + "flashinfer_cutlass", + "megatron_te", + "sglang_triton", + "sglang_deterministic", + ] + if only is not None and set(only) - set(keys): + raise ValueError(f"Unknown candidates: {sorted(set(only) - set(keys))}") + cands = [c for c in candidates(w) if only is None or c["key"] in only] return { "op": "qwen3_next_routed_moe", "shape": {"hidden": HIDDEN, "experts": EXPERTS, "top_k": TOPK, "expert_width": WIDTH}, diff --git a/scripts/plot_qwen3_next_moe_prior_art.py b/scripts/plot_qwen3_next_moe_prior_art.py index 17a966b61..f7e358b63 100644 --- a/scripts/plot_qwen3_next_moe_prior_art.py +++ b/scripts/plot_qwen3_next_moe_prior_art.py @@ -34,7 +34,7 @@ PASS = "#1baf7a" FAIL = "#d64545" NA = "#e4e3dd" -EXISTING = ("#eb6834", "#b8501f", "#f29a62", "#8a3a15") +EXISTING = ("#eb6834", "#b8501f", "#f29a62", "#8a3a15", "#f6bd94", "#d9773f", "#6b2a0e") LABELS = { "rl_kernel_cuda": "RL-Kernel shared_moe", @@ -42,6 +42,9 @@ "vllm_bi0": "vLLM fused_moe (BI=0)", "vllm_bi1": "vLLM fused_moe (BI=1)", "flashinfer_cutlass": "FlashInfer cutlass_fused_moe", + "megatron_te": "Megatron-core + TE (VIME config)", + "sglang_triton": "SGLang fused_moe (default)", + "sglang_deterministic": "SGLang fused_moe (deterministic)", } CHECKS = ( ("route_rows_bitwise", "routes"), diff --git a/scripts/qwen3_next_moe_prior_art.py b/scripts/qwen3_next_moe_prior_art.py index 398245eee..ae3a028b4 100644 --- a/scripts/qwen3_next_moe_prior_art.py +++ b/scripts/qwen3_next_moe_prior_art.py @@ -35,6 +35,8 @@ "transformers", "triton", "sglang", + "sgl-kernel", + "megatron_core", "megatron-core", "transformer_engine", "vime", @@ -54,9 +56,34 @@ def _version(name: str) -> str | None: return None +def merge(base: dict, extra: dict) -> dict: + """``base`` with ``extra``'s candidates and latencies added (same commit and GPU).""" + for field in ("rl_kernel_commit", "tracked_tree_dirty", "shape", "op"): + if base[field] != extra[field]: + raise SystemExit(f"Reports differ in {field}; they cannot be merged") + if base["environment"]["gpu"] != extra["environment"]["gpu"]: + raise SystemExit("Reports were measured on different GPUs") + keys = {c["key"] for c in base["candidates"]} + added = [c for c in extra["candidates"] if c["key"] not in keys] + merged = dict(base, candidates=base["candidates"] + added) + merged["latency"] = { + section: { + size: {**values, **extra["latency"][section].get(size, {})} + for size, values in sizes.items() + } + for section, sizes in base["latency"].items() + } + merged["environments"] = {"main": base["environment"], "extra": extra["environment"]} + return merged + + def main() -> None: parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--out", type=Path, required=True) + parser.add_argument("--only", help="comma-separated candidate keys (default: all)") + parser.add_argument( + "--merge", type=Path, help="a report from another environment to merge into this one" + ) args = parser.parse_args() if not torch.cuda.is_available(): raise SystemExit("needs a CUDA device") @@ -73,8 +100,10 @@ def main() -> None: "cuda": torch.version.cuda, "libraries": {name: _version(name) for name in LIBRARIES}, }, - **moe_report(), + **moe_report(args.only.split(",") if args.only else None), } + if args.merge is not None: + report = merge(json.loads(args.merge.read_text()), report) args.out.parent.mkdir(parents=True, exist_ok=True) args.out.write_text(json.dumps(report, indent=2) + "\n") print( From 27b73393a10d960559d916446a2f5ea3060c4b43 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Fri, 9 Oct 2026 23:49:57 +0000 Subject: [PATCH 56/70] docs(qwen3-next): MoE prior art with Megatron-core/TE and SGLang measured (B200, c58816b) Every library in the reuse table is now measured: Megatron-core 0.16 + TE 2.16 as VIME configures Qwen3-Next, and SGLang 0.5.21 in default and deterministic-inference mode. The TP4 gate evidence is unchanged (2e950f3, identical MoE code). Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- .../operators/qwen3-next-moe-route-combine.md | 37 +-- .../qwen3-next-moe-route-b200/README.md | 23 +- .../qwen3-next-moe-route-b200/figure.png | Bin 232121 -> 312811 bytes .../qwen3-next-moe-route-b200/report.json | 221 +++++++++++++++--- 4 files changed, 224 insertions(+), 57 deletions(-) diff --git a/docs/operators/qwen3-next-moe-route-combine.md b/docs/operators/qwen3-next-moe-route-combine.md index ed11301a0..20ed1d6ba 100644 --- a/docs/operators/qwen3-next-moe-route-combine.md +++ b/docs/operators/qwen3-next-moe-route-combine.md @@ -69,7 +69,9 @@ the selected probabilities; the indices are discrete. | vLLM, `VLLM_BATCH_INVARIANT=1` | yes | yes | none | no VJP for training; BF16 router logits (Qwen3-Next and VIME route in FP32); routed weight applied in the expert GEMM epilogue on the BF16 output, then routes summed by `moe_sum` | | HF `Qwen3NextExperts` (eager) | yes | yes | autograd | `dx`/`dW` change with batch size (cuBLAS shape heuristics); BF16 router; `index_add_` combine in BF16 | | FlashInfer `cutlass_fused_moe` | (torch routing) | no | none | output changes with batch size; no VJP | -| SGLang, Megatron-core, Transformer Engine | not measured | not measured | - | not installable next to the pinned vLLM 0.30.0 / torch 2.13 runtime | +| Megatron-core 0.16 `MoELayer` + TE 2.16 grouped GEMM, as VIME configures Qwen3-Next | no (256+) | no (1024) | autograd, not BI | FP32 router routes like FP64, but the routing, output, dx and dW change with batch size | +| SGLang 0.5.21 Triton `fused_moe`, default | no (256+) | no (256+) | none | tuned configs and the BF16 router GEMM depend on the token count | +| SGLang, deterministic inference | yes | yes | none | inference only; BF16 router logits; its deterministic tile (64/64/32) is the one vLLM uses in batch-invariant mode | What RL-Kernel reuses: vLLM's batch-invariant GEMM for the router and the backward, and vLLM's `fused_moe` Triton kernel for the forward expert GEMMs, @@ -91,25 +93,32 @@ commands are in TP1 shape (H=2048, 512 experts, top-10, width 512), random weights, BF16: -| | RL-Kernel `shared_moe` | vLLM BI=1 | vLLM BI=0 | FlashInfer CUTLASS | HF eager | -| --- | --- | --- | --- | --- | --- | -| routes / output BI (16-1024 tokens) | **yes / yes** | yes / yes | no / no (256+) | no / no (256+) | yes / yes | -| dx / dW BI | **yes / yes** | no backward | no backward | no backward | no / no (1024) | -| rel. L2 error vs FP64 | **3.9e-3** | 7.0e-2 | 7.0e-2 | 7.0e-2 | 7.0e-2 | -| tokens routed unlike FP64 (of 256) | **0** | 11 | 11 | 11 | 11 | -| forward, 1 / 64 / 1024 / 4096 tokens (ms) | 1.38 / 1.71 / 2.05 / 3.05 | 0.37 / 0.66 / 0.88 / 1.06 | 0.36 / 0.65 / 0.87 / 1.06 | 0.34 / 0.67 / 0.85 / 1.08 | 2.0 / 61 / 89 / 89 | -| forward + backward, 64 / 1024 tokens (ms) | 112 / 166 | - | - | - | 878 / 1283 | - -* The accuracy gap is the router: every other candidate computes BF16 router - logits, and 11 of 256 tokens then select a different expert set than FP64 - routing does. RL-Kernel routes in FP32 and selects the same experts. +| | routes / output BI (16-1024 tokens) | dx / dW BI | rel. L2 vs FP64 | tokens routed unlike FP64 (of 256) | forward, 1 / 64 / 1024 / 4096 tokens (ms) | fwd + bwd, 64 / 1024 (ms) | +| --- | --- | --- | --- | --- | --- | --- | +| **RL-Kernel `shared_moe`** | **yes / yes** | **yes / yes** | **3.9e-3** | **0** | 1.39 / 1.69 / 2.04 / 3.05 | 114 / 169 | +| Megatron-core + TE (VIME config) | no / no | no / no (1024) | 4.6e-3 | 0 | 3.8 / 9.7 / 11.7 / 12.1 | 45 / 51 | +| vLLM BI=1 | yes / yes | no backward | 7.0e-2 | 11 | 0.39 / 0.66 / 0.87 / 1.05 | - | +| SGLang deterministic | yes / yes | no backward | 7.0e-2 | 11 | 0.35 / 0.66 / 0.84 / 1.37 | - | +| vLLM BI=0 | no / no | no backward | 7.0e-2 | 11 | 0.38 / 0.66 / 0.87 / 1.06 | - | +| SGLang default | no / no | no backward | 7.0e-2 | 11 | 0.34 / 0.61 / 0.83 / 1.35 | - | +| FlashInfer CUTLASS | no / no | no backward | 7.0e-2 | 11 | 0.37 / 0.72 / 0.90 / 1.12 | - | +| HF eager | yes / yes | no / no (1024) | 7.0e-2 | 11 | 2.1 / 62 / 89 / 87 | 877 / 1284 | + +* The accuracy gap is the router: every candidate with BF16 router logits sends + 11 of 256 tokens to a different expert set than FP64 routing does. RL-Kernel + and Megatron-core (VIME's training path) route in FP32 and select the same + experts as FP64. +* The only batch-invariant candidates are RL-Kernel and the inference-only + modes of vLLM and SGLang; of these, only RL-Kernel has a backward, so only it + can run the same forward on the training and the rollout side. * RL-Kernel's forward is 2-4x slower than vLLM's. About 0.5 ms of it, at any token count, is the FP32 IEEE router GEMM, which is part of the contract. The expert GEMMs themselves run in vLLM's kernel. The per-expert GEMM loop they replace (same bits) took 47 / 66 / 71 ms at 64 / 1024 / 4096 tokens in a local B200 run of the same runner; that run is not part of this evidence. * The backward is still a per-expert loop of pinned GEMMs (512 experts x 4 - GEMMs) and dominates a training step's MoE time. + GEMMs): 169 ms at 1024 tokens, against 51 ms for Megatron-core + TE, which is + not batch-invariant. It dominates a training step's MoE time. TP4 gate on the real layer-0 weights (`tp4-moe/rank-*.json`): all twelve cases pass on all four ranks, including the round trip of all 512 experts, identical diff --git a/docs/usage/evidence/qwen3-next-moe-route-b200/README.md b/docs/usage/evidence/qwen3-next-moe-route-b200/README.md index 52f528486..863f3f5fd 100644 --- a/docs/usage/evidence/qwen3-next-moe-route-b200/README.md +++ b/docs/usage/evidence/qwen3-next-moe-route-b200/README.md @@ -1,13 +1,26 @@ # Qwen3-Next routed MoE: prior art and TP4 gate (B200) -Measured at commit `2e950f3` from a clean clone (`tracked_tree_dirty: false` in -every file), with that clone's own `rl_engine._C`, on one node with four B200 -GPUs (driver 580.126.20), torch 2.13.0+cu130, vLLM 0.30.0, Triton 3.7.1, -transformers 5.17.0, FlashInfer 0.6.18.post1, NCCL 2.29.7. +`report.json` and `figure.png` were measured at commit `c58816b` from a clean +clone (`tracked_tree_dirty: false`) on one B200 (driver 580.126.20, torch +2.13.0+cu130, Triton 3.7.1), in two Python environments because no single one +can import every candidate: + +* the training environment (VIME 0.3.2 with Megatron-core 0.16.0rc0 and + Transformer Engine 2.16.1, vLLM 0.30.0, FlashInfer 0.6.18.post1, + transformers 5.17.0): RL-Kernel, HF, vLLM, FlashInfer, Megatron-core + TE; +* a second environment with SGLang 0.5.21: SGLang in default and + deterministic-inference mode. Its compiled `sgl_kernel` 0.3.21 is built for + another libtorch ABI and cannot load next to torch 2.13, so SGLang's two + kernels on this path are replaced by SGLang's own implementations of the same + operations (Triton `moe_sum_reduce`, JIT `moe_align_block_size`); calling any + other `sgl_kernel` symbol fails. + +`environments` in `report.json` records both. The TP4 gate files were measured +at `2e950f3`, whose MoE code is identical (`c58816b` only adds runner candidates). | File | Produced by | | --- | --- | -| `report.json` | `TRITON_F32_DEFAULT=ieee python scripts/qwen3_next_moe_prior_art.py --out report.json` (one GPU) | +| `report.json` | `TRITON_F32_DEFAULT=ieee python scripts/qwen3_next_moe_prior_art.py --only rl_kernel_cuda,hf_transformers,vllm_bi0,vllm_bi1,flashinfer_cutlass,megatron_te --out main.json` (training environment), then `... --only sglang_triton,sglang_deterministic --merge main.json --out report.json` (SGLang environment); one GPU | | `figure.png` | `python scripts/plot_qwen3_next_moe_prior_art.py report.json` | | `tp4-moe/rank-{0..3}.json` | `TRITON_F32_DEFAULT=ieee torchrun --nproc-per-node 4 scripts/qwen3_next_tp_moe_check.py --checkpoint --output tp4-moe` | diff --git a/docs/usage/evidence/qwen3-next-moe-route-b200/figure.png b/docs/usage/evidence/qwen3-next-moe-route-b200/figure.png index f4515650768420573d93ab951431906f2081e07a..e09ec93ac599e935b27015d81c5d71df6decbf17 100644 GIT binary patch literal 312811 zcmeFZi942U`!#$KB`Fk9=0-yq5}BtosSKHmgotFGQl^xs3=O6tQ<*YFW+DoOA~Me; zGG(5JZ=K!G{k-pQ``+&#__o)!J$F61uIoIn!-Z9Q{Z z@dAlN9Ze#U_fT!bzf30V8^s?I4kvUR)U8b&oDJDAKQ9Zj9yos`GVMRtove0nbFJpNw2#iYw6J(81(-1qpJ^er1yAN(KQa+;4uZvX%L^?UZD3X+2V53l#lDkEw9pI%>2{r{s249Ol8 z5~6o^FV1sYc9K6fU~rZ+heK8@se`-@fS6Pxd70WNfFQp>cS_CoaCLv{ar%5*8K~lW5Y`RotG&N9E0w)Cy*l`*HJ{7R&u=QLr0Ai)e|ebDE47>(x)BnN@pA1`)WnX$Kpd|L4!Sr_Y=@@#X1$)tnpRL%)BU|G5A8^Jy&UhfkjD#FWGE)L|B-fadsPSh2(j}q$>92WS@)GBMsj2X9rat2L(}Fx^yY%@Fme& z$F&`+oyKbhyP7>7b{0DK4}IUOQ!vBiFy0aOp^bjWj=P&^#|L#Py1K}A?%a93xw5jd ze{p*7^x3oC{^t$xg?O5~qg+~*LoJRgA9&W+`p(96X=ZbrQm{hOg*c71wdJSt=KpLZ zUY&n;;nG9>0tb3YryG?oC7n5`yz)AJ{9rgAE?T}YxkC+aBfnv|rlhP~Hr`oiJ2$E; z<-T&-@MU(k$kIHAr`oHNrFE)>9}1oSbQvNhNF-@#X;ujb3X$tSRC$?jze2_*KYsW? z%C+|S-StH3=E4M7?5kI5?@SLf@LYH;*Y?=p!i5WT3=Vvi(cK=~pPxGrd5|RNzCz*0 zCaG+qD^DkASSBWPCC<1~StsX)OYyku!NFPsMLebHEZHi3`N)q^QM4?gD-U-bzWC-4 zpTI#`0jII04b5qbhC_9RVKQzf1D5G2$etZIFQ=$Tv6Fvg*Wa+2|MDzBHBHYY*m5Z% zBSUC(bhIw+thU4NdQFqZSp@~M^Ao)rT$jgAljQR425hE&{$^c{QMR%a6%>@K4jB&< zw-2conH_CaUs)U^(<{13|EKG{x{h|{)iZvqi-(tHekY64&9=Tv(8;qQ^SXPt+$26e zeyFpM_JB%ctf;SE^H|nwcIT_<_B$JvZP!*@Itmm;HD zMMZaFZ!5@o$|@)*a0V-pk@)%fTQZCj+Q!(W@@Vm+hv#N%YfC+Hy(#5El6pzC5S9MR znwoPrx{J4ZtV~MExGnADPrv+L;@8(pp0{R)&GiRm&&&HQdKl`J9GGJAy8a{aPV9+C zZj-Ct_wQes`guk?MBJt)x{9+_JN>fZ@B017FPaNh*Gx>j$u?{>`jPlu@aWN+&@qSi zqCdB9-##&t&eAh5@Zk09eYP&okC+HK3<=JRwI6Gi_$P}Gb>AUN{3j_H#Q6Eq9J)9o zyp2tQiuCyOzC^9m-G>exBKCxULGh>O!q;qYy+fCa7_gHBdUg&5I{%3!E1vi zSsQ0-&AP8&p3!o2858+RCu2_l$2`x_FS8SSo_wgT-eO$gr@2e-*B_4!*q68|>N{r_ zoc&Q`R3V}7c%uknfu5DsPx`i#@$9fj zqF(;P3P)4tnIU?TXK}I2<@dL|FXdXr$lu*4(HQsU>yhU)Po7v$F3nm*NILJF|I_{P z$=*taBTd+?o7vgfNuGO7Jp9mWlGt54etR z+{@3u4e^(#nY+sZ&_+{8r7CK9(nvD8CGzWb*F*?Ygg zI>jtx#O%JlO8X;8UHer*Y;5er&o9QvXGHF5dc$ULLEg{BJ%G=TCA+mXlQZO&KMk3wiqMLVy zhRhHxoAI2GT0>o1m76V&7uVA7z295@h>7HxX;NK=WtDMX@x4|XX*Bqa?Z26l){w;e zx3GTK9%?o?=3APux=j0FVX~hwp4+%d>-G zwtW-@4qx2b44s{w8F)3QzJLFYom_3ptGAfnkz;u&?76wjSl%1^qcSqvA|oSPvds5J zO5eVZWZqjVyZ%FB?@J9{@4!IXecLym^kaUIdMUT3CF7OLHaX44Un9-w#%1?xZ%+T( zx{X8TUd(Zy2P1DZlDs%PBJLsy^Iko5UP-B}KJIMKZxbl7eM3Wr0dxViQK@Hq5rsQIK_e$g&AsE|Np>%D_(Y zKGbU6U0nLRp}=JS!M`;*HeG$3hyFjglVbqExGM#2WFFq#|XVDwTUi&hGLgA#CX zxG~vhX2#)=o|r*Iz~o0CS^^0oGX@X4FHTXethm|&rNlW-PTCT`cz=7|?#87nS2(S@ zi~WE8+?PFIWMtGcIQR(l#Wly0#4h9Ni?R{i9?Y#qzW0=S^3j3Rm>916v>ar&Z*L;0 zhK1;`Y}~k!Sz5w^_gA(>^RULI=vFbQ+j9)SX;fRbsOMik@T|8@M3%s(h^eHcBwY5y zxpPNJJ*9Uy;qQzd*wRO@BVo?tx_rt9!(Y632++{imTlqt;DH)q6Ee}@>A>9qoX-Va&~qP6%5EXZ1|D0j%t&K6(`Ct_8h!fosm){`rADGE+3axZ;Kk7R{+0dv_U|tR z#*T@J>B~fI*&`@O7sxJs;r8J-ZTv^34qJ5E{hr>KzPatVs=scWb`t@#5j5 zM;`&s=$V;4k!`(`u4lIJ|4lhNaFRzXVT=B^KLU=@)mJY_-L&DjbB7E_l=A8k-Lx^4 zvuBsr9oc;W<;?4hO@vKr6knZ8Q`+Ula@5Qd=wid;;IWG=jmg@TK|Jccef6i4&ox@M zW#PWYg1kPQ4dT8-xn(Db)b;+h55V;9W|y81WF+0vfho>2oFgl%1ED5>G!=+d`t93e zZC@7D|77;Lckct%|I3#zydw)M)BYXZ(!VIh)7mccA!Si*+oqsem&z)8N(Og|Nb~jg zr+ggTC~;^spsm&jz=vw{W_dF+?hESb>p2pL6LMKu1C%W?xu%;$BuYq(bmMVqB>Y8mk}M$<6uXRm4(gR>IX)aRdiZj{w)OkD~tA2)YM*zdrITa zUt%D(oJLYTvy7`^+U&lA2YbK0Y^S0w@DAjVy&_wNrirLvgTgl$HX z<~@ZlL6Y2lG1uxY{oa#CT}AmfR~DY+bu~5ZM2)%g&i;66#YvgQTwolnc9Z5pXY0|{ zcPw07rFpK4+tIcPis3-^`+$8fQ&IZ|Q9V{Nl$jc*vy@MIWQI;~7r z{-GudH#Idyz{(yt7e;mb_;K6(m76&h&Fp;IX&2hA-MlGQ;kRq+rcI}CUreO8&VMco zJ+jsaGU|TFz~jZI?aDYzREVZ@gGUn+6E}<#1GQ2w_EvHX@=_Rm`EvC_icSXWCR%pI zTel=UQ|w<|tG#U2oaUBh9Q+K$JN*pt+!Vs@-;N zJDTJDU9>1%e&Y6~{cEcwUZXcGErp!NrH)#*of~t)BPd;2oVHzd;wD9-e@1QHXJl+F zWLjf}er;!h@=LXr%k9M$nI#>>SH-XME<`(^>lJhw6`L9FJe4dXAuev=xXt4X>YnG_ zyL%NBylf|W7GWkZsN5M4uUEiFkEotH+^1x@qzZ!aZ{=g0MtJ`dE_*MIuJsh`{6EjmAhHQ9_JjPsfq~k2&Z~3n+a~wRkisOL*_UR%-*|CT|IaD3PoGezKr-B~ z3g+W;J6QD%e1M$RMi)(LrW|?2PZr*_5$L$JfqyrUvaUDoMu*vO>$d#oPxrTuWFX&6 zhOsa+N23HP2@zmoV)7m!GK3f9H2tn!56ZkBeJCxZ*G$&( z=A;sH7^1_b+Akxx*71m`R>-5uK>Pynl!KjymoI4mqNEAY8+iI0!ZCIB+E7zIi( z$zzJWW!}BL8MM`*0@dovvokY9!;kXci+oQ#QdA@rlb#;)ga zd#VSWNup-;wynFxN;^7OkwL?bn(s-|pH?sI1ixiFZ^g{3kx0_kJ|-silU?Z-xvR zDN9>B?Nm_rYh`VF^E7U%F4x+cRmPPHD@?Rx#Dg#@e|Q=gK7g(LNl1JIrS0;Zr49-d zx&Z)gwG1Pz=)QsKP(kai4k`aLPE&GowSkuMk5wG?lP>IMIDGL?XuU2{Bt1)b@NAKj zW#izpm-?0@kC)Di=bMdJRHChFwixMUvsL2aMs?9-d1#qY(h{}P+41p)Mn+z5-wM*O zh-z5=n!@T_sSf!ncc2RnIpql9>+H#t$TZ73%9Xpkoyf`_J9_71jT^*uZa@W|%$Oh?A z@7jmQ?U^Q9z&McG+uIXCHc%Ce7`fA5`CiDXL(ISA_TOfa{=4iZ;ppvu|L%5zLjD8F zGRcgcNv0tV!tsUz&|>?)oMCjeFYHl?+;`gH5mv$ky-79u)Dh%lD?G2M~JOWs3J5(n>Gtz93 zWT_G~MLUp9%;o-TtwjvI) z#w>$R=0*<2y672@7xE=GmYwMo=EXR5~ z3s2WPpWZt&GxPT5j-GaUZGBj!AQ2&rj{^SqYC{3LkNbCFV%AAJHbm2AM?{R`f`Y~s^S~NWVcvrHhD6gPFE8JcX(Al262)cZJW$0LA$@x%B2K5+bw5DU zR?d;#ZSQY0X{G3-*|!g%VR#7gv#h#WokrAcc6dMPb?@+S{L#bCPA+VNXh4c?%_^C6 zhJ@(K7qt2M`6;3wpRDA#Y-E}bA`H~a2I6UfwCeehB&;O=2LVB_>+Z{z2j6IEe*2uL zba^SQdhO@QfR&w{h4XTtTRxd!&x*M%9W||u^!8`*IPs^;EhxVIn|aiWh>sqjOS3G| zXP(7R%)TcmVNh8a`Bn|@Z_`TMe9IgeSs9cWU+lU_4nQX;DEL_?saoeVyfrD=h*Jk?BeZ82hQ>S-B9uo1QWub zkoC{k7pKpi`xJ5*qSo>IG+)*A+mue9{_s*VmyDE=!9kEvU0s*ozJ2?_i&EBHFK|Wg z>FIsf?`jQ1$xhwkPkJ>Xv{q;?{EJd3tu3Ix%zOGtP|&@$?2#*w2)Hj7iFu~bL^UL+ z9G8ew3yT|_1zUx$xzhq@Fbnlvic3i{F!CGl^Y@3m zAr4WZAL$a!ODT3Yu~9}r1tU|ab9dvadii#{n$rzF`qF>=j>cZ+(xtspE4!qm=Hz*U zjegbWzRf-iV&peLdm6=$U|Eg87$fg77-T*>z0a(>c!TNJ7nEoyc}Mb`|L~)Z_)qp9 z^qv0=bchmjhQN0L?9xjoGN14Gn}NQEs!w>7a{bf0`0wAppKI^l4I~Za(3FQodUNKs zkc@18)tGnW*&e5n3%+)GtT~+naEZ@Uiqdm={tp)y7uoDcvv!z--JdRL5*ovV2d$$& zc{ShMJMn1eD}$2aiMhE8yF9O(n%*C%*5*AIbs0<;@;U34oi&x{|9{L`e2d^9XwAuP zXc(aN#U-3ZgGR!Bo-{Dvz{all^kBzZ^M-VMH~j#0fk6{i0`j5%zl%hEr7~cQ=vzQ# zf}x~}Gq0Uie`or2axC{%P)M~fl@szE*JCOYc!j{8o+~$Rj(*HAJ~hSQ`6g*~S^Dww z=MU~|*kp(Xka|Q39V>L5kDc!+i{8IyBv*Z3lzHUX+;HP18X3w=^0z)TyB=Z@dvT{O z*DpZ`>HYcB@52W<#goO}sg^u9Z`~p%0V0L;=O8cS+YctD7Fu-{OiYMH>t7?)yqLYK z&=U#f&wc6lwT_})zPZ-jdpJ2sX=zmry9M+Xo@tdvyNng)EI$huv)%5Qa^(qRwLLsM zo1Z`5g#xb#scr(fPs(MAS;T^O)BH$5ZAtsjFX{wsBfGZ1h7hfuomZ?3c=^_DfLiM2 z1PQIK!t8Kkx#N_5Yh&Yi8r3RmEiEm?-3bMSqLTxZ@^tONs~w=ZhkhjOa2jj#Hm(fl zEBq5b@`K&6SrY`^WPhN&U4(>qA@rJ*i`nEA6%~Z`6!*b$apvok`7=!+p)W6Zb!DV& zFXt>jE&epSf~C=We~S`r!NP2_fm+*Z%MlR`s{SDYJ6Yo?E+71TMg5@ZqJ12Z%86`)V*c_$VY zmP5KzTO^!r1cKn{ZAuNdak5HOH2_*?ysTB%+*}Ej>#cS7<*Qe(Ug^l2G>Yba94zhf z$@j^`{Cp+St>#?s*&olN9K^NHhGdlwH(J!io;V9~=V5j2OUXyz=(r>#cH0lG`RW(W zao@NGWX&e&WQ1LgG%5*_>XRdK;m5f#$sRB!N&W>^36DmFx20Tuzx$Y#-l@sHazX-C zJn{Y%Itf8z&8zwPbt`frvQan~Prv`lD!VrR7gzZC zuTy)SJA1aljAilT#3-%Y04>)B@|AKEGO{%gFZa=U>gnmBhvYG(ezqyWG|K51vK^`h zDU-dpE6@;O&#a=-{Qdd_O5rL3;?#IQMq_vt)OMFAd zV!Ep%lW=zKl)AdQt;F;w(bXcaM@ap?Tj=~Th+H)_B_%7eUPQpH*~G&RU$5egCLg%O zl$>+;DIOO-cp*uH>$GB;+4tB)wd1+w?=7I75zqDK84d_;jNr>^GK!#!Ud(Z*{N0d1 z@ZZAMzL7t6G?<>7+en&$Zjz8=rtr+OYSgNWMiI|jBSq&7PlID~T4#nuGe7b4p-Xa` zWHu_!jVRGke5$DELFGU`Edxl)F#X!5ch~l~f`TCUebR@j;AGWTC%48OnacTMz^%4l zT7RS5q;qasyW1IqzFXTie|gc>ih9Y@!gtKd%8EBsJ5iM#RFQ9B^Pv{qV35Z(FGO~@ zySv)}c0x?3$2Qc})h+#+no+jsLWmwLq7)@7nXJmn%DWq%h1!3CSb;cAT#J<16du+2U$3K?1=MsSp zIq*0T)u$`r&2*3J7{!R9;m_{!uMwYCrwQ zc@mrM8xuoM&B%KXA_f5f%`X~g{?t`C8@y!ERu07|7UJ zyPfL>bQFZNh(@+@ZmeB3MMp^Jv%KanUQUa)j$OjVwHaT*WDyN76bCJbKWVpy2UeJU zfDdA^8H_$ubmZGRQb*R`Pfbm&8sLz1r+Ca5ovifyNF3SK*}Z`H@$ql&a!x;Teb@%Z z;MYY_E-rZ*IsZqGHjsk&^)H&}I#y>l#-B&>%%r+}Ig;>tV3ENCrL(?^B6HywjPkgA z&u*Y<@HlPe)e_mnO9wd`Mt{6KCI01Xw__^@i6EEJU7WahaW}dsq6u$lVc5CBlMn=< z$h}VB+qCs}L2UL#Tk7__xJZd+0H8cBG~dBv~FJEL*RZ`!EgAa|IrL4 zYs^=3)Zf2vUr$2R&OQ{@h4Di3mUq|E+s3Rr3%qUnE98K;2C5pbw_hj19f_l??fQh~9aR*^JjqrScyr-u@K=FAx&@6YO&{=;7V`S{>M4dMb3T=tucC)kU)rlSL$DXSy&v5Le1L0F}g}v+bzwg zyyKl>Q+hY){EMS^($fW;{&e|+V&o3~5@?%eKbRxtFGRZ0vA`#Kqb1B@d8%)kCx*b` zPa-1xRHC+Pq=jx$2F!nOr!0R~mp6F0LwRvQ)U1wFQ6au*Iqbz+_T{d?d-rY%af?Wv zPgwcppOnOd4snA@t+7tdC=*HdIkWw%YB7&9n>W8{f8zG?jT1Ao*?K};(TslRD%l4x zs!u{f?t`5+2KWGJp{*ke9_~{G?={)4)iUycWF8?iUGI!lHZt0S7L%5Q zj*$UPR9wy|Ag&{|oMt)9PqJ%bn~-4?PM;PeEE1p-`GO0b#&$!1rg(ntKC<#FO}<&( z$9&+eNH^D{^ahr~!k8xul2v=tJ$3YR{{p*1CCvv99vn12>v%9&Nywz?DuMEdAa98O z%9{|(PX*u}CORfbI9H&lmZF9Go^G(Nm&>R5h5`GX>)DryzH)mob7zxkrUz@uNCVY; zk!QEE6mVbt6goX4bzj`xT@jLkkXc<1>wJ2((Av`|k*p^TVS^@mjxl3mRR#fS&hN=R z^xx&bKRs&;W6@7xK820cg_j(_cg#YceI%7XbqZD)ry zJHQ1%8Z;HQw&pYIq#rEk$oBJZ@C3$*K?0DTp2O|H#m!B1cjMM?ju)3liEx8t)rS&HxK8SqfRX)2 zs?NjMM+oR(nN9$u8d_VY%P(hf3<~f7)8Y#phg2Qh^d;e2$flA3P5GJCFV8Cf%F(=( zQA%+aY~Rn>$@(;AWMq74c+YbX?Syx3E)#kw!5b|TtkuIKBd;u)tqAG`{3_8rfix!n zTotgip8(rPG9*v*=Vn0}lYmf!TMmUYQCEG{4K4tSyj!!pgi|cb?7ORZI#g27kDzlW zf1ST~fixUn}2?K z`K(^;R8r~PyLY*sohcuUqa;W!xORL>N@T%!8X^Ijg-_B*tG5FH1J1oo zz{gNiHK~JYst$Q<{a`St517JyZ9PRT>1p3tMeu@BE4szG!Ux|}to&iu2KtHYT?84$ zTMf3QZ*BE9Y3iWdTvT6rkI9&a_Tc;~w~&w;jRL<~?7ciGUS6f5<~M~Nh}WO%Cfx%r zg+(?FDS^N%Z)%=yS($Z{(~n+5^rGxqGgiNo3BN{ZC;T6e?2tw5|1#c=Wm&fGgfe^T zQ$)g_6d)~O^t>JNk;y@2d(9JY-3UG-5wA{dbGh6}xTPci@20 zvQuNJk;^V0^uIk{!;hi06o%>+h&1yNG6~?q_6_Tq!XjU9g(dS}GQJGU5e@0B{h+nc z&O`ZdB7pPXMXJj(7q)e2&D3ppdf&Sf_mfp7x_R^Fmi*~s!OKU4tEu}Q`1@)-w=p`n-IjlowHN0VSdWyd z5#`<>Fy!I=YHU1gFsDi97JBWnpRcbfa(w6RI43iuXZCrVh#DG#V#HEHatyUtL{ooU zMTHjaV|k=>Au{|%$-*}H*De<49)@LCc13Ut7)FvOFob#5OR2LnzVv&cc!*}pB4cu4 zPs0l`cqyDPya06*me_}-nMl!P@H&x5fIZbB3k;-)hzP{G8e!Lj+^TMT1Cg~;Y%jIt)=H=#5|U@g zzo7l2r=Q#n#T4z%iOYr2ilN4O@#mVZ`2#}p1S2K`D@t=;e69`~kx09cMEF49@@N!m zkI(5J8XBU4*hUEPx93LHcyIswYzS(Q70}J>2e=OoGk!bp z+<}isc#pBPc;k=cYXWI}YOxgio~F180etf21ot6BkmP>Xn@knyUv?O6*-Wxo$;++3 zHl6avST`!8@%`h0v9Y+BRZW1n{t5%K6}Kq2e~=3Iy5NR?JzEtZHj=ecOM#jRP7{KB zw0gofG(cX+@i3^^fLa6Z#YUSO{Kt?ue%i{S} zYw&om80-Z(VRR`hTwWJ0Vk}Qkd2kbCvvP#k9bez(x`u|2;J2rX(nleg`@XwYi+9`e zHjhYbyFEWnlv@H(Ly?1^n|e{CCPI7*Y*8O(es}l6FYq=iiy`;PH6w!6hTU5A^=W!+ z{Fv*F*QuWeIW#7y7_f@HoBf9X7G|ax}U-p2^g{hD*gFsee$m9*-(`H9!K=_l9 z&gmdmQxP&2#Ka7b5}&r7Vi-pWz1kOEn5X+6_4f6VLjfdIKA5~oJ>k~HcM=i~j(2TE zT^{?Mdg+)(>cy=D9~BUA5>{Ne9X!Dla9@2k3cn{B{a$psL+!b=a25ML-G8t-0mX$?5;8XP5B!Qn=}>{*x-&eq(F+q`%0UZQPAQ-+`*1b%oow%?_?H9wxJ z7NT_iXZD{0vz9tataK$BM-XZ|AbvA`|IR_UaVRJ#KA>_M^6H&8x7)@P1ouQ=UCiC< ze=fBK^QdoBR{lmsLqjM0?3c*0IeeV^_Y=O2yxYfU25X~E0fdntL2cem`GPP)85$ab zeU}5RWPhkV-=1Lnr~n%;MjdZ$KSV`tWGveU>xhx63M^_2nE_Ff&fCBk2f`Ig!zxC# z{lOjPpb&kOTeUbP&B<=anP7e@@XRx8`_pgEkF$X-@-rpJ4W%rcE~3j$a+bcDKL)+eP$y;ND{Pc)6ltiv9H3P z6gLIxis^1+q;z#v+b$-i1e@`e*2eq({&3X!m7=OBqMr8j^myVq;`3<$5a8vhz^XiX z`qT?eG`C4%ZPH=s+jC_|s00&C!(2xTdg}yy6Lbs=6tsbEB+uTDr#`e5JPvskDybik zQCKKR)H6uVaOvN9_fD8_RE@QXM2Oo=e{ZdTAZB3EO_NgvB~4LgNYaRkCbPDR)r+M3M!j$ zQ1NP~#U3?T9R&N=o@2T7;K6HR;^L(+*1*<-?aCOyCi(EMdbea{h>MR`LL>&INq8qi z4lh%}^d76WSDRQixSGZ6ehNm)e0`zDx%}sve(tk|xi(T}+KE%APEl;y)E{nrE81h7 zj2keot0b^2=J=+`pI>$`v#=z;|1&Z&Vm#4v2V{sKbeQ|V>x2YBaK2#c7MB(S|M3j2 zvH#boO05Z>8$0_ZL0B0HffZf{dXC-IjE65WAS47#lhoqSZ}k0Wh}skee+uEyhqezj zUmoOKP);svCEf1JY=mB-qZ1ZpDHunRr-!Z9nSJN?oaUey%@bd4lZ{fKlWZ+L| zEi%l$tMpBw2wwRXkq?JOK-DTh0tZ^zvb9xqqqoLS_MEU8P-?ns4LulegAw(5M{#j+ zOSVO5)ve)X>j_<1YC{M(%*U)~%07N%Y=cFRi^!<5t68ca)xLNX1iXtVm<)o>DBaO{ z$-E;H9e!DPIi;lY+D3!!Wa<&XctS&tvDMH20tWy#QZAv@p~UyWB+Q*M(wNKy!zJv8 zCtePJ8)N0?4hac?;d!4{defnnx5((oGjhNi=v2SMG$=JDn_!;>2p@LDg!jd<=0opd zSLVZ$lP%KJt8>j8b`qu!lmr{-@~QFp-;%x(c^V>N=J^2{+ak{tChECy&2QXPB0W_vxB2J}`(}%*?L&vX%!A9N;>1$UF(EcYBI0sHeIbCGk7OdtOqTW&K@Wr8@-HF*hRgieMLC79KtRz5I4i&}N~ zp^5FsqtnScJ;_S2zb6CPU)j2~)z2{lo^3>0sX$Gb7>wG)AoFZ1yA(xjq%`3?abS5ab*~$;fd;lD6gyy5J_CUS(P|0C)$YQBUKj`+xPI+5@hsOC`kimI zyuECg4`M+pP0t&kC%GfwKf5=d*;DB+?>H08t6y-GaKqynuoM?-Pon0zE(LiKUU`u2 zXyG!e%x}K4XnYeKHda9}wh~*mY#}ySxuuQ zc$AopdmI_L4HB*Q5eRB!_yY8hZU{EIF*)?{m#f@bDPlx(3+B2&q+y}iAE!Ipz? z#L%)!dEU7rgN%zpQ7jKL8Ttx~Aj5OY1_lO2%Ah$!+Q6zD!AkgHb@);noFd-+kv(?e zp;=V^jkc^mb%eeE)2Eu+AMoA&&}n1P7AQ5Bef> zvRkCpKpE0RZ?7#0Pg@==&eco@f=@vF-$&UKweGr?b(9Cr$dp+b5pkaqiu2zp*H$;d zo}y7h9o8V7hD#7uz#~VFsODPf>*(s5XIZPO3kO%f696@F7Xk&U8V!8ilQOT(J2_-4 z2+F_8^JT5Bj?NWW*5T*=h<#$WRZi1c|MzdQii!i=V09v1zWo0BjJoX$<9sZbg~NF? zK$-(nkbh$|lbeXF4n_G2+&fTSU!4t2;2efNlC-?z}C)6lm~W`;~$e!PfSSjz$=>$Z8ke+>C3UgxGtu>twib3W!J) zsvhvg2q#D{}UD|!@H-PT*-A|NMU z=^Y&O@%5#89T!&$R*>KZzye;eNOpDmUBDK-n$3muZ#ddMcn53)KphKQ_;=8(TyIXh z3qmz{Djkz_17Xb%sKoj=F&UAHgKZgV@uU zpxT3>r@bfrKK)2)pe{J0I72&&iMpB5#jXFbJX05lE6z~f^YKBbD8mX*1vj&9-B+$X zj6kj1wA1t|5LnsU{yQhkd%B9}(m$6RO4iD^V>|={@?Rn$&*4n2c^rDZp%JECi#x#! zmnW*dvKKg~NU5;r$rWrvX4ikxs-mI+o9TZ(aVfM7>;lmM)Yos9T`!_S>pA8Yl`hyMHDnb|slp^g7AlmFX$@YnCn-v7$I|GxO2KVLKcEB^k^H$2h$ zw~+kL*DGH9cY5i6zMkIv|6btVmHNL+^lxnZ-zfSwCKUg_H`+eRPSTz|_2BBZ*Ea|= zga9#yJ%7%q`p9k`UeuwHk&hi6Qnilz4;&yT0mV$|Y0EDko84b>Chh{55=IAMhds~E zped$SSKqep1&N72LSQJ~yu7-aB`u8~C9AHx*cw_BO6=*lde@|M z&gCf;g51;AW`fPMAUb@iars3BVL-*}!(>(q1#&ROOQ;|}fBuweo^{R&{U_HG|K%2d zE%=JD@vFIOpdu+dKY83caQ+2hU)&vYHBmoykj6u_| zOVOc4Tv(VS6#OS)VZL>Bbm()4lFv7Ez?~69-zIz+urawfi{Z5#=waeY$FAL1<{a5- zieH_3aWsZFrs2OoGr1X=nO@o1+4X@*N#^p$#$@?$vVy3nDEM7{`D5O`#e4oaw_%{O z>pgqo#cW>BlyldK=>xDRHe)Y1a&ELzXlplj#*JKI0*l*1@=uOfg+-X zYm;Zll#X7FT?mBf_YyxeGgYDKo*3-hKmvR*2^eT-XyAI56d5ZC#~@;q?p{eeRml2l zSP4>v4*U$<=T89BY0VC5b+_kQ6QluV$zstWl1N~L{aB8%XJ2nrxOMAR z+F*9Xn@OB^&~Ph!w31g6esGZL{%v~>qRDvjB*u0Tfu9;^2)8E2!aj+bmN+%C3Ft5F z35|^8Z;Db6|M61$O*|(P1y{3i@XLY`b@e09$5(6l0gWr222UB>iKtX(e10xu*w z55DB}O0IO{2>m8z?#tH}MMU5HY@VddY0&kwJexO4-hC&+kA_wYy^KZEaSXO~&!DAzO{2+}fc@UC2w{YQYn;N|TUWUyUJ zw$Ot!|RIc4%a^!hSGZ;d=_kpaq^fgRJe4E_WGiaRrCC^P+a}i%0zZ%fdzJ8q- zBeI;&zGSs=(3|@ZaAEzz6zv_Dkku~EgY-IdX>N;zgPG69t*pI0R{}*XFM{#NrsiO` z?%w8|oV*2geM0TYD=6@lh5t2HW3cAAa9v&o-*B_D=R5liG;9(S;JLI~i=o*NWBhu0 z5#OWl?0q3>>1W{48LcU39LU}Y5|Slu0H;`-LTi4s?G&tjNFH|~(j>3;hr0gWMu(moS?raxxoqS%sl4fNcj3iGUCi}c~l$(pM zVlc;t>-ffxUsLJPIL5x^7ZamGmwf-3x|^7IPhegc zRVtmk&!51r6Aik_QZE(ugNx>!cl%v`f@b$oI%VbA-XXI;{y)uf=(+Eha3`G=cv? z&hD#yA!5NWJTpIkYVg}jaQ|c&0112XBGz%F3CwbVLOwX!mX;P`M9=r(LxuIV)pA?D zOF4(Yb0y|cXW{)ggxoNf1ipb!jWb z*Wzd7k9qp~PVw{boT-rtgVO{fPY*fB3mtyPYPgqrEgA{Nf%eDA6q7jE2bRRGaPyaA zIb#wMHf`9j`Ox9R(5v=hLcoth zb|?1LDZ;Wh1rn(Y@)BWrf@=1LB|<%pz|D??V(ku(#ha)fEJ* z=&ORC{X*A&?=PTG(0_DatF2rc{&Oh0$wL1^y5SU%)?M2IORdfFjUpPn3Z;QbtPRj5fMFdL;>e5 z5yv6`C>XA<$*R5fwX?~O0NaN+1J3)8MD}2Wh9(VRObT&y@A0hFq~kAKVUZZd*YL11vd~I%u+WwQD86vM0_tesSoMpk$(N!35Dmb z&Ros&2EyCcS91Q`xrxdCQwvL%Pk^aBsa~WKCb$h#)1=ICN=UYlk&Ih2<8Us?evF+w zvtT3P7?q0%oAWEVm=%L7fKcTs{6~-^Wf7_l3L&-F3wg3P~zaIj(o4^;T;w=z;v ztk?sX+|*p@S8(^s;Ll=Xahw`iAeYnYI7O@$hm5PI;?r5iVSKGHOy6wZ-X~^l1L3umcZFQf_}l} zrgtI_6uk%)26I2eQBVpB3Pd^bZ`(k^e3Ud;Rx-|!=h0BLkymVyAzZ85T460EhGR&d z24BL81D#5E0#kxmZ#KCm;VqyjiOGMA7jTKRdcSj9XMq#qkKC&h7V^EQMhZ=`7}=2EIdGxqHfq1dx$={nM%`rCKONmB_f z)A3%IZ4Yi=ooP_$#f>Xmz4{vC6g+T2a_!rvh+!?CE7!CMnoN_sJImZS#-#ce?}(C; z62pt5wmU{guT!H25U2L+BiYQtPEI1;O{txf$Ri5y38Gs#Fxp*W zfQ$1S#ZgkHRaBZ2*HIL=fLaL(u_z2|&pl2lS@@z1s}MXqH6wKZ5+nm**hmlx%1y$> z%OEIw|M;QdzZ5&-esru*v{C?9#o0X%P|07tg@{e;4s2{L5fM$S(CePQzC%aNdbmH8 zyD{X7I}Ak=|8Pi0P$kJ)d~$AXJ3(yPC?CV!VEQ>3XzOU&DH-EBRj*gC-V@rB z60d?-XfPuS8AosPSJdk3*kMIasu zVkuN)57%V>0dG#c%MenJMp|>W0EVs@!O;;TJQ!)$G5e7iLq|s!tvZj#Pr1qGmO?|k zzc&b9>N95^cyUsdAxQ4wgrY5Y_VoD5dvTlrHU1rWvrlYxc-G%$*(njEIzO}_YM4RP z#gzeW=!pjm&22j|6i(&EiCEqO;ldjyybMan;O)4;c5FpH!njXIA^%vZ;T}X;s>7FZ z=!Sn}?7$fQ;gIv^&odIAvtiRV)x>_BBcXsIeGgt4wGbXJDvP} z^LIV$R_bhvt2e&BXjB@35o|vZ1MvOt3>~OsPL8!Ya@k>`crdbJ_j@P*Z zJ7A;Z#tBBsiTZ^hJw2)_H`mwRe_IX+3}hm%zV{@Jdh30lT`FP)h<`z9po6)LaIN8y zZZ3oQ%o~0u*Np!i>Q`Aq=G;k2T;b6#$WmyGOR|q3^i6I&bSz!AX;`9h269Z7OGAwcVh zLfj*9=H=%nb(~UEyoaH9Uf88HP$8nwy>n72Gzlle&bk@$IDyy72lJ8n=>jb=bM6f& zwE4*MbC@jNj(T&LzjhoO)C=AKk{q5ezq<*D^6!Vju>VU(#j3AQh8h#>J8_7?Vd5^(i#!-~07Se8#clASPlT%!aqLT$ z6^u;fp8T5ai4t1S^cL17WaAu(oxt;0mp!XB$C5>!_q;lHR7Aufm?X~;xdepzqw3qU z!#qFI|8N30Up9~E$0Of)_{C=2#MkUU`IOPaZJ{tZP$L}acOSK3xR`T;OUivk$9x&s z^=}%6ZJciw-fVfy-NqB^hC};eIH^1+zltC`;+Qezm^8GWG05Kv?{7IWeEW`JU@ELy z`G?O%Pn8-zjaa~rSNbh2p6H%z-xoxGi8~ugyuh1~@!w3N(^PmV;pBzJQfT5*Xz_K) z$YErY&1iAFF>cBIBMOHdWZh_00D|Pip(~H7r*HcW*lm$(G`(>&xP4OdR9C!&%U-OV3P~!4Ng_LVriK=p`NUDI79FB zXFMcs|6v-I zx#sTSaGV2xDKjd-G2W4<2OohedNncLDOn0Q#+4_MI|m1WI*Ah#DQC?)F>W$_m?Q$S zf)^d?W=vx+pfBYj(YdeAYTLS5ktN~?t9Q(ad>+dCJvMGfBJg7szd+(Vkp5&-^llcG zEjTtxHIa|FP3*;J+{j}(v$d5)a#9RjfxBmkb2q&(z+Yy+hJ!;e7;%y~cPeeOo-g;G zeFlR0@V~8|pBtZ*!}$;8m|tC>$I$p&m+1q3%tAC>T?ZNBdjcLjC`IfNPz&;zR#Gtz z&9f-_gA_zgA`U5m!nWJe7*jh)Y&?h4ag-i}EnFVH)7iS;R20>>N&^P~NpRvCIQwf#q#Ss!q zpcH|Oaz`y>Y(|}5^zMQG)3hpjoQ>RKSoY7S%~%mHZz)w?eDCq&V_sfWSljRS z>gUe#h9O5pa#{K#^Klw0DaSoc)kM@0%b#gI0JaF*KEvWL&&>P8AYtpijpz*gvJS=j{^QL=S&>+92_qpB_yp^=?S87AaE z&m5Zv_m?+#7j!q$rMMUvO^}Cs_w5rgS!V}t)}H^ZqQdpoExRA@3x*t(`%-OsX18zh zhwo!FT<)$x(7nRN3JuN9(u~FamSZ*Q9O|}bRkkA18Ek#g#B|aBfhOnG_<#Bj0J!{V z3mu5$!Lnf@rx0_9kvVpY) zPUco?F`9OQ{h&;jf0*6mUt9VyL~H%}5t8*^o*$fk*`6Rpy8YKq+4v)Q)+@&gy9mUj zNblqJ5T4355>@NG_7WmI!v{aIUp*gA2d>`3?(Xh`oJ-5gyU*$M?vdrnqYoloHXwI< z)Zl!(>^~bqclZ-b(;dlxdQ@m*?Cy2$+-517(0&FrjT)ct9&9BUAtzVg z+NwR*%uJTH_)_#Dr+<;pT5MY;gh?D^*<=42jMCFEBC2W4{d@P`m0n%x^vld)Q*vH0 zl>df!mwb`XB${L(H6bGhL!i|jZxFg>Y`g>YhZIpA{d2bx34;R)4n)`*_)^j(BOXr= zzdsSl#kHCHZm3-TShFI#(!d{&0Dkr(|9L=#h4rnwPt`>}bGaY-Q2O64GBHRaI$HN3jRetRG>r zqCDY_6CmR&WLE~E=^2!+U%r1of_U`bUp8bSmgFinsjytTSJIZ zsYDOr#1L|_$5v`$srf$MXxqI7ow}Q^)igA8 z>TsZ_F1oO;B>V2@^_Hu(Zd?7AQ#%oDh*YSpZoQLgoN*jc1zuW@&fmK-^D>>J4i0#w}d>ytPPcbY|TWDoV}5VSSb#HrQkPR*Ic zz1nl^-nyf!&%rzw$tX(Yvp!BO(kp@udixl0wELnnG|n6+Q%2y!O^ft^ecOHHtJY`Y zdaumcp#zDixaHl5ZJ(a>W`&454ig+$!o|R1PO%6DH7D8Lz5CxHB)XmRT-o{iq?)Ot zuXATh>F@Q?aMIbV-sj{;_33>jrwPbKIq!_r={dI!4`;rX)~UJD^$`!K9A?&z z9G4TGot?dq4e}m=JLt*)_$NY82HJjVAth4sAfRykN}Zj?`>aA0)YQ}@&(DuO?w0kL zBw;)d3w`GvwYfT1R<(ZmHAp6aqOQbJ?;!13=(jk$ex&)IPLt87ni1DQF2?09nOX|M z8~(5fmp?(}J$L1VH|1UP3~uPoHfwOza9kPDV%ea+7&ekU&2oF zx4AAP#!GGbbc;2CCr@?}`DmEBn(EE7sulNLP8VncNbr*#U)zdgK#o${u9LaZdn?=i zYfqr$pG!`KGfl?rt47N%wv>O0(6{&u;N*7gpVGN`MbmAIu9K=Nl{%51dBb4cwRgqU z=1w-G^K_I@a;+<$Ro(Du?yMq=Wf@Oe*lBGf)KSNfFSn7zxytwi?&)>DNGM5a6j1Mp zUW!P~5wfx!1*&{?dRXrP13D7+{UoxbHg?suU`M3yxSr>O8)8v$?myx328uZOG6lns zLEa*pf<~WlIg9}F{TF~h^KnQ-E7P*`%C&Z8!rCRq=LCnAcFm-iah+(xKZsb0w32)n z85Xbkz*J>zp`^rsfbnM4!yo1|5B!yoQ+v?eeIP||TZs^P?@KiE$}h-yWT{GR5lfKv zx^?TQq%_?pB^sT5Bwg_Rdq}=!aNGEP@RB z`%HTB#`YrDV)Q~6{75d(4Oq~ku6WH za`y;-=3Gt9OOJ_pRs8ca=Z?Wb=(Zh1+eJ5S_k0qv@@^g=Byn}0lrMWb ze2d+WcO!`x7$m&6IFM|uT;1IIJ2vg?A>x??WY2xBwVAA_;B!`rs>l=OlRa{e2S@EW zZ^P$TCoe90v~|VVvQpxd7!+}gGdZ|h+hNnIR=Zgn?E%Xsm+S?fs{du~?Dn=rZ&$1; z`jsaIdj*>^q_VL>jsGTEtMjGm*^fnJ1uYYHhe46MO2$m8`!nkx68w@+?mtED0Em`& zP{b>p1hb4qS^|pqn&&$it*saVFi=6>JdxUVRj9+8#a!$nr|{{XX5WXQNQ7Z#G+lDh z1Pvspw8?3}yRd)5{zY~Mow&-@g(B^zxlZ{$za8EzlWr-O!ouyIf4EE_X?QBn z=LJ@Ngz)Vp8F%w%Z$4&d6}R{Mo8Fk-d!P(Cgi zV}$KEi2hSJkH>cyZftA}&!+kIV^9!SOHGjrJjWB*j--(98?3Ldc~_whfX zgX1sdLdtT(?IXSy-IJpG2rbcX6qqAEN(1LGf{&9_V+?%mBr;l5@3}&jTBX__D7rJAosPzZA6m zrU={mcX9`D*i^!2N6nXdnG!lxEaPSFEN~8PgFo>Ul7b3Vd^6qlt4VV>@&7hC&wk!q z9sX_A-mflp`!U#8F0y6n?m_%`!o6qb2!Jr-fG#lh@youn~a@z zq`@7vO+(xxzN@nSHgg?v?2fU1H{?e)?=Z|&||KtU8slq(Dn*t5=E=(5WU`pPbKCL+tf8Fx>Qvx6hPk=Hn4;?EwCdBTk-l5;t!<`AN2 zTOJN)4HQD?p5trqas0g9=JZ;>{<=?KG_bYYL?6WsLhtcA*IG?+bK;l~lhz6JTacj> zW~xWsC%NfwWBzP|40{w`zL@(23pujDEXyIO4=x4y#*H*{lo3ZYB;*=TqM8^=D+B4- zUkK#Uoui8w3jejdb7uqpH4#-Go@TeBG=C+)Ad(!Br-+^#x&ptcDh<`^D(XWFmPaBY zY=$&40Y$`p5QHXv`Lr~@@kkDkL!4%%jL*2a#H7uZDc3yV+r|yoaO@`88YZz+jx#ee zig8uhS2Fwas?r%#gSXfp$UGk&gr03x)c)=;Se?j=!Q?gv#S>PdMOZ1`R!2K=E<)f_ zrtJno6ghRrjybKh1l5hlD0km7TSnxdQ)n%Ju!*??Su3CD78n2D5U4{J_)Z!I!z(@3 zdGn!1Oq(`nf?>#W0)@G!I?&|^?1sRid4#U^OI*Eb)pz6Yix>N9xlcL^L*akjkV~_& zej)zZOOFLZOX_c185x;*^XL1r^RdxM==zRuBFd|eOSq#B!aavm?VefkU@*4M{N-E} z4wF#<39mYTo4EVTcbpDx8#^VsD~MRVw>}y&Ff_O_L>4H5@HRjpKR-TNQnIg_6)$8O zwBM)hx5-hCg;?n)>QL}_!3uC(3HFnEO3=CNwNaNdv$Kz*w)<#)w=^ygPJ*#YQ$e84 za3!e!bH@KzAmrE%0+tps3^AtY z|E1^?XQat0n`!|S33|NK==CN`rv_~>3ciJPAvr0{$|?`GBih|OCb3Hiu|4a?sp3o*cd z|8wKOCg4i=WU#24@WIr8^XI6Z{GqW}w^w`L>qF-Je}9hndy}5c|7U2_|9;^A{IA2> z|G#ST`Fdg?*bN2EUhM(&UcPxVs81K`I*Bmi1gU7>o}564v9Yl{1;zR;TmBwhz3O*k zb9lqxczxN6SPY=U`ZYA{vo~L~b}f)LK!LM|N5n^~uwP^4h-*83^5n@EGwP>o=6BT8 zygBpH`Icd1Z?IRd6-=+SYY2QaPGj@h7!O5uh_6 zF}g-hZ(Ypyr))h82lY`&$wMW(Vp~<}h0-kz4m0RwxqT!o@|WHx#hS?0rSt7B$WLy-!@18;P?W4MS6;fQ&WKR<@Rm4NhWKR~rRK1qp< zJtXLE1~*%&qMIR1>ncgbd%Wk3TE2fl4L73{|Az?XY`jkPPT536K3xutU{S9rsJIci z=C%px2Sib;Z2f+Su*reD^jjv=6?Q{;C#--4R`|Vo@;6L|IsT%G&kKAz zNA_Z&?F8FAg_0u6p{cCCmpM6IC^k((LTPTg@YU#b-r{GR*@ z&);)h+skmru7}6N!unDjUM`-R7W49NrRmq7KLz$WV3)q6srutZpN`#r9H*#~pSXm_ z_SAk!Q&m!0+pYb1Tg}-_1L~ZTqO)W7?m4K|=BO5H6jKL7V2>1K>b)lL7a{4}U)#{J z`;Zy2v9ZGu2mB@$gLUxpx`G#q6_Vx3TmMHkg3-xNrZb26BK0WDQr(K)6as`pVJRf{Rcu+p> zS-F_$XCFGQ(12pqkN6CrSec{{a~?A9;|xs%DX*Sk$lMOI7~Zt?)=xw_*xh+pD@jk$e6a* zi%%tL;p06g#A$rr)9vZ*GI7~*Clm%HizNTNp%pSnzgB!);BGny8lfVlb=|X`gQcZ~ z&0P3?uFY}?w($b{yP@Z=weg&W!*t0?D z;9$fQCuj_zHA?RE#pISny4fv4*7%VpSuFqgP|KrnoevR_X}EZUu6x~BPx(t(+-DM5 zBHRfCHI6`~3}zs%iTgXg&UMQL`sk7DIprl}h=?iyp%K?F!1gP^N!!mA!ZJ-(-O#Xh z+;}&*AH??qlXx{d7|0Y?>>WNv=*NM{5B=}n?TM_>UuL(F1q=pmw!dvS*akZ|X70Y) zdYgE*Tg%rM#%zx9oZ;9s?PIvLD+~S$2=HL@w=CU>OglRR7%mip99W`j6-H_9Ux%-T z#UezX+Phxq^ujqqH8~L7>Uyql(tTGrC^8~q1C7`>hj(ykLKQ0-@gF}Y-Y+_&5AGlLz>(MYiqUML1crC0ODXei*|?4 z{kUTr+@Au#QO1hQ8i}*JyLs%?9~womha2%94i%H%RGOK7v4S+hF`z!}+q6+-;@2ti zFK^P)LxIprM}OQ8fPc_S_3$M}9-^OtVXyXYuS^~$QkXCvGW5&~Z1L2&bGf1z<=3g2 z>6Y*G9;6G})&+`H%!A}V^;!(w3G{J1L>&Wq$c-i?Mpx|oHjlY*UGP3rNeQxOfy-OZ zVZZo7y~KO&s7Bdrqo8C!E9TIra(V7xPz&PKjVR;3Dfiz^mgfn4_`%7FQWDWZ3wDp% z3suet&QO$t6lptl?Rv$##e9EbrfVAssR$?@mX|DCYnDZev7zX#2XbvGjyreD=EyV3 z?~AG61r8IkI=lzR{{pIio6kiw_(-XSa2@aDBXFIJB(a+OIv5D@kVi*X@xE!N zK7ISfEV^7A^O82$AWuW!Fb0P1raw5gJ6^~1GKx(=ajA()LXbbOsyY^4l$zUq%I{(ZWi%vrtuTi?8z8sP6w zj`K+?T?`LNUY?#JYgy02^TpKJS%*C?T?z^Bll=B=|39NIE=I4yXwJ5jyl#yvvS;zX zXB&dccP6;*f8g#`XEJKCLFc_q&nj|)a%B~)61%P_HZ>fge`)yNgxs;`7pd(3ayd8R zR(I_(t$&>q$M()*ck@^}0Nr(vWZYTZQ_o_sUz*C!A@v5`n16J-xTUx_Y|Zv&UD7m0 zbe1wD=gl{;)1blf!z)rNR@N6*-@oAFDk~cxRX51$qx{{4wKme5l!9JNubE!Iv%YCv zh+KWt%*LJXTcSfEneiL1ahz!}8+$u;3Tqa!0a z4|ecL4*FS~Z}C9Cwz>P?GTZfkQk!@eR6qmG9pC8WrUsUN^s3F7tY2O?uD;HMfuL^X ze?O7;ERk?3E;kO}oHW&cGi}w2yD{4jJ+%svd##5vUMiK|W_gFki4$wAQtj6{qw{9VFd9J~}ZQHgb3HTIr#Z8db8IKmP zkU1DqaKY14>g2o|HOT@%K7c}mq;J_;{J&c3BANK`ThI(kM~Q1Yy3qM_CDsVc&Usbr3MZ9r+_~f zx>oIFtnYB7Pp^=U_Qo>IZBL*~UrbB=6IHkWJVog?ijZ^QRcEi&qlJ=6M?;}=Tk7RQ zARW*1q9+OW2{tTK@y4o#Wf6bE}!znO7JSywCGv|zSK7$V;B+l@%v6QY&`@ks(KJQLNit<>` zH}uPw5%<@?54?yZKv9%IEENAeF|)He#fVUFurkD_>ip>0Pxn|ses4s~v%ojxas2#Y zR%Iutsc^4gh}WDpEko05>Yd;5GBF|vVaJ|5FMj4|jK7r6`Vv(MFoS>OH4Ud8{A8l; z7g`KOl6IJZPS+Vy@-1Sf&G*i3CAHN{{!|m+Q#MHPx(3gL2=S%{M#V4_T)Z-sYlbrG5g^}BzwzOnvRvzhROwwTER5O&04)F8FKo-{CP5~C z`9(dM5JxBjB(u?Mz200^{;1puu;o3@Bf2-FTYcR5}Ynr7l0Um+MXfBqk%* zfJ`NQZEfJ>3)Kvx^O+U(6|Lun5b#IwTM>0+k!d)hERvxazgsJo{~^ZV2!?(C9ai*l z;v;n(aLcjpG<-0^(S!<9;6W5}+zca;K^8=xrH$d$od6V~M0ppWJwZIxm&bHOluhO7 zqGD0`5$nh}w+=me{Mlg>?8*ZK26KsPyqxsrjXl;;gdx>~B z)6~?UG*_7$#m`k%YRn^V60uAF|pY?Z)8O0Ww3Z-luh&xluP_hx$6typ1&@em_Y zEIWm5Hjm7v`=}ML36>h{VGb*cO>ggHgOv1i{ic@7p9v}!pAEiEXr~DfY&UdRISw2n zX*=O#CAD8@Zz}Dr3gSYU%GeR9@EzNH`~f3bs9!3aG&c|9xTcRT_WcryUK?fp_&!Z4px*pF2CYwobBig&kXu z3Fm~1VUt=89HZ!T`91>nq}S}WaG^aK($~&yntL(+?qNQ@KJ23dp^uo)(SuG|ya7u1 zw$JwaPaAuKOdJS7rVp-XZqwX?Xr6fQ=5#pTzJi~|AU8*KzA1l+Q>d-PKSmvLf4D?( z@9*{gl9%{<+e&x=fe-SCSAl-$z#3=r;Ah)yn%p^UW`8w0bM=77v!#v%C)XRBY_}O) z{OKnXv6wHsafbydWQ;c(B;=zL`*LJMqLZ~W7-`kY53|r_5t$)U;7QPvn^eIdI*wmq zI3kguGbGJHKDn6NhSExqy_@X?K|tF#T&V2MFV9+Hi7+G%gBLm5bB*d}Asb*Cri~c& z%DjOegu(IszLu19K|&BF#2)z!?#MRSLcOT0;n3vh^$9c9U=wVdK&<4H6xedH;4 zHIbPi!tUvmX-Gg73oFbcT{b&L@?a(F-<%sMl~h|>JDKMsDZRT=8<%4z`gdV1d{G4w zN*;0_9Ai>R%7DX+b5_~%J6pNvKOL`LVc2J;zdS)ZM9WUqxnt+fSYSkh$Me%oJ8yd3 zhT2wVrU~KZio1R+^Dmn>#K}%Jhj69ql%SFk9rMhxSrvfrDD%CYET6VmUTNcY;)ltC z;jhfCE3Vr#6PWiLx(dsEZC!0uFXFOd9wwNg@7cOa*7AmyZ1&)Hn!51M0Q<{Dms z*TiSlmY4c=XTG>91B*@4*PyKuMjebI7yxh=6-su=6sKCO*2RtsRC_GmHEh-($d&?d zid6(sbGLaHL_gd~6TH-G>Iz?N04?Gv>5bamry+h45#)GNMFXWFfy(oN0*~NA`1|++ zO|&8t%`nTID%aB0WvYl>WpiD6B`NV|hBdBiXoU(~&!{0OnPctRwq;k$ew2N0M*VX4 zgL4e`crYWV)!cuIVZ+Un2J-V4EI9UJh)q@a?}z0vpSY}EDJ-UmS5#7Zf%cV?M`Q9T zJ=*NalY5iq_6@5TIyY&SaMs2nEjB>U2kJf>Ox8S0=@Dn@AACmwNjjKyx_08Y^NV`P z$hacYBZ}oTr1eb#hQPAslSzXbLi+91`on3f_hPqLfZ7RGxh=1fpLqkj$9SxQ6jC== zXsirb<-)gUvneX`3S;7l6eOr6jvS-@iDD`yG)3P)9|1=2gpp#s09Oj)TQ~b=BA-_iRo*e9Ei!_Vr%RanFfpI&=bGzQn$SA{dZFj_k%a z=jLn-ST~}~E(2Bu+$ly^xf~1|_UUk8kKflC& z9)pHBXGcXhwcF&-!>Q_f7wE}TG>kX)RTmk%Ckyl9NuOBy&{s>x(0}(a8J`LEi|r5V z^cRSJAPyY2qotfQ-am}ub-lztE5_(CpjqxwF+h}1IG`!AwQ4NS^@X5WzTer+>+j!b z!qp|1V-KZZnPv9&_8X{B(4dJtL~2!}ky{KxL#`eiucA_BAN|yR!cLD#()wsom{d33 z%-78+US&$NWdO0Cox2VFVA8GQ6h%d67AE>h7|xR-XFqi9)50e{XoZ)njVv!O|5{ks1tv-;&du5_25+e8N#g)Xd|GtY zoU>b#Hsin6zHwbX_Tbe>tBizeB}%GQuf{QL0^ZqZArJKK!?O(c1Cq zGp5hr#^j8foZZYZ)g8d(CHK{G#*OSM|Ja|ih8WKm7(7RwUqtSt%GrhsUPALIW-K)R z`3Jl}ggS9zbVobz*1f^@#`deWN*iBwK6+h=O~m&W>I|{75ab9!g1NalM`1sjk9ex3 z*QqU_7_>@r*myJ5)mKD+L0-^r=&Y-?8*idB!wpaD=7LXX!{|7qJT!o({&m|iM^y5v zq6-Hz`iH*AqWzRQZznckqZh9ed{+v%j50?k;mpjOl0V7%oEHhfJdkgvFH{xJz*K>O z=pZ8*bYk-&$_GlsP$RbL$&;s0_RN>iU;u+CaK25}D)FHW%t1B~ks)ZNk#bdkOF;oZA)V2SBC^rMXCrB@9O#+ZAE z#>KMK0U0W)vhP5Fo{a}AVAUtGT7@#KM~@!lZyup(4IJG1+m|L_9*QmD-dCG&9hWRx zce1w9sm&AK9+Ww`X?Fj)C+?mJx6}J`tk2l1yR+ztD^oSnCo3w7tW3yUDTTXB$UWu3 zE7M+G*cOGRmy-8Ngl%i#iw+7X=K%b@g;$1?Pw>0qi>)grV5W3qkEfGpMntj)pj^PU zn#(J58O9*S*F8U|$zgq#uPFGYcbSXT^1&v*%&#wpa}^$Egc?Ijj{+$a6cvdqTc_qJ zvog#1IdM;RE-vH{ihF(9T}8vi#fA7z{pbVxc+EH6#){FxY=Ca`^>+eeXc?AZS9Oz* z@PCpIJ5O_emTCu?N+IKR_S&0#{W7QL0@s$cWpN7@#Me8N+%bQBs_;{E`9j3gs~&8U zTemKc2XKm()Zv}JX$3iQ0Y+g(w27XOxH}6Ir_5B>RoeAKQF15blFZ@b@goOM-S&#q zZlp&_AiZ<_^_U8(0Is0C{`qVK<%z@Pa&osemb+@Hvk` zH2d-JKqaIpyn_Cvcb5bg8SFvnv0sv_bX-|Cr>VpY`i;w zPz2B&aOfh$m2CZ!99ztu1CMLZ0@>Kwa#*|*Vk93pHg`mi<@VKL9w#%7oJvTGGto?{{m}}{jXl&sf9UP+AF)(O(>yIjz9}?H{8}icETOc{fUs0m6)p+TULw_F<@kPN z(wyh~5xh~DD>s2D;77#x>pi3#>*6ep_w60JvF68Q;C~ko!?5+Sb16EfV+qw6P&C=p zQFN}{`W_rM-+1u=p&UP^m$b&lw6=KZ7zSUWf4D@nfNevKG%N1ar-kg8T$RaI0~c$@OzBA`<5UcH{vJU>jN6A@vddVY(Rqg)f3Rld-yy6B&W z7U@%8*NH(y_4UPH87O*{M`fYj|5vGTW%A<2+=^oQ0~VKNvghL1@CuDZk}qVoJynZx zSgr;nAJZ~JOL-l|lE}2jJ>QRW%&~rRdw!PK9Duag4Moi1qQ^cI^l^E4!>ucpBwX%2 zxAVv&e|tUMGgkeFU&?{fFJDBx&#Z`L){igZ_1b|>wW?_MrmT>htLpZ{6%?#-GcCp# zGFeqMX<1HBUTf_0gNLW#&S#NMTz9qR3(~GB3_B$Be;Dt6v2Bk}Bxyr71=W5r+W)ca z+qb#ce8`$RQRJ)s2)IDRGebXJ3pf){YN^2iv2>+RpiZ+Ff^tB1_n-aF5hd$s+KNUF z{qH&k$X!>qBzI<%!n&EA#2kU9>eOxs+vi5uOkxVfVcz1n@rzo|bgWQgOQ3sfv;Os| z6`r=q?KL@bB( zy&~cB@=wUBYtgmoS;QeZ_Nlgw25tf^{ind+NpywqerJmYX=^+5RE%h^QA+odQCC~L znV-KFAQ^KgEHK34%!q6wsIu!B9D*~ zrNaoho5kQ4LHN~Fw||-)WWWgB1THCQW@nli*VSlQ#YoV3jhQ&{4B#dHiQQcO`+k3E z!|A>t$RLf*BC1V6iFDH2OYc*+?$5Zjyd8|FcEAefbLV<-;{_HYLRcVE_G%qb+^I&x~hS0LPr~fqE(OPJIpHHf-O%fNvotDu-J) z`tL0$(d;j$cZAU^;xxtwwOVI8i6~+WxO^J;Dg) z)@MFtoNH@eZf)^98a)_eThw&BcKQ-+vn;peCFQM8X>4^+%)TL}#LUBYLt5Q(VY=J3 zYo6~i^f_}FT5v^i!;P%u7d6vti@Kq9dlG55>FpJbHy+C4knl}Ya~ILo`+ZuL+_^)| zywGUv zZuXGM!|+owWy`zu0*mKQqFbeJJ1lH$AM?E^XaD~Fdv5f?9$2uKe0?#WjGHlxh;3@F zGXPEN(!KlZ^yR^4#K)$8LUW%ZM zqac}KyGm?m5FRBGEPj-zGaE+mB&U$6uZF%ucbo5TVo{IJO30Y=PcR&Gpd zm&8d&()Ka%r(XSQ|8(3)TDH8KXfmK^pF^JF5R0b_C**^!SPNy#UOWb#xmT`26L3`= zrJihUQFG;~ZrrqK9w(2qa#2s_`Yzxw?bPFE_S0t8tTfhCfIlWuUgpfPykkNX1Furd z(i`ahfKM*kq403?j9d9{yi^q^!?J?Hk0G{;BV@T-M3A019jUeshEj((W`X|Kx+FD#7N0qR#sF*P@|(pOoA-+va)%NNq)<+ptH6% zh<;A<^40eIe9oLrH?8?RA6k{B#)_ElN$$E6rs?`FyGQy9C(}z^jpkQ$rXEu)2Z(M3 zWK(C41_+7ys}sFH=wP|i`T};RV4i|pQ8R?Q^H*S0M+^p zv&XS;;5YPw24POwvuDqYHn-qCf>M6li0^L_z4Tz)4j&?SPY^>toFmH zS7x+1x`h*T_M9#%Ti#*Hx@Z=*w5;8E+zH~*iXaeKHUGMStj6v9 z<6>4UnKP*LDv8=@-$~&!QCA$~$duFU12u)$s-W z5f`J@#pMc*y4_-FiPn{}<#%Jn%^=Pd!0z{5ZfI4MRkb`Zdw7lZf>tuYEBiciO@3Um z#O9Eq{kW%aUnA<_4qQ28!9gxW*{4y_k9l}vNh8qK|71s=xTy3$e)Oax4>OJ5gK;9D z{@JZ|dTP5%uNJlV&GUX#y|y$kD8D(+pw;S@e*D^Tl5E~TSFdoxKncs<8Zm_$@x77Z z%>~-@Ng`t;%g&WX5s_{V?kPC#%r&$1?OU3T7PT@dq!T%O+aqV?(~evK-(WgUC(+jy zSKl@ax-f*o^<{2jACa=n8YYQz+2d_S@&-FHH>sa>aVg?^f-@gNhrac(uC7U5;jeWo z%{>~Tf-7v-Le(VqlTVPY-~zX=m=Z%XRI;WF1RJH>l(n*iiUX)}Bf&y7TkT=eGr zOOd3uy+?lJ?$Z=IT(Ie0C6#MS1&(XCILw>&&HLHDVL|KEt&C37!*qG3UbG~cDnR%sLPPu4H&$5ezuWFf#EPsg zzwRuHb)%t6_tjKG$Mu}Z%4)r6tDE8DDoEHAI4mE zHK899~kt$Gtz zLZC)Tj~XebMzm1Q?#qBqRM(ZURtK`t0$H%IW&3_<>>1j|)AZ%{(DVfh7h1ZtTNS>2 z7#RzNO;V_x1hYJQmeVIo4~ zfmw1QjFNu0MZcI0nDPLp<$6oYB*gJh-tn9ywlQ|l!*a66D(mX9jV`bGlX)qF^Z-V$ zv^10{0522&K~U}_8Fjg2x`Q^mE$_U_wP?8gyaC-u^$}a`K`Yr_g^)6_Rh&i=fJcCXZa(&OnTRL7lzHKvdo}g7uEJ=+oc6u z9({bf;aM&}U%enj#bvs^@3h8eWL(0Nxy#+jo!O}=Et%;P$Bpr;2#WsR5VWpk`vTW9 z@<>-X(>>Swb4DTG1>x?|zm;Lv+u-Og)%ZJYH~ zxGCB(Mc~4>y+IY#LCO=&;`VMfTPy9B*K%8W$dIzA66R7(f?z&FrG9zR+PNf0&|35X z%q_|Y`rdAy{>|aHzejh<^jKKCIP?zrL34eV`F*gaX8Kl;@2GlPd5Bfs)qcAM)3SoV z3281xR_cz{Jh!yEqNhF%wdO1H>zbY>jUJuu*hay>B8SJAoG|k_!}B~Qo6ews7R=VR zZA~eS^AGCP|2Y=ZFlwW5v_igrkF-gvAFp{38~A%_-&$JngMJeOISnSmBqiTbLfrQ{ zzg1*rdLEa`bGsJ(Y=U{p)fq{nM(a1O8P~e*Xt>i5{iN-a*od9a4`+Y;{QPv_qWy{r z^74AsrW-aKJiWvS*nn8F@{E#_>Bo|ORIXd_{cVs_X_Q9mQ0(Pri@_#D{wc`T^Z;tA zcT$VAt?iSOlP#FTO|_M=bdDWW5^^9SbPK_{e7-&&K_ec2S^f6MMx!kAx! zF0oL0>gNW9id3rOL*=6s-&<3rgSByq{6i$fD+)adGv$3YdL4a1^!zNH8VkDX9rbIxVf-31&@}r(k4ZI#Pyv8 z#~{O8^E%yLAwT`vKnlcH+4CLNT>PZ|wr8#5<5w9d7vm@urPzXpKPkvn zGgGel{)*ceFuAc$KS@mvVH$b6mxY`2M2 zjFM1=I~j`)UPyWtv@Wz_=D0hi7O1zCx6AYy>Y0@q9Bn_PWO?{@y$9!C9=~Yz4pOeO zP=>#Hbp*7qPp@9ic>Tfdpq>}#&l+1=sk8m(ER}Y_(T&$iH_eu5aIi8r4_w^&Qck`M ziEM>+`A&h@g|_8AGqP<}o?aU5x65_efkFRsKyWB=Y6f>{Z|^f>NiI{}4(iP))At;p zo!_B?%l5{y@eHGVovvK#e6Qwm>#DZxb}K8s$Zd)7N}hC+7kO*deMH~(c#>0T_Hdy+ zEE++=Zxhj)fa_iP2QoW`jZ4=Xrl9En?HgEbkEinAr zM57Cd<5Z&){#h9lUgJIJ_>m(&KAT~(CSB=wb?WFXL>>J3lcUn+gQy=qKiwU;`_0mZ z2d{61U92g~_Cfy?XnefEVZfk4x9l8jk~H@G=dc*-esJLP1UZeqvST(U?rTtSrWk*~ zncDED{G~?gTdv%OlI?-}LoOuE^GK^(Z)5f7!Gmuc1w%C)N9D*l=dFbOhj2*-;uDja zfS$&J5y?0W^$aLizPNvB&E`M{y9l=xA0JGZlV<;`dA60C)@%5XDRVp|91A; zkz=ynfz7{P+9jX}wH+s*&NRDj?s*03nwqusei!O4)c5Vv=jyk|4KA^OZ^G0{bP83w z3wN%?=8M)$wa?mVyTC=4itsJxg7^y2t8jhM?7pWERLS08>9y;O`=?r&N8D;krg6Ix zFaHxy?|1*+qTKq##thYM`5NP(rWhU0Y*W7zDN|`9<^X357;xFwA-YU6#fa|{3!8F< zLzPY$rO(zos;a6$K!Ye1pcWe6Z(o3MI4wxu94KQc-)tgtbw7a}Yb1D3G{ zU)LE{zO4Zeo-tP^c+i#~i;9cmX+S?vvp=XC#g!%XoVsh!v>hWP97AocFO~kB)5&Vv zHpDlK@^wWB9XNQYNAJ@0AKo6ACa+!)qKi(SgMSo<0T5E)Z7X7NL^g_m9w=MyV~WFM zd|_KXfApe;lcRSbyp@O!yV${?c}DB+mpy~bOb?hWh|h|RJxJ7`lHIR0)Ei;|mJ$9w zX54qDo-zIL?rlu5pJOjw6WMG#_p-*N0lO!TTYBX=`%fw+bjBp=-`Om;+_etqv^G?Cd%e@^ z_`fZKm~crU?aSaeRP*YuyTxrSjZqI8Yu8(PoNKDo$X6@l-oF;In1^T)`w|3);k5bx2__9^w!0V8Z&2};fJ)riCNmoeZhjox-B4ava1(( zFNVrIESfaO<9;jJZZYIeghGC)r+)_?Q!gKul| zrNQRKeigBVW|p1FOb=`$J@_`?je<3mqBQN%T98O$b<8N=L`uMf2@|69*B;nbT9*o; zI78P@R=ZPVfp)}06UoO2{kq!eNO>vWMT&8?NB7Q)B9{}Vstjrq-2XX1g7lrGL6S+6 zHXrn>I2Nc|s}U6JdRTK3!^E@+gp*d?J`o2;=4vvkF7X*qo&?tC>6=gg2ha4LJ%4aT zyKqREZrlhlVjY$l5Uvo!Yv!`rl~tY}qmkKgO{3>4M2+TBLq$(;q9^^3j^xf#Y;Te^ zk>CBhB;wfb2Ry`g(y8cIQlX`5w72enp4vqrV&RlrVqMp{^WIZh{x=8pbx{fqZr3Yw^N12(zwaM!rsOdTIv{=4?h*OyF4Fc4U;SjqNO}z+VSzR~kCrF>u8Bre-T2ImW~XdG zKjH7-K+K%E$dGYa{iHhJbJCrfZni&2dAY3W?xv@rR)H4z5bdA_f-%t~y6NW6a4H!I zU99G~>obw)g_-P*u=C$NQKMt6`A%9e<0LmN|A4g>j_Z^Gc*O*HTWs)vA)THjpDO+N zb18W5bZQg2z1Q$@wmRN@YNu_d%ur6cX$*9NXDR*Z+WmQIGD&nr)AuS`9J~6qp+!(X z;`o?zxFg5MFn#@W6|2CO-0I1PYUcOp@-NfBw7zO_r;$Jg*+wgYe6Y&@{ypv0kuFXm z83#3OES4?l88z|U%J1TomoVUX2*>mbT%quQRcK#mk76rgT+Ij@lAhE$d8X6wMOgD- z-jr|$in5Gyp^{;GFoU6X`)lihd|WDPYF_2%ng{MD17?Uzn6fgu>Mvz-bQW9g0VLxOT3BY*m3= z^RQm}IJxLfy<#wI+2gI5T0rrO5Iq3gZ*Hiu*!JPN)2S1j!J?F+0wCvP4A)TKaWhNa z-?R@lYLgFvqHSQ{mv!m8G&7|-ux_iq#I}oWjh+B|@tycrIz5rzOjGoRAqET{^z+hU zmjP0C0x7@;^-2Vg_RuL^$g|MD+EVE7KSx=R=x9V$#R)8wSNJUebEZ}oHFtfMysQ1< zaSxX-KW{PPq>ZiZOYR|1JqEey;$k}u?aUQDp95A&Wqxv9eyfO2r}y3T?NyAJtcuWO zreo6;nnopyw0Xz6r#mF7l*oqFdUcB%XptHGD5c*hx_WGa0cv|Et4j@-xCm6LOV_R- zlH0`@#rKC?)8hLJUp*sU{YvJovf^aJC*_TjL&UVR`V)zYY_sKaVrJJ z=9b+{epO40D~QBD8m%FXHTx*KFtrWG5_O=p*$x(?D{m634HSR-b{%Vq@e%CLy~K-T zGtOrRcud>bc7oxLn7`kOijHadZzLxDLr#uGKr^5=DNH-bg*tFx`*N6}J0(lfbKNsg zp|^!x7q5Wg@(V?yxP%}&NvQwOFTA$SNra_yZ3WoJ{EL4l?5m4qY-bkPMPs8h2>+Vz zuV-NvK(K%xItyCN^rv>Z;@g2_qlNlLa(Poz^^WA19wl;Jty9O1BVaAOZY;Si5qrwz z$&bsjUpr<>sYOr1w-Ud;JPwmHmLd|FB^iMx-c==5ca7s+yicA!T@WvG9Oc;};-UR+ zdzTJbmVLLZqJYep`nvpxeiIDOIJI~jJ$P`g?dQ48)h!1583Ws$wy%(5fKmp{f-_Q* zXlMl#w^|(GLF=L-v!+sJj-;?hU2}-zh*U~lv@OGjA0IUN+rSa!s=qUgT3PT2Ue0Ch zJBKh1gk$v7sh6o~c7TD!#?BF|%2(6rJ6slhi56r^ZI<^GOTz&Q>zI%+0b+PPyT!OH zGkaD`lkH3aw{Rkf%(aTv6a3xe?Vnb~ooyVg-TZFcv}q@pa1urj0_3y+i39PeNE_Qx zJq~{7-Emp-$H+)ojf;mw&HT#U57qdMInZd8wsZ{) zl1e|yF*E{Lu<&|Rakwpr3?N`#0jrNhS zZ!x;JkdMRAVjIMcgi8otEDMpCrnTlzNul?yapsI4O=E)WFyrV0(-8&~^FzcI zM&SD{%v_fY*dM-f#Xo*5;*RekC3OSU8n)a+TsM7(4izRFj0ye0s!Z9l7Ns)Jy!SZp zcWBoSp=(Uum&VnFHlaIFBk!-i{99jNnQI+${@l6iyImNsL=@=}9f|3JKiqd4FeAU_ z0^Dh5_iuH|3CqjJZmG`|BdA8S2u8=^mHx?dNWGO`P+E6@KWrx3b4smwC1i{l?}1Z! zO?6Ifb+rgkBdbx@(yPX0$g}R#yp=YSaJKgWD$9nr&SLQ zHjoF2iRTw)Ys?_Bb}SLp#f_sQDxQi}3=s$BF)MLUXT^q3-38hc0Z5R@bZW#`eKLbB z@&_^7WCLs)0demMYI6bEu*m8^e%U!N7aUA?_KlML2j|6Gs7xI4Cjf;XY&rkyQd^SS zl6KU)61;DSv%o!cZA_-|c60O8AMaxVgIoX*P0h{Y3zPDoF&2d#$d7J@+q(2P=6@6* zw4H*x%6Tx!(}v~%*o^(FLqciV%qef!-o%Ss&f5*}5BD&0c9E#J>!D%c)-Iu!!E~-+ z>1K(UmRlk%CmN+DSuAec&WPc4jmrcCz#}f%R{hy7zq;6`z+*adxhIT?5J zN93$u>45Ajg}sbNVZ!UvYJvOI90cP}-CT*WvLvYy0=~ZN?nxAar@1L?YJMzFonO)DY;}{z9`6p>jWR-o2%gyzo3@O=`9%5vh+?uZcm=(z302cI%G={ZPlJIX{ zQ17IDlGp_36jNSk)8Ctax|e9VePXS@-!w3Bk$vW;&z}=K(hoX2ODJ&y)cP)B(nx~m zlnHrx?lqw+WsW!2*MI%BZnd=s;>u)5hy8f`>&PBbTg+;E?m+niUJJ-pyhx0t!#!_}EyJ%$nD&BqwkPV0ZesnyXqms|pX z^}Y|4vZ7O8ytq(bJy2=y?-3Zr7GRI0P?ACbgL8S%%)On_X_}FIK|#ILyfN;qmtT-f zgWMB`TvsL@l&xJIX7&#zm>ZAYlBmfaa+8lNzVPqGZ-O{@G(%RCx%&22eLq?B^=|7a z=pFiVkh;qkj5SH-vyVj>=I|D4Eq{3wyz{W4{#!;V~W#PE-%J2a?p zNTo?_J?d9bOPf%#Z6$(J7_4dbf3^iHPmZR00)12jK=9rTLy9g=W52TTW6Nw8jPy&A&%FM1Y4IBhAE zHedqs+>PmnT1C&?^Dj5U81D+rv`ZD7pP9kwpFgj?cz@;EN&g_l6esmGhlYoS4+cRX zkob{E6}0>D;_@kPmjd!N@!R2#>CgjjQ=aPpb*pm79uVk!>za>|!j zO~Tc?vKCeuZ*Beh2#r@lVqNG+O-DcDN2RD04+@r@mgZ-9*m<-~2!UodH*{B8llNx4 zg|SBMrMe2e@%_lgD*Gf^>=GG@w)hSB13tx*2jVA0(`uOpf(&jZ{*_USS4wEX) zwPxxqZr`qKeUVZ&(_yePZ)jijj5JO=PnGxABGsbqF0o0|ccrKzFKJ^*+E~0xKKJe^ zqA2yFVc=y?%JFjI7(*Q~U0g4`)T&~I*&MM1G{J6f%bLEpgj9F&4!ItI(BMZFqbDoL zcS3V9DW1@rGUr(l*}dP*?BaIW`Q@cN*K;*0IqcFL@;JC}z9MNH-|w87-F6^eZ8$i& zHGj*s{ps8v?5{O0O7)57UdKju13_6g>8jB@;>?nTT1tBEs6)M;W_Q2Kj)FuA+wkRg_Ltn{`{mXN`uLDqFHU=Eb!}>4 zQosl$O}n{JL8{;QbD<8ce+zVlvKaMeHC$sZD%b@u3^N8PCo1T83% z9wC8Xk^GHJf(_(;mY1JAbt%QL~r#&<&im2?CjEIau2kX4&TX9rA*unH9FmP;n{me2Kbzo!Q zrK$)4U-0lm&;l}UNk&E-z^5@`I0 z?g-0*o)B%FS8w6vmzhCm=o={P7rgTYE$hBQwgk~mXju;j?LlsRWg86O{qTM>8^ ztgREpO%1oM$K;2lABPYNSc~2T`aVJ8L1{~ z0H_*=US0-)R)O%cH9xO>L#oXm7&>N4b42>B0pTV1Bb3=19<3)45aEloT$;Lo#* zwflC^xHJGf2sQfuyBiQl1>7ascy94d?yp&=?&Y_*DTC1D5fM~KNI~ObWoxUyG(Q1# zY5>mA;c0=)mXon_&r#t~qK(J0anRr#90Kc%mMy#bDc5>Eo}c+6Sa0VpXl(#|Nhp$CIKUbLH4NTT0BZ0iwwIYl z%@_6q1z;oXZ-6f&j?_R_9Z*Ik!jCWsI;QRo9gyqTpeI#0$jPmHs|+iG3XR)T>|}g1 z2>%EQA0#5c5Ng@zX+pzLPr*wO=Z_YYTZ;`(#97z@$T`k@Gwyi5O}A{spnLb9PL50l z$gNwp9Y{|Qrjc0FEXqtkQ+3dl5UGM_K}#f!V&}CG249Z+(u#jrM{=&Ln-h`~F+1x56QqKbHa7V$#W5oHv;c9?Mq>(vHW5-=ok&{^A<&;d^jmry^E6QkFT@G)I>0jwpusuY_K+d+MN+Lk7!f5) ziNCxAR~U5E(EhVSKBfx@1y@x&6Qdg-g%6+{!`hljnOP(*XQ@Qw8Q<>z-Uzp6(ug2-|=!4t{sgJ{1NuF2LnH}Y$4gK0rSRvB-W zw3FO~0({eo^Abh?e2EJiIGpNP9rUd6-3V9;<(#ERQ>;YAbLgcBo1NpJ6q59v&&_!cw>`*-e+H& zzUAnozc<8NvSlbZTL6C<0278P?!1}i&vm?#h$9w+vOE6U21MP~c05aM22+@bO$4yX z{{BYVwMq#o6M{^8AZ(to78vk3+&4P_Vqt$xO$`;@$!`2say*2TNwpn>I+y%JDNzq` z1cW6NNa=qaKO;@imqK2n*t?9ed8al4HO3&h2OBN)itc&gYxJ&$;!eTKjVu8~eKSrj z%pAQnXhY;IVYT1^Q`1r3_p9r-4yK#6D*gEJ12gm<=ysmc`}}z!#Fvo)-MW7xPXZtVL+6%Ke$khAe7mNu^4jspNH0TL`j>_~iflAD%YS z?ZUDD`*;8KC-V+bCj6iO_V85}3e|u8+5h#wVtoF8f9@Y^#=m`@zki4Si9Zv-|M7$C zFRoGe)8731*V%OF!h1TGu?>VmrUYjp#P_i5{MQ>LnoK0PnVHFArP+{$H|V=n-Pf;Q zQ$RiEG8p{N$6x6x|LsM5t^$caA0kXDQRStq=a70;a%~6AAJVV(2=}2CYk_n4FAknO z=?4WA)Gla;f1~=u1XY|C_gMS3cJQFfs@P$dkb+BH$_7Rp*`M%fokiiwqF`|@88uj~ zEn6QZUCKT6SJF6#D6*SNb)0zFQ0Ybvvay zHd}8Ota>GC$NO(zpULavkcIpIaZPbhq)AaE{h$9rPw3b`yOca8<{F^LFf~}A9z+GS=y)J& zo=g07B`p``IAs3)nnU7!gm0P^$6cHfs{jt+r#h`z;V1EEJ`5TNu&AHA+~fyBv?T~n z8qvC=FR;nVx!EI3uvM+;LjhuLE540?noCbEGGP<`w;xhMTm0$MdimNw3{BnW4v>Yw zuGx&nlu+VzT+xbHBiIp5^=9@LHy;9>w7w8M4D?E_M-?fGl8i(>{Ab3cAU`4v!eepXm#D>qR z0zlDgfuH$?C3#yc&xvYt`P6y)*yh5+x_C`|AL$SJSyc)11c#k3<+gTCvf|@gdUxpM zf4={z^@N0ia&nVID0)tBRWp#r|y^vim^7koKV=0xA*6X)Y}*%ffQ{r1FT2 zw7uGA$*!{1wf}lS|M|%bOim0_{m17OM??Pev+)$7SxRhws#iBOH{W&^YkVnmOP4-| za=Yo-Yh%Q|bo**&o&yN_uZGs2Z!RZ#`Ci%0xYr}|v5163DU-RFF}G!>Gn!QjcR0Wr z8;L0TNnnM9SV&GCTfzVX1&=Lb#M%m{vFoZ!M)M^6qr}Ebprse^P}Zvsp_ZU&s0Td( z?DYAIpFq}zzx}4i1($-@jyK0P?7T?usDN2d^KquZ>cu&0fnlF%?FBQpVZCF#4NH7p^9009YR0OO}S;F{<+KVoqnOfLDazSixBp#uq;Y@k;zQ>qWb7SD8P&% zA!E&8&2k8u5G5$sQ_{eG@iq?Pms6Aaq0L#q#p5u%5jrG%xXNE@&OfZCf1Q>^lPY?h zNfEtN9F#%iOnYzpn3VNI155iR&xnZRO*7xH_ z6-GxfnPuSF(Ux7V5a-;799$P6@R=)UWWaLV16YES?NP4N0oVDSjgKC88GJyf5#88y7~v;0_`onvLsjaTqFXQg|GlquHEo`-TP~pFM)?*`3o~< zT%=9$f~F$bkue)qqwglHpJ;H2uuhn-CE}lv$=crLBlWRI0l%EBA0^g2BmF*hCJc;O z<8)meHy2iw_aS=}P#h)ZZA60t|Ds0s!y>%22i%PQ2lo}iM3j6Se?!$XK_8es{lp5X zyWHkT?-%p&bqO*M(U`3;gTa9W^-VAcMx-JhLUIZes{DAs2;1u}X4gZ2IyG$3Zxd_H z@Q7SO-Nykx{j+_esp(Jmsf^i6oBUb0c^C#_i|IBjMB99Rc;mh!otkUpj$57?+*0|T z|5oHtq(kB%)uF&e_JeJ#dJ+i66jl$yeLZne-YK~@fVyYNiACk;Jk3G=Yo7`w#no+u zr+G7}aEW5~{0dVCT!xbB0)&Pg3~=3M(R>UF`W5ePLY4)n;9ST1G2)0oC(4SnKxHs^ z)@VrT3RiJI&AxZ!3c%NMF;V3fwt;|mDMid_BD|ufOjL&Ey2=pqBbDNET6$Fv5Ujy{@WF@=qsL;DW2YUWjc}xvfpZQOw2rHB zgf4c6m<{2TM2)N0b4$6J%TGAwfneHT!d6}Z#BJ98-rsSC-ozsi>+mQDTO=}#ORK7= zq#Rcf73u}p1uy4b!a;*EY7*Qr63WKIg<#XKkr&$*3p3{F)2Cw+wNcFuVYUL;cp)8m zToxEwm6Ekg%-0~aB&(Sp0kJRT4%o%Xh800;li7?swLrw`n2xLsWOggB*vxG4eZA?boTCfv^7KsL|`=@3*rSSaxQx2oi1~4PS%$v@6AyNZDx7 zmc04nD>r01>)j!^05BMjyUvsni2>^%2M6b<2|S1!HVjA1u2>}m@LMnO=3lkie562g ziREg$8GVp%kszrdlLYB9ZoqnMi||AVu8)_ug#5z!{fP8q;QDy*fnNJSgOKt;+8rPR z;Y|ef_j)qC27>y{8et98s{=t$I6vRM3A^r&j(G&;^G${;7TldIF((hw2 zaDx9lwVIul_7WWiR9_|@@|1Ab-IIweDl5A}ZT8-2&H^-Z^6vw1@BSbP391deJq>MK zhYAdmO4fNkKDUQ9a+;cct>p?yWAEJ&RSxdOkXSYOD!i&eGE`N^KYrOs^;m&!|HlZX z`ybD&3h>oymwwqq^{7+RV*Z-Q1G15x==P^FPid;0j95APPOj0p^Yv#sx9KktgU9cU zms1vY|7*JOTs;=6lz57Dw>vO4U|ilbRENS_O#!5XsfLsGb#2Sr4 zLpZDjtyc*6Kp0!S;L8RKdf&^dT+)09NGhGc*iV~bXdIRk78g^YFhTkP9o}BR$6xUHZtQB=p0!QHF)#8~K6I_vwJLxtv^ikwPcZfv=Vu{UgyK3jm*PFV zmOO@gJ+e-7uyQEWO!L{ZN#kV;!w{Qolb?K|1Qy@>0?p}iTfJM8wdKAC0A)^F)k{bl zYb|sWL%m`JzKcTog0MxIwenmw_xALR0uzttt^v&-!+|Np*WzfkMuNhPB$stSPbn{7 zJ{0b*lNl973o+Fcil7h|KNo+T3qGm$JJ@uc&EUp(KS}AB_0QD9oUi}z z^E<_t>`-8o5Jh5R86seLZ4y21E{zy%G{?qWqMUaLt6xJT<;T z2cU*XQCf}3c@D^w$S0~EU%#clg|p!=xBDH52(Y;l8YQV?qM56RZe-783g+II{!^8s=shQVb zdOvW;Cv1%BJZI*>`KR#4fHpaaw-?uzaAYfWdB#x18`nYnj2`OGx|U&fMUX>` z`29&d5HFQp?Af`W@XQ%Pb(DFGo7*2^HXRd_@IijJ1c+mL z2W+Jcf1^|9y!t+9a4NLf)r(8B>druTRe(mP-ZNRMZ6z_!a&Lc0C^)F(axVI9opfQ@ zr@YPHOI!Bkm5(GoB4s8V_Bp3utmohGU^?MOxkq15dGM%eWpJ9@U|3y=4Lx@H z5zHq#g0SGv!&jkVKa3~`vg>~D#Kg^@L)c;egODi#-V`NB=b-#~#W~(%MR26wI!5&> zRsjB##YhJN)a4=;bbb6t=?;+(PS zr&ua@VBkTbvYQivCtl(SgEUAxg;;JnGwh6OOzf*+a(gu3D^`jPJeydmr9fO*EXrD7KtpFZ$cl-KKC#)j<|@ZXDl8Br*|Ak*XW}@^<8cN!!6!P$2RUS`y4q(W z-#>aJ{fLU)*=DOkoS#?ISDIvQdZnswi88WVWSZ8+70|~luqmiQz7)dFV#FoCq^7TA zTH8JwEhC#nW;!yV`dKo0Q5W!)|0|G|i1M=y9`DEvfu1G}aSdSHU)s@Mxza*4K8G+N zdq>CJjIUkJI^z<65xkFd6h=nI)!*I9f5ESkGD1gyvV>Q>;lEz-zfZ*~r--Qr%&MRN zjIo8=PV${n`jQ@eJm0k4B`a$HYYr?rT(6^#UYc#UBxH3xr|`BwI5rZLs+znPv`N5g z7x)W2LqpXF{U>N;bx8XmmBA*spoJNFg{ZTXNI}WLY76|IELrrp^1=rAV2kdoUBqN1 zfL1XUBGm*HFJZ@ic^Kbqb&e?oU~~XO3%kIL(}IG8f*Z-W>X|0`@7o$7w*a>&jwT!I z+yF*eD4*vr2CtQ`rN$eMgCCCer(hRB3MoOVR0PrxwB%5BmxOTz-iZ)y-BMys0n04o z?7RlzMoftsfcTDF{kgIeLl@RZ3?oyD1KMe5Id3NG2U+26l& zLrFqaSGi#NS#eTHiOOA-t{t~kuZf)d@pfBcv-$NI{ZA!$8>Lhse&=hI#p+>#R0d0{ z3tbOk@zm|}U1Z(x2E-g}V;6uy2|CaJq77TG@)x`Cw}QZS-MV!YmT|kc+E*YBogzUs zdDhS@?0<~LtH;rXh}!-b?l&mz(cE<}PwsK zR0j6kxV1tVL;U}#63c3k5ha5 z5(CpsMAMLh>w`v=P1`aygJ13i#jA?S@q^mGsK4%z|lxSyKJ1aTRgPb?>w z$F;bl^I2FM1Y~-nwe?Tge2g1kTFJ1vqBVYj$4R3S@P{n)-VpU~@$x!?giJU=Ne>oT zSK4pkc zu01&TMdqh$LMdD5srhT^E35a5K2T7}QUvmCY}h||MCwPPd7?qUsS}!Ks5Rz?om5HoGZlG05$VD9MP~^Mac;f6DlTFB20yFhoRVF zPWJ#7VX|F~k^pDmBl?m z@ilio;iOc1Z^MZe0zjz;J_E+I9Ymx@k1Hfn0XQ^qs1gY&L~0h0EMiBukUpH5O6Kv% zG(y}gE-w++>yHNllgA~%7*90TQ~7}@7$MD&n^*oY zah~#J#eIbQKO-2!#zV9r1c6IVRQ(?~#gd)6CS85=%+$BOV~FoUsQ8!M8pJvvmn1IH z%mkl4?1zxcTw6LKYjD*AJL15JWAMJWZllR@0Un-uld0U9Va@G?iVGt4$R7m(?PD(Z z7AS?o$K)*|2$2CgCceT#vBC1Dxf4hhL)Ck#vyTE%UJMKje7eIwemr{nRywIY5zEbc zzkg3i*XlCMgSo9d>kObQ$F7azmrM&w+#brr9_}eO4{DKrk>~1tudIMch3wEyKAF-w z=(A(@awuM{!N<9}8tKQmJ0(4-obScnr8XEC)w#|&!DsBR9;UZy+ON!9PkN!y-QQn= zp%@7KQo>@mh!a1SHZa5efym%|A^B+7_u;RlpB?K+&UD5&44+ga#0y3q3i$Uv@$u}d zD~nuEqBI6UT)zijn#jXJwB;ShE{q8wf-5(RV*uQi)B9Uo^5HmVx%R1{e%7 zj~kB3%e(z)s7vB?Ei9gZ+o#yP*$WPkoygI|21ZWBmn>kw=Btj={Ex>B_-5HlZ=Z9+ zL-!|3IfDe`qPOgjdz)9pc1Ggj(U*BP9LD>n`{^QddYh#@DU@TI7$fhEgDp! zozSZcCh~i5-q|nBa}(BINX0+kV*qdAMmRD6yGy{{%F*<^UwDtBU<}U+wqWA30ZV>@ z67tqz$^ck0%(JnP6le^IV-i{;5R-(;l8ac z9DfKwvI=R2wKY(R64~U?Cj9_(hCX4cL0*gqOD1;5m!d!*HDCbQB(cDn2ulx+34lcY zJ?`%KZgt2CMpNPq&;n(12wggY2qTb8j|uBMiYTmj{SaRbLY-2-v#?j4Hls7 z`ujdU?G!p3^i(ClFJJ>GL|{cBpRV73*PLXC<{*kuoN@vzj#7uU;bIW}DgxQ==gpG) zpWMX-6I4Xtybj*_rB9ac;&pI&xz}s;eaRbI4$Eh93lq7alZ^xJF9LZ>W0P)ZB?&!n z@IfSkXU+4W5QZk1jn;xH=ATB3vBxvObp# z%@bZINhnDO!8Y>c!)<|)#AD|xB#sj76t+mq1gtW#JOU90;ZXSHMeiEy@{C|_!^&r3$ZCjP~g6Mze-hy^gn_v6dboX}F^-3}P{V?zTq z)I{aZxoF8L;Ay*nYr;1JEol&JGjHHQB2kPKuC7E3{&RTLRwB;~e=ZG=6}HY`7xg-r z-XT8ttGoL9a`)i`MW;e3J*T^kiiVtXQQY|&nl?1F@oI6X`{aaEy@gUwL#2vz3lYT9 zBJcmJ|8@m^Xy^^CJSC+s#^p(LYK9G*lcx-x(P$U^g;>2+MBs%-@Pg6t2vHXyXj94+ zT+j~Oz?-O1i6@U(jhhj?jF%D}dL+KM6%cgNhuAiZh)^EX9=}W+= zo7!LFTYmpRGH{Nv3>ARi?p*}eF(LgvKM+RMKZ-xsp6vEjVG62FAtFNGsdf$;g^ zClk(4C~{*qi>f9o#Ufvi<`5PiA7Gxmj2SP}wf5;zS`5cD913Ttos%vDjD>Ld0z{Gk z0w{p(1_D(xSx*+PKbMS>g0P)F9AAk3k4ygRW9*#*zlW6%8@ij4Z~i~rxn$@M5G5s0aDK^6`IAKSbnZODg!ZYVdMF=DeN*jK9&s#Q;$mg=Nq$n! z(v?svCC^pD7@Rl)0VYmEW(el+S`(?UM0L9}6Mi%#SMD~Opf;7bh6 zI2KZ!{hJ@?ScxlTaGF9@TNC|n;MMJxycOa~2h$3;m9s}Xc!q~l|I8fo83>K#D_cfz zAIb=!R!0ARFEUbO`}Q2s{})7RE_8Dv_L`gpw8y#@VwXJs`ANYF`gpHgt8jZUOmLS9 z-iY6Mp}hIgCDpQbDyOKXXqv0MBN(-nOQjF3T!M}vrUD@i7(UiYZ~O#x-b)-~(<4n= z#l*z&&pqcfZh3ux@RMs?#!j?+eR{MIAdgO+O91Qf0)O;FyL&m{^C|2Y{oc`8a$(N* zqQuIkM09x@-LdiIyWWDzr4t`codOn3I1X{3td-t(4N>)*H*LC(qj5ON6#v93Wp7}S zUs5y$(A3?BsGfqjzX&-tq<85HV3%h^(+r8RX4)b&V009ao?~-?rlI!&qW#g{!X_(w zg^A}9QX$^K<%tTVaV{Cjn3k57n1IWJk8`efa$Gq2N75pC9MW`xc~ZBye*FW|Jaw*L z|Fus8IfMVzC0v+<4vFY?DNgbP{GvKkvdX2Zb9nQLD2@Vghd#c|@=9S>zm_oQ4#`NL zi)T&NxvoEFy#L5ODFMNvUBkg*Zmzf@W$1=*0&fRzA>T5K#)cKKs>Ua}aO8njzla$k z5!*e{PL(3s0C2e?CTh6VrNNwn8N1Ks37?uj)H5U7GM0AYz7&1^8j2~qp}@t7FcPWH z!Qz1)PU5xJaBW@&kU1pp8MkF54wgFLq(LZ?6u*zL3}i~~G1nV#%hpO$hM;uy0B;RH z+eR3aJplU>$=ne8W_UoYIx!IRHZ}D=toDSd4g8_$nx_p7+JC^431cjc85Zu>zkZ!aB8Cxatg#PP^Oc=~d zpbF!2uW@m4#mSSOKuCo=zf$CDfNMmWv@|%y`m1E@;DiVYBuF+|5K0)*K>B?~1>sPL zqOh{!j5*;}hTe$?$-}g)hlU5|BOO%ipfu0IDox-brZ0alm4DJqUfl05Ay9I}E@LOMRKhFaB!+V@AperqcQ7r~j}8 z|MWi>2BkK+JeXWC4ib>3c3a$Cax{?ZmBRJVLKd_-x=Km=H{@(}`SPk%+_U!l8ik7w z5KMT|xSjz|SKjo8!R<^>{~2oizFpD3Tad9`T!Ogt3uk^^cv34XgD(F4R6LEmV? zb=z88jH|x2=kw^1Cg=C^kFfaQ&dykv&NK zD=FtJY+gXD4mIQ6I6F;KdU}{KT+WW#-hc4m*4&u6ir0}XdyiZ|{I*Snvk`g5Vd*Ow z3XF=U$$n$A6eVRx1+5oo^tCE*++PBlkC$+;yic;fd@7*mqPLEL!Rt)YO@*Dn1->L! zR(*`h;^Ne_It5y$7gGK@q2b}KXH%8!7PFXAi;AsM)P|$SB)`A6>Jx(8 z8z}pl4}t8y4mVdtPnk5=2VpSn&mwajdT}UWx2j62A~iHchFI)FO?}|v+g?^ARu35t zpO?UP3d|E8$XjX1s|Mb|sgOO&ohZ=qIpiR~84!=MXL?cz84h@OlNr#q$zw4xmCf*0J=d zoua>%tZmr#Wje$9gF7XGrQ$%M2Wcl0#6fI4!|i4f5)vZKtbv92E!MI?72}IJ4x;ci z>$iN*&r!&^rH`ht7_|${8KmrM;23-M>{)#zWhT%e$1+CjMle@HA{Oe&{(ZowsiGqL$>o^L+a`yt9^5ytVLfr)U)atJd zu7~Bx8{Xh!fkMBKb1RHKh9dy^=g?I~ysaRrqoDn7o**Jor#yuRN}U$1?0U&W6_ga*++&MY2AT*PIP~C*?iWec(smsX_?7*jffbL z`@1t$#bk}b__v(ug8bZ5lnJ!*fx@7*i$w)Yda121d;C!e9#GzaDr`jt0sSe(<+ z`XOm)Dxo#`UJ4yK$7R{Y_sK&O(Wq#=S1A*)7+Gt!;KC~9UEbWVzwL$R>Pb~u78&y2 z!)}Ty$uopF>}nrd4Uf=;yn3M6lg82cOmg#~g6-fR1N6=pyM@YRAR^)e~1CvcV%XrzfC?h;1*z!6bpT_`Jle7%yQp*lW^H%SS5 z8}vqP5OIc>Ptu~i>0k8a-p<3kctZRE6q>pU@bQ&kYsi%=S4anCZ?(e^D_<_E6&ipW zjiE*cNay@ugr#jWF7R4FQ}{vWG5j@LU5%ffpP)vN0}1#vFDu2&%CZv%oNye~E{eo; z{7C!?Z;lkjh@_5zi3HZeyoK2GSZ=?qzwPK{N2-;~r8xNvLu@M!aE zHn%$-G{-`1BFE0-5k)&eO-~=aCnl_UHsNZa)#IZ3KFHvHg1jo2`7W-%a^MX2> zLghvEcox?~k?pPl6peF&u)Rt=&Tf@I?{PQBZu~_4;&j87-aPvrVe|yO5ti>=C;8*b z>Y^W(kA6>}b`ReLvDiK_3o6lUi(ajldTbegfDP?HXa+H7?MHrBqq<%HXGLr;AyNw< z`MMLg1e#&G*%o4C0x9iXffgNznGa6L{pg5jj;MHUKhTE68KQd@dnXoloQEd>b6&db zC_l=`!~FaM5WV#dk==;whwxh?R*5Q!yYT=tB=teO<&0==q?NLh=9YLbp*+J<^vbS- z04Y3o6*{M7dCIdN>JMY9G+sJj36i(qO%X-$n%I+^R}b_lHJ!Z4;TP9$F7C+{NNAiy z!@%P~H5g`+1LE`2ulT>6WAAD`fNof^gZ@NN7{I}0YtW@&*-*IZPPIOYjfI6+cM9p} z$hxQ+vY4;iYUCv>il7r#ON-e2B3Qn5?dw<>b`ihDAFT~E*)DK>;drd8cpkX%#U8|VOAZb6p3Dw#7nyvue__ZYw_xE*WBT!rvqdL8PoAqKk;^A(z2|3nfzPNs`UcItqtaWH}pH5H_dVHd>8(dG(bNPVn)1q6QZW6t{ip!Tvhe)0Q1^K+pftR zX}t^URFj*&1UXFhbNezaLWoNs>E-_Con#i;vzP6cN1ir+J*(tSc^1nph=e9zMp1~R z6?vZ{yH6!igQP6V!h%r2rATmjA&EOn+3~Qwx~lqZ zCdttSzh9jaAwcnKW}?TTyZt(Lwq3*W#M;fZx*Rkc!XG7$%!<5o^F@`1w-&yyH5!Z1 z`cTTReXfwHu?=(oJEuARtgPFJ<&kZu*|=kDO8DeXW?g2CPD#|lF2F!0`&}NVTT731 zSeY*czoOw9t3u$%KYjoqi0cV+M6Mhb%P=y+HPv{836d0n>rHKKLZ4i=F|F_t zC;buV^5tFfV&bjxu3&Njc%M_Plum$qPoyc5hU=^k_7>&rs35?0@h1G zNhAjz#?n5CnrPbAsLC%ku1^SyR zlVxr#?^;OQO%2-#^#FL-j?<*x^hHj~>jqwL(>0ai8g{Fm{H!x2-Nt!ueu?--6XnQX z0Ew=Ad~Q;|Vz~7m`AV-T;X{M%3x-u<&kqtD#b6?gmwB25vDa+$xHeXa=~rMKlsXAA z2gIKzqB(9<6OSoD;xWaO-%8J2SS_zf;`_+LM@}G1d5(MJK!*-gvagurr$hN5{zSqcv%M_1q+PysPk`?ls92ic9cO1O`&?7>jqd z=1g&E9-7c~^YFNaovme5*+V_W8=()xFN`T}4K_v|;ACUlK%x3l#;~JW;LbgwGrrmL z61|p5O5yF9EqKa5K`3W>C3WYniEy)4>pvpOmTnjSUH*U9!kh&l=05n~Cc5yW!CXD~ zS>9(t4j$nNAknupBv>hfpCg+^q7l-Wc)6a1h2=}Go!CLnFSb9!Rn;`x{aWh$+2w0? z?%O3ztoW@B=G&Wk?S49f=BuiXzq`3|?Dp&|GTd-988}Y=IR94QV-=TnL4Q|HI!z#@;IAx)g&6o$qQHmK|*l!x1Dd*RI{>;&l+B6ibpw8a=&>ZvH#C*>dX<4RH#L&> zOWdz`d2(S~pMEc-v4rhsUJt`IrX;nb0WGa*`Jml95i*MVJbJ;@tT0)k=s`7)9USk+H0-Y$J?=uuo%)MZx8>eoFh|!+MCdH-y&| z9@lb!!r1BeHQ$LA;07CDBqC1=LqEbN7%_^y7I0@pea9>{iF8!VRzw=~>(|5N$;D+M zUk1S{+&`4IqcE4MB)$|ouY*9dq@PH)>Bo_SNLMh!@aR*|j0$`yPb1cikXC>G{3(dC zva+&*ye@5PIk2C$xZst503gAGZEXQr=aGUt13X5zGkmRup#Sr8kuy*xSO2nyzBCx8 z9ujc~i~MP;B5L%shzd_FkD_H{tO0_CoV6HmEy!oMVCfFw++lXPXWgZbM^WyOJ$L~i z0Af{`o&`0pth5lV{e==!-~%}rl3{KILK>86+L)m3u=t+Aooh8v~jX|~*#dmxF!9xoBg zrRG<{2*&vJCKF`r-s}p?wF_(3lJPcG#CW*{U~34vP+UkR(DKtG9lpoZrwtX3Xn%Z) zZe}NPB$J!lx>}uXkN2aWgu}L0&n+-^_TCUTJnB!Pbw%?(KL2>`+%XNl9Y>Fvq82^Q z$ytw5q&EQb_0cPLvVIC(M=OBq2RIY?S|U_O<02nVPIJoR&tgs0DRe>?w+_9v9Jc_a zgR>j*QC^#`T;UT?(;dd9sn)kHnsd_d``w*6BS7|LoakQ2Os3ku6gW5o{p4=b%c(5# zoq3>7xx?CQo^q&ryT?^8(PdH?YU5PVQPvin$OJ+4`Oli@d%r=icV0PxC#mj zq}#p9?DB7{hxknzU)={*zimH1c9k6Mx3y{9S81pE>U-&mi_^P)+dJWzBSyhwF}uCM z1ZDC9e>QTuxq>EyI;Q%I-5s>I6PWaC}Gr^)kzzx9NUVvQYY!1{o1BcIrLf7TYg{{ASW?%g^ zJ6j5~CCUf_9f-dI!lSiP70qBTx@hK7;yQ`7P6^ji0%}CzN+goO5b{n3oe56k9uUBX zp=Tt75rDW)=L=AmVaCO|&56rKP&2?4cpRrKHCmz@X9NWY3;_-kxGpg4o)Hc1))kB+ zzWaC$ZbIV#iai026C^aSY4ZP6XD+zB`6DGqDw#m`C+xV+i*MOyyJrL4o?~~dhE3=~ zlAfHCi%%WQy|BsO>TlV_Oq6&vcXr6)!9OUrvlVc>HPRo?GAV0mF%SYTNPDN2=en@y zic5&rp9#n>V1M+*cbX@W)B(M-4#R=KxIK^w6JsqPc3``A;)kp#Oc1sXwKFUZabN*p z1VM#;ZZrZ7AM0qd`Ijvm?YVY4bjw!G+1O+>iz08WB#6_^l++b@8DYn-rxR#(|<2onT=)=22tP0i0(4~jwky2)^8cewuCc$aQgRs3q@^j>WeuVBcQG3<=O+8eB-|M0ynoZvt)rmi#`pwzVM|l&% zj_0D=2nhn1cw?T$<7y|#4pVyxvo7B47km8h^|*nRzfhG&;{?zZ5BKQ!%ncy`F3||N z3D?Kei4ACOa6Qt2yjiz?|8~sq^E{~;-uOgYUan{t zS8YrjXuUOT+?&9pOxN34Q{GwaN_1Ma2U z?2IkH66fa&Jl3jM%4I^2sX$w<*(-8cjusn8aybZYQl%$$k z4$ASg+t@2PiV;}Cj;ZJEj9>aa+&19!s7o)p0PP;)?hUFnjY>PQRtbPd`t_B6E}{3!a{ORcx?NhtNT7)sgLux2w_DG{qIzBC$Q8_50p7n7E6olsPQ zEw8)izBOV_G>(S8!*b*Ew4&`4loS-w7tX0L%$_d!ZEe`F$2~lNnq7o*Ov?jZLbNlr z+6`UZ^S`(3$+U|wgtd}>ah`3xH2{0uR!}EUpNLlftO;P< z8e54rcS(>$VS*Rt%4>V&6h~6Z_)*RFn8X`*J+8&%xS~DlU6uahTqqEszznmjw@=|I zW3p#^p=_=9X`R^<8$RS&&B@mX`*I#UNC7PA!FH0X%nVSbG?OM1a7_|OxImsK579c8 zcu^xlguxx6Oq_bvK!;CJhOx^(E3K%Iq0WGzk66%p5eAd6lRaD%SVk3zUt13cfC`r` zy9mJwvG2O4*llo#{4fxSV(=eRp^F*>N)>)<+-YH&vv8R|90jZa;ZBh=gdV4<=_x3U z`d8`=dUsdq>uW%xqoKbI?c`m=*Aiv4r|3RBqWf|1T;&pST7D15llhdJ5&arJ z8(@?$2U{cs8l3ws{2NnT5)9XE-mzn7-bx;1pIW-XHng%tNI9f}gs~ir7X`7K0*Vu? zp^N{5q!^G+M8wK3tb9dV6~2r(y1rot?wFJ+eBK&aw57sL21M z`{#X?H(Cz5u{UTK_&j+M2Q3%UAA?~xXo&Z;W>u14ql~n{YnD_{t$6@nI1AoXR||jldE~Qoe%(lGmv}ss~__o z)jpn3%;Lrt2V>(4%Rzd|rHvxa2l6ZCY}F9~ho|EP>t&+%pE5OG86O%g_TE!@lAq`0 z<)8iS8HRHwfRR;pA3Bd^uV?&%W~`g5_Hpz*Maq_VL@Vg@ti0Jb1Pz{03`-@bi{ze!ozU_yedWFl9}KCv#pR$?_tsgxqm zV6pFqsw!E-LSu7zG{X3JL`FfpnR8wM4yJVT(aVI*3M&9ID-zkx!Qc1oI5fhPz_#(Cw-2fDFIVh>_S0=F^9$;zI+FJsCCGa3Ywzy-HQ@*^tv?uVgT zzDgVr4trL-9ad|kE83<>vg+BGIb8j!6qcwQF%~aiOeHr0Lhb&Xl*k zZY*VV675F4o_E6mux2uyFvWhtT=1XeOBsyP3j7ZoZ&)9dH+- zDbS($^;H*3?sKqLihab&efnVa0CkWI&7GAJhgWiMwW>bup`%UqEYey%wr7D(ukvou zSH2mK@htX3luk|^#{x!llQM$F5nhQbtwzn2y6Bj`*rngLhKdTx8~sEb`*)lLy z1HM~A3JRAeHnd&>m5(v^ok1=yPym?m4i2js!wU8;HCa(K+a>J+=e=^7`yiGmw|u`p5Fcscb3ZyDh>!(FraMcqg{p{ zP0rB8u`TENM`vst96%rw%wBGEqDzKEh6IYCd-f0sTVujk3*jO?@2K65$5J8R(Y9K& zA|w@Nnc`3pr>q*$M(~Fosj0q$OC~VQ0Zs`*Z^Z+u-r2wYVe@;U>%%aBlj8-l1*<0^wBa}VnviLR7W!;G zDH!XTuA4mzYW>x2nG5Br3o1x$)H!K=kgC|>d>z@PLC1dIuIPdf3v@u_*LPOuAFNS0 zFD?$_^>$u^sz!}5>>^R-KmM}{v&!NeQ{(2~XS{~|NR8-55k*B*F};c^hhW5W)Q_?V*90+~KLlz9Wg4HVGNoWrRKopLnWR%rxUe{Y-71jq7p zjQdW^*?t6}`!uJt8wKy9qa&OXSoo-mxczW?aV&GFi$<>$nE`|U`(rrNgKwqnEj z^+@*Fj^W0*GmkU1NSQ3b7~sKk_nL4^qoJ`e<^>w=x>PSO*Az}e6BAjut10CfP4r`( zugJ>Mcx~S7sGa&fVN)bOJ4*>QDA3@t(hFD$BMS%@dJ{&w@p&Vjb*xQH+Y)T9*|~4o zQ=zM4CM9+A;0><3U5&JfnYEuiW3HF_bq_^(vzuPFes8--$;6~h*iJA?5at8*^f(%h zsMVg0wjC1_Z#8U_@7~wdeQC3hs8Sm6tL9zFr_!BFsg0bpd-f#Gh(3Peh=@1HWWRss zNU^e?Il^FVtqlHMQtD<@Cq*N+vBel0M<2GGjSSr>uhrW=r>Yk-TTtAUM=mNpziG28 zy*qsH@@7@-b2hhruC-~SJ+KGIy;sf9&zaqxbZ)~N5Lsa`I_rjHhfhuSWroYw=xr+z|j`p-&3^2ju@IP z*jGFdPj+4Rp{(p7>NhW%6O9>oeh4)I^66h>=3#8qIQIxD7iLIpzZIs6L{NP|#yd(p zfVJbU%eE|Nru#}Z%fpBmt(=ALh77Anw5q6X^pP{e#_>?!U_netNB-FA*WA%x39nP` z6c_rx6BmC(aY*9Ly{M0ePJi+_e`jyVnpnA~J1p)8Z|Ur%vE&Te>zxZpD0je4auwPh zzO}`&0h_ng-_EaX80!3yUfXF(-WMQUBV?+add&sL;_qG`uBy^15^VUy(o0jj+qe0{ zbZefq5}~r+znA9JOw?aGPGTIJnwyJ?%`TKB z3g(ldk*h-ZYq8*SD1WXq9vvs-!0NW0Vt4pwH(;}F-Lr2OXFo+pH4JvDCyF1STe(ti zd_bj>)p{JdKwtlL|4O{_q^*KJiBy24%BRIvP8X|XMn|#9Ep@8d(opSDyXKUVDoytD z+d1th0?h$D^q(N(uQq!I^$+C(^PYnFUh6MF6* zS;(&2_z+B%q1hQ^%%k}QM0-TH*91=gPf&nMOG|U-e7x}(H3sSo%U5a>M-fhg$bmQO z(_@d&HkYW!NbRa`Xh0UB2%7eTtT+nf2o8qg9ZW>(YjBcWeOw+-fp&@+7~@kJY>bmV z=|eyyQ$yP}r^U{LEKmJ8K>wJ;oa2ST-W<2L=8A7RHdXSc!+TU6OjPf^&rLL^{>oVk4}=k3Dx(bt#T zqssa7#;L05j5u@Z)Kuz}h-{5&V&m7=Gob~8z9k{F8ztF&Mz?ZAZg>^1kr{q( zQ1L!z{6c(6N@OeDmiucYC24hYWz2Q=veT^`7wf#1e%YMg{M*^(4Ue(#VXuheEYBIP z6E%K(qvP6XAG$VfIe$*uj^I*+or04Lg@gvLIW#G)e(V2n4PL^ZT8mnR775NH%@ybi6$lN5&8LZxiFr% z!ttS{$32R8UszaK!!vVp_GR(TO-||na3=y?H&Yk9op<8-u)5r}y8Lu0XOrFBVYad@ z`wbzTA;N<;ZfEF*&aZ~IbUQR&pD}$M5Vib8wp{!Bwb8>iZ z6bVfKTs#6q?P6+61HxqjMWv-5csm@uyc9mFWo(?trmdOu)jwK|dn%=kf#Jtv&Et1p z1YAY2-MY8Gz~#D$iOC&m1uXSB0M?wq6yU8{59S;Q@52I@Met)<-KT3K&p@rZ*7I?u z*73=@b=?ej)7i9#w7S-AoF#@o3hDAfC{p(EAtjkhT9Q4hp10d#uPAtFi4mdTz!q$mJI1zbEx7Y(6l$97y z8qUhX^AA=G=VijDcNSgm?|12TMS#zDmy2gkQ_}AfJZ0Ks02Muhs53%?_ftG*8G%&x z-qYg`@7~pYJ!)-h#mX#lAhWGBRLT^>&QIRE@Fznh9!KocUe%TKy$KFOBiq98nP#Gj zhxncJbd;LyHwNLgp6|2Suwx(gRdC^mFqnJ&XAe0t?Zc}MV0VQ7%WDWT*-t&$cqFqt zQ(-mJ<)w!C-N%oQ!;TYWZ{?=@%EBVc-f8jX;%thRcKf%|4W5r)6?Nw48vj0c|K-JP z(jO3L*$bRD!*n(6ty`iy;nev68y}})k>5Jk`Co_9($W+-Xi8mQzqZgbG>mQ-CRwPp zyi$+AFtxiQ!E2&RO-^aLM2*O+XY9UA#$JB+j?N;3QSjDRGm8OjuQ@^O zA(jKlO>v`_If5{x1ZGM0O-(qc9ny^d|LFP-aIE|Ne<}?P4I#qQLPp6*wy0!}kS%)_ zQrV-avdYLNAtY2%w#v%hdlNFs-s}JR_MCH`bFS<6KiBnK=c%V|_x-&;v%@&*A%7?>lg9OCaBcBMUM@txn4=DSy@m9A_-warbAt>g_SP=x_Y2-2y-u8oYD(B%w`q=Xo-kMhivPS zpU83ub~fz+gPj$#BcgC=vIQ1k7kNyiJ2%W#TRURPdgt%ozwvZX;`zqLE=}nBiFED^ z8GmQsLm@&_1)h2-49*ZgL=T%_dc0xcmC0xm-i^#TaWz*TFHHz8Fb+_{1f%n$! zbSpz?uN2(H=1203B3q^Ke?J-9@(TCI+e=xoHl8^ix%E-3qEvgx-u{VziQ|9M7KxVf zbO;1Vw8@ftV8?`botd$;3J7jQKutY0=>T~-r__EI9;shSFi`-9Iym1|Z_s^%&Qm@C zr)*Toz>OQfNp{f-u(v$G%)6XPPt?sW_GM>hCm^c$t7+X?^Pt76qrTXGz5Vlq*vdS8 z?bsY{2!gd=8!uz}f@9_3moN9Ovz>EWr6z>2FV9PWbPV(HOYzFK7!N~o`as^)EnsAd zPMN>uGX@YCGpk21CuGZ1SB1f4FJz9eGQ4YWT9)5d}xM}GpE-qfZsU6<@iwLOgaho}a(g>l}Hy3Nq z_*7mA~Nj9Ud5v2|xR5abTe*({APLjo-fy3*V&KCMl`=`&#zgz(Dy6wwmQROO4#0 z%uiQ>zqFNwvZ^N6ebU+XS|PlsXo7j~A&rNPA64cjI%M$0KS`uCw`E5Yx;)2Nger#f z`l!*?-3(7*51^AX*E?)1lX+`u6KVYBIy0WmOgEn&KjO66x`&1)W9}0W)XUzzon4)o z&VL?xjAV^287;Hq3>62yC)NNaH;JG(O=Znytp)C<2ia8O?)>uPTdxR87JIV)L@2lO z)+WowALl>lhcCgNCe)jnmX?U-tNRwceHYJhio7AJf$SzP|Gq zaD#vLolk^wH3Gidr@2knzg!(Ccqv|tT!isVYCAtP_((;w4%nhXgwsS}^f6P)m~3;~ z_G?Fvy<()=F`E8Jn;0r<^?FdtI$?4^>LQGW15t@VH1zCv*;7+sk z64L<)45!yuVh`1B@LtMWItxG6&?-`}wwMCaKszB~%O`SY_K^6{UYwaKWds?7LDy|* zklB|xZ4Rp*0Z0Ibi@tu1`rPdl{^N&HK$lKbhIfYDcXi>yRSzaF?o}~=532T$kg-2ltnvS!1`fXC{Q(LkHVEv?hnK-DM{ z_HF_4pN4Qq4Pg5QRt;lw-iKzAnhe26GcYwR#gAA5O}g^NO(Kp^P*CEaAK1CCl#@ab zeM?M|8XDelXoE%!Y5pn2@rOy`WD?pK!@j~cFL@e@3QsoFAoFa{y7ULO?@oF=DA6HM z(1J+dZs0ZwmV=66(7p_;sDHD1Z=j2dE&7%FiReuZRBR=J6TU+~o(uqwpw81(@S-}c zbVlf#5t|d|Y7VPzXEd!+#?6$M#IgZ@9a(foQ4rv}y1)N~Og(4zzP7Mi$<3H|X%WaL zhKhBY^Hy>%nI(?g=^;)pP(L&?#@<;^5CkFp5BaP82-iFZ)R1S1Var}hO7Cbr+gk$k zWo1%E#>RA|9BP#nt!Y{dQJwj>y^ua15Evl~UJYc>2a0oZ9klb7ckkG-$)+i?*RMz=3q>+O=n8 zOEEF}4o*UE1tJ0-WZM=B5Ilp=pDA#VA3Gkm3sffNBO(mU%%-$F-mf3$c%4zIEh`HJ zW%^27qG#FS#ive+pKrJt&b>T)z2gAgfx;|1Q}lyz7oPY-Ovl=?jcS^f?n`&~-4@S+ zuVn{Hv%p#ek#BZ%jaFaZSdJ)7wo*7oN^DyQfV$>LOw0q%s|G#Y!c1!rl+rAfXh8(& zUle!2YU9nVB;}-^ZRvbKvHuW+6&{!37}*_5M^|uq2*yv(_Z{o`fg`l2xOCrM#jx++ zSr4}sP;?#RvyoX0etDy7xgxhCgkV%_dP zVwxh`5_l=0LBl&eB$(Q|U`8ZCArh0M@SnE?@Rf=US9i&>3aY}oz&~C(JW?+~UfA%q z24`-97v;%vAG#Lcg88-`%{U@^$HxusxGCCjLX>iL<u{71hT@M4 z6!Z-}%UhOv6mEyH&z{}Wde-sbTT#1>uG)MJ>&Cl|qHpIF&LA%gyG06f;t(G5qo}CA zA^8FT1*gO0HE>Wv&kRVW&p@v7r7|?#yDafqqKAM@?_Y(P65D83-ZWX{!_`aIb&hw_ z=KI*bf1wkG)cC$}gh;klU*Dols2*@=i|Y z&F+VEEJrFQ!`1|A48;HP7rO_D3I;eJf!JHN+yFN9pgV6j1*s?anShvhXyx(?HVdCJ z^?mn_D|h9$*5Y!|yK~z-JUy8i-4^%3yntb3WCYO<+tJctA6jTz`!RGmuFdtKIIl&> zYM}H9V0`+^vm=BX)a2x(i{XclQE3HH9b)UWMY|N2}d|zC+P75BI*}l-l%<>3z}8Y6Q)+=#EtsJ?SB079eHQ zZywH>$j`_uRtNNk`94dn3ka9S^Hvi3N0Cpn=cnUfkS?fk55S?rgtP)9ZS>IOu%RL- zHE6=@pwok5KrvCP7lz#-sEKQlDGOolW!yZhL1CaT5njKL>?T5wy}nskJh=(od@Q^K z;t-&PmfvQ>jWA@`!ftID9Sy$+qVU0ULE!H(Vd1s3l!%lxN<{5m0)!tTaGTtRPV!3Z zrQJ^t&K%|E4@FyO2l7CP-$vNWmslEJATG+RV=fAdT?v>zE3#YzD~K%rq)G_Z4H41; z9~}6%5-sgEXXkCih!%YeIDkBAFHYjfyx`_mT=gl=J)*#U$Ld;DvKOp$wUc#3y3^!3 z=GBT1P*PgmOyLP*?;m(8BSr>!8JEmGmk3_VQ;%^tq+1T}fjSgU08MY7N~X13=`47l zkzwp%Qng!4mbTfA8l9$g0prra(^1xQQieUu+V)8v^?~G^3fonZuU9s&oRb+#M+H16 zlOorS`YuT|*>`FzB165td;QK36ezn*~|y$e~-x|Lup@Jn_baBj8hM!Ja)kPMka5xOf{6iX&ApTPZ+$ z_$2-$^d#kT4&Y~;)H=2BCc`2_pvMxG1SLb1h{>;%j*r|+nlXy%hm+mzn|TdDm+Dbl z%SCm-34obzg6SDn4Tl0k-q*kM!MuKFys~j;_DUbA)@j&XlQ_h5fSYcWMbCEiPcXop|6 zg#XSokc%Md4&dO%XrfCBPTYnsV2iF+&EtK?z~DLy1;5LDo9XOC598IVe23}jmwGlz z&X_$ra^4;cPzRyuT5VrY{RmH$fx}?7Rod} zhZ82t6SOc?_;vecu(+9ozOi4r*dnI5* zQvr_(@3f2X+JcSAaqE2kH(xAS*kdK#zhD3fqx54K!*YMZ={mi(a6pcAk;*8qzo!(l zwNpAd2dJqn=lEgj(VQ~V?W??fY5{2TonM{RVEJa+uF)1ss;`H>YO)w^rg#TMYysJ&1u_ks5Y@KHln>{nyb0aR_JSU+)VMNbCe5)w2zmHOj@HBt6) z)LCTUZFx~_+CVYsbp{-p!XFELL>5(?lpzT~6Lw#+EWKdxHuo_yqB%w?#m8^PZnk)k zFW?t+n3=hO-WZR$1nO#^mN*P(h*EBL_7)d6x6d#157im>+^eW^+KZOjq`CvvOs4~ErD;JQ+YdctNP%qOz2-U)}sA`DBA)oWc=SqV;7 zb$?b(*eU+*H*TXhd2Ppe$W_m5BpiOeSNwWRBr<7N05gf5>oPlmRvU?V>a^zxfX zSVgzJzJ6jm1qEN$8Ax?2ahFMcKNd8~j%*3pkjdTPv`3t?y$72kWl-{g>&d1{obLy7 z#keX=6to%&KzxfU!7ov+6KEddhhcBJJ-I{`{>JnI-XHJ^mC&M0Whlm7k1hr5v~no-D1b*fAeF)DxN}I-&SSk`R?FxW?3HIZ=*16K&6e zlWe^ZA`2&G9Kh^>~eDHEMV(v3cLPuBgN>~hdUZ8?vm$QQvFjdV-pJ*!tS7` zgqC%k?@uoJS8Ua&c9)I88nPE?2A(~Cem6GOFiI-QFJMgFVLIo9MFs(4588E=4PFfV zWFZhbHayr>R~N4W(toH)r)ddtAM1aAnS7vnB`5M zRuCZ@51;q{apg$S&h!7hiykZn3ph-Y?4()^G>t}q^&jm2al$piuyV9! za#m*c^gWDe87os?J9fx&Sj0-@jabZu|)v63E zZ$gmrH{4d*klxDu^wPihAnRI)IG>!J-XxatVs_V&2gVq=c&j#iZ=L)uQFQjxIf_+s z)hAp=hr2I~c3GZV3jCIT^B7iK&1rR{B6+)f+xPD$gzs7J4H%Lt$!fnGJqaB3Uq68z zkX>9_gzV7kixhO%f7vq3@}7-RC3*M6;^Eofr_M%+uw1u_z7i+CT|e~r|0koXh&v8* zwv9PwuFveQt!85$GtYLkZjlrz_<{{UavYE5zkc37KRIe2HqLTQ&$FzxU{9YrzL~q0 zw%%4On%OD4{RsKx|M>>~^KS7m4%Lp`isM)bdmG8daJF5rk84)2F`i9`_+kA!F8{lb zKJBsl3Wdu0VyTA!!fny$tWrpr&j1QSy|I&75P zhFaB@?uhT&EY)M6NHNt3(Iy+m3n&AywFVChrV-2FjY5PZgh1+!p`jed%3=G-D~V50q@m6@A6 z08amr(D5QIgI1E zpr0Pv|eHleDt~!Q}v{`RE z8#cLDVj?Zmb#S2{AQl~qDqtSK28`GFL2wQkb6B?8os=#rZudif`op)T&B6PwC@pQJ zx-p45K7#TFhsFPO@}HNL^?t8ugn2g7SH*@c)48My?5jrC+h}(u*{9yTUQFRQpEEtC z^7K*5gGxZ$Mr$uvrOfBf zg%o=QPu58?`bR{-4A+u?WI?;BTv$a1bYR;yXCPLHIAiSlHQ?vtlhQPU1s@LorF562 z(@a`rX*xO8iyM+Yw8i+CC@4t2etk3=j7iihuv;77s6r_5iqv7D%O2AaEOyki6o5pL zU322ZiQ-WQ0uTSJKeTyTs8bsF^(j{AU(m4f$h1(hDi!sS6Q z+9BE@5fv>cXr5$RTcJQKMmdq7-g7(XG_`ccozug#JrGN=Xnstb%9X@?@U`rjJ3|78dyEk~K5l zpzy@sx`gdoW!Pf$TwwSZPw8je7&oFacSU=b=cwe{?l@8;`tX0R`}HO_*F2-UH)#Lm z4|G8vFb^x}6=&Rj^&7Z;V-{P^vmAGgHP-ihs2foHl_Hz+XGEfPORx6P#y9ymfgwzb z0<)0&&iF=*BF%nlYIgO@SYOB;xOLa?lN$E3#)qP39?Nh91;#E3dE(Og$`gg_)rTSH zAwho@Fpoz?`YbT82#1m5MBaj|KL@^;3q$}DQh_n52!LiCiBF4o4Zw0FVo55H0(R1ebe<@R7p?kKUF>7TH^ zd`?bAW;4;?z4g0)UpOf#>CaArfxyl6+@-@#a!g6wlCk_59j&iz7QPu58L1Srr=eO} zPx`-$rdQ8)AL4p|T7wiqk=RXF#nza|>SCE;Phg7KYh#+8A7LMj902s9%PPY-xY$54 z8364WCwT~N01a6d7h1^hB!Nf#Y)&Bpuwu;{n0PFky}^zn!9jl>yAo*8S+%*!m?jfD z%#29Dse6opuy)oo6G(vK@6yv#$$!OSIV&YIzTW2O=tv4_mPvh0M~4?CLCROI*xtO^ zKMpUcIj3)hg>uVTIXPDV79s1*uqiuLJKx{b1+_$JQ&Uy{nRw;0q9?D*3gIa8%CzPx z3tXgOa$0@6^Y7++Kxo)arF!K!8(YP=y4s79{*~{4rm`zc*YWU9a(5qFneFx*W9h#? z^SCTg$V-df4+McL|EU81r%t$VWM+Dri)lqTjAT&{Y;;%nK7Az=jCutOpfD5IH5z)6 zCdUd`+`wg;pj@|s_JoLH(-`k$<)qq?TPDAtmMGasQ(*;TnZ96kdMExX^FXP4F)Ao{ z?eoEF-0M=nZZRvX2o2+EBCKW1GLh>|of*kHSmuULNOeo%ETt;_o+50z9wD9jV(24& zpP|N52m7(KtBSv75r`rfk?9s3B*csh2+dQtISz(;I3XDa)=B{r4zMtN1z#u4awC0SGm|G1gRKTX{f$@!(#?rvMx@=&#Bf+&~Q*wbnmypmM(f2Ts0i zVlj$}DVn^HbXnchj;$lWZs6)B^-)1V7ePwI;GVSB^mV{=VTVz)sL^=rEW2;TWEqRs z@((&sVoCisLjTY6D%yF;*wWMPiDL4KC69*DxlF}3YhtPELML0?Na?o@=)RWLe-M&D z#J{+$I*2U)G$aaQYCV^!#^Ej4e{{e(V?Z=v2`U#q#0|q901bd7?xm;4yc!0rA2m>{B;~w05EtyH6@!~u5TQhL-K0`U`>d0d+PA@YwIwoRm&p{>eQgbI~1i31ze~|+z_{jEemXNr&#`2w#y(nLsS;? zwPsMs05X1slK@USqkLN=zEN?i_*BUNxHYejv&|n6exnfGJv%bP3Z~vmoT4N+V;;xF z9fw@*di?^hEi)ckcn*7taQg(BTR(T5dOVf+L4AkBwE4cYO~vR%HhBF1KefElhqb=~ zr4L@cDk~8jWNvk}y?tM;8)v-W9#E~ELC1*X7z`(Pl3s;Mq_uDxms6(CKYOMK z;+etiXvw9;MNWXD;_6=|a5eXpGP=isE=^YT+8JU=T zKqLU(vE;2=5+o3zNWt+N>V-{c>WV8WydcB=VBTOtjGx8DcQsugGHGbfdcSsC+X@~3 zQ}jeiuVoLRFeJaNvqWIqcrTX#frEv(8JC+eQnYg6{f>&ZwDt7o+t)iYpDc8{20-~Z zBp`|THW5<dhb=hKnm~R;R#iGYYrHw}<7+8I+xDLWbG;u_v01n!OTQxR! zJn}O9ij#!vO_Z_>~za?eKlHk zzapdiFICoqfCmjwYJeEfV&n~NQAp8R97cio=6?8zs-?p~A26+Y&b$H$-Ph|C(pu87 zoR;TCE|&ON$L8If?xPVQeN>*1%HS@@0QX5|Mcj{TGkb7Ft#bfd%L;hzJyF^6FSJen ztgP^4t^{X;(dCR)!6($^Ub7+=nXZBs3JNd=T*{RIurtLtG%?|aWl|m_gVChOgiX{* zA11HG%p5SczqfBl{DI}1yH!||DvkmiSt8CsWR@f=T=(6W9=`YOc+2}qb!QIi&dl>b z{M8XI0i8ivMvs>PP=#G|0^XY?=mu_0yn3%QLif00Qi?_ADb=XUbQHVLO^%(O+NIy7 z-lh&Ttm~+Ux>NsOb^ehDEH21|fOOIvq_8DNPlKS2mefht8FHqwgg5_Q{V@|QU>)7%NPVV(wiFZ#=op{o%!CWhlK+~bJ z9z)I_VSr43{}hL>L~a)l z1Ca^N^((i^b_j*c3SI((m!?jN;b5F&k;*I?%jNKJRwKR>Ns zl$nDg2vUfFu`#dk@Ep})KrXfrw+5W0qod2sbG5m1*1cRfp#YY+`T1@S_kH?L3yshC z*z|(EXbC3T^N-%k(I0*?)0?K$$}dv-9gD2^$Ung5x*ZzmV#~BS{m#sdx>OzKZp)^unG&)N6LE!1PuE3g@%UW!ofsPi8Y96*c{`WVH{D&2i|#DMooFs=mUG4#AdzW0$WF-Y$Ui|(8eD)eApY}5DfeQ@cKZQ7@l%uIQt^V zl(N0_=WPBWm;l+gQAF#vqe#WCaIdtCV_p+{)AhRDItKflSA5dm{m792vyrFzakmVD z#)x^z=4VhlfSBf^H_QYE753wPaP04}18%?q+H3=-P&oV-Voa0iIP+Td46hYU6_g?B z`7UJ1YHMGsBXdT&awyO#?WSv{wt4u^7u?^&iZnF>OB`)H`5`^MZiJos=6>2y2@7!rP`;&rDFpwl)-S`T22I&`gbB1ymbCKZsFdc0)C-bcXgo}g$lxu8F zbN{tw>i#{bu!P0uFin-0DQ1yYFh~Zbw)#s1ERB+iif~w~l#egsA_L9#>@^3uh{(tp z?=cw3;lp?q6&ayPTSA7{TkX0AK9@xsSm;YY#E6^a;cs-bsDwGMeIe=X8w)E$%hO-H zX5RLJ4D$z0{uV&9ydTf-Jzg>49P`yP8kjpy`6V!>%XV~upFG@Cu+5io;~=2sI4lBp zOA*{+e9vUhOsPN<`y7+B`5v&~riJan;(=GmUPMyBKtvw8MeI$e;$b<;gWg6X*WrEH zwmD$pko3rv)Q#MVi;KfVNWVU{$pT`kBZ7h*{i{xS3_h0vEM176*%0~nPJhV1d4!oV*{td%RwPqK?Ip{{G^cnwqI&QgU)+yE;6F ziULDJ&0V?}{IKXxQR(#r22z5uy_1Jo-A!)VX*WYqWMt&n+-IH})nnJH1nf!{6I416 z66;`*PwRuxKBN?u)Ya{CcXtQg18~9^5w#^E1SpO&7{mr@4+#fbHa`H7wyXf<}G)DXahZD}BW>x-c*OCjMInS6=jN^%gJ59S$dZ!AsZINV zR@pXxxqNj8ug|4I(`eUAFiOPPgt`{_t~!7n_3J0+-u-YQ5Z(!oJXFz3=A+3 zv>*rvBIAYMd2pK!di$0gQ77BQP+DW|$&L?@SN*RuIaX5ZYS}g9+}s*pBEHp4)DS9m98W_o@Fnq#4W5`+$H=_~wECB0ZSi)psR2RC+#(-pn_ZX{B?|Y-rL_ z^en|7$Y1b-1kLq~c>zF2yjkAlkkD|%&_0Wbs&3s_2?3k07OMV)eW?zWnYIH6?W2OR z6|ebK7D^a?+{b^OY`0ANI}pj$2l|L1&Anq%W)r%DUl$}!TBhkMw2)U`r;=4y{44Q# zmA?Wh#x4)BFCc}|iTTq~s$dOH2WiDubh17kx~=P0=8P404B8XOAc+3o%N02tKU?1) zGdDK}jgXYcd4b^}+K>nDd$1xfVIY)^xY)u!qPGbZO5$-{zJ>0#7?=Y%0C@CJF;$|w zbp!@nWq@$C7%V^>(YrCs1akvt%V0)}ZaR&fg#|0plY3!l2iA`doM{hxt0A*!m ztuG)G?dTs{`MFKVa@eI2ihm+s0W&P%oi_m%bUO~yi>%FFF=RwVgL&a%?|lklbSNFa zKSiwqrLQ^CL7_O|rnAQwhKTsUcZTRRn0(1ajUDDT*~RF-dIr$M`Lvb*d~>LCK*F}m zPkZvG2y_qtg-#y8f{z~l%tMe#ZD3?$*a14ldjvRnc?0l(=rJ)h({9q(ip< zQS(=iZ*fyolR7W&@#9+%Tm^}LF>J2j&sWmJp!ZMh|F{6{d@O%<*zAc3{|rmgu)^f; z?HL~U73fyWNz`2$@2-)eq5O2NW*ei+chI+lf*kQ7%l%Kh-jRq2SSkGe@kI_huQNxx zlw;$NIIKk0W7b=J^Lape>n`_E~iCfI7nJ;2BMZNbJ+FgAe9N# z&C`8vAqO)pw6AzR#;O}QeYJ&3O4B`*J;-ab2MR>Q6B-*;3~zrg-3W)4;ciX3%I|e0Tuxhe?TB|IR0STkJF6nr!}&y4U#0^|!wcL6 zX9}QO$vh4|;*5fbmjo`nr>t|QwgO0atDWVKYZ@dbesFMMT!dJRyOu2s-HlrduPEFe zZS2GIL(vV?^b*#ude+VOGi}pKfV&Av4RVOU*C~cOg*v>Ti!(r`Ce}R8ePTvtm$#Md zNe8@c(N;qiBLjxucT94$KHmV+52N#YsAfr^(7gs)9|>_zhp1;GdnzCc6G)4xx!t>W z^UlA&Q!Tj$bppW%JkG@A9~Nd2F^u&$fTc)M87&$ORv~!jhTwXNV{2l|v+HD20v70Y znUPDkb>CRC7g-tS#yj#JE3=Hm`T4c5urQ=G90e~D?tTIjBY$|brRBn(LCE3!#D%55Pq(1 z`>!sl|73lny64a&YpsPWg&D8ep0uMYA%hnRzx59eR(T)dZp*R@mRbQA4nsX5d3j$2 z<8G{pn^XN41G*GpBVSo@+Wt#(bMDi@0UT*8T4#58Y@Hjc|7d z=eA_bkBWEmt|tYsd^d(r4gSXp*!TpmYB!xor8~Ts1fD++A`mr#B+1G7c%j=ldJnzs zS*d0reDUC-gN(UGB;o1>0u))FL962aHw5`gi#a)La4fCDN`qU=pb2zdVd zD<+vEIAT+c*RgLef!~eMx-d$70qj5%S8`gICN&*`;SDHir=WKslI1Xp)X04v&6uHi z{mk9jsg~TAc6X3#g~YhU7!2jB2_Gy7fII=`fJtgiY$wcgG2jR`nVm$i~@rulo11?qsuBo|HVAopvRPWdE0xk(KOl2C%=obg;vac zQ_qjkJ^I#sq{hupIg?T%=F@L$OBBH0K%U2VP4V;ZLg!&(DuX%_SC*Er^?7(h5N`~h zMjSFWG@DG=Uq1pAM2O_grKp})7wvF27b%ExyaZF&VP(W6?_ ziK7^M;(H@xA{#`vtB?V|uyi5VJUu<=4H(l61tNWQ^PEVZg@zJNZa7vVRg>K+_>vY0 zbP-xrZND+)fHD#LXH3QPBYXQvJ+99Uott0X`%pP(xb@oiE4X}(5$?ug5orIMm*`rc zYnQnJCkUhXuznXH@>_Q};E`-yW%dNVbzoz3KB`c0($k zTvhOHNQgYJYwGp@V{nyZ`4R(=fGv$UM2Fj3{BeOk#S}*o*=7LPG3Qn_!|H*WJ@INp@=fKD!`3~m?$D@88&}00G1R^5 zXV>nlbE$cstmUt6zEy7=kmclZw262!&4J8zVdg zC_~@i7dT#d-CV)7#j~k|a3uV=^ZZDICm{m_u`=}M&qt1_$q>W6)yX+hv!xNm`M`kT z(t3e-%u5Y!iE-%RkXwfaKo;IdVz|hnRHbEt_i#q7oV&hyovV3ci<|G3td7msv<6Nb zcFwg{B}_#oU_=QOF97PDM~Vty>GG6X+QH!*394s!xvXc+SG0);A3gf5l?n!qC>4mb zE6h}0f!~19IgWuzvvyjo)dOg#~JT>mBojts7f$)Yb$UUg4s`9VgKS%W(I0$__J33!J`*_P+k#?eh|G0jn4R3U*C=|pr%XN*l>dIa859X zW`iao7_C0;lg%D#$wUFD=dM!?O3xI$bxTWKwrwVk*2kuOHN5W6!oo0AKOh}6BG*v+ zOcB!GiWwJJ#f&sCXE_dR{e;svQE}ht(=&8mo99<@-bNC(1|XV8Wwz2t2k!do=(k)C zvGc#$@^+%Wh9=m0e+^vt;Myrved-jC*|n_l=NW4x*w$4s_qUlXDO=)Mz@hL*`Cvud z>-heW5vhmdeI}OB{B413(CJ*Xnv9bZ>ya3JTmoHIzNjt%L&$^aTrA|ZZ=cc*I<`+Q z*94)$e=Mm)0d3z3jMb?X>7%TwOn<%ns5(sGdisT$w0t+71~fF} zDPWATp_-OkA7Guo^a#jCLyW{W@Q}V^JK~D8T4&zajS^)j<#V?QEC~@B`xvX{M^2EF zJ}Mg`oQ*h+h!opIB_4wN0PqnekhXwtzbJ;zpsQmV)^y*=N+#x~ef)W-QCL~M$5 z<(`8}@^ZwMUJsAb4llH`H#++;cp4+YofJNsjygvr$zMCq;&N`Kv(8nUJD+mLZukOV zI!w>8fKms|ZDCvr5Ee`zeZfhpPr8zzUCIGxG~lXymNofKPXkZd)onXR`pEIRWyaU{ zV>v9-ZA}ZdkNT}%*bnX(f4o5s9_r~pH1)j*iX{L*TtafJK||_DlPK6&7c?#pjM2^W zbmuG^$w6@sB-G&TE=^E?&^QvuJNms?Na~oLgrdJ7K^+_jFE-(-!9(CJkv_#5WQ=vn43rsP^86JJpAAk{IK` znq0rudWv+{nEd6-z2HAFDHtA9aT`-%4T1<4=A>j_(9I`86##sj&r9jgL7hv3S>Hi8 z)0^PjG;#lq%X<^tUb)g#k*0txtk5{V)k#sC0mVx+ zUDWIkTqcAAf~*!~2m@KMJcqtbz=f(8j)a1MXi~HMJO{dhJk8w(zqQ2x^m}Q=7Z0Uw`bkwP2T7Yy6SX*a@9zXwky~1{y{dkzDWB^ zbRB3UDkqZFdVl?rfC(-!KsX?i@+;U7lF-gf$IaNQKgxP+$A&nL9%CEOjoU8x$$DTx zwIDQQu>auy{Y1}vVYvoB~(6_4C`OFj8)xvv<6BR4VMuov0C71whML?Qv(Hv zFpf-YdQ|fhD9{O^+*f6e*p!7p559!Zp$;-X+cR*z`OnTP&>L!wx-wZ-Qu0hWFvwWM z^wK3lBtwEr4GF_62eYWBHc5z&BaAdfbEnv?kNT!fC?lcm7=yPWvE`v`YBdUB! zjB!9q>qR+B6!EyMxB*leZi>qQGpm&FK{^Ap6xkFq083#3e~K84Bc%00k_y^}Zg(s4 z-Ma~F37oq_xC#2Ki-m9gxC}NJid8l<*wx_f8UXbA3U45Hx}2@V)-LLfCe8=+U_dv? z&@D`tR$x!0Q`GZA?B-n-*<2lJh|Nc&F@h`F-`o2IFGVz*_$W|FZ{iG`*_f#jHSf$k z!{{>Vv zJ0)V&20J2`^wJ*QU zj+?IwUQt#)dOEMsAHdbr(y(4gWNBDf_dM*plKn*K5`J4qD|$yqHDCTY#ekXAH`E`R z8xn*G=L0YRC{KE7hxOO9ZCt?)jR3U>fx+*>>@1sJ<@F&;c%=Lequ z%+1nj7!ek>x^1}K(|FifN-y*dolFn2yx76lFdM!npWq4`6u)Gp*w<1YD)Bc6gy-r+ zi+9Hs%Q2tn4ygKnvl=P}-H>~O6#%yR`iFOr!^CC01Sw;&Yb<#tQSvyb$a+xc~(uP3un zzbUEKx$(e>Xc31=4@gea3l5>UcK0F9rfR^G1X$DKGP9e2Xz|bcGFv@8J&f6I+%eq# z5&{Qe@CJk{;72vy{J=Rs=9f+m4xBh=2vQy_hIZcO!0}u*$5aP+RNThqU9q9x@@#_w z0jnZWh12}>LtaVJtb(=krVq4pxl?q zkE-$~lsQ#&z~xP96Y@CI_7UyePn-w9at!*5o-qBwq>G2i8yO{`IG4Eqzy?rc@iQni zR$&9=!u=PJ>cCo}EZHB{={?5S1G+^Y_Y3Y3@(Ijv{A_Hb^co&438Oy+sd5R-p|af8vZYo~ zBf(TSfiTfH%n}S$vtzX{lXqFBDwU9Pb$5NQ+=<+?WdVy^1ZeX z&FafKnj1wRz8pQu`rc)!2CJG{Pfs*?sA3;AT?IB2D1y(VoTvI>$DmT{MuKYoIL7i% z4}Ozt_8*u?HAZvh;OrcJJbDx5Nq_r?fV9p&i->rj7GCv6m5p>e%R#Y4J*i6bq$HS^ zdOuj%foUoM(g_I(&G-z1DRfxyP9U4TN5J7Cnspx|d<5~O=|V~Xy`5##L~2QV({ zc>E;GQ#Wn+b5I58W^UYK=(3TQiBWP77C zR~{B`f$Zk3%?mgx@vH)ih-a0vcb`((57!WYc-a}rN!szW3=C0+g);pDx1D_O;L-m5 z2A6+c1}n3M_mQW%FN3gbrLe?N85kr@&AWxTq_m8I%V#egw2Lq$3OEPiXKS|cF(eF@ z_7rUS`ZXpqD<|E#MP4)GhGi2kHJU`Zm`~@Gik53g$mOWAt;ousR@KsLMOuo6KYo#z zyHm|$L<;HJK|lecF=4<)2r#WT)*r2n*$iXeaktr?ee_+=2pKp=82czGAArJwmCe_d zF$2~CAk=y&p$x;-lF4>aux4dtp%@`yk_{2VtXtOKPyxoFR#u01(>8**9duQ9qzr!v zH$Lb=`KY0ZNaipXU6*z&9b&vj5QB+64a2F}mNDqR{4j~lUAAEK5Nf#%KG-Q80R@;% z-i%B@Q$i$eNATM{0xmE}*8<)v35}QfAc3d{p4MX^sVY7eCmTr?&!{V!^GL_$Cujc? z`;YAiSpZ^&8M8>;61Z^I;2j;k`lss_9CqqNpec|q!webAn)H$fI}Vt2d?NfnOo8Bm zi4YJL_EasI$nu3bNMpYvwuLcRbdY!Kl$4Y-bOvdD3ANivwYMQtn@eJmcT)j3myP-8G$Gi3(Zf|WR1U*R3BZ4*B z(8yV2&_XK?H06-66Aw=8zl4RmGIisXLnl5hSY%{>u^WP&Fd5+7AH*aCe=d+!^(kMs zL*ZM^QDV@D&xQbSDqLfP^94{eG}o0Nlgb)^w$HV6-`F>|8QIIExKpZe>ciHH7MiDc zKzX@9xgX9yi1^nKgYpv*4S{5b^!e2rve;v1jJ{tZ93e0S#^44Uo*Y7c?5tw%L!vhL z&Vhjzfz7087W6CX1yPFC%bZ3bM}x;laA;7G*?{4W;;9@rvD`AIo`n1W3NpBaxY{0| zz>rS1%zsEqtLD{B@4fxeW0NtP!J&i$Ym{jLnr)D#l5~%i$8|L|9fX-EUNb{%?aQ<8 zO9Orl$ZJ-4OCyh&Yyh*X0?rHbcJ>Ln;^t}uvaqj5$jHl|WjLLP<^|jy4yNgYp8}YD z2L=W#-+t75mSJRK{K0&{i7WjBN`bzWYGbvQ6%9U)crUP)P|}Ss9-l zxw6XRz6S@6Quasv7LOpd7wOIm@<-XO#yoc32l3B0I6cemx3%udFaDGgj*DUoAlefz zRY**$qX2cxdIf1g_wI>jx{Mr6-dOZ$S>6+8r6F-oN==PO zx%*b!6x5@3D#0j;gyA?dxAFACt?|Ynf!m`{ETEz0eR68k>&DZzu}+H3r%(; zA_*3--!C5X_HV6x>~9ZaTJ{3YWJLwO9}Kur@r5Cla{jq*Kv(B?Bb-{w{$(e8N*~`&2YDaVn$B zu9;Z`SE&^LTy;BADN?UpTpCav%EnY1?Znbkgfv|G+zWNL1%7+eRutbd3@kJTEE{QiXK zAxI&PYko9)ZY`d`Ya0!AC@A??z$waKy_q|uou^wf*;jZDoJiz30D5{1oXPH2JMTwL z4m90d^PpPM_Vw)}%*eE-U0ip9=!B|x5Ciqf@Pz}!`$E?b9n^)3O-8NnT6}^G?1)wi z`0IQ72?qaw0Eng$R@aO|r0e*Tlct@~Zkpe*(_tUIli>) z2hq`tfDICy7Z{i*(Cm;8)yCW>@;7>WbJ;{uW^Yn=`HpO+CiT45b~h5yH6CiTqq^>{ z$IrUET0<{?7<1LX-dgb+8W$BD@H>H{1-uBl8iQgMwMw=Yx2!CLHb8f;5SXi}h-kK# zs6?|E6ciLHZgbp7y#eSOr$Os`S2`)FC%4AB112Y>J^E;2Ck9Ec2J}|f-`>l%`RW3( zm=sL)6qBnMJGUk7Qw=}>;lSXap}$p9!wCB9Q#hn{(F#>M_`KNo;2j;zafF4XsK4e7 z(zd2%J`{sucdtZlm)1)Lq0DG{!A}T@`s>@ew76Ac=E)w{72aewt@D0Suib}5-PaET z1w9|5Seq%uEwW*SiKEr4HN9wwPdD0RRjS&dqpWj~moA6Vt!ruvUnx3S8m?QJQqx~w zJ)C*>*}m6DX@W+S4uYLWss(G(;90|aWtyH(5@FhH1=gnpB47M8YxqVfLv#;-Vi@CjuweZjQ$=p=MPCToK(qK3%AFu* zAO!|yRanmsHmz#)(2SQ;I{7!B$VX-q$G@SLvhsfHz1J2Qqqp3S>(8N3*T}qfiqV~` z`bT<8lyDBsnSKt#=ZI;CTeFq~u2E2L6JYoZHv~cBZ{@UXO`A-Lg)uEF1jJ7mlAd>W z-GC1x&Ku9ik1q$*P?5$4S2gYm(5DHUGOkhq_8WOUUiFbN1QNe9tP%Fb}hxAh@WvSVjvY)#L>5*(BJ3c-`o6j} zL$K1k-Ax@s4s52l&E=ut*|%c);Le8W!v+mHcN3h)*xNop9SOoU)J{?M z>i=d77KygwL?d;8G?(K>jg_Tkh4Vz7LaFa*_{clqP9)YMtq7?=5nXc5wtowbO+MeGI-@h7DDOGU=}I$$I@_uzpWq4g{rh+8LxI35Wmu>R+~yJz<9D8C2L|vB)?dkX)St`NW2Y;V}LrW+2~pCh$7=frA)R7nj}a zwk;o^dw5FApGt{|81?-}L9DLKbij2zr~30LN+5~ch;rh;uK{@QgX5vj)g(3sh6v#KpYlC^oD2jJ zKUVUPx`yPq&_lz{wQrk_;kJHzKB}Nnc$eYv;|thY0(#$4f?{doxJZk_vo-3D&1MB= z=VsIj!?v0;G(2MHVHn^*3saL|Cf&>YMhz3a!U%lY4po%scA{7ANY%VlEu$&5pLXHb z7isLmJ!|7{Ee31ETs;6*`~~Hd4qb0R#h#t`ew1o)yYTJ!={k*an3yVj!^2Iasw}N? z@7s6%Y&QPng8tlvK_<7Qzw1m9Cb{d3?va(?*DF_4v$!N8O0UQ7La&o~P^yYEn= zbkeW(#O_D1E5|ZW^`xSWN^JHWmj}K_=i#GJGtukX+fV0so=pt?&o;L9Sq77*fg-rf z48QR4iLs|>ZMM5V;kqofV`_@v5-cjqe-?~Bt+Q6}J8O1?Z^S1F;W<$MNM(tm(fbYr_qC%Jg79w!?8ZlLDuIVLX96IYJ^d=cbs2 z2puPN$L++6_vGYWR$jjS2(ce9Y~-M`ZyOwIxtp2n4yQVCZtU<86nH)FzH4($M`5ZU z$6R|@-z7+aFU*%y{|Y6!uS%|3tZGJsnXYuRIh@brFb*exqe)7YELgAV;~T8q2;nzv zT3sG$zy3eMsTa;3^iDxd;DI)D%_M!*8!f~E#dE)BeOhF4Wyu1t^O@#QF1V&br}`aJ zKR^{AD6rA~R>8W+1+M;ed!&rs)f2_4@M#Ok70s951s-l3a9q=gaUE?zPFaRoBT%f5zi8M~@E=8S7vDpxO^~ z6u0ECbU^#+{azj>zev%CuVI26GTUmD<>ujYDW-M+tQ?KP2cpUO_IF?b>TC^E2zVES?50ah|9NHCiB4G7 za#K%>?O#GR-++LtFn74(F{C|STVDPY-vt63fIe?P)BW{1BOId!21gn+_~M{<5er4= z9)7@=dU5HX0bEibWWbP*9TqAwVblN^o_{U6ud_4oQ;Zn#&Vv*Bg=0gG^ZEw7$IXj# zkX<)mz(Ynym};`%O$B=YSFe`OfA0K85du`mm1C4 zb$F|*=G{MP3daOAO3*zarrf~=%*%S42yCeFYd`t?@A zJCrPY9mZ?~X5%5vG#b-2*0pwum#bQ0d7ZO9qx!DUFLHTD2I0I94bVq}VPRJ-gKNJ~ z-2+tnmlr6BD>7wfoiY(PeQXC=j#}+t{tPJ71ks7!I?!`g(Rc7mNW;d)nFMtAgk2#d z+t(|}e?*LY*zmdQorKKwhMAS*WU1_~l{90mRdA}MZrw8UsD^)G4Q>f}_91?LWwMFh zB58*nO-PWy=C`+3&zc$k^$X33V6$0P)>&Qsx1qBV(%glqm_*;m2Rk`;jLqR+(kx@& zwzA?NAtiN(*z()j28n!y8xy3E`jZr#X?JXF+gZ+@*k@w3HIdCV(wX8lWle)kkSA1G zu1cZO@^2U(XIP$>z*4jxXCg2nA$F%#7qNS7#A=)~?YV?kf>Vh-FoUiZRTa2M2x{wJ0H>NJCS@LU5DLn|K+62z_l8G2xwu zBa4a*GffezWnv|IJ~VfH$968qb95x}TN?37>R;a{-SmL~`{of*%SSbJH*vyHpVBtc z>EImZ9f-N9g^ke*=O?(fT(Bq5@JUiUIn==IT(WdU2@0bXVO55)#Xa%{UR%e@pR0|l z@2-fpjl4)hABES!g)acpLo4C%FpzKjF=_)Fo68K7?|)#~$qiF8jeXqmt)Wzlz!!%rlL~3&Z z=D=eh#M9FfB$={?U|z!FhHRv@db;B-xCik#s~bZ31AztnMYMEua9EseUDrVjG*K!W zLwpTh8*2THpPp#!qL&R|tqH?1q~F~Npr3NzKBzQ>VNRs6n8btN_S3^YVovb^KG@eMT<1K>h z^hCB)P)2WvQz?Vm;tY&6>*c}Q{GuT!BI5WWL3fEcD`$%Ah@is@l;M4JTCZ})wXUW( zO>gThDs;FeBU3l?;Y(N7D<}>pa~e~$0r+Am7H60hpkHm?A)lhQTWjKT?YkhnEZEX* zf$Ngq&ody5{KFxw%ax)tx>c9$KVbHI~S@Q%QE|#Fvti=iT4c zLY5^~!xzmLm;RXDTGx7~oEB{Cvh;*YNhOD|wgZR}01l%5q{w(^rNtxONPpGbs&{5( zEQD}&T0a2JEx-zn&cOhy8%vxuLb?8Js`O7LzCGuBo_i_X^iDCaCtkI(f9bp-;NNR+ zzsz!7-r@BONQD^0pyvw)4OCs~!Db?Z3~bhDcx+VVrl)7(M1&+rl<-{wJ#n<(nG6d6 zEP5gU&Fx2wHP+~O(2AxC!%{5I9`;i8ZxKgn4rPiG5(-gnmp^&%kS_-=?AmpCHsrO^ z6C}|4y-H^luJ&3cd}T8%hW7viDu;p>!7h3YK^f5Y zCzcGJlQCPTt9u{nY#-+QI?S0SbKZHa%jDj)Q&7q4!D{c@FsK9Eaw@`kpu#LwBVP(h z4KySw011I0LHlDwTv>77lx|VI2Lkm(r5snYBgTK=?avJHg%@oHDwXPB`A#ykj0|1l zESv(37P~vD5GG;hv}Vh8klnR4+fb*?D3s-cz91p?9rU?5GM6t_10YL|)o-cESDiF7 z>;v~0aqw-Vo%FvapAdPoKfJ&)E9eXuneVOU$V(Zbt8&pzVI%JXZNR~kuC&8R3VC#5 zjgj>rPHf-FzOw}LF>HHcFO-jn3|gC+K}Og9R`%8{E>Y3qUp*P&?gx)UmI=95mTfCD z?nr|Ck5>z!7az+fR+N|fMwh$tB3XubOG+#X)OU+ zl`rOxqV1Te*N%!D_PCz7(WNZto&zj2!BwH5*8pZ;Ue$4E+qUYBBzpHlbH@<-0D4ah z8lEb|kUccUUQsb+{&#dx%j42}UkV>%01gWagS-MCv60$(j{%i(s&;`<%h1q}Ol(cv zy`FS$>^aP=ofl_#F*`z{7j=0@ePpACW-qIDG$ZEZSabh(V1;6D3H--6+GNwR^+5fN z9JSpYY1;L52T31Omf4vn7m(0{RfL-cd%PM^2U1c}Zc@l@XnUs_C_zbLU}JlQ_e?-A zn59&!z-|kgJ^X@XZzAW{2CHP%*Qh8WlU!P?s?Ygf2`x~zes7&G&oFI+eZ>j9g--wG zq)*WwI@MT^iR z+o+s6h$Ka~H&@R6o|(}B*&)Ab?yi3pNitSGT0ZgG_3L$6+K5*E^vMe%EgI?2ko&Ro zOlFf`vO)zd^jm>!rD_$`A-xoc$w5yyMM1yoSE5YwDNN+!QP%w}AKK;X^aQZs^5qgPZAS;t*&m@5YeXUdT;I|DUxJ@Fdq{eIaQENa37u9j}i*Um(0x(lIv<0_dp`|PbI z%euRt6ZV;79lK8|C+bU`&*}JfY1@)TqtS|_UrA}{V@YscjCCX}EeAJx`Nr5UC@+3{ z&gO7-jkm0JE830X18l%ijXS{60wet$7crKCM4A0PQ^s$VN= zh?qN$+%Rktu?mw0zo=ApX88A#!MZq7V9YGd8Bg;CJbPyI!SZZc%~}G;Ry?*X*7#Kx zII{8`hxwpw0|xd~Hd|kEO~!$!0=uXMp5fUkWqz7_HsX}rxN-KKJnb=(nl z2gds~sp}O@9RVkACJm08gx_%~*I|2cebr-yVAdV!uH7okBbsF+m9RUV}OmgpuuJV8ZLy`PIUx zHULbo7Rao9EsWa|2-Q{)Ob1JW2ie$=?M2-}R|b(N_g`%lCldR@fL=_a3=z>B2RQFv ziy|nU&^Hpm8FcfUztxDCBQX9G;olh%5rI`UDn%KVC1_&^SE(g$?mHFNu>7q<_+X>= zL8b}t!TKN$L+!x!Mg-~42U5Fw(NP;w-Wc47(zkzYD)@S?Zb1|yKb*U*~2M_~lr5n$^p5Q;)WmnpTW7}kt2QKJ2(LG)Kcj;xFOw*zcy zZA_0f5*1qzwUw$_ROS`RznxVxBo&?NiGyn0&6Sn@(dAbktahD6^XdjQ3Jzajj=4s{ za>he968+AYbZjIGSCTaPxhX76!*fT1to)8lKv#+h)JbPJ+kj*@!aW^ zNhS4cye!UN)i{3piUj-tAnU5aIPl(SQ0QQ9Z({$kkh+`i%s|kB2#cUD)gKiOF08`p zqV?TF^{h@FtgSTYX-LEDMF1;?y4sU;b@k<tX4K`qRyN=faMTQoDVElk8V4AuNi46Q4=QUc5jfwiWHD zm)9w@*L;X-k`wxP&k3w}posADZ}bj7XYZPwt!UJ7MplNfMW_%HA6mJ%Kn6csg0(dG_11?g zMsq)1>*9bT#}NSFIMlF&lzn!z6?xUw$rp#xZ>JG5c4F7NWv3G~iCe)jgR2l3gys>C zd;n}804M((%5g$40E#n z4kH6_iz@_rk_Xh%74MjMF#f^kGx*R;~y|D{-SymtIX zehM!bk_eCC!6yeW2<|0FJT%R(V7EhFg?_ChipTc8Fde+Pi4Ykde{xonO>Z4jQ`z=+?b2OHmb=^0+?-~UT1#@OT%D>v9?*k+4}QyMeRDs| z9S(BP%((NcwlhFW8OO%R2y=duueJjY#YSG495rbax9H>_gM|8H*xKyjSz~P4{MfZi zlha~nz~MvGB`ZMZ92IHD@;^Ckrh82SR5%EYm$P?6Q4;*w#cXt|4_2p6-cpWtq%%N9 z0jt!Km_G4G{zE=kYd@)+S_Z!s$b<|KhlGp}E(uZ1_YX2^t+E7x8L}!RQ{PH(4JmJG z@_zB+y8gHzfrGw(z>U>ZX?J&b5bMw3VX#=v(TF-MQl<<-4i%@Khw8BiK!-4R1*`hw zhljLS6I>1E3Ghv!aK@nKq;!5RPGRBRCuBC z1hdl>@@j%>>y{;G-bKI8DJZz)HnjN?50?F{u$a6U^NIQ$rBW)e@R{FpjzI~EfZDLI zBdn~<9y~Y(m>#=1WP!p;c_C3-Z2f1vZORPdSh!(~0E+R+$+*~9NT)C0TVRF>xv8_0 z;qvX1LqD$gL=;I#%CgU9^!D_C2=b~jk{8n`LWj>Ot^C=k5bxlFAg>&w&a-0#;AvyC zSvmyFs(s`PYmz9K1oHu&+l&ZW?>*lAbSJ}FL_=?ql&|bT@*@Q#PFT!upYmjz{Uc7d z3HM_v5B?Q@M`LX1KPgW{Np!m=Zi}$qt{<{1F~FH+>Z0wdKJndorsCtHwP*wh_r4V! zJc_V1f|}x1^7%ik00mH#@whN|_Y7J0`PS6b9K(x;p2-|0q~e{lTXUYznYY&J%KS*lkzTmuzJ09X2)u zzBl&{Rs+OD=OPnTm6~DUy|1q?P#p~1p*Oo*?w-MiQaPfW)DBl@aPtXA8%RP5z4HMB z!m#0xO_Qjj9mKY$;A?-kkWMIEwEr3L>48Py@HoWob`G5BaG5}Z6Wo$x4Y%JjB$ao} zPu}Eg`1ZFAp$duB&ul#nOC`Yx#S=5ZxGT5GN8(i`tc*7UFE zn;Pgpfo=q&^4DJj7jc)YtXyVjRJSukRAAbugLSE=cES7i2pua^2%RLYk4AkNLubYVk)*N3Y-g%~{_KC8wY13i z_;SI4UZxKQ`w1I$w%@k0WnhUyun;G^{t7JAX~fD53@a19szGx(ek(h^j*R#j4-5^O zOYYxt>1=z?Yer2?O^b7!B;B5sRQ3B~c8d4Sh7SgMd3jZK?%P%S)`#W3n*Gs8%ckd! z$@UbmyYSsSQmtyy%aOuc9aH;v+=nc@51zVy@`|*kzPSDC+Ujyop{*~WLK+%!jf{*m zqw-pJ2b<_)q5=yUxE9ak4cCrE?tOEMCwKMYpJqxrxakTMPw%s8kIl?SIt4}D@X<&A zdvH9n;ikzA(*|5DjI6BrnLU3CqVd@7oB;cP;BP`Vv;mgo_!NZ98wg$*lpwHvCR|Ry z_lmGiXnqC+9J0iC&~M>(<9Ge$8q2CA;bVgBkNV0a;jKaFg#xuFR7NaF*c;CNY_ESu zUGKNUe!v#0L~#UBZQp(B5{x<`ZNjK3TkXz~Uuw$P!*(O={_1lPktoG)ZOg60Ar6Pp zG$UI1T;3A&9k#x&H~!B7_-rquvTRJ*|3u=wa1I31;&+qqWV+S38Y&dNJ2YuQ>pB=%u7 z*~3#OZ^XVflUu)OESp%C*i3zoo!>5Xs`vfvgjt;A>o@;BzT?zrcq`!xNTOL75iZ2- zsvwm>N+yL)Jy9*^B#6lf8as{mbhu0G)G04e(fn}^6OJq(V3)w^J3_N$onf?gAwS(@ zx8V+MfkShQZ=EEMXn2UUQp4pcV$`9z4yFMcM%t68a&y;{w^@Tufi0nZ-))ss!)n&o zgk4jT!lQ5CvrY=!JAPOs?>#;TH7lGl{<-L2nAhV>;OEa9KI;1SLp7jX0_8OfDZ+7K zKnO1p@s-_hKmtoJ$kE`2H~@5{L{c0Q*$J~69= zvOe4XH=SdV)-Mjh1<4!ve<)#WplyNTX8=z$Xn%a2z$Y|-00(lSaO_1|NY2i19ly)h zhtNNuP!zc1ZxIgttDhv+Pfb{R5wVdt&PTyMthDIPF>W4NH<(Nw6&%(NfsyP>^N4n$LOI8b2SmDA0sRd@~L@g3wRCFSH)iRsYB=6xUGAq~ar zcJLS9Dkio-R(qzq2cNtKK6}^DcOZI~2VzWj3~uA|I9R5ahRf&Xldvy_dob-wEv^D& z90CwaJlBawux{4I_Tf1|DqNN$;(}Uf4X_gm;1pe_C%YM-8MQKCkz8=l<6%F&;ldA2 zLGR9&D<$d1TZwl94u6utJQsE$kpUExr&Uvh!)cD4slD5Gaa_VJ%Bk)ywA~3akmFqG zyJD_7x?wgmaulb9lCc;k3=sw^?($RJYj%uqrHQb3VZy-=|CaLDRhU7hJ<`&;dd*==__ zvpMSiSjFC5?mf^@*LLP^p=%GPt5z25h<>jv(-RJF*u|WO@$^W)^P>xcHhnST-+GGd zeQuYF#$i*0UW?FZe2SG+UR$%LCB_y6{W&cCV2zUsF8f}qU^%ayrN0{^*_&IX8wr&= zLV7TNaG+7UKzJTj142xzV^j<_cTz9dFasA>P-;y;0<`w+L56n?zCd25jTbX7DNt)+6dP^g3xO`L_q>( zi~v`$PH}1=H<3nSN8)W0La*cz{S?pPbdWj6?h0 zvOVQlqmHV!HYrnWurkBKj%5{I1!y*?nx3SQ&k|DOm8_%(hkr80R&ju905s=pie-u@?0h~#iZj( z8XFs1L&UjIyu_4;57)s%8`Ic@Sb2h80uh}zSo-?<`k>ZrhQc`I)K^|UzK+o(fGu4E z3S{USFiOL0jT$KizeBigS3bV>l=N}*OkllcF zWdrzS)Z7=H^OvZq!vm)W>`>=)^!2MM+(<|drcecFYIx?bJYUnXACWFX<9w@5bvLKj zUg|jEjRCL19G)Kl+ma|diyiIp`h_Qjk)h;e=ac!J)+B#~Up`iW5s=9JkV|Su2+3Z2 zH3~7$Pi{%bbx2K31$i(W$H34ZtpoqxgRO?w@z3mSbOmHVAt874^kS(f_wM~2*Sde{ zSiCAt)OHh{?s5*w^v zWgkwkfi+sRcJ#;**aS9lQ*d%N2X^r@F&%gW`-%XwL8rDahYlXR5`A%twt%;jcd+du z*Df;X`<@QWT-VZ|P*zrEUgdk7G3eAZZ>I-bK}1W;pG7!O)cA}HrwPv~Ew)ab8aA;@ zXe`uuudR$kt5^c1KIWa#=Lt8B;SMt}UMjS(O1 zwy@`f?mg+{M#aCol7B`}{L^BvV)1yE@$#dDgqnMU$;rvKD*{*IPvL`OSN7C-NeLwEWw{d z6#aRyH0{rkMkR7eR8u&Zr9fF^tfyiBOvw1H$%;TaQ>!H!JFIgw$zHg98ed)-_}EkP zldgWWFDpYL@`3;#-&Ia#At6_6G&bdvsL*=eytd(gTFw6{bi`>nT>)nrvb#_xV6bcM z*X=XkqqSzKo!^mR;52w$ZvRXs3SMO?#DxSPbtn+OEa@} z!}YN=uiz?L8X5uuLe4T=sNUZDVtxb}S-4b%9U@r@x%X7jP6=9196^KCnB|1%k*8S4 z0Ve)|T~9Ml6I8a?qmE`DMNRa-9^0ya`!;dJ=TsKN9+FLz!^>@Du6 z>jG4)?&=vlo2_YHn~?kq9G_W_e$|*WxpRL?ty(QXj-jxqD41Jks}H@{)mVALh7s0v zmIDZ;F2Ngnf`h|R)h246{mvN*qJ)K;)8g%2$mK$A1q}o+WC;2U;x*U< zag)=i6A2(Xn)533B5?ZUJT2<9B7ptrr>ch|zv(dQ6Gkv(D6WBG>tQi@mmNxu9EurgIm z%ooTl@hH1=@ggSFt=L$o4h3~`oH|7a91)KuO3NQdwMqQy)fT7|aay7sXZihS;tIpF z8qWqI>tevGTXfvUDgJj_=L5OQ6`60^(i72PUmC+-^|QU`3F&4b@qV;8gSwr+!1=+) z^Q2PqL_??e*+_+qF*%&`f*(e#6%(5SSo!&~qRjK6 zVgG2hb|P>KJQbj+yN-j}%)+9&rzdQo&$t;g1%6gA-)Yu_T{vXp;4>oPv_g#^8XwPs z#)znCO9D?UL0_x}%0%x(T@N-F;UWhYMN3>+WSCS+E(q(^?8Voo5wi-MOnVt)0+ee}PY-mR29|N|+8yqj1Jk`YLyp zx3|NCmtUdCP8xXmY_4&e(d$4Tmbs7GU7}tbCh0UHJA60BW}ahl_3V7PT=~&>zLM(r z4hrYX2w_Oi%p_)O$jr>Yo*&}PE!>^Ij5x@N&kGs6DPXW8f)f)7OL%i;z};DBHxZBb74hM*5tV@u)g z0QAD&lS`#Jx`G${x9Ga9 zyR)n7@Xnn(iS5JAo#plQJ9&9~*C%6QVz}}1ySmikS1~q{p(2lEiviuSu&@~S^bh{A z2pOSYouZWISs^iI0K4pXqxC)e%gQ#wWUJHsTm*@Qa{vB^xT7au2d-TE`KhtX<~Y0hJy)sHib+*& zGnwJ8k5l>&Ng|vD#sS|D$Hv6O^mS+`?py@;pK$4OG|{sfKYMsLR9bK7o_e@`nuBEcUrsYd zS*b|TaNzHoAHh>93r&X9AcVzL7~1=8>93y)u=3uVJMx;d8it5XW`@(r?%yK%o6E`= z>&wcA4eTAXl&*vWiWeLjnV3jDwY~1Xwz_)v5sx)3jz?#h#4mkUynNThBt=1YbZjit zu*YN2S+nza*7)HZ_wSWrFYSJrnuNZ}ImdU2S!Y09%77HsloLJJ$R<{^7NVD)o!!P3 z(frd!wf0vR3W=VbmdU+)*s@jS)ms1I0-~r@kS<^>rRKY*;%$b*-f7bpY(h=WygT#ykoQ$v^Mc&QnyL+<(IlM# zO(uF?IG;`Nye0c@`K`7@0F}JP$!9fwSN*THteD=2=&SU$H`~>3O?80$fR#-8J2#nR zH@6*-3e?6+S(uJ>kl-M3EugzUcM5eR`oI5J{KBrgEq+Xm%UgeZIY*{AlYRSA;7OH* z6*?Vd`XZa-$7A@zz9j+OIt1^>8uR6DK4htI`Th5JO7uj z_rK;b+?LA`hTztLdjdYzPoTG%Ff|3I&&A*WAdyx8mmRRnSM<*xy7#&!ATl@@KN-mn8hU^vf03@oO%Rnsj}8q zU(BU)V30X9DQ=$nsYllf_StV`v?N%dk$_`NhRj^D2ZL3+2|K(^kBW*`LuF+Oxxuu8pc%u7 zE0FWPd58t~Qc`YuR8UZ06{j&})%up{mB1=*%l(M<+{AE^3>uy-E-~r>%ZS;4Y&>(k zyQXG4toJaWxp{jx@ia9y?sj2ZURuOq3?q{Ytkl4{20!lpebr$qT3Shv6Jh4lH7G13 zWVCZUvY9Puc?ric05Pz_GVtnmPwG{_)&|aHgQe`m#02&(8-Yp(C5ghbST0c!*7n~W zpP-5i^)G3H)9_EL@SlG&4aX9Kuu?-r2;l&R3Wy@$fsTC|KG;0YYYsreF`qR}Dpnew zftwVO@vf9C0K&LkxAU6qMr`Cz7D3DNr=a=i?&Z~(yI1bJ)Qo`JGcnN)Hqo=@3*ukK zg%8Z1{xZ>>aO3z%#qAwyY%1w{w~!xbGX#T1hzyEd7#$MsWe;-=R=B@A9Tr@wVm;C)YX~R8L?Oct_D|tREw4IZtJ@`JYD!KUov#!wdgTpBO_%SJ-s#>y?1&2 zNuEEX)$`3yL_}zTB<@Lm@Cg)Q(UO6wu&X=U>3CGs;n|}{Z`SL~$QgFA@cy5Hy3bHt z)Ue7oU3e+HidJvp#-m4^!*!qgr!)9f!k4y1{RM`uTS3SC1N|hNB8Wj1xB?N62Krqo z_Fh=g?muwAuivnE=1kpzwpV!!XK5Oe;Z9Uh(>CCBv>y!?00#tYUWfDi!(5pB9YN=f zL!wVb^b3)Mf|>;pBR@&OmOasz@>F9{#)N%nb8>j^ZVN+C*%VJaBA;4PvEaGz(ztF8z3t$trgJ5ckJG+*YiF@ zaNfk!v>8#gu>O85vyAaLv#4L&io-MnX4OE!b{!S+`xHa!%r)Sv&tSl=;Tob05Eift z$5>qqhs$2mkiS~izb?tY{^x~=LZbYMt-Gkt!$W#Qf@&5s;f{>w3sevSAzqRGeKh{l zUAf+KZqqe)6g%gmKUi#R&v6`0n~b;|^QrKa2nPoTVcCipwKej82 z8CrWVG5}>MDn^%pKilP~c(PrRs@LeuVfYqg6*=YCUV+q%jxM#6AO+(OZ|!IK`Bq?m z{GL`eQ7?Jx%Y3(m$??$8qeoh=oQ>xxl~3{#d#X65HMf54LRF z=&t_(&qY1!&39)~Q}3e%CvGV0Y2HynZMN9IE(!~M8i=SsP0EM+2RdpUxQ2JVccXOv zblQM!uiSxc+r$BUHz7+en;VS#JCN=Z{w;VBVFQ0s+iC6;8L&T0uwu9Ri&v3<@*0;f z!*0%qfFOVx^UlxjfjKU=H%&FKw2?0qH!ghov`oRTKQKL+nx3v|Z})=j5D^0XwCOf% zNr1M}Oia*W*8rkiRr>96OZOcXp^*L$!dmDJn8jUAr#0T6$D<1wG3;~5aBjhw^;CCH zo0}Qa+S~;AUYG^uDt|R8SJ?>H(4nu z-EvnFqWg|2DJcog_s2=AJ#jxO3qcgZ>Y$2fJ~8;RHwGx+#7(8P1nzvq5HJxhB8- z@MiQyE^sd6aHmx z2?J&3oq0m1x<#{E5Lf}rJrywGUW$$l0crztrNLtgPo^Y5RIp2qL3agNEZitfLe3c0 zVOx`9Cbll}7=8fAQ#MCDpGuC=LHL!W$dsNafin?|;1C`uK4#YH}mJ0*hfDCTYBjmcRq*pKgnW?szxwc0`54ph5&>9Y#@6Z^(kV zpm@YW<{f`3{K)R;>tDZC<47m6y|Sj}1srOIZPpO|i)r*WRMTLIzkdH-1;0QV4UYic z^Yf_|2qfA8q_cWXy@O}Am8Rr@g@f#@U5rQ5}_4*yBnw=6UcYle!lvWupN+VEpv z`}tjlCSiA7E%f4;e6uV^v+mU4Et8MAy4%6gaoUmt+pu`0lrCVA=7Uua;cJ6BSRj)z zkJ>{Z0Hvj+xPbeQ9tFej)ZPBIbLi<}JBOhltxdS0y_brr9>zT|y%a!Z>m_}n5-1>+x26dR;an5e`JE|SVPJLVWjjrqC+#uMYLJy5L!404s zR!UkzROdq_UGYGp5S0QO&gON@z55B#;C3^uvV&NI1LcNsP3E32*NkJ9^VIUKg4CG%IiON(kF~X=rG*@UZyeRH)FHx*hbAq*i$z4F=vYs!1S#kP z(BNdX9CyIbt*M&AU{8N8u;zq8ZQG$6hY7P+6?JtSiidl8dnK-2ivo}gYUA*z3Un)y zxQE%5@xg-FRAJrNawu{mH4V)Tc*5dk@q!01jk^BAsO#>0cBSXD!OG}36I=80^98Zd z8N!%khjm}mmk4^C0ipkO5FP;0SpG_U&}?Prx*nJkZ?KOggE@{^CvQ|SJA9ixFmq#j zrwcAQUegMx!8b8FWPkB7g{{K+=Ai-J)J(PSXVcreckVn151%-a4&Q<5iV8n)B5vSa zKIW+O3Fze;`NUmy{k^@KX{Q(%=06H`Lh1#>2-VibpJjw^vI}GuzV@94Gzzgm>>bd)$6Lazj z>R<*=JdH_Zl9S{3uP8=~tK^iP$#Vw#8hEsVuZOf#{@(FqIX=sicb@%uMv=JI+q>xy zaT2a#STYmA1##R!JKlgy4g(>P){SijyoQHL`uih^M)W`ytg>#fi0TB?QyCO!6xz6H z^>uR#g#QsubLjU zeI@rX#lfx&yx zIJ(8bynZL0iWmC`e`CYeHJijibhREOB`p=zEFUqWDAx(H<7C&t3oGKVC>L+TJ6KEx zLkv1xHf9Ef4RE?8!}Eh}0xwiH&ZlfQ;O~cmx<7*_4~xskvoz}H!d~R%&Y%U5SI#`ghjN`hF~g4sZmC#w7kF3YJ5!MRV4O342S$R1V1o zEE)bTiUXuU!bc-akhgPLRYm36hM!{tl+W;BzO#?Nu&OZ?TSl!zGG|?>BTe~X2(#e$ zeTIkU4t&P5?|pd6Ts7<_fvkO>vgu*fcpUs$%lVC!9 zVC|e+SO}M`gD3qA5LO7@oQ|PkEw(g(dRT!kwhLN;J%nTsZwzx^Cnv?_?;L45tx7f8 zk)#|5D343GMh-X;VpUe=I zN*fU+`*cuSpF`V8@UMdT-i*=-soq#i)nVBgBw|Yr;F#1vvJ4460q^%8D zNcGE?FH1%~^^@8@?}G8w1AKF-;U-PklXD_dcxATL27Oi|ULVUl#~B&lqd_@-b(gcr z5~7tk0b$yK87U4H7wn05gRj_-CGZG?H>6>tu}U1=#C8W~AtAUyFT3@J5Hc`fyb$X+ z{#|#mRohhU?p@YA)8YFk*Ykks41)jX-9(|++)qJ+5$reoVDN``(eP|WG-c6Z*hE&3 z5Eh-p@)KkX^bfDm$nfApgT#I6=#6}HJuJYN`q$Uu7qb60?6l#<9FY&XFBJS$Aobzo z1vc&z8mgWvIW1zdw+f!$V>Kxe|7% z?Dcw|E0bV{UG|x@kvvU4;kfCgpE_Jwm%qvHJ>JT%z;)NaAWdOc2nvod3N>;xx^e*! zqE*|61SP6Jv!fpJiA=|iJp$-OBz&4^p#KC11PvHHC{)j(FvitaU{y(fX_aV)86OT0 z^;Fsp7eHD{&&$&(d9(qquct}(+9$SOv|Leyt5LLRKLt7hG@IAa?;e4t2EbdMMrR-q zQelfb#a3r2;l>2)g4=omew3IE@X2xn_0VBdqCF87*0my>C@{IJynnC{-D4>h_|PM_ zzBh{zsoerC<|~{uzY!3`t>17L+cO|O(N;gmSCr(V)g9C_$@v_e8*&%h5NAP48+xQV zU~a7`C`ebUMfd)F?}7s1^5;G^mdoJM){{IdapTdVO=Ajy!7VaB#fU*q+sRf*86@sz%r(?N z0D)Z)woFHkG=RTnssAVk8@^?=&FMKg?Mp(yzntv)e`+mL89&52AKVivZICf1i#i{J zQh~`y1sA~G-+#grO=U9ig|R5o6Ous>8Tkqw=XdM<1N}e1=m7*z+%-_K!VJv7JAz0a z2j<+`48b;mg%}!F2l~j=(HbMJ+hQp$5Uyl_SEoTodg_n`E$}b$85q5DtoB!NgpWphbQ~a@K zi#|J3RgUWD3@WcJEtEW7-9`N|a%#|d2wg3hpqG~|G+N^tsre_w!};9_o)qBjN_^uS z6MP8=m;$vW+@O4fafiogMb@qwLmeMZ?Pi`pv;&`DIfro57==gVqZ9&gCVDFB_-DG7 zC31+G6EuQG80~<#m60sX9r3KUcG9ws)xu}vW(UE*F&+E*&;56HE78u28gBhR+h=Lj zRpHwIyM1Or05|R$HsTeq5q#*L4X6a$pzpY1aL#%R1I+I_ai&UD!=JHuwKb_;tVs@Y3%`4@%p^tkgqcsHTVL(n;SR^@+qxkZ-#Au;oAt1& zJ#pR7LCE8N+KNo|vGuB%AYUrdRjBR>iYiV)ThF7%qPI0%ihfM-`IB=5o;-5aG0lu@6lWoy4vWJrD4WJz)4Rbsmab zqiRG9B#>9Yl@X)!fJF#%ewY+Dp%@UUQ)m@HJMqLLSCm_bE%``i8a>cwBC!vBN~Uq= zX~K#b*9OSAr;Gz09~kD``7@imbKhUZykaa5D?n5Vv>5#OiX{~l&(Ju)vpMUz9|3mu z7O>z{A_Oyd;1E!A8AsqH*Ih#>VZ_>90pWXO`Df(yRxJd&(7LGr{f3}Hq*=28< z6uI2`CgK5k#dsx%NAG%EH^KyT;GcQH!C}R?kyt?C$BZ4M>MM2(#kkjsdGYCT2#+2) z?ivHW4jMxR7-mDHQHDRLT3~ew|Hn6cFS}(TFAiqDBiRVuAP$xr;8DWiq6tJ%?6uwd zieZ*X_}2QdDFBW>2_m%|s$3dXAX4gJ6ibjvp=}r*^btdROvl%ZbCbBlFdKb_3rDz5 zgvsL(BfNspg83S1gI$d01rbumfoEI+3zs-EA+H71OQKY--Yg zR|19&KvJ21b>%z<8k%XppoKaq2?-D6;#;C_#8i1wPi-Ls+ffgpR}GP*^THN}GMH%3 zLqJ75tb}bXJP=Quo!bHQFdn_7t(eXKG_HXBu2l{DV0jXJzxl3nZ=|e;wK`hnM5UC& z{mx<`IF6@*OSQnJ99@A+aBxG_!b!#3*4KhWwo7Zg#iW?9r=!TZWaMb@XgWBra7ULj zt+jn+UA*>(9b>)>28q!xypC~S@FfvMu*F0Q4X%Lg^xM92a{O|SVD`h)#exn&EoY+JQi*2-^aJ>DCxBTCa`gkQTHgtU(&ETiErJ1$PveZsRC; z5!Rr!fD%hcaA1c%HckcRC_uFAG_2fGlo#z#9sv4CTUut%hv7uf;LO8C1a3@@>y;4B zCXu4liv1dxkI`PjXoRp7sK#C@D&ri~a730&CdmE755T^O3|-n+JfsBG2aOyQ!C8>9 z9T9wjlovb<#ktZkp9l&bF?6-AwGJ7QA|?WeT`I12A|JXH#1Aiw|Gd2v`Wwi6$)+4#&Z!#L3qid zTe^yZvRgFu?*~d4tD0DdeY!e>Rh(VScQS9`$j<`mF*V(!x=!Fd3~fpXncut-EQzjgHQBc^{v3adl1CS>}U` z*{7&z6Apw*k0FIvqlfMXC7qkqQ*DuIwC14-yI zfq}9CCT}6Li-pO+S3aWKTag(Ie`9Ck0Vw$+lL-4U{!_{nV-fv2vmt>G4owDN`;R?w zK)>O3hCVX3AL|rcJUnjzDigp28u77v01kJ91g?78H=+}`fhUPXvO3g;kPMtf;$Tmr z=R5m8(ns{q3p_?TdU{s?@?}fr4_lpF1xRumVAM=GoL|>MH zEK#;FIT*ITJ4ozOz>PtZh$3E%{Ss86MGQzw*W6-w7Q%oaE2Gg4QCc*fjU`{ zJU4#de`3}k?xbqwTbTxraomR{ZqC2X!YR80Cl#-yHI|m%SbllvZS&j7v9Y9u0vGrf zTy}d+xZzV#E!5?s!BY@6{t4B>((T!s*ZSE5z|&{vj0 zBhsY}UWJ6z!3KJ}{eghdV%Mq*b_`#=!@IfR5p>k!`8IDEnO~oaPqk*CjogDSwB_+* zzdgI4k&-{aw*OH|$^_GPB91#~odtV}y7pBpt*T*Py<-Qr!6PP z2Mz+3Z+Wt67W`-lzApact$X)~&Wsh3G_ng9E)We-R8(@Ld9ws~DZzpkar1N7Oqp3( zF=JhajtNKGj2(lr*G+EUe)Xfpgl0U=m@Tr-KM5uy5<~|H{zDV_ri;{Ievg7Q69@`I zX??wL^8gu)u(19Wwc}o2$@0R6Xv0U+`g!0p;W`mm`e0S;f)H4v?zI$2X66$oEFepG z^M=u4kCQl1cHY}%HUI~_;C+|7y0pBZgdAJT zC#d_5*~a~kf3~+Or@mACe{{WfIG26@KTaj3p;AVQG>jMek z841ZOS=q^W6D2#F?2$cwkMsImzx(_79>@Lt<2sJ+`@Zh*cAl@-^ZA&0RDE6tYaaYH zA8t*te&4Gdf~)B&sQ+KI`i1FUxqSX=vO?xFdiE z?n?6ayTX%4?tjezPpt&9lPHQu7jdj55u|~G6mb$Q0Qd$B9$a`dl;Ep*Y+%b-1+T!C4R`tpLzL;Pjgns41Roijfc$s9W9@i}#PuwpWS_N^>04{qPO(l&dZ2@@wmynv{6^fi_bhylL)bcr@!ir591V1YM=)^rEOc*t zebI+kY|2=EyhPgL#~gQ!zGZrKGeLXx0c^(E z(`7)WiP}co8o%0GX*4r98UW=dSR|rpPc_-eT)o;;{@CFDgZsLMhEmVGUk77F((v9fMaoTk z`SO(#R5x&?Nts^RhU>ODRdGkk&_oU{H2Em8Qy{#4t>W1@rM`HSboSgN0J@~o(+`9e@&pnjju=JZSgL9xSJ?`BQyK){#wbskrc7}zT*AO)ik&PAThYOM0Eh=BsKHy z#zeFle#-LN=3wL?jaasr@<&QK(VCkx0+Ian!SfU~(|vs_y^?!NUS@rmjmT7sEVkqJ zyP2#Wg(aFXxEnV(5}r8#N>$c(MdJ(OijfO@FOHQ2V4@BBfsjxqD8Ch|5>qP2u+Q9$gYKPeeYruca>OS*!ugt={BI; zZ>~1cx^`R3ACmlr)H#UMIFVWY`$@>JEE6__u*K_^lx~f(W4Ygh({5=ji?oP;KB4mj zDc#tE2(Fq#>_D#$>v-3JeMz48S(jRO&KrkB82lL6!65<3_p@U_uX?pG&QjwCg?4hs z(;}{XXfg5L36F(;M0%cSSAj5m;hgwxNPowYgsUg$Lg{vF8~u?|1=hh7PBfx?63GWR zBv2b*IxZ`NyAI%hY?xz^ziiB<6MdVF6O@t{SoIzZb<0+tf=!}O5cnilJ4@kPzKiPW zueu`qxd%fs_~ooBBSQR3TZV^ICBI~&zZx!20tUf{u9zf$7}A?7*ffZuFnG1<=jj<% z4$ce#DrsATt%>YYRCPoygCzqG1L5EL&tU^q@8&O6%+v;O7L9f0hhhH4jv^E-=5hhb zxtt6lrpw~j2l!U!ZNMqOlxf^x`@hhxug}UXIu_|RZ=E}aYF(IX3S-!Ozh1}hULUBP zYcaJ>zGDDpALHdIJx5++37BGcKnsOjiUHN;<6S#(pkNY$wJA~Fwsw|PcF`AXe1>5) zFMP*@&I}9!xPj&tb+L^W9mZdIc9cYy>QtHPV4cRf?jq*bji&VC%c5Xu9C|enPl|)n zA+(kDLjM>jQ5etgqYFFRNJ4*S+}ZX6^oVek2ZZAIYh9_0H8j-XlvB2E&kIXA>#ZgF z5!F-aVhD0mh$}tLdSYgjyAO)xA@_;y{2kt5VG}#MB)UejY`cnMv<+Xjx@DjjV|aKt zEZV-OV<~I@F80J5Tb4c(XUq4yM&2Dk13&8+xpZ>xqZrJ#|0@f@nG^7Kk*DWa_s5ps zD<$8*Kk@dS+a&9?v56S8?RAg*{5dj7{M7fL@G>wqdlC~P8OE*EkNV>N^QNYu9w$R& zXlr9?o|Qd(tDYtTnIn$GGd)Ah!me{?5JyL}52DBc|4K^Mw-W57d6*<{sIzi#Y-iTd zL1H_qjEdhVr`(;}*gRAlUforgZ|h(Oq4q;8n7nq<^VGbW#hxKp{j+RJH1XP^@?=Y3 z;7E$zTA>5q4X=$|(0t$BM3LvQ!rJGxe3wxudaWMql(p!)hmNITLCt8@#ujPCs8(%@3hegy4up&C#3eWcqoLd%K4e7Hk+q2`DY zn?c^(P}t`CbFZr*y&Uy81BYX!H~D7zGrDACK&}#j4#Vx`4N9|bauOlToA6Or&&XZY z>7EmkK)f_=RW87QP<@#Zavd0Qjo?|BwTR5?>FX;)*SquLR9wA(GUf_UF&O{i*2pA; z`s!pLv$IyfizTGua*%W9NU3q#IDz4>)eHj#}*4{T|U95^jriBvK51 zdMF~Qp0fCmz5SP4nLZ0l?Ke#HuH&Jhp)es2s~qxmRso3Md|K=CS0qiqbkfvHiv%{z zSW*b98fknpWM0=-xFGVugk%MvK(6dTK=wFbNkDUV0eAvpwend8e9IZc$ zw;w~4UA!*x7}zoW<;!eOw;y7PCHmK!+3mp66F}7JWR4^ox$K> zIG@VUoU9RppU@~T9f5(MfnL5ejf{*wkYOVBG&&>mMI71~x}cDi%eGu#LcHykSeX#B zml5GvcPf;MR{!K%6ko3r*E-tu^QUrB=itcb;$o`GD-qjOdLEuez@p+cFH>RI+P9ZU zKHy-U+qpg?Ac<_OtgpVea;{g^UOJoqY2VGn)bk5I@MKk73+_!X{(0lAf}Z8{@h{MG3cC*Q^X9EX~;!uEQ4@zB0sxwSit_&OkF-qQBUpRUbA8dciTiajpcc7lT97eP=!X z93S8mi!fTK3>cl8XbO6LsVOX-TOsyH@tVk8yr)XpraZVV^H8eD>@_1fZV`^M*qV6> zm!As)t_vgAAMYb|(d@>!hN2$R*34ah{|Ie~MNl#>Jww#ZeO1x%u%03@fLF!#9y(A% z+cz|n&gW)hXm~tD`ShFfWt9m2R%*90H>r9TQp0iUARH%ey)VsxL8>(~V1E5Gswx!~pSd?Ar^rLyB8g4=>rBCR7VSDv zDg-)6l%rxxqLy5J3e203?BC^}*t}ON$T)Fx^H~fdG->s?*y}7MS zUvacdTRq*>ys-zU8YY@Dw3qxU@(=}!r$0Bmx@40L#U(Db!}tUWh4$*)>M0$miI;uF z{}_h>%vlI3-U*QOC@ZUU5?K!58vDtvD6GQ}13r*`!y+bj$QydzhC(+dyl)7sSz!>e zI)t{xMp~W3_;@S{R!}1o*3;}h5$Go%H`WCqgv^z_P{RR?0Zlkj9FM2SF>#&H20dAtd+jUlKbN2ThaE0;YNeED(Os^VWD6ptWS`Rod>V;H?%vF$AA`p0+cr@ z<}!2No2=7FS;z49?eic%qXc1Pfoz$eCgmb>MI@_?%WG!(H{<{n>%lUE{IUov^rIH- zpQgD14b@2ytN>&q}p@GK}gobJv71jpQ2@Xtj{SEnYUyJ zBk|AAUmq(*(;ty$`}XY|!+VTU;JxUu)HXcUfG`%+*Z`$4=m<+;XFre~S~yt+&s2}Y{ND|~jh+X2+0req(cOZVjwwzd!{ z6oS#tI>cztavaEb}jRvqQ zK;*R0?YlM{jtj{ zbcFH(S1+N&&Wm*y*^E5J6NM}8Z%@@{W@j5B@#Q8vvwu>UO5#c=I{yxfuJ^=Pdd;p= zM)C0S_Tno;+D}Dx>(xmWTQ+$nf_;8>%V7r_=N1*ijrBrcA1e8)&c-*d7grUj_J>W2 z^tny>5qk}OJ7VI6Z*S$xhpw4`n_k-x$UhYNf`q9g689JlU07}L#si%CWe;+~1C72m z1UYo6r0>yursK5~o@1`eXF7EmM{Y@5+XF-(o3SyT>G%BlEf4*Y+1cMYH2HaWh82Xh4WNGb!0i;~MyD_!m|p~8@s=&`a}MDk7k=g&QpI^GDQ9oZk-)-G!5 zcb&!KrwphqCJE-9v?(B-ZojRL#jUsz%TEp^tS0I0Lab($T|ZvKZXH- z$Z*^c3bW<8IZAIB)MjN;uE2h)-By=%Ty|r>QgmUAzV@g%m#F(mz5{T=e?7o)ZY>Bk z-lAA)-hlQ5!qy0(0GEM~#jmFWJA-lReRJrT-A{EXH%p`F38Z^Ug{}_ZKOaGi1PcWe z`8|V!(h&6H+-t7HN*7A-LKYVO$dQ1ysa(?IbCGu8oX{<}GDzUUFuRaL5dH;-@mgKl zLuzCR}Op(@dx7%yD+r;^gOeWxC>rI$&J+)5R>(cj|bpOqb>{M z{{KWzqzVdRvXlpKLYN}vy6kJGRy|;4+eS^@;;DKTsO=%IR`=EwR6|7(L0QJKu6p@lwi-q|^8p>N2cx zJFPEBuBpAs>>U{iF*@zCm%Hl}R`fx@S2Ixg7%6#w-iuQe*x{7)9hb?%-3X6*)zF{- z!4#OFG|U*YU2cazxeE^&J>|os{t};grfK5^1f6hE?4T{}=$P81>snIn{44snYFa1aiA;k_l%YsA3H$so$-62;-OW4I&F3LBaam;Wc>In`j^4 zgGTO_7P8!-hpIXh_R14bIdqVG!>i(x01)xZd_wz!8$?Vj8RioN!wp+T+Je=%*p$JzXHqq>rt)biXakPQU+DoSr zCcEHZWBKmx|fUakR$_vpQ1vIjfx;#wjweE zg^Q1+-&Frt@|mM#Bimp3glj?0O=N3`Oo-)%a7C1)S18^aqtB;cS8L5mG!drVvBNH^ zMOir%&d7Th2A;m856a8)ojCNP>BtA~ck?t*Es0y9zf5vEVK#ByKl~49TV`BEs^mQ#4jo zBtafKCHELo+FL2N3`Rrc(CZz6YlK}rmHzzsfjOoNe1bnc#)GTfT6h3wwY81ZeHi)k zXP&?6tr*9-fJcwMfIR<^5;~e~-axh|qHbtA*fZSz2$_7>G%@ykNx*|wYG+$tndx@nAFKRWEmv6Q51>sHq$}7mj zqnM;R>tdE8(qd~3r{gSyQG6H~f8!kkqLg9Uc$6>|z8D2dh5+u9P=HL1|Yg9%!gpBwkW5nmc*W4_9YMR z6awo-1U=%VDPGmxHHDZc1Gvoaw|*;oIAZOH+dL3@E1%~l9AX?Lp;Sl6XcNcxe?uo8 zMgIErO97Sw!tw@Ti=)dt77H|l3t+-otn6yQ5>5g2vM#0)RI~Bm)c9Us9}%&snb+tZ zvGhNcC^NzgZTIV9jCz!I8ZQhtQ3)u}HB0bdpT>7f)G7i_JL9=ZYI}*j5!ZzP%;jIf zV!&{`AKy%0TTTjcK7BAon;VQaC)a$?V@7;qpytrF5x!BxjD=HOH_=Ja%%dXo4ybJ< zMA|$Co(+|*uC9$4eQvNTC~A1Sf_K3{CyQJyn4f-Xk77;-&QSgO(vGE}7)wa2gjH}W z*xT<1h~G*}=;m*wr-8q9b{-~aue>Ixz66;chx*7;(_+%Np4)0!TFj|@!SsVfEOnFl zww<7BaZp3Il5>r`m}+BPvj5Or;PZ^)&euoFb_NOvcnFpmX<7v5u2nZN1iXH8EOVSh zYVkuY_%r~9@854Wr>GEJ9Ae{5via#OwzqG~)Yi#O&(1cA%J*EL$jHe!ev)^mlM~&c z!!dPA$;wFt0~fBge3{P4s=LAE(^^;OoEnv!+Qe(v z)W46FGWYh5J-sbkxsX~_y}gy`7z{q2&XzJs#OwJiySDRIf(dz^k^wFmB&+itS8A*@ z<7=^sNh4#{U)T09zVO^QUS2g^{`Tf=4CJcT#lyqf$oA3nK6=+yd4wR>&V{lkY34NS-6!k_G2*4bf}^Q0<>CTGDl;Li_st#`+X zHcVhgsajdDpd!G^Wm1da!83j1Z#2%DStW`Zu*H+IBNU}p3jEcK~*|Fh+C8$1-y0FkDXNemec(sFWr`xb>K_NalRVWWz(z^*wCmt2T4b7#!C`tC6 zxdXET8!llsK|!?g2~q8zO2X4Dk`f8W#dE~w&7ujkusW{bIkq4~QkpSIxWjf?ToRL4 zy!)Fu+ttWv$t!Z?zaPF~xoP<;cz#lMnpjKGr;S3EiPlPwr2!QvCBmVI8(gNh?rnpD zBL%~kPdg?FpXCz3qT!q}y0HlO4q7?A+U>!F;2+%I3Zw8>=U|t}f z;rv$|Lj&})1sEtsPKE6rDb6NzX!si;_qDPbxz5V1mMLZ8l8ASr0oV+fM!ZQ_Iic@K zZi#_GmryET6%lit+ZG`018Y{Ir1t^zGlE~EIUKdVB^@If8Akl$0s>CgJD{VFf?UXC z`Fz8(W0&o_&elxfm2CQGty7pV3x_kI%>k{zdi3ZfN=nKo=4Kto0yU1CZ}-4HW{8y= z2-Ue2a#iC6qPwTQes`E`bbb9JFVCyVDn^EeuE6Xf z7kyagf4pte-2}gfb+8tBoFi=l9u&{Pt&EQ3DqC|=LlKDMq8^JVsC6F9y*)!QYy}y8 zlIiYCR9h%j`X4e^HWaP75!fq!GY~$dt*x!k49xwwNyrk0>X-R?;I}akyIP0}KQgG0 zTl~zs3YMW9t!81MAblMiq@b*niM32v>8txx5ytU^Apv&8L zZ&#`Ye``LpLjl`P)PUgsM3Fg}cwRE=-+ZyjlkH`mb5HjMCBuq_#Qe!(OP;g2{t2fr zT?3e)b)z&HuYL5`X_D;s!1%+gYxNXE+Fk2yUd+OGc3!{Ez3EA4?Jdocd%k(#w+?XL zYK*uv6mc9o*K@RD z&e)efII55j8m;(~x6}rWp9M?oNJ$8>%pKy(|8y-ZUC(;*T=I7#hqjo26L+as{#LcL zkYWp9J(QA?(uHp^U55oEVfMnsZ!`(@)4TGR`L9cgWM()tJf5EAgp_jSLuPJ^3$yro zIil7n$S+;fH8QGr(L8srcHfE3+o|4tfy5fawioJ*7+G0aRaM(wE2Nf`G=?7(7&R0X zq`AQdW6j??0)m2-rKME(NP6|(d~mX{_?hGqKb+m)Y}aIe$c2St-PaqvRILCgpiGbjrA4i$q@;u zflrN4Bm;yp2F=)7hR8)iy8MZ_}B6AtRzK1XxZPf+31dUq9 z$3!xLu3a&yTXARxgC@aI6jtFvb=v)NRNRY(v|%4Tm3|;-=*{ zcK`B%5$}OobbhLFx&w0A?5kIXR%+{9Jj1EOcwyGMPIMXpiZu%(eXU!Y;+@WW*5pu( z3SMwnMo>AsUK9A&kS8UNvFiy=FuWb{<}Fs(MIcC##f6K`G*X_A*c^5>)k4<;We>dq zfls3kw6l-xp@6sB-Ye^r=Je-(R4iaN#@-_?erL1M#w3)mYm&q#^Qm!YS* zkjehqdFJ?<&vXCR(u|C2YAMX+#F`cVRW!BITjd}^m zqG({??hX(2o53MqW=9Iblu##%Xqv@dzh|kc8IeH}2SW#n2x%r8O{vz6^)!b!t(X?&FLFs8$MYk@-(WfS5}TJ zwPqy=d#xW@Tc-YAUH0_TK>>5y#i{eac&}G2h~C~&4WGwZ&oTCpl$&*qmBu(>WP-UW z?yjwXbfDj{;~GEC&AvM^2zvcJtn2sq@$L8Z?X$9Sb@+9# z^{=mSt(@Vxy0H$VCUV?1(=Q+3GR~mkY)Q$`BIez(3URgFG=+9Uf_Ui{7sVnxW}unY z1ak}tfd1|9^>Yt>d=Q}#au)mm;LOsJ5}ulso=b4L1N?aQ^l2;&l)M7F5B;hN9Ea+` zgA$=N%(m#a2DhAk>T4}K8Fq(+E9VrK7nsXa)taDSL z%Nlv54uFgqQ80wuI#jyFn>O}-l8Blr{r-I)5@sM!kgj+V0-%WyT`d1K7g-CB(9pHA ziu-8jVPkW`(W1NZ+ku+l#w;OP+L23z_&jg01>MNJshdb+6F;f(>{NtMrqQf)*GB9P zC@pZMKQeEbGZFPtOMkBO02*gL^FjXk$@YtN>JHiC2=IeeIQ;i-nY?e+>mx0mK)0i# zmtQ;OyWb(8UlVqa9sG}v)o_!RDG>a^yZ+iSkowp_(k!NSl3NnZZ@49Hjavx*1BgT8 z!3eaF*nYr(5v~Hn$v_}M&uci$NJ_x!LG(Tn!S2`;51D+cJ%zViU;p*rHtUWC9pOuH z3Jo9hjvW-V*m6!&lM7Z{U33uxu%Wn4nq#;FIq7*s*=C;AcHL`Q>5~Lx?llln5uT;I z;5QKwDS{6}PdS+6i+ioFHoctd4IvH>oIi)eU4w}TW#zc)-xJZEt1AmxF+Af0zANff z|J#!fQywCfzClopGRV@lWwrAoaTh7?&XxY6^Ys-kZxI?zc<8$)-2BI90Y$~VtAZnR zREu=Sj~+dQB%Vo$HG8Ux`Y1`i^q_Qkaxi=JM|+{ODK8oSfZOp1)eY4=uP%$Z5+4nQN29-Qf@{gUs)nn*Q5YKdym>#-`78 zSw}N5PTv6t78#{=)^UzKIXQ@jFH0&;K^MVnE6n!we}z-=-s~D}dH#GxRl|nzgIBjU z;(Y>SLW)X%w(=!ycT?BgSf?a~x{x?dLrN^_WYzTH*~G%?P}QCODVD%P67ik$tE#ni zwQ8`tVk*V`@4NU(l}XI`9ENh!t_uqrk%FisV`e6mZG4B=cGxy5aqQ4t}ew z4DBjh$#8BIt6ZNt{NBn6Ux?AkiTbnSXdF#@qMRGNMwO(#Dx#BA`c0f;lq;7uzYg1b z*ML_L8v8UftN^ySk>aQY*ID_O^UTEGBn>eJq$F=|nZdHQja}WJ_xwO+ZDVQa^Lnk% z_!r!*I*T5^c|*ey#C#*k$|ICZ`{^i;iRVtguzK!`kM|`EH|H^qwxsDHiU@IHG!U)o zD;>o(S??f!$?rhfkGcRgzNDU^$)M6J=Yyg>GX2xl)3zdZ7$)x!@7K$c)|z?l+X1Wl zioJ@vwQX7!78dlc8G)$MEPSVNh#7P|Ms;Y*6E5vgV_kLtXe>3UE<4thVEP>iJz=@(g27G2Sc2#Ygg6)aT>yO#`l_z~9v!_11Y>R)X%*zx zLb*;La~FFAHp8q#VOB9`r|Gb7tlCHF5PChhCs53K5``E3K|w-VpNE-7{kWwS0iUa9 zU-3GJhO7^$GyyYo7a}kStwD{-4BdSX{T@s}Umnx2kwdjWD;FWL;&Q`fde7sm%ll}< z%HNqQmWwGWrWm=k8EZsYgTKH3qeqW)F~eif1D?C% zq{>gP-^X!M0-3cNS6`NSi>2knS=Eh=zR1cDqLG*g(T=~moYjx)l&7!)4Qp1__S=t* zy-$l2VHGK+4E5-6>)WA?lWlGp^N!#>n5>;Y``*?y!HUz}dx&yH}zYulzPzdA9p zbe%z7xz-bIQ7AgBk3_VP8p4e>0*GYGj~_|G3jZdMWTJ@7oFJ}>*W1p)0uS(4jh3Ov z3Q7j-hch{~XZrg3>T)gHF$WELIkVn7* zcY^&b7n&+8+UJGv7{+3$YXdd*g77~AdGv;y29fOd!H6M4{52NzHfl~xsAbsjXWb(o zP*G8pV&cJ`MnrOr3nMR_6}Ahic#^~`Ci6w-tQ!bt12WdTx@6bZH$X72aEOwVo)~9+ z$NUW#+)SbP=g-fVk5-I2z=>GVX-bp*^&;L_RjzoN>P#DgY5}WM4s*Oz)bD{B*zj`(oZYm!PmPf}8n(jo+$czqNJeiBo?2w>Qvk zd55y=E04;4{$w(sp&76Jk%zFkOSx995H2O*kzLN3UR=^Mh>%E8R8Z?I&G&Epu0W(`~#XAP$3X7qdc-yPuof)+4zzq66%nDzQ4h#*Sbq5}c>8PBj9zdS57{_4vaLF4si`|}wGeHu zZD|kd%`80E*WLNYXprOv8gVNfoeElCJm681#x(=n0^}1Iv5~nS9~5b#W+URzF4<;u z>G0vh!z+4Tn0dGFa6{|DcH}aLpZ>UBfOb=(HX(xYTO4fX>45XJzyCM_4We%InD-nd zAF=&trKflMJU$3~G)ZnjT_QEnxn@5?e^VVm_|&-s<(?_~TvZT15-Z(T2=Y+M@N8(P zGL}LHejjCom*KBv{^T*rnrLiHSZm_rr9LkVr$q()L>%sfxa(+bQFp;5&Zu59Z~cmE z4TYDj3upDNc;c_HpKOf4RAKzeBthmDQh7HaQ0xQ;&)&;yY+&ylCdxn_=$V)#3GvlF8>;_W?s@QR8$-+h;2`Qw;ns9Hi)@qSa`M7p!%loU> zP8billSTe<@UX0Mf}EWQy?%I+kLepExBAe{!)PJUzOiv9-z+I2B4S>zDmeI`ICFHS z7{aq*KfY|yL4Xb@asWIOtH6$^q<%z(88yDX1mB(#qtp7T3&c~Gp_?aIEP&B{NM02_ z-8nHinN(M3+V~olukj%gsP7}}>{rqkZE(BeJu>y97Ik!w0mBWxQV7a6XqkjTe(Ql{ zA_FVg2o*U5H_-9YkRg=gwO-j)LJ`+IyK?mv-xJQg+q2tjeDBTE@>@51-%>gD>CE6m z&8U_kQY-8S5RX^Z*GH3Y-in64?MUg7LIDsMwbM{5qm)Y=vBuYYXN;-L=-Uqfu(5K0|NR)@;360}p`RYV2S8Ibr)dO1D}gN69gyUd0?eD6 z7wZ4js- zgoTA|*FLZBJj4B5hp6)+PSoCU735C9h)`D<;I$X2WVlKlp6u100{}PTVY9mdMNl}c zUyXhma&d9#8~E$$*}wWGz}KbX)^SXs&EJ5Cz47XzAnFF94ykaS%KJA5tf7EHE6 zQ2k>Zr@_dIM}b{M{^PmPUm0)k{o%=5QL3W3;0@PIQPH}Z6*U)4@a_CKYD30@NqAVN zr#+I@*jYR(IVHWkj?89!%6Bt0xubmY#^WbD%UUarwOo5INla^49x}{_b`v7=Q(rk1 zVs%3)97#1C^-WEF(c*lZb8dpP7YY8}Pax#m&FJ{!MsBj$f_+vV%-O*?_%J;^rb`e% zq8Rnu@~?kp_F%sYrDK(3BNc&a zhc{f1cptpmUHK+~sV&JGH_y$?myG%z{j)P#Tie-nVB#RTs+yYOJNwxAoT#Y6`iuiq zzS^g;d&XGfT-DUf^rSzLzbY#y$9H(rkB6I9OOjMqcUVYhErySGW&N3_mVJ5@l1%IC zPrI&6c7LQJm?|+9+321U9|hH0*O|2?rF1|+Rn>%XL5zltd;iw;NF(^y zpjEC1H;=Snjwlh2b1?OQLkh0HNRG5K791(hPh_pT{5FC+=%V$=Uli(qB9uq~$}K`I z4gupm(A(1`l+0ueXq&*T{4MZs{&2JKns_KlVucx*0(zuq2)QLO1YQKFlIsGgz}=}S z8|8FuqIt?r{MZ1LJp@`U>NplFAJx`2k4f?NhPdvRbNU9*>n#V*o6G_DK?;G(t1Yyz z)rLC5FvC=)nZ>kUjnsMmt zdx$1cDK=>m-hFp7C9-gvQ}SR;*nk~@9QjIbv`UU-+39}G$jZ;n%iFki3;o(l17Ep|2@ZU*;h zxtDPW-Q_;8kVt4&ArbrlbsfYA0PJHe+Z|yCBD7PZ<=`Cx@Dbh)a~Fc~*tkyJ|B$fK z3d>CZ^+<^tgj8Yx2u9mcW#C{i)m?&{F2@68=_4q)5DY_vWso6Yp%+QQ4Z`ygIC#B) zZle4}5a$aSt^q>!gs_lcc?*E)2QFW}46d;pfImSN^R1mZmbH>-SpD4p&=Li7WS-%A z2g{Lnua-49^|wWbU_B8x4JS$BCBIO@CG0v)$WN-O9-94_^Sgx8RPL=(j)?NlpJJY? zzhcAL?T%&LlV_3Y5`nn~Zo1znzRWi3JYAFChf?j|e+ENG1o6L`BFZ0GvwdJ_5yXhv z;SF`=0q3xUOOn6WgNt0c(xnrQ+yDHaIo`L@c&N5x2mPT9=vI)xe+jmWuLwlOM0FPe zVt|y$`Q3}T5LuDydjfKDtXK&7?;^hUob zZxW$+d&w_R@;DK~3OcAfNOJw{thXw%!IKr=^K+V9Pg3hEl@e3VWIG<6%)CIv`RzQ& z{}chu94#*B1UEzJ7aq-rO3CFU(sd2@SB(-@9a*C=QHm1{TA-<4XB{nr)EqgWld1?g zfc%Q&sENrQ8onQ`w6R@zc68j_oodTvWo3jUhY(BB#uz*9*8cm8VQ1mS%q!$#VE6+@ zxsr4EB9xrR|5y6do^(Z6O*jy3{Z!)3MPop8=c)qLid~{I#9XcVctdsSWRQcYnrX;T zRP>-uwk7-a4Gf~+?1dLelFa9eJ=a{Y*&!|w7umDm;P|HEpdjjQj|Fj<2zSNB#leA?z~Cm4a0BXsw^eYm)I7G5I0DDi2aJY%>= zd&({seD^;BT`S_MD2!?bNf!?Tog3=wi&#H$eKZ#^mhr*a&&pf(Trk9qMRT20Tg+6E zpQe_T2tDwAZzxK6kd%xmL{9bBMF>wH_*`6`^tH8}7FmH8)GUlnC!2juucc!@&Pb6E zNUXlU*V5RuxklI0GGXm7TI7`3a*?&*TI>dXdJpKZI>v^Gy7taaaT2q#tKzwHWQ3F1 zYhxu6HtX-m=EX}ai;_erh!8qGM=7^3-d+WkA$ujcbdu&y-$`ZG5rZO{g)QFuPC2O5 zRjWp^ex#ypj+&P2EA+*1RoE~gh0t)=V9(}%sf!pHnyCmMKE=g_%=H#4l9?t%c49|P zpB8Li1@fGc`?F9G+Tks+SDukY&C`)eQkWR;IBgW}CR%KCZs21R`QLH2<>rQnK~PW_ zymr_GfOHv&dx)WNMx?%^gq)J{;h{d>{%o<7!a^VU#*~~KheQJ*_&L}m$q*r_sg)&R zycLm!h_Q=9p-sqAhTZcYGap({jYf3Z-ci3Zf9XM>5FZq<@kTYuvJvx?i0NqY^fn$| zd&=^0IuFvfC`-Lj47Rvad*DbY2<;=_N(oqdc}8!;J*KT`Z25o}7XNmgH;qq;_d^h^lepC&@9@e(SQ25h!Y%zP$2@6% zVSN+DY7RyIZ71#*2OXn}5;|>og|>c4R8&#jI3Sb2d%Y5%_4`?oH=lS@=Kbw%1I{1d z0aK9O&c~?o0Klu!@|p43Lx&H$EKc2(*Qj);9XV9+C&SKegTa-$Um4)IynLWAB^8Sl z)3g8GU^gwVk!{L?hqhWU5x-JAwzCg-T|J}&SMTA!jJtW#AvD-cBinj|iP`fPH4TkR zJBqz=)jj$cE|Z`SRKx<&Lg3+z)D?cfIt9;all#|+alPJt-^t5%I|Ee`IUeuIzx?gN zL5{!eV1TrS!YkXub|RGNu45e?UU_+x(I(J)LI7v4p`^4Ai^~=at44!(ab^q; za}pozzl^;6j$OM3aBjD*=h^nTdM1UlA(4AK6_qO|E)AJbF1Thc|5Lj|{2!btz$W0a zoW^*Ah;$|B_pZsvJn4$5H9ork^ZrERmw9w&R)ZoWE49ggwYW;Qdmc7(sw^$O`F>gX z<-v6~V|YSw)Egs$O=KJtfkjt=@9*DK*jdO?JE=-MSI}h=siJJ!c$l9)HJ!30hd2SU zz&>ce+HwI6WrFV3{QClu(7SLq6V0QT7qVT}@GWuYxO+UnC2$8FXNavMhap@xoRaJ}dJ{QUI|M`&FiBLa{xai4x4d3EM_##Hthp5r_rJI;^uq&Lz+0|Czb zD}*Shjrkd{O8xg zQZAZ?#~r9AS3AA==va3L-M_yuy?c&#I&qJ&}j0mwy~3|_YzGjq5QcZS7rQi=a| za+~8Z8oopL=rgRsT3p@n0UYFiOQK|UhnJ{=U8hK_v5^NEEs}(t4CtY`L1$-YE3iCZ zmSDE@k=M$oqr*&$)6lPAPC!sfiTVl#@hKCQSX~`DtxdE74Z}6Rc#6~GJWzaNJt|KNrV0AHh#PXqE z!uF4SF?)>ktC%}EO;?sjl9+Q0peLk-+{K8%h;@p45@x*A_>5(f;J<^MMHUm>C%d83 zM83^nEd!x*W)!;p9X)BxH?T1fV^Tx}r;t_0ad-`Y1Q@&d)E=VEPW?(8x`#KgoPpv?%?? z+rXlYlB9N(K45$C0?0J&kQg>W$*)Up|DGa-EXPNhe%}4u6gl zExJ&fqWw4wv73z_Cm&*@GITo)LaqWp>KxTAEXhb8V)xou6TDTLgAgj94dVUTs`kUuFiTM zOILNqteG7OM!0qwIlk9kH6E%(ias6_MI^yR&Ep`S0h|o8U!0|#lM`W%9z!z-xcJ7` zzNhd2RMgeUndsnsz#>zQ#h6G)f*le%L?WIw%GRh7>S?6eX4>>zkXRXO(u~=BF(~Rs zj=&u8t0o&p#X9V3Z7mp(hk7e^AS>+={Pp;($iWB^!4~)>jCurYXDJ^wjBgZ+^3p)l z2j?tC13ekBXuAi4PA50a+LI2WLUR4@!QJm(c5|$zREr1m<>&Fuh*F@HUel)H520d` zv>~3086V8LICG6GpG+SglSk^Gbhz98Bfo3%G@08qD%WYvKP*eX?*)JX{iBWJ^cQ}* zYw<-p499pKFIHMvaLs1o>qmURE{SaIi{Nh5u+iXeNq?s3?6@!y)#B*CF+-wo8L60c z-dOiQ)WQ1tdfQ9DInyvr+D>$+AtG?P@{U`9!)cBP6O+8oY)x^CWq%KYrT*i^6V-UM zFgTU?Gc-ZMQpYGdF{=O71(u?%#cP6(5t~1<-*Si6j0dmvSC?8w>px;e6WzW8LYDvM z{`t?J`XA%Oyg`UytvbJ9^u!ofGZ}o}`2UcFSV@#a{3J#)X|UMs8%b z`+PF~P*R|tqWRYYhYF-85d)4;Nh2@iqvqf6ZoC)a-5dpquxfDV7xccLv=4nNjg9~EB%zA(`biffkzM~Rw z9Ip!f_d=qXa-2lNu#@09QhXy#$(xor`;K1FJW07{94oIv+&%4e0 z1)^l|4yv^HgWenLWxOkW;9;dW*|8gbtMa1>|F5rt2!Sh5OTub`-fckyaQ8;V%0KC= zZj=+IeD%seJ-6PRbQzCh4Vc2WlTjBOCi&mqQYDwty6m#TUgY^o>imBKOTSI*GCXmAG2J!H zc%qj2k6V&Lr|`4tts%Lczluv4>;L@te|+Oo06vIa9ESx|Mi6bzik@KUQpa=GpCI|% zu`fGUuBZR82n$tkGHH`s-3Qa=&3>$fGc4Cwx^^p_T{7#c2p8o;KU~Ax^HE#PLgs^{ zS0;zr1V|rEEN;AU(d#x@NfKXB-~L#!b@26Pr-QyKxBX@7x*LXdqJS9x=lTE7PkQt^ zm>NXJQ(^6tMkfuu@SWp$0>dk@)(u{KaG^k4X+8S#pNzD&7Ahx63(1IG2X}qTa#O6j z9QVPllK-tBmHCQ$?afDC=}vhzGjgt4d`=Ra>o<)Q`@`)N-wx)j@lst-Oe$1hf90ZR zx-9WdMO@tFa@vK%E;|fJ`<9{}m;CnYBk^M{!QOzkRzvb%v?_MZ1aavGG?d+W*uI6xi;f zyj457zg$BeZMBE%CjZxThZla8?FSa}C)X&*pma5YhaL9S&6pT5^;`u|v~B0kWW8&409g$16%$isiVD+6NwWpY2P67UBF!j5{rOU~a5gq9W0olpC?viUe*(;1B ze{y&@BoNBf!`M1`YsCdUhfvA(<6=!j%1@p|v~<)1Rt{P@CH`0OZfm`72UbgB6is`O2c%o^bP%=J!`y{@Ln-7RxERI zBsE=4;bp81$J}!^Hn0Ewe&TpW3zy#SFXzE)g#h}ZNBJ~V*s$^)0A|Dk9Jsl%K0+v{ z#OEQQjfDI59_AmcJP5|uX-@C<2CO@Uusw1l!<1|8T;m5uHG5CVKVu?EdFFMS)f-^Za(9$1kr@^sv-%; zgBA81m*P>Fdl=Bke{>srto@@+_ky$e{kSqdd^z3TNmDEtdYIlZ*T&~;%ur9G%Vgd{ z^g?~-D`7kB%lm)suHd4&6%oiWaeBQVUx7dUSM%!H^brNqR0RtD3r+*3cX{4%ZTXd#J;+g`YrXM;7%9*)#OJZRAsdJU5oUb!NJ?a^5gW?914MPsRh+wU?r3PJFWr8I zJDFEk)*a?}S^^AcPq`Vix;U#PEj27nl`#-?RI#zKyrNa`AwCKSIF;46L5C%sSX09% zoseLIV^jI$P|O)UF(PxE$j!JOBSC*BQ}%QC!TeW$?mUtBC9dH7SdNQp=+osXvn{ia8h8^oi{x7`aKgar`hxbc#bw^jZe-%xc-^t_+=rfm$k{;r@ zG0Zz3;-)R}=`3h*loH0G%xNhXx`;=Sk?jW9S694kpLD@&y(rufGsxfo*58dpnv3wx z!tj2f$bevrke9pnpes2n>#p--C3Yn7hth9&9&=6@cejcM+m$=a6`J#O zoO>v6lKLp8Bwz|5Bbqs2|4#gs*X?pja(Vb4(^@bGcO$gUuY|1Yv8kY^N)XtvFnohs zC?)I7(+hX^JJM@I&GChVYOh4c#~}L6^_VXE@iyXIe+h3zmi45(L5Fp*Wt>j2r~l!VLpXDX zI`a0g%15g9e;+4odMIcl_D=VOPA80OCsp3>M1#en>H^-6T*p_21?$U=8p@k?C#W1q zmG(HdGJhCZvi%_{+C*_6{<7I}nzgewx{^=Z?`ERLG26899zrw8&KOkggyNzc4 z?nAmDcfd5g^7pq-lywOwNY?k7dXB|d+QV>6@Bos**(vYpDuQ~J{vRqjL*wz;4p0r++k`NP|fe0c4x*EWad-mT9k&Ey&SiOIhe&<%e zMbgAk2LC)+Ny%ZgY}36pp=&oynE-$uJ#s`S2wy5zIfA>fS|r=IwwsQDnUgE^1LMYt zq4(ND&B;w;-5Wwd;`8)mhegEd?{Du5z+)Gf0C))M<3`njRS3 zwFld}5N+(iom;hWiV}r}@K^;@0i}AaQ@l=SEkS0}x@l7gJ5L>fg+q{oiMv{Wy*>}| zLxG6LRZk1WPaNvJA(}p*<24=+q2AJ9hQ~_G{riy>rKR^GBQ16_i+qI%xAew!@rtAv z&rQSwPXOiJUd2yg*-iaozA4YQd8po3*C=GgArkEXi_=kc8bJ=zx`wuBdjy0%wC`Cf*>%_6=HnYucATN{5IxZB zgDu;RTu$j5E>^kSJ*<2_O(~%C=aOSaa@r0m4VC@06m%@za#U>Bs>*)l-3Z?OUw6>* zVvyL;v^JK{BLTm047_!!_e?MjD8R3Ik%kh%!3 zKAatf#>P*dKbMi0-wlGDHR>p2R~B3nz8$**5ecXH`Owz>(+N!b_LXj|FN9VLLqt%E z4&EnGH_qR=5cI5Q)!+q>T%YdE_g$ZieL$ul3-soDO$Jb-WCr9tn4)kb9LE{QODnPo zPF2Edh?l?q8h4?Tv-4RjCj)68yZD7kz#?9rwN-j-_Z~%&8H@YRtb0KZDl5_|h!Fr( zvF;gq?~cG%Vca^#m;+@4TT=c%w%$9Q%fIa(mr|d!hlHeM&j^_nNysY6R#}xIBYU(Y zTghJ8B!q-yB;LphWn|B{l`Wg!^SrL_b>H{z@woo@{PAhX+j+i@*Ks_L=eWTO0!J%& zu7DA_{(hmh?7y@HI~Ep$^1`hf^Bv5c-Nb{PW*<1@sHM>{@lqpK521c5p_0yKwr?O6 z1vKo3w~{vGS`_Ls-6Z2<)YzDovHXX0qRX(@&(V|<-Z_~|6Iaylg zebV=iy!dFh^X~N9+Dopp`qs36v+O&0K8iBd&woFs%(xJx&IYwZVH8jsBv<_tWj~~eOz9m*kLJrfJ$*WpW#xLx)$+XeODL)p zxH{#nyWo)obK^^i${S25))mdoFR)9PD%}wvr>rdOF+V?Fn_KMVMQj==bPDOsgzCWJ z${ScN$4Q%)-k3<;%+yt81ID z^kG*GGB)W?dE|`?Sy@>hKAzE4D$Hx?DUK?LUs+jNqOs%B*Kc}&zR!38p)7rvN!^Bw zChQ28Nf67!c9;zRh#}@OP#!(dHzq!+J~THnbGBZ*flg6L-Yh0X&wZVwX-&2{XxBA% zdVBJ9`Bm`<^F8<8UnvOv{rT;ON2G~S!JG6Vf4kT^6>urE<^b7J7AOp$Kv2^*#9w-mVeF?^r zMckZKH8t_5m|)La^ptE0fMQ#_|8*A+PuDx z-X%I$rOMXWr^)w6)7X2sa>99Ao5R$p48@JdyHeFZAo$p(?t1bEE9*t3!mMqR01zRXZP$1E)x8uYTM_@3rPR0ki`M zwd$3+6EoeESojrB0LziLP-z3*K=kz8L?!24Na6+o&@rQl{hHZ&AW=-qeOvBX<=IPk z2WI$5hX?51jQCypT5d;+fe~3HR>zYQyIN41no@5lXSeU#x_RrfO>R>-oQ`HLQneR34lgGm8s00e{&%$KfWV~Nc4QR|NcW0QY?n~5=3 zZ>Gn2vrX@0##qn((dZmM&CSidefI=1fn*8BShlerF8-rPKX8kTWZbv!73pbb>=2w) zZTlB7K~384UWi3M3o$fCo0XB4jA)Bh?3MuXbZYQ*z&ZYQZR&^F`^Yj+Q#a-M%rzm% zR+SGr#E%hcAXb74GlqP_n|`o%Uu3X3l^d7Bvkk-M$BGt)ejS=0#SbKwbJJw6>)UoM z-8xWpm+owzybzT`nt(SeagSaQG~Dp{Yjw8_qTH+6!^dWrJiD&$Yf zWPjA+Cd3rjV0>8~oJp+VgPlAi1&>|-LCk`x_@gz5$`b&59D9Z}`(k9!~9x9@^R zYvBG!F+RS%umb>K1Sj`MoE*e3g<*}{)uaOyJcRESB?jXJaITP$8x58Kt{9^)!SbbV zTLM0fOMlMi40$N(^XwJ-$B|Z#8l`%^$($6DQS&COp36|K=|n8!ryU~2?e{|(h^+uv z%0sBE16ZC6W>$n@OgMimS8NPruwld+68aLu-D}Gd7cl6_fvY`K;~4&}Fe^LTV7!$~ zoP6Tin2Ad@wrFA8eQmXE%NF=w9>w3! z{P2M-u%q_$fZ^?zpC8M7uhsU;mjASowma#?+(qjarQ4UiD*O*A*9BJR=j)33Na{q= z-tRCUVcIrj^C!Cx3KALye<+Y>VL0o4n5>lDN;`YYg{=W>J|ExIv zIsUyInNM{5hX25|%>)Bt#5vcZGOA>#KHs9)QapFp=RRZ8l3q+xF*QeE*qdD+gH{rNHK(bsD=b!si0AN= zXpVqchP5ao_FSOacP>~fPW(cH?Fk$Nn{I4q_tDVEz|eB>Pi`&55%m3@V!T#>z!gve z(ZZY_ks@BG4y$t;t7kC+%E5;mBTpPaeu99x!ESqPtM!eI3$!jr=0v%!o!C?*V*xq@|!t;bBX@c;?3!{3InKA_BrK#lk6C_oyq7Hx(B2taX#hd$5uE^K!D`cQW1Gsr?4pf~ze));=FEmCPn`RDji z3->VJ^x=cg_xj}})@s3iEYD@lK_=-0_*wgg$Ygh=r2dW@CsibRBKZ_h@-At$TeMC@ z@>;n*4*alAs#E})mdIR=yCA} z_w?+hGFw@hT*DgO0%>ad>pm=g{C(v0{{Dy7mNIG0{!wpAMk2K@dw7w$em!$wbiCQG z;ljwf3DyDmcmuGif)1KNOylDWZ?>8yxhIPxziI!NNisFGAA-^Af7Z=;#n| z1Gu}Qy*(V&PD+|r1%@gH!VM^ixA_hy1K_W+fcveRUa)lJ=XupsbJ~zDsAi#AfBN(( zSWjQ;c^?CmgZ3bsst$gwFQ%qU5h5EBAzl0`XGWl3$gOaPhjjNznOhg2yHHL26(RbF zT3FZ?N$frrI8z`|!5ZmFMn;B(=91XRyaT?U%Brduz?oEC8Mbv_F)I=Q1EZraGBT8( zSmg!eniUqLx13<(2AQm2(B+H{7l8zPbj_JIeYS9rm3M zCOYg9z)N0TF~3~o>`8zsW|2w+Xna{w@!Qw0QJ@MOa@=@2aqcl}Jziw+@2mH2r~12{ zeMHCiWsHkI6MYW#7t<%tXm4#q9TyYvrH``l58YW(<<(+goAs@tmVLpFoY6;~@J_1! zv%5e3RQyI~#EUUUOYv0*z@K+9_=_GK6guB~1dZ7q02O zLheSa#e4H^Rtj$glg-9E)+gNbGFW;38mAmd<&*QUAZ=v){%d2~<{iPs|GjtBc6P>^ z>KL;~QKg19!>&(46BMUd26)fp&Ec!9D$<~b@2Jd8YLW_S3f@gGH{bjl9!pV@AtbeJ3AIU zFrRwn4p-IDIePVpqZ*s!Jo1^MX6L8*!UMdr*U}=W*Zm^{;spQ*Gn+oL^iv;WqM;63Z0zr$SP4Vu4I)8tL9580HZTJGpxwJM%_sa*eb?oR)D)KMO)A?n;{h03*~ zWb&Bi%`dsZ3=XynP$6XEDSdg=r91soi%_{OOa(QCp;PhVshl?rL zdh9_>IcEnh0cd|a=;-JOU>hVs%BkO`8Pjbh(KHrs8Zj4xgK~Z8)8M0)pCcbhnE)vk zoYLVT%JDE9In!v1Z{)5rZc*^Ej^|{w)vpNSP$&u)@w=fP{sO*>;7gUGB>YNsO)yT2 z^-7r+&hRh#%kZOHYepxg#9^_$wZ-)Mrvv$W)CMH-v0-U!yjneHn*RQ9Y~8a9u9MqT z*h+ryyRTD15?P2&6OiAbtwt@=uo9dNUp%lOWU*uO>>T{7SG7>pc)TUkTAZsz^}h~n zsvKrrU#i@hT!=9Spzv7=7*if&Wp&ReTK0r;WfpVU45(`d4r_d3%%`~jz^Y&;vV?je zZqMRAeR>~-nAi$`{pRz4!5a=1ZE?P@(q>2(BSac-fjy z&s9yw^Ez$jzvg4myvAzqE6+eP!CBd6V%6(zQy1IA0{H~vjrHQmr9~PGWpxNvhTpFE zOA7ARouk@W-ubohkXu@HnrnLgMvjHlt;FGVmxKn5AF(oCmJ&%$(Ois{j0zRcTo@B5 z{@W={=mX~fWdORn9b8H>b6S z++SJfwqiLgb&v!w3L^-OSeJjK+~{h{j|v(33a<8DB{S1sjb3%RHbR7h)r)SAO}TTc z;Owp2KTI1cbS^Pj?3T8i4vxM-l_NEHW7QE{+wV{RD;XhH?c$}OL+$o=32vW*ua(j9Ok>s}{=-BF3P=z@_G_u?+{mW>&P+Q!%r`tA&+W|A`D<@~ z$Y&+a_uIZ$>mRZb6%%U$x6)Io|CK@IWhvTyPuGpv?g%J+%D(E;nC;MZiskuUW`qX) z4@c)eeAVO6*=QgirGVeuzQ;HNa0>OowwD6-iWIm!yJkf&EugF13@-U@g7}pUc?|`; zWaQ^Z^W8K-!1>nF5-j0pBXGCzB0@_qg0hUZ>FZ5C#FBn+tdoBE)bM_ULY+skx8L=m zUmqNYoDXuaH`)KB+v%{=;s!9ro0s#?b^(I>^kyi%^|3(_H>M2HzOw$(q@!yXM*udtJgmP;mYIbjF#Czwls^wYMegn5S2Ag`VMnP>8tvV*!t2voa~l% z+Z%i4zjy2MZZN1sk1ByinMjk3ftmn_NdW~xWryws-Z$5ex~@(;O1f*M#c1bFP?^

wyT*R{UC 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%0DC8 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 diff --git a/docs/usage/evidence/qwen3-next-moe-route-b200/report.json b/docs/usage/evidence/qwen3-next-moe-route-b200/report.json index 271e69c8a..5a9fa5056 100644 --- a/docs/usage/evidence/qwen3-next-moe-route-b200/report.json +++ b/docs/usage/evidence/qwen3-next-moe-route-b200/report.json @@ -1,7 +1,7 @@ { "kind": "qwen3_next_prior_art_report", "rfc": 428, - "rl_kernel_commit": "2e950f386bd3c4c2c07f41472f48878be94ea3b8", + "rl_kernel_commit": "c58816bf54940195b543beda14e0de65a71182c6", "tracked_tree_dirty": false, "environment": { "gpu": "NVIDIA B200", @@ -13,9 +13,11 @@ "transformers": "5.17.0", "triton": "3.7.1", "sglang": null, - "megatron-core": null, - "transformer_engine": null, - "vime": null + "sgl-kernel": null, + "megatron_core": "0.16.0rc0", + "megatron-core": "0.16.0rc0", + "transformer_engine": "2.16.1+c9877beb", + "vime": "0.3.2" } }, "op": "qwen3_next_routed_moe", @@ -175,61 +177,204 @@ "tokens": 256 }, "batch_invariant": false + }, + { + "key": "megatron_te", + "name": "Megatron-core MoELayer + TE grouped GEMM (VIME's Qwen3-Next config)", + "source": "megatron-core 0.16.0rc0, transformer-engine 2.16.1+c9877beb", + "route_rows_bitwise": { + "16": true, + "64": true, + "256": false, + "1024": false + }, + "output_rows_bitwise": { + "16": true, + "64": true, + "256": true, + "1024": false + }, + "repeatable": true, + "dx_rows_bitwise": { + "16": true, + "64": true, + "256": true, + "1024": false + }, + "dweight_zero_rows_bitwise": { + "16": true, + "64": true, + "256": true, + "1024": false + }, + "accuracy": { + "rel_l2_vs_fp64": 0.00456482750054121, + "max_abs_vs_fp64": 0.0022296928321409726, + "tokens_with_different_expert_set": 0, + "tokens": 256 + }, + "batch_invariant": false + }, + { + "key": "sglang_triton", + "name": "SGLang fused_moe (Triton), default", + "source": "sglang 0.5.21 moe_runner/triton_utils", + "route_rows_bitwise": { + "16": true, + "64": true, + "256": false, + "1024": false + }, + "output_rows_bitwise": { + "16": true, + "64": true, + "256": false, + "1024": false + }, + "repeatable": true, + "accuracy": { + "rel_l2_vs_fp64": 0.06984328047814348, + "max_abs_vs_fp64": 0.10739971750663532, + "tokens_with_different_expert_set": 11, + "tokens": 256 + }, + "batch_invariant": false + }, + { + "key": "sglang_deterministic", + "name": "SGLang fused_moe (Triton), deterministic inference", + "source": "sglang 0.5.21 moe_runner/triton_utils", + "route_rows_bitwise": { + "16": true, + "64": true, + "256": true, + "1024": true + }, + "output_rows_bitwise": { + "16": true, + "64": true, + "256": true, + "1024": true + }, + "repeatable": true, + "accuracy": { + "rel_l2_vs_fp64": 0.06984328047814348, + "max_abs_vs_fp64": 0.10739971750663532, + "tokens_with_different_expert_set": 11, + "tokens": 256 + }, + "batch_invariant": true } ], "latency": { "forward_us": { "1": { - "rl_kernel_cuda": 1376.3200044631958, - "hf_transformers": 2020.9439992904663, - "vllm_bi0": 356.7200005054474, - "vllm_bi1": 367.8240031003952, - "flashinfer_cutlass": 341.74399077892303 + "rl_kernel_cuda": 1386.0480189323425, + "hf_transformers": 2066.7200088500977, + "vllm_bi0": 374.9440014362335, + "vllm_bi1": 387.91999220848083, + "flashinfer_cutlass": 368.51200461387634, + "megatron_te": 3787.440061569214, + "sglang_triton": 339.1679972410202, + "sglang_deterministic": 349.7439920902252 }, "8": { - "rl_kernel_cuda": 1379.8879981040955, - "hf_transformers": 12903.615951538086, - "vllm_bi0": 364.6879941225052, - "vllm_bi1": 366.5599972009659, - "flashinfer_cutlass": 385.2960020303726 + "rl_kernel_cuda": 1395.039975643158, + "hf_transformers": 13072.400093078613, + "vllm_bi0": 381.9680064916611, + "vllm_bi1": 385.328009724617, + "flashinfer_cutlass": 432.2880059480667, + "megatron_te": 5061.583995819092, + "sglang_triton": 332.8000009059906, + "sglang_deterministic": 353.5839915275574 }, "64": { - "rl_kernel_cuda": 1706.6399455070496, - "hf_transformers": 60610.20851135254, - "vllm_bi0": 653.984010219574, - "vllm_bi1": 660.3359878063202, - "flashinfer_cutlass": 672.1920073032379 + "rl_kernel_cuda": 1687.5839829444885, + "hf_transformers": 62156.3835144043, + "vllm_bi0": 660.0319743156433, + "vllm_bi1": 658.3200097084045, + "flashinfer_cutlass": 723.4559953212738, + "megatron_te": 9674.047946929932, + "sglang_triton": 606.8799793720245, + "sglang_deterministic": 660.75199842453 }, "256": { - "rl_kernel_cuda": 1892.9439783096313, - "hf_transformers": 85160.57586669922, - "vllm_bi0": 778.6239981651306, - "vllm_bi1": 785.8560085296631, - "flashinfer_cutlass": 831.5519988536835 + "rl_kernel_cuda": 1846.1920022964478, + "hf_transformers": 85269.61517333984, + "vllm_bi0": 779.8559963703156, + "vllm_bi1": 790.6079888343811, + "flashinfer_cutlass": 858.7839901447296, + "megatron_te": 11665.247917175293, + "sglang_triton": 759.0239942073822, + "sglang_deterministic": 819.1200196743011 }, "1024": { - "rl_kernel_cuda": 2048.975944519043, - "hf_transformers": 88626.1100769043, - "vllm_bi0": 872.2079992294312, - "vllm_bi1": 881.5999925136566, - "flashinfer_cutlass": 850.0800132751465 + "rl_kernel_cuda": 2043.7918901443481, + "hf_transformers": 89267.74215698242, + "vllm_bi0": 874.2719888687134, + "vllm_bi1": 868.9280152320862, + "flashinfer_cutlass": 902.5439918041229, + "megatron_te": 11738.048076629639, + "sglang_triton": 833.1039845943451, + "sglang_deterministic": 841.6959941387177 }, "4096": { - "rl_kernel_cuda": 3047.216057777405, - "hf_transformers": 88805.53817749023, - "vllm_bi0": 1060.5120062828064, - "vllm_bi1": 1061.1519813537598, - "flashinfer_cutlass": 1079.200029373169 + "rl_kernel_cuda": 3053.2480478286743, + "hf_transformers": 87444.65637207031, + "vllm_bi0": 1059.056043624878, + "vllm_bi1": 1051.2160062789917, + "flashinfer_cutlass": 1124.2560148239136, + "megatron_te": 12122.560024261475, + "sglang_triton": 1346.0160493850708, + "sglang_deterministic": 1367.3120141029358 } }, "forward_plus_backward_us": { "64": { - "rl_kernel_cuda": 111661.79275512695, - "hf_transformers": 877700.2563476562 + "rl_kernel_cuda": 113590.37017822266, + "hf_transformers": 876752.3193359375, + "megatron_te": 44856.64176940918 }, "1024": { - "rl_kernel_cuda": 166025.42114257812, - "hf_transformers": 1282811.6455078125 + "rl_kernel_cuda": 169058.31909179688, + "hf_transformers": 1284274.658203125, + "megatron_te": 50968.2559967041 + } + } + }, + "environments": { + "main": { + "gpu": "NVIDIA B200", + "torch": "2.13.0+cu130", + "cuda": "13.0", + "libraries": { + "vllm": "0.30.0", + "flashinfer-python": "0.6.18.post1", + "transformers": "5.17.0", + "triton": "3.7.1", + "sglang": null, + "sgl-kernel": null, + "megatron_core": "0.16.0rc0", + "megatron-core": "0.16.0rc0", + "transformer_engine": "2.16.1+c9877beb", + "vime": "0.3.2" + } + }, + "extra": { + "gpu": "NVIDIA B200", + "torch": "2.13.0+cu130", + "cuda": "13.0", + "libraries": { + "vllm": "0.30.0", + "flashinfer-python": "0.6.18.post1", + "transformers": "5.17.0", + "triton": "3.7.1", + "sglang": "0.5.21", + "sgl-kernel": "0.3.21", + "megatron_core": null, + "megatron-core": null, + "transformer_engine": "2.20.2", + "vime": null } } } From 4ef7dcbf3f7dced9717a2f522128c4acfbcce9e7 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Sat, 10 Oct 2026 00:51:36 +0000 Subject: [PATCH 57/70] test(qwen3-next): measure FlashAttention-4, Transformer Engine and Megatron-core attention Add three engines to the attention prior-art runner: - FlashAttention-4 (CuTe DSL) varlen as vendored by vLLM, forward and backward. - Transformer Engine DotProductAttention on THD-packed sequences, in inference mode (cuDNN fused) and in training mode (on SM100 TE has no fused head-dim-256 backward and falls back to its unfused path). - Megatron-core's local DotProductAttention, one launch per sequence. The backward check now compares the target's dq/dk/dv alone against the same sequence packed first and last, so engines with a packed backward are checked for batch invariance rather than repeatability. A prefill/decode crash is recorded per candidate without skipping its other checks. --only and --merge combine reports from different Python environments. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- .../testing/qwen3_next_attention_prior_art.py | 231 ++++++++++++++++-- .../plot_qwen3_next_attention_prior_art.py | 22 +- scripts/qwen3_next_attention_prior_art.py | 30 ++- 3 files changed, 261 insertions(+), 22 deletions(-) diff --git a/rl_engine/testing/qwen3_next_attention_prior_art.py b/rl_engine/testing/qwen3_next_attention_prior_art.py index 8a089b84a..68d98eab2 100644 --- a/rl_engine/testing/qwen3_next_attention_prior_art.py +++ b/rl_engine/testing/qwen3_next_attention_prior_art.py @@ -9,7 +9,8 @@ * **batch invariance** - a target sequence's output computed alone, and inside a batch with three other sequences (placed first and last), must be bitwise - equal; for candidates with a backward, the same for its dq/dk/dv; + equal; for candidates with a backward, the same for its dq/dk/dv, in one + packed launch where the engine has a packed backward; * **prefill/decode invariance** - the last 64 query rows, and the last single row, computed against the full KV must equal the same rows of the full prefill. This is the replay-vs-rollout boundary of RFC #428; @@ -286,6 +287,171 @@ def run(seqs): } +def _bottom_right_mask(lq, lk, device): + """True where query row i (aligned to the end of the KV sequence) may not attend.""" + rows = torch.arange(lq, device=device)[:, None] + (lk - lq) + return torch.arange(lk, device=device)[None, :] > rows + + +def _fa4(): + """FlashAttention-4 (CuTe DSL), as vendored by vLLM 0.30.0: varlen forward and backward.""" + import vllm + from vllm.vllm_flash_attn.cute import interface as fa4 + + def call(q, k, v, lq, lk): + out = fa4.flash_attn_varlen_func( + q, + k, + v, + cu_seqlens_q=_cu(lq), + cu_seqlens_k=_cu(lk), + max_seqlen_q=max(lq), + max_seqlen_k=max(lk), + softmax_scale=SCALE, + causal=True, + ) + return out[0] if isinstance(out, tuple) else out + + def run(seqs): + lq, lk = [s[0].shape[0] for s in seqs], [s[1].shape[0] for s in seqs] + q, k, v = (torch.cat([s[i] for s in seqs]) for i in range(3)) + with torch.no_grad(): + return _split(call(q, k, v, lq, lk), lq) + + def grad_batch(seqs, dys): + lq, lk = [s[0].shape[0] for s in seqs], [s[1].shape[0] for s in seqs] + leaves = [torch.cat([s[i] for s in seqs]).detach().requires_grad_(True) for i in range(3)] + dq, dk, dv = torch.autograd.grad(call(*leaves, lq, lk), leaves, torch.cat(dys)) + return list(zip(_split(dq, lq), _split(dk, lk), _split(dv, lk))) + + return { + "name": "FlashAttention-4 (CuTe DSL) varlen, vendored by vLLM", + "source": f"vllm {vllm.__version__} vllm_flash_attn/cute " + "(its head-dim-256 SM100 backward has no deterministic mode)", + "run": run, + "grad_batch": grad_batch, + } + + +def _te(training: bool): + """Transformer Engine DotProductAttention on THD-packed sequences. + + With cuDNN 9.20 on SM100, TE has a fused (cuDNN) head-dim-256 backend only for + inference; in training mode it falls back to its unfused PyTorch path. Both are + measured, the fused one forward-only. + """ + import transformer_engine + import transformer_engine.pytorch as te + + attention = te.DotProductAttention( + HQ, + D, + num_gqa_groups=HKV, + attention_dropout=0.0, + qkv_format="thd", + attn_mask_type="padding_causal_bottom_right", + softmax_scale=SCALE, + ) + attention.train(training) + + def call(q, k, v, lq, lk): + out = attention( + q, + k, + v, + cu_seqlens_q=_cu(lq), + cu_seqlens_kv=_cu(lk), + max_seqlen_q=max(lq), + max_seqlen_kv=max(lk), + ) + return out.view(q.shape[0], HQ, D) + + def run(seqs): + lq, lk = [s[0].shape[0] for s in seqs], [s[1].shape[0] for s in seqs] + q, k, v = (torch.cat([s[i] for s in seqs]) for i in range(3)) + with torch.no_grad(): + return _split(call(q, k, v, lq, lk), lq) + + def grad_batch(seqs, dys): + lq, lk = [s[0].shape[0] for s in seqs], [s[1].shape[0] for s in seqs] + leaves = [torch.cat([s[i] for s in seqs]).detach().requires_grad_(True) for i in range(3)] + dq, dk, dv = torch.autograd.grad(call(*leaves, lq, lk), leaves, torch.cat(dys)) + return list(zip(_split(dq, lq), _split(dk, lk), _split(dv, lk))) + + version = f"transformer-engine {transformer_engine.__version__}" + if not training: + return { + "name": "Transformer Engine DotProductAttention (THD), inference: cuDNN fused", + "source": f"{version} (no fused head-dim-256 backward on SM100)", + "run": run, + } + return { + "name": "Transformer Engine DotProductAttention (THD), training: unfused fallback", + "source": f"{version} (selected for head-dim-256 training on SM100)", + "run": run, + "grad_batch": grad_batch, + } + + +def _megatron_local(): + """Megatron-core's own (non-TE) DotProductAttention; it has no packed-sequence path.""" + import os + + import megatron.core + import torch.distributed as dist + from megatron.core import parallel_state + from megatron.core.tensor_parallel.random import model_parallel_cuda_manual_seed + from megatron.core.transformer.dot_product_attention import DotProductAttention + from megatron.core.transformer.enums import AttnMaskType + from megatron.core.transformer.transformer_config import TransformerConfig + + if not dist.is_initialized(): + os.environ.setdefault("MASTER_ADDR", "127.0.0.1") + os.environ.setdefault("MASTER_PORT", "29532") + device = torch.device("cuda", torch.cuda.current_device()) + dist.init_process_group("nccl", rank=0, world_size=1, device_id=device) + if not parallel_state.model_parallel_is_initialized(): + parallel_state.initialize_model_parallel(1, 1) + model_parallel_cuda_manual_seed(0) + config = TransformerConfig( + num_layers=1, + hidden_size=HQ * D, + num_attention_heads=HQ, + num_query_groups=HKV, + kv_channels=D, + attention_dropout=0.0, + bf16=True, + params_dtype=torch.bfloat16, + ) + attention = DotProductAttention( + config, + layer_number=1, + attn_mask_type=AttnMaskType.padding, + attention_type="self", + softmax_scale=SCALE, + ) + + def one(q, k, v): + mask = _bottom_right_mask(q.shape[0], k.shape[0], q.device)[None, None] + out = attention(q.unsqueeze(1), k.unsqueeze(1), v.unsqueeze(1), mask) + return out.view(q.shape[0], HQ, D) + + def run(seqs): + with torch.no_grad(): + return [one(*s) for s in seqs] + + def grad(q, k, v, dy): + leaves = [t.detach().clone().requires_grad_(True) for t in (q, k, v)] + return torch.autograd.grad(one(*leaves), leaves, dy) + + return { + "name": "Megatron-core DotProductAttention (local, one launch per sequence)", + "source": f"megatron-core {megatron.core.__version__}", + "run": run, + "grad": grad, + } + + def candidates() -> list[dict[str, Any]]: return [ _guard("rl_kernel_cuda", _rl_kernel), @@ -294,6 +460,10 @@ def candidates() -> list[dict[str, Any]]: _guard("vllm_fa2_split1", lambda: _vllm_fa(1)), _guard("vllm_triton_2d", _vllm_triton), _guard("flashinfer", _flashinfer), + _guard("fa4_cute", _fa4), + _guard("te_fused", lambda: _te(False)), + _guard("te_training", lambda: _te(True)), + _guard("megatron_local", _megatron_local), ] @@ -319,17 +489,33 @@ def _prefill_decode(cand, target) -> dict[str, bool]: return result +def has_backward(cand) -> bool: + return "grad" in cand or "grad_batch" in cand + + +def grad_batch(cand, seqs, dys): + """Each sequence's (dq, dk, dv): one packed launch where the engine has one.""" + if "grad_batch" in cand: + return cand["grad_batch"](seqs, dys) + return [cand["grad"](*s, dy) for s, dy in zip(seqs, dys)] + + def _grad_bi(cand, target, others) -> dict[str, bool]: + """The target's dq/dk/dv alone vs. packed first and last with the other sequences.""" g = torch.Generator(device="cuda").manual_seed(5) - dy = torch.randn(target[0].shape, device="cuda", generator=g).to(torch.bfloat16) - alone = cand["grad"](*target, dy) - # A backward is per sequence in every engine here; what can change is the - # kernel the shape selects, so compare against a second target placed after - # other sequences have been differentiated. - for other in others: - cand["grad"](*other, torch.ones_like(other[0])) - again = cand["grad"](*target, dy) - return {name: _bitwise(a, b) for name, a, b in zip(("dq", "dk", "dv"), again, alone)} + + def dy_for(q): + return torch.randn(q.shape, device="cuda", generator=g).to(torch.bfloat16) + + dy = dy_for(target[0]) + dys = [dy_for(o[0]) for o in others] + alone = grad_batch(cand, [target], [dy])[0] + first = grad_batch(cand, [target, *others], [dy, *dys])[0] + last = grad_batch(cand, [*others, target], [*dys, dy])[-1] + return { + name: _bitwise(f, a) and _bitwise(l_, a) + for name, f, l_, a in zip(("dq", "dk", "dv"), first, last, alone) + } def _one(cand, target, others) -> dict[str, Any]: @@ -338,10 +524,14 @@ def _one(cand, target, others) -> dict[str, Any]: out = {"key": cand["key"], "name": cand["name"], "source": cand["source"]} try: out["batch_bitwise"] = _batch_bi(cand, target, others) - out["prefill_decode_bitwise"] = _prefill_decode(cand, target) + try: + out["prefill_decode_bitwise"] = _prefill_decode(cand, target) + except Exception as exc: # noqa: BLE001 - recorded; the other checks still run + out["prefill_decode_failed"] = f"{type(exc).__name__}: {str(exc)[:300]}" + out["prefill_decode_bitwise"] = {"last_64": False, "last_1": False} out["repeatable"] = _bitwise(cand["run"]([target])[0], cand["run"]([target])[0]) - if "grad" in cand: - out["backward_repeat_bitwise"] = _grad_bi(cand, target, others) + if has_backward(cand): + out["backward_batch_bitwise"] = _grad_bi(cand, target, others) ref = fp64_reference(*target) got = cand["run"]([target])[0].double() out["accuracy"] = { @@ -354,7 +544,7 @@ def _one(cand, target, others) -> dict[str, Any]: "failed" not in out and all(out["batch_bitwise"].values()) and all(out["prefill_decode_bitwise"].values()) - and all(out.get("backward_repeat_bitwise", {"": True}).values()) + and all(out.get("backward_batch_bitwise", {"": True}).values()) ) return out @@ -379,7 +569,11 @@ def calls_for(seqs): q, k, v = make_sequence(BACKWARD_TOKENS, 402) dy = torch.randn_like(q) backward = time_interleaved( - {c["key"]: (lambda c=c: c["grad"](q, k, v, dy)) for c in ready if "grad" in c}, + { + c["key"]: (lambda c=c: grad_batch(c, [(q, k, v)], [dy])) + for c in ready + if has_backward(c) + }, warmup=3, iters=15, ) @@ -390,10 +584,13 @@ def calls_for(seqs): } -def attention_report() -> dict[str, Any]: +def attention_report(only=None) -> dict[str, Any]: + """Every candidate, or only the keys in ``only`` (run each Python environment separately).""" target = make_sequence(TARGET, 1) others = [make_sequence(n, 10 + i) for i, n in enumerate(COMPANIONS)] - cands = candidates() + cands = [c for c in candidates() if only is None or c["key"] in only] + if only is not None and set(only) - {c["key"] for c in cands}: + raise ValueError(f"Unknown candidates: {sorted(set(only) - {c['key'] for c in cands})}") return { "op": "qwen3_next_tp4_attention", "shape": {"q_heads": HQ, "kv_heads": HKV, "head_dim": D, "scale": SCALE}, diff --git a/scripts/plot_qwen3_next_attention_prior_art.py b/scripts/plot_qwen3_next_attention_prior_art.py index 8343c5851..fbfa94d8a 100644 --- a/scripts/plot_qwen3_next_attention_prior_art.py +++ b/scripts/plot_qwen3_next_attention_prior_art.py @@ -31,7 +31,17 @@ PASS = "#1baf7a" FAIL = "#d64545" NA = "#e4e3dd" -EXISTING = ("#eb6834", "#b8501f", "#f29a62", "#8a3a15", "#f6bd94", "#d9773f") +EXISTING = ( + "#eb6834", + "#b8501f", + "#f29a62", + "#8a3a15", + "#f6bd94", + "#d9773f", + "#6b2a0e", + "#c96a2c", + "#f0a878", +) LABELS = { "rl_kernel_cuda": "RL-Kernel deterministic", @@ -40,15 +50,19 @@ "vllm_fa2_split1": "vLLM FA2 (num_splits=1)", "vllm_triton_2d": "vLLM Triton unified (2D)", "flashinfer": "FlashInfer ragged prefill", + "fa4_cute": "FlashAttention-4 (CuTe)", + "te_fused": "TE, cuDNN fused (inference)", + "te_training": "TE, unfused (training)", + "megatron_local": "Megatron-core local", } COLUMNS = ( ("batch_bitwise", "first", "batch: first"), ("batch_bitwise", "last", "batch: last"), ("prefill_decode_bitwise", "last_64", "chunk: last 64"), ("prefill_decode_bitwise", "last_1", "decode: last 1"), - ("backward_repeat_bitwise", "dq", "bwd dq"), - ("backward_repeat_bitwise", "dk", "bwd dk"), - ("backward_repeat_bitwise", "dv", "bwd dv"), + ("backward_batch_bitwise", "dq", "bwd dq (packed)"), + ("backward_batch_bitwise", "dk", "bwd dk (packed)"), + ("backward_batch_bitwise", "dv", "bwd dv (packed)"), ) diff --git a/scripts/qwen3_next_attention_prior_art.py b/scripts/qwen3_next_attention_prior_art.py index 2ded9d0ca..c68219621 100644 --- a/scripts/qwen3_next_attention_prior_art.py +++ b/scripts/qwen3_next_attention_prior_art.py @@ -36,6 +36,7 @@ "triton", "sglang", "megatron-core", + "megatron_core", "transformer_engine", "vime", ) @@ -54,9 +55,34 @@ def _version(name: str) -> str | None: return None +def merge(base: dict, extra: dict) -> dict: + """``base`` with ``extra``'s candidates and latencies added (same commit and GPU).""" + for field in ("rl_kernel_commit", "tracked_tree_dirty", "shape", "op"): + if base[field] != extra[field]: + raise SystemExit(f"Reports differ in {field}; they cannot be merged") + if base["environment"]["gpu"] != extra["environment"]["gpu"]: + raise SystemExit("Reports were measured on different GPUs") + keys = {c["key"] for c in base["candidates"]} + added = [c for c in extra["candidates"] if c["key"] not in keys] + merged = dict(base, candidates=base["candidates"] + added) + merged["latency"] = { + section: { + size: {**values, **extra["latency"][section].get(size, {})} + for size, values in sizes.items() + } + for section, sizes in base["latency"].items() + } + merged["environments"] = {"main": base["environment"], "extra": extra["environment"]} + return merged + + def main() -> None: parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--out", type=Path, required=True) + parser.add_argument("--only", help="comma-separated candidate keys (default: all)") + parser.add_argument( + "--merge", type=Path, help="a report from another process to merge into this one" + ) args = parser.parse_args() if not torch.cuda.is_available(): raise SystemExit("needs a CUDA device") @@ -73,8 +99,10 @@ def main() -> None: "cuda": torch.version.cuda, "libraries": {name: _version(name) for name in LIBRARIES}, }, - **attention_report(), + **attention_report(args.only.split(",") if args.only else None), } + if args.merge is not None: + report = merge(json.loads(args.merge.read_text()), report) args.out.parent.mkdir(parents=True, exist_ok=True) args.out.write_text(json.dumps(report, indent=2) + "\n") print( From 703c6dca23da2f42b288fefe70f2073ef6a97986 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Sat, 10 Oct 2026 02:21:34 +0000 Subject: [PATCH 58/70] fix(qwen3-next): merge flat and per-size attention latency sections The decode and forward+backward latency sections are keyed by candidate directly, the prefill section by size first; merge them at any depth. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- scripts/qwen3_next_attention_prior_art.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/scripts/qwen3_next_attention_prior_art.py b/scripts/qwen3_next_attention_prior_art.py index c68219621..289f778bd 100644 --- a/scripts/qwen3_next_attention_prior_art.py +++ b/scripts/qwen3_next_attention_prior_art.py @@ -55,6 +55,17 @@ def _version(name: str) -> str | None: return None +def _merge_latency(base: dict, extra: dict) -> dict: + """Per-candidate latencies merged at any depth (prefill is keyed by size first).""" + merged = dict(base) + for key, value in extra.items(): + if isinstance(value, dict) and isinstance(base.get(key), dict): + merged[key] = _merge_latency(base[key], value) + else: + merged[key] = value + return merged + + def merge(base: dict, extra: dict) -> dict: """``base`` with ``extra``'s candidates and latencies added (same commit and GPU).""" for field in ("rl_kernel_commit", "tracked_tree_dirty", "shape", "op"): @@ -65,13 +76,7 @@ def merge(base: dict, extra: dict) -> dict: keys = {c["key"] for c in base["candidates"]} added = [c for c in extra["candidates"] if c["key"] not in keys] merged = dict(base, candidates=base["candidates"] + added) - merged["latency"] = { - section: { - size: {**values, **extra["latency"][section].get(size, {})} - for size, values in sizes.items() - } - for section, sizes in base["latency"].items() - } + merged["latency"] = _merge_latency(base["latency"], extra["latency"]) merged["environments"] = {"main": base["environment"], "extra": extra["environment"]} return merged From 414a53ed969ddf33ce71d65757889c9f93e20722 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Sat, 10 Oct 2026 10:16:21 +0000 Subject: [PATCH 59/70] docs(qwen3-next): attention prior art with FlashAttention-4, TE and Megatron-core measured (B200, 703c6dc) Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- .../qwen3-next-tp4-mixers-b200/README.md | 43 +++- .../attention/figure.png | Bin 204631 -> 273860 bytes .../attention/report.json | 210 +++++++++++++++--- 3 files changed, 217 insertions(+), 36 deletions(-) diff --git a/docs/usage/evidence/qwen3-next-tp4-mixers-b200/README.md b/docs/usage/evidence/qwen3-next-tp4-mixers-b200/README.md index 40d824d59..d7214c513 100644 --- a/docs/usage/evidence/qwen3-next-tp4-mixers-b200/README.md +++ b/docs/usage/evidence/qwen3-next-tp4-mixers-b200/README.md @@ -5,14 +5,14 @@ | `tp4-gdn/` | `9e6c4f2` | `torchrun --nproc-per-node 4 scripts/qwen3_next_tp_gdn_check.py --checkpoint --output tp4-gdn` | | `tp4-attention/` | `9e6c4f2` | `torchrun --nproc-per-node 4 scripts/qwen3_next_tp_attention_check.py --checkpoint --output tp4-attention` | | `tp4-moe/` | `9e6c4f2` | `TRITON_F32_DEFAULT=ieee torchrun --nproc-per-node 4 scripts/qwen3_next_tp_moe_check.py --checkpoint --output tp4-moe` | -| `attention/report.json`, `attention/figure.png` | `6517077` | `python scripts/qwen3_next_attention_prior_art.py --out attention/report.json`, then `scripts/plot_qwen3_next_attention_prior_art.py` | +| `attention/report.json`, `attention/figure.png` | `703c6dc` | two processes, then `scripts/plot_qwen3_next_attention_prior_art.py attention/report.json` (see below) | Every file records its commit and `tracked_tree_dirty: false`; each run used a clean clone with its own `rl_engine._C` built in place, on B200 GPUs (driver 580.126.20), torch 2.13.0+cu130, vLLM 0.30.0, NCCL 2.29.7. `` is the official `Qwen/Qwen3-Next-80B-A3B-Instruct` revision `9c7f2fbe84465e40164a94cc16cd30b6999b0cc7`: the GDN and MoE gates read layer 0, -the attention gate layer 3. `6517077` adds only the attention prior-art runner +the attention gate layer 3. `703c6dc` adds only the attention prior-art runner and plot on top of `9e6c4f2` (and the MoE evidence merge). In the job that ran the gates, the mixer GPU checks @@ -31,6 +31,41 @@ scale 1/16, causal. A 1000-token target sequence is computed alone and in a batch with sequences of 777, 1500 and 64 tokens (first and last); `prefill_decode_bitwise` compares the last 64 rows and the last row computed against the full KV with the same rows of the full prefill; -`backward_repeat_bitwise` repeats the target's backward after the companions' -backwards ran. Accuracy is against FP64; latencies are CUDA-event medians with +`backward_batch_bitwise` compares the target's dq/dk/dv computed alone with the +same sequence packed first and last among the companions (one launch where the +engine has a packed backward). Accuracy is against FP64; latencies are CUDA-event medians with the candidate order reversed every iteration. + +The report was produced in two processes of the same job and merged: + +```bash +python scripts/qwen3_next_attention_prior_art.py \ + --only rl_kernel_cuda,torch_sdpa,vllm_fa2_auto,vllm_fa2_split1,vllm_triton_2d,flashinfer,fa4_cute,te_training,megatron_local \ + --out report-main.json +python scripts/qwen3_next_attention_prior_art.py --only te_fused --merge report-main.json --out report.json +``` + +Both run in the training environment (vLLM 0.30.0, Megatron-core 0.16.0rc0, +Transformer Engine 2.16.1, cuDNN 9.20) with `CUDNN_HOME` pointing at the +`nvidia-cudnn-cu13` wheel. Notes on the engines added in this revision: + +- **FlashAttention-4** is the CuTe-DSL build vendored by vLLM + (`vllm.vllm_flash_attn.cute`), varlen forward and its default backward. Its + `deterministic=True` backward asserts for head dim 256 on SM100. +- **Transformer Engine**: with cuDNN 9.20 on SM100, TE offers its fused cuDNN + backend for head dim 256 only in inference mode; in training mode it selects + the unfused PyTorch fallback (`NVTE_DEBUG=1` shows the selection). Both are + measured. The unfused fallback raises a shape error when the query is shorter + than the KV (`padding_causal_bottom_right`, THD), recorded as + `prefill_decode_failed`. `NVTE_ALLOW_NONDETERMINISTIC_ALGO` only affects the + fused backward, which does not exist here, so it is not a separate row. +- The fused TE row runs in its own process because cudnn-frontend's runtime + loader refuses to start when both `libcudart.so.12` and `libcudart.so.13` + can be `dlopen`ed, and the compute nodes' system image provides a CUDA 12 + runtime next to the CUDA 13 one this stack uses. That process had a + non-loadable `libcudart.so.12` stub first on `LD_LIBRARY_PATH`; only + `libcudart.so.13` was loaded in either process. Its latencies come from that + process, not interleaved with the other candidates. +- **Megatron-core**'s own `DotProductAttention` (not the TE extension) has no + packed-sequence path, so it runs one launch per sequence with a bottom-right + causal mask; its batch invariance follows from that. diff --git a/docs/usage/evidence/qwen3-next-tp4-mixers-b200/attention/figure.png b/docs/usage/evidence/qwen3-next-tp4-mixers-b200/attention/figure.png index b6ce6874180e516e153c3885f6b12a9af5c788fa..cb0c65b02ab9a4be4fbcafeee66098b8d86c1eba 100644 GIT binary patch literal 273860 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∋k=?(C%%2*xQnm<7e4+`LW7IH)`qJ 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%0DqRw;u0LxMCUUABTe1T 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 J*m~gXe*hHEX?g$v literal 0 HcmV?d00001 diff --git a/tools/validation/models/plot_qwen3_next_batch_invariance.py b/tools/validation/models/plot_qwen3_next_batch_invariance.py new file mode 100644 index 000000000..21a128a9f --- /dev/null +++ b/tools/validation/models/plot_qwen3_next_batch_invariance.py @@ -0,0 +1,144 @@ +#!/usr/bin/env python +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2026 RL-Kernel Contributors + +"""Render a published Qwen3-Next batch-invariance matrix as a PNG. + +Needs only the published evidence directory and matplotlib: + + python tools/validation/models/plot_qwen3_next_batch_invariance.py \\ + docs/usage/evidence/qwen3-next-batch-invariance-b200 + +writes ``figure.png`` into that directory: one panel per cell family. A cell is +green when the target request's response tokens, logits, logprobs and every +layer digest are bitwise equal to its reference, red otherwise. +""" + +from __future__ import annotations + +import argparse +import json +import re +from pathlib import Path + +import matplotlib + +matplotlib.use("Agg") +import matplotlib.pyplot as plt # noqa: E402 +import numpy as np # noqa: E402 +from matplotlib.colors import ListedColormap # noqa: E402 + +INK = "#2b2b29" +MUTED = "#6f6e69" +SURFACE = "#fcfcfb" +NA = "#e4e3dd" +COLORS = ListedColormap([NA, "#d64545", "#1baf7a"]) # 0 absent, 1 differs, 2 bitwise equal + + +def _value(cell): + return 2 if cell["passed"] and all(cell["comparisons"].values()) else 1 + + +def _grid(axis, values, rows, cols, title, xlabel=None, ylabel=None): + axis.imshow(values, cmap=COLORS, vmin=0, vmax=2, aspect="auto") + axis.set_yticks(range(len(rows)), rows, fontsize=8, color=INK) + axis.set_xticks(range(len(cols)), cols, fontsize=8, color=INK, rotation=0) + axis.set_xticks(np.arange(-0.5, len(cols)), minor=True) + axis.set_yticks(np.arange(-0.5, len(rows)), minor=True) + axis.grid(which="minor", color=SURFACE, linewidth=2) + axis.tick_params(which="minor", length=0) + passed = int((values == 2).sum()) + total = int((values > 0).sum()) + axis.set_title(f"{title}: {passed}/{total} bitwise", fontsize=10, color=INK) + if xlabel: + axis.set_xlabel(xlabel, fontsize=9, color=MUTED) + if ylabel: + axis.set_ylabel(ylabel, fontsize=9, color=MUTED) + for spine in axis.spines.values(): + spine.set_visible(False) + + +def plot(evidence: Path, out: Path) -> None: + matrix = json.loads((evidence / "bi" / "bi_matrix.json").read_text()) + cells = matrix["cells"] + + conc = {} + for cid, cell in cells.items(): + m = re.fullmatch(r"concurrency-n(\d+)-(first|last)", cid) + if m: + conc[(int(m.group(1)), m.group(2))] = _value(cell) + ns = sorted({n for n, _ in conc}) + conc_grid = np.array([[conc.get((n, p), 0) for n in ns] for p in ("first", "last")]) + + chunk = {} + for cid, cell in cells.items(): + m = re.fullmatch(r"chunk-p(\d+)-c(\d+)-f(\d+)", cid) + if m: + chunk[(int(m.group(1)), int(m.group(2)), int(m.group(3)))] = _value(cell) + prompts = sorted({p for p, _, _ in chunk}) + plans = sorted({(c, f) for _, c, f in chunk}) + chunk_grid = np.array([[chunk.get((p, c, f), 0) for c, f in plans] for p in prompts]) + + def listed(prefix): + ids = [cid for cid in matrix["cell_ids"] if cid.startswith(prefix)] + return ids, np.array([[_value(cells[cid])] for cid in ids]) + + inter_ids, inter_grid = listed("interference-") + pack_ids, pack_grid = listed("packing-") + + fig = plt.figure(figsize=(16, 8.5), facecolor=SURFACE) + spec = fig.add_gridspec(2, 3, width_ratios=[1.5, 0.9, 0.9], height_ratios=[1, 2.6]) + _grid( + fig.add_subplot(spec[0, 0]), + conc_grid, + ["target first", "target last"], + [str(n) for n in ns], + "Concurrency (N requests, vs. the target alone)", + xlabel="N", + ) + _grid( + fig.add_subplot(spec[1, 0]), + chunk_grid, + [str(p) for p in prompts], + [f"c{c}\nfirst {f}" for c, f in plans], + "Chunk boundaries (vs. the replay engine)", + xlabel="chunk size / first chunk", + ylabel="prompt tokens", + ) + _grid( + fig.add_subplot(spec[:, 1]), + inter_grid, + [cid.removeprefix("interference-") for cid in inter_ids], + [""], + "Interference", + ) + _grid( + fig.add_subplot(spec[:, 2]), + pack_grid, + [cid.removeprefix("packing-") for cid in pack_ids], + [""], + "Packing", + ) + total = len(cells) + passed = sum(_value(cell) == 2 for cell in cells.values()) + fig.suptitle( + f"Qwen3-Next-80B-A3B batch invariance, TP4, suite {matrix.get('suite', '')}: " + f"{passed}/{total} cells bitwise (tokens, logits, logprobs, layer digests)", + fontsize=11, + color=INK, + ) + fig.tight_layout() + fig.savefig(out, dpi=160) + + +def main() -> None: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("evidence", type=Path) + args = parser.parse_args() + out = args.evidence / "figure.png" + plot(args.evidence, out) + print(f"wrote {out}") + + +if __name__ == "__main__": + main()

iYMZ6QSZ?BG)EN{k%5Pw!zsaA+rlZy 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 WG<}ZG@ML)=g9Z$9IBY+0$^QpgMy-1Q literal 204631 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 z%0A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 R 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 rzQ*dVK diff --git a/docs/usage/evidence/qwen3-next-tp4-mixers-b200/attention/report.json b/docs/usage/evidence/qwen3-next-tp4-mixers-b200/attention/report.json index 4a95898a2..3d55ea2aa 100644 --- a/docs/usage/evidence/qwen3-next-tp4-mixers-b200/attention/report.json +++ b/docs/usage/evidence/qwen3-next-tp4-mixers-b200/attention/report.json @@ -1,7 +1,7 @@ { "kind": "qwen3_next_prior_art_report", "rfc": 428, - "rl_kernel_commit": "65170777576cb957fb5557ef13bb46ce695a9f1a", + "rl_kernel_commit": "703c6dca23da2f42b288fefe70f2073ef6a97986", "tracked_tree_dirty": false, "environment": { "gpu": "NVIDIA B200", @@ -13,9 +13,10 @@ "transformers": "5.17.0", "triton": "3.7.1", "sglang": null, - "megatron-core": null, - "transformer_engine": null, - "vime": null + "megatron-core": "0.16.0rc0", + "megatron_core": "0.16.0rc0", + "transformer_engine": "2.16.1+c9877beb", + "vime": "0.3.2" } }, "op": "qwen3_next_tp4_attention", @@ -45,7 +46,7 @@ "last_1": true }, "repeatable": true, - "backward_repeat_bitwise": { + "backward_batch_bitwise": { "dq": true, "dk": true, "dv": true @@ -69,7 +70,7 @@ "last_1": false }, "repeatable": true, - "backward_repeat_bitwise": { + "backward_batch_bitwise": { "dq": false, "dk": true, "dv": true @@ -155,46 +156,191 @@ "max_abs_vs_fp64": 0.0066821561991154965 }, "batch_invariant": false + }, + { + "key": "fa4_cute", + "name": "FlashAttention-4 (CuTe DSL) varlen, vendored by vLLM", + "source": "vllm 0.30.0 vllm_flash_attn/cute (its head-dim-256 SM100 backward has no deterministic mode)", + "batch_bitwise": { + "first": true, + "last": true + }, + "prefill_decode_bitwise": { + "last_64": true, + "last_1": true + }, + "repeatable": true, + "backward_batch_bitwise": { + "dq": true, + "dk": true, + "dv": true + }, + "accuracy": { + "rel_l2_vs_fp64": 0.0020224522459116262, + "max_abs_vs_fp64": 0.0066821561991154965 + }, + "batch_invariant": true + }, + { + "key": "te_training", + "name": "Transformer Engine DotProductAttention (THD), training: unfused fallback", + "source": "transformer-engine 2.16.1+c9877beb (selected for head-dim-256 training on SM100)", + "batch_bitwise": { + "first": false, + "last": false + }, + "prefill_decode_failed": "RuntimeError: The size of tensor a (1000) must match the size of tensor b (64) at non-singleton dimension 3", + "prefill_decode_bitwise": { + "last_64": false, + "last_1": false + }, + "repeatable": true, + "backward_batch_bitwise": { + "dq": false, + "dk": false, + "dv": false + }, + "accuracy": { + "rel_l2_vs_fp64": 0.003577689514635195, + "max_abs_vs_fp64": 0.012889566535712937 + }, + "batch_invariant": false + }, + { + "key": "megatron_local", + "name": "Megatron-core DotProductAttention (local, one launch per sequence)", + "source": "megatron-core 0.16.0rc0", + "batch_bitwise": { + "first": true, + "last": true + }, + "prefill_decode_bitwise": { + "last_64": true, + "last_1": true + }, + "repeatable": true, + "backward_batch_bitwise": { + "dq": true, + "dk": true, + "dv": true + }, + "accuracy": { + "rel_l2_vs_fp64": 0.003577688032086663, + "max_abs_vs_fp64": 0.012889566535712937 + }, + "batch_invariant": true + }, + { + "key": "te_fused", + "name": "Transformer Engine DotProductAttention (THD), inference: cuDNN fused", + "source": "transformer-engine 2.16.1+c9877beb (no fused head-dim-256 backward on SM100)", + "batch_bitwise": { + "first": true, + "last": true + }, + "prefill_decode_bitwise": { + "last_64": true, + "last_1": true + }, + "repeatable": true, + "accuracy": { + "rel_l2_vs_fp64": 0.002051519013469327, + "max_abs_vs_fp64": 0.0066821561991154965 + }, + "batch_invariant": true } ], "latency": { "prefill_us": { "512": { - "rl_kernel_cuda": 721.9359874725342, - "torch_sdpa": 68.30399855971336, - "vllm_fa2_auto": 112.91199922561646, - "vllm_fa2_split1": 116.35199934244156, - "vllm_triton_2d": 250.46399980783463, - "flashinfer": 220.7840010523796 + "rl_kernel_cuda": 725.02401471138, + "torch_sdpa": 66.0800002515316, + "vllm_fa2_auto": 118.46399679780006, + "vllm_fa2_split1": 118.71999874711037, + "vllm_triton_2d": 263.88800144195557, + "flashinfer": 237.88800090551376, + "fa4_cute": 210.09600162506104, + "te_training": 2039.6959781646729, + "megatron_local": 324.5760053396225, + "te_fused": 336.70400083065033 }, "2048": { - "rl_kernel_cuda": 10143.984317779541, - "torch_sdpa": 112.11200058460236, - "vllm_fa2_auto": 151.32799744606018, - "vllm_fa2_split1": 151.32799744606018, - "vllm_triton_2d": 304.4160008430481, - "flashinfer": 277.18399465084076 + "rl_kernel_cuda": 10141.616344451904, + "torch_sdpa": 115.9840002655983, + "vllm_fa2_auto": 152.8479978442192, + "vllm_fa2_split1": 156.78400546312332, + "vllm_triton_2d": 324.6240019798279, + "flashinfer": 293.16800832748413, + "fa4_cute": 211.31199598312378, + "te_training": 5458.016157150269, + "megatron_local": 320.8480030298233, + "te_fused": 323.0559974908829 }, "8192": { - "rl_kernel_cuda": 159744.88067626953, - "torch_sdpa": 618.4000074863434, - "vllm_fa2_auto": 647.5839912891388, - "vllm_fa2_split1": 660.783976316452, - "vllm_triton_2d": 1129.1040182113647, - "flashinfer": 758.1599950790405 + "rl_kernel_cuda": 159770.19500732422, + "torch_sdpa": 607.344001531601, + "vllm_fa2_auto": 661.2959802150726, + "vllm_fa2_split1": 657.3439836502075, + "vllm_triton_2d": 1134.160041809082, + "flashinfer": 764.3359899520874, + "fa4_cute": 312.0640069246292, + "te_training": 22656.047821044922, + "megatron_local": 3245.0079917907715, + "te_fused": 612.496018409729 } }, "decode_us_kv8192": { - "rl_kernel_cuda": 769.6319818496704, - "torch_sdpa": 306.207999587059, - "vllm_fa2_auto": 154.52800691127777, - "vllm_fa2_split1": 332.96000957489014, - "vllm_triton_2d": 550.7360100746155, - "flashinfer": 225.21600127220154 + "rl_kernel_cuda": 757.8720152378082, + "torch_sdpa": 314.2559975385666, + "vllm_fa2_auto": 164.39999639987946, + "vllm_fa2_split1": 336.4799916744232, + "vllm_triton_2d": 564.3199980258942, + "flashinfer": 235.24799942970276, + "fa4_cute": 256.49599730968475, + "te_training": 4540.832042694092, + "megatron_local": 304.56000566482544, + "te_fused": 443.83999705314636 }, "forward_plus_backward_us_2048": { - "rl_kernel_cuda": 25106.52732849121, - "torch_sdpa": 785.3440046310425 + "rl_kernel_cuda": 25026.527404785156, + "torch_sdpa": 741.6639924049377, + "fa4_cute": 912.8959774971008, + "te_training": 10321.47216796875, + "megatron_local": 1336.4800214767456 + } + }, + "environments": { + "main": { + "gpu": "NVIDIA B200", + "torch": "2.13.0+cu130", + "cuda": "13.0", + "libraries": { + "vllm": "0.30.0", + "flashinfer-python": "0.6.18.post1", + "transformers": "5.17.0", + "triton": "3.7.1", + "sglang": null, + "megatron-core": "0.16.0rc0", + "megatron_core": "0.16.0rc0", + "transformer_engine": "2.16.1+c9877beb", + "vime": "0.3.2" + } + }, + "extra": { + "gpu": "NVIDIA B200", + "torch": "2.13.0+cu130", + "cuda": "13.0", + "libraries": { + "vllm": "0.30.0", + "flashinfer-python": "0.6.18.post1", + "transformers": "5.17.0", + "triton": "3.7.1", + "sglang": null, + "megatron-core": "0.16.0rc0", + "megatron_core": "0.16.0rc0", + "transformer_engine": "2.16.1+c9877beb", + "vime": "0.3.2" + } } } } From 1513b7140241afb8c88849ae70efd29b74113496 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Sat, 10 Oct 2026 20:00:16 +0000 Subject: [PATCH 60/70] style(tools): mark the Qwen3-Next TP gate imports after sys.path setup as E402-exempt The gate scripts insert the repo root into sys.path before importing rl_engine and tools, which flake8 reports as E402. Mark those imports with noqa, as the other tools/ scripts do. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- tools/validation/models/qwen3_next_tp_moe_check.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/tools/validation/models/qwen3_next_tp_moe_check.py b/tools/validation/models/qwen3_next_tp_moe_check.py index c9079b7df..775c9a84b 100644 --- a/tools/validation/models/qwen3_next_tp_moe_check.py +++ b/tools/validation/models/qwen3_next_tp_moe_check.py @@ -32,21 +32,23 @@ sys.path.insert(0, str(Path(__file__).resolve().parents[3])) -import torch -import torch.distributed as dist -from safetensors import safe_open +import torch # noqa: E402 +import torch.distributed as dist # noqa: E402 +from safetensors import safe_open # noqa: E402 -from rl_engine.models.qwen3_next.qwen3_next_forward import ( +from rl_engine.models.qwen3_next.qwen3_next_forward import ( # noqa: E402 FORWARD_PROVIDER_ID, shared_router, stable_top10_routes, ) -from rl_engine.models.qwen3_next.qwen3_next_tp_blocks import ( +from rl_engine.models.qwen3_next.qwen3_next_tp_blocks import ( # noqa: E402 TP4MoE, assemble_moe_weight, moe_hf_shapes, ) -from rl_engine.validation.common.tensor_identity import assert_tensor_bitwise_equal as exact +from rl_engine.validation.common.tensor_identity import ( # noqa: E402 + assert_tensor_bitwise_equal as exact, +) ROOT = Path(__file__).resolve().parents[3] TOKEN_COUNTS = (8, 64, 256, 1024) From 69d015a222fb981dc3941fa2da95ec6e0f71a54b Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Sat, 10 Oct 2026 20:00:17 +0000 Subject: [PATCH 61/70] style(tools): mark the Qwen3-Next TP gate imports after sys.path setup as E402-exempt The gate scripts insert the repo root into sys.path before importing rl_engine and tools, which flake8 reports as E402. Mark those imports with noqa, as the other tools/ scripts do. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- .../models/qwen3_next_tp_attention_check.py | 12 +++++++----- .../models/qwen3_next_tp_gdn_check.py | 18 +++++++++++------- .../models/qwen3_next_tp_moe_check.py | 17 +++++++++++------ 3 files changed, 29 insertions(+), 18 deletions(-) diff --git a/tools/validation/models/qwen3_next_tp_attention_check.py b/tools/validation/models/qwen3_next_tp_attention_check.py index 6a39585e2..a94487e35 100644 --- a/tools/validation/models/qwen3_next_tp_attention_check.py +++ b/tools/validation/models/qwen3_next_tp_attention_check.py @@ -20,16 +20,18 @@ sys.path.insert(0, str(Path(__file__).resolve().parents[3])) -import torch -import torch.distributed as dist +import torch # noqa: E402 +import torch.distributed as dist # noqa: E402 -from rl_engine.models.qwen3_next.qwen3_next_tp_blocks import ( +from rl_engine.models.qwen3_next.qwen3_next_tp_blocks import ( # noqa: E402 ATTENTION_HF_SHAPES, TP4FullAttention, assemble_attention_weights, ) -from rl_engine.validation.common.tensor_identity import assert_tensor_bitwise_equal as exact -from tools.validation.models.qwen3_next_gate_common import ( +from rl_engine.validation.common.tensor_identity import ( # noqa: E402 + assert_tensor_bitwise_equal as exact, +) +from tools.validation.models.qwen3_next_gate_common import ( # noqa: E402 CheckpointWeights, check_gradients, gather, diff --git a/tools/validation/models/qwen3_next_tp_gdn_check.py b/tools/validation/models/qwen3_next_tp_gdn_check.py index 79a1fb29c..65fee3815 100644 --- a/tools/validation/models/qwen3_next_tp_gdn_check.py +++ b/tools/validation/models/qwen3_next_tp_gdn_check.py @@ -20,18 +20,22 @@ sys.path.insert(0, str(Path(__file__).resolve().parents[3])) -import torch -import torch.distributed as dist -from safetensors import safe_open +import torch # noqa: E402 +import torch.distributed as dist # noqa: E402 +from safetensors import safe_open # noqa: E402 -from rl_engine.integrations.engines.train.vllm.qwen3_next_provider import GDNProviderConfig -from rl_engine.models.qwen3_next.qwen3_next_tp_gdn import ( +from rl_engine.integrations.engines.train.vllm.qwen3_next_provider import ( # noqa: E402 + GDNProviderConfig, +) +from rl_engine.models.qwen3_next.qwen3_next_tp_gdn import ( # noqa: E402 _GLOBAL_SHAPES, TP4GDN, assemble_gdn_weights, ) -from rl_engine.validation.common.tensor_identity import assert_tensor_bitwise_equal as exact -from tools.validation.models.qwen3_next_gate_common import check_gradients, run_gate +from rl_engine.validation.common.tensor_identity import ( # noqa: E402 + assert_tensor_bitwise_equal as exact, +) +from tools.validation.models.qwen3_next_gate_common import check_gradients, run_gate # noqa: E402 def load_first_gdn(checkpoint): diff --git a/tools/validation/models/qwen3_next_tp_moe_check.py b/tools/validation/models/qwen3_next_tp_moe_check.py index 80c88ec2f..c18b5b1fd 100644 --- a/tools/validation/models/qwen3_next_tp_moe_check.py +++ b/tools/validation/models/qwen3_next_tp_moe_check.py @@ -25,17 +25,22 @@ sys.path.insert(0, str(Path(__file__).resolve().parents[3])) -import torch -import torch.distributed as dist +import torch # noqa: E402 +import torch.distributed as dist # noqa: E402 -from rl_engine.models.qwen3_next.qwen3_next_forward import shared_router, stable_top10_routes -from rl_engine.models.qwen3_next.qwen3_next_tp_blocks import ( +from rl_engine.models.qwen3_next.qwen3_next_forward import ( # noqa: E402 + shared_router, + stable_top10_routes, +) +from rl_engine.models.qwen3_next.qwen3_next_tp_blocks import ( # noqa: E402 TP4MoE, assemble_moe_weight, moe_hf_shapes, ) -from rl_engine.validation.common.tensor_identity import assert_tensor_bitwise_equal as exact -from tools.validation.models.qwen3_next_gate_common import ( +from rl_engine.validation.common.tensor_identity import ( # noqa: E402 + assert_tensor_bitwise_equal as exact, +) +from tools.validation.models.qwen3_next_gate_common import ( # noqa: E402 CheckpointWeights, check_gradients, gather, From 37bc9532ad4a841f9083e97d8ec54e8e04967957 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Sun, 11 Oct 2026 00:34:36 +0000 Subject: [PATCH 62/70] fix(qwen3-next): type annotations for mypy in the MoE prior-art runner Annotate the latency samples and accept the default-argument lambdas used as timed calls. No behaviour change. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- rl_engine/validation/models/qwen3_next_moe_prior_art.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rl_engine/validation/models/qwen3_next_moe_prior_art.py b/rl_engine/validation/models/qwen3_next_moe_prior_art.py index c0582726f..7c0cc33c9 100644 --- a/rl_engine/validation/models/qwen3_next_moe_prior_art.py +++ b/rl_engine/validation/models/qwen3_next_moe_prior_art.py @@ -64,14 +64,14 @@ def _sample_us(fn: Callable[[], Any]) -> float: return start.elapsed_time(end) * 1000.0 -def time_interleaved(calls: dict[str, Callable[[], Any]], warmup: int = 5, iters: int = 30): +def time_interleaved(calls: dict[str, Callable[..., Any]], warmup: int = 5, iters: int = 30): """Median latency per candidate; the order alternates so none always runs first.""" keys = list(calls) orders = (keys, list(reversed(keys))) for i in range(warmup): for key in orders[i % 2]: calls[key]() - samples = {key: [] for key in keys} + samples: dict[str, list[float]] = {key: [] for key in keys} for i in range(iters): for key in orders[i % 2]: samples[key].append(_sample_us(calls[key])) From fac8f92e7b07b4f9829e789ac6635f92e3565250 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Sun, 11 Oct 2026 00:37:02 +0000 Subject: [PATCH 63/70] fix(qwen3-next): type annotations for mypy in the attention prior-art runner Annotate the latency samples and accept the default-argument lambdas used as timed calls. No behaviour change. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- rl_engine/validation/models/qwen3_next_attention_prior_art.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rl_engine/validation/models/qwen3_next_attention_prior_art.py b/rl_engine/validation/models/qwen3_next_attention_prior_art.py index 785040e46..db705b56f 100644 --- a/rl_engine/validation/models/qwen3_next_attention_prior_art.py +++ b/rl_engine/validation/models/qwen3_next_attention_prior_art.py @@ -56,13 +56,13 @@ def _sample_us(fn: Callable[[], Any]) -> float: return start.elapsed_time(end) * 1000.0 -def time_interleaved(calls: dict[str, Callable[[], Any]], warmup: int = 5, iters: int = 30): +def time_interleaved(calls: dict[str, Callable[..., Any]], warmup: int = 5, iters: int = 30): keys = list(calls) orders = (keys, list(reversed(keys))) for i in range(warmup): for key in orders[i % 2]: calls[key]() - samples = {key: [] for key in keys} + samples: dict[str, list[float]] = {key: [] for key in keys} for i in range(iters): for key in orders[i % 2]: samples[key].append(_sample_us(calls[key])) From 41d5bb01826b453f227083655574324ab326144b Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Sun, 11 Oct 2026 01:32:35 +0000 Subject: [PATCH 64/70] docs(qwen3-next): full-model chain evidence, preflight to train, 64/64 cells bitwise (B200, c67ec14) Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- .../evidence/qwen3-next-chain-b200/README.md | 41 + .../evidence/qwen3-next-chain-b200/SHA256SUMS | 44 + .../qwen3-next-chain-b200/chain-report.json | 8083 +++++++++++++++++ .../qwen3-next-chain-b200/l2/environment.json | 4511 +++++++++ .../qwen3-next-chain-b200/l2/l2_matrix.json | 1186 +++ .../qwen3-next-chain-b200/l2/operators.json | 304 + .../qwen3-next-chain-b200/l2/predecessor.json | 5 + .../l2/provider_binary.json | 13 + .../qwen3-next-chain-b200/l2/result.json | 775 ++ .../qwen3-next-chain-b200/l2/run.json | 5252 +++++++++++ .../layers/checkpoint.json | 14 + .../layers/environment.json | 4511 +++++++++ .../qwen3-next-chain-b200/layers/layers.json | 457 + .../layers/operators.json | 304 + .../layers/provider_binary.json | 13 + .../qwen3-next-chain-b200/layers/result.json | 775 ++ .../qwen3-next-chain-b200/layers/run.json | 5248 +++++++++++ .../qwen3-next-chain-b200/measured-commit.txt | 1 + .../preflight/checkpoint.json | 14 + .../preflight/device_guards.xml | 1 + .../preflight/environment.json | 40 + .../preflight/operators.json | 304 + .../preflight/result.json | 797 ++ .../preflight/rollout_smoke.json | 75 + .../qwen3-next-chain-b200/preflight/run.json | 5248 +++++++++++ .../qwen3-next-chain-b200/preflight/tp4.json | 49 + .../qwen3-next-chain-b200/redaction.json | 15 + .../train/environment.json | 4500 +++++++++ .../train/l2_matrix.json | 2236 +++++ .../train/operators.json | 304 + .../qwen3-next-chain-b200/train/reload.json | 2021 +++++ .../qwen3-next-chain-b200/train/result.json | 776 ++ .../qwen3-next-chain-b200/train/run.json | 5252 +++++++++++ .../qwen3-next-chain-b200/train/updates.json | 2021 +++++ .../train1/environment.json | 4500 +++++++++ .../train1/l2_matrix.json | 2236 +++++ .../train1/operators.json | 304 + .../qwen3-next-chain-b200/train1/result.json | 774 ++ .../qwen3-next-chain-b200/train1/run.json | 5252 +++++++++++ .../qwen3-next-chain-b200/train1/updates.json | 685 ++ .../train2/environment.json | 4500 +++++++++ .../train2/l2_matrix.json | 2236 +++++ .../train2/operators.json | 304 + .../qwen3-next-chain-b200/train2/result.json | 775 ++ .../qwen3-next-chain-b200/train2/run.json | 5252 +++++++++++ .../qwen3-next-chain-b200/train2/updates.json | 1695 ++++ 46 files changed, 83703 insertions(+) create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/README.md create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/SHA256SUMS create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/chain-report.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/l2/environment.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/l2/l2_matrix.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/l2/operators.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/l2/predecessor.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/l2/provider_binary.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/l2/result.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/l2/run.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/layers/checkpoint.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/layers/environment.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/layers/layers.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/layers/operators.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/layers/provider_binary.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/layers/result.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/layers/run.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/measured-commit.txt create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/preflight/checkpoint.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/preflight/device_guards.xml create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/preflight/environment.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/preflight/operators.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/preflight/result.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/preflight/rollout_smoke.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/preflight/run.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/preflight/tp4.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/redaction.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/train/environment.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/train/l2_matrix.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/train/operators.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/train/reload.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/train/result.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/train/run.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/train/updates.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/train1/environment.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/train1/l2_matrix.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/train1/operators.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/train1/result.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/train1/run.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/train1/updates.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/train2/environment.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/train2/l2_matrix.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/train2/operators.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/train2/result.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/train2/run.json create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/train2/updates.json diff --git a/docs/usage/evidence/qwen3-next-chain-b200/README.md b/docs/usage/evidence/qwen3-next-chain-b200/README.md new file mode 100644 index 000000000..177077593 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/README.md @@ -0,0 +1,41 @@ +# Qwen3-Next full-model chain (B200) + +Measured at commit `c67ec14` (`measured-commit.txt`) from clean clones, one +stage after another on nodes with four B200 GPUs, in one environment +(`environment_sha256` `118384371a88…` in every `run.json`), on the official +`Qwen/Qwen3-Next-80B-A3B-Instruct` revision +`9c7f2fbe84465e40164a94cc16cd30b6999b0cc7`. Each stage was launched with the +launcher of that commit, `python scripts/qwen3_next_run.py --stage +--previous --runs-root --checkpoint +--cuda-home --python /bin/python` (see +`docs/usage/qwen3-next-chain.md`), and the reports were made with: + +```bash +python scripts/qwen3_next_chain_report.py --last /<...-train-...> --out chain-report.json +bash ci/run_qwen3_next_chain_gate.sh chain-report.json +python scripts/qwen3_next_publish_evidence.py --last /<...-train-...> \ + --chain-report chain-report.json --out docs/usage/evidence/qwen3-next-chain-b200 +``` + +| Directory | Stage | Result | +| --- | --- | --- | +| `preflight/` | operator gates, device guards, TP4 NCCL probe, checkpoint, rollout smoke | passed | +| `layers/` | per-layer TP4 contracts on real weights | passed | +| `l2/` | vLLM rollout vs VIME recompute, 16 cases, raw bits | passed, 16/16 | +| `train1/`, `train2/` | one RL update each, L2 on the updated weights | passed, 16/16 each | +| `train/` | checkpoint reload, L2 on the reloaded weights, continuous and resumed controls | passed, 16/16; reload == update 2 | +| `chain-report.json` | chain-gate report (`qwen3-next-chain-v1`, compatible with `ws1-c10-c11-v5`) | passed, 64 cells, `first_drift: null` | + +The stages ran the code of `c67ec14`; the copy in this directory was made by +the publisher of `3025497`, which only adds redaction rules (`redaction.json` +counts the placeholders) and changes no measured byte. `SHA256SUMS` covers +every file except this README. + +`train` was preempted and restarted several times. The training journal lets a +restarted run continue from its last durable step, and one restarted run reused +the final reload of an interrupted run; the chain report rejected it +(`Tensor artifact escaped its current attempt`). Before the run published here, +the journal's reload, continuous and resumed entries were retired, so this run +repeated all three itself; `train/reload.json` lists the retirements under +`recovery` (`repeat_final_reload_and_controls_in_fresh_train_run`). Updates 1 +and 2 are the ones `train1/` and `train2/` recorded in the journal. diff --git a/docs/usage/evidence/qwen3-next-chain-b200/SHA256SUMS b/docs/usage/evidence/qwen3-next-chain-b200/SHA256SUMS new file mode 100644 index 000000000..15115a6d3 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/SHA256SUMS @@ -0,0 +1,44 @@ +7dc93415fddc7563d6765ab623d43a63c76dd367b62eaf36d42ea59cf9ca9134 chain-report.json +44cac38375a7598919a6d00d3bcc1651d8da5b04be767d53dc9aa1694f817879 l2/environment.json +b3fdae63b71cd3aba8ff7377f0ac9c952603ed96b782519fee3981c222f155c5 l2/l2_matrix.json +dedb24b6ac2a01d37eb795a001376ca0b200a03e417f8131688aac67c19c2ebd l2/operators.json +256c03b084be2a675d0fa5e3c1e0358ab886f5cb9a9efde6b7d800fdef872929 l2/predecessor.json +c0de3b51184ddbc5d70b5daa29338262a1a89566b61b59a2d92f156ede1dcbd4 l2/provider_binary.json +3b1b55c213eb4d603ff8219f47e1f7d857e603d3cde9dbd20e8e83ebb3f83e64 l2/result.json +1bf5b07ef6214059f86570e575ee411debf5ca77fc6582179d99d8ba536543e7 l2/run.json +7ceb9dab2ce8c0a2551a970819f9f0adbb538f04c4124982458a42f997d7c934 layers/checkpoint.json +c216d22c95381ae9b29b79d13f2d8526ac7d226e344647de88df6813baa705b0 layers/environment.json +3ba9e95e849d354493a0761ad9f2d6b4c607794157333ed8f7dbd2577e4132ff layers/layers.json +dedb24b6ac2a01d37eb795a001376ca0b200a03e417f8131688aac67c19c2ebd layers/operators.json +b893cad3217c16e2ae22005c8028b5f9d55abf3430eb74f3569d4149700dcb27 layers/provider_binary.json +9721e5ce53f8184212ec64e91a952fed7d6ae8ab8a56c3d43a9852b622ebe002 layers/result.json +1a28f2c1d94b6d0986747d8f307ea8dc0ac8726bc664e862d662f97d3b28453c layers/run.json +9612782ae5dfd1da2f3988d60f36ba405d898f94c3851945ecf94917a572c202 measured-commit.txt +7ceb9dab2ce8c0a2551a970819f9f0adbb538f04c4124982458a42f997d7c934 preflight/checkpoint.json +1fad0394e524c3bb702bc866f495f746fdaf3465ae3a033cf18aaffb00e03f81 preflight/device_guards.xml +e3784f094ccc050f0b9168d6fd251638cab7def8732fc03bbc53de9f97a0ec62 preflight/environment.json +dedb24b6ac2a01d37eb795a001376ca0b200a03e417f8131688aac67c19c2ebd preflight/operators.json +bffe360300b86f54755fc18f9fcc8363c9a6368f5d0e8e78cd483867e35e8979 preflight/result.json +b27fdae3f96fc89c5246657c17f53cb2941c2f07214d2e3ec4aef317b8b4b927 preflight/rollout_smoke.json +e21d45657ad2a47bd7a5c0329e978cdef66bde6d730b5629d881bfa05d9fac9a preflight/run.json +94b8471a1b6c0c75c0af44a25f62b50d633bce4429a8f5de40cc7ab3ef721a9e preflight/tp4.json +2090609649a0cfca82e3cc823adfa97ab9f5d32f7aa11aabb0f5ce44c6a5098f redaction.json +80bc8407bbd00e1852df9c73346ee658efd645051fe3cfd7e97cbe5203382df7 train/environment.json +018ae2be601ebfce5bf5d43b952f23cd50d0987e3e8af1918ea173cf310a4bf9 train/l2_matrix.json +dedb24b6ac2a01d37eb795a001376ca0b200a03e417f8131688aac67c19c2ebd train/operators.json +91efc770eba238c07def9faac2f5138c3847e31fc14b781691b6243abf046678 train/reload.json +05a7c339793dd344734bdc7c2708ec87bbd71825eab2e2f7b745a89e8d241030 train/result.json +c0cf601dd79146b44256bfca0c00a96162f4b49a7d10aac67c92ede0fd47bdc8 train/run.json +91efc770eba238c07def9faac2f5138c3847e31fc14b781691b6243abf046678 train/updates.json +28cfd5043ba88280ccb85fd642920b995ef2888bc52d401a2431cb1e17131131 train1/environment.json +18ef0e29d8a3adc87e0482162c1ecfe33b58ac8a985b76505d91017b42d7b772 train1/l2_matrix.json +dedb24b6ac2a01d37eb795a001376ca0b200a03e417f8131688aac67c19c2ebd train1/operators.json +5fd653158cad11fcfb9b5424743e86c630aa32d7bc9d606bcf6888fa4e5710bd train1/result.json +44392b740187a454ccd99d89789b6708c73d1beaa59557d358a15f9edcd3e180 train1/run.json +369290bd5aa16cf358a5f22222140a961e6d8317934331ea9707e336f8307c44 train1/updates.json +b710aec83c12a1b6f5e889a78e378dc1331b436f55db37d794f0513599e3aea6 train2/environment.json +8e655ccd1b7d8e35d562c7386a53bd6bb80a7bd62fb8b19ad37308e53211d0fd train2/l2_matrix.json +dedb24b6ac2a01d37eb795a001376ca0b200a03e417f8131688aac67c19c2ebd train2/operators.json +4823c3ac8f2433cb6669914ba7ba775e693113480a623ee7a94f80c3c2deb82f train2/result.json +63b0930ae74cd467b200dc5acc17e62fe7e629bea0b035a7bb6377ef025cbdb9 train2/run.json +fb58d7c38d85e96e6d94fce46c24b2b5a8afcfe25b8399eb5f281d826c9ad4ae train2/updates.json diff --git a/docs/usage/evidence/qwen3-next-chain-b200/chain-report.json b/docs/usage/evidence/qwen3-next-chain-b200/chain-report.json new file mode 100644 index 000000000..729ecd2ac --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/chain-report.json @@ -0,0 +1,8083 @@ +{ + "accuracy": [], + "accuracy_aggregates": [], + "accuracy_executed": false, + "aggregates": { + "aggregates": { + "active_token_count": 2560, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + "all_parameter_gradients": false, + "backend_profile": "qwen3_next_tp4_shared_eager_v1", + "backend_provenance": { + "accumulation_dtype": "fp32", + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "backend_profile": "qwen3_next_tp4_shared_eager_v1", + "candidate_tf32_enabled": false, + "execution_dtype": "bf16", + "output_dtype": "bf16", + "reference_dtype": "bf16", + "reference_tf32_enabled": false, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "backward_executed": true, + "backward_runtime_observations": {}, + "c8_evidence_path": "", + "c8_source_commit": null, + "cells": { + "baseline/p0008-b1-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "baseline/p0008-b1-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "5dcefedce9eec0602f525293ce812f806a37b1c41bd1dcd1870d9b93c81645b8", + "layer0": "f48903cec22fc97f965f326686975101312ee8e0bc33944f35e1ec80f524bb34", + "layer1": "1472ee2f34ebbe1ac687bba49cbfda89e40cc57c0d2ff1266e4b9c91f012fc46", + "layer10": "f4b74c35b097be6e7b93fbd1b6ff7b2a010b4e0af7e677ab6c6e4d977a8bd5e7", + "layer11": "035b5e56d1cf3eb9519856c0def55a293cc89d4992635ce2020097bde5e24b59", + "layer12": "f53f4d58b165913772497d8314c56d5abff372518802df27ecd3105f02c8cd73", + "layer13": "f3776349e9079b850a975d0cf5810b873f967dc727f5e37106ad3a8195c3dacb", + "layer14": "78fef2e3e056c5ec1df8d712bd3be0782a37c01534826e53d9c20e16dfa699fc", + "layer15": "4651447f27ba16396a09af2934ab04ddebcc07ce22602687be8e5cb3a81bae1c", + "layer16": "b71919ea0f452e6e96628708e9710f4ebc85a1996b2ee8c2f8782a9d45e8053e", + "layer17": "990a1a30d074970cd4150bcdeb4c94c9b0ad22e407964a8bce72f4ac497107d0", + "layer18": "fb0cf1b0484cfb619cd92172112392f8a979d1a8346be48910276cf90ef2c9bb", + "layer19": "7ebb43f5641931ffda4d7ef4d1ceff5337f33f303cfadb347290bddfeaef816c", + "layer2": "ebb0fd7eba8481b6c66e9cd49c0acc7b8d9225fb0665386a679fb8e5027e268d", + "layer20": "0e683c98f23546a0b08cc0e5a892a1402329e4f476c2bd50d1fbbe7789e918c9", + "layer21": "755f6ce27dac3fc5569dbdb6a46bcbfc2a41b34ef0bb474a1172f7c2e141979c", + "layer22": "89d6e9d48ef75a85a1c61631c214449fe2f7953e371b74a4262eda4b9fce6728", + "layer23": "f8a49146a657d3dae60ace3bcf5936a53e6a0ea84f5079d12b71bd6f9bbd11e9", + "layer24": "9a3d005412924ea64649461e4c9144abb3c1ff03ee405eda47c5396195b8b5e9", + "layer25": "587db8fe58631b0dc17425e227cf271a22c0b72455e160544d2827d65545a49c", + "layer26": "fb9c49bafda77cc14f43994331901b3bd13a6f74b6749ef2c9dab57ef4e70652", + "layer27": "254cb9ef96a7c2353313f8860ea82e503b6729bdb23f5f30594fa843843e225d", + "layer28": "7c24980ce971422ade4407f081fd40c72abf38e42405c58756fe812f9e36777e", + "layer29": "5742c82893b178b8810be6042ee3a0a7c4922922f9a77c2d99b3f8d147614c92", + "layer3": "3a0da370f7e4bc255dad7f022621acd77564908f52c9f036f24f99d90fb126ed", + "layer30": "bea5516a9cdc987fe3fa4e065f93ec6d8edeaa7b7d9c043fff308a8c44b355c4", + "layer31": "3d8477f0866822edcdd7c14a75e212dfd51dfe5d5820fccc22876c9dd5258e0a", + "layer32": "4895c073f408812ba90b12aa9c6acfb4efd3d86f4cd9644b190ea39d41517237", + "layer33": "fdbf1bd71f1fe2bd0afd1f66269713be0337be8ee3309a193c803da08032910c", + "layer34": "e45d25f43b44b2dc4de64d20d1e18a3f739ae9990896fe8911c3c4ef3853b1f6", + "layer35": "f8a0d2b2af8d829bdbda260fef93790e5d03c5ed3234e2e61481f0c6e5f3c100", + "layer36": "e9f403bc583f32669285d6dc70b150138a58d40bff2a9127a52478b9467c9a2c", + "layer37": "8db5c27e1c596ea559eabee54351305d1b22afa3cc6c30fb51fcc9ab06d22060", + "layer38": "54cf5317fdf58c6003a8dd5dc0f65ed085a53bbdcbef60ec801851faabd0c73c", + "layer39": "fcdb6aab646e9e364244fb5b726308360e728ee3f68ef150af0367e051ff202b", + "layer4": "20f5a2d7373da9a8035677e81dc160b6ae8161b098a29d734744e055099aa1fa", + "layer40": "3c5c9673e348b7157764e0ef50241f732aff1721fb093f260667ce327714782b", + "layer41": "652dd9ad74c5d27a7436024c339d16ad8cf17c5af6fd0cc0c1801d78aeeba48b", + "layer42": "81a607c404264b7b20a49338e76c007d9ba6523b813e7d288ccf080f2c70ea1a", + "layer43": "8d2f6a995940e926d8b3247ba1154b59979f8f423d4ea96fb61683b38a5a4f2b", + "layer44": "8fe08b0c6ddf3c36cb0f77c8c4b01ae2c98c4b7bdd1eb79f70c65fd8d38d85cd", + "layer45": "a1839dd6bd8a54f67e98ede7d2d49bac88f655b8cb6ff5754996e1b4d240132c", + "layer46": "a354818401baed90019a940560355a02feb22d93b51bb65dd5049117ffc73e30", + "layer47": "5b27d3d758a1520a0fec1f60e8efd4647791f51f6e22401c7d15ecce79847c84", + "layer5": "9b03a638a8da24cd588294c5586b41160d1e51e8d3f644d22ab0dde2a26a7405", + "layer6": "05e36af84deed9814952b8be6b27cc64a853cbec2731758e4c0eb98facce7c4e", + "layer7": "bfaa96f913e7cd39b1b8f135918e32acfe22a905d2d68c522162de9de42ed223", + "layer8": "57d852129e14e29c89a1780e08fc7ec183222a0b52ed2be0a2c17bd0661f265f", + "layer9": "74e68131689abf3417308cf8b21239c8e6a8e4ac88510711712f72f4c48d18f1" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "baseline/p0008-b1-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "baseline/p0008-b1-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "5dcefedce9eec0602f525293ce812f806a37b1c41bd1dcd1870d9b93c81645b8", + "layer0": "f48903cec22fc97f965f326686975101312ee8e0bc33944f35e1ec80f524bb34", + "layer1": "1472ee2f34ebbe1ac687bba49cbfda89e40cc57c0d2ff1266e4b9c91f012fc46", + "layer10": "f4b74c35b097be6e7b93fbd1b6ff7b2a010b4e0af7e677ab6c6e4d977a8bd5e7", + "layer11": "035b5e56d1cf3eb9519856c0def55a293cc89d4992635ce2020097bde5e24b59", + "layer12": "f53f4d58b165913772497d8314c56d5abff372518802df27ecd3105f02c8cd73", + "layer13": "f3776349e9079b850a975d0cf5810b873f967dc727f5e37106ad3a8195c3dacb", + "layer14": "78fef2e3e056c5ec1df8d712bd3be0782a37c01534826e53d9c20e16dfa699fc", + "layer15": "4651447f27ba16396a09af2934ab04ddebcc07ce22602687be8e5cb3a81bae1c", + "layer16": "b71919ea0f452e6e96628708e9710f4ebc85a1996b2ee8c2f8782a9d45e8053e", + "layer17": "990a1a30d074970cd4150bcdeb4c94c9b0ad22e407964a8bce72f4ac497107d0", + "layer18": "fb0cf1b0484cfb619cd92172112392f8a979d1a8346be48910276cf90ef2c9bb", + "layer19": "7ebb43f5641931ffda4d7ef4d1ceff5337f33f303cfadb347290bddfeaef816c", + "layer2": "ebb0fd7eba8481b6c66e9cd49c0acc7b8d9225fb0665386a679fb8e5027e268d", + "layer20": "0e683c98f23546a0b08cc0e5a892a1402329e4f476c2bd50d1fbbe7789e918c9", + "layer21": "755f6ce27dac3fc5569dbdb6a46bcbfc2a41b34ef0bb474a1172f7c2e141979c", + "layer22": "89d6e9d48ef75a85a1c61631c214449fe2f7953e371b74a4262eda4b9fce6728", + "layer23": "f8a49146a657d3dae60ace3bcf5936a53e6a0ea84f5079d12b71bd6f9bbd11e9", + "layer24": "9a3d005412924ea64649461e4c9144abb3c1ff03ee405eda47c5396195b8b5e9", + "layer25": "587db8fe58631b0dc17425e227cf271a22c0b72455e160544d2827d65545a49c", + "layer26": "fb9c49bafda77cc14f43994331901b3bd13a6f74b6749ef2c9dab57ef4e70652", + "layer27": "254cb9ef96a7c2353313f8860ea82e503b6729bdb23f5f30594fa843843e225d", + "layer28": "7c24980ce971422ade4407f081fd40c72abf38e42405c58756fe812f9e36777e", + "layer29": "5742c82893b178b8810be6042ee3a0a7c4922922f9a77c2d99b3f8d147614c92", + "layer3": "3a0da370f7e4bc255dad7f022621acd77564908f52c9f036f24f99d90fb126ed", + "layer30": "bea5516a9cdc987fe3fa4e065f93ec6d8edeaa7b7d9c043fff308a8c44b355c4", + "layer31": "3d8477f0866822edcdd7c14a75e212dfd51dfe5d5820fccc22876c9dd5258e0a", + "layer32": "4895c073f408812ba90b12aa9c6acfb4efd3d86f4cd9644b190ea39d41517237", + "layer33": "fdbf1bd71f1fe2bd0afd1f66269713be0337be8ee3309a193c803da08032910c", + "layer34": "e45d25f43b44b2dc4de64d20d1e18a3f739ae9990896fe8911c3c4ef3853b1f6", + "layer35": "f8a0d2b2af8d829bdbda260fef93790e5d03c5ed3234e2e61481f0c6e5f3c100", + "layer36": "e9f403bc583f32669285d6dc70b150138a58d40bff2a9127a52478b9467c9a2c", + "layer37": "8db5c27e1c596ea559eabee54351305d1b22afa3cc6c30fb51fcc9ab06d22060", + "layer38": "54cf5317fdf58c6003a8dd5dc0f65ed085a53bbdcbef60ec801851faabd0c73c", + "layer39": "fcdb6aab646e9e364244fb5b726308360e728ee3f68ef150af0367e051ff202b", + "layer4": "20f5a2d7373da9a8035677e81dc160b6ae8161b098a29d734744e055099aa1fa", + "layer40": "3c5c9673e348b7157764e0ef50241f732aff1721fb093f260667ce327714782b", + "layer41": "652dd9ad74c5d27a7436024c339d16ad8cf17c5af6fd0cc0c1801d78aeeba48b", + "layer42": "81a607c404264b7b20a49338e76c007d9ba6523b813e7d288ccf080f2c70ea1a", + "layer43": "8d2f6a995940e926d8b3247ba1154b59979f8f423d4ea96fb61683b38a5a4f2b", + "layer44": "8fe08b0c6ddf3c36cb0f77c8c4b01ae2c98c4b7bdd1eb79f70c65fd8d38d85cd", + "layer45": "a1839dd6bd8a54f67e98ede7d2d49bac88f655b8cb6ff5754996e1b4d240132c", + "layer46": "a354818401baed90019a940560355a02feb22d93b51bb65dd5049117ffc73e30", + "layer47": "5b27d3d758a1520a0fec1f60e8efd4647791f51f6e22401c7d15ecce79847c84", + "layer5": "9b03a638a8da24cd588294c5586b41160d1e51e8d3f644d22ab0dde2a26a7405", + "layer6": "05e36af84deed9814952b8be6b27cc64a853cbec2731758e4c0eb98facce7c4e", + "layer7": "bfaa96f913e7cd39b1b8f135918e32acfe22a905d2d68c522162de9de42ed223", + "layer8": "57d852129e14e29c89a1780e08fc7ec183222a0b52ed2be0a2c17bd0661f265f", + "layer9": "74e68131689abf3417308cf8b21239c8e6a8e4ac88510711712f72f4c48d18f1" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "baseline/p0008-b4-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "baseline/p0008-b4-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "9330cfbfea9b0ecd067000ade8d63d21740ee1bed61d9969de450f0888d9e4d6", + "layer0": "007cb395b58999377bda435f91affc27d3fe4cc2f8ee12e86e1075521c679b79", + "layer1": "92a7a5c07e70612ecc72efddf05dd6abc7c94c6a8b67eb82eba74be96b3893fd", + "layer10": "62c91e079e06a85c82309d2078d06920768594e1648627869eba14f2845216eb", + "layer11": "de248056a90c7b9d51568a48aa66b4349811c32e250ce376a3c5ba59ff1a9c6a", + "layer12": "38a8faf33e5bb83cff57483c1373a8b12919d5cb09b1b992f674f112f633359d", + "layer13": "cf63c5012f9493601967333e29d419288ceb2cd203615cc00619b6ec1619c643", + "layer14": "2cefaa1894918ba22f1cb2461d965ba0bd2edf2ada260186b695d975cfaad9d9", + "layer15": "5920cfbdf854d1b71f0697dbf4e3400b30d85dd5e4be818cfcb00cd4ceeabc90", + "layer16": "b8223029ce655f20f9cf77bfa32be0b7de7bcc9165c6fb75e7b493b1c546c6ff", + "layer17": "e2b257c2d0678100ccd476b56b444c2b86d657f3ae46d9cac6933cfc09eb22ef", + "layer18": "76fe643e8b07f67fa933fd8497651364e9e5b4083c75ae084e3252c85bb81aee", + "layer19": "7cd3f567cba1a103a1f33d7fb055cd4f4a230217fc3b0ce2be468f748920f4eb", + "layer2": "85ea056f9a0087ab172a83e6c8361569e35fc14f846fa0e701efeb6781c66094", + "layer20": "d17a212462aa9675f1e828332318f08c1c5486ca07ce5e9e4d9519b705b0d4f5", + "layer21": "b24e5ee55dc7a92ab5a2d4189a4c1a3294ec5987a11597cd8bc69f1c1962d84d", + "layer22": "7c6e0bdcd92a6ae019e7c980a4a72e2ddd02b31c1e2569734da8367defa12625", + "layer23": "eaf764b807fd281c88a9661c6a108670030deff0ac84b6907664bb5bc92923a6", + "layer24": "ae6454c38b7a156186aae9e6485342a81e9215ba2f037106f610456547185282", + "layer25": "d0a03bfe6249b6ce4ce9a44033ad0885f0cb7db256e74a2a985c855fa91f876a", + "layer26": "13ad8bc8a8da22c34cc796ae7183ab1c1414a95c454391f3aae72eecd51ac4b9", + "layer27": "ee28f0af95f077bef4b8592e18b860962e33efe89af526e91b2f94a7a31f1706", + "layer28": "f9c9b57d798317f438cb1c3bfa61cb5878d0c70263df90adc030468fca74f0c5", + "layer29": "f3428557e60c420c4827c922941201d42c3e359ca2da59fd41a1a32b19aec28f", + "layer3": "933994054ee0e56a06ee10a101216292f009b8986924a5df8322651faaeb9d42", + "layer30": "2b0dbe4b4b9cc17517a95ffc8b14f5f8458b0d7ffc763f5fe117e2a73d6d772f", + "layer31": "ceb0a9c2b41f8329e9055f012e0c9d70d2e7d1d8eeed63a828cdd7a237b4b20d", + "layer32": "01e4aa607492a860698bd04e185b68d59979054203514ad8132215073ea3501a", + "layer33": "cc246fa6f13f5401f45e5dd2f4896262ce77bb9f271bf90386e86d4b5f5c95dc", + "layer34": "050ccb132e36197da641b69a9d55f9437de9238550c3e58697fac1cbed082071", + "layer35": "0ed33735035b81291030fec2bef407696a0a1980d836c58087002b6d960ad5a8", + "layer36": "bcf4358fd097fa12a6cf2194b054a8475ac2dadd93e4975374710690f3cbef45", + "layer37": "774e5c17d476709bccabcf64640253a42139bfc368268c25279f338364ce097a", + "layer38": "a6788d214f1788020ac6459fb10b464da702db2998e70cf1e7817e9be64f5d1e", + "layer39": "e35899c72c8c8f0e0c24580012c53dc0230790d9545170c9883a148851895010", + "layer4": "cce7f158e01f763bda4559642730eb1b76213baab1542629a58cfd80ea6e7337", + "layer40": "d046881d0b7ab44d351f6b924186e31a1dcd0750b0a04b5e90dc4072e4ced7d1", + "layer41": "bbad96f4574a82893a198534632f36533f8ab89d9adbe9f625246a498504eb6b", + "layer42": "428df67a8db79cf37f2bc866f838a48765a8a30153cf632d76455435316a15a8", + "layer43": "02b06d2b1564c1710d11fff2e4274539549d27a36442ebf13bebb677087371a2", + "layer44": "2ae6de9870c02048a4cebb2b1d97879cd16e4731947400cd8c2bc04b93779fe4", + "layer45": "de347e930f2a81297bc877415b7e0d58e90cab89515ae32080b4f60847eb1f22", + "layer46": "acb8853fcebe0e0dd1daf49ce9ab8ab4638662e6c6c570813f4da061a27701f8", + "layer47": "a42d2595a8c1966c24e4ec9ffb1ec8568fe0af400026070b81efb0ff98c0f1e0", + "layer5": "a0f56a4df1ddb26eb363b2374afdea4d433b15dc26007dfc8f56c6771fb340e3", + "layer6": "63378d169197c9c099390007cc2a6bc773e240fbff028145a63aa07da7eb4a2f", + "layer7": "c7747dd4c86a30a49292c64a39886e515d281b926e714d1c0f785a6777fd7505", + "layer8": "326b71590c3ce49716ce6fa69bf12043e0a61c10fbf8d4666e6809b2bd6289b3", + "layer9": "df022442ff4b6f0faffa5c467af433f13370cdd3fec86d8aab677285750506c8" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "baseline/p0008-b4-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "baseline/p0008-b4-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "9330cfbfea9b0ecd067000ade8d63d21740ee1bed61d9969de450f0888d9e4d6", + "layer0": "007cb395b58999377bda435f91affc27d3fe4cc2f8ee12e86e1075521c679b79", + "layer1": "92a7a5c07e70612ecc72efddf05dd6abc7c94c6a8b67eb82eba74be96b3893fd", + "layer10": "62c91e079e06a85c82309d2078d06920768594e1648627869eba14f2845216eb", + "layer11": "de248056a90c7b9d51568a48aa66b4349811c32e250ce376a3c5ba59ff1a9c6a", + "layer12": "38a8faf33e5bb83cff57483c1373a8b12919d5cb09b1b992f674f112f633359d", + "layer13": "cf63c5012f9493601967333e29d419288ceb2cd203615cc00619b6ec1619c643", + "layer14": "2cefaa1894918ba22f1cb2461d965ba0bd2edf2ada260186b695d975cfaad9d9", + "layer15": "5920cfbdf854d1b71f0697dbf4e3400b30d85dd5e4be818cfcb00cd4ceeabc90", + "layer16": "b8223029ce655f20f9cf77bfa32be0b7de7bcc9165c6fb75e7b493b1c546c6ff", + "layer17": "e2b257c2d0678100ccd476b56b444c2b86d657f3ae46d9cac6933cfc09eb22ef", + "layer18": "76fe643e8b07f67fa933fd8497651364e9e5b4083c75ae084e3252c85bb81aee", + "layer19": "7cd3f567cba1a103a1f33d7fb055cd4f4a230217fc3b0ce2be468f748920f4eb", + "layer2": "85ea056f9a0087ab172a83e6c8361569e35fc14f846fa0e701efeb6781c66094", + "layer20": "d17a212462aa9675f1e828332318f08c1c5486ca07ce5e9e4d9519b705b0d4f5", + "layer21": "b24e5ee55dc7a92ab5a2d4189a4c1a3294ec5987a11597cd8bc69f1c1962d84d", + "layer22": "7c6e0bdcd92a6ae019e7c980a4a72e2ddd02b31c1e2569734da8367defa12625", + "layer23": "eaf764b807fd281c88a9661c6a108670030deff0ac84b6907664bb5bc92923a6", + "layer24": "ae6454c38b7a156186aae9e6485342a81e9215ba2f037106f610456547185282", + "layer25": "d0a03bfe6249b6ce4ce9a44033ad0885f0cb7db256e74a2a985c855fa91f876a", + "layer26": "13ad8bc8a8da22c34cc796ae7183ab1c1414a95c454391f3aae72eecd51ac4b9", + "layer27": "ee28f0af95f077bef4b8592e18b860962e33efe89af526e91b2f94a7a31f1706", + "layer28": "f9c9b57d798317f438cb1c3bfa61cb5878d0c70263df90adc030468fca74f0c5", + "layer29": "f3428557e60c420c4827c922941201d42c3e359ca2da59fd41a1a32b19aec28f", + "layer3": "933994054ee0e56a06ee10a101216292f009b8986924a5df8322651faaeb9d42", + "layer30": "2b0dbe4b4b9cc17517a95ffc8b14f5f8458b0d7ffc763f5fe117e2a73d6d772f", + "layer31": "ceb0a9c2b41f8329e9055f012e0c9d70d2e7d1d8eeed63a828cdd7a237b4b20d", + "layer32": "01e4aa607492a860698bd04e185b68d59979054203514ad8132215073ea3501a", + "layer33": "cc246fa6f13f5401f45e5dd2f4896262ce77bb9f271bf90386e86d4b5f5c95dc", + "layer34": "050ccb132e36197da641b69a9d55f9437de9238550c3e58697fac1cbed082071", + "layer35": "0ed33735035b81291030fec2bef407696a0a1980d836c58087002b6d960ad5a8", + "layer36": "bcf4358fd097fa12a6cf2194b054a8475ac2dadd93e4975374710690f3cbef45", + "layer37": "774e5c17d476709bccabcf64640253a42139bfc368268c25279f338364ce097a", + "layer38": "a6788d214f1788020ac6459fb10b464da702db2998e70cf1e7817e9be64f5d1e", + "layer39": "e35899c72c8c8f0e0c24580012c53dc0230790d9545170c9883a148851895010", + "layer4": "cce7f158e01f763bda4559642730eb1b76213baab1542629a58cfd80ea6e7337", + "layer40": "d046881d0b7ab44d351f6b924186e31a1dcd0750b0a04b5e90dc4072e4ced7d1", + "layer41": "bbad96f4574a82893a198534632f36533f8ab89d9adbe9f625246a498504eb6b", + "layer42": "428df67a8db79cf37f2bc866f838a48765a8a30153cf632d76455435316a15a8", + "layer43": "02b06d2b1564c1710d11fff2e4274539549d27a36442ebf13bebb677087371a2", + "layer44": "2ae6de9870c02048a4cebb2b1d97879cd16e4731947400cd8c2bc04b93779fe4", + "layer45": "de347e930f2a81297bc877415b7e0d58e90cab89515ae32080b4f60847eb1f22", + "layer46": "acb8853fcebe0e0dd1daf49ce9ab8ab4638662e6c6c570813f4da061a27701f8", + "layer47": "a42d2595a8c1966c24e4ec9ffb1ec8568fe0af400026070b81efb0ff98c0f1e0", + "layer5": "a0f56a4df1ddb26eb363b2374afdea4d433b15dc26007dfc8f56c6771fb340e3", + "layer6": "63378d169197c9c099390007cc2a6bc773e240fbff028145a63aa07da7eb4a2f", + "layer7": "c7747dd4c86a30a49292c64a39886e515d281b926e714d1c0f785a6777fd7505", + "layer8": "326b71590c3ce49716ce6fa69bf12043e0a61c10fbf8d4666e6809b2bd6289b3", + "layer9": "df022442ff4b6f0faffa5c467af433f13370cdd3fec86d8aab677285750506c8" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "baseline/p0064-b1-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "baseline/p0064-b1-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "2103a7ecdb753bab5aa53770623a6edee88dd41c69c99a6d332273343636bc26", + "layer0": "e9684275c85eca0fa7f77e6ca497c659c55506974235bb1e83ee8f1676a0b98e", + "layer1": "497450f1cd49b0663ffb88553935c68320009dc6a76651c377184ce26547e3a2", + "layer10": "dbfa621f00ac6bb40be236999508d4345b57022d633207f7e2a2885511f13c7f", + "layer11": "83ef553ecadab44d289fd7871fcbb96e05986eca3ebc1cc75c5754bcee0fea27", + "layer12": "03dc6b89ddf27ddfa682d9d60990149efe2904839a619ae63b2d476da077f61a", + "layer13": "0bbfa1680231027d8babab601c8961e070a7116d29ddbcd482ca4c8be1fcb040", + "layer14": "dc2d6b92c6c9e7bc49d858b5bcb631a81b516b6204fa5a315dafd48151404d18", + "layer15": "0d76fc8cb336b185b9fa46420935a3cd21cb18f42af90cd59f5c986269f650d5", + "layer16": "e6b2de2d6f4b59461f3a0c9c2df8f6f0ab22459d94a877cdb73bf1c6f37f56ae", + "layer17": "db96458aa486d7a78dd31939c4471ba734dd4e7cbe64e9ddf9429091072fdee8", + "layer18": "b5b85c15ef27c983bc1a0de67b58d3238c8587cb41782bc31ddab58ee77e7482", + "layer19": "9539f7201598071d3858b640ed9fb83248ee17b5e3ddbacdde96224432c756bb", + "layer2": "166add13932791a0b186e0e248161cc249ec3be75b71934fce0d7affb04ec609", + "layer20": "d49160c2926d1b3756029cae7b5ff91c96465772a1e1782d66292f6e855e4f0e", + "layer21": "5c1ebdeeddddb5e282801cfc4faae40d21bf09d132631ba0194638a0d619ea2b", + "layer22": "b3070ad9ddd311bf57762fbb185c0d6d47490c70580325ebd70290c93328d019", + "layer23": "9d0c6f46d8ddf5290a25be4bbca60662e39fbb6f3dd9975c20e0247818407883", + "layer24": "2b447f31b9093f42954e509165d3ad88079813ce5a4401e99607153a68c4dc97", + "layer25": "953f9caa45bddb76e08ba38abad518aac3ffe55edee147c0959165a22d1b3c1d", + "layer26": "d8d8a4ec3ddd4f5811c3a8a002aed130bbca0f8a94198c64483a4ab809136bfb", + "layer27": "f107da3c54e97550ad53d68b6b3c1daa0b825705e91939e3cc232ece9c09457f", + "layer28": "d227472b4d14af7e0d6b93ce06781505239d975bc255ec680fd272cc3fc12780", + "layer29": "e056874b6de3477593ee243b90b34658cca20ed943caeca835512bada739208f", + "layer3": "f2362face2bf9458748b6d8da4e33ceee6f52f1d4f2513ac955f076a275076ef", + "layer30": "072e569bb0bd979f2cc7ed87f8b68649418570d60c31c78f413968a75fc9c5b8", + "layer31": "92486de2ccf48a0b3e556d68d0e718cc6dcb1637fe4748af5b11ecb83a60e7f3", + "layer32": "6d11506a66c4b9f4cea48f71b19eb60aa5f4ddf13f7e4dc3935f2bdad7258fdd", + "layer33": "ebf8d8c3534f8a8d7bdeaa677c3750d52fc17a1cf796ed7c7fdff4ef3e95d3ac", + "layer34": "55405ed12e72c43abe543d55758fc42d236fd3c61493d1c7ff6ae40eaf7fa502", + "layer35": "bff2ae45b89598d748d4226b5561936e7a6864683e2bae899e8509ff12bae31b", + "layer36": "92db2aaf748c9f95e8df030b47b26321492f62ad46c1df9cc4005b4724a693ac", + "layer37": "77ca2847b6fdfa385e0111ea25db316fa2986ec6e84f6e4fbfc30ab76e8bc7ed", + "layer38": "88ddf6ee32902b03eef06c3f475c1d3f8b6e04f97b0b62ebb63706d8b47e7479", + "layer39": "d9ba7d0ba445ff684483b2ca61b692cb7cd7ee6fc3dbb701c3c126da919d565a", + "layer4": "58f9312200f23da5a0c4a03f468a8429d67863b57b688a68eb28801ee051fc23", + "layer40": "27a854931b1d9c6c5760179804c583d3291efe27dc947b436bf1ea2e02991d1f", + "layer41": "90acfe0ad7f1426de8a3c8d7ce75ebd038ae7e28c23f99558730456bd578acad", + "layer42": "aed73f50dfe098882f6e259596feaf57b0a3e9585d019a4ef366da9dfce2db00", + "layer43": "bf6a3f59f2bdda1672a5f133ddfbc72cfac95cf29e250bc242378c98d0acaf82", + "layer44": "f823a38f7ac7cb4311c0083a413c4326083d649d100ccda2fc11cd447c895bb9", + "layer45": "0cfb5407942d8e694b5ac6f3367947700e36e91db3447e93f7e0ea1806bf5207", + "layer46": "d27dc815230df8c1bdf12407dc9ebee88005320c8a71834e3628de4de61d98d8", + "layer47": "a3cf298e8cfb5c7cd3db91341c545db9fc377d68c867c0c0c02cc9963ebb3781", + "layer5": "959a1f213733eb5036623d9de750afb8d96d931037ab8d79e6ea86f3165ff740", + "layer6": "0af5fb0fe8889723490d919d44da64ed34347421020be17b0d1c1a61d0e91e2c", + "layer7": "4878416361b610adc87125d7b8f364c09931d8c9c3ff8fb40a9f82b7204af591", + "layer8": "dc552095fd0625ddc19e4b6f48469ecc167883f935644c3a3c99a0b80c1d5a6a", + "layer9": "8c85d6559929773cb5b08fd3b32d12aac255562df7940b343691d652db8d834a" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "baseline/p0064-b1-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "baseline/p0064-b1-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "2103a7ecdb753bab5aa53770623a6edee88dd41c69c99a6d332273343636bc26", + "layer0": "e9684275c85eca0fa7f77e6ca497c659c55506974235bb1e83ee8f1676a0b98e", + "layer1": "497450f1cd49b0663ffb88553935c68320009dc6a76651c377184ce26547e3a2", + "layer10": "dbfa621f00ac6bb40be236999508d4345b57022d633207f7e2a2885511f13c7f", + "layer11": "83ef553ecadab44d289fd7871fcbb96e05986eca3ebc1cc75c5754bcee0fea27", + "layer12": "03dc6b89ddf27ddfa682d9d60990149efe2904839a619ae63b2d476da077f61a", + "layer13": "0bbfa1680231027d8babab601c8961e070a7116d29ddbcd482ca4c8be1fcb040", + "layer14": "dc2d6b92c6c9e7bc49d858b5bcb631a81b516b6204fa5a315dafd48151404d18", + "layer15": "0d76fc8cb336b185b9fa46420935a3cd21cb18f42af90cd59f5c986269f650d5", + "layer16": "e6b2de2d6f4b59461f3a0c9c2df8f6f0ab22459d94a877cdb73bf1c6f37f56ae", + "layer17": "db96458aa486d7a78dd31939c4471ba734dd4e7cbe64e9ddf9429091072fdee8", + "layer18": "b5b85c15ef27c983bc1a0de67b58d3238c8587cb41782bc31ddab58ee77e7482", + "layer19": "9539f7201598071d3858b640ed9fb83248ee17b5e3ddbacdde96224432c756bb", + "layer2": "166add13932791a0b186e0e248161cc249ec3be75b71934fce0d7affb04ec609", + "layer20": "d49160c2926d1b3756029cae7b5ff91c96465772a1e1782d66292f6e855e4f0e", + "layer21": "5c1ebdeeddddb5e282801cfc4faae40d21bf09d132631ba0194638a0d619ea2b", + "layer22": "b3070ad9ddd311bf57762fbb185c0d6d47490c70580325ebd70290c93328d019", + "layer23": "9d0c6f46d8ddf5290a25be4bbca60662e39fbb6f3dd9975c20e0247818407883", + "layer24": "2b447f31b9093f42954e509165d3ad88079813ce5a4401e99607153a68c4dc97", + "layer25": "953f9caa45bddb76e08ba38abad518aac3ffe55edee147c0959165a22d1b3c1d", + "layer26": "d8d8a4ec3ddd4f5811c3a8a002aed130bbca0f8a94198c64483a4ab809136bfb", + "layer27": "f107da3c54e97550ad53d68b6b3c1daa0b825705e91939e3cc232ece9c09457f", + "layer28": "d227472b4d14af7e0d6b93ce06781505239d975bc255ec680fd272cc3fc12780", + "layer29": "e056874b6de3477593ee243b90b34658cca20ed943caeca835512bada739208f", + "layer3": "f2362face2bf9458748b6d8da4e33ceee6f52f1d4f2513ac955f076a275076ef", + "layer30": "072e569bb0bd979f2cc7ed87f8b68649418570d60c31c78f413968a75fc9c5b8", + "layer31": "92486de2ccf48a0b3e556d68d0e718cc6dcb1637fe4748af5b11ecb83a60e7f3", + "layer32": "6d11506a66c4b9f4cea48f71b19eb60aa5f4ddf13f7e4dc3935f2bdad7258fdd", + "layer33": "ebf8d8c3534f8a8d7bdeaa677c3750d52fc17a1cf796ed7c7fdff4ef3e95d3ac", + "layer34": "55405ed12e72c43abe543d55758fc42d236fd3c61493d1c7ff6ae40eaf7fa502", + "layer35": "bff2ae45b89598d748d4226b5561936e7a6864683e2bae899e8509ff12bae31b", + "layer36": "92db2aaf748c9f95e8df030b47b26321492f62ad46c1df9cc4005b4724a693ac", + "layer37": "77ca2847b6fdfa385e0111ea25db316fa2986ec6e84f6e4fbfc30ab76e8bc7ed", + "layer38": "88ddf6ee32902b03eef06c3f475c1d3f8b6e04f97b0b62ebb63706d8b47e7479", + "layer39": "d9ba7d0ba445ff684483b2ca61b692cb7cd7ee6fc3dbb701c3c126da919d565a", + "layer4": "58f9312200f23da5a0c4a03f468a8429d67863b57b688a68eb28801ee051fc23", + "layer40": "27a854931b1d9c6c5760179804c583d3291efe27dc947b436bf1ea2e02991d1f", + "layer41": "90acfe0ad7f1426de8a3c8d7ce75ebd038ae7e28c23f99558730456bd578acad", + "layer42": "aed73f50dfe098882f6e259596feaf57b0a3e9585d019a4ef366da9dfce2db00", + "layer43": "bf6a3f59f2bdda1672a5f133ddfbc72cfac95cf29e250bc242378c98d0acaf82", + "layer44": "f823a38f7ac7cb4311c0083a413c4326083d649d100ccda2fc11cd447c895bb9", + "layer45": "0cfb5407942d8e694b5ac6f3367947700e36e91db3447e93f7e0ea1806bf5207", + "layer46": "d27dc815230df8c1bdf12407dc9ebee88005320c8a71834e3628de4de61d98d8", + "layer47": "a3cf298e8cfb5c7cd3db91341c545db9fc377d68c867c0c0c02cc9963ebb3781", + "layer5": "959a1f213733eb5036623d9de750afb8d96d931037ab8d79e6ea86f3165ff740", + "layer6": "0af5fb0fe8889723490d919d44da64ed34347421020be17b0d1c1a61d0e91e2c", + "layer7": "4878416361b610adc87125d7b8f364c09931d8c9c3ff8fb40a9f82b7204af591", + "layer8": "dc552095fd0625ddc19e4b6f48469ecc167883f935644c3a3c99a0b80c1d5a6a", + "layer9": "8c85d6559929773cb5b08fd3b32d12aac255562df7940b343691d652db8d834a" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "baseline/p0064-b4-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "baseline/p0064-b4-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "b6f90e09a20a53772513a4b600371a17c30a670eb8b78ce14f3fa997e72f1c62", + "layer0": "5e86f46b86042b3befddc9e3cf614782b90921d911deb1a0277eb3a6d5e0c117", + "layer1": "316031fc5922a711d626eb51d3d8bf85beb104f936c96006f826558d728ce91c", + "layer10": "56329904bd137f4e1f99e8fc07c4524bcd1102b1628151e60c7198923641c3dc", + "layer11": "ebfeaefb303cd0d41cbb507dab031b124df374683f18e2c31b94f9130ecfa630", + "layer12": "cfba9fa270035f36ed0946b6d2f81f1599ea2aa8329347d7027b20eea0d53435", + "layer13": "675b22e6b39b9902fff67784fcc372671cdf7f45e15b11ecd194074db98259db", + "layer14": "2a38b28823a6fdcbdfe5ee9b6738f2419b6e051806310556ad793abb298448ee", + "layer15": "39e3dcbe117d6f882428537a61484b1015906ec9f64c73695c35e7898181c4c8", + "layer16": "cdd35fe7f57343d9d8044dfcfa2c3ec4f196cbed95b7478f218e5259c2af698b", + "layer17": "6d37b67894d0fc5519dc61fc2bf8a721e0e678ca2854de1488aa235d79ea95c2", + "layer18": "cbc359dc919d8e001a515ec3b5c3829a88b0195e6829eb4f2944e877a571339c", + "layer19": "21afd4ffebbf5dc304e92d8d2df03ae7bf7bf80715dbd950c4f07797baca378a", + "layer2": "aa9e2830a632410821028776aca979356442da9cbceb050c6ef49e7ebed84b48", + "layer20": "0ebb6e3bf30afe0df987fb3cdb3a893b7f4f792250e068b2c13c67d4244f03f3", + "layer21": "9883227ba5d29127765158f0d1da0658f24458d9668b7fd252172a0eab0563d6", + "layer22": "8917c3b454bcd68d1a2fbe630f0484f196f4ce0e2d11e322e6dc2ec5443748ce", + "layer23": "07a035ca6c42381d26b1ced490bcea73366f8c879b064033525c0f71d230f0e9", + "layer24": "4419fffe351852328e0e0a5e7852db183949f763bbfd78ce1e9e389c277e7bb6", + "layer25": "fd971525eaef15a6dd122a1942736c83a97b423bfdcdefda4bedd6f942170c17", + "layer26": "c32a396a33d597d6e0a175727233f6ede8465e9810c0703d0e3f08478eb3a8db", + "layer27": "921838011bd70e05f22578081a779eb8e134bd86ea38badb2cbb1b2974812dc7", + "layer28": "a0e246e7f23e239ed3aa86b695e41ee19b5e5b125e7221eb10f6419177015687", + "layer29": "0fc4eaf56e1284a8af483185a343fb2bda24a38ffaf87e6688b7cbc2bfbed937", + "layer3": "9bac16f649c286635cbf8fcede8bba5c1cb61d36516058f11370b810fb072e36", + "layer30": "f2dfe05e0d81bb91bfb109cf2e92e131177f2bf6e88f665e1e276df9fd3c8aad", + "layer31": "f4381e59b694346b25f822a031232d6296c4e897a9866694f0385945429ea345", + "layer32": "a43c7ea4a99376018cd3410e36aa7ff5946601ae60227a4f752093ccee513b52", + "layer33": "6c2416fe97dfa911fc3db240d477a2558c614f272a76aefb0c129e1ff982211f", + "layer34": "4718fb1f6f482f005b9af231c8c43773e428c7a8d1e7d5913f9a73a90f48781e", + "layer35": "d48c9a49005a33dd760bc3f18e38c835c80ff5ef0371856b082d901a992a9f8d", + "layer36": "0c7ee3ef5dd7a1cb99df9b17b45f1a48db7dfbfb98372b9498fe923a34d59c48", + "layer37": "560b9cea75682bf2180aa08ded7ea83cd2c8d8139893301c7a8342b48f9122b0", + "layer38": "81e9ac48af216a64d627585c335db294a9409c05270e9d31abd6d5f1e96968ea", + "layer39": "504f5034efde268ab8e49fde7e19799ad7b571c50a94afbde49a18ae2d34dd08", + "layer4": "50b43448b34a040403d6937a236de2ef8e0fccefd98545c12ac36dac8a70fcaf", + "layer40": "0ac6d17c33cca1bacaaf5bad8b6543aad2ce025218834402a8e6640e666955c7", + "layer41": "8b20544a888fafe987688c5ca45b3c64a0ad7bf72dc59f45aac598a330a08b0c", + "layer42": "ab104136f3228dfbceae2930ff9e31c99f34c2dd539541e7482c47fea55e3d72", + "layer43": "f2b43d327a1002cc0365f2a45dfc7c3afc9f38f82ba87c2cb93eabe0b291e03e", + "layer44": "a445bad88b31c6602a768bc7d5ed1b354823559841bcca1d6526402460aec839", + "layer45": "9faa5bfdcea51a143df40a047a434816a6c571a1a4b9de560d0e3020ff95f03b", + "layer46": "1a80391137d78d9ca2c14678915ec0707e4829684264a73fc426209f10603cb6", + "layer47": "337c2887a9488cfc8ac22a8def008d340e56d9a8d86f7a8b7ae941c6e3c8f3a0", + "layer5": "90eca74a5e89fe68fd13f470e7ae0bedf8266380b185ec855b5d96c2bfe5519e", + "layer6": "b7d46e2a7fd2e67999fcbd3021b3af6159f40d85012b50af5eb953f323216af0", + "layer7": "e29657d0917f95f1c3b9f6cf470219638b896fe4529ca7e320c074219cc12998", + "layer8": "ac7a99abba73073ab330b26e9d8a506c5495e3b3bdd690d5df361294707df33e", + "layer9": "038485209612b9350c2fb6a599b1e7b414039caa3481753ee68c41b3915fe673" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "baseline/p0064-b4-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "baseline/p0064-b4-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "b6f90e09a20a53772513a4b600371a17c30a670eb8b78ce14f3fa997e72f1c62", + "layer0": "5e86f46b86042b3befddc9e3cf614782b90921d911deb1a0277eb3a6d5e0c117", + "layer1": "316031fc5922a711d626eb51d3d8bf85beb104f936c96006f826558d728ce91c", + "layer10": "56329904bd137f4e1f99e8fc07c4524bcd1102b1628151e60c7198923641c3dc", + "layer11": "ebfeaefb303cd0d41cbb507dab031b124df374683f18e2c31b94f9130ecfa630", + "layer12": "cfba9fa270035f36ed0946b6d2f81f1599ea2aa8329347d7027b20eea0d53435", + "layer13": "675b22e6b39b9902fff67784fcc372671cdf7f45e15b11ecd194074db98259db", + "layer14": "2a38b28823a6fdcbdfe5ee9b6738f2419b6e051806310556ad793abb298448ee", + "layer15": "39e3dcbe117d6f882428537a61484b1015906ec9f64c73695c35e7898181c4c8", + "layer16": "cdd35fe7f57343d9d8044dfcfa2c3ec4f196cbed95b7478f218e5259c2af698b", + "layer17": "6d37b67894d0fc5519dc61fc2bf8a721e0e678ca2854de1488aa235d79ea95c2", + "layer18": "cbc359dc919d8e001a515ec3b5c3829a88b0195e6829eb4f2944e877a571339c", + "layer19": "21afd4ffebbf5dc304e92d8d2df03ae7bf7bf80715dbd950c4f07797baca378a", + "layer2": "aa9e2830a632410821028776aca979356442da9cbceb050c6ef49e7ebed84b48", + "layer20": "0ebb6e3bf30afe0df987fb3cdb3a893b7f4f792250e068b2c13c67d4244f03f3", + "layer21": "9883227ba5d29127765158f0d1da0658f24458d9668b7fd252172a0eab0563d6", + "layer22": "8917c3b454bcd68d1a2fbe630f0484f196f4ce0e2d11e322e6dc2ec5443748ce", + "layer23": "07a035ca6c42381d26b1ced490bcea73366f8c879b064033525c0f71d230f0e9", + "layer24": "4419fffe351852328e0e0a5e7852db183949f763bbfd78ce1e9e389c277e7bb6", + "layer25": "fd971525eaef15a6dd122a1942736c83a97b423bfdcdefda4bedd6f942170c17", + "layer26": "c32a396a33d597d6e0a175727233f6ede8465e9810c0703d0e3f08478eb3a8db", + "layer27": "921838011bd70e05f22578081a779eb8e134bd86ea38badb2cbb1b2974812dc7", + "layer28": "a0e246e7f23e239ed3aa86b695e41ee19b5e5b125e7221eb10f6419177015687", + "layer29": "0fc4eaf56e1284a8af483185a343fb2bda24a38ffaf87e6688b7cbc2bfbed937", + "layer3": "9bac16f649c286635cbf8fcede8bba5c1cb61d36516058f11370b810fb072e36", + "layer30": "f2dfe05e0d81bb91bfb109cf2e92e131177f2bf6e88f665e1e276df9fd3c8aad", + "layer31": "f4381e59b694346b25f822a031232d6296c4e897a9866694f0385945429ea345", + "layer32": "a43c7ea4a99376018cd3410e36aa7ff5946601ae60227a4f752093ccee513b52", + "layer33": "6c2416fe97dfa911fc3db240d477a2558c614f272a76aefb0c129e1ff982211f", + "layer34": "4718fb1f6f482f005b9af231c8c43773e428c7a8d1e7d5913f9a73a90f48781e", + "layer35": "d48c9a49005a33dd760bc3f18e38c835c80ff5ef0371856b082d901a992a9f8d", + "layer36": "0c7ee3ef5dd7a1cb99df9b17b45f1a48db7dfbfb98372b9498fe923a34d59c48", + "layer37": "560b9cea75682bf2180aa08ded7ea83cd2c8d8139893301c7a8342b48f9122b0", + "layer38": "81e9ac48af216a64d627585c335db294a9409c05270e9d31abd6d5f1e96968ea", + "layer39": "504f5034efde268ab8e49fde7e19799ad7b571c50a94afbde49a18ae2d34dd08", + "layer4": "50b43448b34a040403d6937a236de2ef8e0fccefd98545c12ac36dac8a70fcaf", + "layer40": "0ac6d17c33cca1bacaaf5bad8b6543aad2ce025218834402a8e6640e666955c7", + "layer41": "8b20544a888fafe987688c5ca45b3c64a0ad7bf72dc59f45aac598a330a08b0c", + "layer42": "ab104136f3228dfbceae2930ff9e31c99f34c2dd539541e7482c47fea55e3d72", + "layer43": "f2b43d327a1002cc0365f2a45dfc7c3afc9f38f82ba87c2cb93eabe0b291e03e", + "layer44": "a445bad88b31c6602a768bc7d5ed1b354823559841bcca1d6526402460aec839", + "layer45": "9faa5bfdcea51a143df40a047a434816a6c571a1a4b9de560d0e3020ff95f03b", + "layer46": "1a80391137d78d9ca2c14678915ec0707e4829684264a73fc426209f10603cb6", + "layer47": "337c2887a9488cfc8ac22a8def008d340e56d9a8d86f7a8b7ae941c6e3c8f3a0", + "layer5": "90eca74a5e89fe68fd13f470e7ae0bedf8266380b185ec855b5d96c2bfe5519e", + "layer6": "b7d46e2a7fd2e67999fcbd3021b3af6159f40d85012b50af5eb953f323216af0", + "layer7": "e29657d0917f95f1c3b9f6cf470219638b896fe4529ca7e320c074219cc12998", + "layer8": "ac7a99abba73073ab330b26e9d8a506c5495e3b3bdd690d5df361294707df33e", + "layer9": "038485209612b9350c2fb6a599b1e7b414039caa3481753ee68c41b3915fe673" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "baseline/p0256-b1-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "baseline/p0256-b1-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "d45b13953a6723e1432c10560b12fc3a17df46be807636260ad47ca262b8f7df", + "layer0": "ba7bef60950f50bb784bdbcbf6756d14f478afb2056ee0097cb8620c1e3cb06d", + "layer1": "cb78298093a80d0e15e4fd051af782ef76395db19918bef90ef5b88a962b0888", + "layer10": "993c5ceb97eab2a34dcdd8bf36bc467c43392925b8b3b10574d9bea2f5e88a0c", + "layer11": "0ace185b37799008a2578f7a068d3ff63de95086bda1d9724d12695c3e0ef1ce", + "layer12": "35b21add3d724dc592ca71f132efcb58968abd2829857087bbc80eb94d648e1c", + "layer13": "c95980d6b8bb2a05da09f8c49bafc177b9d0cb4946dd5f18389abd10bd3d7d85", + "layer14": "6d142aef4ad626d72d96a8465f7bb2e532ce9e855b721c55ffc4c6dbc9891e5e", + "layer15": "0f8f96e698a22cab4f523b7feb0c2636d216447b62c189cdc434e7e2b0f28403", + "layer16": "49ace30bd51a4d3d5ab90c8ccab6709ce1ce9e1c8c125c904184cfdeae8997d4", + "layer17": "343f065a873afd3ae012097413e56fb4c75f7e9fb8288f3412fd0b8212b1635f", + "layer18": "f58b2a2482a2fc638b4a130e2df45b012c095e471c740f3a5f3571e5e67750ec", + "layer19": "40d9527ae47c8ba74cdefd698ad7f8199922b2e293f2a82b41862555db639d7c", + "layer2": "1755bb03edc9109fc07a6a9bc8ebc6865e24b32e1719d7f47acbfcb2241e92ee", + "layer20": "ee33cb92f8c00894ee80c59685f3da1dd988fb35433f21aaf2c20278e6534b74", + "layer21": "f91ddc49837180ddf156d479032805a9ee2a84902168f6a6a1adfd8a9724948c", + "layer22": "e4645e911ddcc5b8c9d0dffd7f9673f6d7c0b90531b06346d5dbdbcf0d6b99bd", + "layer23": "09fc780a575d37f786efa1551b02781716acba6f35f8b556c0e1cd7265a045da", + "layer24": "b1a4b06722bcb20347e76650e51054f4cca7be7129fe4e599a3147bfd2fe2b2a", + "layer25": "1e45777af5a55e0908d5021a9a2f2ce50e79a2a009fb9093a418909d5533a6c8", + "layer26": "6f5cb0bb0bd68d6d760a809838d574353dc3053aa783f52dc76831cde5fc1ef9", + "layer27": "e5ea9eb45be2dcad437465bdaeb89336f20dc30f4c97e4c12b79dea7b93b6b36", + "layer28": "c2f7e456363dac0a2aa298135c3e4b855538ed82f3f2428505926602c2de298d", + "layer29": "b8c680a3f5a99e0835eb90d4fcbf3e5c31e054acab88e5d1714070940c5efe7a", + "layer3": "8c2e2976a31a382482c3fc579fd93357850e64f1797415630fc8d9b2989cba7b", + "layer30": "ea173a758a3cf770e7630f290d2cec966d227d19f82322754190f0499773d15e", + "layer31": "f8679e012f6fce5ec4510bf26b1cfdd664c38b4c05e7558f8812eae13285854e", + "layer32": "d375b093ecc1a1b965ccebdba0462fdd95b6457bfea0118877a7734c01b8bfca", + "layer33": "0bb90cde221c40e60955501f45f82bcabe90b328cf50cea4da9f3b3a83c034de", + "layer34": "b1aecdcc8b0772e93323a32738c5c827b330fa08b99df4e624eae9e4a33c8b3a", + "layer35": "1b06a40737c60063c471f47398004bd5a526009c21a7047c2b258e77828e0912", + "layer36": "d403b709be3507c20ffac0e5d64eeed8d8fd6a9a136c4af6d1ada6236543fe2e", + "layer37": "ea79c1449f1abfd5fc16036e59a739ef860948264b51958ff2e6e7a0d3dc2182", + "layer38": "ecbbf1b3b2e75a8483efb5bf7c8cfc5bd7861e7ada6c242838de382a3c699fdd", + "layer39": "6d3f82a5f60fe1e9d238e9102fcf29586dfce0758457241e599f91ee8ccbaeb8", + "layer4": "51be3c5dc9fc65645254557fe3e6c405ab62390d6ca63f6ccb246957a2c62967", + "layer40": "476c70adfeecef8dd01f28f5255631b074923111bb2c61e2cbec74b427d71609", + "layer41": "849bf1b58ef3dda94bc8742f369a1e388cb1031ca30b70991e16fe1630d6501a", + "layer42": "1f5e9d03b45e40d867ab69a5157d668c9c0a683630c0f10f6723da53888bc115", + "layer43": "134eabb978af2204d6b9b6aac23164cccdcfce3407cd8b5d79bb1e76154cd76a", + "layer44": "a38dd2518110fd851409084dcefefcb6a1faf92fe957cde4f59b7e229ceb494f", + "layer45": "fb60fb10d3eff59a42d051cf4a4a6975bcb31d5f9e5729c74a026ab9cbed130d", + "layer46": "64184aff8faf9d15a5799b95e35525a9926eacd52d97f381bb8762af6ab8c600", + "layer47": "7a52d411e17db146820d58a713f4a836394319ec747b84c486806efa287fdb12", + "layer5": "c33833472b7c961796d448933920b546a329d4ec65722964e779b8b3a804eae5", + "layer6": "bddb50159cd1268a2ecaf23cffdc338d479888a87d112f9f51d3c85efdb30004", + "layer7": "a7a11676faea1b17536aa65bce9505ce923fedf22fc59c0d78df90903a9ae15b", + "layer8": "4085339183dbb82500bc7173c9224a3a12288d210fa83c04073cda184cdee37d", + "layer9": "a1335b980d119a17e7bc7c3542e05027a0d361d756cd3687518f2a04cb2f732f" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "baseline/p0256-b1-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "baseline/p0256-b1-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "d45b13953a6723e1432c10560b12fc3a17df46be807636260ad47ca262b8f7df", + "layer0": "ba7bef60950f50bb784bdbcbf6756d14f478afb2056ee0097cb8620c1e3cb06d", + "layer1": "cb78298093a80d0e15e4fd051af782ef76395db19918bef90ef5b88a962b0888", + "layer10": "993c5ceb97eab2a34dcdd8bf36bc467c43392925b8b3b10574d9bea2f5e88a0c", + "layer11": "0ace185b37799008a2578f7a068d3ff63de95086bda1d9724d12695c3e0ef1ce", + "layer12": "35b21add3d724dc592ca71f132efcb58968abd2829857087bbc80eb94d648e1c", + "layer13": "c95980d6b8bb2a05da09f8c49bafc177b9d0cb4946dd5f18389abd10bd3d7d85", + "layer14": "6d142aef4ad626d72d96a8465f7bb2e532ce9e855b721c55ffc4c6dbc9891e5e", + "layer15": "0f8f96e698a22cab4f523b7feb0c2636d216447b62c189cdc434e7e2b0f28403", + "layer16": "49ace30bd51a4d3d5ab90c8ccab6709ce1ce9e1c8c125c904184cfdeae8997d4", + "layer17": "343f065a873afd3ae012097413e56fb4c75f7e9fb8288f3412fd0b8212b1635f", + "layer18": "f58b2a2482a2fc638b4a130e2df45b012c095e471c740f3a5f3571e5e67750ec", + "layer19": "40d9527ae47c8ba74cdefd698ad7f8199922b2e293f2a82b41862555db639d7c", + "layer2": "1755bb03edc9109fc07a6a9bc8ebc6865e24b32e1719d7f47acbfcb2241e92ee", + "layer20": "ee33cb92f8c00894ee80c59685f3da1dd988fb35433f21aaf2c20278e6534b74", + "layer21": "f91ddc49837180ddf156d479032805a9ee2a84902168f6a6a1adfd8a9724948c", + "layer22": "e4645e911ddcc5b8c9d0dffd7f9673f6d7c0b90531b06346d5dbdbcf0d6b99bd", + "layer23": "09fc780a575d37f786efa1551b02781716acba6f35f8b556c0e1cd7265a045da", + "layer24": "b1a4b06722bcb20347e76650e51054f4cca7be7129fe4e599a3147bfd2fe2b2a", + "layer25": "1e45777af5a55e0908d5021a9a2f2ce50e79a2a009fb9093a418909d5533a6c8", + "layer26": "6f5cb0bb0bd68d6d760a809838d574353dc3053aa783f52dc76831cde5fc1ef9", + "layer27": "e5ea9eb45be2dcad437465bdaeb89336f20dc30f4c97e4c12b79dea7b93b6b36", + "layer28": "c2f7e456363dac0a2aa298135c3e4b855538ed82f3f2428505926602c2de298d", + "layer29": "b8c680a3f5a99e0835eb90d4fcbf3e5c31e054acab88e5d1714070940c5efe7a", + "layer3": "8c2e2976a31a382482c3fc579fd93357850e64f1797415630fc8d9b2989cba7b", + "layer30": "ea173a758a3cf770e7630f290d2cec966d227d19f82322754190f0499773d15e", + "layer31": "f8679e012f6fce5ec4510bf26b1cfdd664c38b4c05e7558f8812eae13285854e", + "layer32": "d375b093ecc1a1b965ccebdba0462fdd95b6457bfea0118877a7734c01b8bfca", + "layer33": "0bb90cde221c40e60955501f45f82bcabe90b328cf50cea4da9f3b3a83c034de", + "layer34": "b1aecdcc8b0772e93323a32738c5c827b330fa08b99df4e624eae9e4a33c8b3a", + "layer35": "1b06a40737c60063c471f47398004bd5a526009c21a7047c2b258e77828e0912", + "layer36": "d403b709be3507c20ffac0e5d64eeed8d8fd6a9a136c4af6d1ada6236543fe2e", + "layer37": "ea79c1449f1abfd5fc16036e59a739ef860948264b51958ff2e6e7a0d3dc2182", + "layer38": "ecbbf1b3b2e75a8483efb5bf7c8cfc5bd7861e7ada6c242838de382a3c699fdd", + "layer39": "6d3f82a5f60fe1e9d238e9102fcf29586dfce0758457241e599f91ee8ccbaeb8", + "layer4": "51be3c5dc9fc65645254557fe3e6c405ab62390d6ca63f6ccb246957a2c62967", + "layer40": "476c70adfeecef8dd01f28f5255631b074923111bb2c61e2cbec74b427d71609", + "layer41": "849bf1b58ef3dda94bc8742f369a1e388cb1031ca30b70991e16fe1630d6501a", + "layer42": "1f5e9d03b45e40d867ab69a5157d668c9c0a683630c0f10f6723da53888bc115", + "layer43": "134eabb978af2204d6b9b6aac23164cccdcfce3407cd8b5d79bb1e76154cd76a", + "layer44": "a38dd2518110fd851409084dcefefcb6a1faf92fe957cde4f59b7e229ceb494f", + "layer45": "fb60fb10d3eff59a42d051cf4a4a6975bcb31d5f9e5729c74a026ab9cbed130d", + "layer46": "64184aff8faf9d15a5799b95e35525a9926eacd52d97f381bb8762af6ab8c600", + "layer47": "7a52d411e17db146820d58a713f4a836394319ec747b84c486806efa287fdb12", + "layer5": "c33833472b7c961796d448933920b546a329d4ec65722964e779b8b3a804eae5", + "layer6": "bddb50159cd1268a2ecaf23cffdc338d479888a87d112f9f51d3c85efdb30004", + "layer7": "a7a11676faea1b17536aa65bce9505ce923fedf22fc59c0d78df90903a9ae15b", + "layer8": "4085339183dbb82500bc7173c9224a3a12288d210fa83c04073cda184cdee37d", + "layer9": "a1335b980d119a17e7bc7c3542e05027a0d361d756cd3687518f2a04cb2f732f" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "baseline/p0256-b4-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "baseline/p0256-b4-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "5795c5c90d91c336a0375a4af6634aed1251c4094f93d18a9411a4f3f5421730", + "layer0": "bf0f44e41560572a645003483e9e5d6b4c13fbdd26f770d248037384af5d8410", + "layer1": "0eb88d0b44b6090036260e31912ed484b27ec140b0258f72fa05074216a0c471", + "layer10": "782476829ab747d1b2fef3f31fc889feabb48635d6c22286d15973b7db938aaa", + "layer11": "db2076bc5204c5a904e3ed127327dc17ccd3de3316bc0f6f2e7be6d29ac65596", + "layer12": "3ed1a1a9b925aa24eae8b8150d63910cb8134b68b591d58252fc82b836b02467", + "layer13": "2c183315e98a5a629b643427cae6ff89bfb3802bc770a378c32a576e05b2504b", + "layer14": "3be88c4913d88e72388047a95ff0c35f83fa756c2581b76214eeb5e8a83da6c3", + "layer15": "e6264b38dedbd7cbc4fb209baf37432e546b2f13d25ce5cf2d6e1cf9edfea957", + "layer16": "93b6c673d6cdfeeb26490b8fd72e17f8125dcc5255c6f0e1024c9129f59776c3", + "layer17": "b7064a1e3fd3a341e6a4907bda810660f750cf44256c603d90a49893c0c43d6b", + "layer18": "26867d73636914e2d708a8d67129d3a30fae38cc10cda47ebee5590ecc7b966f", + "layer19": "d2e00e7fb22ef26ae8154a5f12c9c68240ca755e27864c5aafad2ab4c93b24ce", + "layer2": "05cebc4844223e9ffd1ff405a3e5b4158f4df9ad31de36801446aa67ebc41186", + "layer20": "ef372c386871d523fd803d52df2f327d4a1b116b539fb86050f5ef0f9ea2dbd9", + "layer21": "0a2cfb46da47f4ea967372002f09a91c5cc404cd7ac54ee866e928da971e5422", + "layer22": "c1acd5a1d3f1311739c3b5f5c5788294e1552b649148e3c97d58fff76b9ee36f", + "layer23": "d426390612260db0378518f9b68bb47f1df82a14d7e66bd317e33995d4e1feeb", + "layer24": "3a01dd605c57d1767a6f69fee85f09d1f4d6580286f6459e1089468ffa8033f5", + "layer25": "86f096f1ead50da5da2218568baa8663afff740fd4dda3ab1ad14f0b7955e9f9", + "layer26": "cd16aaf20000032aa760e95f2a11731c20d972aa732312b451b29b9baa01ef65", + "layer27": "d4819d0c61ab5bebf1fc4f883e14a438bf42cf6b5b979779ee6944f31b788218", + "layer28": "af59217a0c3f7db71c2fd1cf4afcb2efcc493127f126874f776fb12289e2d1f5", + "layer29": "f5bbeee1fb280368568381af51e583c2d7bd80507ca2804a636e1925a2ba4a1c", + "layer3": "50207662369255cef314fec8b48b6884fc2c7afae72027295f3fdec3e7a6f338", + "layer30": "80801633ac967a1a7d7992f6caf40dbbb7949667bf4389a89520b284b856d3ec", + "layer31": "c5729b8135a09a3f87c0d790136f1dbf09f795c8761de938a78ab0cf17f60f7d", + "layer32": "048b6cccc0ae49efedf0555fe24c97023b02c0cf7396998e65d303f850b5fce7", + "layer33": "c4d6cf94da4cf69b55cba2ffb8e4b2fe7fc2231d56fe832835d4319e987c29a4", + "layer34": "3619bed1a76d39b6a9682e1c2b92df38062c7e122c7cddc7f1470d252a69ffca", + "layer35": "81c96ee7023e9bf0b366701b64a1f69034aec5f6ca8b884797cb3ff0cf1356ad", + "layer36": "b1204028af1aebdb8333467e6da7b4c53eabe225e3b540afaa92cf098852d3b5", + "layer37": "ce34c65a85f273bc3e8943c1de29155792df9fe1c87ab9740f9383475af624d6", + "layer38": "6eb8fc7dee23c1f0157751b9434e9f0b504f44c2a5d3906ce07ad36c4a5d4e6d", + "layer39": "0be5a19a04972297fabf820c7c35e74b533b9a80c660188698d33449115f9f1c", + "layer4": "c816410e6aa96b7b94b564286bf2354f08811e7732073bd3a58a5594aeeb6e25", + "layer40": "30ad7a3b53e1dd8b70fa7ec9bfb3c79d59c6ee4a0c3a76c6dafefe56c3b917fb", + "layer41": "7db35d5a79904c01078666ca824654336a888f189dbee51e873729b5fa9c6bc4", + "layer42": "532c45343d85afcd536033eb6f8e26fb8c6b4406f6b885d06c4b9417e8281e59", + "layer43": "a927ddaa75414de84aea577f7233f08051e675406a9c16b5931292eda2690cea", + "layer44": "8f7a32688a502af77e5b3348c76452d3071a3899ff39b38ad5d1651e996b78ae", + "layer45": "3ecbd3790f77a2916529aef0477dd2fe1d0274522c77502af3adc16fecfc820c", + "layer46": "46e760f836d17d6d2799de04d246446dffe6f444792028452cff62cf5dee3101", + "layer47": "483653f8e4fbcd2766057318a2dce44298d34dafb0f7c44c9c64fcd6e3ade4e9", + "layer5": "1a872f109ded785e75a0c4c95f6401ad93c143409ab0098c21e5fd73087df185", + "layer6": "bdfcc3a8427ddf195659ca3676e5ef75fcba101c0d4eddb48142710066699115", + "layer7": "fabead5e7d861916a643c8623df69439fcbb118752c59a59a96ca1938cba0e10", + "layer8": "5a2bc574743ee8a7a66a8cbfce49f0c047e1eed0df99da3659fb3d4daa887c33", + "layer9": "9b8f80614167f1037acd649cd35a031e5138a0b6a59913c82dd536e91718665e" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "baseline/p0256-b4-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "baseline/p0256-b4-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "5795c5c90d91c336a0375a4af6634aed1251c4094f93d18a9411a4f3f5421730", + "layer0": "bf0f44e41560572a645003483e9e5d6b4c13fbdd26f770d248037384af5d8410", + "layer1": "0eb88d0b44b6090036260e31912ed484b27ec140b0258f72fa05074216a0c471", + "layer10": "782476829ab747d1b2fef3f31fc889feabb48635d6c22286d15973b7db938aaa", + "layer11": "db2076bc5204c5a904e3ed127327dc17ccd3de3316bc0f6f2e7be6d29ac65596", + "layer12": "3ed1a1a9b925aa24eae8b8150d63910cb8134b68b591d58252fc82b836b02467", + "layer13": "2c183315e98a5a629b643427cae6ff89bfb3802bc770a378c32a576e05b2504b", + "layer14": "3be88c4913d88e72388047a95ff0c35f83fa756c2581b76214eeb5e8a83da6c3", + "layer15": "e6264b38dedbd7cbc4fb209baf37432e546b2f13d25ce5cf2d6e1cf9edfea957", + "layer16": "93b6c673d6cdfeeb26490b8fd72e17f8125dcc5255c6f0e1024c9129f59776c3", + "layer17": "b7064a1e3fd3a341e6a4907bda810660f750cf44256c603d90a49893c0c43d6b", + "layer18": "26867d73636914e2d708a8d67129d3a30fae38cc10cda47ebee5590ecc7b966f", + "layer19": "d2e00e7fb22ef26ae8154a5f12c9c68240ca755e27864c5aafad2ab4c93b24ce", + "layer2": "05cebc4844223e9ffd1ff405a3e5b4158f4df9ad31de36801446aa67ebc41186", + "layer20": "ef372c386871d523fd803d52df2f327d4a1b116b539fb86050f5ef0f9ea2dbd9", + "layer21": "0a2cfb46da47f4ea967372002f09a91c5cc404cd7ac54ee866e928da971e5422", + "layer22": "c1acd5a1d3f1311739c3b5f5c5788294e1552b649148e3c97d58fff76b9ee36f", + "layer23": "d426390612260db0378518f9b68bb47f1df82a14d7e66bd317e33995d4e1feeb", + "layer24": "3a01dd605c57d1767a6f69fee85f09d1f4d6580286f6459e1089468ffa8033f5", + "layer25": "86f096f1ead50da5da2218568baa8663afff740fd4dda3ab1ad14f0b7955e9f9", + "layer26": "cd16aaf20000032aa760e95f2a11731c20d972aa732312b451b29b9baa01ef65", + "layer27": "d4819d0c61ab5bebf1fc4f883e14a438bf42cf6b5b979779ee6944f31b788218", + "layer28": "af59217a0c3f7db71c2fd1cf4afcb2efcc493127f126874f776fb12289e2d1f5", + "layer29": "f5bbeee1fb280368568381af51e583c2d7bd80507ca2804a636e1925a2ba4a1c", + "layer3": "50207662369255cef314fec8b48b6884fc2c7afae72027295f3fdec3e7a6f338", + "layer30": "80801633ac967a1a7d7992f6caf40dbbb7949667bf4389a89520b284b856d3ec", + "layer31": "c5729b8135a09a3f87c0d790136f1dbf09f795c8761de938a78ab0cf17f60f7d", + "layer32": "048b6cccc0ae49efedf0555fe24c97023b02c0cf7396998e65d303f850b5fce7", + "layer33": "c4d6cf94da4cf69b55cba2ffb8e4b2fe7fc2231d56fe832835d4319e987c29a4", + "layer34": "3619bed1a76d39b6a9682e1c2b92df38062c7e122c7cddc7f1470d252a69ffca", + "layer35": "81c96ee7023e9bf0b366701b64a1f69034aec5f6ca8b884797cb3ff0cf1356ad", + "layer36": "b1204028af1aebdb8333467e6da7b4c53eabe225e3b540afaa92cf098852d3b5", + "layer37": "ce34c65a85f273bc3e8943c1de29155792df9fe1c87ab9740f9383475af624d6", + "layer38": "6eb8fc7dee23c1f0157751b9434e9f0b504f44c2a5d3906ce07ad36c4a5d4e6d", + "layer39": "0be5a19a04972297fabf820c7c35e74b533b9a80c660188698d33449115f9f1c", + "layer4": "c816410e6aa96b7b94b564286bf2354f08811e7732073bd3a58a5594aeeb6e25", + "layer40": "30ad7a3b53e1dd8b70fa7ec9bfb3c79d59c6ee4a0c3a76c6dafefe56c3b917fb", + "layer41": "7db35d5a79904c01078666ca824654336a888f189dbee51e873729b5fa9c6bc4", + "layer42": "532c45343d85afcd536033eb6f8e26fb8c6b4406f6b885d06c4b9417e8281e59", + "layer43": "a927ddaa75414de84aea577f7233f08051e675406a9c16b5931292eda2690cea", + "layer44": "8f7a32688a502af77e5b3348c76452d3071a3899ff39b38ad5d1651e996b78ae", + "layer45": "3ecbd3790f77a2916529aef0477dd2fe1d0274522c77502af3adc16fecfc820c", + "layer46": "46e760f836d17d6d2799de04d246446dffe6f444792028452cff62cf5dee3101", + "layer47": "483653f8e4fbcd2766057318a2dce44298d34dafb0f7c44c9c64fcd6e3ade4e9", + "layer5": "1a872f109ded785e75a0c4c95f6401ad93c143409ab0098c21e5fd73087df185", + "layer6": "bdfcc3a8427ddf195659ca3676e5ef75fcba101c0d4eddb48142710066699115", + "layer7": "fabead5e7d861916a643c8623df69439fcbb118752c59a59a96ca1938cba0e10", + "layer8": "5a2bc574743ee8a7a66a8cbfce49f0c047e1eed0df99da3659fb3d4daa887c33", + "layer9": "9b8f80614167f1037acd649cd35a031e5138a0b6a59913c82dd536e91718665e" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "baseline/p1024-b1-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "baseline/p1024-b1-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "58eb9aed2ac599729103717be0e2bf3129602daed8c80dae7f54d75d1c626bc2", + "layer0": "28e67b926c4b05495af5e152ff9dd63fc7ca4a61114f94588250cf97af84e117", + "layer1": "54fb6e2eff64749b8bb26e5c58bb44fdfc5dd40eea529538a5679d3ac5f73275", + "layer10": "eb80bcd18f0f67b9ab6a9ea4ce5a957a47a724ca8f1528278f0d9ca950cb3642", + "layer11": "10196684c66ec4106726cd2d37bdad0cae333bf7ed6a6664b4f3f12335bfa317", + "layer12": "439b088fa691d19a7c5316219b01680a6bac03921179b035604d264fcd481482", + "layer13": "076d15310e5c82dff2b7de3be04cb073e441c79ecd842e0ca106e03bc8fca557", + "layer14": "520d7f330e19e23c794df46528144d5c27cc979e2b27247e6d6d2c1ae6839a59", + "layer15": "146a492a4e9852b3c54301d12fb481e1f1ff795538ded40005771fb00cc4793d", + "layer16": "549588774658bef489c130fbce0ac39181797dc80b623e0334930194dd1c3380", + "layer17": "4feb38011e3264ecae15ee115bee84e2094189d52935f176b124c07be0ae673d", + "layer18": "9085b1bce83f6193eb5f3031a1e127332f43a5b7461104fc81854661da8c6bdf", + "layer19": "e80fac9189bc8a1e56875f7ac5602122a9c4e520ced7316c2a78f320671d5fe2", + "layer2": "397a3bd53f0e380a988f3b86f24bed240d20b3f030379349ceedf7da3613487b", + "layer20": "94985b16331fae29e2feb3442f9c4838444f2908daf63df97f12c55d24c9472d", + "layer21": "632e0674f61c1d7d9d427e34225a89e503d2ed6602164204a5971f3494565f14", + "layer22": "02623b13cc475ee3b182bb9583ec950e272e7f32b463ab6ecc6f4c8c8dd30f3a", + "layer23": "54fbc497aa2bae601dd3ba230110fe3834ac515d8402953bd373eac5867425c5", + "layer24": "9a2b84b7ab3e0f51f8e3801b8a78c6e8cdb66d475badea5bb64bc0f2d5cec32d", + "layer25": "23c2aafbbdc441eaa7c5d5bfeddd46419f77625f6b89d3c98384678311e03df6", + "layer26": "516a26fbbb61797989a659991f043e39d812d464a81c48ffd339adfb14a3744f", + "layer27": "bf12649f7001466c337d2853098b9832b132155875f7b96a27d7aecf31a7154c", + "layer28": "625b8d2ef04da553f2ba344f14de1e013b171704d09e036fc07712cd08c2a1b7", + "layer29": "bf09aca419ecdabda4a8c8283aadfa29192f52f0738aeea118e40080d663f100", + "layer3": "29159de09eea1e92172618404e676105ed41445f95144262b658f9047370a760", + "layer30": "7a38125a677747c3320f6a669e480cf00e4337b73b74cb27a37f284d08e8bae9", + "layer31": "b7c18a9a642ed4bc52dd6c9bf25c01a83040397a0eddf0e22a9abda237b4a622", + "layer32": "ca5fb56b122f3cc20a5e94abd7c74df3ec6b9adfd50990042e12b0e20e0137b2", + "layer33": "57e17ce86c19f351e595e9f61801bea070c000f3aec4a1ebf2a8a85533075862", + "layer34": "80201d7d8a1b8f8a49a38ceb659f5399ab25713acfde47d5d5c7b29c38672530", + "layer35": "d4b87d0b7f825b0b4f36da983ae9fa9526fc4573f676934bc7ea9957c3233dcb", + "layer36": "4b297a8ae56d08a7914b4f53cef9e0f68cc205e36a9a6d8971b8e239ed5c8808", + "layer37": "f5714317aa12f96aa8430686cb2c9cfcc6f903721f8d66223f6879e99e02629d", + "layer38": "30b6cd9b1e425570488bd6756202e193785c7d6ebea2106a2a35b04ca92a7b98", + "layer39": "88505ca02b61a1e45b5a81019cd10f017578ef1584b51850631d6ceb40ec04a0", + "layer4": "b74c8be48ce9c3f2a2fdaa767798764d2d5c713402f72622f4c68ed5d176342d", + "layer40": "217556023d4b629229ae0d3469fa56bec14a49a5a253ad765992141622f1e9f8", + "layer41": "a6cdfa8c2a8e5d211660d5252569ba9ee412b35bcea75ab1a6bac2f2bdecd46e", + "layer42": "ef55fbeb6458522f06d927879d10725632da8435655645893e3f69083b936758", + "layer43": "670ae0654f0ec1c8872665bc3a2a766652c4e583803eba53b846542ed5aa3ef7", + "layer44": "14c9752e1365152c0f1251e99cbe3eb2f6df04ddc9c359ac11429333a0a3bc66", + "layer45": "67d47ea1be00a516ddf3e67526bdd3147e51879f6b9df738c6e225e29931d4cf", + "layer46": "de38b02d5fa732198834e017911f01143c6c63fe08f0d881f1c37109f9117de5", + "layer47": "d59b0d37267a459b0204d5fd229c1c939140b9ebfa3daabf62149bd4dd150d53", + "layer5": "98b4f0cac36424f550303eb76522e3688ff7faad30eb89e213558460f09e79b7", + "layer6": "736254d2c4c8f566d97e7d144a4ad68a97f3ef53664ad4ab4186caceb6904ef6", + "layer7": "72efba9c748ab6bd0c7bbecdd21b144252fb6ffc1b42fc150b6024fa504db8a0", + "layer8": "f0233c964362c88172f8ab8902d34653b8ee38a253f3728802a81d18f091a707", + "layer9": "dd773e17960cc7a4563d67655b53d9f7e2dad4043b91d0b033f38ac1b042806d" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "baseline/p1024-b1-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "baseline/p1024-b1-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "58eb9aed2ac599729103717be0e2bf3129602daed8c80dae7f54d75d1c626bc2", + "layer0": "28e67b926c4b05495af5e152ff9dd63fc7ca4a61114f94588250cf97af84e117", + "layer1": "54fb6e2eff64749b8bb26e5c58bb44fdfc5dd40eea529538a5679d3ac5f73275", + "layer10": "eb80bcd18f0f67b9ab6a9ea4ce5a957a47a724ca8f1528278f0d9ca950cb3642", + "layer11": "10196684c66ec4106726cd2d37bdad0cae333bf7ed6a6664b4f3f12335bfa317", + "layer12": "439b088fa691d19a7c5316219b01680a6bac03921179b035604d264fcd481482", + "layer13": "076d15310e5c82dff2b7de3be04cb073e441c79ecd842e0ca106e03bc8fca557", + "layer14": "520d7f330e19e23c794df46528144d5c27cc979e2b27247e6d6d2c1ae6839a59", + "layer15": "146a492a4e9852b3c54301d12fb481e1f1ff795538ded40005771fb00cc4793d", + "layer16": "549588774658bef489c130fbce0ac39181797dc80b623e0334930194dd1c3380", + "layer17": "4feb38011e3264ecae15ee115bee84e2094189d52935f176b124c07be0ae673d", + "layer18": "9085b1bce83f6193eb5f3031a1e127332f43a5b7461104fc81854661da8c6bdf", + "layer19": "e80fac9189bc8a1e56875f7ac5602122a9c4e520ced7316c2a78f320671d5fe2", + "layer2": "397a3bd53f0e380a988f3b86f24bed240d20b3f030379349ceedf7da3613487b", + "layer20": "94985b16331fae29e2feb3442f9c4838444f2908daf63df97f12c55d24c9472d", + "layer21": "632e0674f61c1d7d9d427e34225a89e503d2ed6602164204a5971f3494565f14", + "layer22": "02623b13cc475ee3b182bb9583ec950e272e7f32b463ab6ecc6f4c8c8dd30f3a", + "layer23": "54fbc497aa2bae601dd3ba230110fe3834ac515d8402953bd373eac5867425c5", + "layer24": "9a2b84b7ab3e0f51f8e3801b8a78c6e8cdb66d475badea5bb64bc0f2d5cec32d", + "layer25": "23c2aafbbdc441eaa7c5d5bfeddd46419f77625f6b89d3c98384678311e03df6", + "layer26": "516a26fbbb61797989a659991f043e39d812d464a81c48ffd339adfb14a3744f", + "layer27": "bf12649f7001466c337d2853098b9832b132155875f7b96a27d7aecf31a7154c", + "layer28": "625b8d2ef04da553f2ba344f14de1e013b171704d09e036fc07712cd08c2a1b7", + "layer29": "bf09aca419ecdabda4a8c8283aadfa29192f52f0738aeea118e40080d663f100", + "layer3": "29159de09eea1e92172618404e676105ed41445f95144262b658f9047370a760", + "layer30": "7a38125a677747c3320f6a669e480cf00e4337b73b74cb27a37f284d08e8bae9", + "layer31": "b7c18a9a642ed4bc52dd6c9bf25c01a83040397a0eddf0e22a9abda237b4a622", + "layer32": "ca5fb56b122f3cc20a5e94abd7c74df3ec6b9adfd50990042e12b0e20e0137b2", + "layer33": "57e17ce86c19f351e595e9f61801bea070c000f3aec4a1ebf2a8a85533075862", + "layer34": "80201d7d8a1b8f8a49a38ceb659f5399ab25713acfde47d5d5c7b29c38672530", + "layer35": "d4b87d0b7f825b0b4f36da983ae9fa9526fc4573f676934bc7ea9957c3233dcb", + "layer36": "4b297a8ae56d08a7914b4f53cef9e0f68cc205e36a9a6d8971b8e239ed5c8808", + "layer37": "f5714317aa12f96aa8430686cb2c9cfcc6f903721f8d66223f6879e99e02629d", + "layer38": "30b6cd9b1e425570488bd6756202e193785c7d6ebea2106a2a35b04ca92a7b98", + "layer39": "88505ca02b61a1e45b5a81019cd10f017578ef1584b51850631d6ceb40ec04a0", + "layer4": "b74c8be48ce9c3f2a2fdaa767798764d2d5c713402f72622f4c68ed5d176342d", + "layer40": "217556023d4b629229ae0d3469fa56bec14a49a5a253ad765992141622f1e9f8", + "layer41": "a6cdfa8c2a8e5d211660d5252569ba9ee412b35bcea75ab1a6bac2f2bdecd46e", + "layer42": "ef55fbeb6458522f06d927879d10725632da8435655645893e3f69083b936758", + "layer43": "670ae0654f0ec1c8872665bc3a2a766652c4e583803eba53b846542ed5aa3ef7", + "layer44": "14c9752e1365152c0f1251e99cbe3eb2f6df04ddc9c359ac11429333a0a3bc66", + "layer45": "67d47ea1be00a516ddf3e67526bdd3147e51879f6b9df738c6e225e29931d4cf", + "layer46": "de38b02d5fa732198834e017911f01143c6c63fe08f0d881f1c37109f9117de5", + "layer47": "d59b0d37267a459b0204d5fd229c1c939140b9ebfa3daabf62149bd4dd150d53", + "layer5": "98b4f0cac36424f550303eb76522e3688ff7faad30eb89e213558460f09e79b7", + "layer6": "736254d2c4c8f566d97e7d144a4ad68a97f3ef53664ad4ab4186caceb6904ef6", + "layer7": "72efba9c748ab6bd0c7bbecdd21b144252fb6ffc1b42fc150b6024fa504db8a0", + "layer8": "f0233c964362c88172f8ab8902d34653b8ee38a253f3728802a81d18f091a707", + "layer9": "dd773e17960cc7a4563d67655b53d9f7e2dad4043b91d0b033f38ac1b042806d" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "baseline/p1024-b4-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "baseline/p1024-b4-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "075873ff5d8cea35b8c2067d26abee0fca32cf3f9b7e63ee3dc80696dbe95f9c", + "layer0": "c9da7c58870f90bb507c70add20544731424d252b0439f1bb7193038bfbdd221", + "layer1": "531d69e122acf30ef37eb48819d1022efcd55d1ced140b7346c65a5e293d1e27", + "layer10": "10f922b7b87bd4225e9a8e45399c9e621b7dcb49f59f0ebb64bccfa1bc6a7df6", + "layer11": "c61045bf166ca144291b3426b14e677b9abe853b74a6f92c35b3639c9ea0fb5b", + "layer12": "853bd9b930493219171d93e6cbdbdaafcc3d22d41ee52bebc59eb0ffb5067dcc", + "layer13": "6ea64c91a9ae18f471b9d30cb673144b2507c26bcfc7f807523ba9508129cd92", + "layer14": "7e3523ce84c0c79ed2db54600a399ce4685fd28f0fe85f891d0c8bdebc811db7", + "layer15": "1676af889edbda17ccad57a54ac9f6cf1dca8fdb68f2d4c96d425216ef0f763e", + "layer16": "b0092b21f989097c1b60d1dd1205bedccd86f63f43123e2581879e49dd7cd5fd", + "layer17": "692a47a7dbc558235b5ee84d34c160c107e3639beff0453f896d9ea68784ff14", + "layer18": "4a56e759234ce4983c86b3cf8c479a1d8ac3fa667c9226295677901d717eb76a", + "layer19": "59a4e24234402198a2d122387509a9cec4f03a0c4fb366807f37b58492ff1fd9", + "layer2": "b28293ee6f402908748b82035869d110fdc41c2fa53765335ef37914ffe12777", + "layer20": "f9b4e59d78a54dc404a0e92231a5e091990e186ae92eff1667d584769dd9d2be", + "layer21": "75ac14d11ab2c8df06dac211e36ecd1c2d8129b6dead55d4246bb452e7cbd1e1", + "layer22": "b26631507047c40ed36264da58f2dc00bfe91b04782b17b09e91955857d27d03", + "layer23": "e4f0267f28abec0a7e9d4ab8743ef6ed12f6a02412ad72d84b603c0e9cca6904", + "layer24": "5ed9aaf2870edc82691bf9b3fcf7bdc598c8760f14119e1f888002d426e3f81a", + "layer25": "fae52df93e8b93985fb11ba27a14986ef0b95a03b96e5cc9447fe8a47cc23e44", + "layer26": "7bdad3d733ac7484b6f812d15bb7dc26e92202f6d23051d011aa17f70527b41c", + "layer27": "5b868fb33607eccb66434925a5e58c7a39e7032f5f07f3f5cf47371037239dde", + "layer28": "824d183a14a2dd39584a63b0d9255fd7f0234c14e679e830c7f196a16e60356c", + "layer29": "bdca32d9c4c45e842e518e8186d2f8db92c514bae203d3778c43592d6456c710", + "layer3": "4ecc2328d21227530ae630804a8522e6a5431985f6dee6cb0eef5301a76ba85c", + "layer30": "a659c1391d04dffbc6c5522aa8ea2e25302ff64cfd7c41eb55279495382e58d0", + "layer31": "88e2c6d3706c47a27f8c7cfbf9bb6e89955569cd1e6d1e52a014be8c77bf9fda", + "layer32": "72902db64dadc3b53664f49fdb069cda17a9cd8f2a417961ddd57f8bde5dbf18", + "layer33": "aaf47c22fa2dbd85d712dd979fa5297eabd58e02a7fbf5a8f5d5a74fb80586e1", + "layer34": "1e98a0a4312178a00d173042fff9a94184235a7d564347740af8f564dba7e0ab", + "layer35": "8c78f43c305220df38b9036d4d815f75329cad3d1d78e8838bf4fdcee350ce0a", + "layer36": "c74b7a95a07a6865ce0984327d147546b082eac05b4d9faf76cbe2a059c5fe7d", + "layer37": "bebaf9798168745bbd750bd87d77800c664598eec5ddaa4cdb056b9450f3ef77", + "layer38": "4a66582a43381a0bdf29f21f15cb7aeae5e54ab180536e5abb0774ae3ca103e8", + "layer39": "adf6fcdebf286dbf4b6707fba72617a8b8428878c74fa5d8ca56bf4d651cac0a", + "layer4": "9bb7c6650a70088ba525efa5bbe8b25d01ced414f7b9f15b393c331f6df8d1f6", + "layer40": "f919a20f530eb925dc5dd6c8d64b0128fc034f3c6f89ce86c409a139565e0790", + "layer41": "c7fed92a3c611e132971423afe50738f4764dd4d868f9fe3f47a79dbbaac606a", + "layer42": "9b8fe098d18b0b5276316763e50cc10bff8c96f63a67df16004d6e1ddfcbab87", + "layer43": "7640785dba714afa15d043e01cec1139ea508a55222015731039dec5138c45b5", + "layer44": "3d42fee55df4d75475162148703c43a011af305fb09ae0c6f899e068d7f9ce85", + "layer45": "8bb0c75d8fc0ad90a29aabfb0723802063e47bf8808fe7403b970efb61c9fddf", + "layer46": "6b30161bd4481658ed86d5495db36964a08b238891aed9e6a31f79d38f06d65d", + "layer47": "214b87cc29fed3c62c37ca2c3499e2f399ee1bb5467dde134b1f51ed59c80184", + "layer5": "ec2605ed9bc0587b9922ab67e0ce1fbaa1ac8f88625fa60a20dc17d7301d1d92", + "layer6": "0a3a13fb4d7a3b7cc03021907ea1696093c4678a309dd233abe4dfb746868345", + "layer7": "209329b03cc3969d96ff5095e6dd9bdbaa632663825787d4bbacab1a737056eb", + "layer8": "9b42d17c2a1c889ebe1881a4b525ae32a6ffdd31759834e043421769ce7be225", + "layer9": "7f8c69e2cfe1e10043499758d2a690d3fb8145d8ffa23343a20a00f49fc33e5f" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "baseline/p1024-b4-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "baseline/p1024-b4-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "075873ff5d8cea35b8c2067d26abee0fca32cf3f9b7e63ee3dc80696dbe95f9c", + "layer0": "c9da7c58870f90bb507c70add20544731424d252b0439f1bb7193038bfbdd221", + "layer1": "531d69e122acf30ef37eb48819d1022efcd55d1ced140b7346c65a5e293d1e27", + "layer10": "10f922b7b87bd4225e9a8e45399c9e621b7dcb49f59f0ebb64bccfa1bc6a7df6", + "layer11": "c61045bf166ca144291b3426b14e677b9abe853b74a6f92c35b3639c9ea0fb5b", + "layer12": "853bd9b930493219171d93e6cbdbdaafcc3d22d41ee52bebc59eb0ffb5067dcc", + "layer13": "6ea64c91a9ae18f471b9d30cb673144b2507c26bcfc7f807523ba9508129cd92", + "layer14": "7e3523ce84c0c79ed2db54600a399ce4685fd28f0fe85f891d0c8bdebc811db7", + "layer15": "1676af889edbda17ccad57a54ac9f6cf1dca8fdb68f2d4c96d425216ef0f763e", + "layer16": "b0092b21f989097c1b60d1dd1205bedccd86f63f43123e2581879e49dd7cd5fd", + "layer17": "692a47a7dbc558235b5ee84d34c160c107e3639beff0453f896d9ea68784ff14", + "layer18": "4a56e759234ce4983c86b3cf8c479a1d8ac3fa667c9226295677901d717eb76a", + "layer19": "59a4e24234402198a2d122387509a9cec4f03a0c4fb366807f37b58492ff1fd9", + "layer2": "b28293ee6f402908748b82035869d110fdc41c2fa53765335ef37914ffe12777", + "layer20": "f9b4e59d78a54dc404a0e92231a5e091990e186ae92eff1667d584769dd9d2be", + "layer21": "75ac14d11ab2c8df06dac211e36ecd1c2d8129b6dead55d4246bb452e7cbd1e1", + "layer22": "b26631507047c40ed36264da58f2dc00bfe91b04782b17b09e91955857d27d03", + "layer23": "e4f0267f28abec0a7e9d4ab8743ef6ed12f6a02412ad72d84b603c0e9cca6904", + "layer24": "5ed9aaf2870edc82691bf9b3fcf7bdc598c8760f14119e1f888002d426e3f81a", + "layer25": "fae52df93e8b93985fb11ba27a14986ef0b95a03b96e5cc9447fe8a47cc23e44", + "layer26": "7bdad3d733ac7484b6f812d15bb7dc26e92202f6d23051d011aa17f70527b41c", + "layer27": "5b868fb33607eccb66434925a5e58c7a39e7032f5f07f3f5cf47371037239dde", + "layer28": "824d183a14a2dd39584a63b0d9255fd7f0234c14e679e830c7f196a16e60356c", + "layer29": "bdca32d9c4c45e842e518e8186d2f8db92c514bae203d3778c43592d6456c710", + "layer3": "4ecc2328d21227530ae630804a8522e6a5431985f6dee6cb0eef5301a76ba85c", + "layer30": "a659c1391d04dffbc6c5522aa8ea2e25302ff64cfd7c41eb55279495382e58d0", + "layer31": "88e2c6d3706c47a27f8c7cfbf9bb6e89955569cd1e6d1e52a014be8c77bf9fda", + "layer32": "72902db64dadc3b53664f49fdb069cda17a9cd8f2a417961ddd57f8bde5dbf18", + "layer33": "aaf47c22fa2dbd85d712dd979fa5297eabd58e02a7fbf5a8f5d5a74fb80586e1", + "layer34": "1e98a0a4312178a00d173042fff9a94184235a7d564347740af8f564dba7e0ab", + "layer35": "8c78f43c305220df38b9036d4d815f75329cad3d1d78e8838bf4fdcee350ce0a", + "layer36": "c74b7a95a07a6865ce0984327d147546b082eac05b4d9faf76cbe2a059c5fe7d", + "layer37": "bebaf9798168745bbd750bd87d77800c664598eec5ddaa4cdb056b9450f3ef77", + "layer38": "4a66582a43381a0bdf29f21f15cb7aeae5e54ab180536e5abb0774ae3ca103e8", + "layer39": "adf6fcdebf286dbf4b6707fba72617a8b8428878c74fa5d8ca56bf4d651cac0a", + "layer4": "9bb7c6650a70088ba525efa5bbe8b25d01ced414f7b9f15b393c331f6df8d1f6", + "layer40": "f919a20f530eb925dc5dd6c8d64b0128fc034f3c6f89ce86c409a139565e0790", + "layer41": "c7fed92a3c611e132971423afe50738f4764dd4d868f9fe3f47a79dbbaac606a", + "layer42": "9b8fe098d18b0b5276316763e50cc10bff8c96f63a67df16004d6e1ddfcbab87", + "layer43": "7640785dba714afa15d043e01cec1139ea508a55222015731039dec5138c45b5", + "layer44": "3d42fee55df4d75475162148703c43a011af305fb09ae0c6f899e068d7f9ce85", + "layer45": "8bb0c75d8fc0ad90a29aabfb0723802063e47bf8808fe7403b970efb61c9fddf", + "layer46": "6b30161bd4481658ed86d5495db36964a08b238891aed9e6a31f79d38f06d65d", + "layer47": "214b87cc29fed3c62c37ca2c3499e2f399ee1bb5467dde134b1f51ed59c80184", + "layer5": "ec2605ed9bc0587b9922ab67e0ce1fbaa1ac8f88625fa60a20dc17d7301d1d92", + "layer6": "0a3a13fb4d7a3b7cc03021907ea1696093c4678a309dd233abe4dfb746868345", + "layer7": "209329b03cc3969d96ff5095e6dd9bdbaa632663825787d4bbacab1a737056eb", + "layer8": "9b42d17c2a1c889ebe1881a4b525ae32a6ffdd31759834e043421769ce7be225", + "layer9": "7f8c69e2cfe1e10043499758d2a690d3fb8145d8ffa23343a20a00f49fc33e5f" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "reload/p0008-b1-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "reload/p0008-b1-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "c3fdfa4919e8fb1e301c0d3bdab3942f0380f9b88a86b372dde99bb0b5dddaf7", + "layer0": "60138117a904ac6a6a55cadf19f313494fab7e200ab8eda9c8f01dc81532cffb", + "layer1": "55820fd513bd648bc40205e6eb57ed2e5710caa9f8b4fc18f8b011f4317786b2", + "layer10": "f29f1a9a2357d83044e2803b6fa87c7368c429512560ce9cc5755748872f1ee0", + "layer11": "6c47b697cb4c3d2ad1e536d3f2d848df268856478d73c4aa6d7860f996e3cf4b", + "layer12": "6de5cc04fef5be2d76dcb0cb771a6f2a5d8b5623a3c4953cf67cd0d698de4e2b", + "layer13": "23303aef74e437bbf7eb8fe81e8292c45a1e9f192be42f787765c79e3e558a75", + "layer14": "ec6a6d2ba47d8cd918db8e575f17e82fad793046b3150e4679854fafefb42def", + "layer15": "4d471489ff78342e981bd684aeddc8e2fa336e6e2a6ffd537bbbf1d4589360cf", + "layer16": "30bf47b568ef128f2f6a3ee463c3bbe009561d82fdb48c06becf3bd5aa1982f4", + "layer17": "41110efa741b8856b8a65dbbafc5d71c5fe914c9ce6958e9a744cee83ea70348", + "layer18": "4f3b5c6a7d4e58385e3f036ac741f027722e63215fa76527f7cb87f09b9e133b", + "layer19": "8868e733ac9c12789087548112ae023dba723f3d166c6ef33c2e1f93e587c160", + "layer2": "6e724749dc641e9a32594e0a65fd7d5d3c9d5761a12c9bad808dc40ea1404dba", + "layer20": "8fa65f9c6dd4db836db41efe9e04ec2008eff75357f8f2cab561fbd0c0febc0f", + "layer21": "7ac50917cd8131d245aa771dfe70a21d3533ef8e7674eaaeb76ca07feb787d51", + "layer22": "6810a2b2c0ca115a361ef24df57a70923b4571bcd3023ffd0ed59e7fe27d620b", + "layer23": "9f90ebd715affe7e2bc7f1031f2b3bbd2125bde1599fcad62071847c05206666", + "layer24": "5baeee3e64be23fe20a9609550511eddccd2b209a26e0985f2b30514caa344af", + "layer25": "fd24e7ffc6dc39aabacf2f4fce0a0b163dab9bdd1fb55f321a369caf9674c145", + "layer26": "2ee6fe2c1fba8ee3812af747900bf5928bbc3234f99e259eae7d120352e35803", + "layer27": "1200f57dcbf6801b06a5d5bc28e6f9411f26c7476e00b6b7bc4f355fb15ac895", + "layer28": "f0f5634cfface2fea5db3eafb98f8ecca0136dc13f27480312931deeb6703b09", + "layer29": "f0a98000a2da710dbf59fabcd777fa835111cef5a3063b36af421c4e471b58d7", + "layer3": "8b20b186d59458aa317b1463f734e58096730f9da06c500f0446fa84a053ba00", + "layer30": "d5537bed7fd86e244cec0d8f4eafa16b03d9f80d197f54ed4dd7b9043a173d4b", + "layer31": "21b38dcb6037f3bc2806731ccf6271db698469f1a885be040e259e8e42117bee", + "layer32": "529ddd35057913cdd92f8534f31ae63ccd8925b375d5fd4dcea0dbc26ab932da", + "layer33": "f8a2272587acf1b5a3e76a3c5f80840149ab89c3c71828d7fcf48bd9583fc004", + "layer34": "de91f4e35da49d5fe02069fe5591a055a9ed5ad17e7f24fc6e772bca86c6c5f0", + "layer35": "5727c47637ac68b7247ef830bfc8b9610fd2aef6bb34a32f6248278cb414b0ce", + "layer36": "8130181cdbb476faee1a8716cf3623f63200b66a73b4c752e86680f2e2161a55", + "layer37": "d70efe26e5513fbe04f4986e93d5089638854f5091806d2b88b294b9f0c784ba", + "layer38": "86810157b12fe5701664334f62aacf41bed88a2f4e07f0057506fd152168497f", + "layer39": "f92782dfdeba18ab3673ba01f648c19a76449cce76f58fe94e97c14020f04b9c", + "layer4": "81494b115184f3efbf4fbcaddf5436bd64e45d41a53c8a102c5c1d68778187c2", + "layer40": "41fd76bc352cded3f4fb98d414fe550233b3bdb7c5b7562f8483ca8e4a1e2d52", + "layer41": "c535e8ddae417096ee1f50cde759d33d6a62d863cc9a4d4cf01900ceabe8ab5c", + "layer42": "148c44c217b78405f3afaf91568691bdb6fe71408d2404d67d6f7946734c10bb", + "layer43": "c2f66c2b845ab836a31c59bb9590f02be7d80477f0745db3f9c8d68fe0b42645", + "layer44": "f666c71245cfdc4abcddc3b70cfaa6bc9bc81d99ab08df56f871ef49bede9505", + "layer45": "4d671bb364472be41d5c7d8b63c219963de6a451e07e322f78b975821e00008d", + "layer46": "fd57dc1dcf412ba71bf9f3c540613dbdbf47f9f1eef71e1dfae320f52e415169", + "layer47": "3a17a3e3720662a4f671b3399d0a0d55eede4d873fc1ed2f8200a3f32c3a8c97", + "layer5": "5dc9c6756a52d92f3174612a649559423306f951a1d98bf367bda087612f8253", + "layer6": "3485bce83da9e22180997e84d008dc301fe6d4fb9b4655f6e4c3c1c3fdc76111", + "layer7": "e83e46867bbe2a09dc27340aadcd261284e78a44eb967b5bcca5488e8599fec6", + "layer8": "93f788032ca4a142163df13c38673820f063d030ceebadbeacc94e22a696e239", + "layer9": "6b6d3e7576527459d8a485603cf2fd6abb622fb0929ac8f3e915d339fbbc2d1a" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "reload/p0008-b1-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "reload/p0008-b1-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "c3fdfa4919e8fb1e301c0d3bdab3942f0380f9b88a86b372dde99bb0b5dddaf7", + "layer0": "60138117a904ac6a6a55cadf19f313494fab7e200ab8eda9c8f01dc81532cffb", + "layer1": "55820fd513bd648bc40205e6eb57ed2e5710caa9f8b4fc18f8b011f4317786b2", + "layer10": "f29f1a9a2357d83044e2803b6fa87c7368c429512560ce9cc5755748872f1ee0", + "layer11": "6c47b697cb4c3d2ad1e536d3f2d848df268856478d73c4aa6d7860f996e3cf4b", + "layer12": "6de5cc04fef5be2d76dcb0cb771a6f2a5d8b5623a3c4953cf67cd0d698de4e2b", + "layer13": "23303aef74e437bbf7eb8fe81e8292c45a1e9f192be42f787765c79e3e558a75", + "layer14": "ec6a6d2ba47d8cd918db8e575f17e82fad793046b3150e4679854fafefb42def", + "layer15": "4d471489ff78342e981bd684aeddc8e2fa336e6e2a6ffd537bbbf1d4589360cf", + "layer16": "30bf47b568ef128f2f6a3ee463c3bbe009561d82fdb48c06becf3bd5aa1982f4", + "layer17": "41110efa741b8856b8a65dbbafc5d71c5fe914c9ce6958e9a744cee83ea70348", + "layer18": "4f3b5c6a7d4e58385e3f036ac741f027722e63215fa76527f7cb87f09b9e133b", + "layer19": "8868e733ac9c12789087548112ae023dba723f3d166c6ef33c2e1f93e587c160", + "layer2": "6e724749dc641e9a32594e0a65fd7d5d3c9d5761a12c9bad808dc40ea1404dba", + "layer20": "8fa65f9c6dd4db836db41efe9e04ec2008eff75357f8f2cab561fbd0c0febc0f", + "layer21": "7ac50917cd8131d245aa771dfe70a21d3533ef8e7674eaaeb76ca07feb787d51", + "layer22": "6810a2b2c0ca115a361ef24df57a70923b4571bcd3023ffd0ed59e7fe27d620b", + "layer23": "9f90ebd715affe7e2bc7f1031f2b3bbd2125bde1599fcad62071847c05206666", + "layer24": "5baeee3e64be23fe20a9609550511eddccd2b209a26e0985f2b30514caa344af", + "layer25": "fd24e7ffc6dc39aabacf2f4fce0a0b163dab9bdd1fb55f321a369caf9674c145", + "layer26": "2ee6fe2c1fba8ee3812af747900bf5928bbc3234f99e259eae7d120352e35803", + "layer27": "1200f57dcbf6801b06a5d5bc28e6f9411f26c7476e00b6b7bc4f355fb15ac895", + "layer28": "f0f5634cfface2fea5db3eafb98f8ecca0136dc13f27480312931deeb6703b09", + "layer29": "f0a98000a2da710dbf59fabcd777fa835111cef5a3063b36af421c4e471b58d7", + "layer3": "8b20b186d59458aa317b1463f734e58096730f9da06c500f0446fa84a053ba00", + "layer30": "d5537bed7fd86e244cec0d8f4eafa16b03d9f80d197f54ed4dd7b9043a173d4b", + "layer31": "21b38dcb6037f3bc2806731ccf6271db698469f1a885be040e259e8e42117bee", + "layer32": "529ddd35057913cdd92f8534f31ae63ccd8925b375d5fd4dcea0dbc26ab932da", + "layer33": "f8a2272587acf1b5a3e76a3c5f80840149ab89c3c71828d7fcf48bd9583fc004", + "layer34": "de91f4e35da49d5fe02069fe5591a055a9ed5ad17e7f24fc6e772bca86c6c5f0", + "layer35": "5727c47637ac68b7247ef830bfc8b9610fd2aef6bb34a32f6248278cb414b0ce", + "layer36": "8130181cdbb476faee1a8716cf3623f63200b66a73b4c752e86680f2e2161a55", + "layer37": "d70efe26e5513fbe04f4986e93d5089638854f5091806d2b88b294b9f0c784ba", + "layer38": "86810157b12fe5701664334f62aacf41bed88a2f4e07f0057506fd152168497f", + "layer39": "f92782dfdeba18ab3673ba01f648c19a76449cce76f58fe94e97c14020f04b9c", + "layer4": "81494b115184f3efbf4fbcaddf5436bd64e45d41a53c8a102c5c1d68778187c2", + "layer40": "41fd76bc352cded3f4fb98d414fe550233b3bdb7c5b7562f8483ca8e4a1e2d52", + "layer41": "c535e8ddae417096ee1f50cde759d33d6a62d863cc9a4d4cf01900ceabe8ab5c", + "layer42": "148c44c217b78405f3afaf91568691bdb6fe71408d2404d67d6f7946734c10bb", + "layer43": "c2f66c2b845ab836a31c59bb9590f02be7d80477f0745db3f9c8d68fe0b42645", + "layer44": "f666c71245cfdc4abcddc3b70cfaa6bc9bc81d99ab08df56f871ef49bede9505", + "layer45": "4d671bb364472be41d5c7d8b63c219963de6a451e07e322f78b975821e00008d", + "layer46": "fd57dc1dcf412ba71bf9f3c540613dbdbf47f9f1eef71e1dfae320f52e415169", + "layer47": "3a17a3e3720662a4f671b3399d0a0d55eede4d873fc1ed2f8200a3f32c3a8c97", + "layer5": "5dc9c6756a52d92f3174612a649559423306f951a1d98bf367bda087612f8253", + "layer6": "3485bce83da9e22180997e84d008dc301fe6d4fb9b4655f6e4c3c1c3fdc76111", + "layer7": "e83e46867bbe2a09dc27340aadcd261284e78a44eb967b5bcca5488e8599fec6", + "layer8": "93f788032ca4a142163df13c38673820f063d030ceebadbeacc94e22a696e239", + "layer9": "6b6d3e7576527459d8a485603cf2fd6abb622fb0929ac8f3e915d339fbbc2d1a" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "reload/p0008-b4-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "reload/p0008-b4-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "cf2ae0d9dd78d825b1134d6995a0c738b48f6d9205d28c60264684dde7ab44bd", + "layer0": "4b1040227752ee0a44273bf2d94629161fa03a1338bd81e79fb9075c17f7152b", + "layer1": "82e95996f390763442fc7276076fabbeb542e031795ede3cd2e215baa79e070b", + "layer10": "b451bd55ad28b742da84556662d4bb5a68e74ce2f19ec20e50ad32a5ce1c03b2", + "layer11": "41575d765c59f26b81f91be322394c7eef1104a7b5aef38022b31860153c8c2c", + "layer12": "7d0acda9a56efd25489496855377631dc1c7adea27a7fc5b0bf4353b5922e76e", + "layer13": "baf8909b621e63887cfc90f452cc7a6eb830050a1f228e97deeef61a3006281c", + "layer14": "06096e8611e148e26c9ba5c9f38c76c89ccd1c555db290971e09dd8e0dddbec5", + "layer15": "d5225bbc0dab2f5c3db42a60675a8d2331360b1fe4ba881169f28fda75ec11f6", + "layer16": "b5bf99fb55cf2cdf26f3a68063d190d0f4aaba8fa21aef998fcfaab25bc95bfc", + "layer17": "e41ecbe7b52414279c832a41c0e9fd886deaa85a33a7a77d3a0085480027894a", + "layer18": "07ecc000211e972a050b6f4407f0c0964409d18c4a2a83165624e3ab7816b712", + "layer19": "05db02ac66ee73dbe9f2cfc78666c14b2f4e32eacab3ae6bb9f6752997a57c3d", + "layer2": "2a4ceebe36e817a6de311b041ea332c7bbf5ae4f98d93c059d88f840d2de83d8", + "layer20": "e8f1d8446996b5bc30cd081f4b23395ab53d3214141cc3fbf9c3251267ed1355", + "layer21": "7697410a56b3bd9b7b38274d7e2ec3ebcc40a33ed3d716538d2685a0f0e1cdf4", + "layer22": "054ab2fc3c419b236ecf21a2fcc4281fec6d64700c4eb7f3184a01d49df6d539", + "layer23": "bc17e027f49723571e423a188163fd26ed706406d63fb55439b255d204df9e20", + "layer24": "ae983c653ffe94381518c415b32eb180387291f3c28ea2df3e55f568fd3c2b6e", + "layer25": "aa065d90d7e65708083d167ac05c7c2ececaf766fd01bb6306aa49228852b693", + "layer26": "61bb49b7b55e4fe8c1d075925e62ebecc94b2f094baa672248bb415d042a1899", + "layer27": "5882782916bf74d9fb41b7cecd7277f4e11df554a68a2fa29f969e5f3b95cdd1", + "layer28": "6fcfb30538bdd5adc41e751e26e9558e37ffbac0c7913300d36f1927bf2c3170", + "layer29": "799f07bead837d256020bd5d10d57cadc0c9d0c2e7b7461e140db3b40e3f770a", + "layer3": "782bbd66a5532ed552951f46e7c56eef027645783b65215834daff181d7d9318", + "layer30": "ffb179aea6b713a84a767e6f877dd3a264418f18c96cde8b0d62d1084634c53d", + "layer31": "0835adbecf4dc2624572cf0f4fe40631a60fc20916db0ad8a7fd3cfa81514076", + "layer32": "4795cbfb256d624a452b160c3a4d8cc5336c0a6701acb34e71e84453db4a3954", + "layer33": "13799d8e8d300bb010008b3848894922b5ddc59bb9cd7f4f5b95215be7238b85", + "layer34": "392e4e1ca04aab016d4ed9c57c27796880770866b1f562e07df40b0c93129345", + "layer35": "1c8df100247c23edef3fb66c63e60b68d4dc54e5539415fbf9d988e5dc821dc0", + "layer36": "c051082620119487bb232bad52c50fe070797527a0b27136b25ca16f601b51a7", + "layer37": "b9e7a3d55aa5f4072143dd21f21f2c44452232f1712be360bda4b005cab2eca7", + "layer38": "f4a35b17c9e15dcf470fb0a33731e6249d1ed234ed8c16b0115188a5346ee253", + "layer39": "b8cc7ebdf86ebdbba6cc5b3fc8f3faae6de78c99e2e6bcf3c7c22a3f55590356", + "layer4": "0edb0572693dd8c12cc95aeaf05b256452ad8e413110941833b2c93593c7e582", + "layer40": "8f9ef2c607edb26db56af4c097a7a7afa233c1d33efbaf043cb46b8ff0698c42", + "layer41": "9fcfbed8abc5ad342366c7ecfba56678d216eb530fcea7724a3bd06e0641f333", + "layer42": "1d563dbbc732c808d034bfe4581a721cf17079fe62f42b5b367afed1aa29a1d3", + "layer43": "2446de19cad7351b97fadc45aebaa90ab5544ba3c23107ab03912bde1f778b06", + "layer44": "ab8525f3fff126359fe58bbb6565c3bff7158cf4e19428c19866559d586a91d0", + "layer45": "7b3318a19008cd52c1b9882aa5c76070418385e9684e71ff48692283ea7267ec", + "layer46": "b1552e26e7a3b6bfbe38a65cc315e01efc6b2253a181e6cc55040c1789f4870f", + "layer47": "1cb3e7d72dff524840ec72043e6b892805645ca04dea3236772c6e9cfd178cab", + "layer5": "d5af3a1d56b99320110a6b67b4c0ef02da4f5aac31a0be2d955a64ee06933dc8", + "layer6": "0e85f5c507dd7cdc061c4081c5df19d240881745bf208463d929ecfd1a43799e", + "layer7": "55b8ec5182d7f7e34a2cc7766f1124a69534eabcc4279933fd4673a0a44a4899", + "layer8": "3d14c684e6777580910cdf444b897f807ac5029e65641837b7610f877db825a6", + "layer9": "e9decc46bf9a469550a30cacfeb442bd9cc1b87d20e6505a4516f6e7d37c87e1" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "reload/p0008-b4-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "reload/p0008-b4-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "cf2ae0d9dd78d825b1134d6995a0c738b48f6d9205d28c60264684dde7ab44bd", + "layer0": "4b1040227752ee0a44273bf2d94629161fa03a1338bd81e79fb9075c17f7152b", + "layer1": "82e95996f390763442fc7276076fabbeb542e031795ede3cd2e215baa79e070b", + "layer10": "b451bd55ad28b742da84556662d4bb5a68e74ce2f19ec20e50ad32a5ce1c03b2", + "layer11": "41575d765c59f26b81f91be322394c7eef1104a7b5aef38022b31860153c8c2c", + "layer12": "7d0acda9a56efd25489496855377631dc1c7adea27a7fc5b0bf4353b5922e76e", + "layer13": "baf8909b621e63887cfc90f452cc7a6eb830050a1f228e97deeef61a3006281c", + "layer14": "06096e8611e148e26c9ba5c9f38c76c89ccd1c555db290971e09dd8e0dddbec5", + "layer15": "d5225bbc0dab2f5c3db42a60675a8d2331360b1fe4ba881169f28fda75ec11f6", + "layer16": "b5bf99fb55cf2cdf26f3a68063d190d0f4aaba8fa21aef998fcfaab25bc95bfc", + "layer17": "e41ecbe7b52414279c832a41c0e9fd886deaa85a33a7a77d3a0085480027894a", + "layer18": "07ecc000211e972a050b6f4407f0c0964409d18c4a2a83165624e3ab7816b712", + "layer19": "05db02ac66ee73dbe9f2cfc78666c14b2f4e32eacab3ae6bb9f6752997a57c3d", + "layer2": "2a4ceebe36e817a6de311b041ea332c7bbf5ae4f98d93c059d88f840d2de83d8", + "layer20": "e8f1d8446996b5bc30cd081f4b23395ab53d3214141cc3fbf9c3251267ed1355", + "layer21": "7697410a56b3bd9b7b38274d7e2ec3ebcc40a33ed3d716538d2685a0f0e1cdf4", + "layer22": "054ab2fc3c419b236ecf21a2fcc4281fec6d64700c4eb7f3184a01d49df6d539", + "layer23": "bc17e027f49723571e423a188163fd26ed706406d63fb55439b255d204df9e20", + "layer24": "ae983c653ffe94381518c415b32eb180387291f3c28ea2df3e55f568fd3c2b6e", + "layer25": "aa065d90d7e65708083d167ac05c7c2ececaf766fd01bb6306aa49228852b693", + "layer26": "61bb49b7b55e4fe8c1d075925e62ebecc94b2f094baa672248bb415d042a1899", + "layer27": "5882782916bf74d9fb41b7cecd7277f4e11df554a68a2fa29f969e5f3b95cdd1", + "layer28": "6fcfb30538bdd5adc41e751e26e9558e37ffbac0c7913300d36f1927bf2c3170", + "layer29": "799f07bead837d256020bd5d10d57cadc0c9d0c2e7b7461e140db3b40e3f770a", + "layer3": "782bbd66a5532ed552951f46e7c56eef027645783b65215834daff181d7d9318", + "layer30": "ffb179aea6b713a84a767e6f877dd3a264418f18c96cde8b0d62d1084634c53d", + "layer31": "0835adbecf4dc2624572cf0f4fe40631a60fc20916db0ad8a7fd3cfa81514076", + "layer32": "4795cbfb256d624a452b160c3a4d8cc5336c0a6701acb34e71e84453db4a3954", + "layer33": "13799d8e8d300bb010008b3848894922b5ddc59bb9cd7f4f5b95215be7238b85", + "layer34": "392e4e1ca04aab016d4ed9c57c27796880770866b1f562e07df40b0c93129345", + "layer35": "1c8df100247c23edef3fb66c63e60b68d4dc54e5539415fbf9d988e5dc821dc0", + "layer36": "c051082620119487bb232bad52c50fe070797527a0b27136b25ca16f601b51a7", + "layer37": "b9e7a3d55aa5f4072143dd21f21f2c44452232f1712be360bda4b005cab2eca7", + "layer38": "f4a35b17c9e15dcf470fb0a33731e6249d1ed234ed8c16b0115188a5346ee253", + "layer39": "b8cc7ebdf86ebdbba6cc5b3fc8f3faae6de78c99e2e6bcf3c7c22a3f55590356", + "layer4": "0edb0572693dd8c12cc95aeaf05b256452ad8e413110941833b2c93593c7e582", + "layer40": "8f9ef2c607edb26db56af4c097a7a7afa233c1d33efbaf043cb46b8ff0698c42", + "layer41": "9fcfbed8abc5ad342366c7ecfba56678d216eb530fcea7724a3bd06e0641f333", + "layer42": "1d563dbbc732c808d034bfe4581a721cf17079fe62f42b5b367afed1aa29a1d3", + "layer43": "2446de19cad7351b97fadc45aebaa90ab5544ba3c23107ab03912bde1f778b06", + "layer44": "ab8525f3fff126359fe58bbb6565c3bff7158cf4e19428c19866559d586a91d0", + "layer45": "7b3318a19008cd52c1b9882aa5c76070418385e9684e71ff48692283ea7267ec", + "layer46": "b1552e26e7a3b6bfbe38a65cc315e01efc6b2253a181e6cc55040c1789f4870f", + "layer47": "1cb3e7d72dff524840ec72043e6b892805645ca04dea3236772c6e9cfd178cab", + "layer5": "d5af3a1d56b99320110a6b67b4c0ef02da4f5aac31a0be2d955a64ee06933dc8", + "layer6": "0e85f5c507dd7cdc061c4081c5df19d240881745bf208463d929ecfd1a43799e", + "layer7": "55b8ec5182d7f7e34a2cc7766f1124a69534eabcc4279933fd4673a0a44a4899", + "layer8": "3d14c684e6777580910cdf444b897f807ac5029e65641837b7610f877db825a6", + "layer9": "e9decc46bf9a469550a30cacfeb442bd9cc1b87d20e6505a4516f6e7d37c87e1" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "reload/p0064-b1-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "reload/p0064-b1-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "74fc357dee08af48a56d775130799a8efee0893d9a543d616910c6c3995c9320", + "layer0": "ea16a603f205f5e5176aee73683355057d85984aef99dcd98619c5dcf71d64b4", + "layer1": "799d344db64615f29691aa528f7ffab168e59aa02b20ce027b259ff4427ba658", + "layer10": "6256599d0e35cba039b5c1b5a5d84da6d526b0b003d535f28e8d4d50b2676313", + "layer11": "85b5529d83ac9b3c3522720e2afa89254b6edc3813e11bd7ebfbb28e89109f28", + "layer12": "65220f7a0480cc59b2e937a587f770b0f1a80960528f8b0cc31aeaf35134a916", + "layer13": "a2c922c2f43a85dfebddf568b45f8fbc913dc292703b1cf39278c45aa55e261d", + "layer14": "9dfed0fc609350c4e315712517124089f56ede9f9a6282528be01c8ac186f2c1", + "layer15": "e7d4feb100d972e04032552147208c4edd4b6f7a92203350c065d0eb4b5d32ba", + "layer16": "dabcb7650a13ef2e452874a62589bc09958ab9b8f023ed22976b584b262a4312", + "layer17": "4eb9583a616dd84f8e9084167b17082028565704b0062f2b63861a840ec3aaa0", + "layer18": "dc1fa5395ca75b8aaaa3fbffe13f60e45628e60093e8662b7cf1495a01ea1de0", + "layer19": "4c15295b4123a6f651d884e31db705ec619fa8109e6f4f452c3f3b7e5caa6ba5", + "layer2": "2958078f9b6f3efce0c6896659e11b24360cc74f2704d4a4de82e96c02807d95", + "layer20": "cc11964cc9dbbb40361072f5e3b8dc05c5559e112a943a0f65c1667c7f17abe8", + "layer21": "04e0a8499dd91a5639a58f1fba47af5b94a0f0e32f313cee439105b05d3a34cd", + "layer22": "1422e4b58602f6c730926792c26df91cc540873f8b77582926d76a5f2b33c2e2", + "layer23": "f80bad40a642ddea5413d477157ee2951b55397f07e9c88bad717f3a036ef11d", + "layer24": "01748dc657a03da262ee80808f12abaaf9f15868fb3fb96b4ef52080d575ae57", + "layer25": "f5db52ba606ed9f9a5f9dd5f691a05ace7533fa2853c2441254db5837cacacfa", + "layer26": "08e12cb9dd79c6cbb0898a12a6955264241421ca8c8f7d9f8e3eb5be2f7a2d9b", + "layer27": "e5fd1acf6ac961964bbfe08502cc032cbfc4a8e777562351f3b7b4b7d85fd625", + "layer28": "40e874ed228954b3d966702870817b41366431fe2be77d9302120150bad102c8", + "layer29": "dc6db07cbd36559198e52b870354ff06610a5f940f4b23f890c6966e97e869bf", + "layer3": "6eede9a3ba3f1c94ddef4aef245908def28eef71468ece81bc67f41c31b47475", + "layer30": "0d7840f7944caad13f37153e7c536711d61d722bc92c49cef9e867d043ce6906", + "layer31": "7d80f05ab51f6918c125e512b8115fc273bc7f537fc3bd7b6e21b219bf921321", + "layer32": "83f46d2e8ea185e3cdfdd13cfa7360959fc72d8b4c0a290150fbd42a7dd25196", + "layer33": "a76ab194685338dadd0cdc5c57c2a8361f1bb217ff22db88538340f8f52c7c13", + "layer34": "aeb104c4791ba3b2f67f5c4f395b60c7fc1f6d2849e56fdbd7b11c364b259d4d", + "layer35": "de502dea04bd5529de5f740477cb7ff741e4454eb91e7c993db9b9d274e316b2", + "layer36": "fdb94d72cb785afe75e27134b5e1484925988010f2540e61cb4ee89dc9737185", + "layer37": "6ca6a90e5c23de7e00279a7147a0e1105f42c164e032ba4029a8707ed860bb44", + "layer38": "b6a15604c47df2252bd3a0914cf246eb524bd1ab3114de690051fe5e8e491322", + "layer39": "9fccb052390da5a8938757187038320cc518312f9d5ca1fe74e47e8c78565f24", + "layer4": "526615e679a2ed85bc8e4f815c65ae11f76cf71f744e463bdfeeaf15f4facbda", + "layer40": "59f8361ce2a630bc1abf2d7da6cae8fd0dd649ac699aa9057dc9b4737a4057cf", + "layer41": "eabe692f214ff6b4cb1bab18e71db97aa9b37bf07bd698d551932af5b0fea9bd", + "layer42": "384baf547cd48d20c0a3a21010daea4e2c61cd31a7889fa7f14ebb85423a1dc5", + "layer43": "6f0e7a8f4db3145b681b0a5fc99b19f2b21464f4ea45bb97e3228645e17ec0ba", + "layer44": "e46e2d487bfc27f46e75940cee078a76a9413b3df5655e4f5f1b45a7a7565481", + "layer45": "184a84437bcc5b7c6ea5604ce867742765bc8f51307f2ec509cdc2c1059341d1", + "layer46": "7b61154fd4c1b74266b4446e41840d25786f1c5b0fad720169fa07de46b35f57", + "layer47": "dd0e1a1198e9ffa3f486e9aad1c749e374f701467d569df7753a063e19e72ca6", + "layer5": "57409294ae3c98e57f803fa0dadc09bd0a6d1a369d1cfa7ff7f6fa5ae4b3f2b3", + "layer6": "801f0bd90a7c08d5a936ebeeaab34120e65eaebff97bf883cfb4f9b927459562", + "layer7": "c9a4b6bd776b86983c1729f4792b116ecc5409aeff582ee2847bae7b23bef44a", + "layer8": "ef926f45c8527a82b62c7e23942dadde2fc919ff0fe83621b1001d9ca612aab6", + "layer9": "848f54519853b869e16bc3ec0cd20930f9850a564445d3bef96b6eb7e10f6642" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "reload/p0064-b1-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "reload/p0064-b1-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "74fc357dee08af48a56d775130799a8efee0893d9a543d616910c6c3995c9320", + "layer0": "ea16a603f205f5e5176aee73683355057d85984aef99dcd98619c5dcf71d64b4", + "layer1": "799d344db64615f29691aa528f7ffab168e59aa02b20ce027b259ff4427ba658", + "layer10": "6256599d0e35cba039b5c1b5a5d84da6d526b0b003d535f28e8d4d50b2676313", + "layer11": "85b5529d83ac9b3c3522720e2afa89254b6edc3813e11bd7ebfbb28e89109f28", + "layer12": "65220f7a0480cc59b2e937a587f770b0f1a80960528f8b0cc31aeaf35134a916", + "layer13": "a2c922c2f43a85dfebddf568b45f8fbc913dc292703b1cf39278c45aa55e261d", + "layer14": "9dfed0fc609350c4e315712517124089f56ede9f9a6282528be01c8ac186f2c1", + "layer15": "e7d4feb100d972e04032552147208c4edd4b6f7a92203350c065d0eb4b5d32ba", + "layer16": "dabcb7650a13ef2e452874a62589bc09958ab9b8f023ed22976b584b262a4312", + "layer17": "4eb9583a616dd84f8e9084167b17082028565704b0062f2b63861a840ec3aaa0", + "layer18": "dc1fa5395ca75b8aaaa3fbffe13f60e45628e60093e8662b7cf1495a01ea1de0", + "layer19": "4c15295b4123a6f651d884e31db705ec619fa8109e6f4f452c3f3b7e5caa6ba5", + "layer2": "2958078f9b6f3efce0c6896659e11b24360cc74f2704d4a4de82e96c02807d95", + "layer20": "cc11964cc9dbbb40361072f5e3b8dc05c5559e112a943a0f65c1667c7f17abe8", + "layer21": "04e0a8499dd91a5639a58f1fba47af5b94a0f0e32f313cee439105b05d3a34cd", + "layer22": "1422e4b58602f6c730926792c26df91cc540873f8b77582926d76a5f2b33c2e2", + "layer23": "f80bad40a642ddea5413d477157ee2951b55397f07e9c88bad717f3a036ef11d", + "layer24": "01748dc657a03da262ee80808f12abaaf9f15868fb3fb96b4ef52080d575ae57", + "layer25": "f5db52ba606ed9f9a5f9dd5f691a05ace7533fa2853c2441254db5837cacacfa", + "layer26": "08e12cb9dd79c6cbb0898a12a6955264241421ca8c8f7d9f8e3eb5be2f7a2d9b", + "layer27": "e5fd1acf6ac961964bbfe08502cc032cbfc4a8e777562351f3b7b4b7d85fd625", + "layer28": "40e874ed228954b3d966702870817b41366431fe2be77d9302120150bad102c8", + "layer29": "dc6db07cbd36559198e52b870354ff06610a5f940f4b23f890c6966e97e869bf", + "layer3": "6eede9a3ba3f1c94ddef4aef245908def28eef71468ece81bc67f41c31b47475", + "layer30": "0d7840f7944caad13f37153e7c536711d61d722bc92c49cef9e867d043ce6906", + "layer31": "7d80f05ab51f6918c125e512b8115fc273bc7f537fc3bd7b6e21b219bf921321", + "layer32": "83f46d2e8ea185e3cdfdd13cfa7360959fc72d8b4c0a290150fbd42a7dd25196", + "layer33": "a76ab194685338dadd0cdc5c57c2a8361f1bb217ff22db88538340f8f52c7c13", + "layer34": "aeb104c4791ba3b2f67f5c4f395b60c7fc1f6d2849e56fdbd7b11c364b259d4d", + "layer35": "de502dea04bd5529de5f740477cb7ff741e4454eb91e7c993db9b9d274e316b2", + "layer36": "fdb94d72cb785afe75e27134b5e1484925988010f2540e61cb4ee89dc9737185", + "layer37": "6ca6a90e5c23de7e00279a7147a0e1105f42c164e032ba4029a8707ed860bb44", + "layer38": "b6a15604c47df2252bd3a0914cf246eb524bd1ab3114de690051fe5e8e491322", + "layer39": "9fccb052390da5a8938757187038320cc518312f9d5ca1fe74e47e8c78565f24", + "layer4": "526615e679a2ed85bc8e4f815c65ae11f76cf71f744e463bdfeeaf15f4facbda", + "layer40": "59f8361ce2a630bc1abf2d7da6cae8fd0dd649ac699aa9057dc9b4737a4057cf", + "layer41": "eabe692f214ff6b4cb1bab18e71db97aa9b37bf07bd698d551932af5b0fea9bd", + "layer42": "384baf547cd48d20c0a3a21010daea4e2c61cd31a7889fa7f14ebb85423a1dc5", + "layer43": "6f0e7a8f4db3145b681b0a5fc99b19f2b21464f4ea45bb97e3228645e17ec0ba", + "layer44": "e46e2d487bfc27f46e75940cee078a76a9413b3df5655e4f5f1b45a7a7565481", + "layer45": "184a84437bcc5b7c6ea5604ce867742765bc8f51307f2ec509cdc2c1059341d1", + "layer46": "7b61154fd4c1b74266b4446e41840d25786f1c5b0fad720169fa07de46b35f57", + "layer47": "dd0e1a1198e9ffa3f486e9aad1c749e374f701467d569df7753a063e19e72ca6", + "layer5": "57409294ae3c98e57f803fa0dadc09bd0a6d1a369d1cfa7ff7f6fa5ae4b3f2b3", + "layer6": "801f0bd90a7c08d5a936ebeeaab34120e65eaebff97bf883cfb4f9b927459562", + "layer7": "c9a4b6bd776b86983c1729f4792b116ecc5409aeff582ee2847bae7b23bef44a", + "layer8": "ef926f45c8527a82b62c7e23942dadde2fc919ff0fe83621b1001d9ca612aab6", + "layer9": "848f54519853b869e16bc3ec0cd20930f9850a564445d3bef96b6eb7e10f6642" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "reload/p0064-b4-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "reload/p0064-b4-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "7e7b3bbff36cfaa8b7440b8f40cc326b66f1fb5f141d6d42a25824bd2ef9a4a1", + "layer0": "0b111e18597d2532702495f2e41312490d15c19e284ee501508e1b4ba1c27435", + "layer1": "ce4b546b8940c5a6fc1e9cb73eee47e3e692a3de511c8380d0cdc756a26b7a67", + "layer10": "8898e19c0649457ce3c6fb9586bf40332e3a271e7f44dd9d46a5c47b0af63a97", + "layer11": "851deb6583105c54aded6d73f72b3763bc89e61e226f43c8c886dbdba8eb6960", + "layer12": "553ba983cbb1ddfff1f5e8c4a48158bbe675fd6895a06b9d7a5f17e235f91fad", + "layer13": "175715734a486f6afddd2225bd12f6a8b803d221e1d2d0fe6803f385d9139761", + "layer14": "f2e75d278ffbee1c42a0555bff0e35a74bd3f6854f4c20e064ff79f3d3bbfa98", + "layer15": "242ed9641d4135462980ce86c6fa2584aae67065cc201169171c72d879a28ccd", + "layer16": "55f48bb288f9b9aba4c25f8a18aea9ca30cfd2b3121d95b4a72eb2bf3adb15f7", + "layer17": "f2e267e4d1a89f8453d43f723e6e8a67c3b79657fba89c70dc661809959be3c7", + "layer18": "08e9f038f3a133fea66944eebada541ccebd8c305d7b68300619fe92f78138f2", + "layer19": "92fca10240a1add3db75a9493837fbdce06df0a095eef1743a84fb33f24d9517", + "layer2": "84ea6669f8a942f3385361fc8ac5445965374a3dbcf02e3981c6ad12526eae30", + "layer20": "8fbccd5befeed56f10e197a011e54083f5e0b48159110188eb8ca9e2ec8106c8", + "layer21": "dc79be6cc34a9709c522eed7a9906167e4274d8e3843d06a5fa59ed871770bf7", + "layer22": "e21815b2779ff59f9494b0f7af24285677585d24a5e14d9302753ce6fe02d4c1", + "layer23": "cb50aca5fc69eb53cbe3fee90b32c1d775f21a83726bfa0577aa5cc52d0d9425", + "layer24": "b4e7c7d1b7e8b8a18e11538f23512deb2fa7f7ee9e3c30521c3e365db5cd0135", + "layer25": "93889f4a3626af62ab4dcbcca6c44b0fad667b0301ffcd576ede0792a2278558", + "layer26": "bd01474fe72c0f12f103b832ec07dca388c63d1c9abb9be71dc3e9ef425e7cb6", + "layer27": "a626f480dedfcade93b743bf20ef40ec549a291a5d9e50102ea6a616b45aa335", + "layer28": "6d9fb01027215693f1f3a23222f120a216d3ff80ce95198f9dbb935fdbb2ee4d", + "layer29": "e9c5e5aaff31eda6363e6b03b501a3068cd87854f58466caa493de3ca44922ed", + "layer3": "846c20e902b56911a51505ac72844d6cdfd0c4ccac8b212de6ad04c6d0e05905", + "layer30": "178b4088eef7a63b8a51482de9d43eebeed70e08ed9139b090619a6864fc717e", + "layer31": "a1287a744d8f6a543e97d8f2cdb88f72787f03cb17366fbc3f9cab6552ec465c", + "layer32": "36e1d936635b0100fc007c417a57e3ec574a32fa581871827d49de8df2d0e781", + "layer33": "3c2214ff64c4fcbfdc308b54861d5358737dc0ccab6420102cae3c4bb3dad1f3", + "layer34": "eee4ae75bb9a4242f81927b21b7c40db300d7144fa5cd160ef51f450c5904760", + "layer35": "affa89cb5a1bd5c8fb5a23e881b0169e039ea1533b48ec1b7368ba677e7f79f2", + "layer36": "1ffc6edc05e895810741c70248e46b5815516becb2539983071bb06ec553ba7d", + "layer37": "d8bf2be62b2f895baa3f0a3766597adc9d5a4c370837f692c2972a6dedc9cfe0", + "layer38": "177e390ae414cdad1b0b0a040b213cfe0dbdeea4593302afcf1b8b7b1be5e507", + "layer39": "6ce23ba4aba9e36be209a05bc397a8dcfb7423005f72ed59ace29b4e12dc6ce1", + "layer4": "a3963f97eabf507ef5d1d229c87030da700c45f4895adf689b43ec1de4ad10c5", + "layer40": "bf5a1c22b086623eaab0e0914904d9316023bf0aa266a363ec37d9e0427f47c4", + "layer41": "411c52ba2b511507bd7d00b527c338115d448124ddcb805920ddf0e05480bee2", + "layer42": "59562130384d9df93bad35a6a6c902ed2b847141c6ef732f797d23b47f8b898d", + "layer43": "f33c672d2aa6f46215e9345883bbfb75fc0b0d2fc26334c334c1cd9c44d9018e", + "layer44": "a760e0077b77bc16244a6f6068e5d46bb2c3210ac46561f1cb6fdce9738e7106", + "layer45": "160c3687571d69721476a6885e31d5fe7299cb288d366465b2f49b68da229836", + "layer46": "82721fc126b033578bfb38db9f12c3caf8f24d9cac12be3733cc26921caf58f9", + "layer47": "8a888f45043d83df5b71687c3487fe2b17083cee6684dd24892b0c1cc6f913e5", + "layer5": "214f8e188db572000c8787d5d07547f48bcdde8e188c7a779295f7b758fd7985", + "layer6": "235736e5028a9d4cb73f226c24936ea51643e75c018af2356db522851b9357e5", + "layer7": "da7797d2265f49e0f42a623740c4095e597cd98ea652cc9d4c6ad3db95f9e753", + "layer8": "034b72b5e05e440a79230b6d53e12c83c90c2d14bc1b048aced4b4d61cfae91e", + "layer9": "a4b21e38585ca4db38c740ba5e7def33157bd5815cfa4be57ce3d883c1d0985d" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "reload/p0064-b4-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "reload/p0064-b4-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "7e7b3bbff36cfaa8b7440b8f40cc326b66f1fb5f141d6d42a25824bd2ef9a4a1", + "layer0": "0b111e18597d2532702495f2e41312490d15c19e284ee501508e1b4ba1c27435", + "layer1": "ce4b546b8940c5a6fc1e9cb73eee47e3e692a3de511c8380d0cdc756a26b7a67", + "layer10": "8898e19c0649457ce3c6fb9586bf40332e3a271e7f44dd9d46a5c47b0af63a97", + "layer11": "851deb6583105c54aded6d73f72b3763bc89e61e226f43c8c886dbdba8eb6960", + "layer12": "553ba983cbb1ddfff1f5e8c4a48158bbe675fd6895a06b9d7a5f17e235f91fad", + "layer13": "175715734a486f6afddd2225bd12f6a8b803d221e1d2d0fe6803f385d9139761", + "layer14": "f2e75d278ffbee1c42a0555bff0e35a74bd3f6854f4c20e064ff79f3d3bbfa98", + "layer15": "242ed9641d4135462980ce86c6fa2584aae67065cc201169171c72d879a28ccd", + "layer16": "55f48bb288f9b9aba4c25f8a18aea9ca30cfd2b3121d95b4a72eb2bf3adb15f7", + "layer17": "f2e267e4d1a89f8453d43f723e6e8a67c3b79657fba89c70dc661809959be3c7", + "layer18": "08e9f038f3a133fea66944eebada541ccebd8c305d7b68300619fe92f78138f2", + "layer19": "92fca10240a1add3db75a9493837fbdce06df0a095eef1743a84fb33f24d9517", + "layer2": "84ea6669f8a942f3385361fc8ac5445965374a3dbcf02e3981c6ad12526eae30", + "layer20": "8fbccd5befeed56f10e197a011e54083f5e0b48159110188eb8ca9e2ec8106c8", + "layer21": "dc79be6cc34a9709c522eed7a9906167e4274d8e3843d06a5fa59ed871770bf7", + "layer22": "e21815b2779ff59f9494b0f7af24285677585d24a5e14d9302753ce6fe02d4c1", + "layer23": "cb50aca5fc69eb53cbe3fee90b32c1d775f21a83726bfa0577aa5cc52d0d9425", + "layer24": "b4e7c7d1b7e8b8a18e11538f23512deb2fa7f7ee9e3c30521c3e365db5cd0135", + "layer25": "93889f4a3626af62ab4dcbcca6c44b0fad667b0301ffcd576ede0792a2278558", + "layer26": "bd01474fe72c0f12f103b832ec07dca388c63d1c9abb9be71dc3e9ef425e7cb6", + "layer27": "a626f480dedfcade93b743bf20ef40ec549a291a5d9e50102ea6a616b45aa335", + "layer28": "6d9fb01027215693f1f3a23222f120a216d3ff80ce95198f9dbb935fdbb2ee4d", + "layer29": "e9c5e5aaff31eda6363e6b03b501a3068cd87854f58466caa493de3ca44922ed", + "layer3": "846c20e902b56911a51505ac72844d6cdfd0c4ccac8b212de6ad04c6d0e05905", + "layer30": "178b4088eef7a63b8a51482de9d43eebeed70e08ed9139b090619a6864fc717e", + "layer31": "a1287a744d8f6a543e97d8f2cdb88f72787f03cb17366fbc3f9cab6552ec465c", + "layer32": "36e1d936635b0100fc007c417a57e3ec574a32fa581871827d49de8df2d0e781", + "layer33": "3c2214ff64c4fcbfdc308b54861d5358737dc0ccab6420102cae3c4bb3dad1f3", + "layer34": "eee4ae75bb9a4242f81927b21b7c40db300d7144fa5cd160ef51f450c5904760", + "layer35": "affa89cb5a1bd5c8fb5a23e881b0169e039ea1533b48ec1b7368ba677e7f79f2", + "layer36": "1ffc6edc05e895810741c70248e46b5815516becb2539983071bb06ec553ba7d", + "layer37": "d8bf2be62b2f895baa3f0a3766597adc9d5a4c370837f692c2972a6dedc9cfe0", + "layer38": "177e390ae414cdad1b0b0a040b213cfe0dbdeea4593302afcf1b8b7b1be5e507", + "layer39": "6ce23ba4aba9e36be209a05bc397a8dcfb7423005f72ed59ace29b4e12dc6ce1", + "layer4": "a3963f97eabf507ef5d1d229c87030da700c45f4895adf689b43ec1de4ad10c5", + "layer40": "bf5a1c22b086623eaab0e0914904d9316023bf0aa266a363ec37d9e0427f47c4", + "layer41": "411c52ba2b511507bd7d00b527c338115d448124ddcb805920ddf0e05480bee2", + "layer42": "59562130384d9df93bad35a6a6c902ed2b847141c6ef732f797d23b47f8b898d", + "layer43": "f33c672d2aa6f46215e9345883bbfb75fc0b0d2fc26334c334c1cd9c44d9018e", + "layer44": "a760e0077b77bc16244a6f6068e5d46bb2c3210ac46561f1cb6fdce9738e7106", + "layer45": "160c3687571d69721476a6885e31d5fe7299cb288d366465b2f49b68da229836", + "layer46": "82721fc126b033578bfb38db9f12c3caf8f24d9cac12be3733cc26921caf58f9", + "layer47": "8a888f45043d83df5b71687c3487fe2b17083cee6684dd24892b0c1cc6f913e5", + "layer5": "214f8e188db572000c8787d5d07547f48bcdde8e188c7a779295f7b758fd7985", + "layer6": "235736e5028a9d4cb73f226c24936ea51643e75c018af2356db522851b9357e5", + "layer7": "da7797d2265f49e0f42a623740c4095e597cd98ea652cc9d4c6ad3db95f9e753", + "layer8": "034b72b5e05e440a79230b6d53e12c83c90c2d14bc1b048aced4b4d61cfae91e", + "layer9": "a4b21e38585ca4db38c740ba5e7def33157bd5815cfa4be57ce3d883c1d0985d" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "reload/p0256-b1-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "reload/p0256-b1-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "ab555ea9aebaa5b427dcd33346863f8746cd93f9f66de06b9928a17c0a96c184", + "layer0": "a62b0d45bd380bd08f29b7da19022b36ecaef464f031293e286ffae53c075b67", + "layer1": "a9b316a6d6c08188efee370fa428f1e69e9327558816a9022dc563c96d974a77", + "layer10": "93ad9f61802844c4c9804d6b70f80f5679db7ae415e0b881813e736fae28f129", + "layer11": "9f25ae28a488060792df5857898a45e9ec58d76015c23c71b9dcd8022195cc65", + "layer12": "2f7c5be78876242ac1940c6b4092f20fd9f66dea8193528479c109e0b7194ac7", + "layer13": "c02c60769e32fcd0facfddd2043e642584a8f3e18828c168e9b2daba004a2313", + "layer14": "648c32ac5875e65c008bac5cd9995b1466083c43e7a0b70f834c7d4541489e62", + "layer15": "f126c3bd8e6f77459d64b29f50eb3622b404d49f6d3b7397dcad8024ff29aab9", + "layer16": "705dee739bd0ac5e55a7a213408b28daad6665ede19b29f8d3336cbfed8cd963", + "layer17": "a11751452eadf7a867922fa2d4e3c6635b6f097e44a0d661ccc34eedc0d67073", + "layer18": "9e7108d493d91254919a141c7fb9e93ddcec0c5a39943458aa4c1c645091cf9a", + "layer19": "32f416e4caf8f78067f4b0cb738191ecb3838922722a926799c1966e1d605399", + "layer2": "6443d9b3465650d88c043b6adf4a5185eb8d81a2585cd7e7b793f6e951def1bb", + "layer20": "30031afeb3f2c82b9a4f0d8c4d04d88e57b4b1a68b299c068681c21df45e024e", + "layer21": "f126ca6ac1861c2b3ec59d13c415b2086e77524bc4f41069c440f2dc506578c0", + "layer22": "2afd50364500543175d5e8c3de74163d664bc33d0df7895bb66b99fb7b7b1afd", + "layer23": "2d0d1609e7d91bbbfcba64bd0e068d412273e1e86f4d99d15ceef29cf8d18fb2", + "layer24": "6fb41b7d9cdaa8e9704ef1eafcd59912be06eff2f4eb5de8d162598e865693bf", + "layer25": "3b7fe90d0636408d2598311f22d57b05d318ceb0442257223aa1ee98a3f29e31", + "layer26": "7ea5fb352dcc0412310ac3ee8c0bd61068881cf04c337466fa158f71b3833ba8", + "layer27": "0d1f55ac91948e7fb3f8795a17ada1a136119ce6914d19a1237f501aae308809", + "layer28": "d23e378ce0c35ac83e3296b356129b1fd9155d83278ea827ce4453e540dcd84f", + "layer29": "4696aa124ab1bb71d9b850d7ffa9f4b56926fb7f2b300cb6999075795454e328", + "layer3": "e53f25f43076e6479f7c6e1c8132c4697f6e8a40a4db860d8fdd72f7e7385d48", + "layer30": "adf7cc84fb6bdbec061a2b79fe771ce2bb4f6acdc5f9a2d35fcdf7aebdd675d1", + "layer31": "a9a2748d09e03a2c7f32674ab79175735b7c70e130ebb3d4f1b63723c1639b77", + "layer32": "32e06a768d131c81375aca8ff5c377d1f6f8865e0797869c20e7738ba3b9bde6", + "layer33": "4c09f1489c7837803d3c19e06d8e03996a2a2f443794b084e087b5da67f9b46d", + "layer34": "68e0e0a9c24740cbaca0d9bee7e3c2ff14c9daa053af14fca343e6d1fc94b366", + "layer35": "1c1f99dffc4eb19f73057ca36046408bd98c0b65e0d2e3b1026c4d5f682e0ec3", + "layer36": "e817e74cfe61a069a06732c4b53f27e48bb0e789455808455972b646df8e15b2", + "layer37": "7a3a49045cfdd551f2714d86157b802d476859b5841a947046fcca5701a400c2", + "layer38": "207c61dd3dd7f06ded0cc81353e33774dae462433c499230afc304656d50fece", + "layer39": "c25d84760e19c2b1b79c354707a670c06842e1e98f2ee237087c49c1e883dbca", + "layer4": "890c7731abad8c8f331aeb0f6af657e987be63a8891e105e4cd867ac96cc8922", + "layer40": "9e175290ae7fc4f5439c25e01b2e13c77a88611da94dd0239609d7d2ac7e4182", + "layer41": "396fc49cfd7b1db318b74ea8d5785ffd6130b028831efa131d7b43f8f1ff990b", + "layer42": "cea65d6d020f180ec4cb87442cd2f9d5c2eace3e8e4cd7f4da78e4b772c89f01", + "layer43": "e91bbf1dca8e3bcab474b32370566e13f3168ea54a79fae90f7e7bd9c8c3a4d7", + "layer44": "fce6d2844dbc15cb4be032beb145aabaa381bfc53b32e671a3136716a790bd77", + "layer45": "1a2966520ed202679efd5fdabb61298eeb368042f5a423f6123a785d2b04b03b", + "layer46": "f466bf709e73bfea49afc7c1dbb313f76876b1f58a099e4431b968de05e8e4b4", + "layer47": "f6eec37f76e38a61135864b698c26aa1477563135bc5825bea762154e497ab06", + "layer5": "2bcfd8d665c6a92c3f533d8872d3bfabc0e459747e530b0f5a90373f27405309", + "layer6": "2ced8740cf3c32293df2e66921b0f454d84aa0e48da9d31037c6658597a25ec7", + "layer7": "02baba38a412110f4990cbffe93837039fac9c67a167ca78f1e6c58dd9d589ad", + "layer8": "1f42151022d02cb7226ccccccd9dc6a20f8ab12f18270b081b6fbd0ee2b4941e", + "layer9": "18dd03338624660c77941f9a2cdf33401479aa9d14f42180ec0a22ee9356d8e4" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "reload/p0256-b1-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "reload/p0256-b1-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "ab555ea9aebaa5b427dcd33346863f8746cd93f9f66de06b9928a17c0a96c184", + "layer0": "a62b0d45bd380bd08f29b7da19022b36ecaef464f031293e286ffae53c075b67", + "layer1": "a9b316a6d6c08188efee370fa428f1e69e9327558816a9022dc563c96d974a77", + "layer10": "93ad9f61802844c4c9804d6b70f80f5679db7ae415e0b881813e736fae28f129", + "layer11": "9f25ae28a488060792df5857898a45e9ec58d76015c23c71b9dcd8022195cc65", + "layer12": "2f7c5be78876242ac1940c6b4092f20fd9f66dea8193528479c109e0b7194ac7", + "layer13": "c02c60769e32fcd0facfddd2043e642584a8f3e18828c168e9b2daba004a2313", + "layer14": "648c32ac5875e65c008bac5cd9995b1466083c43e7a0b70f834c7d4541489e62", + "layer15": "f126c3bd8e6f77459d64b29f50eb3622b404d49f6d3b7397dcad8024ff29aab9", + "layer16": "705dee739bd0ac5e55a7a213408b28daad6665ede19b29f8d3336cbfed8cd963", + "layer17": "a11751452eadf7a867922fa2d4e3c6635b6f097e44a0d661ccc34eedc0d67073", + "layer18": "9e7108d493d91254919a141c7fb9e93ddcec0c5a39943458aa4c1c645091cf9a", + "layer19": "32f416e4caf8f78067f4b0cb738191ecb3838922722a926799c1966e1d605399", + "layer2": "6443d9b3465650d88c043b6adf4a5185eb8d81a2585cd7e7b793f6e951def1bb", + "layer20": "30031afeb3f2c82b9a4f0d8c4d04d88e57b4b1a68b299c068681c21df45e024e", + "layer21": "f126ca6ac1861c2b3ec59d13c415b2086e77524bc4f41069c440f2dc506578c0", + "layer22": "2afd50364500543175d5e8c3de74163d664bc33d0df7895bb66b99fb7b7b1afd", + "layer23": "2d0d1609e7d91bbbfcba64bd0e068d412273e1e86f4d99d15ceef29cf8d18fb2", + "layer24": "6fb41b7d9cdaa8e9704ef1eafcd59912be06eff2f4eb5de8d162598e865693bf", + "layer25": "3b7fe90d0636408d2598311f22d57b05d318ceb0442257223aa1ee98a3f29e31", + "layer26": "7ea5fb352dcc0412310ac3ee8c0bd61068881cf04c337466fa158f71b3833ba8", + "layer27": "0d1f55ac91948e7fb3f8795a17ada1a136119ce6914d19a1237f501aae308809", + "layer28": "d23e378ce0c35ac83e3296b356129b1fd9155d83278ea827ce4453e540dcd84f", + "layer29": "4696aa124ab1bb71d9b850d7ffa9f4b56926fb7f2b300cb6999075795454e328", + "layer3": "e53f25f43076e6479f7c6e1c8132c4697f6e8a40a4db860d8fdd72f7e7385d48", + "layer30": "adf7cc84fb6bdbec061a2b79fe771ce2bb4f6acdc5f9a2d35fcdf7aebdd675d1", + "layer31": "a9a2748d09e03a2c7f32674ab79175735b7c70e130ebb3d4f1b63723c1639b77", + "layer32": "32e06a768d131c81375aca8ff5c377d1f6f8865e0797869c20e7738ba3b9bde6", + "layer33": "4c09f1489c7837803d3c19e06d8e03996a2a2f443794b084e087b5da67f9b46d", + "layer34": "68e0e0a9c24740cbaca0d9bee7e3c2ff14c9daa053af14fca343e6d1fc94b366", + "layer35": "1c1f99dffc4eb19f73057ca36046408bd98c0b65e0d2e3b1026c4d5f682e0ec3", + "layer36": "e817e74cfe61a069a06732c4b53f27e48bb0e789455808455972b646df8e15b2", + "layer37": "7a3a49045cfdd551f2714d86157b802d476859b5841a947046fcca5701a400c2", + "layer38": "207c61dd3dd7f06ded0cc81353e33774dae462433c499230afc304656d50fece", + "layer39": "c25d84760e19c2b1b79c354707a670c06842e1e98f2ee237087c49c1e883dbca", + "layer4": "890c7731abad8c8f331aeb0f6af657e987be63a8891e105e4cd867ac96cc8922", + "layer40": "9e175290ae7fc4f5439c25e01b2e13c77a88611da94dd0239609d7d2ac7e4182", + "layer41": "396fc49cfd7b1db318b74ea8d5785ffd6130b028831efa131d7b43f8f1ff990b", + "layer42": "cea65d6d020f180ec4cb87442cd2f9d5c2eace3e8e4cd7f4da78e4b772c89f01", + "layer43": "e91bbf1dca8e3bcab474b32370566e13f3168ea54a79fae90f7e7bd9c8c3a4d7", + "layer44": "fce6d2844dbc15cb4be032beb145aabaa381bfc53b32e671a3136716a790bd77", + "layer45": "1a2966520ed202679efd5fdabb61298eeb368042f5a423f6123a785d2b04b03b", + "layer46": "f466bf709e73bfea49afc7c1dbb313f76876b1f58a099e4431b968de05e8e4b4", + "layer47": "f6eec37f76e38a61135864b698c26aa1477563135bc5825bea762154e497ab06", + "layer5": "2bcfd8d665c6a92c3f533d8872d3bfabc0e459747e530b0f5a90373f27405309", + "layer6": "2ced8740cf3c32293df2e66921b0f454d84aa0e48da9d31037c6658597a25ec7", + "layer7": "02baba38a412110f4990cbffe93837039fac9c67a167ca78f1e6c58dd9d589ad", + "layer8": "1f42151022d02cb7226ccccccd9dc6a20f8ab12f18270b081b6fbd0ee2b4941e", + "layer9": "18dd03338624660c77941f9a2cdf33401479aa9d14f42180ec0a22ee9356d8e4" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "reload/p0256-b4-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "reload/p0256-b4-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "3547ad963948cd3bcb860aca6f40c65462e2c55cbd3a4c3712d146c410cffd01", + "layer0": "2daf69000c22aaafedd6c53bc7074e4aa4e3c1c98aa503db12e3e223b62c7f2f", + "layer1": "9f9276ac3337c4913f5c4c22e2cbd94069cd90c496f36a5cab5759db23c418cf", + "layer10": "c90f24356152bae63181185c4c17a72f7f95e26e643ec53cbf6cf67a03b75430", + "layer11": "4f2b41e222a8db6e51ebe5e6bffcb50a18a7990d009d3c3828af3328cfc7b1be", + "layer12": "5486b8059004e5cf58d701723c6b1215e91053299ef2ac5785fbbf0e8a6974d8", + "layer13": "a08eef6f0cf5098d43874b8a47e5e79ac9645b2acbfc25605ca02454d97f3bf1", + "layer14": "11c21db606a14d2ca62c4b675d79c668ad1b8353886d6100511610ae6ebef919", + "layer15": "99fd9a5bcb942f32f4ac3c11583e2640e1abb1ca99df0070427c1f2f9e4e061c", + "layer16": "92cabe7ac161829dfd9b57d13d856624a5253790f8fa4f3b33a9a9ab88ae0467", + "layer17": "7fa99aebacbc95ca8bfce9fdc23f92e43a3e728a5c38a9fa6fdd1e473da6f207", + "layer18": "c90369390eb19482f554170b3d199e4aed6eda0a4e033c9100528aafb62f143d", + "layer19": "1c9bd9ca05f4072588512a48c03d6d663bfd2791be6e0ca19ceab99b1f1874a2", + "layer2": "1874eb1d159503e2ebae10a86038bac27beae95e1ac8c78e8079f4ced5d7eb23", + "layer20": "a813b9436f36e902cffc8dcb8d9cdfa019d5b62a63e6b1ae97741040e2258e14", + "layer21": "e23316c313a24ccf8115d3df1ce2cb3789c01dd68a259ac0333861545ad73cb3", + "layer22": "26e8d88066f025e6c1186fcb5fd071a2b78f496a44c3f38d34eda0dde8b9d690", + "layer23": "df25c57041bd78dd46c315e65b989d5da3db0fc6e1fac7390b0472051d305eb8", + "layer24": "2730e50498b85471cd3bffc305ea8a9286490705e3657e16662563b436815b6f", + "layer25": "6cedafbc7bd189c2b1da0fc0c24878ad2cd9b67ea5711259058a1fac488b26eb", + "layer26": "833593aecb9301d3171840f75226b1379de715224b18920f4d21be359716d4f9", + "layer27": "513c0fe524d958e06998e4fbdd601889672bb5d175feec22bd6f425cc95ae9bf", + "layer28": "38e1ac798fa246217788d435e8c7e25e98206e89cdcfcc4507fff13606182a61", + "layer29": "a5e86bf8b42c6d2cbab10c52c3ea18e222f6c8724cc3deaa65b5803dbba5d74d", + "layer3": "8e1c6b7ba30fac0bcc81607334eea991a0d04e5d9c02acfc0274575e183bc5c9", + "layer30": "5dec33a64a0569d9f4d641af779fefe2c527824bcd77cb6b1f4b2570b53cc271", + "layer31": "99b8834ea1cea98434b36c2c45cfd5246429f9f199b929faa51c15f0658a37fa", + "layer32": "9efea28b40528f9db8f89de7a66a0915ac244b67553e9ef0fae1450604df3a4a", + "layer33": "a4fbb3f6d7f93a99c974b884465540e3b47445104e9a25e7e2f3ef86647e7414", + "layer34": "93dd16c8ad84282ac82a6f314ed39768b4bd59f0ea78a07fe955900af538e06a", + "layer35": "e5ffdd32e3516bd99454e923030f1cd79ee8654e422617ff091137577d6e48bd", + "layer36": "058e4cbe9a293901ebe788705c9b605ff4f4c08ddd441d1e491c863a41aab4db", + "layer37": "46815aeb1d2deaf091874375fc8825ccdb13e352294b91f6aac2bb1892b8d1b0", + "layer38": "dd6b0649ab2913169442e7940c7ec8fd79c541661d0107338422e14502898f19", + "layer39": "6fa5682c6945248958d8d23b9389ebf7c9d32c56e78a42e782754f10893ec2a5", + "layer4": "a962e220b11a098343125bd6c1e72e8046b77cf01cf07e8ce1e017f9172dec40", + "layer40": "6620dbca305347d3506d51133f0f1bd17c8f2f273e66a20e68e2c37a318448fe", + "layer41": "69d542304325d81e8993b51e091eb9c640005b3a5d9f2bc53269bbe19725d228", + "layer42": "9eb75c5d8e4a023935afa4226ecd6d5e45a073174592c15f868b5e7c4d40cdf9", + "layer43": "0437745431165a309f415d71c2b5d72b6fffe636125e12548df297c49e02fb32", + "layer44": "9fd94119c31cd46375f3ed48b6c6abc2f4aa9288dd1f126b6e1f6e4952ef4650", + "layer45": "ee55dc4a0774bd68a3437da03757786bf1712f0da5660c14f8f0e8158fcc3416", + "layer46": "592e044e4e076f3d6399fee820d0e0fd2256d5d0229857a4ab816549eaf54d8c", + "layer47": "53b18eeb8f959ee68c1dbe6d7c1a736d9568003ebcc056dab4ccdf642268bf3a", + "layer5": "4e5e5abb6186be0317f3f0340e90805fa648fbb7ffbf3ad995b1aa985934d4ec", + "layer6": "957936c76afb2fcfc011044f7baab6b1c543ed336ff8153bcb4af0d9999b0b20", + "layer7": "227935751930038ee22170fba01eff8ed0c3dc5cce10247f4c3864a5cdf53622", + "layer8": "875baabaf0513bb51f6b3964a7ff05093f64356b1210f5fe414dd8ef9dc2985a", + "layer9": "dc361d2ebfad139d3f516dc4ab004ab2392c1cc894b8965b9a3af726fd1a8485" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "reload/p0256-b4-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "reload/p0256-b4-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "3547ad963948cd3bcb860aca6f40c65462e2c55cbd3a4c3712d146c410cffd01", + "layer0": "2daf69000c22aaafedd6c53bc7074e4aa4e3c1c98aa503db12e3e223b62c7f2f", + "layer1": "9f9276ac3337c4913f5c4c22e2cbd94069cd90c496f36a5cab5759db23c418cf", + "layer10": "c90f24356152bae63181185c4c17a72f7f95e26e643ec53cbf6cf67a03b75430", + "layer11": "4f2b41e222a8db6e51ebe5e6bffcb50a18a7990d009d3c3828af3328cfc7b1be", + "layer12": "5486b8059004e5cf58d701723c6b1215e91053299ef2ac5785fbbf0e8a6974d8", + "layer13": "a08eef6f0cf5098d43874b8a47e5e79ac9645b2acbfc25605ca02454d97f3bf1", + "layer14": "11c21db606a14d2ca62c4b675d79c668ad1b8353886d6100511610ae6ebef919", + "layer15": "99fd9a5bcb942f32f4ac3c11583e2640e1abb1ca99df0070427c1f2f9e4e061c", + "layer16": "92cabe7ac161829dfd9b57d13d856624a5253790f8fa4f3b33a9a9ab88ae0467", + "layer17": "7fa99aebacbc95ca8bfce9fdc23f92e43a3e728a5c38a9fa6fdd1e473da6f207", + "layer18": "c90369390eb19482f554170b3d199e4aed6eda0a4e033c9100528aafb62f143d", + "layer19": "1c9bd9ca05f4072588512a48c03d6d663bfd2791be6e0ca19ceab99b1f1874a2", + "layer2": "1874eb1d159503e2ebae10a86038bac27beae95e1ac8c78e8079f4ced5d7eb23", + "layer20": "a813b9436f36e902cffc8dcb8d9cdfa019d5b62a63e6b1ae97741040e2258e14", + "layer21": "e23316c313a24ccf8115d3df1ce2cb3789c01dd68a259ac0333861545ad73cb3", + "layer22": "26e8d88066f025e6c1186fcb5fd071a2b78f496a44c3f38d34eda0dde8b9d690", + "layer23": "df25c57041bd78dd46c315e65b989d5da3db0fc6e1fac7390b0472051d305eb8", + "layer24": "2730e50498b85471cd3bffc305ea8a9286490705e3657e16662563b436815b6f", + "layer25": "6cedafbc7bd189c2b1da0fc0c24878ad2cd9b67ea5711259058a1fac488b26eb", + "layer26": "833593aecb9301d3171840f75226b1379de715224b18920f4d21be359716d4f9", + "layer27": "513c0fe524d958e06998e4fbdd601889672bb5d175feec22bd6f425cc95ae9bf", + "layer28": "38e1ac798fa246217788d435e8c7e25e98206e89cdcfcc4507fff13606182a61", + "layer29": "a5e86bf8b42c6d2cbab10c52c3ea18e222f6c8724cc3deaa65b5803dbba5d74d", + "layer3": "8e1c6b7ba30fac0bcc81607334eea991a0d04e5d9c02acfc0274575e183bc5c9", + "layer30": "5dec33a64a0569d9f4d641af779fefe2c527824bcd77cb6b1f4b2570b53cc271", + "layer31": "99b8834ea1cea98434b36c2c45cfd5246429f9f199b929faa51c15f0658a37fa", + "layer32": "9efea28b40528f9db8f89de7a66a0915ac244b67553e9ef0fae1450604df3a4a", + "layer33": "a4fbb3f6d7f93a99c974b884465540e3b47445104e9a25e7e2f3ef86647e7414", + "layer34": "93dd16c8ad84282ac82a6f314ed39768b4bd59f0ea78a07fe955900af538e06a", + "layer35": "e5ffdd32e3516bd99454e923030f1cd79ee8654e422617ff091137577d6e48bd", + "layer36": "058e4cbe9a293901ebe788705c9b605ff4f4c08ddd441d1e491c863a41aab4db", + "layer37": "46815aeb1d2deaf091874375fc8825ccdb13e352294b91f6aac2bb1892b8d1b0", + "layer38": "dd6b0649ab2913169442e7940c7ec8fd79c541661d0107338422e14502898f19", + "layer39": "6fa5682c6945248958d8d23b9389ebf7c9d32c56e78a42e782754f10893ec2a5", + "layer4": "a962e220b11a098343125bd6c1e72e8046b77cf01cf07e8ce1e017f9172dec40", + "layer40": "6620dbca305347d3506d51133f0f1bd17c8f2f273e66a20e68e2c37a318448fe", + "layer41": "69d542304325d81e8993b51e091eb9c640005b3a5d9f2bc53269bbe19725d228", + "layer42": "9eb75c5d8e4a023935afa4226ecd6d5e45a073174592c15f868b5e7c4d40cdf9", + "layer43": "0437745431165a309f415d71c2b5d72b6fffe636125e12548df297c49e02fb32", + "layer44": "9fd94119c31cd46375f3ed48b6c6abc2f4aa9288dd1f126b6e1f6e4952ef4650", + "layer45": "ee55dc4a0774bd68a3437da03757786bf1712f0da5660c14f8f0e8158fcc3416", + "layer46": "592e044e4e076f3d6399fee820d0e0fd2256d5d0229857a4ab816549eaf54d8c", + "layer47": "53b18eeb8f959ee68c1dbe6d7c1a736d9568003ebcc056dab4ccdf642268bf3a", + "layer5": "4e5e5abb6186be0317f3f0340e90805fa648fbb7ffbf3ad995b1aa985934d4ec", + "layer6": "957936c76afb2fcfc011044f7baab6b1c543ed336ff8153bcb4af0d9999b0b20", + "layer7": "227935751930038ee22170fba01eff8ed0c3dc5cce10247f4c3864a5cdf53622", + "layer8": "875baabaf0513bb51f6b3964a7ff05093f64356b1210f5fe414dd8ef9dc2985a", + "layer9": "dc361d2ebfad139d3f516dc4ab004ab2392c1cc894b8965b9a3af726fd1a8485" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "reload/p1024-b1-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "reload/p1024-b1-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "8bfa421b3631538ba04f8bd1f670c5485b24aeec8d657b12f15038d440efa266", + "layer0": "6df8d2b361cc8ebfd2fa4bdfb4f25702c24d211e79ef4d93aa106ea82315c129", + "layer1": "92d24c253a17704b7d5e4eb9636172c56d04c5f06b3ab26c5a897bc7ae6a3426", + "layer10": "c830e7ff8f253e88dd6f87822981e930d9741b799498fac87678b8d62ea14241", + "layer11": "0c06ab9dc203276681d3dc626e5405207937d568b4201b95da454eb92d88df96", + "layer12": "bd3e5e77e8057e5d86b5f6a5526651ccda025b73e47b3f32b46af23b505531a5", + "layer13": "1c1f66038d4701ca62a47ecd73f23bb63644db1dca1260c3c56721e5313c69c3", + "layer14": "c6a86951242558ebe5337b4c54e62a3e3f523d02fa373278d6932d0813cc51d7", + "layer15": "dda8b10d632e38d16a53d998a7afa600b8ea0d86634b073878debc0acc040e1f", + "layer16": "2ad615d0d9873212016b488d31460de8b09c0bfa268ff00f8a593c27c5e322b9", + "layer17": "1c61d906b4c33656d14a32842419ffcec2b59b1db8a7800c320ba01a52fc108e", + "layer18": "b01973f9d9f0db61596646d8bf8b3070a30f2c88d62c6bd17275f0654230bda8", + "layer19": "1a7b37911385b7be4c2e8e084bb1a7c4604a6de2d9f3a6bb557f89e0e3dc2409", + "layer2": "e6c32e65028aeb965a04c7aa1440e770df92d3d3e3be6f99bae8f031b8e9ddd1", + "layer20": "ca55e60a8d3511f2973dc71cd4caa52c7d319f64131532fe6d60b869db403813", + "layer21": "af4e9900b21d4ff9ab37f0792e2d35ddc65fdc5331462b7edb89aaed1dfded6c", + "layer22": "a6fd9aa9584590a15a456e4149f000ba3eb197ba9002cc7468510510110181c1", + "layer23": "2b73574ae039e140d7664625fd478e46f1c82a61b4c94ed30fa8398bd50475f6", + "layer24": "027167505fd933bced4bacfd6f4e90b331927376cd631f8ff54ba5e7262bc55a", + "layer25": "5ca69f44e46c37658faf1129c159a719c98486ffa6e1a2b7d55dd2aea3144336", + "layer26": "4838c33504f6dc28e7e8c76578f61130c7d5c61791d81c513e5b85ac86e71658", + "layer27": "f6b7a7797da5c5d17cb409f1f08ef8712c3974fa2ac278e4bbee1ef5ff50891a", + "layer28": "6b9fb34be8284a7cb7db5be7e7405c61c44ef1b46464b1385c6a5c4f4fdc466b", + "layer29": "7e36f0a6e963eae0581040ac2b95cde35f8ee0118ea3cb6b961627e9d7154fd1", + "layer3": "a4f1204b59574af4082b5c7129350562dc074e1fce0dcf7b1bf3b205136b17a2", + "layer30": "fa3b6de067f9944ea54f94472444034b866d7198684bbe125b7828b6e69f795b", + "layer31": "69a05581ff31cb4aa0d0fe10d2c4035686cd240ea6e08702e6b0f665c4dbdf79", + "layer32": "2aca52a5afa6cc2fe6f312fe65e45cf076bc852a320618236db7e444a7af1ec7", + "layer33": "fc1ae9c4b0c5637a5a2becb05a102a824de02089597bfa33e9e8a7aa9ce09191", + "layer34": "d2c23b63ea53ccca726712977bdaec074e152b0fbb37993b743a7ba5d2135c70", + "layer35": "c097b0af8b2a93629d292cd01a69fde34f1439e161a2148d35fda850cc6373f3", + "layer36": "b8fb8d2d5d7d688e590e2f80a2e6618c0d3a38924b849a6209fe660454f8a3db", + "layer37": "2539f8fcfd1d8d21ddd740eeb4326a35b354d090dd2aa11db9e713ae7f6d135a", + "layer38": "5b99d0c25a04a03529213cd2a01735ef47ab6298d2446b79efff97180fa8fcac", + "layer39": "4db2c247e4c1e723c65ae1211c7a6dceb8c7d25b966e653b4c5bb86025de2366", + "layer4": "e615253cb3f9caa31ad4cf605e29ecf632bafd30b3f881a380c0c6749c3d24b9", + "layer40": "7ac219d9dd660a2dadfc782778a624ad2572a32b97011b3273c91c978505c27d", + "layer41": "65b39bd03748da4e93434917ffc1a8754c828bc977d2feb1f942d34d65e17df3", + "layer42": "688694106045c73b4e3aeeaf3affb681dd7338b6b9d4e5de8a667debfa66f639", + "layer43": "14033b7eaf6955dac46b5298f066f0c363cbf627560ac00c91a07cd259aee001", + "layer44": "9c7a1cc083a0bc562fa67a6ee9ab623bec1cef087d25b1cf7807296072cae035", + "layer45": "7c3d922519f492c5a4c8fa475579d98a79913d75117244d2f49cae6a70d5c4a7", + "layer46": "9c1cd3bfa0830fbabd6ed33b4dabbe4d7c13ba347bb73e28a3926462d8e11911", + "layer47": "90d05bb1ad0d1194a9611cf7da60513204e9326e0e9381617ddfcca9b7404ce4", + "layer5": "a9f1b4bbd53a34a5f400c931bbb3b3963024ab90fd8c20da0bc30df64c5e0d3f", + "layer6": "8dd2a6a84d43ab22d206c63c6c2eeca496cd7eb0ea98229957878a4de9c46571", + "layer7": "9a1c29c45835f052080433c01a0fc530e8aa12b43b27f96a75adc056ba37cac2", + "layer8": "be5a6f96b349c962e7a301517e30dc1df70120cf0182e9129078f10e7ea5a6a2", + "layer9": "b36971c8aae515654eb9ab493bf74625fa67ff4bacfe71401817f66ef1e1fa75" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "reload/p1024-b1-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "reload/p1024-b1-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "8bfa421b3631538ba04f8bd1f670c5485b24aeec8d657b12f15038d440efa266", + "layer0": "6df8d2b361cc8ebfd2fa4bdfb4f25702c24d211e79ef4d93aa106ea82315c129", + "layer1": "92d24c253a17704b7d5e4eb9636172c56d04c5f06b3ab26c5a897bc7ae6a3426", + "layer10": "c830e7ff8f253e88dd6f87822981e930d9741b799498fac87678b8d62ea14241", + "layer11": "0c06ab9dc203276681d3dc626e5405207937d568b4201b95da454eb92d88df96", + "layer12": "bd3e5e77e8057e5d86b5f6a5526651ccda025b73e47b3f32b46af23b505531a5", + "layer13": "1c1f66038d4701ca62a47ecd73f23bb63644db1dca1260c3c56721e5313c69c3", + "layer14": "c6a86951242558ebe5337b4c54e62a3e3f523d02fa373278d6932d0813cc51d7", + "layer15": "dda8b10d632e38d16a53d998a7afa600b8ea0d86634b073878debc0acc040e1f", + "layer16": "2ad615d0d9873212016b488d31460de8b09c0bfa268ff00f8a593c27c5e322b9", + "layer17": "1c61d906b4c33656d14a32842419ffcec2b59b1db8a7800c320ba01a52fc108e", + "layer18": "b01973f9d9f0db61596646d8bf8b3070a30f2c88d62c6bd17275f0654230bda8", + "layer19": "1a7b37911385b7be4c2e8e084bb1a7c4604a6de2d9f3a6bb557f89e0e3dc2409", + "layer2": "e6c32e65028aeb965a04c7aa1440e770df92d3d3e3be6f99bae8f031b8e9ddd1", + "layer20": "ca55e60a8d3511f2973dc71cd4caa52c7d319f64131532fe6d60b869db403813", + "layer21": "af4e9900b21d4ff9ab37f0792e2d35ddc65fdc5331462b7edb89aaed1dfded6c", + "layer22": "a6fd9aa9584590a15a456e4149f000ba3eb197ba9002cc7468510510110181c1", + "layer23": "2b73574ae039e140d7664625fd478e46f1c82a61b4c94ed30fa8398bd50475f6", + "layer24": "027167505fd933bced4bacfd6f4e90b331927376cd631f8ff54ba5e7262bc55a", + "layer25": "5ca69f44e46c37658faf1129c159a719c98486ffa6e1a2b7d55dd2aea3144336", + "layer26": "4838c33504f6dc28e7e8c76578f61130c7d5c61791d81c513e5b85ac86e71658", + "layer27": "f6b7a7797da5c5d17cb409f1f08ef8712c3974fa2ac278e4bbee1ef5ff50891a", + "layer28": "6b9fb34be8284a7cb7db5be7e7405c61c44ef1b46464b1385c6a5c4f4fdc466b", + "layer29": "7e36f0a6e963eae0581040ac2b95cde35f8ee0118ea3cb6b961627e9d7154fd1", + "layer3": "a4f1204b59574af4082b5c7129350562dc074e1fce0dcf7b1bf3b205136b17a2", + "layer30": "fa3b6de067f9944ea54f94472444034b866d7198684bbe125b7828b6e69f795b", + "layer31": "69a05581ff31cb4aa0d0fe10d2c4035686cd240ea6e08702e6b0f665c4dbdf79", + "layer32": "2aca52a5afa6cc2fe6f312fe65e45cf076bc852a320618236db7e444a7af1ec7", + "layer33": "fc1ae9c4b0c5637a5a2becb05a102a824de02089597bfa33e9e8a7aa9ce09191", + "layer34": "d2c23b63ea53ccca726712977bdaec074e152b0fbb37993b743a7ba5d2135c70", + "layer35": "c097b0af8b2a93629d292cd01a69fde34f1439e161a2148d35fda850cc6373f3", + "layer36": "b8fb8d2d5d7d688e590e2f80a2e6618c0d3a38924b849a6209fe660454f8a3db", + "layer37": "2539f8fcfd1d8d21ddd740eeb4326a35b354d090dd2aa11db9e713ae7f6d135a", + "layer38": "5b99d0c25a04a03529213cd2a01735ef47ab6298d2446b79efff97180fa8fcac", + "layer39": "4db2c247e4c1e723c65ae1211c7a6dceb8c7d25b966e653b4c5bb86025de2366", + "layer4": "e615253cb3f9caa31ad4cf605e29ecf632bafd30b3f881a380c0c6749c3d24b9", + "layer40": "7ac219d9dd660a2dadfc782778a624ad2572a32b97011b3273c91c978505c27d", + "layer41": "65b39bd03748da4e93434917ffc1a8754c828bc977d2feb1f942d34d65e17df3", + "layer42": "688694106045c73b4e3aeeaf3affb681dd7338b6b9d4e5de8a667debfa66f639", + "layer43": "14033b7eaf6955dac46b5298f066f0c363cbf627560ac00c91a07cd259aee001", + "layer44": "9c7a1cc083a0bc562fa67a6ee9ab623bec1cef087d25b1cf7807296072cae035", + "layer45": "7c3d922519f492c5a4c8fa475579d98a79913d75117244d2f49cae6a70d5c4a7", + "layer46": "9c1cd3bfa0830fbabd6ed33b4dabbe4d7c13ba347bb73e28a3926462d8e11911", + "layer47": "90d05bb1ad0d1194a9611cf7da60513204e9326e0e9381617ddfcca9b7404ce4", + "layer5": "a9f1b4bbd53a34a5f400c931bbb3b3963024ab90fd8c20da0bc30df64c5e0d3f", + "layer6": "8dd2a6a84d43ab22d206c63c6c2eeca496cd7eb0ea98229957878a4de9c46571", + "layer7": "9a1c29c45835f052080433c01a0fc530e8aa12b43b27f96a75adc056ba37cac2", + "layer8": "be5a6f96b349c962e7a301517e30dc1df70120cf0182e9129078f10e7ea5a6a2", + "layer9": "b36971c8aae515654eb9ab493bf74625fa67ff4bacfe71401817f66ef1e1fa75" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "reload/p1024-b4-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "reload/p1024-b4-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "302ec348a85adbcdebc6420319567e8e0e5fa9b9538e3fe963606dacbc3fe670", + "layer0": "5a7291fa69d4f1211a2e703257191a70e5a204e80ec4a7e42add420e215b596c", + "layer1": "bc0baaa404ee0b080881428af9cbd9c4d5bbae8c8abc4955d7fa0f52e8374cb2", + "layer10": "ee34fb954744aa032e6eb97b2041e3a86511534f4b2d5d1ac045a1474c0a88e3", + "layer11": "a8bc69884ce864ad88e56801a83746dd1d4f9df6e93ee128eb2b4c2fafbe6890", + "layer12": "487a16c34a62247221a11b367d1e9319e6a4ea08be7faf79efc83ce0dfe54f44", + "layer13": "a30e0d8ce8b71c2d33a9a54f9a80a727c1f21c23220d4dac81f9ae30b94b45b8", + "layer14": "ace5db1cfd15f3f6c243a70c9c80188838c54d22fa7dffaff9400ba3f6e370c5", + "layer15": "89a41362ba8432590b90c69201e3f604b248ce2d0f875640a8317a6d174f00ad", + "layer16": "a6df8500be57a086a3a45d57382f5b72a8460fc7fad3ffdda1de59d76e7ca7be", + "layer17": "9a870e5a1788047323230b3cf1469f9c504764f4adcca0ec284e6a1b45ec4f8e", + "layer18": "36c01c9abed357afa0ce79a8fb0b19e791ee579f0fd828150750f0553d3cb044", + "layer19": "74e5bc2ff5dc463a440536499e822430453fdfe275495bfa6e590d66cd0f32ab", + "layer2": "de005f416150c3303482f04da51ae032fe2c4d5be9fe9470a2044b26cc226f09", + "layer20": "61204d1b812523da6047d7929e7288e063f65a501e4742a1dc7d6118502df37c", + "layer21": "68b20722225ee59b2e3886ee153b4429108758aceedf819a998ef10119ff64d9", + "layer22": "0608a11b4776a2bef1c9bbcd1f6d3478263c5eedd1fac78b074aefa3eae1f02c", + "layer23": "31b4582ae4fbcf787698e81f17bf8bef8379cbd24b0aa17f31850169a92432a8", + "layer24": "e4e7e51a3e595781486870016e36b7183c257ac62fe9deb7456a007acd46ea1c", + "layer25": "519883c0a80c5b7b328e4bd1abc5c84c439e451aee099665befcf9f40ee8477f", + "layer26": "ef0aca5ece89d7d384cc00490fea822597de24ae78e4df5429aa0f77972bcf40", + "layer27": "31e50d5b8f648636c372a9beb5d1af11bd66a8958ac6a71b66fc8028bdaffa5e", + "layer28": "9b93b3d1acad7221c01f88fb09d4b83e1ebb4bea21c6104414386541f6e7fdbd", + "layer29": "31e68c183ec52e62c707cec980d3f5661049966e3a4a906967f528c481aa6d1b", + "layer3": "c61a8d3c691ac7acb635e2e98b9ade83d03a47d09e7bd1370dbacd431e93d219", + "layer30": "dcdddff9688278aa67235d2b70f5d011779a392230bba2cd6f7070826552e9bc", + "layer31": "6caa901cff50655215b44503a7176addd527c9b918456d1e7bbaeab19513b09c", + "layer32": "34f03fda69153ab04197cac049cef164005f37ef881c784169f25609c9b3e4ff", + "layer33": "4a51ad9fd668c2887ebf10a24b8213eb3f3b4e6b296552446109bf952f9b3f0a", + "layer34": "ac1a24d9daaa0e31e856af0b6690643ddf2f4906ef44bac9de84ca8c10035684", + "layer35": "ea1ffb9dce3bd2aa9736d910b9c208be5968972d7b827ec81189acff2dab893d", + "layer36": "34b7baad0a83838f496d905d58246e9b8221a204ceffeb73ca47d34eb253c9a5", + "layer37": "eab8be8493f17348147ec8f9e0a420b96a690807b7194052efbfeaef39574ec9", + "layer38": "122a54016e8457d867a9268e51065e700e088852094b9e5666cd6b1ffd6fd47c", + "layer39": "93f9a1b6750c2630051f4a434a37780704cc97e4c7020b78cbf61af20d2f8509", + "layer4": "86d032eea933cda1ece710e470ccd0697a19c4d986b84b4beb96e4ba6ccef0e9", + "layer40": "e18067baca7152102a15ce36bceb80fc36030415d35d2e8e60a6307c5669fb7c", + "layer41": "0b0349b0a9e267e1a706035cabbce695f2bc7ca6a7bbbc20533510f49f450835", + "layer42": "f19a1554871560959d17974c5e162d5ae48d3e868ef02d0a34f0ff4287cd68bd", + "layer43": "d0c317402b6720bd56b24a82cb7f6c456946fb812a025d649a5008223f17787c", + "layer44": "b0a5dfd3963a0a808ba11ee21d87eedfb6ec466f99c0e75e4e91d41c15fbc58a", + "layer45": "c63622532152de15d9d8812d10e600a711d1c579c12a9bffd594833ab7455b24", + "layer46": "4dfe34632fdb9515a8227387a216686dbcecc703d99707c89765cfda31e75341", + "layer47": "173fd1a043a64f85ea1e3c1227518e824adaa247ed7914dbb19a30d7875bcb6b", + "layer5": "315184befd2cf3a8028dfae0b41aa45322c3436de0bf22cfcf5effbc0424d732", + "layer6": "8b302a50641b12352603c871735f24558987588ee86d65cc3c477c3fcc8bdb94", + "layer7": "a9c8115b07ae56e0d48e2dc117d29ac93701323b5c5fcf0502bab134b671e3af", + "layer8": "a7f4b357b2ff28cf22c00fb70e103370809dab4d59d2cd1ab3ced9630b45ca64", + "layer9": "adff84c8c8f6da3fee4bf00128359f9daa12d4990a2f8a8a32bb9c3f8f944063" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "reload/p1024-b4-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "reload/p1024-b4-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "302ec348a85adbcdebc6420319567e8e0e5fa9b9538e3fe963606dacbc3fe670", + "layer0": "5a7291fa69d4f1211a2e703257191a70e5a204e80ec4a7e42add420e215b596c", + "layer1": "bc0baaa404ee0b080881428af9cbd9c4d5bbae8c8abc4955d7fa0f52e8374cb2", + "layer10": "ee34fb954744aa032e6eb97b2041e3a86511534f4b2d5d1ac045a1474c0a88e3", + "layer11": "a8bc69884ce864ad88e56801a83746dd1d4f9df6e93ee128eb2b4c2fafbe6890", + "layer12": "487a16c34a62247221a11b367d1e9319e6a4ea08be7faf79efc83ce0dfe54f44", + "layer13": "a30e0d8ce8b71c2d33a9a54f9a80a727c1f21c23220d4dac81f9ae30b94b45b8", + "layer14": "ace5db1cfd15f3f6c243a70c9c80188838c54d22fa7dffaff9400ba3f6e370c5", + "layer15": "89a41362ba8432590b90c69201e3f604b248ce2d0f875640a8317a6d174f00ad", + "layer16": "a6df8500be57a086a3a45d57382f5b72a8460fc7fad3ffdda1de59d76e7ca7be", + "layer17": "9a870e5a1788047323230b3cf1469f9c504764f4adcca0ec284e6a1b45ec4f8e", + "layer18": "36c01c9abed357afa0ce79a8fb0b19e791ee579f0fd828150750f0553d3cb044", + "layer19": "74e5bc2ff5dc463a440536499e822430453fdfe275495bfa6e590d66cd0f32ab", + "layer2": "de005f416150c3303482f04da51ae032fe2c4d5be9fe9470a2044b26cc226f09", + "layer20": "61204d1b812523da6047d7929e7288e063f65a501e4742a1dc7d6118502df37c", + "layer21": "68b20722225ee59b2e3886ee153b4429108758aceedf819a998ef10119ff64d9", + "layer22": "0608a11b4776a2bef1c9bbcd1f6d3478263c5eedd1fac78b074aefa3eae1f02c", + "layer23": "31b4582ae4fbcf787698e81f17bf8bef8379cbd24b0aa17f31850169a92432a8", + "layer24": "e4e7e51a3e595781486870016e36b7183c257ac62fe9deb7456a007acd46ea1c", + "layer25": "519883c0a80c5b7b328e4bd1abc5c84c439e451aee099665befcf9f40ee8477f", + "layer26": "ef0aca5ece89d7d384cc00490fea822597de24ae78e4df5429aa0f77972bcf40", + "layer27": "31e50d5b8f648636c372a9beb5d1af11bd66a8958ac6a71b66fc8028bdaffa5e", + "layer28": "9b93b3d1acad7221c01f88fb09d4b83e1ebb4bea21c6104414386541f6e7fdbd", + "layer29": "31e68c183ec52e62c707cec980d3f5661049966e3a4a906967f528c481aa6d1b", + "layer3": "c61a8d3c691ac7acb635e2e98b9ade83d03a47d09e7bd1370dbacd431e93d219", + "layer30": "dcdddff9688278aa67235d2b70f5d011779a392230bba2cd6f7070826552e9bc", + "layer31": "6caa901cff50655215b44503a7176addd527c9b918456d1e7bbaeab19513b09c", + "layer32": "34f03fda69153ab04197cac049cef164005f37ef881c784169f25609c9b3e4ff", + "layer33": "4a51ad9fd668c2887ebf10a24b8213eb3f3b4e6b296552446109bf952f9b3f0a", + "layer34": "ac1a24d9daaa0e31e856af0b6690643ddf2f4906ef44bac9de84ca8c10035684", + "layer35": "ea1ffb9dce3bd2aa9736d910b9c208be5968972d7b827ec81189acff2dab893d", + "layer36": "34b7baad0a83838f496d905d58246e9b8221a204ceffeb73ca47d34eb253c9a5", + "layer37": "eab8be8493f17348147ec8f9e0a420b96a690807b7194052efbfeaef39574ec9", + "layer38": "122a54016e8457d867a9268e51065e700e088852094b9e5666cd6b1ffd6fd47c", + "layer39": "93f9a1b6750c2630051f4a434a37780704cc97e4c7020b78cbf61af20d2f8509", + "layer4": "86d032eea933cda1ece710e470ccd0697a19c4d986b84b4beb96e4ba6ccef0e9", + "layer40": "e18067baca7152102a15ce36bceb80fc36030415d35d2e8e60a6307c5669fb7c", + "layer41": "0b0349b0a9e267e1a706035cabbce695f2bc7ca6a7bbbc20533510f49f450835", + "layer42": "f19a1554871560959d17974c5e162d5ae48d3e868ef02d0a34f0ff4287cd68bd", + "layer43": "d0c317402b6720bd56b24a82cb7f6c456946fb812a025d649a5008223f17787c", + "layer44": "b0a5dfd3963a0a808ba11ee21d87eedfb6ec466f99c0e75e4e91d41c15fbc58a", + "layer45": "c63622532152de15d9d8812d10e600a711d1c579c12a9bffd594833ab7455b24", + "layer46": "4dfe34632fdb9515a8227387a216686dbcecc703d99707c89765cfda31e75341", + "layer47": "173fd1a043a64f85ea1e3c1227518e824adaa247ed7914dbb19a30d7875bcb6b", + "layer5": "315184befd2cf3a8028dfae0b41aa45322c3436de0bf22cfcf5effbc0424d732", + "layer6": "8b302a50641b12352603c871735f24558987588ee86d65cc3c477c3fcc8bdb94", + "layer7": "a9c8115b07ae56e0d48e2dc117d29ac93701323b5c5fcf0502bab134b671e3af", + "layer8": "a7f4b357b2ff28cf22c00fb70e103370809dab4d59d2cd1ab3ced9630b45ca64", + "layer9": "adff84c8c8f6da3fee4bf00128359f9daa12d4990a2f8a8a32bb9c3f8f944063" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "update1/p0008-b1-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "update1/p0008-b1-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "e2295f95b6c39e63fc9c01ea5b2c23f0c5d4ae7e6a54e29a16cbf0a7c4e4e185", + "layer0": "a5d9678c6dfefa9adabe750a098af221427ac5ef812cc8a7848b8b958e5f5a49", + "layer1": "a796c8918462ed6cf65feaadea859eff4b19f8eb854549b7390011fbef4dba5a", + "layer10": "21be778a9c9c23f0cf58c0c05185ed952d43bafb2113bed4698a5f15ce4d5ee3", + "layer11": "a63969496b5aa0a2f35a4242138394da493b32a2efb972ce69aa341045ec0f1a", + "layer12": "b5b3ddc7bcf738ea5c1e6a33388df6458c665650d187d4a477c90a9179f6deb3", + "layer13": "dcab632b69a73e66603049159bba4acb7900dc9f0af64521dc8c5c9150b24296", + "layer14": "84fb2114e20621ca1713ce1d104dff56d511f45af14965355a31846babd2da33", + "layer15": "3e1ca35f2e1323551d3aaac8325f94081334d1d1b06fab74989ad1b6abd92bf3", + "layer16": "2341347e070e266483e0c083522096f569821c74c8cee755b12fc80bcf3b1e9e", + "layer17": "61a4be7e7b0b2e80b943c6522b16915054cd3b495b17569cdcc28ec034909b95", + "layer18": "df3f0b40ee2c63e3b6b839d816589332c27707de2b8de797e270502d81a55b28", + "layer19": "bb6f4ce59923c559878f9c04138839ce219290038a3f2e1a3e95b014aee0de4e", + "layer2": "a21b5e973dac170679d0963ca3bce73ec0f51272ce37f1eb2fb7518fb6a9fab1", + "layer20": "48fde67f92bdaec59e27603dba4653466ed38ff0313c962f6ab7e4e9471caed5", + "layer21": "bc1e748742dacf3bde21955d0a3c94489bb11f4d45a2cd7d76f5121be65a8d19", + "layer22": "f4e8407f69b0c6ee5408386b3a35a22bf1544b675747de3150461b691526b5f8", + "layer23": "3b546987df4780aa06cfbc108a4dbd603dd8682aa6338079aba448741b48a088", + "layer24": "4384c2f3457b9ec13b458d7c8a1426d9996f56442da242091b1fca7e1662b5ea", + "layer25": "e4933526ab7ece2dbf4187c6313e8448b56ca56b60a8a69fe5ec32099c0523d1", + "layer26": "1f7ea7fe090fc04b1a91c6d8d26fef02b48c96a0a2c43bbfdba912d4ea8a91a3", + "layer27": "50508542a73d2a530ea56fdfb7f5580bdc1cc439291f0147c68f9ffa14a10d91", + "layer28": "12318112448b2cc73268f003fb31c8cd31bc2120197acaee6daf975f3361de15", + "layer29": "6f76161937530bf20d21b8574b01454d1d9bbc5b1816ca750e870afe0b032582", + "layer3": "1c40578ee2be28eaf4aa26c5070eef6fadb0b67d2ea5706df1e01d60c983b746", + "layer30": "e61e19bb21ca2ef832f08d1587274ebdb77f095b94b43c9b1c94186cef27b5c9", + "layer31": "637776d49d871b6d98f36e64ec2f8a527f122a4ad3f278493b2cecde8d29c95f", + "layer32": "e9eaa28badd91f31254f356dd02cb3c5872edbf705689d26524a97d27f8b97d6", + "layer33": "cc485672b502f866fcb395eacef42e004a214435f90bf91eca7a953f9de2b943", + "layer34": "0e9aaa571d2548d4f185ac95d120ade70ef40f37aa559d51187309bcd097f3ef", + "layer35": "ecc193d7c1d1ceab3b523c9c3b11d9bcc64b49d9d9f40cfac1bf977fce4c955d", + "layer36": "a4357d3a01fe762b8c6359b9db9390a7c2fbfbd79c09a2f02b84847ce5a3e434", + "layer37": "3dcf286cf9853328a72d92cff2c203be9c0e75373fe5d363254107be74b06365", + "layer38": "1a1db18cab4a84411726aabbd3d75ff0929fab60e9b2be90ba7adf861cf11a91", + "layer39": "f7a13cd9e1416fd1df409a4a28652736e964ca3989879eb48c2a04810100bca0", + "layer4": "c609dd0b7b4d1f5702a42849f1e1d95baba9973a6bd7353bfa7c65f4e84d5d14", + "layer40": "4d06129753286284933e57610137d818663461a5517985fe0947def6e46f28c4", + "layer41": "dcc1c083af533d041dda0210fd555e5398f07ff2e42696865ace314ecd98efc6", + "layer42": "090adfe85dbc55f7f132ecfa29f57a24d78845d8dbdd7de82a102cd58887b318", + "layer43": "6c0829423faec331a45d8aca18865c726e797f97fbcaec5aea41ecfccb20304d", + "layer44": "4ae999aa88a50c1015fab984217e2336579e39cd794479e73c8df9204c6d64a9", + "layer45": "79b62554fc385ac51a0a182a10cb1d8286eecb26d26e5c3f6bf711c0a991ec85", + "layer46": "e9488173a843c9f33365873f1122dbd4b60e47f2c390c64bcbe43f2b663a99e1", + "layer47": "51e6dbb88c86486f321d1587bc3b81fa65836e7638e66189c2707316b4ef8ed1", + "layer5": "839fc7b7a45bc3c58c39b59150831d4cf2ba10fb3732b9a32f24b9ccc081fd21", + "layer6": "fdf4c8b25510af36ada654cdadbc83ea7e9a282f167158c1de0e290cf1013900", + "layer7": "24990b4bc4b9d040cad0250418354ada93506ed2c7e87e68222518e24a25495e", + "layer8": "602d2ab6c192e49f6db357f3ddd933e5e545cbb880e064fbc60cb2aca638d978", + "layer9": "2a46d413461312f2cc344f4c73837659bdf533cc99adcb1076e3d6b824fb64d3" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "update1/p0008-b1-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "update1/p0008-b1-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "e2295f95b6c39e63fc9c01ea5b2c23f0c5d4ae7e6a54e29a16cbf0a7c4e4e185", + "layer0": "a5d9678c6dfefa9adabe750a098af221427ac5ef812cc8a7848b8b958e5f5a49", + "layer1": "a796c8918462ed6cf65feaadea859eff4b19f8eb854549b7390011fbef4dba5a", + "layer10": "21be778a9c9c23f0cf58c0c05185ed952d43bafb2113bed4698a5f15ce4d5ee3", + "layer11": "a63969496b5aa0a2f35a4242138394da493b32a2efb972ce69aa341045ec0f1a", + "layer12": "b5b3ddc7bcf738ea5c1e6a33388df6458c665650d187d4a477c90a9179f6deb3", + "layer13": "dcab632b69a73e66603049159bba4acb7900dc9f0af64521dc8c5c9150b24296", + "layer14": "84fb2114e20621ca1713ce1d104dff56d511f45af14965355a31846babd2da33", + "layer15": "3e1ca35f2e1323551d3aaac8325f94081334d1d1b06fab74989ad1b6abd92bf3", + "layer16": "2341347e070e266483e0c083522096f569821c74c8cee755b12fc80bcf3b1e9e", + "layer17": "61a4be7e7b0b2e80b943c6522b16915054cd3b495b17569cdcc28ec034909b95", + "layer18": "df3f0b40ee2c63e3b6b839d816589332c27707de2b8de797e270502d81a55b28", + "layer19": "bb6f4ce59923c559878f9c04138839ce219290038a3f2e1a3e95b014aee0de4e", + "layer2": "a21b5e973dac170679d0963ca3bce73ec0f51272ce37f1eb2fb7518fb6a9fab1", + "layer20": "48fde67f92bdaec59e27603dba4653466ed38ff0313c962f6ab7e4e9471caed5", + "layer21": "bc1e748742dacf3bde21955d0a3c94489bb11f4d45a2cd7d76f5121be65a8d19", + "layer22": "f4e8407f69b0c6ee5408386b3a35a22bf1544b675747de3150461b691526b5f8", + "layer23": "3b546987df4780aa06cfbc108a4dbd603dd8682aa6338079aba448741b48a088", + "layer24": "4384c2f3457b9ec13b458d7c8a1426d9996f56442da242091b1fca7e1662b5ea", + "layer25": "e4933526ab7ece2dbf4187c6313e8448b56ca56b60a8a69fe5ec32099c0523d1", + "layer26": "1f7ea7fe090fc04b1a91c6d8d26fef02b48c96a0a2c43bbfdba912d4ea8a91a3", + "layer27": "50508542a73d2a530ea56fdfb7f5580bdc1cc439291f0147c68f9ffa14a10d91", + "layer28": "12318112448b2cc73268f003fb31c8cd31bc2120197acaee6daf975f3361de15", + "layer29": "6f76161937530bf20d21b8574b01454d1d9bbc5b1816ca750e870afe0b032582", + "layer3": "1c40578ee2be28eaf4aa26c5070eef6fadb0b67d2ea5706df1e01d60c983b746", + "layer30": "e61e19bb21ca2ef832f08d1587274ebdb77f095b94b43c9b1c94186cef27b5c9", + "layer31": "637776d49d871b6d98f36e64ec2f8a527f122a4ad3f278493b2cecde8d29c95f", + "layer32": "e9eaa28badd91f31254f356dd02cb3c5872edbf705689d26524a97d27f8b97d6", + "layer33": "cc485672b502f866fcb395eacef42e004a214435f90bf91eca7a953f9de2b943", + "layer34": "0e9aaa571d2548d4f185ac95d120ade70ef40f37aa559d51187309bcd097f3ef", + "layer35": "ecc193d7c1d1ceab3b523c9c3b11d9bcc64b49d9d9f40cfac1bf977fce4c955d", + "layer36": "a4357d3a01fe762b8c6359b9db9390a7c2fbfbd79c09a2f02b84847ce5a3e434", + "layer37": "3dcf286cf9853328a72d92cff2c203be9c0e75373fe5d363254107be74b06365", + "layer38": "1a1db18cab4a84411726aabbd3d75ff0929fab60e9b2be90ba7adf861cf11a91", + "layer39": "f7a13cd9e1416fd1df409a4a28652736e964ca3989879eb48c2a04810100bca0", + "layer4": "c609dd0b7b4d1f5702a42849f1e1d95baba9973a6bd7353bfa7c65f4e84d5d14", + "layer40": "4d06129753286284933e57610137d818663461a5517985fe0947def6e46f28c4", + "layer41": "dcc1c083af533d041dda0210fd555e5398f07ff2e42696865ace314ecd98efc6", + "layer42": "090adfe85dbc55f7f132ecfa29f57a24d78845d8dbdd7de82a102cd58887b318", + "layer43": "6c0829423faec331a45d8aca18865c726e797f97fbcaec5aea41ecfccb20304d", + "layer44": "4ae999aa88a50c1015fab984217e2336579e39cd794479e73c8df9204c6d64a9", + "layer45": "79b62554fc385ac51a0a182a10cb1d8286eecb26d26e5c3f6bf711c0a991ec85", + "layer46": "e9488173a843c9f33365873f1122dbd4b60e47f2c390c64bcbe43f2b663a99e1", + "layer47": "51e6dbb88c86486f321d1587bc3b81fa65836e7638e66189c2707316b4ef8ed1", + "layer5": "839fc7b7a45bc3c58c39b59150831d4cf2ba10fb3732b9a32f24b9ccc081fd21", + "layer6": "fdf4c8b25510af36ada654cdadbc83ea7e9a282f167158c1de0e290cf1013900", + "layer7": "24990b4bc4b9d040cad0250418354ada93506ed2c7e87e68222518e24a25495e", + "layer8": "602d2ab6c192e49f6db357f3ddd933e5e545cbb880e064fbc60cb2aca638d978", + "layer9": "2a46d413461312f2cc344f4c73837659bdf533cc99adcb1076e3d6b824fb64d3" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "update1/p0008-b4-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "update1/p0008-b4-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "9f2022a1c99772982f3a4081148cfb932305c92ac131c405c7202ab60923cef8", + "layer0": "fd9016092e089ff5cf0d51f73b114452fea181b922de2f79baabef4778f5b399", + "layer1": "ad2f4c502a4e41f03fd848fcf831e2c21a98a48d09db1ec55a49b9314aaa45be", + "layer10": "4d503704f61c890b956e5c9e7ef1a4c7fd2ffc37ed516d2383674ce958fc51fb", + "layer11": "a39379c9f2b02c3b0a8dfa3307fc0613dfbdc7072c95b13336a541e74e9f8811", + "layer12": "0066de5364eee6419979b221421f2d3ce2ad0fdb9575c434b62d4ecf12a9b9ef", + "layer13": "1ab2ea8f6a6034e9e5f45f63da8dca76499b746296e8e888766b6f820911f3ac", + "layer14": "417aff1d59193a7729caa7b49b5ea58e968e85482dde2b80495a2dc1169af8df", + "layer15": "9f432deda6bc81cac2346858afb474de795b094ee34a60c3df5c6cab671fa065", + "layer16": "6db19132adf5f6f80adfcc26c3b77e21b3dea9e283e746ad9a4d65faa15ca86c", + "layer17": "b2285e83cde50743b2a241b0c8f4e53a24ea32b98fa72db43cd9535003c75363", + "layer18": "a4f28caea3f30c74becfcd728e90c4ae77568bfafa4e33be386104d64fdd839f", + "layer19": "e5fc1e52124f9f6a97848fb73da1ef35c901e345f8cfa2fcdf55be503bfa051e", + "layer2": "0587825f24c9c55ca716d18f2cfc2d38ec0755d51971d98353a304e08fd7f547", + "layer20": "2c2469255acbfe5c942be25766580cd504421a1fd54b9037fe53f4ec84619143", + "layer21": "cfb889f8b67c7b6bdb2a42568d29ec61d824f18bed8b4e6cd14549d273c3765f", + "layer22": "87155409a65d402414a18d663b655bdbe739401aa7270f826a4af6695f29c37c", + "layer23": "7b5e3cedc9608a2dfb9fa1afb37e146380027213133ed339333c79cb1313e796", + "layer24": "0881648b863e1129460312dc2383110302f2ed542bffc66edc8ccf67bb28ccac", + "layer25": "9fbdb932e61f3e6fb19c3a1b1ddc7fc6f74afbcab2ba44f9f42985a339066467", + "layer26": "867d8716d78629fb7a666b7c2aa8bdc57b22ba2c2365c7c1e3884069edab19ad", + "layer27": "62d9ba50092f778eb60a7e7043949c7093f08e61d5afaace68de9af6f9717f0d", + "layer28": "90e79712385fd4589d625a082407adca5e903d3affac23948a84533381dc50c4", + "layer29": "c39b71af827ad1cc2f019767ddc86a5cd16f06d8bcc023b34889486bff482feb", + "layer3": "d345ebb7ae955d07346a4c2a80e65158411c487cf3a1cb80271e01a25867625a", + "layer30": "4ae4c0bacf57b2e4e6ad206361c2c8e92abdcecb0b8e447c2a3972c40788acf3", + "layer31": "b24f163cc48b89c163c0e495c8266f7125327c111ac80b4ec912f66c23f91436", + "layer32": "d02114dfd036a30115a603ff532df5444348f79a5c878c6ee47ed7a36e3e4556", + "layer33": "0aad83701682459656991383ff30708cb366dff5bb6b09be1932791925fb1515", + "layer34": "d4f75a56328e9e6f0b564ddbebd7b57d7f5f808d32835f8465e66d5a41563bd6", + "layer35": "a602b9219c38177fc837fe7cfc4c3f3eeefb1df479f170c5e30491313359796f", + "layer36": "69d93d94cf8e3e74e5bcd49fb41372bf2fab788694cbaabb647a31d1090d858f", + "layer37": "80270dc32c848ee98f27cda06ba67fc47ea956181f6ab55534d276a164dd3ded", + "layer38": "9aa00aaf8fd84dd607ad94eae74898e2de1c8facf80fc90547424e85888ab907", + "layer39": "9faa35a7b1774b95244d9b65258655a2c06738b4c9d4d1daf28159c04d6a7f84", + "layer4": "7cfb07c996eb1a00d3967313a4242255226b9afb4536d49cb2a0067847be054d", + "layer40": "4e84604fe8a190b108c730ddc6d7115b1c431d342247f33f428abf5db4d1d0cc", + "layer41": "e1258bf2522f20e0c939fdf914d5074f456a29ffed7c9a04a037e6b3939c6ecc", + "layer42": "56bfada41c26db7f7551eee6b858783ea946749b1c67f2f3be664f4b201d47bc", + "layer43": "b6a895583865b8d3416476b4142ab317491cd0b9e9e0b13580ee916a093b58d0", + "layer44": "a600d0d4c1b46ef999280ded7514928ad2f17ec00b78aa207c1994e70b0f381a", + "layer45": "a4839a6b5e7d15e38d989c433d2ae20eee9eee5890114bd98f06d839f719a83d", + "layer46": "bdbea74d807c05e124b34183c5a6e380668b427a601735ef5b4855e5b9bcc2e7", + "layer47": "75911e93e6476379324cfbd93469d747828def43a9febceb8afd0a4b8c0ab2b1", + "layer5": "f6b67be7ba92b2473f32cfca56a02cd982ab6f9a35f5b96031a9ad2da07d90ab", + "layer6": "097e2fe29489ade9fe0a12ef00e1674af231242428002fc7c0b9819e33e4d357", + "layer7": "4638c49bec79d66ce105634af29fca0c2a78311a9a0b059a37e3c9757b7ef038", + "layer8": "f88ccb8f347ddbdef172e9c96a714f5834ae7b557096756b34ad7e8d68d4a59d", + "layer9": "4746b5bfc7d9e059e4be24213915cb180c118cc30547711d3e99cdef09eee272" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "update1/p0008-b4-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "update1/p0008-b4-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "9f2022a1c99772982f3a4081148cfb932305c92ac131c405c7202ab60923cef8", + "layer0": "fd9016092e089ff5cf0d51f73b114452fea181b922de2f79baabef4778f5b399", + "layer1": "ad2f4c502a4e41f03fd848fcf831e2c21a98a48d09db1ec55a49b9314aaa45be", + "layer10": "4d503704f61c890b956e5c9e7ef1a4c7fd2ffc37ed516d2383674ce958fc51fb", + "layer11": "a39379c9f2b02c3b0a8dfa3307fc0613dfbdc7072c95b13336a541e74e9f8811", + "layer12": "0066de5364eee6419979b221421f2d3ce2ad0fdb9575c434b62d4ecf12a9b9ef", + "layer13": "1ab2ea8f6a6034e9e5f45f63da8dca76499b746296e8e888766b6f820911f3ac", + "layer14": "417aff1d59193a7729caa7b49b5ea58e968e85482dde2b80495a2dc1169af8df", + "layer15": "9f432deda6bc81cac2346858afb474de795b094ee34a60c3df5c6cab671fa065", + "layer16": "6db19132adf5f6f80adfcc26c3b77e21b3dea9e283e746ad9a4d65faa15ca86c", + "layer17": "b2285e83cde50743b2a241b0c8f4e53a24ea32b98fa72db43cd9535003c75363", + "layer18": "a4f28caea3f30c74becfcd728e90c4ae77568bfafa4e33be386104d64fdd839f", + "layer19": "e5fc1e52124f9f6a97848fb73da1ef35c901e345f8cfa2fcdf55be503bfa051e", + "layer2": "0587825f24c9c55ca716d18f2cfc2d38ec0755d51971d98353a304e08fd7f547", + "layer20": "2c2469255acbfe5c942be25766580cd504421a1fd54b9037fe53f4ec84619143", + "layer21": "cfb889f8b67c7b6bdb2a42568d29ec61d824f18bed8b4e6cd14549d273c3765f", + "layer22": "87155409a65d402414a18d663b655bdbe739401aa7270f826a4af6695f29c37c", + "layer23": "7b5e3cedc9608a2dfb9fa1afb37e146380027213133ed339333c79cb1313e796", + "layer24": "0881648b863e1129460312dc2383110302f2ed542bffc66edc8ccf67bb28ccac", + "layer25": "9fbdb932e61f3e6fb19c3a1b1ddc7fc6f74afbcab2ba44f9f42985a339066467", + "layer26": "867d8716d78629fb7a666b7c2aa8bdc57b22ba2c2365c7c1e3884069edab19ad", + "layer27": "62d9ba50092f778eb60a7e7043949c7093f08e61d5afaace68de9af6f9717f0d", + "layer28": "90e79712385fd4589d625a082407adca5e903d3affac23948a84533381dc50c4", + "layer29": "c39b71af827ad1cc2f019767ddc86a5cd16f06d8bcc023b34889486bff482feb", + "layer3": "d345ebb7ae955d07346a4c2a80e65158411c487cf3a1cb80271e01a25867625a", + "layer30": "4ae4c0bacf57b2e4e6ad206361c2c8e92abdcecb0b8e447c2a3972c40788acf3", + "layer31": "b24f163cc48b89c163c0e495c8266f7125327c111ac80b4ec912f66c23f91436", + "layer32": "d02114dfd036a30115a603ff532df5444348f79a5c878c6ee47ed7a36e3e4556", + "layer33": "0aad83701682459656991383ff30708cb366dff5bb6b09be1932791925fb1515", + "layer34": "d4f75a56328e9e6f0b564ddbebd7b57d7f5f808d32835f8465e66d5a41563bd6", + "layer35": "a602b9219c38177fc837fe7cfc4c3f3eeefb1df479f170c5e30491313359796f", + "layer36": "69d93d94cf8e3e74e5bcd49fb41372bf2fab788694cbaabb647a31d1090d858f", + "layer37": "80270dc32c848ee98f27cda06ba67fc47ea956181f6ab55534d276a164dd3ded", + "layer38": "9aa00aaf8fd84dd607ad94eae74898e2de1c8facf80fc90547424e85888ab907", + "layer39": "9faa35a7b1774b95244d9b65258655a2c06738b4c9d4d1daf28159c04d6a7f84", + "layer4": "7cfb07c996eb1a00d3967313a4242255226b9afb4536d49cb2a0067847be054d", + "layer40": "4e84604fe8a190b108c730ddc6d7115b1c431d342247f33f428abf5db4d1d0cc", + "layer41": "e1258bf2522f20e0c939fdf914d5074f456a29ffed7c9a04a037e6b3939c6ecc", + "layer42": "56bfada41c26db7f7551eee6b858783ea946749b1c67f2f3be664f4b201d47bc", + "layer43": "b6a895583865b8d3416476b4142ab317491cd0b9e9e0b13580ee916a093b58d0", + "layer44": "a600d0d4c1b46ef999280ded7514928ad2f17ec00b78aa207c1994e70b0f381a", + "layer45": "a4839a6b5e7d15e38d989c433d2ae20eee9eee5890114bd98f06d839f719a83d", + "layer46": "bdbea74d807c05e124b34183c5a6e380668b427a601735ef5b4855e5b9bcc2e7", + "layer47": "75911e93e6476379324cfbd93469d747828def43a9febceb8afd0a4b8c0ab2b1", + "layer5": "f6b67be7ba92b2473f32cfca56a02cd982ab6f9a35f5b96031a9ad2da07d90ab", + "layer6": "097e2fe29489ade9fe0a12ef00e1674af231242428002fc7c0b9819e33e4d357", + "layer7": "4638c49bec79d66ce105634af29fca0c2a78311a9a0b059a37e3c9757b7ef038", + "layer8": "f88ccb8f347ddbdef172e9c96a714f5834ae7b557096756b34ad7e8d68d4a59d", + "layer9": "4746b5bfc7d9e059e4be24213915cb180c118cc30547711d3e99cdef09eee272" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "update1/p0064-b1-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "update1/p0064-b1-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "add1f270ea5965fef16e8fdd87cb37646ff2b7e742475987d8b3b4b2ce9e10aa", + "layer0": "8777906adcdb0c6d0fbf2cd31ca2b3790e4352a861c35d850335bb12d6db1cb9", + "layer1": "a4d320a33e4c50775c876eb83d0c922cebb7fa3f2518956c9b8604da70e528c7", + "layer10": "8e15c05f069faf53937946385bae59a6dcfff1e3c7cf83e4cf1e7d98900ba5ef", + "layer11": "8f3ee5ba2f7c13305c5cd164f5f6337c97443a9013761bd5efab7a2577ca0bb9", + "layer12": "9938702de288b5c6a2dff2f046eb614fe31555c8d447389559f45eca939d4728", + "layer13": "a2c34a18bd2894b8eba911e3b2157561490479d01a737c0ccdd3dc913cae7715", + "layer14": "1f8480fcde13ce9eefd9f73b953bbff373652dce737bb8ca14ea355e94be4bcd", + "layer15": "7e9c8b9259f4c4f5e7f31461ef61bea4b95e5ef199ad88e40c41b54a9f6861ce", + "layer16": "58a5ebb53bc7576c70834599adc429a92a84efb306b234f05fbd0f6a98227975", + "layer17": "4d49e751319d1a6e5dba067d7d7fb264a059500e138efe49eb6ffb96bf38340e", + "layer18": "1097ceb63ec557855951f536adcb66e6570cd5474db7383f8ff5a630a4c6ceaa", + "layer19": "ade8f2753da83734fcfe241a1fa28145063a7d9bd9b9bf295406d48a4cc07fd0", + "layer2": "5aae714680124244bef7beab715aee3bf74d16dd839d02cf360e23cb74745e19", + "layer20": "91b672fb7567a3fa275d74792df53cc729d22ad51e39235d4397b4b33534d8ca", + "layer21": "396edc67fd0c82c6d7dc51a4c22b347868804f3fa4989758f45111e2e34458a7", + "layer22": "3d27e50bfb25f3b2f3b31d5ec7deb6e6bd3acb4d49fc7bd8815d21caed988b16", + "layer23": "107594e55beedc960c515bf9ea756e4fd1b35371a6361d93da8e8eff7ee6d87c", + "layer24": "90c10fcb3ac5f818d3655b7c8d76231af6deeb53e4105d229664dc0bcd375028", + "layer25": "4dff207c9fd9ae746138f401dabb0976f1ff41a9c3f652a64e221b0b074c703f", + "layer26": "f5fc21f867451b168ebac8f0c861d9534c10e97306271136da1551ff05b62a0c", + "layer27": "2cd1b25dffb3c1686b896041165f53678976606af348b9f92a5c3d84a52cf2eb", + "layer28": "285f475ff941f1277488ad0246b1e999c65cd9dbde8429b724df4e21f80f90c8", + "layer29": "5187ea85da6a386d0178677db7ba32a696e3eb6177e9dcef85d91e01ac4e49b2", + "layer3": "2dd008c19ca466d8106d4d560626aad2c584c21e5535d58609ecc9408a47bfdf", + "layer30": "8c9367ead82fd4d2c71d5b98fc0bf40660f791b305b2709ef448d42e49477d7c", + "layer31": "ee6d7590dbea966e404277d06f00458f94888f8a4ceec113b2827a6c70b0f505", + "layer32": "585a729d3ff42c0f7a8a68f072cdef8ece97c1f4e5064c2ffb116758dfc1e56a", + "layer33": "601f27f1c7efeb091222eaa868a7482e566e3bc080a2408aa873dd4a10f20bcd", + "layer34": "3dcb8795fd79b45d6d64172e3dd142ce9d98be14b71957a53f1cd45e809db73a", + "layer35": "18cf70830e5267be3848760a35fef16f77af791c2d759085245f42f65b855acf", + "layer36": "4524a189086ca20ac47ed79e03b77bbbed048c6059601af9969cb4807c1a895b", + "layer37": "e7ded776955242f1d08d34e92d1e1558bc3295dc88f760821fe8980a3b9698ca", + "layer38": "0fb210313f68fbb85850f93a9db71378ac0c0450555738823029d372161d7df1", + "layer39": "810b9561c9ed0107a4cc6d8da16fb720df715906204afa7884915206b218937c", + "layer4": "d116b6d57068ee10d0881fa10163568215ed613df7e76952669dcfb541c42343", + "layer40": "9c0154b15c28ef7f0528d6ec68d82e55cdad888673efb8c8346c66433af1d497", + "layer41": "8b96986aab46d6f7db8dad2732728088272fad05ca15cf56a7ecfdc3d4ad5881", + "layer42": "3d6b595a94e742554fb8dba4bbf4264aecf52ab31ffdb4dbf4eaeb4c70c81a5f", + "layer43": "1f985f7c2263e375fe8755023aaae60724f48abeef35ecd2e08a901e9ee04c96", + "layer44": "5b43b5dfe92a4e35a7274f42270c2b0e2a2cc43c782a2339d11e7ffa1f436294", + "layer45": "c4dfd70493687759ab793700176cf609c224e19a62cfeadde4348cef619d898d", + "layer46": "77197f1fe90c7a3c580c8f93e584ff806479a6f8d4090a5702c31adaba79e409", + "layer47": "791b730384b61701fa5c809c1db7b7738f2fbd0c547450bcf66ba49850b03a73", + "layer5": "b76a5933c3737d1bdb57c555e3cfde76bbb3c5c2458592b617d88c27f2836156", + "layer6": "b9c9395c035cdb5b8d7789992fe6ae28412289e456731c58d81a4f955b78f9f0", + "layer7": "f236fe5f70a79462fa390ea69c9a393339d42a17297c33dd233b2c12f6c438f7", + "layer8": "27986a2efa2bb00bbf5d8d596ef9193c71936655c070347f9c5d40f7d6d3c337", + "layer9": "e260e56db1472e8927ee4d3885e3e8ee5052c58b3c705db84c0fbff06a79598a" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "update1/p0064-b1-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "update1/p0064-b1-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "add1f270ea5965fef16e8fdd87cb37646ff2b7e742475987d8b3b4b2ce9e10aa", + "layer0": "8777906adcdb0c6d0fbf2cd31ca2b3790e4352a861c35d850335bb12d6db1cb9", + "layer1": "a4d320a33e4c50775c876eb83d0c922cebb7fa3f2518956c9b8604da70e528c7", + "layer10": "8e15c05f069faf53937946385bae59a6dcfff1e3c7cf83e4cf1e7d98900ba5ef", + "layer11": "8f3ee5ba2f7c13305c5cd164f5f6337c97443a9013761bd5efab7a2577ca0bb9", + "layer12": "9938702de288b5c6a2dff2f046eb614fe31555c8d447389559f45eca939d4728", + "layer13": "a2c34a18bd2894b8eba911e3b2157561490479d01a737c0ccdd3dc913cae7715", + "layer14": "1f8480fcde13ce9eefd9f73b953bbff373652dce737bb8ca14ea355e94be4bcd", + "layer15": "7e9c8b9259f4c4f5e7f31461ef61bea4b95e5ef199ad88e40c41b54a9f6861ce", + "layer16": "58a5ebb53bc7576c70834599adc429a92a84efb306b234f05fbd0f6a98227975", + "layer17": "4d49e751319d1a6e5dba067d7d7fb264a059500e138efe49eb6ffb96bf38340e", + "layer18": "1097ceb63ec557855951f536adcb66e6570cd5474db7383f8ff5a630a4c6ceaa", + "layer19": "ade8f2753da83734fcfe241a1fa28145063a7d9bd9b9bf295406d48a4cc07fd0", + "layer2": "5aae714680124244bef7beab715aee3bf74d16dd839d02cf360e23cb74745e19", + "layer20": "91b672fb7567a3fa275d74792df53cc729d22ad51e39235d4397b4b33534d8ca", + "layer21": "396edc67fd0c82c6d7dc51a4c22b347868804f3fa4989758f45111e2e34458a7", + "layer22": "3d27e50bfb25f3b2f3b31d5ec7deb6e6bd3acb4d49fc7bd8815d21caed988b16", + "layer23": "107594e55beedc960c515bf9ea756e4fd1b35371a6361d93da8e8eff7ee6d87c", + "layer24": "90c10fcb3ac5f818d3655b7c8d76231af6deeb53e4105d229664dc0bcd375028", + "layer25": "4dff207c9fd9ae746138f401dabb0976f1ff41a9c3f652a64e221b0b074c703f", + "layer26": "f5fc21f867451b168ebac8f0c861d9534c10e97306271136da1551ff05b62a0c", + "layer27": "2cd1b25dffb3c1686b896041165f53678976606af348b9f92a5c3d84a52cf2eb", + "layer28": "285f475ff941f1277488ad0246b1e999c65cd9dbde8429b724df4e21f80f90c8", + "layer29": "5187ea85da6a386d0178677db7ba32a696e3eb6177e9dcef85d91e01ac4e49b2", + "layer3": "2dd008c19ca466d8106d4d560626aad2c584c21e5535d58609ecc9408a47bfdf", + "layer30": "8c9367ead82fd4d2c71d5b98fc0bf40660f791b305b2709ef448d42e49477d7c", + "layer31": "ee6d7590dbea966e404277d06f00458f94888f8a4ceec113b2827a6c70b0f505", + "layer32": "585a729d3ff42c0f7a8a68f072cdef8ece97c1f4e5064c2ffb116758dfc1e56a", + "layer33": "601f27f1c7efeb091222eaa868a7482e566e3bc080a2408aa873dd4a10f20bcd", + "layer34": "3dcb8795fd79b45d6d64172e3dd142ce9d98be14b71957a53f1cd45e809db73a", + "layer35": "18cf70830e5267be3848760a35fef16f77af791c2d759085245f42f65b855acf", + "layer36": "4524a189086ca20ac47ed79e03b77bbbed048c6059601af9969cb4807c1a895b", + "layer37": "e7ded776955242f1d08d34e92d1e1558bc3295dc88f760821fe8980a3b9698ca", + "layer38": "0fb210313f68fbb85850f93a9db71378ac0c0450555738823029d372161d7df1", + "layer39": "810b9561c9ed0107a4cc6d8da16fb720df715906204afa7884915206b218937c", + "layer4": "d116b6d57068ee10d0881fa10163568215ed613df7e76952669dcfb541c42343", + "layer40": "9c0154b15c28ef7f0528d6ec68d82e55cdad888673efb8c8346c66433af1d497", + "layer41": "8b96986aab46d6f7db8dad2732728088272fad05ca15cf56a7ecfdc3d4ad5881", + "layer42": "3d6b595a94e742554fb8dba4bbf4264aecf52ab31ffdb4dbf4eaeb4c70c81a5f", + "layer43": "1f985f7c2263e375fe8755023aaae60724f48abeef35ecd2e08a901e9ee04c96", + "layer44": "5b43b5dfe92a4e35a7274f42270c2b0e2a2cc43c782a2339d11e7ffa1f436294", + "layer45": "c4dfd70493687759ab793700176cf609c224e19a62cfeadde4348cef619d898d", + "layer46": "77197f1fe90c7a3c580c8f93e584ff806479a6f8d4090a5702c31adaba79e409", + "layer47": "791b730384b61701fa5c809c1db7b7738f2fbd0c547450bcf66ba49850b03a73", + "layer5": "b76a5933c3737d1bdb57c555e3cfde76bbb3c5c2458592b617d88c27f2836156", + "layer6": "b9c9395c035cdb5b8d7789992fe6ae28412289e456731c58d81a4f955b78f9f0", + "layer7": "f236fe5f70a79462fa390ea69c9a393339d42a17297c33dd233b2c12f6c438f7", + "layer8": "27986a2efa2bb00bbf5d8d596ef9193c71936655c070347f9c5d40f7d6d3c337", + "layer9": "e260e56db1472e8927ee4d3885e3e8ee5052c58b3c705db84c0fbff06a79598a" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "update1/p0064-b4-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "update1/p0064-b4-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "a7ab31f2c084947dea25615b0c4bd0219557d9ef8babdb5f7f07edebd8f4584d", + "layer0": "0504beb4e0cb599acfb76406935fac36338cacdd85f03472938d9ac4ca961d89", + "layer1": "8e23098908dcc058c2dd20fff9c8040cb1234a182414f19ddef034b52da19efd", + "layer10": "9d2cfd658219eb293c45f3865da41ad02ae5459d8aeb0467f078092267d4bda6", + "layer11": "dfbbb0def98dd53c608b8216c31c38c8e85609243834526cda858ee333ed6125", + "layer12": "af02fbbbcf4b84397a96b4c007248f5bb56a4f7cb8e45d11206105b64b0ba7e0", + "layer13": "a2a2ff4da0109c91da7046675aa0ce8cd76ae52b3efb71189611ca7008067171", + "layer14": "df78cc50fe178eaebc8ab3b3e9635ccf88d6e21839f71571b81c93397ea98797", + "layer15": "aae1a1ac01fd5b5f56f50966f80f23d7f1f276ec3726e0141a344f3bdd7a380d", + "layer16": "4feb9df443f8126afa5f48fe062fbb1922ab22236b2360361c74d3d2a4053dbf", + "layer17": "8ab3ce001030a0144da3b9df0153277422be1e0d79733682665a07a406bb1805", + "layer18": "be2bab1354989f6df8d1240b0d87c140e6a0faf3a0dfcec969758a8ba64764ee", + "layer19": "1f77b04611bffeab357c54ae77c5e74356eb852d039a5d6732002ea8549ffddb", + "layer2": "566f4ce30552c9df20c890c61d2d9ffce7c5832212662acbced4a242437eb4a7", + "layer20": "91c30ed8dd1150cb6c26b79ad4baebab0d6eb2196c5ebaa5065e03b437fd3b5a", + "layer21": "efb1df77885422211fe934040f947e5161e5575481acdbb07c08b686208010b2", + "layer22": "741cb15b624e762ac2042636bd6bc42bb0f612f1b06ed86e69ea2da869c6f4a6", + "layer23": "f1677c5ca42dc8cc3804d86060e3c90dd53a8012f298a155faad996b94be2dfc", + "layer24": "bcee7fa921b55b37827a3b6ad748f1e2cebdc134f9bd742de74a8a27832a86e3", + "layer25": "2cf589e0e3792a5d488f624b27244e9fdb403340ade8facf73789cd74e04d6ca", + "layer26": "3c734618181d2123565e7b0b6ffe4255d2d2f577099c8f9bb55bee16b3594c00", + "layer27": "a8f958906a0e0baa003e5f87bfb2273aa3980ccbd0091e8ed7d529481f0b7910", + "layer28": "3ce6a5d5b0d68585971198d0f2669adefd137105e150bfea34f7405a3aa9e4c9", + "layer29": "3b1dbf8b8271cfb53d1d6945e9e27b596c85d90ee01ed63beaafda6cdf9ad370", + "layer3": "35a2215f40d6f2744f01f3ee36c372dafd325cdc7da984aeb38439246edef66a", + "layer30": "a7933d908fbc02eef93fb43e2aa2f768bb81f2b41cd7765d6eeaf14311e2a193", + "layer31": "2e79fafbd11a6fd05424e103d0a582ff35f626d43a84fefc85744c678bb59f5c", + "layer32": "1bcc8b7d831768e9bc81268213196c4251b9c50350ad19cc7c0f9bb26a71f08e", + "layer33": "78398bac1fa4c3344ca63f2323c1ba64d9beb5949418e93660c939d5f27f9acf", + "layer34": "a1c06be5303efb5b9776a30f62838318861a0d83e23004bb2a8c4e7b93fd28f5", + "layer35": "7f50561fc30fd9a60ff6dc52c96636ced412d79408ab904ead4869dc00c18952", + "layer36": "312295db5de9814d9408fe04ff77de06592ff714748292e488ab9c56e4d19cb5", + "layer37": "7e7188a1b0f003e995757fc5b5615c74c9afece5fc672e94f8427b32bb97e73b", + "layer38": "d3f03e35b316a455c34afb2d68444f48625a03c50bfa4f5b760df2b07e0f4bc1", + "layer39": "71952d991103144414dfcab9c14c400f11c47e508c1fc9bf30172fe3a7b0897d", + "layer4": "fc2bc2a1563c3d4e757180a8becb55c1f4d95d93a03aeaec992220c1950091d5", + "layer40": "bbb990747601d7061b1952f42f78a95dc7fd87a20a143a690de3e3b035421621", + "layer41": "febfff9e99b04feaa0be6696cd6e7d7261ea3109919e7c9cbf0c218b7c8c6154", + "layer42": "bf0d18847f52039db6c39fdaf05237c06c71045c200d89d959bc7ef25bad60eb", + "layer43": "dd0b09f5b41d69568555d65c77e142aa14c9c6ebf61bc633c1ceaae32a680fc3", + "layer44": "8251d7167da95cf1154ca7dc8918f07b4f40c62b403870cfb005af63c23e08b7", + "layer45": "0d56f04297a788f088a74e62231e5b6656f3bfe950361ad707b91de0c2567a33", + "layer46": "75649b09677b8020f10b9db75850b6eb12db11f4b6ef62fa47f2dde1bcab4800", + "layer47": "4b0c1820e43e6fce69f520de35efc39e67d0dc3acdfaa281648040f7c8143baf", + "layer5": "59f81f32f21efde96c34b3738ce3a37260feccf38c6ea6fa66158031579f7bc7", + "layer6": "36c2f349bab202d1fcec2039faee8fbe96ebea487e417c85f2e52c27f19d5972", + "layer7": "0749424ebde88c24a0217e50771a71e9a3f0e38a868c005b2bee45d2a17b4b0b", + "layer8": "7ddf820cdcbd848ffa90996f566ce1189dbea43572581d57ab07b6e4beea7555", + "layer9": "440f9c95711af9623dedc75c489b0f8afbe688d15e36972c7eb2be3565c6b646" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "update1/p0064-b4-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "update1/p0064-b4-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "a7ab31f2c084947dea25615b0c4bd0219557d9ef8babdb5f7f07edebd8f4584d", + "layer0": "0504beb4e0cb599acfb76406935fac36338cacdd85f03472938d9ac4ca961d89", + "layer1": "8e23098908dcc058c2dd20fff9c8040cb1234a182414f19ddef034b52da19efd", + "layer10": "9d2cfd658219eb293c45f3865da41ad02ae5459d8aeb0467f078092267d4bda6", + "layer11": "dfbbb0def98dd53c608b8216c31c38c8e85609243834526cda858ee333ed6125", + "layer12": "af02fbbbcf4b84397a96b4c007248f5bb56a4f7cb8e45d11206105b64b0ba7e0", + "layer13": "a2a2ff4da0109c91da7046675aa0ce8cd76ae52b3efb71189611ca7008067171", + "layer14": "df78cc50fe178eaebc8ab3b3e9635ccf88d6e21839f71571b81c93397ea98797", + "layer15": "aae1a1ac01fd5b5f56f50966f80f23d7f1f276ec3726e0141a344f3bdd7a380d", + "layer16": "4feb9df443f8126afa5f48fe062fbb1922ab22236b2360361c74d3d2a4053dbf", + "layer17": "8ab3ce001030a0144da3b9df0153277422be1e0d79733682665a07a406bb1805", + "layer18": "be2bab1354989f6df8d1240b0d87c140e6a0faf3a0dfcec969758a8ba64764ee", + "layer19": "1f77b04611bffeab357c54ae77c5e74356eb852d039a5d6732002ea8549ffddb", + "layer2": "566f4ce30552c9df20c890c61d2d9ffce7c5832212662acbced4a242437eb4a7", + "layer20": "91c30ed8dd1150cb6c26b79ad4baebab0d6eb2196c5ebaa5065e03b437fd3b5a", + "layer21": "efb1df77885422211fe934040f947e5161e5575481acdbb07c08b686208010b2", + "layer22": "741cb15b624e762ac2042636bd6bc42bb0f612f1b06ed86e69ea2da869c6f4a6", + "layer23": "f1677c5ca42dc8cc3804d86060e3c90dd53a8012f298a155faad996b94be2dfc", + "layer24": "bcee7fa921b55b37827a3b6ad748f1e2cebdc134f9bd742de74a8a27832a86e3", + "layer25": "2cf589e0e3792a5d488f624b27244e9fdb403340ade8facf73789cd74e04d6ca", + "layer26": "3c734618181d2123565e7b0b6ffe4255d2d2f577099c8f9bb55bee16b3594c00", + "layer27": "a8f958906a0e0baa003e5f87bfb2273aa3980ccbd0091e8ed7d529481f0b7910", + "layer28": "3ce6a5d5b0d68585971198d0f2669adefd137105e150bfea34f7405a3aa9e4c9", + "layer29": "3b1dbf8b8271cfb53d1d6945e9e27b596c85d90ee01ed63beaafda6cdf9ad370", + "layer3": "35a2215f40d6f2744f01f3ee36c372dafd325cdc7da984aeb38439246edef66a", + "layer30": "a7933d908fbc02eef93fb43e2aa2f768bb81f2b41cd7765d6eeaf14311e2a193", + "layer31": "2e79fafbd11a6fd05424e103d0a582ff35f626d43a84fefc85744c678bb59f5c", + "layer32": "1bcc8b7d831768e9bc81268213196c4251b9c50350ad19cc7c0f9bb26a71f08e", + "layer33": "78398bac1fa4c3344ca63f2323c1ba64d9beb5949418e93660c939d5f27f9acf", + "layer34": "a1c06be5303efb5b9776a30f62838318861a0d83e23004bb2a8c4e7b93fd28f5", + "layer35": "7f50561fc30fd9a60ff6dc52c96636ced412d79408ab904ead4869dc00c18952", + "layer36": "312295db5de9814d9408fe04ff77de06592ff714748292e488ab9c56e4d19cb5", + "layer37": "7e7188a1b0f003e995757fc5b5615c74c9afece5fc672e94f8427b32bb97e73b", + "layer38": "d3f03e35b316a455c34afb2d68444f48625a03c50bfa4f5b760df2b07e0f4bc1", + "layer39": "71952d991103144414dfcab9c14c400f11c47e508c1fc9bf30172fe3a7b0897d", + "layer4": "fc2bc2a1563c3d4e757180a8becb55c1f4d95d93a03aeaec992220c1950091d5", + "layer40": "bbb990747601d7061b1952f42f78a95dc7fd87a20a143a690de3e3b035421621", + "layer41": "febfff9e99b04feaa0be6696cd6e7d7261ea3109919e7c9cbf0c218b7c8c6154", + "layer42": "bf0d18847f52039db6c39fdaf05237c06c71045c200d89d959bc7ef25bad60eb", + "layer43": "dd0b09f5b41d69568555d65c77e142aa14c9c6ebf61bc633c1ceaae32a680fc3", + "layer44": "8251d7167da95cf1154ca7dc8918f07b4f40c62b403870cfb005af63c23e08b7", + "layer45": "0d56f04297a788f088a74e62231e5b6656f3bfe950361ad707b91de0c2567a33", + "layer46": "75649b09677b8020f10b9db75850b6eb12db11f4b6ef62fa47f2dde1bcab4800", + "layer47": "4b0c1820e43e6fce69f520de35efc39e67d0dc3acdfaa281648040f7c8143baf", + "layer5": "59f81f32f21efde96c34b3738ce3a37260feccf38c6ea6fa66158031579f7bc7", + "layer6": "36c2f349bab202d1fcec2039faee8fbe96ebea487e417c85f2e52c27f19d5972", + "layer7": "0749424ebde88c24a0217e50771a71e9a3f0e38a868c005b2bee45d2a17b4b0b", + "layer8": "7ddf820cdcbd848ffa90996f566ce1189dbea43572581d57ab07b6e4beea7555", + "layer9": "440f9c95711af9623dedc75c489b0f8afbe688d15e36972c7eb2be3565c6b646" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "update1/p0256-b1-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "update1/p0256-b1-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "24d88e98f76f18fe392a16ab64fce7f13cfe4fb91908f9f63399bbedb49a4e36", + "layer0": "6a30cebd1f9fd4f380cfafc6311917438909e9ca4eabad3a009670100ed91af1", + "layer1": "b1b909f1c4ce3a1b36aac3bc4a379943abf7f6b0d61fdf029febbbcaa8048389", + "layer10": "f6779ff9724a7f67fe688ee0a354378d08e679a7b3e68ae5a374a259d81a0504", + "layer11": "165d69181b88cb7e0926e4ae8c19a12aa7c7b496ff3b2abbdfbf70869b712dc3", + "layer12": "b251366fd6b3df295cffb616d6e8b9ee760fec721cd50a8de6c774accbce1828", + "layer13": "d7a5d10daa688bdc54af3aa18e4bcf48e48b2930ef57b92d4c39da1040ab69fc", + "layer14": "44dd1975c6b08c2f09b6ffd3e6ca68c1968baf3515e97bf532c0e2cd0892b7ca", + "layer15": "e4fcd37a1a23039bcf8196e97932355fe489f3616c7708e1f31c5dc07a66134c", + "layer16": "43bb0912363fc0b56877401e4d19d1fe892040a0663d3971d537a137f87f685d", + "layer17": "15e52a0cacf4d21d63ae1c9688c12ebd00f74d7ddfcf04f6e8597975c80904d9", + "layer18": "10517de7060755660beb07536be74f6b867a84b5ab0ee92ab8c34e5ca772e8ff", + "layer19": "5866d53e70c1a9d0e5b433397d784b2a9d704fee96ea463e29723fad7cc68548", + "layer2": "e613451091879bdccd4951771562b9e1f54308914c9b51e7a70d0e3ea84e7def", + "layer20": "8cc0e83dcb7a9e67189dd4d09165accf6d242330965916c12be5d17ff8a8c96c", + "layer21": "abcead37d7b36b45af321c83d19f717a96a1118cd02df5a8c84ca9622bd8cfea", + "layer22": "c156ef9463516c5cb069f130b933b3cf2de1b337dc7ff6dd24ff36980567571a", + "layer23": "cf288a7e21af821ee6fa733be6b6a7a3b10cb43f1b7d06b1acc38c1c39ad925d", + "layer24": "6e8bf6ed81c545dbaf9b3bd1d08d7a38822cc8837fdbfd4bf6d01dca92191a9e", + "layer25": "ec305119cbe48fce2e2583de80093d5e2a2a8960bc122a2c9c6ae7e3fd70c6a4", + "layer26": "c3f4bc20e424b86209dcc0d519d3a09dd8d6baae4fc24ece2ee7dcf6576b1f98", + "layer27": "4934168e71496749be05c72674513a5e8ab4afed5afb22e48de4c604a9fcabb7", + "layer28": "c7b87513faa57389cbc62ea98122aa0fb6598458001a464e9654cdea6c0d7d7a", + "layer29": "2660fd3e47d7ff0e4b2543342b8712188dc4050085ee2cda401924867aa19301", + "layer3": "63eccdb21227ccd16d98031313462324c0d732deccb4889a650bfa223213207b", + "layer30": "3d0875e2cf110805f6e6516707985acc0113d4f90aafef072dbee542cd37565f", + "layer31": "6c64e5ab7eba472000a522fb24bdb2ac4bc913501a579d77deda1cb41ec961a8", + "layer32": "92f3a0b1cdafeb23f96edcdce6ecf1e70d886b0e157f5162cd0f2793cf150ac9", + "layer33": "4ce4661f55bcd2e4a3a94b3f648c9faa9389448dff6e4ec03568bb59ace5f17f", + "layer34": "4d8c8de17d8281bb46752dde4b7f6c1bd258f2c8581bf78e8411f1b4ba240b11", + "layer35": "4faf40204988dd6f4da87e385e788dd5f1dbf1828842da46dbaa8e977a866103", + "layer36": "823cd48be18af43e0738f846a118e803726c221e8a5205aec91783bf1c01057b", + "layer37": "f5d35542b9ccef2ad9c3f3941a32a260d600469649307c517127d64cc3edeeda", + "layer38": "49700c896c4963db24848da1eab468dcb33798599464b858c2b4c6e92b471331", + "layer39": "ff2ef956449f5ca432fab222aa664d66b5d9811324b45054d407dd7e08e397a1", + "layer4": "96339895b917be7743269d6d417889e2685a949a9513e39837697a6552b043cb", + "layer40": "7b0f685deffa3520a3a00d7e6df3d472cebb02a4e7bebe19c11282089773bf6e", + "layer41": "7887c95c800256542e91c9561537a2f84ab784988f2e238307921e2bbc3db612", + "layer42": "aae9f74d224938145d7b8d816fb5142ac6796146a72527b73b3536ca8318c81c", + "layer43": "ebeaaa07e3f2ca3a8d85395122393634e55bf68f611a6b86e35c4b4565fa1bbd", + "layer44": "bd113238a0f621ffdb6651686f9b039235d7c1e8853f733a493d5936a8bd6708", + "layer45": "a385e9d39875107318ce2fd9ad3dd0acf33563d8c411fa6a7c06cbcedb341040", + "layer46": "c5b7fe5751f6004bb7ec63b451df4905e6915521def5403b2c84ea2123f8ddbe", + "layer47": "cbe82eca884ef49b4a8f98cdfb2780cab45e2e8d8f5661fd79db10316862eb2c", + "layer5": "008ecdb1fe55654e2c02ec86cf9d6e6ea3f65ce1400223ef8fc5b60681e2b52d", + "layer6": "2df8b3dab7fdea4e3969a7e4e87ae91930fc6e633d49e6ca098a25245984f3d0", + "layer7": "26f203cd5ab896ee69d1aad42cf6677174da0c02a44361921784347863bf3ae3", + "layer8": "103c25022cdddcdcee7a815a81f12c0921cfce9d53b7c34062073359c754f0d4", + "layer9": "316150bada518a04b2df1c0ed357f5484713854db7629742d610d648b71e850a" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "update1/p0256-b1-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "update1/p0256-b1-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "24d88e98f76f18fe392a16ab64fce7f13cfe4fb91908f9f63399bbedb49a4e36", + "layer0": "6a30cebd1f9fd4f380cfafc6311917438909e9ca4eabad3a009670100ed91af1", + "layer1": "b1b909f1c4ce3a1b36aac3bc4a379943abf7f6b0d61fdf029febbbcaa8048389", + "layer10": "f6779ff9724a7f67fe688ee0a354378d08e679a7b3e68ae5a374a259d81a0504", + "layer11": "165d69181b88cb7e0926e4ae8c19a12aa7c7b496ff3b2abbdfbf70869b712dc3", + "layer12": "b251366fd6b3df295cffb616d6e8b9ee760fec721cd50a8de6c774accbce1828", + "layer13": "d7a5d10daa688bdc54af3aa18e4bcf48e48b2930ef57b92d4c39da1040ab69fc", + "layer14": "44dd1975c6b08c2f09b6ffd3e6ca68c1968baf3515e97bf532c0e2cd0892b7ca", + "layer15": "e4fcd37a1a23039bcf8196e97932355fe489f3616c7708e1f31c5dc07a66134c", + "layer16": "43bb0912363fc0b56877401e4d19d1fe892040a0663d3971d537a137f87f685d", + "layer17": "15e52a0cacf4d21d63ae1c9688c12ebd00f74d7ddfcf04f6e8597975c80904d9", + "layer18": "10517de7060755660beb07536be74f6b867a84b5ab0ee92ab8c34e5ca772e8ff", + "layer19": "5866d53e70c1a9d0e5b433397d784b2a9d704fee96ea463e29723fad7cc68548", + "layer2": "e613451091879bdccd4951771562b9e1f54308914c9b51e7a70d0e3ea84e7def", + "layer20": "8cc0e83dcb7a9e67189dd4d09165accf6d242330965916c12be5d17ff8a8c96c", + "layer21": "abcead37d7b36b45af321c83d19f717a96a1118cd02df5a8c84ca9622bd8cfea", + "layer22": "c156ef9463516c5cb069f130b933b3cf2de1b337dc7ff6dd24ff36980567571a", + "layer23": "cf288a7e21af821ee6fa733be6b6a7a3b10cb43f1b7d06b1acc38c1c39ad925d", + "layer24": "6e8bf6ed81c545dbaf9b3bd1d08d7a38822cc8837fdbfd4bf6d01dca92191a9e", + "layer25": "ec305119cbe48fce2e2583de80093d5e2a2a8960bc122a2c9c6ae7e3fd70c6a4", + "layer26": "c3f4bc20e424b86209dcc0d519d3a09dd8d6baae4fc24ece2ee7dcf6576b1f98", + "layer27": "4934168e71496749be05c72674513a5e8ab4afed5afb22e48de4c604a9fcabb7", + "layer28": "c7b87513faa57389cbc62ea98122aa0fb6598458001a464e9654cdea6c0d7d7a", + "layer29": "2660fd3e47d7ff0e4b2543342b8712188dc4050085ee2cda401924867aa19301", + "layer3": "63eccdb21227ccd16d98031313462324c0d732deccb4889a650bfa223213207b", + "layer30": "3d0875e2cf110805f6e6516707985acc0113d4f90aafef072dbee542cd37565f", + "layer31": "6c64e5ab7eba472000a522fb24bdb2ac4bc913501a579d77deda1cb41ec961a8", + "layer32": "92f3a0b1cdafeb23f96edcdce6ecf1e70d886b0e157f5162cd0f2793cf150ac9", + "layer33": "4ce4661f55bcd2e4a3a94b3f648c9faa9389448dff6e4ec03568bb59ace5f17f", + "layer34": "4d8c8de17d8281bb46752dde4b7f6c1bd258f2c8581bf78e8411f1b4ba240b11", + "layer35": "4faf40204988dd6f4da87e385e788dd5f1dbf1828842da46dbaa8e977a866103", + "layer36": "823cd48be18af43e0738f846a118e803726c221e8a5205aec91783bf1c01057b", + "layer37": "f5d35542b9ccef2ad9c3f3941a32a260d600469649307c517127d64cc3edeeda", + "layer38": "49700c896c4963db24848da1eab468dcb33798599464b858c2b4c6e92b471331", + "layer39": "ff2ef956449f5ca432fab222aa664d66b5d9811324b45054d407dd7e08e397a1", + "layer4": "96339895b917be7743269d6d417889e2685a949a9513e39837697a6552b043cb", + "layer40": "7b0f685deffa3520a3a00d7e6df3d472cebb02a4e7bebe19c11282089773bf6e", + "layer41": "7887c95c800256542e91c9561537a2f84ab784988f2e238307921e2bbc3db612", + "layer42": "aae9f74d224938145d7b8d816fb5142ac6796146a72527b73b3536ca8318c81c", + "layer43": "ebeaaa07e3f2ca3a8d85395122393634e55bf68f611a6b86e35c4b4565fa1bbd", + "layer44": "bd113238a0f621ffdb6651686f9b039235d7c1e8853f733a493d5936a8bd6708", + "layer45": "a385e9d39875107318ce2fd9ad3dd0acf33563d8c411fa6a7c06cbcedb341040", + "layer46": "c5b7fe5751f6004bb7ec63b451df4905e6915521def5403b2c84ea2123f8ddbe", + "layer47": "cbe82eca884ef49b4a8f98cdfb2780cab45e2e8d8f5661fd79db10316862eb2c", + "layer5": "008ecdb1fe55654e2c02ec86cf9d6e6ea3f65ce1400223ef8fc5b60681e2b52d", + "layer6": "2df8b3dab7fdea4e3969a7e4e87ae91930fc6e633d49e6ca098a25245984f3d0", + "layer7": "26f203cd5ab896ee69d1aad42cf6677174da0c02a44361921784347863bf3ae3", + "layer8": "103c25022cdddcdcee7a815a81f12c0921cfce9d53b7c34062073359c754f0d4", + "layer9": "316150bada518a04b2df1c0ed357f5484713854db7629742d610d648b71e850a" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "update1/p0256-b4-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "update1/p0256-b4-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "7e8c8592b6907e55c0501ba1cf893525c6b36831d710b69882d1e328145fab48", + "layer0": "7dbe20c391e914467d80503d6b10813d7e9e72e4a60c55f5add2fbe7d4d6c4ce", + "layer1": "ee8946f418966d8df86dfa92924b0b9f27f69a6728737eee6d27ef2c4f6ca9ab", + "layer10": "c322068da93e09b83e7909f572698c738cd5720fcfb5bb5d25520dd8b5addf88", + "layer11": "2c448f27ed4070e003b4c2c03e6b5e16ce5619a415e2f6183a76db4614b126fb", + "layer12": "134d14d7ccb4d32ed030063e04bb869fa359565dc3f31f692d5551be0db439a3", + "layer13": "12a29f26d753bcaea1f07510a1463709dde8602a82c23bed8f604682ad1eb7bb", + "layer14": "6f9aea9a70eb1b9104b2687b463fc7cef526c2bb62d3073085b47f7435bbdce8", + "layer15": "4b032226337ea6f5f43ecf103c90a38d02ff728dfa11216a0bd93f313c08833e", + "layer16": "0bbc5380321b6863758c5b492b816d80eae1c8399847d349e84e84ec39ff29e3", + "layer17": "79655c868d18adc2ae36133db4d120ddc66356a908cdb82211669bb95daaa030", + "layer18": "0e33db04540997d32adf1d6b0a526189fa1c46823d7ede152426ec1223391773", + "layer19": "eb804a84e383f5abf50acb12531e775b76875d22ca84b311075fb88083e8a8bb", + "layer2": "0b19d71d7fe787ef33839787463d621784c30f4f9357ab09f5f1f90adf4ea622", + "layer20": "fa8f9e905e9ba3540dced7add222e519e349e659935a00d599dbf39ad5409b52", + "layer21": "9c30b435afe3a68ffad43468b182b66a65d5f712527dee2b81ddbc5f05fbb886", + "layer22": "4d1caa84999a64e3b4f73b2505a688086f5fc7f74bf32f048527ecc8406e8c4c", + "layer23": "47aa629d6242068bd1821337de1cb15b9cd5593a5c2836616a189f53592bd956", + "layer24": "ca9229f7ddfbfff9e704bf8d6b65190ffd15b58262790a7f33b0ce14e2012458", + "layer25": "6d116effabb4553d1f3553ed46c7b7b7dc566d9ba4f3112a55b83bbe3c3651fa", + "layer26": "a0f8b9f643e722711e58bd65f71edbc58e15a7a4ae20037d807b6c79988b74d5", + "layer27": "6f6587dd72053409885eff2aab0c18ebedf80bad8a414ae730e9326c0b6fabae", + "layer28": "3d24888d6c98d76722b3fd00384887ffbf3cf0664f7a08bbc8b9c68d090db6d5", + "layer29": "4c6a1577e63bbf490718afda5dcee1d488360cc14397bb6f919c53b79dd96ace", + "layer3": "01c125cdda61b99ec4747310003bf2608f61cae9b0f7ec66989ac170362a8a40", + "layer30": "f0ee31517b14b9fee6b44727d010d8b94e490ef4037745e810de820cac8ba6d0", + "layer31": "24fc73dac43d55f5cfe9c7fd972f40d5c2b6f7f9fa341ca8401120fa4f6d16d3", + "layer32": "1b0a96d52653b65fd225bb18efff96713aaad9e82f990934421f22442efcd9ed", + "layer33": "d27fbf97d4f221fd33f2ce38b199909d3312d14c891bf74079aecef00653e85c", + "layer34": "a47e5f981445b05671517cba2b7649413aa043aa2e8f81d24be417b088999be2", + "layer35": "b07814ebe3ac9e7d6350ad0bf04e46ec54415085e9feec251d49215585e7e7ed", + "layer36": "976a8428ca9f128a92c67a888acee764ac4e8495799dcf280e25a7527b68b181", + "layer37": "95bbba1b2f8e7d5bfe91bb8b62b1da4e686a3728f52b9e3644ba881a15c330e3", + "layer38": "dc9a8eb8e7fcbff1fca4398d408ff7465d1c71d74ceb39593e6f79ae788d6f33", + "layer39": "003cd7a609505bdc683fd7befbebac47c1950d7d714de7b89257dbe55181dda0", + "layer4": "578fa5d6071372976c7c405d31cc131825ada9b726b3d756605f33c7e3d0924e", + "layer40": "6e68680a158a5eea7fc1f1a8a81320ca98881ecfe88d06b92f0b38d97e0882ef", + "layer41": "8e17899bc52471b4e10b00406829231a0b80cb2aeb62147b16c1b0430384bb76", + "layer42": "633fa6e6457235391ddc541d5ea3b216f116c1d4b7c30428d7b564cc84c2f41d", + "layer43": "d3ff64a327df797177097110bf554ea6ecd5e91bde4d010354699b4624d931ea", + "layer44": "2382b897c7ea817dc4d69a5e18013044349c8b253442a9adf1f03e5ece749076", + "layer45": "5c29f0b982d55c60d18946957d39ec5fdf1cf15934005b98756bdf2af48afc12", + "layer46": "2726d162fe4b39321ed23eed49f71ccac97810b73c26da59d21ace1e469376b0", + "layer47": "764c355a03b5ceb8cda44b13577839756f1a5d2102c7acbcc710732e85d33d36", + "layer5": "463d46c43abba6ecb818c6f8378a7964aea186375215da233497daeadb6f9289", + "layer6": "7365f7bf2cd97579c56390faefe310da531fbd25ad6bb5073f0cf48f3327843f", + "layer7": "b543ca57dd255544d04d22e4e80c1f9f7e778dd442e82e78e254fb8fc2085276", + "layer8": "b2600fbc29195a136482e0ea9f083d735515ca8c2687e1f14b180a07848592ce", + "layer9": "d8a651ecb1c146f997ff8a5d551e722ae6505d09e739bf567de341098b903732" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "update1/p0256-b4-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "update1/p0256-b4-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "7e8c8592b6907e55c0501ba1cf893525c6b36831d710b69882d1e328145fab48", + "layer0": "7dbe20c391e914467d80503d6b10813d7e9e72e4a60c55f5add2fbe7d4d6c4ce", + "layer1": "ee8946f418966d8df86dfa92924b0b9f27f69a6728737eee6d27ef2c4f6ca9ab", + "layer10": "c322068da93e09b83e7909f572698c738cd5720fcfb5bb5d25520dd8b5addf88", + "layer11": "2c448f27ed4070e003b4c2c03e6b5e16ce5619a415e2f6183a76db4614b126fb", + "layer12": "134d14d7ccb4d32ed030063e04bb869fa359565dc3f31f692d5551be0db439a3", + "layer13": "12a29f26d753bcaea1f07510a1463709dde8602a82c23bed8f604682ad1eb7bb", + "layer14": "6f9aea9a70eb1b9104b2687b463fc7cef526c2bb62d3073085b47f7435bbdce8", + "layer15": "4b032226337ea6f5f43ecf103c90a38d02ff728dfa11216a0bd93f313c08833e", + "layer16": "0bbc5380321b6863758c5b492b816d80eae1c8399847d349e84e84ec39ff29e3", + "layer17": "79655c868d18adc2ae36133db4d120ddc66356a908cdb82211669bb95daaa030", + "layer18": "0e33db04540997d32adf1d6b0a526189fa1c46823d7ede152426ec1223391773", + "layer19": "eb804a84e383f5abf50acb12531e775b76875d22ca84b311075fb88083e8a8bb", + "layer2": "0b19d71d7fe787ef33839787463d621784c30f4f9357ab09f5f1f90adf4ea622", + "layer20": "fa8f9e905e9ba3540dced7add222e519e349e659935a00d599dbf39ad5409b52", + "layer21": "9c30b435afe3a68ffad43468b182b66a65d5f712527dee2b81ddbc5f05fbb886", + "layer22": "4d1caa84999a64e3b4f73b2505a688086f5fc7f74bf32f048527ecc8406e8c4c", + "layer23": "47aa629d6242068bd1821337de1cb15b9cd5593a5c2836616a189f53592bd956", + "layer24": "ca9229f7ddfbfff9e704bf8d6b65190ffd15b58262790a7f33b0ce14e2012458", + "layer25": "6d116effabb4553d1f3553ed46c7b7b7dc566d9ba4f3112a55b83bbe3c3651fa", + "layer26": "a0f8b9f643e722711e58bd65f71edbc58e15a7a4ae20037d807b6c79988b74d5", + "layer27": "6f6587dd72053409885eff2aab0c18ebedf80bad8a414ae730e9326c0b6fabae", + "layer28": "3d24888d6c98d76722b3fd00384887ffbf3cf0664f7a08bbc8b9c68d090db6d5", + "layer29": "4c6a1577e63bbf490718afda5dcee1d488360cc14397bb6f919c53b79dd96ace", + "layer3": "01c125cdda61b99ec4747310003bf2608f61cae9b0f7ec66989ac170362a8a40", + "layer30": "f0ee31517b14b9fee6b44727d010d8b94e490ef4037745e810de820cac8ba6d0", + "layer31": "24fc73dac43d55f5cfe9c7fd972f40d5c2b6f7f9fa341ca8401120fa4f6d16d3", + "layer32": "1b0a96d52653b65fd225bb18efff96713aaad9e82f990934421f22442efcd9ed", + "layer33": "d27fbf97d4f221fd33f2ce38b199909d3312d14c891bf74079aecef00653e85c", + "layer34": "a47e5f981445b05671517cba2b7649413aa043aa2e8f81d24be417b088999be2", + "layer35": "b07814ebe3ac9e7d6350ad0bf04e46ec54415085e9feec251d49215585e7e7ed", + "layer36": "976a8428ca9f128a92c67a888acee764ac4e8495799dcf280e25a7527b68b181", + "layer37": "95bbba1b2f8e7d5bfe91bb8b62b1da4e686a3728f52b9e3644ba881a15c330e3", + "layer38": "dc9a8eb8e7fcbff1fca4398d408ff7465d1c71d74ceb39593e6f79ae788d6f33", + "layer39": "003cd7a609505bdc683fd7befbebac47c1950d7d714de7b89257dbe55181dda0", + "layer4": "578fa5d6071372976c7c405d31cc131825ada9b726b3d756605f33c7e3d0924e", + "layer40": "6e68680a158a5eea7fc1f1a8a81320ca98881ecfe88d06b92f0b38d97e0882ef", + "layer41": "8e17899bc52471b4e10b00406829231a0b80cb2aeb62147b16c1b0430384bb76", + "layer42": "633fa6e6457235391ddc541d5ea3b216f116c1d4b7c30428d7b564cc84c2f41d", + "layer43": "d3ff64a327df797177097110bf554ea6ecd5e91bde4d010354699b4624d931ea", + "layer44": "2382b897c7ea817dc4d69a5e18013044349c8b253442a9adf1f03e5ece749076", + "layer45": "5c29f0b982d55c60d18946957d39ec5fdf1cf15934005b98756bdf2af48afc12", + "layer46": "2726d162fe4b39321ed23eed49f71ccac97810b73c26da59d21ace1e469376b0", + "layer47": "764c355a03b5ceb8cda44b13577839756f1a5d2102c7acbcc710732e85d33d36", + "layer5": "463d46c43abba6ecb818c6f8378a7964aea186375215da233497daeadb6f9289", + "layer6": "7365f7bf2cd97579c56390faefe310da531fbd25ad6bb5073f0cf48f3327843f", + "layer7": "b543ca57dd255544d04d22e4e80c1f9f7e778dd442e82e78e254fb8fc2085276", + "layer8": "b2600fbc29195a136482e0ea9f083d735515ca8c2687e1f14b180a07848592ce", + "layer9": "d8a651ecb1c146f997ff8a5d551e722ae6505d09e739bf567de341098b903732" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "update1/p1024-b1-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "update1/p1024-b1-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "e471c5776685b6d8c8f28347d54eb0c383ba12de9265f77773a57361bdf09f07", + "layer0": "bf4aebe0fe30b849a033f921934f26516a35e6f4f5df4f6938355dd7195fda52", + "layer1": "17a5435a46a1f0f80392b2d25e2ac070f8b5fe61094b25112521fa930068efc1", + "layer10": "1d718c73925637911d6069b52ecdf19da027612d92d9c1228260467a3c91b4bf", + "layer11": "02b9e052da50ccbf431f3bd54e6d4a801fb629fb3adf3b0e6481faf0b4372c69", + "layer12": "6e35283b83fc36ea3c064063418d9847975408be2da1aa899a35258b25812a94", + "layer13": "ba6fe0d1a6578c25edc06ab2ade5d5521140ca58681e97e8d7e2127f62168d3d", + "layer14": "f089a86ddc9777bcdb61921ed01d48b196ee40652159caf43139c1a67caef292", + "layer15": "42e2319ee39a6213c5ef8804e0c469d39dc226d8916db5b802c90ab76ee37d00", + "layer16": "70209b75e62fb73d0a1f771d86f35b6754c7c0cf475028deabb1eb57fdd26eae", + "layer17": "850b44a1a7f9c1e27140728e69c3b1c2fa7f456e8a153bbe6cef310036f19da9", + "layer18": "5b946790914c7b70f303bef2e1cef50b44e98081894638e2ec46ce262e6b25bf", + "layer19": "27ffd7cff4bf77d889200a7859c2d113436f23dbad06e9028c5ddff43b0a8dc1", + "layer2": "b67626a3671a3637d37777b4299964ceecd90ec8c755358328ddf6f1103449be", + "layer20": "d20ff5ba1da7ca5f07acf96849e873da7818112896d04bd2d8abcf006fd14fbd", + "layer21": "34390c2778499d743e6d3317d8090f0750c1a502812f724ca23db01eba366a0f", + "layer22": "1dc07e9ef8c2913b074fa43c733fcb75232547fac4ad5bb74a2c2e628eb2f5f7", + "layer23": "58407b3710f630a5f6e79d0980fa07c3aa7381e595252dde54736f6f4e68ffd1", + "layer24": "ba97311a14d88dac5a57c50e3e99ffda33f30d39416f6e23383d34be46175711", + "layer25": "029fbd8607390d454248c56636d4c7ce8995b47c6d1936d3128382a27fe6c7f8", + "layer26": "6c12f9d55358db6fe7745c543214ec12befd1ef26588b6e5a628fb20ce9c8f6a", + "layer27": "23bb0879d67ab6171339a31b447fe89cc1525a14f17229c6437e6c82f6ec4639", + "layer28": "967d7280a1d7643c6f689a72f62c6d5bbfbe06803b3fe322e5ef9ad5a0b2148c", + "layer29": "d377fb1268a07b3e9ff1f3fa1c3e22f6c258203f2007484c1abebe3f23c953ea", + "layer3": "ac2363f3e896349296fd5f20dae43e7a24b0873144141ca3411aba4539d87507", + "layer30": "63508ff18e475a79b5acda56a0c44aeaf725781e3d14fb04479802ed0aeb7cf2", + "layer31": "07e3bb6e023be84d22ee27295c6231e75def2a1ec06ef4cc7368744ecb4fa5cd", + "layer32": "4d157302b1fadfb471b1bc0ea847bc03123de0688f0fc5ccf997c870d1c615c1", + "layer33": "2f75b3e157ddc04a2b22b6e8f342f08dda78b3cf73d7d7a1ef92b81fe75f3ac7", + "layer34": "78693af7850550a1ba2866c95543329226efb4ec56127b815cf0bbf4ec95e043", + "layer35": "79f579de2ace3ba65476fd1cb98d6446ca459fc1c807c6ad080df396734f66e4", + "layer36": "b3cfac9780057b4ec694b41a81f69f5ea241e3ccc9fc060156fdd21f68a11965", + "layer37": "86014746f99de9a46447e3d3fbd29a3990e52a0fb17e1a04f8bb5a873e3d9198", + "layer38": "35eb10b9b390b8984636f0c14641bc08ab6471da2b7bc3814fe52ee505a84842", + "layer39": "fa346ac751c6a39935963e527bee45c42d4d9fbc721d95758b06c4bef7a242f9", + "layer4": "3ab04b3add6878a71c5923d1763a4b021f34f265ec7c9876620655e30864ea75", + "layer40": "8fe46263cd11b57806b2348ab73620b5419accbcc7e7dfaf931746823268734d", + "layer41": "62e190ddfd62ede4afdb67740fe162e9174660961fb86f4fc00f16eacecad3c2", + "layer42": "087f1c2d9418424285d9c8c3e4a4b6b943c60fbec526c34b2759e5879c788cf0", + "layer43": "8a0831fc6618bb556322abaf0826fb1285b7d1e2904495370884bd41f5e5a42a", + "layer44": "bc4c8c3098a6438c5ee43abd6b43a9551432f7030bd5f568b5ba8ce59d4b0779", + "layer45": "57dc0dcfc0546cac1bd651a464977af5b6c62c51241c4672d19fc201b08fd534", + "layer46": "99dfc17b9be322e9bfef81990f63bd5d3680a060d83fdbe1dd8d9419b9e0955e", + "layer47": "68cada748fba27a66aebd31f9acb4dbd010f95d0551d88c09ebfb51fad77ecdb", + "layer5": "2c31e6442902e31ab91f31c0e773a0b5bdd1b3c0800f002b06cbc849123dba6c", + "layer6": "eb014381861351b820e1bb867a8e92983531683d8c1171896643e7227f10e4f6", + "layer7": "61e5e69eb375d12ba8dd87e3ceff2db742bcc3219e39b18b273dee1fc9e09054", + "layer8": "39729de6c2d08de70bc0677558ac8b84950f4dad46871bb14693bb36360be138", + "layer9": "b11d1bb5d82a302d0a2ec18ccea9ee8dc5f2d81e7655567a628cf73f01c8c307" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "update1/p1024-b1-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "update1/p1024-b1-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "e471c5776685b6d8c8f28347d54eb0c383ba12de9265f77773a57361bdf09f07", + "layer0": "bf4aebe0fe30b849a033f921934f26516a35e6f4f5df4f6938355dd7195fda52", + "layer1": "17a5435a46a1f0f80392b2d25e2ac070f8b5fe61094b25112521fa930068efc1", + "layer10": "1d718c73925637911d6069b52ecdf19da027612d92d9c1228260467a3c91b4bf", + "layer11": "02b9e052da50ccbf431f3bd54e6d4a801fb629fb3adf3b0e6481faf0b4372c69", + "layer12": "6e35283b83fc36ea3c064063418d9847975408be2da1aa899a35258b25812a94", + "layer13": "ba6fe0d1a6578c25edc06ab2ade5d5521140ca58681e97e8d7e2127f62168d3d", + "layer14": "f089a86ddc9777bcdb61921ed01d48b196ee40652159caf43139c1a67caef292", + "layer15": "42e2319ee39a6213c5ef8804e0c469d39dc226d8916db5b802c90ab76ee37d00", + "layer16": "70209b75e62fb73d0a1f771d86f35b6754c7c0cf475028deabb1eb57fdd26eae", + "layer17": "850b44a1a7f9c1e27140728e69c3b1c2fa7f456e8a153bbe6cef310036f19da9", + "layer18": "5b946790914c7b70f303bef2e1cef50b44e98081894638e2ec46ce262e6b25bf", + "layer19": "27ffd7cff4bf77d889200a7859c2d113436f23dbad06e9028c5ddff43b0a8dc1", + "layer2": "b67626a3671a3637d37777b4299964ceecd90ec8c755358328ddf6f1103449be", + "layer20": "d20ff5ba1da7ca5f07acf96849e873da7818112896d04bd2d8abcf006fd14fbd", + "layer21": "34390c2778499d743e6d3317d8090f0750c1a502812f724ca23db01eba366a0f", + "layer22": "1dc07e9ef8c2913b074fa43c733fcb75232547fac4ad5bb74a2c2e628eb2f5f7", + "layer23": "58407b3710f630a5f6e79d0980fa07c3aa7381e595252dde54736f6f4e68ffd1", + "layer24": "ba97311a14d88dac5a57c50e3e99ffda33f30d39416f6e23383d34be46175711", + "layer25": "029fbd8607390d454248c56636d4c7ce8995b47c6d1936d3128382a27fe6c7f8", + "layer26": "6c12f9d55358db6fe7745c543214ec12befd1ef26588b6e5a628fb20ce9c8f6a", + "layer27": "23bb0879d67ab6171339a31b447fe89cc1525a14f17229c6437e6c82f6ec4639", + "layer28": "967d7280a1d7643c6f689a72f62c6d5bbfbe06803b3fe322e5ef9ad5a0b2148c", + "layer29": "d377fb1268a07b3e9ff1f3fa1c3e22f6c258203f2007484c1abebe3f23c953ea", + "layer3": "ac2363f3e896349296fd5f20dae43e7a24b0873144141ca3411aba4539d87507", + "layer30": "63508ff18e475a79b5acda56a0c44aeaf725781e3d14fb04479802ed0aeb7cf2", + "layer31": "07e3bb6e023be84d22ee27295c6231e75def2a1ec06ef4cc7368744ecb4fa5cd", + "layer32": "4d157302b1fadfb471b1bc0ea847bc03123de0688f0fc5ccf997c870d1c615c1", + "layer33": "2f75b3e157ddc04a2b22b6e8f342f08dda78b3cf73d7d7a1ef92b81fe75f3ac7", + "layer34": "78693af7850550a1ba2866c95543329226efb4ec56127b815cf0bbf4ec95e043", + "layer35": "79f579de2ace3ba65476fd1cb98d6446ca459fc1c807c6ad080df396734f66e4", + "layer36": "b3cfac9780057b4ec694b41a81f69f5ea241e3ccc9fc060156fdd21f68a11965", + "layer37": "86014746f99de9a46447e3d3fbd29a3990e52a0fb17e1a04f8bb5a873e3d9198", + "layer38": "35eb10b9b390b8984636f0c14641bc08ab6471da2b7bc3814fe52ee505a84842", + "layer39": "fa346ac751c6a39935963e527bee45c42d4d9fbc721d95758b06c4bef7a242f9", + "layer4": "3ab04b3add6878a71c5923d1763a4b021f34f265ec7c9876620655e30864ea75", + "layer40": "8fe46263cd11b57806b2348ab73620b5419accbcc7e7dfaf931746823268734d", + "layer41": "62e190ddfd62ede4afdb67740fe162e9174660961fb86f4fc00f16eacecad3c2", + "layer42": "087f1c2d9418424285d9c8c3e4a4b6b943c60fbec526c34b2759e5879c788cf0", + "layer43": "8a0831fc6618bb556322abaf0826fb1285b7d1e2904495370884bd41f5e5a42a", + "layer44": "bc4c8c3098a6438c5ee43abd6b43a9551432f7030bd5f568b5ba8ce59d4b0779", + "layer45": "57dc0dcfc0546cac1bd651a464977af5b6c62c51241c4672d19fc201b08fd534", + "layer46": "99dfc17b9be322e9bfef81990f63bd5d3680a060d83fdbe1dd8d9419b9e0955e", + "layer47": "68cada748fba27a66aebd31f9acb4dbd010f95d0551d88c09ebfb51fad77ecdb", + "layer5": "2c31e6442902e31ab91f31c0e773a0b5bdd1b3c0800f002b06cbc849123dba6c", + "layer6": "eb014381861351b820e1bb867a8e92983531683d8c1171896643e7227f10e4f6", + "layer7": "61e5e69eb375d12ba8dd87e3ceff2db742bcc3219e39b18b273dee1fc9e09054", + "layer8": "39729de6c2d08de70bc0677558ac8b84950f4dad46871bb14693bb36360be138", + "layer9": "b11d1bb5d82a302d0a2ec18ccea9ee8dc5f2d81e7655567a628cf73f01c8c307" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "update1/p1024-b4-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "update1/p1024-b4-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "19d1cc684f2ce47135fddac4681d880bb6c8ecd86130fea449778299262c0471", + "layer0": "421b8d5cbf6ec21c84f133a0e06837acb173709a44c878811b3c0e74a72d5710", + "layer1": "6825c4fa938d98bcc06e178ec3f276ce8549f1dff5ec2ea211e3a08b3f7e78c2", + "layer10": "7f2f75b0ff6b9f1c4724b530eb93c85a50ccf0095e91b4311adebc4595af0e55", + "layer11": "41f398155b38e86a3fd5d2fb02c2b1bc7dbf0595ae10d103ecebf56ecb753c2b", + "layer12": "91d83c58a757c90ee6a57a89608d8005a124e00072bfb766ab99f00944ce86b6", + "layer13": "562f5f03de0243da5e4ac1adce4839dcff82051f11e1ec8472063121fec1b0a0", + "layer14": "0500d42c8a2a026ebb62745c68648eb9c86fd21daf72d079bd6fa84f528e7b5b", + "layer15": "7d9de3ce75607e10bebd2744bf196c5e821cc0c243e739c6b0df41cd2f81e8bf", + "layer16": "aeb04c047f5611f921a14d34eac904470e3d14ce0ebb683366d2d83982e53391", + "layer17": "0d67f9ddca71f0514993e92930dc90f510aefbcc70e4847ac38be6b7dc8e947d", + "layer18": "a381a1e8acc1bef99acc90c3e91738a0c4c5940ace4b429be2f3a25156d40732", + "layer19": "58ef74cd1e7f819ff11a3ffe456bf9f91720f5eb7fff838fef4a34c66ed73d20", + "layer2": "eddcdeb95919eac948f5ba9423b0e95f5b4296b242efcfaccbda014ce8d46fa7", + "layer20": "e2fae8441feaa2b6b842ef6afece74d417347d2be0f0d039f23ca3039db39eef", + "layer21": "0f6372e6662b500b17a1376471423d35a6401496bc6b41872f9a534e77b907d0", + "layer22": "51d954691d140b504b4f4a8b1d4c7751498c4937b944bdc58d4a4a8de9b231a8", + "layer23": "b5ddb82a2c1ac9dc85efabc91cd32a04ff0e199359ce65cee007c1d6fa5e327a", + "layer24": "148e67da3b7200062b59f3a489026d0828893b676cfd8a63aa2c5431c4c40299", + "layer25": "f64ccf05d8b8ca490589058f4e06bcacd4908675cb35ba8bd194ff37cdb9809d", + "layer26": "3918236ad02fa77a20bd41ed4f4c7acec34293bcea1c69eb51497a9fddef0e1f", + "layer27": "8d773f127598f1f151f41266eda066b5ea1bf424ac2b8d5eee2e6d863e8553f6", + "layer28": "fab60b9a8262cc5532d72c97b070218e0278729499b1b7c3c58c724b9fad67cd", + "layer29": "c57f9b81c72336d7f4b904fc00000ea03cdb1784da9d8a53a1238943bc61c428", + "layer3": "f2fe77e66c3362d1c83c53a663ba2f8f26c8148fe9a0d6e8211723c4c0751acf", + "layer30": "010bdddebf1643e1da3aedd0eb6a5f21d41eb94fbda2e455d4cf3ac0d4613ca0", + "layer31": "620bcf361f7cb408762f50295e8b8441b32adf8ef1f9a5dfbc150e782bdc3377", + "layer32": "6d9deaa9650f36742fb4f3f8b377a4c9f502bdad7bebeef0e4a71aa1c9301b1e", + "layer33": "f3b0777c786daf93e0bd7f8dfecfaf8c7680fc69dfb22572c61719bdaed3ade6", + "layer34": "6ef20dd0cab61e3981c933513a7858211d8c369800f3eb4ccc3c87f872ac1431", + "layer35": "6753001934a43dd3e407d84744d0ca4148b82478d3dfd3dfa813bf2540dd4229", + "layer36": "edf255cf402ae8af728e95ab4a982154d51b54edf26f0ad9b45bcf3b8c02129b", + "layer37": "6dc12cfeb708060d9e259a43d31f2acaa0d341fbd6563585cc7032eabc4fae18", + "layer38": "318a8668d11edf46db9269f9aab1752f8586e337afe4338ab668e679388dbd76", + "layer39": "2207510a90424a2bd3a92717d1e648e696632daca0ee04ba5f5e7186e0b927a8", + "layer4": "af2f72f3ed96c1e6d0f84484349385b568951b4f138d21c3b7a24a844459094b", + "layer40": "6bdbf118571bb7e8c8e870549620a8250b1f569d54ac2be0625444af81825c1c", + "layer41": "4fafa8b1a154930d7f6f95f15d275e88754f7ef256adcc0b30b02716c73a2952", + "layer42": "aaa3dce96cf906ab66be7f3bd06ba7ebfb9a60f229c2b4b8ce945d32efd3de9b", + "layer43": "aa92c5fe499e02cae398fdc24414a7de8a7732d1768c29e42be9edbd85ff37dc", + "layer44": "b82a833a65e26b1ae4e1ee0c98e72523bd7424f7cef92af31080ebf4399cc7d3", + "layer45": "cc040be4ca42b23bce1048efaccf06ebb179846a70ddd656ce23bfd12cafbd34", + "layer46": "36a2dd815385c3e8d9702bd3e1d95ed24de57b89c2d3774551840849934aa098", + "layer47": "ff713c07ea0be8c8cfafa68b369301c4de6158f457a15e4fbf4932762d940656", + "layer5": "c5d3def21b190b6c1941568f0d2ca6a4de20f927701e0a47bc9a0d1ecd6011f0", + "layer6": "80ea69ab9a8ab959bf3c31e88091c12ba74ca8cdef15388f228ff303e7ff8a4b", + "layer7": "b2206107a82b9db09a8b1f8ae7e58154eb043557b115e715bd5fdfca760cae3e", + "layer8": "78e0a2f6388037dfed7c2f27f24f5604443ccacff7629ad6b88afaefda7b2322", + "layer9": "3604b67d89595b6118ca9693a4a7d0240450d016c0e14f9663634f8ee5fdba02" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "update1/p1024-b4-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "update1/p1024-b4-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "19d1cc684f2ce47135fddac4681d880bb6c8ecd86130fea449778299262c0471", + "layer0": "421b8d5cbf6ec21c84f133a0e06837acb173709a44c878811b3c0e74a72d5710", + "layer1": "6825c4fa938d98bcc06e178ec3f276ce8549f1dff5ec2ea211e3a08b3f7e78c2", + "layer10": "7f2f75b0ff6b9f1c4724b530eb93c85a50ccf0095e91b4311adebc4595af0e55", + "layer11": "41f398155b38e86a3fd5d2fb02c2b1bc7dbf0595ae10d103ecebf56ecb753c2b", + "layer12": "91d83c58a757c90ee6a57a89608d8005a124e00072bfb766ab99f00944ce86b6", + "layer13": "562f5f03de0243da5e4ac1adce4839dcff82051f11e1ec8472063121fec1b0a0", + "layer14": "0500d42c8a2a026ebb62745c68648eb9c86fd21daf72d079bd6fa84f528e7b5b", + "layer15": "7d9de3ce75607e10bebd2744bf196c5e821cc0c243e739c6b0df41cd2f81e8bf", + "layer16": "aeb04c047f5611f921a14d34eac904470e3d14ce0ebb683366d2d83982e53391", + "layer17": "0d67f9ddca71f0514993e92930dc90f510aefbcc70e4847ac38be6b7dc8e947d", + "layer18": "a381a1e8acc1bef99acc90c3e91738a0c4c5940ace4b429be2f3a25156d40732", + "layer19": "58ef74cd1e7f819ff11a3ffe456bf9f91720f5eb7fff838fef4a34c66ed73d20", + "layer2": "eddcdeb95919eac948f5ba9423b0e95f5b4296b242efcfaccbda014ce8d46fa7", + "layer20": "e2fae8441feaa2b6b842ef6afece74d417347d2be0f0d039f23ca3039db39eef", + "layer21": "0f6372e6662b500b17a1376471423d35a6401496bc6b41872f9a534e77b907d0", + "layer22": "51d954691d140b504b4f4a8b1d4c7751498c4937b944bdc58d4a4a8de9b231a8", + "layer23": "b5ddb82a2c1ac9dc85efabc91cd32a04ff0e199359ce65cee007c1d6fa5e327a", + "layer24": "148e67da3b7200062b59f3a489026d0828893b676cfd8a63aa2c5431c4c40299", + "layer25": "f64ccf05d8b8ca490589058f4e06bcacd4908675cb35ba8bd194ff37cdb9809d", + "layer26": "3918236ad02fa77a20bd41ed4f4c7acec34293bcea1c69eb51497a9fddef0e1f", + "layer27": "8d773f127598f1f151f41266eda066b5ea1bf424ac2b8d5eee2e6d863e8553f6", + "layer28": "fab60b9a8262cc5532d72c97b070218e0278729499b1b7c3c58c724b9fad67cd", + "layer29": "c57f9b81c72336d7f4b904fc00000ea03cdb1784da9d8a53a1238943bc61c428", + "layer3": "f2fe77e66c3362d1c83c53a663ba2f8f26c8148fe9a0d6e8211723c4c0751acf", + "layer30": "010bdddebf1643e1da3aedd0eb6a5f21d41eb94fbda2e455d4cf3ac0d4613ca0", + "layer31": "620bcf361f7cb408762f50295e8b8441b32adf8ef1f9a5dfbc150e782bdc3377", + "layer32": "6d9deaa9650f36742fb4f3f8b377a4c9f502bdad7bebeef0e4a71aa1c9301b1e", + "layer33": "f3b0777c786daf93e0bd7f8dfecfaf8c7680fc69dfb22572c61719bdaed3ade6", + "layer34": "6ef20dd0cab61e3981c933513a7858211d8c369800f3eb4ccc3c87f872ac1431", + "layer35": "6753001934a43dd3e407d84744d0ca4148b82478d3dfd3dfa813bf2540dd4229", + "layer36": "edf255cf402ae8af728e95ab4a982154d51b54edf26f0ad9b45bcf3b8c02129b", + "layer37": "6dc12cfeb708060d9e259a43d31f2acaa0d341fbd6563585cc7032eabc4fae18", + "layer38": "318a8668d11edf46db9269f9aab1752f8586e337afe4338ab668e679388dbd76", + "layer39": "2207510a90424a2bd3a92717d1e648e696632daca0ee04ba5f5e7186e0b927a8", + "layer4": "af2f72f3ed96c1e6d0f84484349385b568951b4f138d21c3b7a24a844459094b", + "layer40": "6bdbf118571bb7e8c8e870549620a8250b1f569d54ac2be0625444af81825c1c", + "layer41": "4fafa8b1a154930d7f6f95f15d275e88754f7ef256adcc0b30b02716c73a2952", + "layer42": "aaa3dce96cf906ab66be7f3bd06ba7ebfb9a60f229c2b4b8ce945d32efd3de9b", + "layer43": "aa92c5fe499e02cae398fdc24414a7de8a7732d1768c29e42be9edbd85ff37dc", + "layer44": "b82a833a65e26b1ae4e1ee0c98e72523bd7424f7cef92af31080ebf4399cc7d3", + "layer45": "cc040be4ca42b23bce1048efaccf06ebb179846a70ddd656ce23bfd12cafbd34", + "layer46": "36a2dd815385c3e8d9702bd3e1d95ed24de57b89c2d3774551840849934aa098", + "layer47": "ff713c07ea0be8c8cfafa68b369301c4de6158f457a15e4fbf4932762d940656", + "layer5": "c5d3def21b190b6c1941568f0d2ca6a4de20f927701e0a47bc9a0d1ecd6011f0", + "layer6": "80ea69ab9a8ab959bf3c31e88091c12ba74ca8cdef15388f228ff303e7ff8a4b", + "layer7": "b2206107a82b9db09a8b1f8ae7e58154eb043557b115e715bd5fdfca760cae3e", + "layer8": "78e0a2f6388037dfed7c2f27f24f5604443ccacff7629ad6b88afaefda7b2322", + "layer9": "3604b67d89595b6118ca9693a4a7d0240450d016c0e14f9663634f8ee5fdba02" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "update2/p0008-b1-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "update2/p0008-b1-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "c3fdfa4919e8fb1e301c0d3bdab3942f0380f9b88a86b372dde99bb0b5dddaf7", + "layer0": "60138117a904ac6a6a55cadf19f313494fab7e200ab8eda9c8f01dc81532cffb", + "layer1": "55820fd513bd648bc40205e6eb57ed2e5710caa9f8b4fc18f8b011f4317786b2", + "layer10": "f29f1a9a2357d83044e2803b6fa87c7368c429512560ce9cc5755748872f1ee0", + "layer11": "6c47b697cb4c3d2ad1e536d3f2d848df268856478d73c4aa6d7860f996e3cf4b", + "layer12": "6de5cc04fef5be2d76dcb0cb771a6f2a5d8b5623a3c4953cf67cd0d698de4e2b", + "layer13": "23303aef74e437bbf7eb8fe81e8292c45a1e9f192be42f787765c79e3e558a75", + "layer14": "ec6a6d2ba47d8cd918db8e575f17e82fad793046b3150e4679854fafefb42def", + "layer15": "4d471489ff78342e981bd684aeddc8e2fa336e6e2a6ffd537bbbf1d4589360cf", + "layer16": "30bf47b568ef128f2f6a3ee463c3bbe009561d82fdb48c06becf3bd5aa1982f4", + "layer17": "41110efa741b8856b8a65dbbafc5d71c5fe914c9ce6958e9a744cee83ea70348", + "layer18": "4f3b5c6a7d4e58385e3f036ac741f027722e63215fa76527f7cb87f09b9e133b", + "layer19": "8868e733ac9c12789087548112ae023dba723f3d166c6ef33c2e1f93e587c160", + "layer2": "6e724749dc641e9a32594e0a65fd7d5d3c9d5761a12c9bad808dc40ea1404dba", + "layer20": "8fa65f9c6dd4db836db41efe9e04ec2008eff75357f8f2cab561fbd0c0febc0f", + "layer21": "7ac50917cd8131d245aa771dfe70a21d3533ef8e7674eaaeb76ca07feb787d51", + "layer22": "6810a2b2c0ca115a361ef24df57a70923b4571bcd3023ffd0ed59e7fe27d620b", + "layer23": "9f90ebd715affe7e2bc7f1031f2b3bbd2125bde1599fcad62071847c05206666", + "layer24": "5baeee3e64be23fe20a9609550511eddccd2b209a26e0985f2b30514caa344af", + "layer25": "fd24e7ffc6dc39aabacf2f4fce0a0b163dab9bdd1fb55f321a369caf9674c145", + "layer26": "2ee6fe2c1fba8ee3812af747900bf5928bbc3234f99e259eae7d120352e35803", + "layer27": "1200f57dcbf6801b06a5d5bc28e6f9411f26c7476e00b6b7bc4f355fb15ac895", + "layer28": "f0f5634cfface2fea5db3eafb98f8ecca0136dc13f27480312931deeb6703b09", + "layer29": "f0a98000a2da710dbf59fabcd777fa835111cef5a3063b36af421c4e471b58d7", + "layer3": "8b20b186d59458aa317b1463f734e58096730f9da06c500f0446fa84a053ba00", + "layer30": "d5537bed7fd86e244cec0d8f4eafa16b03d9f80d197f54ed4dd7b9043a173d4b", + "layer31": "21b38dcb6037f3bc2806731ccf6271db698469f1a885be040e259e8e42117bee", + "layer32": "529ddd35057913cdd92f8534f31ae63ccd8925b375d5fd4dcea0dbc26ab932da", + "layer33": "f8a2272587acf1b5a3e76a3c5f80840149ab89c3c71828d7fcf48bd9583fc004", + "layer34": "de91f4e35da49d5fe02069fe5591a055a9ed5ad17e7f24fc6e772bca86c6c5f0", + "layer35": "5727c47637ac68b7247ef830bfc8b9610fd2aef6bb34a32f6248278cb414b0ce", + "layer36": "8130181cdbb476faee1a8716cf3623f63200b66a73b4c752e86680f2e2161a55", + "layer37": "d70efe26e5513fbe04f4986e93d5089638854f5091806d2b88b294b9f0c784ba", + "layer38": "86810157b12fe5701664334f62aacf41bed88a2f4e07f0057506fd152168497f", + "layer39": "f92782dfdeba18ab3673ba01f648c19a76449cce76f58fe94e97c14020f04b9c", + "layer4": "81494b115184f3efbf4fbcaddf5436bd64e45d41a53c8a102c5c1d68778187c2", + "layer40": "41fd76bc352cded3f4fb98d414fe550233b3bdb7c5b7562f8483ca8e4a1e2d52", + "layer41": "c535e8ddae417096ee1f50cde759d33d6a62d863cc9a4d4cf01900ceabe8ab5c", + "layer42": "148c44c217b78405f3afaf91568691bdb6fe71408d2404d67d6f7946734c10bb", + "layer43": "c2f66c2b845ab836a31c59bb9590f02be7d80477f0745db3f9c8d68fe0b42645", + "layer44": "f666c71245cfdc4abcddc3b70cfaa6bc9bc81d99ab08df56f871ef49bede9505", + "layer45": "4d671bb364472be41d5c7d8b63c219963de6a451e07e322f78b975821e00008d", + "layer46": "fd57dc1dcf412ba71bf9f3c540613dbdbf47f9f1eef71e1dfae320f52e415169", + "layer47": "3a17a3e3720662a4f671b3399d0a0d55eede4d873fc1ed2f8200a3f32c3a8c97", + "layer5": "5dc9c6756a52d92f3174612a649559423306f951a1d98bf367bda087612f8253", + "layer6": "3485bce83da9e22180997e84d008dc301fe6d4fb9b4655f6e4c3c1c3fdc76111", + "layer7": "e83e46867bbe2a09dc27340aadcd261284e78a44eb967b5bcca5488e8599fec6", + "layer8": "93f788032ca4a142163df13c38673820f063d030ceebadbeacc94e22a696e239", + "layer9": "6b6d3e7576527459d8a485603cf2fd6abb622fb0929ac8f3e915d339fbbc2d1a" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "update2/p0008-b1-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "update2/p0008-b1-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "c3fdfa4919e8fb1e301c0d3bdab3942f0380f9b88a86b372dde99bb0b5dddaf7", + "layer0": "60138117a904ac6a6a55cadf19f313494fab7e200ab8eda9c8f01dc81532cffb", + "layer1": "55820fd513bd648bc40205e6eb57ed2e5710caa9f8b4fc18f8b011f4317786b2", + "layer10": "f29f1a9a2357d83044e2803b6fa87c7368c429512560ce9cc5755748872f1ee0", + "layer11": "6c47b697cb4c3d2ad1e536d3f2d848df268856478d73c4aa6d7860f996e3cf4b", + "layer12": "6de5cc04fef5be2d76dcb0cb771a6f2a5d8b5623a3c4953cf67cd0d698de4e2b", + "layer13": "23303aef74e437bbf7eb8fe81e8292c45a1e9f192be42f787765c79e3e558a75", + "layer14": "ec6a6d2ba47d8cd918db8e575f17e82fad793046b3150e4679854fafefb42def", + "layer15": "4d471489ff78342e981bd684aeddc8e2fa336e6e2a6ffd537bbbf1d4589360cf", + "layer16": "30bf47b568ef128f2f6a3ee463c3bbe009561d82fdb48c06becf3bd5aa1982f4", + "layer17": "41110efa741b8856b8a65dbbafc5d71c5fe914c9ce6958e9a744cee83ea70348", + "layer18": "4f3b5c6a7d4e58385e3f036ac741f027722e63215fa76527f7cb87f09b9e133b", + "layer19": "8868e733ac9c12789087548112ae023dba723f3d166c6ef33c2e1f93e587c160", + "layer2": "6e724749dc641e9a32594e0a65fd7d5d3c9d5761a12c9bad808dc40ea1404dba", + "layer20": "8fa65f9c6dd4db836db41efe9e04ec2008eff75357f8f2cab561fbd0c0febc0f", + "layer21": "7ac50917cd8131d245aa771dfe70a21d3533ef8e7674eaaeb76ca07feb787d51", + "layer22": "6810a2b2c0ca115a361ef24df57a70923b4571bcd3023ffd0ed59e7fe27d620b", + "layer23": "9f90ebd715affe7e2bc7f1031f2b3bbd2125bde1599fcad62071847c05206666", + "layer24": "5baeee3e64be23fe20a9609550511eddccd2b209a26e0985f2b30514caa344af", + "layer25": "fd24e7ffc6dc39aabacf2f4fce0a0b163dab9bdd1fb55f321a369caf9674c145", + "layer26": "2ee6fe2c1fba8ee3812af747900bf5928bbc3234f99e259eae7d120352e35803", + "layer27": "1200f57dcbf6801b06a5d5bc28e6f9411f26c7476e00b6b7bc4f355fb15ac895", + "layer28": "f0f5634cfface2fea5db3eafb98f8ecca0136dc13f27480312931deeb6703b09", + "layer29": "f0a98000a2da710dbf59fabcd777fa835111cef5a3063b36af421c4e471b58d7", + "layer3": "8b20b186d59458aa317b1463f734e58096730f9da06c500f0446fa84a053ba00", + "layer30": "d5537bed7fd86e244cec0d8f4eafa16b03d9f80d197f54ed4dd7b9043a173d4b", + "layer31": "21b38dcb6037f3bc2806731ccf6271db698469f1a885be040e259e8e42117bee", + "layer32": "529ddd35057913cdd92f8534f31ae63ccd8925b375d5fd4dcea0dbc26ab932da", + "layer33": "f8a2272587acf1b5a3e76a3c5f80840149ab89c3c71828d7fcf48bd9583fc004", + "layer34": "de91f4e35da49d5fe02069fe5591a055a9ed5ad17e7f24fc6e772bca86c6c5f0", + "layer35": "5727c47637ac68b7247ef830bfc8b9610fd2aef6bb34a32f6248278cb414b0ce", + "layer36": "8130181cdbb476faee1a8716cf3623f63200b66a73b4c752e86680f2e2161a55", + "layer37": "d70efe26e5513fbe04f4986e93d5089638854f5091806d2b88b294b9f0c784ba", + "layer38": "86810157b12fe5701664334f62aacf41bed88a2f4e07f0057506fd152168497f", + "layer39": "f92782dfdeba18ab3673ba01f648c19a76449cce76f58fe94e97c14020f04b9c", + "layer4": "81494b115184f3efbf4fbcaddf5436bd64e45d41a53c8a102c5c1d68778187c2", + "layer40": "41fd76bc352cded3f4fb98d414fe550233b3bdb7c5b7562f8483ca8e4a1e2d52", + "layer41": "c535e8ddae417096ee1f50cde759d33d6a62d863cc9a4d4cf01900ceabe8ab5c", + "layer42": "148c44c217b78405f3afaf91568691bdb6fe71408d2404d67d6f7946734c10bb", + "layer43": "c2f66c2b845ab836a31c59bb9590f02be7d80477f0745db3f9c8d68fe0b42645", + "layer44": "f666c71245cfdc4abcddc3b70cfaa6bc9bc81d99ab08df56f871ef49bede9505", + "layer45": "4d671bb364472be41d5c7d8b63c219963de6a451e07e322f78b975821e00008d", + "layer46": "fd57dc1dcf412ba71bf9f3c540613dbdbf47f9f1eef71e1dfae320f52e415169", + "layer47": "3a17a3e3720662a4f671b3399d0a0d55eede4d873fc1ed2f8200a3f32c3a8c97", + "layer5": "5dc9c6756a52d92f3174612a649559423306f951a1d98bf367bda087612f8253", + "layer6": "3485bce83da9e22180997e84d008dc301fe6d4fb9b4655f6e4c3c1c3fdc76111", + "layer7": "e83e46867bbe2a09dc27340aadcd261284e78a44eb967b5bcca5488e8599fec6", + "layer8": "93f788032ca4a142163df13c38673820f063d030ceebadbeacc94e22a696e239", + "layer9": "6b6d3e7576527459d8a485603cf2fd6abb622fb0929ac8f3e915d339fbbc2d1a" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "update2/p0008-b4-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "update2/p0008-b4-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "cf2ae0d9dd78d825b1134d6995a0c738b48f6d9205d28c60264684dde7ab44bd", + "layer0": "4b1040227752ee0a44273bf2d94629161fa03a1338bd81e79fb9075c17f7152b", + "layer1": "82e95996f390763442fc7276076fabbeb542e031795ede3cd2e215baa79e070b", + "layer10": "b451bd55ad28b742da84556662d4bb5a68e74ce2f19ec20e50ad32a5ce1c03b2", + "layer11": "41575d765c59f26b81f91be322394c7eef1104a7b5aef38022b31860153c8c2c", + "layer12": "7d0acda9a56efd25489496855377631dc1c7adea27a7fc5b0bf4353b5922e76e", + "layer13": "baf8909b621e63887cfc90f452cc7a6eb830050a1f228e97deeef61a3006281c", + "layer14": "06096e8611e148e26c9ba5c9f38c76c89ccd1c555db290971e09dd8e0dddbec5", + "layer15": "d5225bbc0dab2f5c3db42a60675a8d2331360b1fe4ba881169f28fda75ec11f6", + "layer16": "b5bf99fb55cf2cdf26f3a68063d190d0f4aaba8fa21aef998fcfaab25bc95bfc", + "layer17": "e41ecbe7b52414279c832a41c0e9fd886deaa85a33a7a77d3a0085480027894a", + "layer18": "07ecc000211e972a050b6f4407f0c0964409d18c4a2a83165624e3ab7816b712", + "layer19": "05db02ac66ee73dbe9f2cfc78666c14b2f4e32eacab3ae6bb9f6752997a57c3d", + "layer2": "2a4ceebe36e817a6de311b041ea332c7bbf5ae4f98d93c059d88f840d2de83d8", + "layer20": "e8f1d8446996b5bc30cd081f4b23395ab53d3214141cc3fbf9c3251267ed1355", + "layer21": "7697410a56b3bd9b7b38274d7e2ec3ebcc40a33ed3d716538d2685a0f0e1cdf4", + "layer22": "054ab2fc3c419b236ecf21a2fcc4281fec6d64700c4eb7f3184a01d49df6d539", + "layer23": "bc17e027f49723571e423a188163fd26ed706406d63fb55439b255d204df9e20", + "layer24": "ae983c653ffe94381518c415b32eb180387291f3c28ea2df3e55f568fd3c2b6e", + "layer25": "aa065d90d7e65708083d167ac05c7c2ececaf766fd01bb6306aa49228852b693", + "layer26": "61bb49b7b55e4fe8c1d075925e62ebecc94b2f094baa672248bb415d042a1899", + "layer27": "5882782916bf74d9fb41b7cecd7277f4e11df554a68a2fa29f969e5f3b95cdd1", + "layer28": "6fcfb30538bdd5adc41e751e26e9558e37ffbac0c7913300d36f1927bf2c3170", + "layer29": "799f07bead837d256020bd5d10d57cadc0c9d0c2e7b7461e140db3b40e3f770a", + "layer3": "782bbd66a5532ed552951f46e7c56eef027645783b65215834daff181d7d9318", + "layer30": "ffb179aea6b713a84a767e6f877dd3a264418f18c96cde8b0d62d1084634c53d", + "layer31": "0835adbecf4dc2624572cf0f4fe40631a60fc20916db0ad8a7fd3cfa81514076", + "layer32": "4795cbfb256d624a452b160c3a4d8cc5336c0a6701acb34e71e84453db4a3954", + "layer33": "13799d8e8d300bb010008b3848894922b5ddc59bb9cd7f4f5b95215be7238b85", + "layer34": "392e4e1ca04aab016d4ed9c57c27796880770866b1f562e07df40b0c93129345", + "layer35": "1c8df100247c23edef3fb66c63e60b68d4dc54e5539415fbf9d988e5dc821dc0", + "layer36": "c051082620119487bb232bad52c50fe070797527a0b27136b25ca16f601b51a7", + "layer37": "b9e7a3d55aa5f4072143dd21f21f2c44452232f1712be360bda4b005cab2eca7", + "layer38": "f4a35b17c9e15dcf470fb0a33731e6249d1ed234ed8c16b0115188a5346ee253", + "layer39": "b8cc7ebdf86ebdbba6cc5b3fc8f3faae6de78c99e2e6bcf3c7c22a3f55590356", + "layer4": "0edb0572693dd8c12cc95aeaf05b256452ad8e413110941833b2c93593c7e582", + "layer40": "8f9ef2c607edb26db56af4c097a7a7afa233c1d33efbaf043cb46b8ff0698c42", + "layer41": "9fcfbed8abc5ad342366c7ecfba56678d216eb530fcea7724a3bd06e0641f333", + "layer42": "1d563dbbc732c808d034bfe4581a721cf17079fe62f42b5b367afed1aa29a1d3", + "layer43": "2446de19cad7351b97fadc45aebaa90ab5544ba3c23107ab03912bde1f778b06", + "layer44": "ab8525f3fff126359fe58bbb6565c3bff7158cf4e19428c19866559d586a91d0", + "layer45": "7b3318a19008cd52c1b9882aa5c76070418385e9684e71ff48692283ea7267ec", + "layer46": "b1552e26e7a3b6bfbe38a65cc315e01efc6b2253a181e6cc55040c1789f4870f", + "layer47": "1cb3e7d72dff524840ec72043e6b892805645ca04dea3236772c6e9cfd178cab", + "layer5": "d5af3a1d56b99320110a6b67b4c0ef02da4f5aac31a0be2d955a64ee06933dc8", + "layer6": "0e85f5c507dd7cdc061c4081c5df19d240881745bf208463d929ecfd1a43799e", + "layer7": "55b8ec5182d7f7e34a2cc7766f1124a69534eabcc4279933fd4673a0a44a4899", + "layer8": "3d14c684e6777580910cdf444b897f807ac5029e65641837b7610f877db825a6", + "layer9": "e9decc46bf9a469550a30cacfeb442bd9cc1b87d20e6505a4516f6e7d37c87e1" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "update2/p0008-b4-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "update2/p0008-b4-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "cf2ae0d9dd78d825b1134d6995a0c738b48f6d9205d28c60264684dde7ab44bd", + "layer0": "4b1040227752ee0a44273bf2d94629161fa03a1338bd81e79fb9075c17f7152b", + "layer1": "82e95996f390763442fc7276076fabbeb542e031795ede3cd2e215baa79e070b", + "layer10": "b451bd55ad28b742da84556662d4bb5a68e74ce2f19ec20e50ad32a5ce1c03b2", + "layer11": "41575d765c59f26b81f91be322394c7eef1104a7b5aef38022b31860153c8c2c", + "layer12": "7d0acda9a56efd25489496855377631dc1c7adea27a7fc5b0bf4353b5922e76e", + "layer13": "baf8909b621e63887cfc90f452cc7a6eb830050a1f228e97deeef61a3006281c", + "layer14": "06096e8611e148e26c9ba5c9f38c76c89ccd1c555db290971e09dd8e0dddbec5", + "layer15": "d5225bbc0dab2f5c3db42a60675a8d2331360b1fe4ba881169f28fda75ec11f6", + "layer16": "b5bf99fb55cf2cdf26f3a68063d190d0f4aaba8fa21aef998fcfaab25bc95bfc", + "layer17": "e41ecbe7b52414279c832a41c0e9fd886deaa85a33a7a77d3a0085480027894a", + "layer18": "07ecc000211e972a050b6f4407f0c0964409d18c4a2a83165624e3ab7816b712", + "layer19": "05db02ac66ee73dbe9f2cfc78666c14b2f4e32eacab3ae6bb9f6752997a57c3d", + "layer2": "2a4ceebe36e817a6de311b041ea332c7bbf5ae4f98d93c059d88f840d2de83d8", + "layer20": "e8f1d8446996b5bc30cd081f4b23395ab53d3214141cc3fbf9c3251267ed1355", + "layer21": "7697410a56b3bd9b7b38274d7e2ec3ebcc40a33ed3d716538d2685a0f0e1cdf4", + "layer22": "054ab2fc3c419b236ecf21a2fcc4281fec6d64700c4eb7f3184a01d49df6d539", + "layer23": "bc17e027f49723571e423a188163fd26ed706406d63fb55439b255d204df9e20", + "layer24": "ae983c653ffe94381518c415b32eb180387291f3c28ea2df3e55f568fd3c2b6e", + "layer25": "aa065d90d7e65708083d167ac05c7c2ececaf766fd01bb6306aa49228852b693", + "layer26": "61bb49b7b55e4fe8c1d075925e62ebecc94b2f094baa672248bb415d042a1899", + "layer27": "5882782916bf74d9fb41b7cecd7277f4e11df554a68a2fa29f969e5f3b95cdd1", + "layer28": "6fcfb30538bdd5adc41e751e26e9558e37ffbac0c7913300d36f1927bf2c3170", + "layer29": "799f07bead837d256020bd5d10d57cadc0c9d0c2e7b7461e140db3b40e3f770a", + "layer3": "782bbd66a5532ed552951f46e7c56eef027645783b65215834daff181d7d9318", + "layer30": "ffb179aea6b713a84a767e6f877dd3a264418f18c96cde8b0d62d1084634c53d", + "layer31": "0835adbecf4dc2624572cf0f4fe40631a60fc20916db0ad8a7fd3cfa81514076", + "layer32": "4795cbfb256d624a452b160c3a4d8cc5336c0a6701acb34e71e84453db4a3954", + "layer33": "13799d8e8d300bb010008b3848894922b5ddc59bb9cd7f4f5b95215be7238b85", + "layer34": "392e4e1ca04aab016d4ed9c57c27796880770866b1f562e07df40b0c93129345", + "layer35": "1c8df100247c23edef3fb66c63e60b68d4dc54e5539415fbf9d988e5dc821dc0", + "layer36": "c051082620119487bb232bad52c50fe070797527a0b27136b25ca16f601b51a7", + "layer37": "b9e7a3d55aa5f4072143dd21f21f2c44452232f1712be360bda4b005cab2eca7", + "layer38": "f4a35b17c9e15dcf470fb0a33731e6249d1ed234ed8c16b0115188a5346ee253", + "layer39": "b8cc7ebdf86ebdbba6cc5b3fc8f3faae6de78c99e2e6bcf3c7c22a3f55590356", + "layer4": "0edb0572693dd8c12cc95aeaf05b256452ad8e413110941833b2c93593c7e582", + "layer40": "8f9ef2c607edb26db56af4c097a7a7afa233c1d33efbaf043cb46b8ff0698c42", + "layer41": "9fcfbed8abc5ad342366c7ecfba56678d216eb530fcea7724a3bd06e0641f333", + "layer42": "1d563dbbc732c808d034bfe4581a721cf17079fe62f42b5b367afed1aa29a1d3", + "layer43": "2446de19cad7351b97fadc45aebaa90ab5544ba3c23107ab03912bde1f778b06", + "layer44": "ab8525f3fff126359fe58bbb6565c3bff7158cf4e19428c19866559d586a91d0", + "layer45": "7b3318a19008cd52c1b9882aa5c76070418385e9684e71ff48692283ea7267ec", + "layer46": "b1552e26e7a3b6bfbe38a65cc315e01efc6b2253a181e6cc55040c1789f4870f", + "layer47": "1cb3e7d72dff524840ec72043e6b892805645ca04dea3236772c6e9cfd178cab", + "layer5": "d5af3a1d56b99320110a6b67b4c0ef02da4f5aac31a0be2d955a64ee06933dc8", + "layer6": "0e85f5c507dd7cdc061c4081c5df19d240881745bf208463d929ecfd1a43799e", + "layer7": "55b8ec5182d7f7e34a2cc7766f1124a69534eabcc4279933fd4673a0a44a4899", + "layer8": "3d14c684e6777580910cdf444b897f807ac5029e65641837b7610f877db825a6", + "layer9": "e9decc46bf9a469550a30cacfeb442bd9cc1b87d20e6505a4516f6e7d37c87e1" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "update2/p0064-b1-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "update2/p0064-b1-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "74fc357dee08af48a56d775130799a8efee0893d9a543d616910c6c3995c9320", + "layer0": "ea16a603f205f5e5176aee73683355057d85984aef99dcd98619c5dcf71d64b4", + "layer1": "799d344db64615f29691aa528f7ffab168e59aa02b20ce027b259ff4427ba658", + "layer10": "6256599d0e35cba039b5c1b5a5d84da6d526b0b003d535f28e8d4d50b2676313", + "layer11": "85b5529d83ac9b3c3522720e2afa89254b6edc3813e11bd7ebfbb28e89109f28", + "layer12": "65220f7a0480cc59b2e937a587f770b0f1a80960528f8b0cc31aeaf35134a916", + "layer13": "a2c922c2f43a85dfebddf568b45f8fbc913dc292703b1cf39278c45aa55e261d", + "layer14": "9dfed0fc609350c4e315712517124089f56ede9f9a6282528be01c8ac186f2c1", + "layer15": "e7d4feb100d972e04032552147208c4edd4b6f7a92203350c065d0eb4b5d32ba", + "layer16": "dabcb7650a13ef2e452874a62589bc09958ab9b8f023ed22976b584b262a4312", + "layer17": "4eb9583a616dd84f8e9084167b17082028565704b0062f2b63861a840ec3aaa0", + "layer18": "dc1fa5395ca75b8aaaa3fbffe13f60e45628e60093e8662b7cf1495a01ea1de0", + "layer19": "4c15295b4123a6f651d884e31db705ec619fa8109e6f4f452c3f3b7e5caa6ba5", + "layer2": "2958078f9b6f3efce0c6896659e11b24360cc74f2704d4a4de82e96c02807d95", + "layer20": "cc11964cc9dbbb40361072f5e3b8dc05c5559e112a943a0f65c1667c7f17abe8", + "layer21": "04e0a8499dd91a5639a58f1fba47af5b94a0f0e32f313cee439105b05d3a34cd", + "layer22": "1422e4b58602f6c730926792c26df91cc540873f8b77582926d76a5f2b33c2e2", + "layer23": "f80bad40a642ddea5413d477157ee2951b55397f07e9c88bad717f3a036ef11d", + "layer24": "01748dc657a03da262ee80808f12abaaf9f15868fb3fb96b4ef52080d575ae57", + "layer25": "f5db52ba606ed9f9a5f9dd5f691a05ace7533fa2853c2441254db5837cacacfa", + "layer26": "08e12cb9dd79c6cbb0898a12a6955264241421ca8c8f7d9f8e3eb5be2f7a2d9b", + "layer27": "e5fd1acf6ac961964bbfe08502cc032cbfc4a8e777562351f3b7b4b7d85fd625", + "layer28": "40e874ed228954b3d966702870817b41366431fe2be77d9302120150bad102c8", + "layer29": "dc6db07cbd36559198e52b870354ff06610a5f940f4b23f890c6966e97e869bf", + "layer3": "6eede9a3ba3f1c94ddef4aef245908def28eef71468ece81bc67f41c31b47475", + "layer30": "0d7840f7944caad13f37153e7c536711d61d722bc92c49cef9e867d043ce6906", + "layer31": "7d80f05ab51f6918c125e512b8115fc273bc7f537fc3bd7b6e21b219bf921321", + "layer32": "83f46d2e8ea185e3cdfdd13cfa7360959fc72d8b4c0a290150fbd42a7dd25196", + "layer33": "a76ab194685338dadd0cdc5c57c2a8361f1bb217ff22db88538340f8f52c7c13", + "layer34": "aeb104c4791ba3b2f67f5c4f395b60c7fc1f6d2849e56fdbd7b11c364b259d4d", + "layer35": "de502dea04bd5529de5f740477cb7ff741e4454eb91e7c993db9b9d274e316b2", + "layer36": "fdb94d72cb785afe75e27134b5e1484925988010f2540e61cb4ee89dc9737185", + "layer37": "6ca6a90e5c23de7e00279a7147a0e1105f42c164e032ba4029a8707ed860bb44", + "layer38": "b6a15604c47df2252bd3a0914cf246eb524bd1ab3114de690051fe5e8e491322", + "layer39": "9fccb052390da5a8938757187038320cc518312f9d5ca1fe74e47e8c78565f24", + "layer4": "526615e679a2ed85bc8e4f815c65ae11f76cf71f744e463bdfeeaf15f4facbda", + "layer40": "59f8361ce2a630bc1abf2d7da6cae8fd0dd649ac699aa9057dc9b4737a4057cf", + "layer41": "eabe692f214ff6b4cb1bab18e71db97aa9b37bf07bd698d551932af5b0fea9bd", + "layer42": "384baf547cd48d20c0a3a21010daea4e2c61cd31a7889fa7f14ebb85423a1dc5", + "layer43": "6f0e7a8f4db3145b681b0a5fc99b19f2b21464f4ea45bb97e3228645e17ec0ba", + "layer44": "e46e2d487bfc27f46e75940cee078a76a9413b3df5655e4f5f1b45a7a7565481", + "layer45": "184a84437bcc5b7c6ea5604ce867742765bc8f51307f2ec509cdc2c1059341d1", + "layer46": "7b61154fd4c1b74266b4446e41840d25786f1c5b0fad720169fa07de46b35f57", + "layer47": "dd0e1a1198e9ffa3f486e9aad1c749e374f701467d569df7753a063e19e72ca6", + "layer5": "57409294ae3c98e57f803fa0dadc09bd0a6d1a369d1cfa7ff7f6fa5ae4b3f2b3", + "layer6": "801f0bd90a7c08d5a936ebeeaab34120e65eaebff97bf883cfb4f9b927459562", + "layer7": "c9a4b6bd776b86983c1729f4792b116ecc5409aeff582ee2847bae7b23bef44a", + "layer8": "ef926f45c8527a82b62c7e23942dadde2fc919ff0fe83621b1001d9ca612aab6", + "layer9": "848f54519853b869e16bc3ec0cd20930f9850a564445d3bef96b6eb7e10f6642" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "update2/p0064-b1-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "update2/p0064-b1-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "74fc357dee08af48a56d775130799a8efee0893d9a543d616910c6c3995c9320", + "layer0": "ea16a603f205f5e5176aee73683355057d85984aef99dcd98619c5dcf71d64b4", + "layer1": "799d344db64615f29691aa528f7ffab168e59aa02b20ce027b259ff4427ba658", + "layer10": "6256599d0e35cba039b5c1b5a5d84da6d526b0b003d535f28e8d4d50b2676313", + "layer11": "85b5529d83ac9b3c3522720e2afa89254b6edc3813e11bd7ebfbb28e89109f28", + "layer12": "65220f7a0480cc59b2e937a587f770b0f1a80960528f8b0cc31aeaf35134a916", + "layer13": "a2c922c2f43a85dfebddf568b45f8fbc913dc292703b1cf39278c45aa55e261d", + "layer14": "9dfed0fc609350c4e315712517124089f56ede9f9a6282528be01c8ac186f2c1", + "layer15": "e7d4feb100d972e04032552147208c4edd4b6f7a92203350c065d0eb4b5d32ba", + "layer16": "dabcb7650a13ef2e452874a62589bc09958ab9b8f023ed22976b584b262a4312", + "layer17": "4eb9583a616dd84f8e9084167b17082028565704b0062f2b63861a840ec3aaa0", + "layer18": "dc1fa5395ca75b8aaaa3fbffe13f60e45628e60093e8662b7cf1495a01ea1de0", + "layer19": "4c15295b4123a6f651d884e31db705ec619fa8109e6f4f452c3f3b7e5caa6ba5", + "layer2": "2958078f9b6f3efce0c6896659e11b24360cc74f2704d4a4de82e96c02807d95", + "layer20": "cc11964cc9dbbb40361072f5e3b8dc05c5559e112a943a0f65c1667c7f17abe8", + "layer21": "04e0a8499dd91a5639a58f1fba47af5b94a0f0e32f313cee439105b05d3a34cd", + "layer22": "1422e4b58602f6c730926792c26df91cc540873f8b77582926d76a5f2b33c2e2", + "layer23": "f80bad40a642ddea5413d477157ee2951b55397f07e9c88bad717f3a036ef11d", + "layer24": "01748dc657a03da262ee80808f12abaaf9f15868fb3fb96b4ef52080d575ae57", + "layer25": "f5db52ba606ed9f9a5f9dd5f691a05ace7533fa2853c2441254db5837cacacfa", + "layer26": "08e12cb9dd79c6cbb0898a12a6955264241421ca8c8f7d9f8e3eb5be2f7a2d9b", + "layer27": "e5fd1acf6ac961964bbfe08502cc032cbfc4a8e777562351f3b7b4b7d85fd625", + "layer28": "40e874ed228954b3d966702870817b41366431fe2be77d9302120150bad102c8", + "layer29": "dc6db07cbd36559198e52b870354ff06610a5f940f4b23f890c6966e97e869bf", + "layer3": "6eede9a3ba3f1c94ddef4aef245908def28eef71468ece81bc67f41c31b47475", + "layer30": "0d7840f7944caad13f37153e7c536711d61d722bc92c49cef9e867d043ce6906", + "layer31": "7d80f05ab51f6918c125e512b8115fc273bc7f537fc3bd7b6e21b219bf921321", + "layer32": "83f46d2e8ea185e3cdfdd13cfa7360959fc72d8b4c0a290150fbd42a7dd25196", + "layer33": "a76ab194685338dadd0cdc5c57c2a8361f1bb217ff22db88538340f8f52c7c13", + "layer34": "aeb104c4791ba3b2f67f5c4f395b60c7fc1f6d2849e56fdbd7b11c364b259d4d", + "layer35": "de502dea04bd5529de5f740477cb7ff741e4454eb91e7c993db9b9d274e316b2", + "layer36": "fdb94d72cb785afe75e27134b5e1484925988010f2540e61cb4ee89dc9737185", + "layer37": "6ca6a90e5c23de7e00279a7147a0e1105f42c164e032ba4029a8707ed860bb44", + "layer38": "b6a15604c47df2252bd3a0914cf246eb524bd1ab3114de690051fe5e8e491322", + "layer39": "9fccb052390da5a8938757187038320cc518312f9d5ca1fe74e47e8c78565f24", + "layer4": "526615e679a2ed85bc8e4f815c65ae11f76cf71f744e463bdfeeaf15f4facbda", + "layer40": "59f8361ce2a630bc1abf2d7da6cae8fd0dd649ac699aa9057dc9b4737a4057cf", + "layer41": "eabe692f214ff6b4cb1bab18e71db97aa9b37bf07bd698d551932af5b0fea9bd", + "layer42": "384baf547cd48d20c0a3a21010daea4e2c61cd31a7889fa7f14ebb85423a1dc5", + "layer43": "6f0e7a8f4db3145b681b0a5fc99b19f2b21464f4ea45bb97e3228645e17ec0ba", + "layer44": "e46e2d487bfc27f46e75940cee078a76a9413b3df5655e4f5f1b45a7a7565481", + "layer45": "184a84437bcc5b7c6ea5604ce867742765bc8f51307f2ec509cdc2c1059341d1", + "layer46": "7b61154fd4c1b74266b4446e41840d25786f1c5b0fad720169fa07de46b35f57", + "layer47": "dd0e1a1198e9ffa3f486e9aad1c749e374f701467d569df7753a063e19e72ca6", + "layer5": "57409294ae3c98e57f803fa0dadc09bd0a6d1a369d1cfa7ff7f6fa5ae4b3f2b3", + "layer6": "801f0bd90a7c08d5a936ebeeaab34120e65eaebff97bf883cfb4f9b927459562", + "layer7": "c9a4b6bd776b86983c1729f4792b116ecc5409aeff582ee2847bae7b23bef44a", + "layer8": "ef926f45c8527a82b62c7e23942dadde2fc919ff0fe83621b1001d9ca612aab6", + "layer9": "848f54519853b869e16bc3ec0cd20930f9850a564445d3bef96b6eb7e10f6642" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "update2/p0064-b4-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "update2/p0064-b4-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "7e7b3bbff36cfaa8b7440b8f40cc326b66f1fb5f141d6d42a25824bd2ef9a4a1", + "layer0": "0b111e18597d2532702495f2e41312490d15c19e284ee501508e1b4ba1c27435", + "layer1": "ce4b546b8940c5a6fc1e9cb73eee47e3e692a3de511c8380d0cdc756a26b7a67", + "layer10": "8898e19c0649457ce3c6fb9586bf40332e3a271e7f44dd9d46a5c47b0af63a97", + "layer11": "851deb6583105c54aded6d73f72b3763bc89e61e226f43c8c886dbdba8eb6960", + "layer12": "553ba983cbb1ddfff1f5e8c4a48158bbe675fd6895a06b9d7a5f17e235f91fad", + "layer13": "175715734a486f6afddd2225bd12f6a8b803d221e1d2d0fe6803f385d9139761", + "layer14": "f2e75d278ffbee1c42a0555bff0e35a74bd3f6854f4c20e064ff79f3d3bbfa98", + "layer15": "242ed9641d4135462980ce86c6fa2584aae67065cc201169171c72d879a28ccd", + "layer16": "55f48bb288f9b9aba4c25f8a18aea9ca30cfd2b3121d95b4a72eb2bf3adb15f7", + "layer17": "f2e267e4d1a89f8453d43f723e6e8a67c3b79657fba89c70dc661809959be3c7", + "layer18": "08e9f038f3a133fea66944eebada541ccebd8c305d7b68300619fe92f78138f2", + "layer19": "92fca10240a1add3db75a9493837fbdce06df0a095eef1743a84fb33f24d9517", + "layer2": "84ea6669f8a942f3385361fc8ac5445965374a3dbcf02e3981c6ad12526eae30", + "layer20": "8fbccd5befeed56f10e197a011e54083f5e0b48159110188eb8ca9e2ec8106c8", + "layer21": "dc79be6cc34a9709c522eed7a9906167e4274d8e3843d06a5fa59ed871770bf7", + "layer22": "e21815b2779ff59f9494b0f7af24285677585d24a5e14d9302753ce6fe02d4c1", + "layer23": "cb50aca5fc69eb53cbe3fee90b32c1d775f21a83726bfa0577aa5cc52d0d9425", + "layer24": "b4e7c7d1b7e8b8a18e11538f23512deb2fa7f7ee9e3c30521c3e365db5cd0135", + "layer25": "93889f4a3626af62ab4dcbcca6c44b0fad667b0301ffcd576ede0792a2278558", + "layer26": "bd01474fe72c0f12f103b832ec07dca388c63d1c9abb9be71dc3e9ef425e7cb6", + "layer27": "a626f480dedfcade93b743bf20ef40ec549a291a5d9e50102ea6a616b45aa335", + "layer28": "6d9fb01027215693f1f3a23222f120a216d3ff80ce95198f9dbb935fdbb2ee4d", + "layer29": "e9c5e5aaff31eda6363e6b03b501a3068cd87854f58466caa493de3ca44922ed", + "layer3": "846c20e902b56911a51505ac72844d6cdfd0c4ccac8b212de6ad04c6d0e05905", + "layer30": "178b4088eef7a63b8a51482de9d43eebeed70e08ed9139b090619a6864fc717e", + "layer31": "a1287a744d8f6a543e97d8f2cdb88f72787f03cb17366fbc3f9cab6552ec465c", + "layer32": "36e1d936635b0100fc007c417a57e3ec574a32fa581871827d49de8df2d0e781", + "layer33": "3c2214ff64c4fcbfdc308b54861d5358737dc0ccab6420102cae3c4bb3dad1f3", + "layer34": "eee4ae75bb9a4242f81927b21b7c40db300d7144fa5cd160ef51f450c5904760", + "layer35": "affa89cb5a1bd5c8fb5a23e881b0169e039ea1533b48ec1b7368ba677e7f79f2", + "layer36": "1ffc6edc05e895810741c70248e46b5815516becb2539983071bb06ec553ba7d", + "layer37": "d8bf2be62b2f895baa3f0a3766597adc9d5a4c370837f692c2972a6dedc9cfe0", + "layer38": "177e390ae414cdad1b0b0a040b213cfe0dbdeea4593302afcf1b8b7b1be5e507", + "layer39": "6ce23ba4aba9e36be209a05bc397a8dcfb7423005f72ed59ace29b4e12dc6ce1", + "layer4": "a3963f97eabf507ef5d1d229c87030da700c45f4895adf689b43ec1de4ad10c5", + "layer40": "bf5a1c22b086623eaab0e0914904d9316023bf0aa266a363ec37d9e0427f47c4", + "layer41": "411c52ba2b511507bd7d00b527c338115d448124ddcb805920ddf0e05480bee2", + "layer42": "59562130384d9df93bad35a6a6c902ed2b847141c6ef732f797d23b47f8b898d", + "layer43": "f33c672d2aa6f46215e9345883bbfb75fc0b0d2fc26334c334c1cd9c44d9018e", + "layer44": "a760e0077b77bc16244a6f6068e5d46bb2c3210ac46561f1cb6fdce9738e7106", + "layer45": "160c3687571d69721476a6885e31d5fe7299cb288d366465b2f49b68da229836", + "layer46": "82721fc126b033578bfb38db9f12c3caf8f24d9cac12be3733cc26921caf58f9", + "layer47": "8a888f45043d83df5b71687c3487fe2b17083cee6684dd24892b0c1cc6f913e5", + "layer5": "214f8e188db572000c8787d5d07547f48bcdde8e188c7a779295f7b758fd7985", + "layer6": "235736e5028a9d4cb73f226c24936ea51643e75c018af2356db522851b9357e5", + "layer7": "da7797d2265f49e0f42a623740c4095e597cd98ea652cc9d4c6ad3db95f9e753", + "layer8": "034b72b5e05e440a79230b6d53e12c83c90c2d14bc1b048aced4b4d61cfae91e", + "layer9": "a4b21e38585ca4db38c740ba5e7def33157bd5815cfa4be57ce3d883c1d0985d" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "update2/p0064-b4-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "update2/p0064-b4-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "7e7b3bbff36cfaa8b7440b8f40cc326b66f1fb5f141d6d42a25824bd2ef9a4a1", + "layer0": "0b111e18597d2532702495f2e41312490d15c19e284ee501508e1b4ba1c27435", + "layer1": "ce4b546b8940c5a6fc1e9cb73eee47e3e692a3de511c8380d0cdc756a26b7a67", + "layer10": "8898e19c0649457ce3c6fb9586bf40332e3a271e7f44dd9d46a5c47b0af63a97", + "layer11": "851deb6583105c54aded6d73f72b3763bc89e61e226f43c8c886dbdba8eb6960", + "layer12": "553ba983cbb1ddfff1f5e8c4a48158bbe675fd6895a06b9d7a5f17e235f91fad", + "layer13": "175715734a486f6afddd2225bd12f6a8b803d221e1d2d0fe6803f385d9139761", + "layer14": "f2e75d278ffbee1c42a0555bff0e35a74bd3f6854f4c20e064ff79f3d3bbfa98", + "layer15": "242ed9641d4135462980ce86c6fa2584aae67065cc201169171c72d879a28ccd", + "layer16": "55f48bb288f9b9aba4c25f8a18aea9ca30cfd2b3121d95b4a72eb2bf3adb15f7", + "layer17": "f2e267e4d1a89f8453d43f723e6e8a67c3b79657fba89c70dc661809959be3c7", + "layer18": "08e9f038f3a133fea66944eebada541ccebd8c305d7b68300619fe92f78138f2", + "layer19": "92fca10240a1add3db75a9493837fbdce06df0a095eef1743a84fb33f24d9517", + "layer2": "84ea6669f8a942f3385361fc8ac5445965374a3dbcf02e3981c6ad12526eae30", + "layer20": "8fbccd5befeed56f10e197a011e54083f5e0b48159110188eb8ca9e2ec8106c8", + "layer21": "dc79be6cc34a9709c522eed7a9906167e4274d8e3843d06a5fa59ed871770bf7", + "layer22": "e21815b2779ff59f9494b0f7af24285677585d24a5e14d9302753ce6fe02d4c1", + "layer23": "cb50aca5fc69eb53cbe3fee90b32c1d775f21a83726bfa0577aa5cc52d0d9425", + "layer24": "b4e7c7d1b7e8b8a18e11538f23512deb2fa7f7ee9e3c30521c3e365db5cd0135", + "layer25": "93889f4a3626af62ab4dcbcca6c44b0fad667b0301ffcd576ede0792a2278558", + "layer26": "bd01474fe72c0f12f103b832ec07dca388c63d1c9abb9be71dc3e9ef425e7cb6", + "layer27": "a626f480dedfcade93b743bf20ef40ec549a291a5d9e50102ea6a616b45aa335", + "layer28": "6d9fb01027215693f1f3a23222f120a216d3ff80ce95198f9dbb935fdbb2ee4d", + "layer29": "e9c5e5aaff31eda6363e6b03b501a3068cd87854f58466caa493de3ca44922ed", + "layer3": "846c20e902b56911a51505ac72844d6cdfd0c4ccac8b212de6ad04c6d0e05905", + "layer30": "178b4088eef7a63b8a51482de9d43eebeed70e08ed9139b090619a6864fc717e", + "layer31": "a1287a744d8f6a543e97d8f2cdb88f72787f03cb17366fbc3f9cab6552ec465c", + "layer32": "36e1d936635b0100fc007c417a57e3ec574a32fa581871827d49de8df2d0e781", + "layer33": "3c2214ff64c4fcbfdc308b54861d5358737dc0ccab6420102cae3c4bb3dad1f3", + "layer34": "eee4ae75bb9a4242f81927b21b7c40db300d7144fa5cd160ef51f450c5904760", + "layer35": "affa89cb5a1bd5c8fb5a23e881b0169e039ea1533b48ec1b7368ba677e7f79f2", + "layer36": "1ffc6edc05e895810741c70248e46b5815516becb2539983071bb06ec553ba7d", + "layer37": "d8bf2be62b2f895baa3f0a3766597adc9d5a4c370837f692c2972a6dedc9cfe0", + "layer38": "177e390ae414cdad1b0b0a040b213cfe0dbdeea4593302afcf1b8b7b1be5e507", + "layer39": "6ce23ba4aba9e36be209a05bc397a8dcfb7423005f72ed59ace29b4e12dc6ce1", + "layer4": "a3963f97eabf507ef5d1d229c87030da700c45f4895adf689b43ec1de4ad10c5", + "layer40": "bf5a1c22b086623eaab0e0914904d9316023bf0aa266a363ec37d9e0427f47c4", + "layer41": "411c52ba2b511507bd7d00b527c338115d448124ddcb805920ddf0e05480bee2", + "layer42": "59562130384d9df93bad35a6a6c902ed2b847141c6ef732f797d23b47f8b898d", + "layer43": "f33c672d2aa6f46215e9345883bbfb75fc0b0d2fc26334c334c1cd9c44d9018e", + "layer44": "a760e0077b77bc16244a6f6068e5d46bb2c3210ac46561f1cb6fdce9738e7106", + "layer45": "160c3687571d69721476a6885e31d5fe7299cb288d366465b2f49b68da229836", + "layer46": "82721fc126b033578bfb38db9f12c3caf8f24d9cac12be3733cc26921caf58f9", + "layer47": "8a888f45043d83df5b71687c3487fe2b17083cee6684dd24892b0c1cc6f913e5", + "layer5": "214f8e188db572000c8787d5d07547f48bcdde8e188c7a779295f7b758fd7985", + "layer6": "235736e5028a9d4cb73f226c24936ea51643e75c018af2356db522851b9357e5", + "layer7": "da7797d2265f49e0f42a623740c4095e597cd98ea652cc9d4c6ad3db95f9e753", + "layer8": "034b72b5e05e440a79230b6d53e12c83c90c2d14bc1b048aced4b4d61cfae91e", + "layer9": "a4b21e38585ca4db38c740ba5e7def33157bd5815cfa4be57ce3d883c1d0985d" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "update2/p0256-b1-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "update2/p0256-b1-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "ab555ea9aebaa5b427dcd33346863f8746cd93f9f66de06b9928a17c0a96c184", + "layer0": "a62b0d45bd380bd08f29b7da19022b36ecaef464f031293e286ffae53c075b67", + "layer1": "a9b316a6d6c08188efee370fa428f1e69e9327558816a9022dc563c96d974a77", + "layer10": "93ad9f61802844c4c9804d6b70f80f5679db7ae415e0b881813e736fae28f129", + "layer11": "9f25ae28a488060792df5857898a45e9ec58d76015c23c71b9dcd8022195cc65", + "layer12": "2f7c5be78876242ac1940c6b4092f20fd9f66dea8193528479c109e0b7194ac7", + "layer13": "c02c60769e32fcd0facfddd2043e642584a8f3e18828c168e9b2daba004a2313", + "layer14": "648c32ac5875e65c008bac5cd9995b1466083c43e7a0b70f834c7d4541489e62", + "layer15": "f126c3bd8e6f77459d64b29f50eb3622b404d49f6d3b7397dcad8024ff29aab9", + "layer16": "705dee739bd0ac5e55a7a213408b28daad6665ede19b29f8d3336cbfed8cd963", + "layer17": "a11751452eadf7a867922fa2d4e3c6635b6f097e44a0d661ccc34eedc0d67073", + "layer18": "9e7108d493d91254919a141c7fb9e93ddcec0c5a39943458aa4c1c645091cf9a", + "layer19": "32f416e4caf8f78067f4b0cb738191ecb3838922722a926799c1966e1d605399", + "layer2": "6443d9b3465650d88c043b6adf4a5185eb8d81a2585cd7e7b793f6e951def1bb", + "layer20": "30031afeb3f2c82b9a4f0d8c4d04d88e57b4b1a68b299c068681c21df45e024e", + "layer21": "f126ca6ac1861c2b3ec59d13c415b2086e77524bc4f41069c440f2dc506578c0", + "layer22": "2afd50364500543175d5e8c3de74163d664bc33d0df7895bb66b99fb7b7b1afd", + "layer23": "2d0d1609e7d91bbbfcba64bd0e068d412273e1e86f4d99d15ceef29cf8d18fb2", + "layer24": "6fb41b7d9cdaa8e9704ef1eafcd59912be06eff2f4eb5de8d162598e865693bf", + "layer25": "3b7fe90d0636408d2598311f22d57b05d318ceb0442257223aa1ee98a3f29e31", + "layer26": "7ea5fb352dcc0412310ac3ee8c0bd61068881cf04c337466fa158f71b3833ba8", + "layer27": "0d1f55ac91948e7fb3f8795a17ada1a136119ce6914d19a1237f501aae308809", + "layer28": "d23e378ce0c35ac83e3296b356129b1fd9155d83278ea827ce4453e540dcd84f", + "layer29": "4696aa124ab1bb71d9b850d7ffa9f4b56926fb7f2b300cb6999075795454e328", + "layer3": "e53f25f43076e6479f7c6e1c8132c4697f6e8a40a4db860d8fdd72f7e7385d48", + "layer30": "adf7cc84fb6bdbec061a2b79fe771ce2bb4f6acdc5f9a2d35fcdf7aebdd675d1", + "layer31": "a9a2748d09e03a2c7f32674ab79175735b7c70e130ebb3d4f1b63723c1639b77", + "layer32": "32e06a768d131c81375aca8ff5c377d1f6f8865e0797869c20e7738ba3b9bde6", + "layer33": "4c09f1489c7837803d3c19e06d8e03996a2a2f443794b084e087b5da67f9b46d", + "layer34": "68e0e0a9c24740cbaca0d9bee7e3c2ff14c9daa053af14fca343e6d1fc94b366", + "layer35": "1c1f99dffc4eb19f73057ca36046408bd98c0b65e0d2e3b1026c4d5f682e0ec3", + "layer36": "e817e74cfe61a069a06732c4b53f27e48bb0e789455808455972b646df8e15b2", + "layer37": "7a3a49045cfdd551f2714d86157b802d476859b5841a947046fcca5701a400c2", + "layer38": "207c61dd3dd7f06ded0cc81353e33774dae462433c499230afc304656d50fece", + "layer39": "c25d84760e19c2b1b79c354707a670c06842e1e98f2ee237087c49c1e883dbca", + "layer4": "890c7731abad8c8f331aeb0f6af657e987be63a8891e105e4cd867ac96cc8922", + "layer40": "9e175290ae7fc4f5439c25e01b2e13c77a88611da94dd0239609d7d2ac7e4182", + "layer41": "396fc49cfd7b1db318b74ea8d5785ffd6130b028831efa131d7b43f8f1ff990b", + "layer42": "cea65d6d020f180ec4cb87442cd2f9d5c2eace3e8e4cd7f4da78e4b772c89f01", + "layer43": "e91bbf1dca8e3bcab474b32370566e13f3168ea54a79fae90f7e7bd9c8c3a4d7", + "layer44": "fce6d2844dbc15cb4be032beb145aabaa381bfc53b32e671a3136716a790bd77", + "layer45": "1a2966520ed202679efd5fdabb61298eeb368042f5a423f6123a785d2b04b03b", + "layer46": "f466bf709e73bfea49afc7c1dbb313f76876b1f58a099e4431b968de05e8e4b4", + "layer47": "f6eec37f76e38a61135864b698c26aa1477563135bc5825bea762154e497ab06", + "layer5": "2bcfd8d665c6a92c3f533d8872d3bfabc0e459747e530b0f5a90373f27405309", + "layer6": "2ced8740cf3c32293df2e66921b0f454d84aa0e48da9d31037c6658597a25ec7", + "layer7": "02baba38a412110f4990cbffe93837039fac9c67a167ca78f1e6c58dd9d589ad", + "layer8": "1f42151022d02cb7226ccccccd9dc6a20f8ab12f18270b081b6fbd0ee2b4941e", + "layer9": "18dd03338624660c77941f9a2cdf33401479aa9d14f42180ec0a22ee9356d8e4" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "update2/p0256-b1-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "update2/p0256-b1-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "ab555ea9aebaa5b427dcd33346863f8746cd93f9f66de06b9928a17c0a96c184", + "layer0": "a62b0d45bd380bd08f29b7da19022b36ecaef464f031293e286ffae53c075b67", + "layer1": "a9b316a6d6c08188efee370fa428f1e69e9327558816a9022dc563c96d974a77", + "layer10": "93ad9f61802844c4c9804d6b70f80f5679db7ae415e0b881813e736fae28f129", + "layer11": "9f25ae28a488060792df5857898a45e9ec58d76015c23c71b9dcd8022195cc65", + "layer12": "2f7c5be78876242ac1940c6b4092f20fd9f66dea8193528479c109e0b7194ac7", + "layer13": "c02c60769e32fcd0facfddd2043e642584a8f3e18828c168e9b2daba004a2313", + "layer14": "648c32ac5875e65c008bac5cd9995b1466083c43e7a0b70f834c7d4541489e62", + "layer15": "f126c3bd8e6f77459d64b29f50eb3622b404d49f6d3b7397dcad8024ff29aab9", + "layer16": "705dee739bd0ac5e55a7a213408b28daad6665ede19b29f8d3336cbfed8cd963", + "layer17": "a11751452eadf7a867922fa2d4e3c6635b6f097e44a0d661ccc34eedc0d67073", + "layer18": "9e7108d493d91254919a141c7fb9e93ddcec0c5a39943458aa4c1c645091cf9a", + "layer19": "32f416e4caf8f78067f4b0cb738191ecb3838922722a926799c1966e1d605399", + "layer2": "6443d9b3465650d88c043b6adf4a5185eb8d81a2585cd7e7b793f6e951def1bb", + "layer20": "30031afeb3f2c82b9a4f0d8c4d04d88e57b4b1a68b299c068681c21df45e024e", + "layer21": "f126ca6ac1861c2b3ec59d13c415b2086e77524bc4f41069c440f2dc506578c0", + "layer22": "2afd50364500543175d5e8c3de74163d664bc33d0df7895bb66b99fb7b7b1afd", + "layer23": "2d0d1609e7d91bbbfcba64bd0e068d412273e1e86f4d99d15ceef29cf8d18fb2", + "layer24": "6fb41b7d9cdaa8e9704ef1eafcd59912be06eff2f4eb5de8d162598e865693bf", + "layer25": "3b7fe90d0636408d2598311f22d57b05d318ceb0442257223aa1ee98a3f29e31", + "layer26": "7ea5fb352dcc0412310ac3ee8c0bd61068881cf04c337466fa158f71b3833ba8", + "layer27": "0d1f55ac91948e7fb3f8795a17ada1a136119ce6914d19a1237f501aae308809", + "layer28": "d23e378ce0c35ac83e3296b356129b1fd9155d83278ea827ce4453e540dcd84f", + "layer29": "4696aa124ab1bb71d9b850d7ffa9f4b56926fb7f2b300cb6999075795454e328", + "layer3": "e53f25f43076e6479f7c6e1c8132c4697f6e8a40a4db860d8fdd72f7e7385d48", + "layer30": "adf7cc84fb6bdbec061a2b79fe771ce2bb4f6acdc5f9a2d35fcdf7aebdd675d1", + "layer31": "a9a2748d09e03a2c7f32674ab79175735b7c70e130ebb3d4f1b63723c1639b77", + "layer32": "32e06a768d131c81375aca8ff5c377d1f6f8865e0797869c20e7738ba3b9bde6", + "layer33": "4c09f1489c7837803d3c19e06d8e03996a2a2f443794b084e087b5da67f9b46d", + "layer34": "68e0e0a9c24740cbaca0d9bee7e3c2ff14c9daa053af14fca343e6d1fc94b366", + "layer35": "1c1f99dffc4eb19f73057ca36046408bd98c0b65e0d2e3b1026c4d5f682e0ec3", + "layer36": "e817e74cfe61a069a06732c4b53f27e48bb0e789455808455972b646df8e15b2", + "layer37": "7a3a49045cfdd551f2714d86157b802d476859b5841a947046fcca5701a400c2", + "layer38": "207c61dd3dd7f06ded0cc81353e33774dae462433c499230afc304656d50fece", + "layer39": "c25d84760e19c2b1b79c354707a670c06842e1e98f2ee237087c49c1e883dbca", + "layer4": "890c7731abad8c8f331aeb0f6af657e987be63a8891e105e4cd867ac96cc8922", + "layer40": "9e175290ae7fc4f5439c25e01b2e13c77a88611da94dd0239609d7d2ac7e4182", + "layer41": "396fc49cfd7b1db318b74ea8d5785ffd6130b028831efa131d7b43f8f1ff990b", + "layer42": "cea65d6d020f180ec4cb87442cd2f9d5c2eace3e8e4cd7f4da78e4b772c89f01", + "layer43": "e91bbf1dca8e3bcab474b32370566e13f3168ea54a79fae90f7e7bd9c8c3a4d7", + "layer44": "fce6d2844dbc15cb4be032beb145aabaa381bfc53b32e671a3136716a790bd77", + "layer45": "1a2966520ed202679efd5fdabb61298eeb368042f5a423f6123a785d2b04b03b", + "layer46": "f466bf709e73bfea49afc7c1dbb313f76876b1f58a099e4431b968de05e8e4b4", + "layer47": "f6eec37f76e38a61135864b698c26aa1477563135bc5825bea762154e497ab06", + "layer5": "2bcfd8d665c6a92c3f533d8872d3bfabc0e459747e530b0f5a90373f27405309", + "layer6": "2ced8740cf3c32293df2e66921b0f454d84aa0e48da9d31037c6658597a25ec7", + "layer7": "02baba38a412110f4990cbffe93837039fac9c67a167ca78f1e6c58dd9d589ad", + "layer8": "1f42151022d02cb7226ccccccd9dc6a20f8ab12f18270b081b6fbd0ee2b4941e", + "layer9": "18dd03338624660c77941f9a2cdf33401479aa9d14f42180ec0a22ee9356d8e4" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "update2/p0256-b4-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "update2/p0256-b4-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "3547ad963948cd3bcb860aca6f40c65462e2c55cbd3a4c3712d146c410cffd01", + "layer0": "2daf69000c22aaafedd6c53bc7074e4aa4e3c1c98aa503db12e3e223b62c7f2f", + "layer1": "9f9276ac3337c4913f5c4c22e2cbd94069cd90c496f36a5cab5759db23c418cf", + "layer10": "c90f24356152bae63181185c4c17a72f7f95e26e643ec53cbf6cf67a03b75430", + "layer11": "4f2b41e222a8db6e51ebe5e6bffcb50a18a7990d009d3c3828af3328cfc7b1be", + "layer12": "5486b8059004e5cf58d701723c6b1215e91053299ef2ac5785fbbf0e8a6974d8", + "layer13": "a08eef6f0cf5098d43874b8a47e5e79ac9645b2acbfc25605ca02454d97f3bf1", + "layer14": "11c21db606a14d2ca62c4b675d79c668ad1b8353886d6100511610ae6ebef919", + "layer15": "99fd9a5bcb942f32f4ac3c11583e2640e1abb1ca99df0070427c1f2f9e4e061c", + "layer16": "92cabe7ac161829dfd9b57d13d856624a5253790f8fa4f3b33a9a9ab88ae0467", + "layer17": "7fa99aebacbc95ca8bfce9fdc23f92e43a3e728a5c38a9fa6fdd1e473da6f207", + "layer18": "c90369390eb19482f554170b3d199e4aed6eda0a4e033c9100528aafb62f143d", + "layer19": "1c9bd9ca05f4072588512a48c03d6d663bfd2791be6e0ca19ceab99b1f1874a2", + "layer2": "1874eb1d159503e2ebae10a86038bac27beae95e1ac8c78e8079f4ced5d7eb23", + "layer20": "a813b9436f36e902cffc8dcb8d9cdfa019d5b62a63e6b1ae97741040e2258e14", + "layer21": "e23316c313a24ccf8115d3df1ce2cb3789c01dd68a259ac0333861545ad73cb3", + "layer22": "26e8d88066f025e6c1186fcb5fd071a2b78f496a44c3f38d34eda0dde8b9d690", + "layer23": "df25c57041bd78dd46c315e65b989d5da3db0fc6e1fac7390b0472051d305eb8", + "layer24": "2730e50498b85471cd3bffc305ea8a9286490705e3657e16662563b436815b6f", + "layer25": "6cedafbc7bd189c2b1da0fc0c24878ad2cd9b67ea5711259058a1fac488b26eb", + "layer26": "833593aecb9301d3171840f75226b1379de715224b18920f4d21be359716d4f9", + "layer27": "513c0fe524d958e06998e4fbdd601889672bb5d175feec22bd6f425cc95ae9bf", + "layer28": "38e1ac798fa246217788d435e8c7e25e98206e89cdcfcc4507fff13606182a61", + "layer29": "a5e86bf8b42c6d2cbab10c52c3ea18e222f6c8724cc3deaa65b5803dbba5d74d", + "layer3": "8e1c6b7ba30fac0bcc81607334eea991a0d04e5d9c02acfc0274575e183bc5c9", + "layer30": "5dec33a64a0569d9f4d641af779fefe2c527824bcd77cb6b1f4b2570b53cc271", + "layer31": "99b8834ea1cea98434b36c2c45cfd5246429f9f199b929faa51c15f0658a37fa", + "layer32": "9efea28b40528f9db8f89de7a66a0915ac244b67553e9ef0fae1450604df3a4a", + "layer33": "a4fbb3f6d7f93a99c974b884465540e3b47445104e9a25e7e2f3ef86647e7414", + "layer34": "93dd16c8ad84282ac82a6f314ed39768b4bd59f0ea78a07fe955900af538e06a", + "layer35": "e5ffdd32e3516bd99454e923030f1cd79ee8654e422617ff091137577d6e48bd", + "layer36": "058e4cbe9a293901ebe788705c9b605ff4f4c08ddd441d1e491c863a41aab4db", + "layer37": "46815aeb1d2deaf091874375fc8825ccdb13e352294b91f6aac2bb1892b8d1b0", + "layer38": "dd6b0649ab2913169442e7940c7ec8fd79c541661d0107338422e14502898f19", + "layer39": "6fa5682c6945248958d8d23b9389ebf7c9d32c56e78a42e782754f10893ec2a5", + "layer4": "a962e220b11a098343125bd6c1e72e8046b77cf01cf07e8ce1e017f9172dec40", + "layer40": "6620dbca305347d3506d51133f0f1bd17c8f2f273e66a20e68e2c37a318448fe", + "layer41": "69d542304325d81e8993b51e091eb9c640005b3a5d9f2bc53269bbe19725d228", + "layer42": "9eb75c5d8e4a023935afa4226ecd6d5e45a073174592c15f868b5e7c4d40cdf9", + "layer43": "0437745431165a309f415d71c2b5d72b6fffe636125e12548df297c49e02fb32", + "layer44": "9fd94119c31cd46375f3ed48b6c6abc2f4aa9288dd1f126b6e1f6e4952ef4650", + "layer45": "ee55dc4a0774bd68a3437da03757786bf1712f0da5660c14f8f0e8158fcc3416", + "layer46": "592e044e4e076f3d6399fee820d0e0fd2256d5d0229857a4ab816549eaf54d8c", + "layer47": "53b18eeb8f959ee68c1dbe6d7c1a736d9568003ebcc056dab4ccdf642268bf3a", + "layer5": "4e5e5abb6186be0317f3f0340e90805fa648fbb7ffbf3ad995b1aa985934d4ec", + "layer6": "957936c76afb2fcfc011044f7baab6b1c543ed336ff8153bcb4af0d9999b0b20", + "layer7": "227935751930038ee22170fba01eff8ed0c3dc5cce10247f4c3864a5cdf53622", + "layer8": "875baabaf0513bb51f6b3964a7ff05093f64356b1210f5fe414dd8ef9dc2985a", + "layer9": "dc361d2ebfad139d3f516dc4ab004ab2392c1cc894b8965b9a3af726fd1a8485" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "update2/p0256-b4-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "update2/p0256-b4-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "3547ad963948cd3bcb860aca6f40c65462e2c55cbd3a4c3712d146c410cffd01", + "layer0": "2daf69000c22aaafedd6c53bc7074e4aa4e3c1c98aa503db12e3e223b62c7f2f", + "layer1": "9f9276ac3337c4913f5c4c22e2cbd94069cd90c496f36a5cab5759db23c418cf", + "layer10": "c90f24356152bae63181185c4c17a72f7f95e26e643ec53cbf6cf67a03b75430", + "layer11": "4f2b41e222a8db6e51ebe5e6bffcb50a18a7990d009d3c3828af3328cfc7b1be", + "layer12": "5486b8059004e5cf58d701723c6b1215e91053299ef2ac5785fbbf0e8a6974d8", + "layer13": "a08eef6f0cf5098d43874b8a47e5e79ac9645b2acbfc25605ca02454d97f3bf1", + "layer14": "11c21db606a14d2ca62c4b675d79c668ad1b8353886d6100511610ae6ebef919", + "layer15": "99fd9a5bcb942f32f4ac3c11583e2640e1abb1ca99df0070427c1f2f9e4e061c", + "layer16": "92cabe7ac161829dfd9b57d13d856624a5253790f8fa4f3b33a9a9ab88ae0467", + "layer17": "7fa99aebacbc95ca8bfce9fdc23f92e43a3e728a5c38a9fa6fdd1e473da6f207", + "layer18": "c90369390eb19482f554170b3d199e4aed6eda0a4e033c9100528aafb62f143d", + "layer19": "1c9bd9ca05f4072588512a48c03d6d663bfd2791be6e0ca19ceab99b1f1874a2", + "layer2": "1874eb1d159503e2ebae10a86038bac27beae95e1ac8c78e8079f4ced5d7eb23", + "layer20": "a813b9436f36e902cffc8dcb8d9cdfa019d5b62a63e6b1ae97741040e2258e14", + "layer21": "e23316c313a24ccf8115d3df1ce2cb3789c01dd68a259ac0333861545ad73cb3", + "layer22": "26e8d88066f025e6c1186fcb5fd071a2b78f496a44c3f38d34eda0dde8b9d690", + "layer23": "df25c57041bd78dd46c315e65b989d5da3db0fc6e1fac7390b0472051d305eb8", + "layer24": "2730e50498b85471cd3bffc305ea8a9286490705e3657e16662563b436815b6f", + "layer25": "6cedafbc7bd189c2b1da0fc0c24878ad2cd9b67ea5711259058a1fac488b26eb", + "layer26": "833593aecb9301d3171840f75226b1379de715224b18920f4d21be359716d4f9", + "layer27": "513c0fe524d958e06998e4fbdd601889672bb5d175feec22bd6f425cc95ae9bf", + "layer28": "38e1ac798fa246217788d435e8c7e25e98206e89cdcfcc4507fff13606182a61", + "layer29": "a5e86bf8b42c6d2cbab10c52c3ea18e222f6c8724cc3deaa65b5803dbba5d74d", + "layer3": "8e1c6b7ba30fac0bcc81607334eea991a0d04e5d9c02acfc0274575e183bc5c9", + "layer30": "5dec33a64a0569d9f4d641af779fefe2c527824bcd77cb6b1f4b2570b53cc271", + "layer31": "99b8834ea1cea98434b36c2c45cfd5246429f9f199b929faa51c15f0658a37fa", + "layer32": "9efea28b40528f9db8f89de7a66a0915ac244b67553e9ef0fae1450604df3a4a", + "layer33": "a4fbb3f6d7f93a99c974b884465540e3b47445104e9a25e7e2f3ef86647e7414", + "layer34": "93dd16c8ad84282ac82a6f314ed39768b4bd59f0ea78a07fe955900af538e06a", + "layer35": "e5ffdd32e3516bd99454e923030f1cd79ee8654e422617ff091137577d6e48bd", + "layer36": "058e4cbe9a293901ebe788705c9b605ff4f4c08ddd441d1e491c863a41aab4db", + "layer37": "46815aeb1d2deaf091874375fc8825ccdb13e352294b91f6aac2bb1892b8d1b0", + "layer38": "dd6b0649ab2913169442e7940c7ec8fd79c541661d0107338422e14502898f19", + "layer39": "6fa5682c6945248958d8d23b9389ebf7c9d32c56e78a42e782754f10893ec2a5", + "layer4": "a962e220b11a098343125bd6c1e72e8046b77cf01cf07e8ce1e017f9172dec40", + "layer40": "6620dbca305347d3506d51133f0f1bd17c8f2f273e66a20e68e2c37a318448fe", + "layer41": "69d542304325d81e8993b51e091eb9c640005b3a5d9f2bc53269bbe19725d228", + "layer42": "9eb75c5d8e4a023935afa4226ecd6d5e45a073174592c15f868b5e7c4d40cdf9", + "layer43": "0437745431165a309f415d71c2b5d72b6fffe636125e12548df297c49e02fb32", + "layer44": "9fd94119c31cd46375f3ed48b6c6abc2f4aa9288dd1f126b6e1f6e4952ef4650", + "layer45": "ee55dc4a0774bd68a3437da03757786bf1712f0da5660c14f8f0e8158fcc3416", + "layer46": "592e044e4e076f3d6399fee820d0e0fd2256d5d0229857a4ab816549eaf54d8c", + "layer47": "53b18eeb8f959ee68c1dbe6d7c1a736d9568003ebcc056dab4ccdf642268bf3a", + "layer5": "4e5e5abb6186be0317f3f0340e90805fa648fbb7ffbf3ad995b1aa985934d4ec", + "layer6": "957936c76afb2fcfc011044f7baab6b1c543ed336ff8153bcb4af0d9999b0b20", + "layer7": "227935751930038ee22170fba01eff8ed0c3dc5cce10247f4c3864a5cdf53622", + "layer8": "875baabaf0513bb51f6b3964a7ff05093f64356b1210f5fe414dd8ef9dc2985a", + "layer9": "dc361d2ebfad139d3f516dc4ab004ab2392c1cc894b8965b9a3af726fd1a8485" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "update2/p1024-b1-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "update2/p1024-b1-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "8bfa421b3631538ba04f8bd1f670c5485b24aeec8d657b12f15038d440efa266", + "layer0": "6df8d2b361cc8ebfd2fa4bdfb4f25702c24d211e79ef4d93aa106ea82315c129", + "layer1": "92d24c253a17704b7d5e4eb9636172c56d04c5f06b3ab26c5a897bc7ae6a3426", + "layer10": "c830e7ff8f253e88dd6f87822981e930d9741b799498fac87678b8d62ea14241", + "layer11": "0c06ab9dc203276681d3dc626e5405207937d568b4201b95da454eb92d88df96", + "layer12": "bd3e5e77e8057e5d86b5f6a5526651ccda025b73e47b3f32b46af23b505531a5", + "layer13": "1c1f66038d4701ca62a47ecd73f23bb63644db1dca1260c3c56721e5313c69c3", + "layer14": "c6a86951242558ebe5337b4c54e62a3e3f523d02fa373278d6932d0813cc51d7", + "layer15": "dda8b10d632e38d16a53d998a7afa600b8ea0d86634b073878debc0acc040e1f", + "layer16": "2ad615d0d9873212016b488d31460de8b09c0bfa268ff00f8a593c27c5e322b9", + "layer17": "1c61d906b4c33656d14a32842419ffcec2b59b1db8a7800c320ba01a52fc108e", + "layer18": "b01973f9d9f0db61596646d8bf8b3070a30f2c88d62c6bd17275f0654230bda8", + "layer19": "1a7b37911385b7be4c2e8e084bb1a7c4604a6de2d9f3a6bb557f89e0e3dc2409", + "layer2": "e6c32e65028aeb965a04c7aa1440e770df92d3d3e3be6f99bae8f031b8e9ddd1", + "layer20": "ca55e60a8d3511f2973dc71cd4caa52c7d319f64131532fe6d60b869db403813", + "layer21": "af4e9900b21d4ff9ab37f0792e2d35ddc65fdc5331462b7edb89aaed1dfded6c", + "layer22": "a6fd9aa9584590a15a456e4149f000ba3eb197ba9002cc7468510510110181c1", + "layer23": "2b73574ae039e140d7664625fd478e46f1c82a61b4c94ed30fa8398bd50475f6", + "layer24": "027167505fd933bced4bacfd6f4e90b331927376cd631f8ff54ba5e7262bc55a", + "layer25": "5ca69f44e46c37658faf1129c159a719c98486ffa6e1a2b7d55dd2aea3144336", + "layer26": "4838c33504f6dc28e7e8c76578f61130c7d5c61791d81c513e5b85ac86e71658", + "layer27": "f6b7a7797da5c5d17cb409f1f08ef8712c3974fa2ac278e4bbee1ef5ff50891a", + "layer28": "6b9fb34be8284a7cb7db5be7e7405c61c44ef1b46464b1385c6a5c4f4fdc466b", + "layer29": "7e36f0a6e963eae0581040ac2b95cde35f8ee0118ea3cb6b961627e9d7154fd1", + "layer3": "a4f1204b59574af4082b5c7129350562dc074e1fce0dcf7b1bf3b205136b17a2", + "layer30": "fa3b6de067f9944ea54f94472444034b866d7198684bbe125b7828b6e69f795b", + "layer31": "69a05581ff31cb4aa0d0fe10d2c4035686cd240ea6e08702e6b0f665c4dbdf79", + "layer32": "2aca52a5afa6cc2fe6f312fe65e45cf076bc852a320618236db7e444a7af1ec7", + "layer33": "fc1ae9c4b0c5637a5a2becb05a102a824de02089597bfa33e9e8a7aa9ce09191", + "layer34": "d2c23b63ea53ccca726712977bdaec074e152b0fbb37993b743a7ba5d2135c70", + "layer35": "c097b0af8b2a93629d292cd01a69fde34f1439e161a2148d35fda850cc6373f3", + "layer36": "b8fb8d2d5d7d688e590e2f80a2e6618c0d3a38924b849a6209fe660454f8a3db", + "layer37": "2539f8fcfd1d8d21ddd740eeb4326a35b354d090dd2aa11db9e713ae7f6d135a", + "layer38": "5b99d0c25a04a03529213cd2a01735ef47ab6298d2446b79efff97180fa8fcac", + "layer39": "4db2c247e4c1e723c65ae1211c7a6dceb8c7d25b966e653b4c5bb86025de2366", + "layer4": "e615253cb3f9caa31ad4cf605e29ecf632bafd30b3f881a380c0c6749c3d24b9", + "layer40": "7ac219d9dd660a2dadfc782778a624ad2572a32b97011b3273c91c978505c27d", + "layer41": "65b39bd03748da4e93434917ffc1a8754c828bc977d2feb1f942d34d65e17df3", + "layer42": "688694106045c73b4e3aeeaf3affb681dd7338b6b9d4e5de8a667debfa66f639", + "layer43": "14033b7eaf6955dac46b5298f066f0c363cbf627560ac00c91a07cd259aee001", + "layer44": "9c7a1cc083a0bc562fa67a6ee9ab623bec1cef087d25b1cf7807296072cae035", + "layer45": "7c3d922519f492c5a4c8fa475579d98a79913d75117244d2f49cae6a70d5c4a7", + "layer46": "9c1cd3bfa0830fbabd6ed33b4dabbe4d7c13ba347bb73e28a3926462d8e11911", + "layer47": "90d05bb1ad0d1194a9611cf7da60513204e9326e0e9381617ddfcca9b7404ce4", + "layer5": "a9f1b4bbd53a34a5f400c931bbb3b3963024ab90fd8c20da0bc30df64c5e0d3f", + "layer6": "8dd2a6a84d43ab22d206c63c6c2eeca496cd7eb0ea98229957878a4de9c46571", + "layer7": "9a1c29c45835f052080433c01a0fc530e8aa12b43b27f96a75adc056ba37cac2", + "layer8": "be5a6f96b349c962e7a301517e30dc1df70120cf0182e9129078f10e7ea5a6a2", + "layer9": "b36971c8aae515654eb9ab493bf74625fa67ff4bacfe71401817f66ef1e1fa75" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "update2/p1024-b1-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "update2/p1024-b1-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 16, + "node_digests": { + "embedding": "8bfa421b3631538ba04f8bd1f670c5485b24aeec8d657b12f15038d440efa266", + "layer0": "6df8d2b361cc8ebfd2fa4bdfb4f25702c24d211e79ef4d93aa106ea82315c129", + "layer1": "92d24c253a17704b7d5e4eb9636172c56d04c5f06b3ab26c5a897bc7ae6a3426", + "layer10": "c830e7ff8f253e88dd6f87822981e930d9741b799498fac87678b8d62ea14241", + "layer11": "0c06ab9dc203276681d3dc626e5405207937d568b4201b95da454eb92d88df96", + "layer12": "bd3e5e77e8057e5d86b5f6a5526651ccda025b73e47b3f32b46af23b505531a5", + "layer13": "1c1f66038d4701ca62a47ecd73f23bb63644db1dca1260c3c56721e5313c69c3", + "layer14": "c6a86951242558ebe5337b4c54e62a3e3f523d02fa373278d6932d0813cc51d7", + "layer15": "dda8b10d632e38d16a53d998a7afa600b8ea0d86634b073878debc0acc040e1f", + "layer16": "2ad615d0d9873212016b488d31460de8b09c0bfa268ff00f8a593c27c5e322b9", + "layer17": "1c61d906b4c33656d14a32842419ffcec2b59b1db8a7800c320ba01a52fc108e", + "layer18": "b01973f9d9f0db61596646d8bf8b3070a30f2c88d62c6bd17275f0654230bda8", + "layer19": "1a7b37911385b7be4c2e8e084bb1a7c4604a6de2d9f3a6bb557f89e0e3dc2409", + "layer2": "e6c32e65028aeb965a04c7aa1440e770df92d3d3e3be6f99bae8f031b8e9ddd1", + "layer20": "ca55e60a8d3511f2973dc71cd4caa52c7d319f64131532fe6d60b869db403813", + "layer21": "af4e9900b21d4ff9ab37f0792e2d35ddc65fdc5331462b7edb89aaed1dfded6c", + "layer22": "a6fd9aa9584590a15a456e4149f000ba3eb197ba9002cc7468510510110181c1", + "layer23": "2b73574ae039e140d7664625fd478e46f1c82a61b4c94ed30fa8398bd50475f6", + "layer24": "027167505fd933bced4bacfd6f4e90b331927376cd631f8ff54ba5e7262bc55a", + "layer25": "5ca69f44e46c37658faf1129c159a719c98486ffa6e1a2b7d55dd2aea3144336", + "layer26": "4838c33504f6dc28e7e8c76578f61130c7d5c61791d81c513e5b85ac86e71658", + "layer27": "f6b7a7797da5c5d17cb409f1f08ef8712c3974fa2ac278e4bbee1ef5ff50891a", + "layer28": "6b9fb34be8284a7cb7db5be7e7405c61c44ef1b46464b1385c6a5c4f4fdc466b", + "layer29": "7e36f0a6e963eae0581040ac2b95cde35f8ee0118ea3cb6b961627e9d7154fd1", + "layer3": "a4f1204b59574af4082b5c7129350562dc074e1fce0dcf7b1bf3b205136b17a2", + "layer30": "fa3b6de067f9944ea54f94472444034b866d7198684bbe125b7828b6e69f795b", + "layer31": "69a05581ff31cb4aa0d0fe10d2c4035686cd240ea6e08702e6b0f665c4dbdf79", + "layer32": "2aca52a5afa6cc2fe6f312fe65e45cf076bc852a320618236db7e444a7af1ec7", + "layer33": "fc1ae9c4b0c5637a5a2becb05a102a824de02089597bfa33e9e8a7aa9ce09191", + "layer34": "d2c23b63ea53ccca726712977bdaec074e152b0fbb37993b743a7ba5d2135c70", + "layer35": "c097b0af8b2a93629d292cd01a69fde34f1439e161a2148d35fda850cc6373f3", + "layer36": "b8fb8d2d5d7d688e590e2f80a2e6618c0d3a38924b849a6209fe660454f8a3db", + "layer37": "2539f8fcfd1d8d21ddd740eeb4326a35b354d090dd2aa11db9e713ae7f6d135a", + "layer38": "5b99d0c25a04a03529213cd2a01735ef47ab6298d2446b79efff97180fa8fcac", + "layer39": "4db2c247e4c1e723c65ae1211c7a6dceb8c7d25b966e653b4c5bb86025de2366", + "layer4": "e615253cb3f9caa31ad4cf605e29ecf632bafd30b3f881a380c0c6749c3d24b9", + "layer40": "7ac219d9dd660a2dadfc782778a624ad2572a32b97011b3273c91c978505c27d", + "layer41": "65b39bd03748da4e93434917ffc1a8754c828bc977d2feb1f942d34d65e17df3", + "layer42": "688694106045c73b4e3aeeaf3affb681dd7338b6b9d4e5de8a667debfa66f639", + "layer43": "14033b7eaf6955dac46b5298f066f0c363cbf627560ac00c91a07cd259aee001", + "layer44": "9c7a1cc083a0bc562fa67a6ee9ab623bec1cef087d25b1cf7807296072cae035", + "layer45": "7c3d922519f492c5a4c8fa475579d98a79913d75117244d2f49cae6a70d5c4a7", + "layer46": "9c1cd3bfa0830fbabd6ed33b4dabbe4d7c13ba347bb73e28a3926462d8e11911", + "layer47": "90d05bb1ad0d1194a9611cf7da60513204e9326e0e9381617ddfcca9b7404ce4", + "layer5": "a9f1b4bbd53a34a5f400c931bbb3b3963024ab90fd8c20da0bc30df64c5e0d3f", + "layer6": "8dd2a6a84d43ab22d206c63c6c2eeca496cd7eb0ea98229957878a4de9c46571", + "layer7": "9a1c29c45835f052080433c01a0fc530e8aa12b43b27f96a75adc056ba37cac2", + "layer8": "be5a6f96b349c962e7a301517e30dc1df70120cf0182e9129078f10e7ea5a6a2", + "layer9": "b36971c8aae515654eb9ab493bf74625fa67ff4bacfe71401817f66ef1e1fa75" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "update2/p1024-b4-chunked": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "update2/p1024-b4-chunked", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "302ec348a85adbcdebc6420319567e8e0e5fa9b9538e3fe963606dacbc3fe670", + "layer0": "5a7291fa69d4f1211a2e703257191a70e5a204e80ec4a7e42add420e215b596c", + "layer1": "bc0baaa404ee0b080881428af9cbd9c4d5bbae8c8abc4955d7fa0f52e8374cb2", + "layer10": "ee34fb954744aa032e6eb97b2041e3a86511534f4b2d5d1ac045a1474c0a88e3", + "layer11": "a8bc69884ce864ad88e56801a83746dd1d4f9df6e93ee128eb2b4c2fafbe6890", + "layer12": "487a16c34a62247221a11b367d1e9319e6a4ea08be7faf79efc83ce0dfe54f44", + "layer13": "a30e0d8ce8b71c2d33a9a54f9a80a727c1f21c23220d4dac81f9ae30b94b45b8", + "layer14": "ace5db1cfd15f3f6c243a70c9c80188838c54d22fa7dffaff9400ba3f6e370c5", + "layer15": "89a41362ba8432590b90c69201e3f604b248ce2d0f875640a8317a6d174f00ad", + "layer16": "a6df8500be57a086a3a45d57382f5b72a8460fc7fad3ffdda1de59d76e7ca7be", + "layer17": "9a870e5a1788047323230b3cf1469f9c504764f4adcca0ec284e6a1b45ec4f8e", + "layer18": "36c01c9abed357afa0ce79a8fb0b19e791ee579f0fd828150750f0553d3cb044", + "layer19": "74e5bc2ff5dc463a440536499e822430453fdfe275495bfa6e590d66cd0f32ab", + "layer2": "de005f416150c3303482f04da51ae032fe2c4d5be9fe9470a2044b26cc226f09", + "layer20": "61204d1b812523da6047d7929e7288e063f65a501e4742a1dc7d6118502df37c", + "layer21": "68b20722225ee59b2e3886ee153b4429108758aceedf819a998ef10119ff64d9", + "layer22": "0608a11b4776a2bef1c9bbcd1f6d3478263c5eedd1fac78b074aefa3eae1f02c", + "layer23": "31b4582ae4fbcf787698e81f17bf8bef8379cbd24b0aa17f31850169a92432a8", + "layer24": "e4e7e51a3e595781486870016e36b7183c257ac62fe9deb7456a007acd46ea1c", + "layer25": "519883c0a80c5b7b328e4bd1abc5c84c439e451aee099665befcf9f40ee8477f", + "layer26": "ef0aca5ece89d7d384cc00490fea822597de24ae78e4df5429aa0f77972bcf40", + "layer27": "31e50d5b8f648636c372a9beb5d1af11bd66a8958ac6a71b66fc8028bdaffa5e", + "layer28": "9b93b3d1acad7221c01f88fb09d4b83e1ebb4bea21c6104414386541f6e7fdbd", + "layer29": "31e68c183ec52e62c707cec980d3f5661049966e3a4a906967f528c481aa6d1b", + "layer3": "c61a8d3c691ac7acb635e2e98b9ade83d03a47d09e7bd1370dbacd431e93d219", + "layer30": "dcdddff9688278aa67235d2b70f5d011779a392230bba2cd6f7070826552e9bc", + "layer31": "6caa901cff50655215b44503a7176addd527c9b918456d1e7bbaeab19513b09c", + "layer32": "34f03fda69153ab04197cac049cef164005f37ef881c784169f25609c9b3e4ff", + "layer33": "4a51ad9fd668c2887ebf10a24b8213eb3f3b4e6b296552446109bf952f9b3f0a", + "layer34": "ac1a24d9daaa0e31e856af0b6690643ddf2f4906ef44bac9de84ca8c10035684", + "layer35": "ea1ffb9dce3bd2aa9736d910b9c208be5968972d7b827ec81189acff2dab893d", + "layer36": "34b7baad0a83838f496d905d58246e9b8221a204ceffeb73ca47d34eb253c9a5", + "layer37": "eab8be8493f17348147ec8f9e0a420b96a690807b7194052efbfeaef39574ec9", + "layer38": "122a54016e8457d867a9268e51065e700e088852094b9e5666cd6b1ffd6fd47c", + "layer39": "93f9a1b6750c2630051f4a434a37780704cc97e4c7020b78cbf61af20d2f8509", + "layer4": "86d032eea933cda1ece710e470ccd0697a19c4d986b84b4beb96e4ba6ccef0e9", + "layer40": "e18067baca7152102a15ce36bceb80fc36030415d35d2e8e60a6307c5669fb7c", + "layer41": "0b0349b0a9e267e1a706035cabbce695f2bc7ca6a7bbbc20533510f49f450835", + "layer42": "f19a1554871560959d17974c5e162d5ae48d3e868ef02d0a34f0ff4287cd68bd", + "layer43": "d0c317402b6720bd56b24a82cb7f6c456946fb812a025d649a5008223f17787c", + "layer44": "b0a5dfd3963a0a808ba11ee21d87eedfb6ec466f99c0e75e4e91d41c15fbc58a", + "layer45": "c63622532152de15d9d8812d10e600a711d1c579c12a9bffd594833ab7455b24", + "layer46": "4dfe34632fdb9515a8227387a216686dbcecc703d99707c89765cfda31e75341", + "layer47": "173fd1a043a64f85ea1e3c1227518e824adaa247ed7914dbb19a30d7875bcb6b", + "layer5": "315184befd2cf3a8028dfae0b41aa45322c3436de0bf22cfcf5effbc0424d732", + "layer6": "8b302a50641b12352603c871735f24558987588ee86d65cc3c477c3fcc8bdb94", + "layer7": "a9c8115b07ae56e0d48e2dc117d29ac93701323b5c5fcf0502bab134b671e3af", + "layer8": "a7f4b357b2ff28cf22c00fb70e103370809dab4d59d2cd1ab3ced9630b45ca64", + "layer9": "adff84c8c8f6da3fee4bf00128359f9daa12d4990a2f8a8a32bb9c3f8f944063" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + }, + "update2/p1024-b4-full": { + "actual_backend": "qwen3_next_tp4_shared_eager_v1", + "cell_id": "update2/p1024-b4-full", + "first_drift_node": null, + "grad_names": [], + "loss": null, + "n_logp_tokens": 64, + "node_digests": { + "embedding": "302ec348a85adbcdebc6420319567e8e0e5fa9b9538e3fe963606dacbc3fe670", + "layer0": "5a7291fa69d4f1211a2e703257191a70e5a204e80ec4a7e42add420e215b596c", + "layer1": "bc0baaa404ee0b080881428af9cbd9c4d5bbae8c8abc4955d7fa0f52e8374cb2", + "layer10": "ee34fb954744aa032e6eb97b2041e3a86511534f4b2d5d1ac045a1474c0a88e3", + "layer11": "a8bc69884ce864ad88e56801a83746dd1d4f9df6e93ee128eb2b4c2fafbe6890", + "layer12": "487a16c34a62247221a11b367d1e9319e6a4ea08be7faf79efc83ce0dfe54f44", + "layer13": "a30e0d8ce8b71c2d33a9a54f9a80a727c1f21c23220d4dac81f9ae30b94b45b8", + "layer14": "ace5db1cfd15f3f6c243a70c9c80188838c54d22fa7dffaff9400ba3f6e370c5", + "layer15": "89a41362ba8432590b90c69201e3f604b248ce2d0f875640a8317a6d174f00ad", + "layer16": "a6df8500be57a086a3a45d57382f5b72a8460fc7fad3ffdda1de59d76e7ca7be", + "layer17": "9a870e5a1788047323230b3cf1469f9c504764f4adcca0ec284e6a1b45ec4f8e", + "layer18": "36c01c9abed357afa0ce79a8fb0b19e791ee579f0fd828150750f0553d3cb044", + "layer19": "74e5bc2ff5dc463a440536499e822430453fdfe275495bfa6e590d66cd0f32ab", + "layer2": "de005f416150c3303482f04da51ae032fe2c4d5be9fe9470a2044b26cc226f09", + "layer20": "61204d1b812523da6047d7929e7288e063f65a501e4742a1dc7d6118502df37c", + "layer21": "68b20722225ee59b2e3886ee153b4429108758aceedf819a998ef10119ff64d9", + "layer22": "0608a11b4776a2bef1c9bbcd1f6d3478263c5eedd1fac78b074aefa3eae1f02c", + "layer23": "31b4582ae4fbcf787698e81f17bf8bef8379cbd24b0aa17f31850169a92432a8", + "layer24": "e4e7e51a3e595781486870016e36b7183c257ac62fe9deb7456a007acd46ea1c", + "layer25": "519883c0a80c5b7b328e4bd1abc5c84c439e451aee099665befcf9f40ee8477f", + "layer26": "ef0aca5ece89d7d384cc00490fea822597de24ae78e4df5429aa0f77972bcf40", + "layer27": "31e50d5b8f648636c372a9beb5d1af11bd66a8958ac6a71b66fc8028bdaffa5e", + "layer28": "9b93b3d1acad7221c01f88fb09d4b83e1ebb4bea21c6104414386541f6e7fdbd", + "layer29": "31e68c183ec52e62c707cec980d3f5661049966e3a4a906967f528c481aa6d1b", + "layer3": "c61a8d3c691ac7acb635e2e98b9ade83d03a47d09e7bd1370dbacd431e93d219", + "layer30": "dcdddff9688278aa67235d2b70f5d011779a392230bba2cd6f7070826552e9bc", + "layer31": "6caa901cff50655215b44503a7176addd527c9b918456d1e7bbaeab19513b09c", + "layer32": "34f03fda69153ab04197cac049cef164005f37ef881c784169f25609c9b3e4ff", + "layer33": "4a51ad9fd668c2887ebf10a24b8213eb3f3b4e6b296552446109bf952f9b3f0a", + "layer34": "ac1a24d9daaa0e31e856af0b6690643ddf2f4906ef44bac9de84ca8c10035684", + "layer35": "ea1ffb9dce3bd2aa9736d910b9c208be5968972d7b827ec81189acff2dab893d", + "layer36": "34b7baad0a83838f496d905d58246e9b8221a204ceffeb73ca47d34eb253c9a5", + "layer37": "eab8be8493f17348147ec8f9e0a420b96a690807b7194052efbfeaef39574ec9", + "layer38": "122a54016e8457d867a9268e51065e700e088852094b9e5666cd6b1ffd6fd47c", + "layer39": "93f9a1b6750c2630051f4a434a37780704cc97e4c7020b78cbf61af20d2f8509", + "layer4": "86d032eea933cda1ece710e470ccd0697a19c4d986b84b4beb96e4ba6ccef0e9", + "layer40": "e18067baca7152102a15ce36bceb80fc36030415d35d2e8e60a6307c5669fb7c", + "layer41": "0b0349b0a9e267e1a706035cabbce695f2bc7ca6a7bbbc20533510f49f450835", + "layer42": "f19a1554871560959d17974c5e162d5ae48d3e868ef02d0a34f0ff4287cd68bd", + "layer43": "d0c317402b6720bd56b24a82cb7f6c456946fb812a025d649a5008223f17787c", + "layer44": "b0a5dfd3963a0a808ba11ee21d87eedfb6ec466f99c0e75e4e91d41c15fbc58a", + "layer45": "c63622532152de15d9d8812d10e600a711d1c579c12a9bffd594833ab7455b24", + "layer46": "4dfe34632fdb9515a8227387a216686dbcecc703d99707c89765cfda31e75341", + "layer47": "173fd1a043a64f85ea1e3c1227518e824adaa247ed7914dbb19a30d7875bcb6b", + "layer5": "315184befd2cf3a8028dfae0b41aa45322c3436de0bf22cfcf5effbc0424d732", + "layer6": "8b302a50641b12352603c871735f24558987588ee86d65cc3c477c3fcc8bdb94", + "layer7": "a9c8115b07ae56e0d48e2dc117d29ac93701323b5c5fcf0502bab134b671e3af", + "layer8": "a7f4b357b2ff28cf22c00fb70e103370809dab4d59d2cd1ab3ced9630b45ca64", + "layer9": "adff84c8c8f6da3fee4bf00128359f9daa12d4990a2f8a8a32bb9c3f8f944063" + }, + "requested_backend": "qwen3_next_tp4_shared_eager_v1" + } + }, + "compatible_schema": "ws1-c10-c11-v5", + "compute_capability": null, + "config_fingerprint": { + "ep": 1, + "model": "Qwen3-Next-80B-A3B-Instruct", + "pp": 1, + "tp": 4 + }, + "decode_prefill": [ + { + "aggregates": { + "active_token_count": 16, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "baseline/p0008-b1-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + { + "aggregates": { + "active_token_count": 64, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "baseline/p0008-b4-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + { + "aggregates": { + "active_token_count": 16, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "baseline/p0064-b1-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + { + "aggregates": { + "active_token_count": 64, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "baseline/p0064-b4-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + { + "aggregates": { + "active_token_count": 16, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "baseline/p0256-b1-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + { + "aggregates": { + "active_token_count": 64, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "baseline/p0256-b4-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + { + "aggregates": { + "active_token_count": 16, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "baseline/p1024-b1-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + { + "aggregates": { + "active_token_count": 64, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "baseline/p1024-b4-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + { + "aggregates": { + "active_token_count": 16, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "update1/p0008-b1-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + { + "aggregates": { + "active_token_count": 64, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "update1/p0008-b4-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + { + "aggregates": { + "active_token_count": 16, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "update1/p0064-b1-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + { + "aggregates": { + "active_token_count": 64, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "update1/p0064-b4-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + { + "aggregates": { + "active_token_count": 16, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "update1/p0256-b1-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + { + "aggregates": { + "active_token_count": 64, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "update1/p0256-b4-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + { + "aggregates": { + "active_token_count": 16, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "update1/p1024-b1-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + { + "aggregates": { + "active_token_count": 64, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "update1/p1024-b4-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + { + "aggregates": { + "active_token_count": 16, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "update2/p0008-b1-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + { + "aggregates": { + "active_token_count": 64, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "update2/p0008-b4-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + { + "aggregates": { + "active_token_count": 16, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "update2/p0064-b1-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + { + "aggregates": { + "active_token_count": 64, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "update2/p0064-b4-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + { + "aggregates": { + "active_token_count": 16, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "update2/p0256-b1-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + { + "aggregates": { + "active_token_count": 64, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "update2/p0256-b4-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + { + "aggregates": { + "active_token_count": 16, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "update2/p1024-b1-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + { + "aggregates": { + "active_token_count": 64, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "update2/p1024-b4-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + { + "aggregates": { + "active_token_count": 16, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "reload/p0008-b1-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + { + "aggregates": { + "active_token_count": 64, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "reload/p0008-b4-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + { + "aggregates": { + "active_token_count": 16, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "reload/p0064-b1-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + { + "aggregates": { + "active_token_count": 64, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "reload/p0064-b4-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + { + "aggregates": { + "active_token_count": 16, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "reload/p0256-b1-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + { + "aggregates": { + "active_token_count": 64, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "reload/p0256-b4-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + { + "aggregates": { + "active_token_count": 16, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "reload/p1024-b1-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + { + "aggregates": { + "active_token_count": 64, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "case_id": "reload/p1024-b4-chunked", + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + } + ], + "device": "cuda", + "disclaimer": "Qwen3-Next-80B-A3B-Instruct, TP4 x EP1, BF16, strict shared providers. Cells are the 16-case raw-bit L2 matrix (prompt 8/64/256/1024 x batch 1/4 x full/chunked prefill, 16 response tokens) at each weight version; rollout is native vLLM prefill and decode, replay is VIME recompute. Gradients are judged by the training stages (two updates, reload and resumption), not by C11 gradient rows, so gradient fields are empty here.", + "first_drift": null, + "first_drift_cell": null, + "first_drift_family": null, + "first_drift_layer": null, + "fixture_hash": "b59298acf5ecbe64abb4639e7596e052f1993ee5e3c7289b63738f1b04463d01", + "gpu_name": null, + "gradient_accuracy": [], + "gradient_accuracy_executed": false, + "gradient_invariance": [], + "gradient_scope": "training_stage_reports", + "invariance": [ + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0008-b1-full/rollout", + "baseline/p0008-b1-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0008-b1-full/rollout", + "baseline/p0008-b1-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0008-b1-chunked/rollout", + "baseline/p0008-b1-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0008-b1-chunked/rollout", + "baseline/p0008-b1-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0008-b4-full/rollout", + "baseline/p0008-b4-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0008-b4-full/rollout", + "baseline/p0008-b4-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0008-b4-chunked/rollout", + "baseline/p0008-b4-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0008-b4-chunked/rollout", + "baseline/p0008-b4-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0064-b1-full/rollout", + "baseline/p0064-b1-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0064-b1-full/rollout", + "baseline/p0064-b1-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0064-b1-chunked/rollout", + "baseline/p0064-b1-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0064-b1-chunked/rollout", + "baseline/p0064-b1-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0064-b4-full/rollout", + "baseline/p0064-b4-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0064-b4-full/rollout", + "baseline/p0064-b4-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0064-b4-chunked/rollout", + "baseline/p0064-b4-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0064-b4-chunked/rollout", + "baseline/p0064-b4-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0256-b1-full/rollout", + "baseline/p0256-b1-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0256-b1-full/rollout", + "baseline/p0256-b1-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0256-b1-chunked/rollout", + "baseline/p0256-b1-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0256-b1-chunked/rollout", + "baseline/p0256-b1-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0256-b4-full/rollout", + "baseline/p0256-b4-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0256-b4-full/rollout", + "baseline/p0256-b4-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0256-b4-chunked/rollout", + "baseline/p0256-b4-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p0256-b4-chunked/rollout", + "baseline/p0256-b4-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p1024-b1-full/rollout", + "baseline/p1024-b1-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p1024-b1-full/rollout", + "baseline/p1024-b1-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p1024-b1-chunked/rollout", + "baseline/p1024-b1-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p1024-b1-chunked/rollout", + "baseline/p1024-b1-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p1024-b4-full/rollout", + "baseline/p1024-b4-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p1024-b4-full/rollout", + "baseline/p1024-b4-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p1024-b4-chunked/rollout", + "baseline/p1024-b4-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "baseline/p1024-b4-chunked/rollout", + "baseline/p1024-b4-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update1/p0008-b1-full/rollout", + "update1/p0008-b1-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update1/p0008-b1-full/rollout", + "update1/p0008-b1-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update1/p0008-b1-chunked/rollout", + "update1/p0008-b1-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update1/p0008-b1-chunked/rollout", + "update1/p0008-b1-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update1/p0008-b4-full/rollout", + "update1/p0008-b4-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update1/p0008-b4-full/rollout", + "update1/p0008-b4-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update1/p0008-b4-chunked/rollout", + "update1/p0008-b4-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update1/p0008-b4-chunked/rollout", + "update1/p0008-b4-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update1/p0064-b1-full/rollout", + "update1/p0064-b1-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update1/p0064-b1-full/rollout", + "update1/p0064-b1-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update1/p0064-b1-chunked/rollout", + "update1/p0064-b1-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update1/p0064-b1-chunked/rollout", + "update1/p0064-b1-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update1/p0064-b4-full/rollout", + "update1/p0064-b4-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update1/p0064-b4-full/rollout", + "update1/p0064-b4-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update1/p0064-b4-chunked/rollout", + "update1/p0064-b4-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update1/p0064-b4-chunked/rollout", + "update1/p0064-b4-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update1/p0256-b1-full/rollout", + "update1/p0256-b1-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update1/p0256-b1-full/rollout", + "update1/p0256-b1-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update1/p0256-b1-chunked/rollout", + "update1/p0256-b1-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update1/p0256-b1-chunked/rollout", + "update1/p0256-b1-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update1/p0256-b4-full/rollout", + "update1/p0256-b4-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update1/p0256-b4-full/rollout", + "update1/p0256-b4-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update1/p0256-b4-chunked/rollout", + "update1/p0256-b4-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update1/p0256-b4-chunked/rollout", + "update1/p0256-b4-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update1/p1024-b1-full/rollout", + "update1/p1024-b1-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update1/p1024-b1-full/rollout", + "update1/p1024-b1-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update1/p1024-b1-chunked/rollout", + "update1/p1024-b1-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update1/p1024-b1-chunked/rollout", + "update1/p1024-b1-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update1/p1024-b4-full/rollout", + "update1/p1024-b4-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update1/p1024-b4-full/rollout", + "update1/p1024-b4-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update1/p1024-b4-chunked/rollout", + "update1/p1024-b4-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update1/p1024-b4-chunked/rollout", + "update1/p1024-b4-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update2/p0008-b1-full/rollout", + "update2/p0008-b1-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update2/p0008-b1-full/rollout", + "update2/p0008-b1-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update2/p0008-b1-chunked/rollout", + "update2/p0008-b1-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update2/p0008-b1-chunked/rollout", + "update2/p0008-b1-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update2/p0008-b4-full/rollout", + "update2/p0008-b4-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update2/p0008-b4-full/rollout", + "update2/p0008-b4-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update2/p0008-b4-chunked/rollout", + "update2/p0008-b4-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update2/p0008-b4-chunked/rollout", + "update2/p0008-b4-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update2/p0064-b1-full/rollout", + "update2/p0064-b1-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update2/p0064-b1-full/rollout", + "update2/p0064-b1-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update2/p0064-b1-chunked/rollout", + "update2/p0064-b1-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update2/p0064-b1-chunked/rollout", + "update2/p0064-b1-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update2/p0064-b4-full/rollout", + "update2/p0064-b4-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update2/p0064-b4-full/rollout", + "update2/p0064-b4-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update2/p0064-b4-chunked/rollout", + "update2/p0064-b4-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update2/p0064-b4-chunked/rollout", + "update2/p0064-b4-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update2/p0256-b1-full/rollout", + "update2/p0256-b1-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update2/p0256-b1-full/rollout", + "update2/p0256-b1-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update2/p0256-b1-chunked/rollout", + "update2/p0256-b1-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update2/p0256-b1-chunked/rollout", + "update2/p0256-b1-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update2/p0256-b4-full/rollout", + "update2/p0256-b4-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update2/p0256-b4-full/rollout", + "update2/p0256-b4-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update2/p0256-b4-chunked/rollout", + "update2/p0256-b4-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update2/p0256-b4-chunked/rollout", + "update2/p0256-b4-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update2/p1024-b1-full/rollout", + "update2/p1024-b1-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update2/p1024-b1-full/rollout", + "update2/p1024-b1-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update2/p1024-b1-chunked/rollout", + "update2/p1024-b1-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update2/p1024-b1-chunked/rollout", + "update2/p1024-b1-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update2/p1024-b4-full/rollout", + "update2/p1024-b4-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update2/p1024-b4-full/rollout", + "update2/p1024-b4-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update2/p1024-b4-chunked/rollout", + "update2/p1024-b4-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "update2/p1024-b4-chunked/rollout", + "update2/p1024-b4-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "reload/p0008-b1-full/rollout", + "reload/p0008-b1-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "reload/p0008-b1-full/rollout", + "reload/p0008-b1-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "reload/p0008-b1-chunked/rollout", + "reload/p0008-b1-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "reload/p0008-b1-chunked/rollout", + "reload/p0008-b1-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "reload/p0008-b4-full/rollout", + "reload/p0008-b4-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "reload/p0008-b4-full/rollout", + "reload/p0008-b4-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "reload/p0008-b4-chunked/rollout", + "reload/p0008-b4-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "reload/p0008-b4-chunked/rollout", + "reload/p0008-b4-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "reload/p0064-b1-full/rollout", + "reload/p0064-b1-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "reload/p0064-b1-full/rollout", + "reload/p0064-b1-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "reload/p0064-b1-chunked/rollout", + "reload/p0064-b1-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "reload/p0064-b1-chunked/rollout", + "reload/p0064-b1-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "reload/p0064-b4-full/rollout", + "reload/p0064-b4-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "reload/p0064-b4-full/rollout", + "reload/p0064-b4-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "reload/p0064-b4-chunked/rollout", + "reload/p0064-b4-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "reload/p0064-b4-chunked/rollout", + "reload/p0064-b4-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "reload/p0256-b1-full/rollout", + "reload/p0256-b1-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "reload/p0256-b1-full/rollout", + "reload/p0256-b1-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "reload/p0256-b1-chunked/rollout", + "reload/p0256-b1-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "reload/p0256-b1-chunked/rollout", + "reload/p0256-b1-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "reload/p0256-b4-full/rollout", + "reload/p0256-b4-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "reload/p0256-b4-full/rollout", + "reload/p0256-b4-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "reload/p0256-b4-chunked/rollout", + "reload/p0256-b4-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "reload/p0256-b4-chunked/rollout", + "reload/p0256-b4-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "reload/p1024-b1-full/rollout", + "reload/p1024-b1-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "reload/p1024-b1-full/rollout", + "reload/p1024-b1-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "reload/p1024-b1-chunked/rollout", + "reload/p1024-b1-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "reload/p1024-b1-chunked/rollout", + "reload/p1024-b1-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 1, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "reload/p1024-b4-full/rollout", + "reload/p1024-b4-full/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "reload/p1024-b4-full/rollout", + "reload/p1024-b4-full/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "reload/p1024-b4-chunked/rollout", + "reload/p1024-b4-chunked/recompute" + ], + "dtype": "float32", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16 + ], + "tensor_name": "logprobs" + }, + { + "atol": 0.0, + "comparison_lhs_role": "transformed_config", + "comparison_rhs_role": "canonical_config", + "config_pair": [ + "reload/p1024-b4-chunked/rollout", + "reload/p1024-b4-chunked/recompute" + ], + "dtype": "bfloat16", + "judgment": "forward_invariance", + "max_abs_error": 0.0, + "max_rel_error": 0.0, + "mean_abs_error": 0.0, + "passed": true, + "rtol": 0.0, + "shape": [ + 4, + 16, + 151936 + ], + "tensor_name": "logits" + } + ], + "measured_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "passed": true, + "representative_case_ids": [ + "baseline/p0008-b1-full", + "baseline/p0008-b1-chunked", + "baseline/p0008-b4-full", + "baseline/p0008-b4-chunked", + "baseline/p0064-b1-full", + "baseline/p0064-b1-chunked", + "baseline/p0064-b4-full", + "baseline/p0064-b4-chunked", + "baseline/p0256-b1-full", + "baseline/p0256-b1-chunked", + "baseline/p0256-b4-full", + "baseline/p0256-b4-chunked", + "baseline/p1024-b1-full", + "baseline/p1024-b1-chunked", + "baseline/p1024-b4-full", + "baseline/p1024-b4-chunked", + "update1/p0008-b1-full", + "update1/p0008-b1-chunked", + "update1/p0008-b4-full", + "update1/p0008-b4-chunked", + "update1/p0064-b1-full", + "update1/p0064-b1-chunked", + "update1/p0064-b4-full", + "update1/p0064-b4-chunked", + "update1/p0256-b1-full", + "update1/p0256-b1-chunked", + "update1/p0256-b4-full", + "update1/p0256-b4-chunked", + "update1/p1024-b1-full", + "update1/p1024-b1-chunked", + "update1/p1024-b4-full", + "update1/p1024-b4-chunked", + "update2/p0008-b1-full", + "update2/p0008-b1-chunked", + "update2/p0008-b4-full", + "update2/p0008-b4-chunked", + "update2/p0064-b1-full", + "update2/p0064-b1-chunked", + "update2/p0064-b4-full", + "update2/p0064-b4-chunked", + "update2/p0256-b1-full", + "update2/p0256-b1-chunked", + "update2/p0256-b4-full", + "update2/p0256-b4-chunked", + "update2/p1024-b1-full", + "update2/p1024-b1-chunked", + "update2/p1024-b4-full", + "update2/p1024-b4-chunked", + "reload/p0008-b1-full", + "reload/p0008-b1-chunked", + "reload/p0008-b4-full", + "reload/p0008-b4-chunked", + "reload/p0064-b1-full", + "reload/p0064-b1-chunked", + "reload/p0064-b4-full", + "reload/p0064-b4-chunked", + "reload/p0256-b1-full", + "reload/p0256-b1-chunked", + "reload/p0256-b4-full", + "reload/p0256-b4-chunked", + "reload/p1024-b1-full", + "reload/p1024-b1-chunked", + "reload/p1024-b4-full", + "reload/p1024-b4-chunked" + ], + "required_grad_names": [], + "runtime_backend_observations": {}, + "schema_version": "qwen3-next-chain-v1", + "seed": 1234, + "train_infer": { + "aggregates": { + "active_token_count": 2560, + "approx_kl0": 0.0, + "clip_interval": [ + 0.8, + 1.2 + ], + "clipfrac0": 0.0, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "max_abs_dlogp": 0.0, + "report_kind": "train_infer_logprob_parity" + }, + "comparison_lhs_role": "training_style_teacher_forcing", + "comparison_rhs_role": "inference_style_rollout_decode", + "metrics": [ + { + "metric": "max_abs_dlogp", + "passed": true, + "threshold": 0.06, + "value": 0.0 + }, + { + "metric": "approx_kl0", + "passed": true, + "threshold": 0.05, + "value": 0.0 + }, + { + "metric": "clipfrac0", + "passed": true, + "threshold": 0.0, + "value": 0.0 + } + ], + "passed": true, + "report_kind": "train_infer_logprob_parity" + }, + "train_infer_bn": null, + "train_infer_executed": true, + "weight_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "weight_source": "Qwen/Qwen3-Next-80B-A3B-Instruct@9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "weight_versions": [ + "baseline", + "update1", + "update2", + "reload" + ], + "workflow_url": null, + "workload_id": "qwen3-next-l2-matrix-16", + "workload_seed": 1234 +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/l2/environment.json b/docs/usage/evidence/qwen3-next-chain-b200/l2/environment.json new file mode 100644 index 000000000..b4ae8f9a3 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/l2/environment.json @@ -0,0 +1,4511 @@ +{ + "environment": { + "identity": { + "base_prefix": "/miniconda3/envs/rlkernel", + "binary": "/python3.12", + "binary_sha256": "6a1eb3ffc29f3a6b0ece607b016b4cfa5ca3ac57b34f17ed3266b404f78d2729", + "build_tools": { + "ninja": { + "path": "/miniconda3/envs/rlkernel/bin/ninja", + "sha256": "08639e194fffa7f08b259fc4abfa4803aff66b64de52549cee42ec527d55cea6" + } + }, + "distributions": [ + { + "direct_url": null, + "metadata_sha256": "6f1038270be40f9b8c0bcf391c627e7d7f41ccdd19aa192d6eac1dbfc3b19abc", + "name": "GitPython", + "version": "3.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "3f71971502087521f123c9daa26bc12d31d3466738b567390b8602acad3be22a", + "name": "Jinja2", + "version": "3.1.6" + }, + { + "direct_url": null, + "metadata_sha256": "818fb343b7b6b99a32771bf4813521ae6440b4c7579b3ae46e32dd02da0afeee", + "name": "Markdown", + "version": "3.11" + }, + { + "direct_url": null, + "metadata_sha256": "dc1ee42cf8ecfeee0ab60b15b21d291833e0732548efcb7bb5b3564dca3e5bf7", + "name": "MarkupSafe", + "version": "3.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "de7389b142450a0014234286b0876f328439b823c355c73d0aed41fd67ec208c", + "name": "PyJWT", + "version": "2.15.1" + }, + { + "direct_url": null, + "metadata_sha256": "ffcad4415cafb22b8b536a61595e9ee13438b51d31b0763c1b273ce3bc58e840", + "name": "PyYAML", + "version": "6.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "8562d701cc52d9cafbb418942b0e072fc087ed8ddcf35cd10224c1b2ed8bdd91", + "name": "Pygments", + "version": "2.21.0" + }, + { + "direct_url": null, + "metadata_sha256": "b6c25fcfdcc495edf248a10ca4ad28327ef2ed6047a6ec5c6346e121414c7f21", + "name": "Werkzeug", + "version": "3.1.9" + }, + { + "direct_url": null, + "metadata_sha256": "55c400d24c71b581d9c0992f71df6047cf6c878bebe61a7d45d6e02dc0e4c510", + "name": "absl-py", + "version": "2.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "13db521f90a6a882027b2388eaa2ebf252945f9c2adb7e7e371da18239da4df0", + "name": "accelerate", + "version": "1.15.0" + }, + { + "direct_url": null, + "metadata_sha256": "86fe44e38e67872dd895c729044942ba2c2f934ae439a899fb83a186206b7fd4", + "name": "agent-detector", + "version": "2.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "afe11fe9f5aa54e734cdd51659bed8c89dc6bcd5aef0ad96f2d20149c8de5456", + "name": "aiohappyeyeballs", + "version": "2.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "570b307bc0b53fbbd3ed2ce0b7eca6bbf2fa73bf75e24a480f1034d8c0b832bf", + "name": "aiohttp", + "version": "3.14.3" + }, + { + "direct_url": null, + "metadata_sha256": "44b7f8e14c4770793e747fad50c9e0a6ee7357651d878554f192d94768dc14a8", + "name": "aiohttp-cors", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "648813a44a9ae0ab2f20ee86d2404dcc38e3f9e80c63316cf6e536735df14e54", + "name": "aiosignal", + "version": "1.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "f6a3f6668bacef7f73a2c19ccb2be910b2363d1731c4725cb04364d99e24935a", + "name": "annotated-doc", + "version": "0.0.5" + }, + { + "direct_url": null, + "metadata_sha256": "fc6d752cde6a6a4bff03474386de750e130b75da3c7815ee909f45b51fea98c8", + "name": "annotated-types", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "4e89d670a4b20029da30e5a9e8ebcbc844deff9c44209552bafd5537249c8b9e", + "name": "anthropic", + "version": "1.9.0" + }, + { + "direct_url": null, + "metadata_sha256": "b5a6f00800956387fcddab1fe1b5aa8502c249b86cfb16d58ed700f282f60142", + "name": "antlr4-python3-runtime", + "version": "4.9.3" + }, + { + "direct_url": null, + "metadata_sha256": "a6008defa9492cd08250217b134782cad1db4580e1d7ddf69cc2a2a48cea24e0", + "name": "anyio", + "version": "4.15.1" + }, + { + "direct_url": null, + "metadata_sha256": "7877c64ce8957237363f2df313819bb07f50752df016d14c5a5a99bec10f5deb", + "name": "apache-tvm-ffi", + "version": "0.1.11" + }, + { + "direct_url": null, + "metadata_sha256": "3543ca8f0e072c00ab111b20eba99ce86dbf93ada28988775bc2677284b3c07a", + "name": "astor", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "d4b328c09c024fe1e4d788a9c7715ad726095131b815cd35fd933268226f6269", + "name": "attrs", + "version": "26.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "4850c4d696a5e2a2ecbb3dd792b060acc1de79e09800669b0b9fc3a22c055e6d", + "name": "av", + "version": "19.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "863ff92208d0a02dabfa008bfe91846a5c401ded301e5687dca7dc63c911865f", + "name": "babel", + "version": "2.18.0" + }, + { + "direct_url": null, + "metadata_sha256": "f32e6df3197f05202e586624d95c5e217003d80cee655c165d533102f628df21", + "name": "backrefs", + "version": "8.0" + }, + { + "direct_url": null, + "metadata_sha256": "905c362f655fbc6d37a24686efc2b3bfbd3123b8ee5a443a43f6750d87455e90", + "name": "blake3", + "version": "1.0.10" + }, + { + "direct_url": null, + "metadata_sha256": "07c85682b6aefd5c9b48890d306c1604311902295704892ede48e5a83219a8d3", + "name": "blobfile", + "version": "3.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "2d582941a7081625a35f35a0c4a2e80f7737312e29c38e5fdb6fc08f9c113077", + "name": "bracex", + "version": "3.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "3b60c55bae0d0340c3a3fd918635bbfa3087579da66e0fd7f6be7a3782c0da3d", + "name": "cachetools", + "version": "7.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "5d11a6878d5bc3f22290281a19ef7b36daa95c910780950608b95cd788c7e12e", + "name": "cbor2", + "version": "6.1.4" + }, + { + "direct_url": null, + "metadata_sha256": "362c9942c48051f168ed2b9f2146266b7792d3c05e164cd6afc3f3b65884fdc9", + "name": "certifi", + "version": "2026.7.22" + }, + { + "direct_url": null, + "metadata_sha256": "b4abf1bcf1c1d8e0272d8007fc974499ea59e5f2a5b98af3c78a5e67515a9d87", + "name": "cffi", + "version": "2.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "766120f13c177446f51929a4d201104bc935b6d5a2a176cd6716edce757d3d95", + "name": "cfgv", + "version": "3.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "610e9a9d03ce837ffe6e42be5e02e70087f73863f7350bf7bb7f0511edcc5ec0", + "name": "charset-normalizer", + "version": "3.5.2" + }, + { + "direct_url": null, + "metadata_sha256": "7ad836b3147c9702546d9c28b4fa5be23b24445439db5d0d2a58d17281c84daa", + "name": "click", + "version": "8.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "4c5f00599ebcbf11d337e48a72784d256ca3d704fa9e9f5daadd60065e6776b7", + "name": "cloudpickle", + "version": "3.1.2" + }, + { + "direct_url": null, + "metadata_sha256": "a0970189e3ab7a596d6902d5f61f93b414f138f03d3cf19029145657bfceb382", + "name": "cmake", + "version": "4.1.2" + }, + { + "direct_url": null, + "metadata_sha256": "94a6ebf9718e55f254a43ce0d2f04e0d6d44e7141b6f3144a84feb6519a77bfd", + "name": "colorama", + "version": "0.4.6" + }, + { + "direct_url": null, + "metadata_sha256": "ca8ec227f406d970a645ec482b20619128dd34b9cf71159cc24e27db461a2711", + "name": "colorful", + "version": "0.5.8" + }, + { + "direct_url": null, + "metadata_sha256": "bbaa51b7e4d8f142bd075d01257c0572c0c844796d51426e35c8096a13e8da76", + "name": "compressed-tensors", + "version": "0.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "6063d8ff7ebc458d63a4332853d7ababf4ee2b86336362c8d2b12be6e998eb6b", + "name": "connectrpc", + "version": "0.11.1" + }, + { + "direct_url": null, + "metadata_sha256": "ac5f4b5a5f68080bd9c3fe77399fe8a1bff2ee5923c49db1df544dd054cbf15b", + "name": "cryptography", + "version": "50.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "f41d2f6b4616accca2f5e1dd47aa9e8937c28076cde698226d93e727751f3099", + "name": "cuda-bindings", + "version": "13.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "e5ca6ed34c687c6f4a4d157ad0a2cf06ec0316fe8c4c0ddeb666ad76dd6f30f4", + "name": "cuda-core", + "version": "1.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "89baadd9da23dce9990481519544115615ba3cbd2d1a41e09feea7756fffb378", + "name": "cuda-pathfinder", + "version": "1.8.2" + }, + { + "direct_url": null, + "metadata_sha256": "1ab914b9a57ca601df2e3cfe9608427b15d8afb78029076ace5d1caf9fd45f08", + "name": "cuda-python", + "version": "13.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "73d97a5eb578223b4895ef4f234574d14219cef9999ff7d0e92a3d0dd057bd3f", + "name": "cuda-tile", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "ae6f957fe66ed63081d1d83ee6e8838f3a0af2c6fce1223629d0dd6264565ead", + "name": "cuda-toolkit", + "version": "13.0.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "1f8e0ae51ad5feea63f58ed2e24f3da6f23ed548043235a14f7623d961dd9b64", + "name": "datasets", + "version": "5.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "153f4a4d6ff03dbe5c8ad7fe54bc2e7b989a4947b70f7aa77fbf652b394f2a2e", + "name": "depyf", + "version": "0.20.0" + }, + { + "direct_url": null, + "metadata_sha256": "ee09fc752d7271aac93079cfd63409957dc6b536c1ffd9355a01bf7297e72aa6", + "name": "detect-installer", + "version": "0.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "a7feab2c4f69fd5f85e5a3cb495a7f1870a6bf8199dcee5339e8118f7acbdc09", + "name": "dill", + "version": "0.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "fef3fde661fe30ba7bd1d78841a797136b2b3461705bb4eb92dc54f8308bbaae", + "name": "distlib", + "version": "0.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "fef3fde661fe30ba7bd1d78841a797136b2b3461705bb4eb92dc54f8308bbaae", + "name": "distlib", + "version": "0.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "a3ca2e39abe76c4a33d5fe4a2a84375ec9f25cdfdb7e1d8ea406bd6f1603205c", + "name": "dnspython", + "version": "2.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "92a07daad5e6ff461199de14e845d9b376e309ef916ce5379f3c9cd4e3b1623f", + "name": "dockerfile-parse", + "version": "2.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "5b566b25f0cbe4955d0b16844a7cc6d2002caa3bde2dfda7f301fd8870cbaa56", + "name": "docstring_parser", + "version": "0.18.0" + }, + { + "direct_url": null, + "metadata_sha256": "5a1080b5768c6c591e1c4f9c9812cafa808781b9eeb198043bf185e22d4a1613", + "name": "e2b", + "version": "2.51.0" + }, + { + "direct_url": null, + "metadata_sha256": "0a63979e0b946e16238e4339e60d9c1eb5a7ce3ea93dae78b5da9c65a6190540", + "name": "einops", + "version": "0.8.2" + }, + { + "direct_url": null, + "metadata_sha256": "16cbe67a57558f1d4bfdbc22a454434ba301750c57a62b1d3f5361c9e5cddc00", + "name": "email-validator", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "0617ddb55b90b42ddc9398dc7e91d61fe928a2504939f76526dc15b22d238caa", + "name": "fastapi", + "version": "0.136.3" + }, + { + "direct_url": null, + "metadata_sha256": "ddd82b9666c21988e234d623e2575e1b89fd4133260eeab43fc9a7c074f7024a", + "name": "fastapi-cli", + "version": "0.0.32" + }, + { + "direct_url": null, + "metadata_sha256": "611602e834d42e10433155ff5f5581358d732fa6b6f6f7820a8f79e74b1ce1f9", + "name": "fastapi-cloud-cli", + "version": "0.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "794524e4a9659bda6043721d848d028ea49996085a33326094fbaaa3f6e6b895", + "name": "fastar", + "version": "0.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "711401d36e60e10e35beb4d0f1bb42bf0c4d86339ae52f32b9aa4a4d790530dd", + "name": "fastsafetensors", + "version": "0.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "efaea9742e348c4c4bdcc6f616a33cc5aa3ae926494a72a46690b7da2f08ed5c", + "name": "filelock", + "version": "4.0.7" + }, + { + "direct_url": null, + "metadata_sha256": "99bd6c3f10781d3d2d350f2c3c9fc4765b55f25de8a6d6dd1f71501802d1255e", + "name": "fla-core", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "0a6ef979b75295cee2b5293ad4942b0cf2682e9e38680203064e0b70249c1a96", + "name": "flash-linear-attention", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "76b70a11ca82ea4606b529e7a8658cb3fe71412afa46f2ed57101dd91ba27558", + "name": "flashinfer-python", + "version": "0.6.18.post1" + }, + { + "direct_url": null, + "metadata_sha256": "ba8ff415192b5cbb90efce046e2271a00c8184afc362d8b47fbbc84d5e558b05", + "name": "frozenlist", + "version": "1.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "e7712831c80eb13b08fb7f7cc33988a8f24654af9eba7c6f5f943b2636e4306a", + "name": "fsspec", + "version": "2026.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "025de85c794878d0caa737869307447595f514ebf9599eacb5b1a501bae479b6", + "name": "fsspec", + "version": "2026.9.0" + }, + { + "direct_url": null, + "metadata_sha256": "ca94883bdeaa3740b45b6994443b445fd67c6e4a8064ac3bf9d92d2a5221eee8", + "name": "ghp-import", + "version": "2.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "a7e90983562a035cf767baa63d8c32bc37e1de7cad71ac7b6b2bc70a95bba4eb", + "name": "gitdb", + "version": "4.0.12" + }, + { + "direct_url": null, + "metadata_sha256": "dd96143ec79178bef685c1f5c0a58a87a66d003b421e605de65697308321d518", + "name": "google-api-core", + "version": "2.40.0" + }, + { + "direct_url": null, + "metadata_sha256": "0735d57088a83df2355e16843107fb0112abe2178fc5bb8132947a7ad962aa41", + "name": "google-auth", + "version": "2.59.1" + }, + { + "direct_url": null, + "metadata_sha256": "2f3aa9d9500d329560440e6a5a152e420aad5f5bbb23701f45b740be721784a1", + "name": "googleapis-common-protos", + "version": "1.75.5" + }, + { + "direct_url": null, + "metadata_sha256": "06d74ab04fdc03fad368868907f0d10e7d9f397aab58d58965c0b78ffaec34cc", + "name": "griffelib", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "7ee1c179e2c68a62968308b2f96f4f3469176ee3ac8bdb494ac80188d4d41271", + "name": "grpcio", + "version": "1.84.0" + }, + { + "direct_url": null, + "metadata_sha256": "04cf3a4a91575850f386f4fcfdedd8e7fbfba08feff038fbc1296d1e854db2dd", + "name": "h11", + "version": "0.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "b954a6ba4739c0cc878bb8ea27ea7c7154a48bb4b7c06dba9e9cf880cf0ec930", + "name": "h2", + "version": "4.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "6f0d7bf86e75d0bda1ceccc82367c0145ad0ec522c4d4f51bb454f467faadcc9", + "name": "hf-xet", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "f991b847550cf8225f69562902b5ccb591b2ce9a08fe07ef6e6d701bdb4694a7", + "name": "hpack", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "314d194165c4700034c1c67cee847d549a6d7091374c71f2cef0186ec56a3eb9", + "name": "httpcore", + "version": "1.0.9" + }, + { + "direct_url": null, + "metadata_sha256": "aed9767360bed1bcbda71e3b1a3c996603f86558bc77a1693ee3d09973d20cad", + "name": "httpcore2", + "version": "2.13.1" + }, + { + "direct_url": null, + "metadata_sha256": "8fa3bf3510c35e2eea9f523a1cace7120079cf51d76c4acea97de95806aaa14a", + "name": "httptools", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "3bf4804c215d111b6a4702cf9000021ab39807d1ed3207dd011b14b2843b2d14", + "name": "httpx", + "version": "0.28.1" + }, + { + "direct_url": null, + "metadata_sha256": "d11dd50813b8914bd9455e8b2b591171cd2b1618883943153afadc8bb9224678", + "name": "httpx2", + "version": "2.13.1" + }, + { + "direct_url": null, + "metadata_sha256": "43b119c34ad2b2aacc032a1a6a8feb142fdb5ca407a3519325d74dd53d8904df", + "name": "huggingface_hub", + "version": "1.33.0" + }, + { + "direct_url": null, + "metadata_sha256": "9ce850d5a6b775e5ef4a335f907e579a878e058213121b6eec567781ea68c585", + "name": "humming-kernels", + "version": "0.1.12" + }, + { + "direct_url": null, + "metadata_sha256": "67aa4f6717d82446a51ce350e7c4769eba0c4a22d2f428255cddd9d24b11a914", + "name": "hyperframe", + "version": "6.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd9511ede42f63b995c3f71944f908cb8f014048b63ecc1c8d420525a3354b59", + "name": "identify", + "version": "2.6.20" + }, + { + "direct_url": null, + "metadata_sha256": "af3c3a62bb5d82d6a43454684e0b1dedde27a21ea90eacfb1bed9814619f06d0", + "name": "idna", + "version": "3.20" + }, + { + "direct_url": null, + "metadata_sha256": "cf71393f3d079ce2e859384573e65aaacd1709bef700701f629df32398b598f0", + "name": "ijson", + "version": "3.5.1" + }, + { + "direct_url": null, + "metadata_sha256": "9305763e93d03df0e36516b1125fa046a6ebe37d44589e200e0593cf4bdfd980", + "name": "importlib_metadata", + "version": "9.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "32860c3c19b2e91f6cb5bd83400b5870cda051bc74a5a08822c8c666af0990db", + "name": "iniconfig", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "560faabb3d45d779e445a74e7e806a786f95f2200fa06d979603b7f0ee1cfb39", + "name": "instanttensor", + "version": "0.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "f6fc1f0d389e4245fc2a1a0fdfee09422e56200cb6f94659668456997ff4f7a9", + "name": "interegular", + "version": "0.3.3" + }, + { + "direct_url": null, + "metadata_sha256": "d10f300731197a4829b77f0c883bb3cf8a37ae8c76a302e095fa95d6427706d0", + "name": "jiter", + "version": "0.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "5b0c8d4b4c535a2432fb206223d774509b6e20af374c6a4b6f98bf72a7de6702", + "name": "jmespath", + "version": "1.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "6c4032c2e74273452cd77399af2ee85198f49c22da897983f26d2ed6f787c4e8", + "name": "jsonschema", + "version": "4.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "aaa6cd66f423729e8da397c9d533b7d731f6b25f3d6371b9338c36bdb9be74a0", + "name": "jsonschema-specifications", + "version": "2025.9.1" + }, + { + "direct_url": null, + "metadata_sha256": "f7c0687c032593106a2e5a3c241cf8043e7e2c222bddb0022b4cb2bf5de67115", + "name": "lark", + "version": "1.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "4511c6b04efc57a5f5333edc1f5f48b9f5412c3923d4bc19b715bdf47977511c", + "name": "linkify-it-py", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "be929870f6ecae18a819c56118f1101f3076e25ac6a4843ca6f4707ebd1e87c6", + "name": "llguidance", + "version": "1.7.6" + }, + { + "direct_url": null, + "metadata_sha256": "cf2b87669bead3e76ec54207f3354c13f73b50c32fcd13c8d627084b3379139e", + "name": "llvmlite", + "version": "0.47.0" + }, + { + "direct_url": null, + "metadata_sha256": "0a416d79c5543d94d2b18807626293d4f47655d1d22724c7ae296e413078aaba", + "name": "lm-format-enforcer", + "version": "0.11.3" + }, + { + "direct_url": null, + "metadata_sha256": "16bc1f59e34fd2a6633bd395276052eacd2c777b2cf72781e76b203f013a8fac", + "name": "loguru", + "version": "0.7.3" + }, + { + "direct_url": null, + "metadata_sha256": "5216d5acfd039a7b581a826186309594b228d37d2c8d56864124ea666689fe4e", + "name": "lxml", + "version": "6.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "f59d772b35315a928672bfcccfb89d82c0aac672c5275c048f7a93b79015bcea", + "name": "markdown-it-py", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "b137367ef0056711cbf5e53015df9168cab80373104e7899b1c0263a21d9c99c", + "name": "mcp", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "38e0b9edaae09e58cd1461fc961ced22672038a697930bedef153a74befb3de1", + "name": "mcp-types", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "799f49685865fd9cc8915fdb92a33e102eeeffad562b03b4aeffb6f422b771c1", + "name": "mdit-py-plugins", + "version": "0.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "481f9cbe08596c6eaba6343e0efa1b13b2362c30dce0610f7c08523f1d98388d", + "name": "mdurl", + "version": "0.1.2" + }, + { + "direct_url": "{\"dir_info\": {\"editable\": true}, \"url\": \"file:///Megatron-LM-training\"}", + "metadata_sha256": "2876c0c760bbfc93bd7d737bf0db2866a937308a7c1707c3a2bb59d4795986ff", + "name": "megatron-core", + "version": "0.16.0rc0" + }, + { + "direct_url": null, + "metadata_sha256": "a6e34d488c879f57ce042bec38f8864ba3ea7d6ecf0ab757fc88fe8dc0a22f26", + "name": "memray", + "version": "1.20.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd26d80dc9676b1fb8c894355bd525fbe7f49a6a86a555c72e9ec6d927247c33", + "name": "mergedeep", + "version": "1.3.4" + }, + { + "direct_url": null, + "metadata_sha256": "dd1b3b89e88d1c65a26e6e72dd075eabbc220bfb138769ec8b64578ee911795c", + "name": "mistral_common", + "version": "1.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "4859847a9f6321daf8849cf7fd1542ff430db6563a2abf9ac0d62a5b21bd951d", + "name": "mkdocs", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "1729fc31479f2582486cdc85397417659dd3b2fb3f920553de66cfe59d5f0b3e", + "name": "mkdocs-awesome-nav", + "version": "3.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "88b4b7b7c0aba5547befdedaf515c8df4867361daf55ff60b72578464d72dcbe", + "name": "mkdocs-get-deps", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "ad33bb33fb16b1f69689c4682550e97232154e367e2c8c8aee9dad0f10d269ce", + "name": "mkdocs-git-revision-date-localized-plugin", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "ed69fbfb9ac00c10c5a383a12ff9d2b9919ae184e408554434199211643d6040", + "name": "mkdocs-material", + "version": "9.7.7" + }, + { + "direct_url": null, + "metadata_sha256": "d1c549b61701148b97f8246bc924b2840e504b37b0ce7a27e78ddf81261e5363", + "name": "mkdocs-material-extensions", + "version": "1.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "4ad6171f3bf6812e4de90670ff0089d445093d4fe1d05d55f17b96a4a192a816", + "name": "ml_dtypes", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "4ad6171f3bf6812e4de90670ff0089d445093d4fe1d05d55f17b96a4a192a816", + "name": "ml_dtypes", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "b0dbdfa30ab6b1ce637a794899c9e43019182b6d1ab2d07b90f647f7331eba6b", + "name": "model-hosting-container-standards", + "version": "0.1.16" + }, + { + "direct_url": null, + "metadata_sha256": "95424470e481cfa8d18b30963b6de3aafe16614b1ea0414e184a008571dde84f", + "name": "mpmath", + "version": "1.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "eb184d83489401903615ce8a78d98d5b933dec0f7246811d396a529915fe797c", + "name": "msgpack", + "version": "1.2.3" + }, + { + "direct_url": null, + "metadata_sha256": "520006303d6a0e859970b83f7d452196e2e8f6dab08f6dcf1ba5823c1230025f", + "name": "msgspec", + "version": "0.22.0" + }, + { + "direct_url": null, + "metadata_sha256": "010d2fe039006070a711a476b171b7b7da5c29ccad3c4eecd77ef3711b07c2d0", + "name": "multidict", + "version": "6.9.1" + }, + { + "direct_url": null, + "metadata_sha256": "235634cc7ebda45f8a84dfdb1b9b35ac1a77a1888b34650c3a616d23e4a7e93f", + "name": "multiprocess", + "version": "0.70.19" + }, + { + "direct_url": null, + "metadata_sha256": "7c545b4b3e5e83d3fde41352272c10cb9deeaba5b7138fbf24383e952af8822e", + "name": "natsort", + "version": "8.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "311ee8cdaeaf9f11acf51cda9c3b5b191f76ce9d98bc3418164c3189bbc37a08", + "name": "nccl4py", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "66360539217852c3b44b37f409eade7e1559baf018bb363bacb2aa3a9759b203", + "name": "networkx", + "version": "3.7" + }, + { + "direct_url": null, + "metadata_sha256": "e8b0b1746808b87816c47e4531780ded7f246bed9575a89e8b40200aa81e9a13", + "name": "ninja", + "version": "1.13.2" + }, + { + "direct_url": null, + "metadata_sha256": "77c1117f0dbc41560ddc6e6b37b542fb4e88afcd4ef82ec06593e5bbd5f37121", + "name": "nodeenv", + "version": "1.11.0" + }, + { + "direct_url": null, + "metadata_sha256": "9af629898406c9eaa69897fe09220dc483270cdba89f6b20bf0165cdf0e1668e", + "name": "numba", + "version": "0.65.0" + }, + { + "direct_url": null, + "metadata_sha256": "0c7281a81cf76e40b27c1385ffd8a215d7227adc219f177ce807ead9e91994a5", + "name": "numpy", + "version": "2.3.5" + }, + { + "direct_url": null, + "metadata_sha256": "0c7281a81cf76e40b27c1385ffd8a215d7227adc219f177ce807ead9e91994a5", + "name": "numpy", + "version": "2.3.5" + }, + { + "direct_url": null, + "metadata_sha256": "bab990ced4537ce74ef5961ca933c4c6fd604fd09a5827a4a428c55bcb0be35b", + "name": "nvdlfw_inspect", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "10f6595146332d35f7f15a000e08b5c81432528c5d026470c1d03f0c1399fb70", + "name": "nvidia-cublas", + "version": "13.1.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "58e933b4ac8e49f098b16ab7480d03bd792afc3d1db10d0aacbdcc2c62e48fa3", + "name": "nvidia-cuda-cccl", + "version": "13.3.4.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "baac937970681d41aa0c3708b3d55d73f8d29e70aceaac0e71fe6d1548e94a09", + "name": "nvidia-cuda-crt", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "8d51e5c76ef5707b0b80d5ec9a791c0f11a480ab721820cf100a3cc566017eef", + "name": "nvidia-cuda-cupti", + "version": "13.0.85" + }, + { + "direct_url": null, + "metadata_sha256": "724bf56e61ddef5d4c2482ff64103a973b911b110b668acaea5373f6c83c1c5c", + "name": "nvidia-cuda-nvcc", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "c54801dbd815d534519a761f1f328325aa0f1d1f1659aa969fa74e7a2c76eee9", + "name": "nvidia-cuda-nvdisasm", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "af51f248363020b9fdfd2743704e901bf3d19a1a1ce1fe44fb98ba148bfc0157", + "name": "nvidia-cuda-nvrtc", + "version": "13.0.88" + }, + { + "direct_url": null, + "metadata_sha256": "055f7fc69a5a2159de82cd0718da02c8852e81c8a71ebb117b8e799badd7167e", + "name": "nvidia-cuda-runtime", + "version": "13.0.96" + }, + { + "direct_url": null, + "metadata_sha256": "df18686dbdb3074ca375a1d6c623a04102fd348950c67a721397349c6d4f0477", + "name": "nvidia-cudnn-cu13", + "version": "9.20.0.48" + }, + { + "direct_url": null, + "metadata_sha256": "abd0ca3f67af19a4d383ff2a012ae0090d4731c6492fd47236615308a50b3981", + "name": "nvidia-cudnn-frontend", + "version": "1.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "4a78545d424d0c5038353f7046a8ae40ceaf312045d71399eac9511f5fc15434", + "name": "nvidia-cufft", + "version": "12.0.0.61" + }, + { + "direct_url": null, + "metadata_sha256": "e49b909195c03ddbe203729d9b31dd88e3f207368333d1909c67c6b130a0c696", + "name": "nvidia-cufile", + "version": "1.15.1.6" + }, + { + "direct_url": null, + "metadata_sha256": "bb15a754c6be32c23aaac13c1cfa7a8ce53d92bc26652ec3b609f7a5cce3e7d1", + "name": "nvidia-curand", + "version": "10.4.0.35" + }, + { + "direct_url": null, + "metadata_sha256": "0dd58f677811eac04901a793740932e5a2a8fff2f5453aa6351614eb18391bb6", + "name": "nvidia-cusolver", + "version": "12.0.4.66" + }, + { + "direct_url": null, + "metadata_sha256": "8aeb284782ef6883095a5d1c110e221cad023a99afcfd5cdb4969a25e146d562", + "name": "nvidia-cusparse", + "version": "12.6.3.3" + }, + { + "direct_url": null, + "metadata_sha256": "09555246122896eaca3b8313eecfca4b339fefd3b597874cb9fe3bf29dab38c9", + "name": "nvidia-cusparselt-cu13", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "ac77bac79fbfb0c52ac6e2e5abc936b1e127be2192f0cbc27b00be3125fa86ae", + "name": "nvidia-cutlass-dsl", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "1ec968ec7c4083f7fe4e1fb8384c7e9b853a81491fef9f4cb1cf755961aaedf6", + "name": "nvidia-cutlass-dsl-libs-base", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "cc6f3846cd820013eaa6e2665c493d70c607be6ce7349b939eb4742888470585", + "name": "nvidia-cutlass-dsl-libs-core", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "2357d0df2d0d17c0b16663b8a89df53f751b19721f66821fd88fa78112c08e55", + "name": "nvidia-cutlass-dsl-libs-cu12", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "244590c25662dcf777b1daae97a858afe1a1aec62e5e6678b217007a459ab552", + "name": "nvidia-cutlass-dsl-libs-cu13", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "c3a25ada01f57418c1b897406c3abab18834e6adc573ab7b060620c453afb6db", + "name": "nvidia-ml-py", + "version": "13.615.71" + }, + { + "direct_url": null, + "metadata_sha256": "56baad4e7f699902b03b17580933f7bd50b6ea97b7df9d7e807750973da7529c", + "name": "nvidia-nccl-cu13", + "version": "2.29.7" + }, + { + "direct_url": null, + "metadata_sha256": "98810ef0ab8badc369e6a46a038f8ee9f412c0c753fb5ad580544f23a0aa7962", + "name": "nvidia-nvjitlink", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "b0f54ee21909d19640a58e05da755c91763eb5725f544fd0d4b84b2f5f94deba", + "name": "nvidia-nvshmem-cu13", + "version": "3.4.5" + }, + { + "direct_url": null, + "metadata_sha256": "06dc1a593c7e8b8c3f29184228c83f8f7ef57787ad91f3e5bcae1d238dd3092a", + "name": "nvidia-nvtx", + "version": "13.0.85" + }, + { + "direct_url": null, + "metadata_sha256": "32ee63450a437b6a6ed227ff6549144aa596197a322993521ec7af826ebd413e", + "name": "nvidia-nvvm", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "32c2efdcd2c673b3b7f35ca9c2cccefaad36f1f0a920648a13cad85f6a5767b2", + "name": "nvtx", + "version": "0.2.15" + }, + { + "direct_url": null, + "metadata_sha256": "3419d80e114a2c19fa9bd3582939a3942f19673055707ba6ca2ca489d58b41e0", + "name": "omegaconf", + "version": "2.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "28971076ce9c279d4b889496b046d55a1e05b02fb9851ceb717e9a10df799572", + "name": "onnx", + "version": "1.23.1" + }, + { + "direct_url": null, + "metadata_sha256": "1246f5a4d8295907a42e809ed9173ede2510ec9d260d2168989d126564897fa5", + "name": "onnx-ir", + "version": "1.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "e14643636835759700dff286f949c5ec34e7eac7ac47f44096414f0e0f1c3101", + "name": "onnxscript", + "version": "0.7.2" + }, + { + "direct_url": null, + "metadata_sha256": "00f847e99939207bd70dfd806428f6b20a3d01074b59325e4c76149a2e19be26", + "name": "openai", + "version": "3.22.1" + }, + { + "direct_url": null, + "metadata_sha256": "598d3ad5a22a14a7c4f1d218b43e345f32b0ba094b753467bae8a3f708fd48cb", + "name": "openai-agents", + "version": "0.22.3" + }, + { + "direct_url": null, + "metadata_sha256": "5a0afcb1ce845e05da12beb1767f5d2749bbc9e9050718c6b9fa3c225713c9eb", + "name": "openai-harmony", + "version": "0.0.8" + }, + { + "direct_url": null, + "metadata_sha256": "e86a6b6fcbbe152805f782c57df321002892e163019574877e9829272e25eb4e", + "name": "opencensus", + "version": "0.11.4" + }, + { + "direct_url": null, + "metadata_sha256": "53d669c8bd3d32d3275153b454e515ca5cc6dec92fae3a98309b5a2b19fe6d2d", + "name": "opencensus-context", + "version": "0.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "19778b6d66b0e45bf73e11fa37a208949d5b393aef914627394d5601455546a6", + "name": "opencv-python-headless", + "version": "5.0.0.93" + }, + { + "direct_url": null, + "metadata_sha256": "19778b6d66b0e45bf73e11fa37a208949d5b393aef914627394d5601455546a6", + "name": "opencv-python-headless", + "version": "5.0.0.93" + }, + { + "direct_url": null, + "metadata_sha256": "a3f5434fa7c80f7f7abc82173da639c8e9c59d30b4027182645562bd3d2f4f97", + "name": "opentelemetry-api", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "8611977ea596e4827874582e86250618444e1c718229dddfc16e5ea437ce5fcb", + "name": "opentelemetry-exporter-http-transport", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "2cfd41e5ca33292d987ba71fa6186d11e16ed66888f3a26f8a3a99060c4b5e90", + "name": "opentelemetry-exporter-otlp", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "3bb4494220732d4bf10e1dba231ea7638cedaa5362e1f23a50d34a14f520fea8", + "name": "opentelemetry-exporter-otlp-common", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "27fb1c8aa5c2cd07776f9f3281fc618cd3feb96017757c33d2b3586fb7fec88b", + "name": "opentelemetry-exporter-otlp-proto-common", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "5cba6098cdd0bfb06853a6c704a2451c4f82c9dea376a30b59ecd279296648ad", + "name": "opentelemetry-exporter-otlp-proto-grpc", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "6f53ef1c172ebf87af69b9ef390aa908506d0cd14bc7811985fdd937a4058808", + "name": "opentelemetry-exporter-otlp-proto-http", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "1910f4e7ebd497e98b6d231e10275288fda2cd1885117575706c62f45e065889", + "name": "opentelemetry-exporter-prometheus", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "fab18b721e30be41448be252e1dca43b48e7f15d971e0bb552492c0ef4b07bee", + "name": "opentelemetry-proto", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "3644a79f55762a646799ff52b9d837e01c8192b7b28f735a383f55c90edb9bc2", + "name": "opentelemetry-sdk", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "add3db481f7f401f65cfbddb058fde3bb4c9dd7b61064a84f8598ad7efe0b11c", + "name": "opentelemetry-semantic-conventions", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "0dfff30e912520a226bcf7a547393484cfcd8c738439c7b48418f61c95109480", + "name": "opentelemetry-semantic-conventions-ai", + "version": "0.5.1" + }, + { + "direct_url": null, + "metadata_sha256": "210ce26bad0a245a72831b4fa029708c245d4d670a88c8d5a69b1446c24a95e4", + "name": "orjson", + "version": "3.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "35ff73511848f5f934ccc39d538014716ec4579e76d54e0e407ff51794a7939c", + "name": "outlines_core", + "version": "0.2.14" + }, + { + "direct_url": null, + "metadata_sha256": "8ee2f7138ade46b6e348a6d099612f5bd6caff13511f3b4144327f37ce50eacf", + "name": "packaging", + "version": "26.3" + }, + { + "direct_url": null, + "metadata_sha256": "a4ab87bf8083001f25ccdc46095f05b678b3569dd58edc2cf941e3e7f64d7c88", + "name": "paginate", + "version": "0.5.7" + }, + { + "direct_url": null, + "metadata_sha256": "1de96a6c28c2e5613c9c87cd4ad9484791001cf58df43cf2ba74d5c4f85f0ad2", + "name": "pandas", + "version": "3.0.6" + }, + { + "direct_url": null, + "metadata_sha256": "d05b8d05da9f78176b2eefaacdfaa5e96708ec4f488daea8bbc52e3ed1bc3954", + "name": "partial-json-parser", + "version": "0.2.1.1.post7" + }, + { + "direct_url": null, + "metadata_sha256": "c1d126edceac2685e29403a8ae3a27c47143dce1f0252fa3931771562f1e2b4f", + "name": "pathspec", + "version": "1.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "30325dc8ce17bc64f9dbc0a449232fd35841a019df22a6f481007c9c5a28c1cb", + "name": "pillow", + "version": "12.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "cbc0b7b6e63b50dcb7c17cf3526a9304f285d9a31353adf3b22acc2059ab23f5", + "name": "pip", + "version": "25.0.1" + }, + { + "direct_url": "{\"dir_info\": {}, \"url\": \"file:///work\"}", + "metadata_sha256": "6ba03b5bc457a2a3d92468729501b5892a0d38ebcc36766c58859449498c5743", + "name": "pip", + "version": "26.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "0421937c4410b61c5325233d5b7671ae933bae8de174f87586ac55aa804851ea", + "name": "platformdirs", + "version": "4.12.2" + }, + { + "direct_url": null, + "metadata_sha256": "2bcffab42626e1fb50d6329765619312d30fe7f4880e98dcee99c92ebd283bb4", + "name": "pluggy", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "7e7562ba7c032f8edd02641ae71b1ac2d8f388103a68d777a7e907d19e75bc17", + "name": "pre_commit", + "version": "4.6.2" + }, + { + "direct_url": null, + "metadata_sha256": "bbe0a7662602ddd23f929fe0ee98e9d04406e138aeee18ce4861af186ea6060d", + "name": "prometheus-fastapi-instrumentator", + "version": "8.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "ece4a61f3ffb92a083fd5e47e180e3e070342e60a3bd93876a879e79a643e821", + "name": "prometheus_client", + "version": "0.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "5feba21a58eaa126e7e7739e57e2572e5bb251fcbf56e439e508acc47d769314", + "name": "propcache", + "version": "0.5.4" + }, + { + "direct_url": null, + "metadata_sha256": "3f136dbf7239c987a7685acd33440cc5efd6c4107b4b11c425201b4de70ae36f", + "name": "proto-plus", + "version": "1.29.0" + }, + { + "direct_url": null, + "metadata_sha256": "118b5ad013120a7a6e24714595ad776bf264d7b0060389133310d18ea1480902", + "name": "protobuf", + "version": "7.36.2" + }, + { + "direct_url": null, + "metadata_sha256": "0849f5a519bf9bc23ef204443fdd8d6d10678863acac7ca9340fc11bfba5a856", + "name": "protobuf-py", + "version": "0.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "eab5f2f4fd98f67a710a8fb1975b64ffa880a4f977566f022c567e08e324ccd6", + "name": "protobuf-py-ext", + "version": "0.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "39009938840de3a8b2a37eb4668d2601aae8c74e4b74743f73e59996b5b7e6e1", + "name": "psutil", + "version": "7.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "df44b58e8a4cfe57f65773ec47f7bdf2a14c8f5f73a7abf331a6b6237d6d691a", + "name": "py-cpuinfo", + "version": "9.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "2fd4a9efc5e5c74ae4c2fcf1970193c524c62ab22af8d5e66ebf7df9e6e46e83", + "name": "py-spy", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "d2ccdeb15cddedc81637a83e40baa6397fe269023b738d0fc3cb2d90722e290b", + "name": "pyarrow", + "version": "25.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "47b9f28e971a56f5adf949e0bcf105b0bf6587946566ecf197a2819d8848cc01", + "name": "pyasn1", + "version": "0.6.4" + }, + { + "direct_url": null, + "metadata_sha256": "82ce4c01c6d36841b9801fcdabab9bfe61d0b5e4e440c275941d8a2d4a790730", + "name": "pyasn1_modules", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "45cb345e4c12f63bc843b8c88902cc44c4d624a55aaef8cd5ffbc0ad16356fbe", + "name": "pybase64", + "version": "1.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "d311ae661edeac8ff029ab2960d065a7e792ebf8f79af682daa53109fe81318b", + "name": "pybind11", + "version": "3.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "cce9c0d440d065d4cdfb0d00004b8ddd65cf363a740efc5b0920b29201a59cd9", + "name": "pycountry", + "version": "26.2.16" + }, + { + "direct_url": null, + "metadata_sha256": "a1e33542883c249bf6c263b0023b9ea8a6131a77d9cb2cbc88316968e5eada83", + "name": "pycparser", + "version": "3.0" + }, + { + "direct_url": null, + "metadata_sha256": "faffcc4d7d359cb1047a9f67f7c65096b838c6db6c62852ef20fb27d55649a95", + "name": "pycryptodomex", + "version": "3.23.0" + }, + { + "direct_url": null, + "metadata_sha256": "98929f4cb80451dc3c6c8cd541a3081dccf0dee94afe7d9fa5c214a18ff236ce", + "name": "pydantic", + "version": "2.13.5" + }, + { + "direct_url": null, + "metadata_sha256": "8eccadbe707db97c397fb79073fe791b7998ef3a85f04f817f8991f7697b190b", + "name": "pydantic-extra-types", + "version": "2.11.1" + }, + { + "direct_url": null, + "metadata_sha256": "8f00c91deb34399316a5386eb2e76fe09f14a08dc3045f2e7dce9bf8573796bd", + "name": "pydantic-settings", + "version": "2.15.0" + }, + { + "direct_url": null, + "metadata_sha256": "66c729edddc20bf2764bb18bd87d907b08690e50355f39b97acc737b26d1d164", + "name": "pydantic_core", + "version": "2.46.5" + }, + { + "direct_url": null, + "metadata_sha256": "394500d78a0c1a433ae8ca3693152c08f6a901121d4b069cf1540a19759e2950", + "name": "pylatexenc", + "version": "2.11" + }, + { + "direct_url": null, + "metadata_sha256": "df2e9e9847a2aea0ae6e20fd325aeb16cf3ce7f8913462db6c2398363cd0c0bf", + "name": "pymdown-extensions", + "version": "12.1" + }, + { + "direct_url": null, + "metadata_sha256": "82fcfe724db9f0b51348da89f4f5cdc0b08d08882b1bbc0ca4913d3a0a93bcb9", + "name": "pynvvideocodec", + "version": "2.0.4" + }, + { + "direct_url": null, + "metadata_sha256": "3722422cc1478b175879143dfb78f98b7a5f53f4f684d71b7054fe2e8acd3b89", + "name": "pyqwest", + "version": "0.10.0" + }, + { + "direct_url": null, + "metadata_sha256": "7d1d1c276b7c372d55d17ac7d30f0a4b80a746e147347b8510d1355eea7f80c8", + "name": "pytest", + "version": "9.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "89e7c1c932e52b74bdcaf504389d2d1a2d7ca559b02bf5a09fc80ebd58ad10f7", + "name": "python-dateutil", + "version": "2.9.0.post0" + }, + { + "direct_url": null, + "metadata_sha256": "54f30f811841b6d772f31715712c85bfe0041839cb071f78daf41c700a98642b", + "name": "python-discovery", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "54f30f811841b6d772f31715712c85bfe0041839cb071f78daf41c700a98642b", + "name": "python-discovery", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "0cc19efd76cfbf3bcb2cb0d3ab82191036855859455aa3812c5e9e591e3f34e8", + "name": "python-dotenv", + "version": "1.2.3" + }, + { + "direct_url": null, + "metadata_sha256": "1d866c6124631b9ce1797ad412fff298ab53fc2d95210281d7c8f20e920753fa", + "name": "python-json-logger", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "2d18a1e7286d92a656ead5ec6f83d5ae6dc858634624f6b264703ae88d24d718", + "name": "python-multipart", + "version": "0.0.32" + }, + { + "direct_url": null, + "metadata_sha256": "beaa0efe9ba4b34843f5a0fc7379a73f10e95adb8cc0c31f359ab6f3a42b4def", + "name": "pyyaml_env_tag", + "version": "1.1" + }, + { + "direct_url": null, + "metadata_sha256": "238dc769e22d4f5626750cdff36e920e4a8d69c10d88de6d79b40a59cc13d873", + "name": "pyzmq", + "version": "27.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "de0a5e855bb5bb78b7acdcd2ca60619c6a0c109814881589caf158ec07155662", + "name": "quack-kernels", + "version": "0.6.5" + }, + { + "direct_url": null, + "metadata_sha256": "961ffef199b876fb4d7b10903d78e79f359d703b1638834c61d70b9879932918", + "name": "qwen-vl-utils", + "version": "0.0.14" + }, + { + "direct_url": null, + "metadata_sha256": "faf6ab9027d12de992827a2d8a224996fe6747a8c5f7d31ae495983dc73eefe9", + "name": "ray", + "version": "2.54.0" + }, + { + "direct_url": null, + "metadata_sha256": "c50d8b3ff4d113925b60dc47d1d28e87248a3338024241b0a3a66c8794fbce0c", + "name": "referencing", + "version": "0.37.0" + }, + { + "direct_url": null, + "metadata_sha256": "02acdc52d6f21d5f4b172254daaa94edfaa44c9ebe14d1c00cc4c8fe99b0e1df", + "name": "regex", + "version": "2026.9.29" + }, + { + "direct_url": null, + "metadata_sha256": "ac08207697217d1ffde8a161b424d77d6e2af6b62630fa26d75d08f11076cdca", + "name": "requests", + "version": "2.34.2" + }, + { + "direct_url": null, + "metadata_sha256": "f1abd635c3dff607a4fd654c62a88d9d4c21843cfc9176116c156f4269ca21b5", + "name": "rich", + "version": "15.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "932ff7743a756d0efcc45528d64c275ac3cb40a8dd1787ea10cb303907f0ae4f", + "name": "rich-toolkit", + "version": "0.20.5" + }, + { + "direct_url": null, + "metadata_sha256": "294a1405c0fa34b5f735bcb46459050436849a1e584c643544de99c07c529fb7", + "name": "rignore", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "5e54dd00b4ad336c5161d47de2a5c2212090c44629c28b6538b156256e49282d", + "name": "rpds-py", + "version": "2026.6.3" + }, + { + "direct_url": null, + "metadata_sha256": "0d5895abd80bfc0027c02943abaea4547061b9004bd134950d640d619a697835", + "name": "safetensors", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "91d5de3f641f33a8fbb4b6e91772da68d50b68686971d7b66af2068f2e77b694", + "name": "scipy", + "version": "1.17.1" + }, + { + "direct_url": null, + "metadata_sha256": "297fb30f701a800489c12893a951da3e5bd1f80061a1f43f0d3e9f1d4c6bc6fd", + "name": "sentencepiece", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "4245e0388ddf2048a38ae2a24a3d2c583408b2454aadc680d3c3beede639db3f", + "name": "sentry-sdk", + "version": "2.71.0" + }, + { + "direct_url": null, + "metadata_sha256": "ae8a9e6feec1a76e954d65ea48ac57842c9a7bfb5ac6e5ea82400a5ba9f71a98", + "name": "setproctitle", + "version": "1.3.7" + }, + { + "direct_url": null, + "metadata_sha256": "341d00772017437d0f6e3c943ae353f243c39fedfba403aea47cced927a76516", + "name": "setuptools", + "version": "79.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "ff4bcfb192bd542ed8f1794fb32ffc9eabd932d6e03cb00a4ad5e35a2469af88", + "name": "setuptools", + "version": "80.10.2" + }, + { + "direct_url": null, + "metadata_sha256": "f1e5a532fb8cda0bbc370e3db6cb9cea72a065d12ddd6a14976ba3cf66264221", + "name": "shellingham", + "version": "1.5.4" + }, + { + "direct_url": null, + "metadata_sha256": "2aba2cfd9c2ad7625a5d374d141af317d8f92d3534997bf98d127e52848dfc81", + "name": "six", + "version": "1.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "69ae2dfe547624be97fae348e1cfa3793f8854eed32cc1603badedc7d48fb36e", + "name": "smart_open", + "version": "8.0.2" + }, + { + "direct_url": null, + "metadata_sha256": "d415e6c6de7dee117d254a342668c489931bc88eac7ec8678b452078e366da6e", + "name": "smmap", + "version": "5.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "093bc4f0740a6fc28692e616aa8fe68d7e1d76426cc5a5faf9ea722a8ee7aaae", + "name": "sniffio", + "version": "1.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "b3cef071eb1dbeaa76a1273fe2ca2cc8ef36e835165253952d93780962529ac1", + "name": "sse-starlette", + "version": "3.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "3c01ca830e213f0311fe37bc3b46b8ab230a5e7acb894bf0fc8785cb7ccfed48", + "name": "starlette", + "version": "1.7.0" + }, + { + "direct_url": null, + "metadata_sha256": "6017ca508a293cf47a88a78cb330e9cbd131d74ec3c7fbf89bd4300ed3129d30", + "name": "supervisor", + "version": "4.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "fd5eb4925b04f9bffbc6c4f92bf8aea7243b918b43cd359493fce48a7dd3b336", + "name": "sympy", + "version": "1.14.0" + }, + { + "direct_url": null, + "metadata_sha256": "f09f0e24282c5a86346bcd5b10ae5ff81869fa8ef69c3ba524bd0a817a87dda9", + "name": "tabulate", + "version": "0.10.0" + }, + { + "direct_url": null, + "metadata_sha256": "519fa19c146fd58a0a75ecf1461e4bd98f9c06d01800c37d4a80f5fef095f4e1", + "name": "tensorboard", + "version": "2.21.0" + }, + { + "direct_url": null, + "metadata_sha256": "1af7ad76e4073b01ab147eb3c1d8e38b95d38062c6c9bc63890150738642e8eb", + "name": "tensorboard-data-server", + "version": "0.7.2" + }, + { + "direct_url": null, + "metadata_sha256": "9e597f62fc07e3b931d5c8fb0e90706fb6d45465cfb5d01dbd27ba7fc135c02c", + "name": "tensorstore", + "version": "0.1.80" + }, + { + "direct_url": null, + "metadata_sha256": "0da993d16ef6326f471796fcb065622f309c5c1aae6c6295b488ea64bb5c880c", + "name": "textual", + "version": "8.2.8" + }, + { + "direct_url": null, + "metadata_sha256": "52ca6148d4fd1497254855fa610cfdde99191cd42bce7a452fd3a68855504ac0", + "name": "tiktoken", + "version": "0.14.0" + }, + { + "direct_url": null, + "metadata_sha256": "0df9eb495cfb477dcbdfbdcd8c04d952d3eb00d77831630760571e13545398e5", + "name": "tilelang", + "version": "0.1.12" + }, + { + "direct_url": null, + "metadata_sha256": "802b576e011dc61bd2681593e8d802714b6c4ce636a9cf87035026db32ce6262", + "name": "tokenizers", + "version": "0.23.2" + }, + { + "direct_url": null, + "metadata_sha256": "4e1631b2164a49ff9a848d86ce504fdcc15e3540dbb262df8f33a2681a8de513", + "name": "tokenspeed-mla", + "version": "0.1.8" + }, + { + "direct_url": null, + "metadata_sha256": "05086095a775c5dca70998dcf442a848c13f9c68b54a54c510c3542c5abb6563", + "name": "tokenspeed-triton", + "version": "3.8.10.post20260920" + }, + { + "direct_url": null, + "metadata_sha256": "71daba472d0c5ffc25c0231dc29688ab0cb13d5bc7e7d93f6c4cce4169c50048", + "name": "torch", + "version": "2.13.0" + }, + { + "direct_url": null, + "metadata_sha256": "cccd2f1c0e5866e63732f58798c8d642ee6d10cd560d6f691e7981b908c246c9", + "name": "torch_c_dlpack_ext", + "version": "0.1.5" + }, + { + "direct_url": "{\"dir_info\": {}, \"url\": \"file:///torch_memory_saver\"}", + "metadata_sha256": "6276cef17dedbb5ee0d6157bbf63b832e916026281328d995ad3d488c2539618", + "name": "torch_memory_saver", + "version": "0.0.9.post1+slime" + }, + { + "direct_url": null, + "metadata_sha256": "29809ca2c86dda5079654f1f70564a64435e9d08f1964a2412b6f514e1b5ff64", + "name": "torchaudio", + "version": "2.11.0" + }, + { + "direct_url": null, + "metadata_sha256": "7e9be0f3a290e3fd9370d8fe010c7ffd006d5d3d05ab8bdf7df8f92f0fca9c39", + "name": "torchcodec", + "version": "0.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "181fa5e6b399c378711eddcdacd756d3c51317916f8eb160ee36cae7fae9589f", + "name": "torchvision", + "version": "0.28.0" + }, + { + "direct_url": null, + "metadata_sha256": "43d1261aff90cf3d5b1b40cf1f94234d61409b14e59f3766f457c1eec7f7ac15", + "name": "tqdm", + "version": "4.70.1" + }, + { + "direct_url": "{\"archive_info\": {\"hash\": \"sha256=3e1d9f534781c8e608240da0b495b8246317a36382f7609017cbaa7fb1d53f7b\", \"hashes\": {\"sha256\": \"3e1d9f534781c8e608240da0b495b8246317a36382f7609017cbaa7fb1d53f7b\"}}, \"url\": \"file:///wheels/transformer_engine-2.16.1%2Bc9877beb-cp312-cp312-linux_x86_64.whl\"}", + "metadata_sha256": "d882f743161d9d9f35dee4e1a8cc9136fa495f7c660caace01ab8f5602d76aa7", + "name": "transformer_engine", + "version": "2.16.1+c9877beb" + }, + { + "direct_url": null, + "metadata_sha256": "465797a59706d83b45c93fde750b228c3b6e1addc44115de2c4c02ad66d9c5ea", + "name": "transformers", + "version": "5.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "a91982ca086667c592a951973434f7c5a9f27a8300bc97af78dfb496afe53e71", + "name": "triton", + "version": "3.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "d26fbb244532c4051e715f9047cd943e2cc4abb0ac6f2a517fa2986eb1ea726a", + "name": "truststore", + "version": "0.10.4" + }, + { + "direct_url": null, + "metadata_sha256": "c84af1a069084b1b440b3594068dec29200d52d4c1a9b652030448717f270158", + "name": "typer", + "version": "0.27.2" + }, + { + "direct_url": null, + "metadata_sha256": "0ad6653b7439f4bb6a596cb7b01ed1b716458467525c4dc40b75d62bdb943c98", + "name": "typing-inspection", + "version": "0.4.4" + }, + { + "direct_url": null, + "metadata_sha256": "d005280aa13b334ac942d20219102865e559f69ffd06c35c248b2f0d0da3b933", + "name": "typing_extensions", + "version": "4.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "fba2930e9030a18965d243f8d330748db2e67572a81b3b68710462fb5110332a", + "name": "urllib3", + "version": "2.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "bc5717bd6524a33838f285261868bcc8e311e8c29fdb19e41d56c38b04890e84", + "name": "uvicorn", + "version": "0.54.0" + }, + { + "direct_url": null, + "metadata_sha256": "741c006d8441f562aa853a5430df236fbb4af923445491f396bf09943bd30258", + "name": "uvloop", + "version": "0.22.1" + }, + { + "direct_url": "{\"dir_info\": {\"editable\": true}, \"url\": \"file:///vime\"}", + "metadata_sha256": "f85aa01dfdc868756a6583434bbff040f29eb511d47d5b25ada063a84353aac6", + "name": "vime", + "version": "0.3.2" + }, + { + "direct_url": null, + "metadata_sha256": "c25431aaf1950971fe96292f395a41a55b403127bfca0d0b8f7dc9cff5dab75d", + "name": "virtualenv", + "version": "21.14.1" + }, + { + "direct_url": null, + "metadata_sha256": "4e3ee0a31d85e56268640aae853bcee4794dfe8c0483c5c6370517e480c81ae0", + "name": "virtualenv", + "version": "21.14.5" + }, + { + "direct_url": null, + "metadata_sha256": "d4ed5c7551cddb8c1aeff2f9f27b3491f6ad2c9afda8e7bb9779c33fa12a536c", + "name": "vllm", + "version": "0.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "84b482e09bac949e992594757214a1920c667a5d898ee320e309250697f6d26e", + "name": "vllm-router", + "version": "0.1.15" + }, + { + "direct_url": null, + "metadata_sha256": "9b16c871eb1060a5218e9b9a9ad33288d94844cfaf43f08dbb6c32423bde8fe3", + "name": "wandb", + "version": "0.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "8e4f2be437dfe4eb3c6c959e517ac20b75d06525563f1ebcbf06f9ec648bd7c1", + "name": "watchdog", + "version": "6.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "15218afb42938907c2ca74c54e3d8e3a5406493c4761e29e38e82bfec0f84296", + "name": "watchfiles", + "version": "1.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "8863af96e88b7db9990da99aa6c46816eacc3d2f9ae1297b53381b033cd70119", + "name": "wcmatch", + "version": "11.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "f46e6bd6cfafb2b684c29587b017b7096fd9155b74eda25a22eca784b9803ab7", + "name": "websockets", + "version": "16.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "ce82db5ccfefa4bfbe4e25a36e1f91e8e7d51fcaeb31586c4d48e1c69f99168b", + "name": "websockets", + "version": "17.1" + }, + { + "direct_url": null, + "metadata_sha256": "0f142a2c09eac643c7d0bfe77f3f121184c0b17914afbd32af669ed19b2b02ef", + "name": "wheel", + "version": "0.47.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd58938e51a3c5cb363f6f22eaa2a8a7accc1ce373388de167a82f77d3e5783f", + "name": "wrapt", + "version": "2.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "b0b72c1941f04499ca7e1a3a6e479aee8df902c3d49979624b59dba8c3228d37", + "name": "xgrammar", + "version": "0.2.8" + }, + { + "direct_url": null, + "metadata_sha256": "ef8861f39e5c36255966a36032651f937d890d55f31f1c26304b488f1ba34332", + "name": "xxhash", + "version": "4.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "740c08057b6eb69c58402c87d652af0a471e46325d811f2c605632a18817152f", + "name": "yarl", + "version": "1.25.1" + }, + { + "direct_url": null, + "metadata_sha256": "7b060e4d24394b5431875e2f74fec8e6bffa79d2e6b4cb8c7e2a5187dd2d8d69", + "name": "z3-solver", + "version": "4.15.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "3d76d4fbc95f0851191147db12300938c67a6f8fb1df884886d9601272ccc4e8", + "name": "zipp", + "version": "4.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "d3de2651e4e908dbb7c9d80508e5179590217dfac4993dc8b04381c5b9718c4c", + "name": "zstandard", + "version": "0.25.0" + } + ], + "executable": "", + "installed_provider_sources": { + "vllm/compilation/__init__.py": { + "path": "/vllm/compilation/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/backends.py": { + "path": "/vllm/compilation/backends.py", + "sha256": "fa4bff8920b363efbbde9456f135fa9d2c004a5bde1898877f177418b2d8b008" + }, + "vllm/compilation/base_static_graph.py": { + "path": "/vllm/compilation/base_static_graph.py", + "sha256": "5cfe8e06db84aa42cd41cdd93ebe93af00b3a242c8011042057530e2922b523a" + }, + "vllm/compilation/breakable_cudagraph.py": { + "path": "/vllm/compilation/breakable_cudagraph.py", + "sha256": "3cc427612a08e2b9b3fee47548026400c1d0776e2d4747535e59ef5512bdf1e8" + }, + "vllm/compilation/caching.py": { + "path": "/vllm/compilation/caching.py", + "sha256": "71d212452dde742fbf28b8a01ed29d3c08a7457ff7f8da2a20ce9d17e902c2cf" + }, + "vllm/compilation/codegen.py": { + "path": "/vllm/compilation/codegen.py", + "sha256": "e04833bec88cf9d1a13aa7341e30e3233d1138bfe23424e0fd34d664b3fedb9f" + }, + "vllm/compilation/compiler_interface.py": { + "path": "/vllm/compilation/compiler_interface.py", + "sha256": "8d84e2864bf83f754bae9e9f77119e0287cca9f97f5fa5ec2535e07b5ad88944" + }, + "vllm/compilation/counter.py": { + "path": "/vllm/compilation/counter.py", + "sha256": "d8158c54dd36a357bf24f6f84dc22f572d3a27f4875f3d5779b12bc5d454ff76" + }, + "vllm/compilation/cuda_graph.py": { + "path": "/vllm/compilation/cuda_graph.py", + "sha256": "05c86392d7fae967ac73076dba7e01990a0e3ae619e4866450a0c1be56bd1192" + }, + "vllm/compilation/decorators.py": { + "path": "/vllm/compilation/decorators.py", + "sha256": "cab6962e8a1fead59c75f5ed8cb4732f9e5441ff972030c2f4b1c4ba0c58de3c" + }, + "vllm/compilation/monitor.py": { + "path": "/vllm/compilation/monitor.py", + "sha256": "43b24c5cb1bc4d32dc979f3222596905c7b3acc58415328a234402e6edc76abf" + }, + "vllm/compilation/partition_rules.py": { + "path": "/vllm/compilation/partition_rules.py", + "sha256": "857d2fb06dc871ea1d3717cd01fbd4e5205984100d98b7b72a2933d6ff1cfa4d" + }, + "vllm/compilation/passes/__init__.py": { + "path": "/vllm/compilation/passes/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/fusion/__init__.py": { + "path": "/vllm/compilation/passes/fusion/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/fusion/act_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/act_quant_fusion.py", + "sha256": "1fa9c3ca4fb424685b7053c3dda89dda16c98dc5645d85f0f28dca58429792b3" + }, + "vllm/compilation/passes/fusion/add_rms_fusion.py": { + "path": "/vllm/compilation/passes/fusion/add_rms_fusion.py", + "sha256": "e46998552628aa5cd5962fc39ea39ae824fd97e6aeba1d176e9cc7cade39837b" + }, + "vllm/compilation/passes/fusion/allreduce_rms_fusion.py": { + "path": "/vllm/compilation/passes/fusion/allreduce_rms_fusion.py", + "sha256": "0af193505880cec0f6ffa224c688bce3c9ddc318dccdf04a696b4e4b4506a963" + }, + "vllm/compilation/passes/fusion/attn_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/attn_quant_fusion.py", + "sha256": "ecc64e82be4481954c9cac6c23d7794846ab19486b570f2dda07ab5ad67c5a49" + }, + "vllm/compilation/passes/fusion/collective_fusion.py": { + "path": "/vllm/compilation/passes/fusion/collective_fusion.py", + "sha256": "1e2c8539d6960b45907fb3bf0482441ea7250e97c56ffdea1500514efa0b164d" + }, + "vllm/compilation/passes/fusion/matcher_utils.py": { + "path": "/vllm/compilation/passes/fusion/matcher_utils.py", + "sha256": "50ac5714ce1bb113520de769ea6234316acc470a8cdf2537a996ce9a9d54337d" + }, + "vllm/compilation/passes/fusion/mla_attn_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/mla_attn_quant_fusion.py", + "sha256": "a966fe7f58bf9228379f793f5fd851735a97f9639722766b2a20cb79a9e4baec" + }, + "vllm/compilation/passes/fusion/mla_rope_kvcache_cat_fusion.py": { + "path": "/vllm/compilation/passes/fusion/mla_rope_kvcache_cat_fusion.py", + "sha256": "1602cc28055ffa8d1123ddb1d256bf0bd12006fd06ea7e16a986c55746dbe0dc" + }, + "vllm/compilation/passes/fusion/qk_norm_rope_fusion.py": { + "path": "/vllm/compilation/passes/fusion/qk_norm_rope_fusion.py", + "sha256": "aebc7d1a5189b65ac665afcc169e7baebd53efe719c48e35e7c5babe85af0d39" + }, + "vllm/compilation/passes/fusion/qk_norm_rope_kvcache_fusion.py": { + "path": "/vllm/compilation/passes/fusion/qk_norm_rope_kvcache_fusion.py", + "sha256": "f0cfd0d83ec4acb09f9bf91d199b114e9d4995e3059c13eb23a6978ce7c07eb2" + }, + "vllm/compilation/passes/fusion/rms_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rms_quant_fusion.py", + "sha256": "4852aa44e0e2087043fdac271bda9b8d9bfe3201bb84ce3919b8ed454d8083c4" + }, + "vllm/compilation/passes/fusion/rocm_aiter_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rocm_aiter_fusion.py", + "sha256": "372e76c68c75209a085deec6dd22b3816be633613ca82f6f2925c1b3773d61a0" + }, + "vllm/compilation/passes/fusion/rope_kvcache_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rope_kvcache_fusion.py", + "sha256": "3a756e9049593537143b5a56ab9185a6bc83f57ed81d84226d7791a46a984b53" + }, + "vllm/compilation/passes/fusion/sequence_parallelism.py": { + "path": "/vllm/compilation/passes/fusion/sequence_parallelism.py", + "sha256": "3af7e420dcb35fff0bae0f8f599d0f1bda34445ebe194059892a434b2976d654" + }, + "vllm/compilation/passes/fx_utils.py": { + "path": "/vllm/compilation/passes/fx_utils.py", + "sha256": "730708213acf9d1b5f3176b433dfc197a5f3c81b5ce443f0923c526924833003" + }, + "vllm/compilation/passes/inductor_pass.py": { + "path": "/vllm/compilation/passes/inductor_pass.py", + "sha256": "1f380aacf7adabb8bf8b7d41c0a93473947f0716f7445bd910fd448f6c08e672" + }, + "vllm/compilation/passes/ir/__init__.py": { + "path": "/vllm/compilation/passes/ir/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/ir/clone_elimination.py": { + "path": "/vllm/compilation/passes/ir/clone_elimination.py", + "sha256": "5297078f5cddce081faba5215814275381d2083b32318fcfeb2bf9d69fedb7c7" + }, + "vllm/compilation/passes/ir/inplace_functionalization.py": { + "path": "/vllm/compilation/passes/ir/inplace_functionalization.py", + "sha256": "2dc4f22c6f05224828c2941479185b1452d4490f488b7f0bfd124334e7809fed" + }, + "vllm/compilation/passes/ir/lowering_pass.py": { + "path": "/vllm/compilation/passes/ir/lowering_pass.py", + "sha256": "d9c3d90f63138420f0e5489447b5996573fcfbbab939da2efccd00848492b172" + }, + "vllm/compilation/passes/ir/utils.py": { + "path": "/vllm/compilation/passes/ir/utils.py", + "sha256": "f59d33a6c7d0616cbeec1e9fb1d6c948881bf81fe124caeb906eac2e2197ea21" + }, + "vllm/compilation/passes/pass_manager.py": { + "path": "/vllm/compilation/passes/pass_manager.py", + "sha256": "486979a058aa2e20ebedcbb6e039f7a59f38d2efd2cda11219fae4067be0968d" + }, + "vllm/compilation/passes/utility/__init__.py": { + "path": "/vllm/compilation/passes/utility/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/utility/fix_functionalization.py": { + "path": "/vllm/compilation/passes/utility/fix_functionalization.py", + "sha256": "ad5b504a05ccee023869b0c8df70ec2fff9a4a80d25fd903e2b532f470e7203f" + }, + "vllm/compilation/passes/utility/noop_elimination.py": { + "path": "/vllm/compilation/passes/utility/noop_elimination.py", + "sha256": "8abf85d28c13f95059f2acbc0275b9b9ed2ad4990f7c5763bbe3067a4aa629ce" + }, + "vllm/compilation/passes/utility/post_cleanup.py": { + "path": "/vllm/compilation/passes/utility/post_cleanup.py", + "sha256": "1c38b14fc209165cbcf8ca763a17ac4e528b97f59b573e5d52df2cce7d758de3" + }, + "vllm/compilation/passes/utility/scatter_split_replace.py": { + "path": "/vllm/compilation/passes/utility/scatter_split_replace.py", + "sha256": "138402cc3097768a32e9e5b8d1a054b6176e494bddc8684e23ca2dc5fdc3fdda" + }, + "vllm/compilation/passes/utility/split_coalescing.py": { + "path": "/vllm/compilation/passes/utility/split_coalescing.py", + "sha256": "0b02acd9e1ad43d7b3e128b914e969b9580773f2818078846dfbf163a8bd0871" + }, + "vllm/compilation/passes/vllm_inductor_pass.py": { + "path": "/vllm/compilation/passes/vllm_inductor_pass.py", + "sha256": "4f83ffb67f834a214221d810c7843a8e41eb4e5930eb40adbd8cf054ff6fb9c6" + }, + "vllm/compilation/piecewise_backend.py": { + "path": "/vllm/compilation/piecewise_backend.py", + "sha256": "6525318ff3ca2e4978e24dd9232a7ae0a02e920e19604b83db6f6043d1f8a54d" + }, + "vllm/compilation/wrapper.py": { + "path": "/vllm/compilation/wrapper.py", + "sha256": "c1b1fca679ea16aa07a696831a810c0d531da2bb0ea32dd6f1a95cdaef36de07" + }, + "vllm/config/__init__.py": { + "path": "/vllm/config/__init__.py", + "sha256": "56fb0cb1598d297e4f95a97e5d86dc624145d1532f5faa432b7d2834d7155bd5" + }, + "vllm/config/attention.py": { + "path": "/vllm/config/attention.py", + "sha256": "c41f345b512d9b7df882328257eb3a6381f41088c11ae83b5ecd8a9e8265d1bc" + }, + "vllm/config/cache.py": { + "path": "/vllm/config/cache.py", + "sha256": "f1c226ba679c884930dbfcaf41a57248b137a9a20d3ed8e3d3b31752bb484c07" + }, + "vllm/config/compilation.py": { + "path": "/vllm/config/compilation.py", + "sha256": "c9cec5c7200e8e559810ec8c30113ad61dab6780f9f7fb3c116bd0d9b5a43065" + }, + "vllm/config/device.py": { + "path": "/vllm/config/device.py", + "sha256": "7b82eee02ceb5842337451a27a3d5729920c47e25e8f6bf3997f5146f9330a9c" + }, + "vllm/config/diffusion.py": { + "path": "/vllm/config/diffusion.py", + "sha256": "1fa9fd2478a866098a28a3586b55af2f9738656b7813a55d76539c10dd99fe8d" + }, + "vllm/config/ec_manager_config.py": { + "path": "/vllm/config/ec_manager_config.py", + "sha256": "418b387dbe7bdf67deddce331c205768a2d42aea37141f59fb02a8a1528e3552" + }, + "vllm/config/ec_transfer.py": { + "path": "/vllm/config/ec_transfer.py", + "sha256": "0eabb2c25194676d23c6acf59562672a1dd24415043ac5737d621ce0d681ec70" + }, + "vllm/config/engram.py": { + "path": "/vllm/config/engram.py", + "sha256": "34043a22385a041d4e9be8857f64174c990c2ca8308b97b6a952b5ab96c20ee5" + }, + "vllm/config/fault_tolerance.py": { + "path": "/vllm/config/fault_tolerance.py", + "sha256": "b166b24373d599fb15ddc575e3061cf0dcb42174d0369d8468008e7ffbb2a4e2" + }, + "vllm/config/kernel.py": { + "path": "/vllm/config/kernel.py", + "sha256": "27e23c584cf862f4091858db6dc85bbc2a01f4baf9dca3f232ae6f3bac02390e" + }, + "vllm/config/kv_events.py": { + "path": "/vllm/config/kv_events.py", + "sha256": "b1dbaee3e6830e381e9157fe3bab0d65c357da88ff7cdf8b1e4b3a4e75c82a87" + }, + "vllm/config/kv_transfer.py": { + "path": "/vllm/config/kv_transfer.py", + "sha256": "506fae7a9d7f32cb3646156cf9249a856f6317dff6c4c85db70efd34418c429b" + }, + "vllm/config/load.py": { + "path": "/vllm/config/load.py", + "sha256": "bd6431c22e078362d749a56a2c84145432ebf2605d8bcfa2ac679182d18ed630" + }, + "vllm/config/lora.py": { + "path": "/vllm/config/lora.py", + "sha256": "ed6cf6575f5950f079a62f904caeae93d1a4745dd8c21788b74367883bcd4b08" + }, + "vllm/config/mamba.py": { + "path": "/vllm/config/mamba.py", + "sha256": "2090f791201ca45dd4f1d72b8651268890eb07574b6084721194eb8fdf612c48" + }, + "vllm/config/model.py": { + "path": "/vllm/config/model.py", + "sha256": "f4168b67cc93ce72ff2a6d4c66974223e32fd0f1fab4c05e44bd68a275e18d69" + }, + "vllm/config/model_arch.py": { + "path": "/vllm/config/model_arch.py", + "sha256": "2babe28329d7b60b4e205f6d72c687f0f66e6535aa2f20411469e5ec362f6b5f" + }, + "vllm/config/multimodal.py": { + "path": "/vllm/config/multimodal.py", + "sha256": "271911aee151f17f092228cecee82af0713e9a47340ffdf66834ca7638a50d22" + }, + "vllm/config/observability.py": { + "path": "/vllm/config/observability.py", + "sha256": "d57c59ec776477ab0a20e9f2b945bc954d8ea3737c869259480e9aa10dfb9f6d" + }, + "vllm/config/offload.py": { + "path": "/vllm/config/offload.py", + "sha256": "6f2db3d9a2730588473d5155811690c6241b167a21dcb62fbbd9ebb6386de42c" + }, + "vllm/config/parallel.py": { + "path": "/vllm/config/parallel.py", + "sha256": "f012ace89e3fb730a467f729f602679bc145c49f0d10721811c9d818570e7b2b" + }, + "vllm/config/pooler.py": { + "path": "/vllm/config/pooler.py", + "sha256": "9f01913dcb7bccbf9b672b16643f18471ae202455992e8afaf0725a17f2b3d08" + }, + "vllm/config/profiler.py": { + "path": "/vllm/config/profiler.py", + "sha256": "04d24fa1dc7cfedca6b5c7d9115f7f7021722fc46a5b15234a1e3b3a506c93e5" + }, + "vllm/config/quantization.py": { + "path": "/vllm/config/quantization.py", + "sha256": "acffc52f525b39a88efd656f1ed705ce3a1b758298bb0684fac7694776bc10b4" + }, + "vllm/config/reasoning.py": { + "path": "/vllm/config/reasoning.py", + "sha256": "2c4f7bdee48a9fb3d93787c4c32361c2411417cce452cfde86808d8759977861" + }, + "vllm/config/scheduler.py": { + "path": "/vllm/config/scheduler.py", + "sha256": "822179da62be4bca0619c8590082ae09123f5c4415f9cc2037be673748239edb" + }, + "vllm/config/speculative.py": { + "path": "/vllm/config/speculative.py", + "sha256": "9c642a87264339c0dbc1d0b57330572149df0f9d5e16c6893b9895e50a619e19" + }, + "vllm/config/speech_to_text.py": { + "path": "/vllm/config/speech_to_text.py", + "sha256": "bf4a566fbde6a1cec1e209070b739650c3302c12696739c88049cb8f723a4c3f" + }, + "vllm/config/structured_outputs.py": { + "path": "/vllm/config/structured_outputs.py", + "sha256": "55649776594349b8b4aa3e08fc4c88068366732a486d6fb235079188044aa829" + }, + "vllm/config/utils.py": { + "path": "/vllm/config/utils.py", + "sha256": "d035e9e488ba92b6c47a96cf05d9b2a850d53eda8a05115b22ff9af8dbc2fc64" + }, + "vllm/config/vllm.py": { + "path": "/vllm/config/vllm.py", + "sha256": "956b812e5a719bcbfa3a3958801361b38b9c928c96b8c073311bbb96376dfb7a" + }, + "vllm/config/watermarking.py": { + "path": "/vllm/config/watermarking.py", + "sha256": "30e6620a3cd7529f0736ad55e38bc326a6a78dee4552f0722208400041c94a1f" + }, + "vllm/config/weight_transfer.py": { + "path": "/vllm/config/weight_transfer.py", + "sha256": "92edd9e5ea90c97a8f3c5f20abf1734a105ee1f3f89e306e7ba87e758f1f767e" + }, + "vllm/distributed/__init__.py": { + "path": "/vllm/distributed/__init__.py", + "sha256": "97f28c30b32662af8cab163939e4ee423037f11630752e13b55cbc25a7d0ab71" + }, + "vllm/distributed/communication_op.py": { + "path": "/vllm/distributed/communication_op.py", + "sha256": "3c3f8ac60db38ece891d39dc1e2f6f1947ad438685893d2e5777d072320bd1b8" + }, + "vllm/distributed/device_communicators/__init__.py": { + "path": "/vllm/distributed/device_communicators/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/device_communicators/aiter_custom_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/aiter_custom_all_reduce.py", + "sha256": "f8eb027ce7a85d94af6260960ceb7f36fc6f1406c9af9c9b6285fddb3f178009" + }, + "vllm/distributed/device_communicators/all2all.py": { + "path": "/vllm/distributed/device_communicators/all2all.py", + "sha256": "1f1b69236acd3cd7bd94520fd6d591bfd31b57c4bc7c9f9f4161ea8bbd0c5f26" + }, + "vllm/distributed/device_communicators/all_reduce_utils.py": { + "path": "/vllm/distributed/device_communicators/all_reduce_utils.py", + "sha256": "ed0ab4dd05b2519a6313892e68824c97b540034664d7f8c3d031b322e33e1bfc" + }, + "vllm/distributed/device_communicators/base_device_communicator.py": { + "path": "/vllm/distributed/device_communicators/base_device_communicator.py", + "sha256": "4a7670f12ed7c7621b25d476e2687c24ca01f3be183fff4a6a25337596fe506b" + }, + "vllm/distributed/device_communicators/cpu_communicator.py": { + "path": "/vllm/distributed/device_communicators/cpu_communicator.py", + "sha256": "e1856c8e91cfbbb4d9ce990c1236e258ba4021e226afcbab645653380b38d64b" + }, + "vllm/distributed/device_communicators/cuda_communicator.py": { + "path": "/vllm/distributed/device_communicators/cuda_communicator.py", + "sha256": "102d95c67ec798cf352b817ba92e8abc9da37f30d1bbdf3aab45d3927b627b93" + }, + "vllm/distributed/device_communicators/cuda_wrapper.py": { + "path": "/vllm/distributed/device_communicators/cuda_wrapper.py", + "sha256": "333b6d9ed173e7a18c7f2b6627a3c9c9ed88892ce52015f05e29d6d245e48ee3" + }, + "vllm/distributed/device_communicators/custom_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/custom_all_reduce.py", + "sha256": "a048c1327c23580805600c0c951831bec333b1ffc4eb26a0e3d34119c4f0c445" + }, + "vllm/distributed/device_communicators/flashinfer_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/flashinfer_all_reduce.py", + "sha256": "b4359760e9b55963676109a5c3a015fb82e190d4df1d021de9ee01e7814cbdda" + }, + "vllm/distributed/device_communicators/flashinfer_pcie_ipc_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/flashinfer_pcie_ipc_all_reduce.py", + "sha256": "8b67b0fc356a565095f56b475cc89c513e3a5eff051ab1c52e5beb0c1a79e9f2" + }, + "vllm/distributed/device_communicators/mnnvl_compat.py": { + "path": "/vllm/distributed/device_communicators/mnnvl_compat.py", + "sha256": "72ee1e6f9571b4c8ecbd9f60cd469d1b565cb79cab519a688a93f290906a2615" + }, + "vllm/distributed/device_communicators/pynccl.py": { + "path": "/vllm/distributed/device_communicators/pynccl.py", + "sha256": "882fb83c5a3c565a3f8fd664b79f5ceae566dca180019ecafd74bc8c11d9f8cf" + }, + "vllm/distributed/device_communicators/pynccl_allocator.py": { + "path": "/vllm/distributed/device_communicators/pynccl_allocator.py", + "sha256": "390e2576cbf4ae06341ca4dab24fc7e4d4f7c24dd444329ed05d828a9ce91460" + }, + "vllm/distributed/device_communicators/pynccl_wrapper.py": { + "path": "/vllm/distributed/device_communicators/pynccl_wrapper.py", + "sha256": "ce63c8da57bb88d4cf89956bd70bb63f0f44bfad468ddb37b765611551f6d99f" + }, + "vllm/distributed/device_communicators/quick_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/quick_all_reduce.py", + "sha256": "8aacb23e7c297b0ae2f80d99c5affd2e7517115d7874be51069d14a44db7b5f2" + }, + "vllm/distributed/device_communicators/ray_communicator.py": { + "path": "/vllm/distributed/device_communicators/ray_communicator.py", + "sha256": "332c37f65495b60564d61db59bc2d30ca0236adc33442d01464790bde9aec897" + }, + "vllm/distributed/device_communicators/shm_broadcast.py": { + "path": "/vllm/distributed/device_communicators/shm_broadcast.py", + "sha256": "f3e7a3f3ff713fccbd535e0d41650ee05bdf8677e83d4b90519910645022c30b" + }, + "vllm/distributed/device_communicators/shm_object_storage.py": { + "path": "/vllm/distributed/device_communicators/shm_object_storage.py", + "sha256": "e097bf7ac0141fe8db4131e8fd553ca2ad5b0600b22a56f3924af6b795e7207c" + }, + "vllm/distributed/device_communicators/symm_mem.py": { + "path": "/vllm/distributed/device_communicators/symm_mem.py", + "sha256": "b06e3ddb9ae880a30ec4a103ce32eb9794223bb0293832e89572af28adaaa544" + }, + "vllm/distributed/device_communicators/xpu_communicator.py": { + "path": "/vllm/distributed/device_communicators/xpu_communicator.py", + "sha256": "527cbfb250760abc62096ee7cd612307b821f21b72dee1687ad866620ec89b6d" + }, + "vllm/distributed/ec_transfer/__init__.py": { + "path": "/vllm/distributed/ec_transfer/__init__.py", + "sha256": "061405bb51df7409c9938b62e25caa8bd6ebf85da6d1700dbd4affe2a0825135" + }, + "vllm/distributed/ec_transfer/ec_connector/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/base.py", + "sha256": "22d4913375bb622473fbe1a77f9376b804949cd8a7e31e9518208f9561d161e2" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/common.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/common.py", + "sha256": "e2267abd8d00a6d2605e1a82ea5c73396a71b427452eab469fcca0134c334e7c" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/connector.py", + "sha256": "72cd35d9fd754a2992dd090a8af13c91e0789b4038ac29276750d823120235db" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/base.py", + "sha256": "19e8df88b0fa831997896355ecdd49e0d86cb074cd7ae28aed0b328b0bb3ab2e" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/zmq.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/zmq.py", + "sha256": "435641c0e37551ab4937855abd067be26905b91215e759cbd9d28a419a34ff9a" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/base.py", + "sha256": "3be698aeb67d32ee3741e76b2fb71806941c587578583acf8fbc42fbf22b46a5" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/nixl.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/nixl.py", + "sha256": "03af8f6549a6027b7262a482907af591e45f28b9b1c5a3408bbc6600e38797e5" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/ec_shared_region.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/ec_shared_region.py", + "sha256": "e40607952c9920024455eca2f419e8c3ef1de9a4d8b27c147a33bb941b8c08b1" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/protocol.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/protocol.py", + "sha256": "05878336884396bfbef77b96b0fa6359f6fa0aba912961f14a84f5a436f27038" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/__init__.py", + "sha256": "01c42385bf3a55cff09cc05ba956f6dd4b8b6b986bf4d6eca4e566cb045b48e0" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/embedding_cache.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/embedding_cache.py", + "sha256": "7359fb980af1fc30b3253681310ef636e2b4a19134e04a93270c9c45de2572d8" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/session.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/session.py", + "sha256": "5973548a919e13c866222b91d502686a6757a31e5a5664b879bf2887ed9fb212" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/utils.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/utils.py", + "sha256": "160ac665f20f2c75b343c1e784084f2b0b4d1cf8fdb28ee15deee4dc8ed0ce45" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/worker/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/worker/__init__.py", + "sha256": "f08d296d3560c42173ae8af961af4a768033ccf1e36e9c17c0cdd53013d0c52e" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/worker/descriptor_buffers.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/worker/descriptor_buffers.py", + "sha256": "be7c81be214e995da8499105ba485854d9c19d6f8e905f8f1b87b83694ca0864" + }, + "vllm/distributed/ec_transfer/ec_connector/example_connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/example_connector.py", + "sha256": "09022ce07a89114bb65d9befd2e60873453aed11bbac8c0a75c1e6084e785a5f" + }, + "vllm/distributed/ec_transfer/ec_connector/factory.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/factory.py", + "sha256": "d6cedca0a99c3dd2b03cd1c15d17472b983e3f7d8f5baf4a12eecaf6abedb817" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/__init__.py", + "sha256": "1cbfc2f95f8f4d48a9253056eb1fd4b562062884e3fd5cb6571583c352fc16f3" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/config.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/config.py", + "sha256": "98c60696f79d1de67d2364cd9e8a42a393b5c8e17ed9af2f971368e47891d7b3" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/control.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/control.py", + "sha256": "58e0d1a423fbe958bfa586ac26a17107e08d0b31d044b4c74ab4dde880e7ca9b" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/memory.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/memory.py", + "sha256": "d5e90b1348de670a70f110d58eedcbdbd053db72c21dd007c3f5275c53951149" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/metadata.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/metadata.py", + "sha256": "497a7e6dfffb7fce80a41d5989f96119b970c143df77bb9d0f9c91d7a46e8c42" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/producer.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/producer.py", + "sha256": "97fa4d0b19475574778eab02f55fad73db9642beb9156da890314fd53fa1a7ab" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/reservation.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/reservation.py", + "sha256": "4790bc65cde4db5f17733ca2c2910980ba594a8a9b79ee27c5b957dffd4c1113" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/scheduler.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/scheduler.py", + "sha256": "53004b62529a31fdd80dfb2e6026610b95041a77e91f731ae526fefd84e7968d" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/state.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/state.py", + "sha256": "92f375d6c5cc9c83dbe95a7977ad8eb0f1b5629ccee92968bcacdc94eee15d65" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/transfer.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/transfer.py", + "sha256": "ada2113a5402054f1149d3edc2537f4e5e1bd696c9b17291c9f2b4cbf6b59753" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/worker.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/worker.py", + "sha256": "89eb91bb64845b3b121d502972a6b04d448714253becd2ea662e5691cd5acdd7" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake_ec_connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake_ec_connector.py", + "sha256": "aaebab4711bc00dd0c622dfbfd8639fc41e7ed5d1658d7d68fe33e4d5fbef3ba" + }, + "vllm/distributed/ec_transfer/ec_connector/utils.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/utils.py", + "sha256": "11b9014b9c0697f8846deff1a55a22fa86a15dc2ac3e139442fb6d513ac03059" + }, + "vllm/distributed/ec_transfer/ec_transfer_state.py": { + "path": "/vllm/distributed/ec_transfer/ec_transfer_state.py", + "sha256": "9487a41f23fa1a4fa6dfca8b42b8e97a0ee19d8406ffd1dcf4bef66315180827" + }, + "vllm/distributed/elastic_ep/__init__.py": { + "path": "/vllm/distributed/elastic_ep/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/elastic_ep/elastic_execute.py": { + "path": "/vllm/distributed/elastic_ep/elastic_execute.py", + "sha256": "b8f60a4183c79ff6051095b5f95bb385bc7fea0cffe8cd9ebc9087ab0e9f01b5" + }, + "vllm/distributed/elastic_ep/elastic_state.py": { + "path": "/vllm/distributed/elastic_ep/elastic_state.py", + "sha256": "fbf049199841a086fdf2fc1ab8498ef017ad3bf319db65c3ae61acbb536d2e10" + }, + "vllm/distributed/elastic_ep/standby_state.py": { + "path": "/vllm/distributed/elastic_ep/standby_state.py", + "sha256": "15282597550ebd0e07b8492ff192aea1ec0dcec8f0ad34009123e1002cc140c1" + }, + "vllm/distributed/eplb/__init__.py": { + "path": "/vllm/distributed/eplb/__init__.py", + "sha256": "1b9c2ee22abb5888c354c5aa01f0944f253e5e24e135d019778398bbe495a628" + }, + "vllm/distributed/eplb/async_worker.py": { + "path": "/vllm/distributed/eplb/async_worker.py", + "sha256": "424328600ad1003286fc5dfffa1f9482007314c060947818b2f94a8b97811f5e" + }, + "vllm/distributed/eplb/eplb_communicator.py": { + "path": "/vllm/distributed/eplb/eplb_communicator.py", + "sha256": "ba30d9d40e7b81d3f42aa9041d2f328edca4073cfe2de920285eb68375501ed8" + }, + "vllm/distributed/eplb/eplb_state.py": { + "path": "/vllm/distributed/eplb/eplb_state.py", + "sha256": "2f06bc8c63f3fdf55edb5032ae55c0ffcac3e67720ce74ea312e3d141b12acf4" + }, + "vllm/distributed/eplb/eplb_utils.py": { + "path": "/vllm/distributed/eplb/eplb_utils.py", + "sha256": "058af6104faa6d4085c1dca80bbe60d92bf0a7ec9cd92c775a180546c9d8c9c3" + }, + "vllm/distributed/eplb/policy/__init__.py": { + "path": "/vllm/distributed/eplb/policy/__init__.py", + "sha256": "daeb266c88442832b1ab8c8c4cc064891b38b9e9ba00aea324f926c87dc6d37e" + }, + "vllm/distributed/eplb/policy/abstract.py": { + "path": "/vllm/distributed/eplb/policy/abstract.py", + "sha256": "b9fd34c28bbfdded03360d7f3f6f8fb978e82689190d7ae4501dfe520e958c62" + }, + "vllm/distributed/eplb/policy/default.py": { + "path": "/vllm/distributed/eplb/policy/default.py", + "sha256": "3b54229e6240d050480390f6b29d4744fd38437d23719f78a6decf7002296a29" + }, + "vllm/distributed/eplb/rebalance_execute.py": { + "path": "/vllm/distributed/eplb/rebalance_execute.py", + "sha256": "b387e228791149018536eee96cf955b33ba79d801cdc36849d1b47a580ec2597" + }, + "vllm/distributed/kv_events.py": { + "path": "/vllm/distributed/kv_events.py", + "sha256": "de08f01e8736881560256c350a3b6418999dd4aa30f9c6ec9159527f7ed6899a" + }, + "vllm/distributed/kv_transfer/__init__.py": { + "path": "/vllm/distributed/kv_transfer/__init__.py", + "sha256": "c1be4e58ec6923bae607a355ad22891c740f056a69ff7358b1e10ea3fd2680ea" + }, + "vllm/distributed/kv_transfer/kv_connector/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/base.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/base.py", + "sha256": "2ae2a2c48f5731f3533166a75440fe91e764332305b5d713df840edba970789d" + }, + "vllm/distributed/kv_transfer/kv_connector/factory.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/factory.py", + "sha256": "add99c93c587b0098b90b1f8fd6940bdd1f15c236c5c6f1a258411863cb902d3" + }, + "vllm/distributed/kv_transfer/kv_connector/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/utils.py", + "sha256": "317ed40dc837671ca6e666165222e641a0f9b3992aea63bbf54de7e13d40b3a4" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/__init__.py", + "sha256": "5beb6ccad12fdcfe1581982da6f18321caca50e73a6b3259ebf3c8dc8b3ffcca" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/base.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/base.py", + "sha256": "97af64220475c6c9e8273438d7b5138b105ebe6944beb783facb36a3bb76f31b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/decode_bench_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/decode_bench_connector.py", + "sha256": "b4151c88cdec28f1ff9259047abc17baf23b892f4b68769a93bf26e0442b9017" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/example_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/example_connector.py", + "sha256": "6226876ef52d10d0d284d29c337ab44698e8bac6abdb2e0ece53b5756c55d068" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/example_hidden_states_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/example_hidden_states_connector.py", + "sha256": "58c22534dcad0fb73599a2d70a2fb104d5b612a4723be5e777f56a56fe07892c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/flexkv_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/flexkv_connector.py", + "sha256": "de4f68c3bd565ed898e47e0b2980049b966ff31888f1957050d30995d4953762" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_client.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_client.py", + "sha256": "bea6ecff2be281c7e96c1551c7bf463cbb01f2964696067c0ebdb683844f9aab" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_connector.py", + "sha256": "e67ed58015090e5eea9d499883f2a9422673d07f8bdbe0ccff7db15d2460de13" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_metadata_server.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_metadata_server.py", + "sha256": "6800e5cf37809f8a8e28c469c14a434db288bc3bf83a8b62ee06910a20c2da19" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/common.py", + "sha256": "8f2c02c08227a9093e6aeb183961aba36b7812cfc29b8c047a2b2c9d82f79c15" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/gather_scatter_helper.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/gather_scatter_helper.py", + "sha256": "08c1b43de34fbeca77357d7576ac1d17cba974b59d695562f68bb713061e7b54" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/hf3fs_mock_client.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/hf3fs_mock_client.py", + "sha256": "bec61a9b0c4b9124b2292d7646d76411da44396389349b53cdcbc46353c8780e" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/connector.py", + "sha256": "8c61094ce0a3a702908f9576f69482e6bf314738a2cbe33a7d3b47258fa0ab43" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/stats.py", + "sha256": "d9383a6ad6ab6b8f812d29d90495407b770eeddb79b86e9d0e3216c0bd16e0ed" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/worker.py", + "sha256": "251c0d8e57e4739c03ce3e1c899a95ff5b1752eb27676c28ab88c4ebd62c4776" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_connector.py", + "sha256": "5991f9ff8832df32bd421eb67e48237270ea0a408180e523810bb43606acf8f3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/__init__.py", + "sha256": "c53be9796e76cde637514bfc40a525d8c09bb2784b406cb516790d8285dfe433" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/multi_process_adapter.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/multi_process_adapter.py", + "sha256": "6480d67b31ed603027a83edf327880a38aee45eaeee2da9a4efa93e95527c166" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/utils.py", + "sha256": "e204fa6a853ac9c122d7a4e9d146902230f81c48d4321ed5edfdbf979dd49ba2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/vllm_v1_adapter.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/vllm_v1_adapter.py", + "sha256": "e6fe55049c6b007248516d69640e2f3a4809f9d286091a1014ae0949987fa8f1" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py", + "sha256": "c712c386a7c57bf0355a1441ba574232c3aa5498fcb70713a2b3f5d18b64f9c1" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/metrics.py", + "sha256": "de1b1797d0448f74370919dbb0278767f390e8f59e00a0c0528abefb302babc2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_connector.py", + "sha256": "516be01320e64b0110e102eeb69a6ba766dd5ac8cb3036db6b97b7d54413323d" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_utils.py", + "sha256": "26877610463fa8e9d6b092772f2551bcc0c3ac794cbe63996df0414666a8ebba" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/rdma_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/rdma_utils.py", + "sha256": "716e5042edecaba36c7ca763474988f32fa09c2668b8260260149df610af8f83" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/stats.py", + "sha256": "f39b2f0b1db2e4f922e27e684a3f7bbf5bb279b82a0a8c3bb0c7ae69b6d14d24" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/connector.py", + "sha256": "17a350bdb89e17e415d6c52a48684dc15c35a804378daf03e1f3bee1b1b123a3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/coordinator.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/coordinator.py", + "sha256": "a8eb6c2157a96e8d25233b82347ac8409a41d6390b4f2c64242119c05911010c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/data.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/data.py", + "sha256": "d3cfefdb4165a24995749cba452641b318065baa95bb1bae62f922a2f8886e7b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/metrics.py", + "sha256": "f2b9ef8927632d142aad11a374d0725c6e619ea0bb7fea9eda3f3895eb7d277a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/protocol.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/protocol.py", + "sha256": "ccb1cf6a84a932a375215627d2aaac482c351a05df015d636d05373a6845b7c8" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/scheduler.py", + "sha256": "283849ff581ec206444cdf5621622377f1c925e8d7e05cb9294af2f3a5094e79" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/worker.py", + "sha256": "55f1682dfd1ed7af689166421337126a0e1d08afa4774a242e098d79e0c1e95b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_common.py", + "sha256": "549bb4fe22dca5095515b9c0712c31cc81a9d4923881e9f112317640fd8c04ab" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_connector.py", + "sha256": "c0f474bc34b579d889fae92eaf43eaca241be51a4697a187a942f0df4e6b6a98" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_engine.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_engine.py", + "sha256": "d842f3772fc6588d5a329a67572324cb74709aa3df4033e64c791a1e706c8e88" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_layout.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_layout.py", + "sha256": "2b4ec046a78897236b0626939bb828b6ec095355097d10bca39e5f3e1c992553" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/multi_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/multi_connector.py", + "sha256": "12d8387239f3194f2cb63ccbd64824648047210323572d66671e6a1eed349fc3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/__init__.py", + "sha256": "cc3145fe3b6d219a267bf40a0f7c0cc9430e4289f94acab2df761b99b671e7ba" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py", + "sha256": "7a1db8c54e4cd846bdac747344f2aea2c2fcf507817928796063225223b7e169" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_worker.py", + "sha256": "49a2e4faf99bef146b5a1d4d18d48f240b1e561c438252274494b359db96ef52" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/connector.py", + "sha256": "b6a0dc916d052f344be72ecfcb111509c13580102c11a860fa726cf0888949a9" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/metadata.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/metadata.py", + "sha256": "2b23a07c1ec5ac5490c3b818737c7192e344ea9f52cd5623f75939f741ab4e21" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_scheduler.py", + "sha256": "ac3daf8e2246581fec84ab28f2133569421b62c32a120be4923e2f4d0f2f9de9" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_worker.py", + "sha256": "e5060c9b6cf022de35ca3d1da7a369cd6a6a2dea26219af9f7633aaf78af8a76" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_scheduler.py", + "sha256": "2d9008e33937a4d6c5cf9cc2f96160f2bdbc8e987fe37f0798a7fd7eb84c9572" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_worker.py", + "sha256": "87de3ea383dd3aa95fb2c287ea26ded8a330859cc1295f9faa69047e80865c2c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/scheduler.py", + "sha256": "09f1bfe7075b926b26a94529480e33b62c3ac273ff826f6c502084f08b1b2a08" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/stats.py", + "sha256": "3e710654e0b68d1a8592f0c4735c81b22f4bf698fb1a2dfea126d35bf2dd1ef2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/tp_mapping.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/tp_mapping.py", + "sha256": "2d43607f98701b2fad6cc0ac2767619a80b7fc2b3a3c2eb6ed0da4fb05dcd8f6" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/utils.py", + "sha256": "93de863fc8307a61d40b62f1b176b57ae93c363d34b9e9ddc8e666265b6d45dc" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/worker.py", + "sha256": "5134a36ac100ce7a64f5311029a37ac12c38d91093f63100f51f7fe53ea7c3ee" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/canonical_mapping.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/canonical_mapping.py", + "sha256": "e0b3c6f9806a650e0370c43c5068fc31c0fec94615089e15fdf270d7d96f2b64" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/common.py", + "sha256": "9b3f042c6fa1581d10e8f688d2d9bc927bb41b780a9ea01f514d57228e20c978" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/config.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/config.py", + "sha256": "aea82e60889e78dcad8564ec8285b65a6a372824a1545a98ea8e78b6f4fd418a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/events.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/events.py", + "sha256": "d7039b67be95fd444966628184040a94880873c0611c0e6e7525a22650ffdefb" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/metrics.py", + "sha256": "13d76df014e86691f58dc89a879f9808b124690c9267dd5fa3b2d4004d4c5fdf" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py", + "sha256": "2c5282f4a3165cd787fb355e215e3869f1bdd3f2c795b2155fc537c9d135191a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/worker.py", + "sha256": "acc2df53262441dfc6421a3af7f0cbd68cbfaedbd42bbc384d8e1da2d965d194" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading_connector.py", + "sha256": "cdc16ca7339a10e1993bd6220e6273f86a4e99779f58f25098a24ad31bb0dbd8" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/simple_cpu_offload_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/simple_cpu_offload_connector.py", + "sha256": "96238ca82ccf07a1eeb59b8f66de17b09034e3eb993ad9a0a836511d3f69706b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/ssm_conv_transfer_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/ssm_conv_transfer_utils.py", + "sha256": "59a949709482e65a007fbe5352fe9b4bb54c2dcc10ad2c1c41f754b6e13299f4" + }, + "vllm/distributed/kv_transfer/kv_transfer_state.py": { + "path": "/vllm/distributed/kv_transfer/kv_transfer_state.py", + "sha256": "2e5fe09438d6e2ee642f8a26cf7dcf632e870d955d30baf002b76a8bfe836d05" + }, + "vllm/distributed/nixl_utils.py": { + "path": "/vllm/distributed/nixl_utils.py", + "sha256": "0bffa3c052c9f67472b1c0bc3816114891b010c968bf4b8a292e7da4d687db53" + }, + "vllm/distributed/parallel_state.py": { + "path": "/vllm/distributed/parallel_state.py", + "sha256": "d9b10ad56833ebc08a753e1a050ef0989c30d4134021b7b7b00150b7bd01adc6" + }, + "vllm/distributed/stateless_coordinator.py": { + "path": "/vllm/distributed/stateless_coordinator.py", + "sha256": "f52848fbe985ed47b1f3e3ca555314736ca06436e8d738ab4390101f0672dcb0" + }, + "vllm/distributed/utils.py": { + "path": "/vllm/distributed/utils.py", + "sha256": "792146b357139e705064a68d3b66858de8a0baaca4dc7db1232fa217d45db231" + }, + "vllm/distributed/weight_transfer/__init__.py": { + "path": "/vllm/distributed/weight_transfer/__init__.py", + "sha256": "3fb9d4712b7c131d522f5e76e73cd8c333f3cc7af86e2d5ecf9b61b57b3b7f5a" + }, + "vllm/distributed/weight_transfer/base.py": { + "path": "/vllm/distributed/weight_transfer/base.py", + "sha256": "8ab06feb04f1379d0558fbdb77fde46bc84f179e0a26742cabab937e88caa38d" + }, + "vllm/distributed/weight_transfer/clients.py": { + "path": "/vllm/distributed/weight_transfer/clients.py", + "sha256": "ff85c79c350241e6d2749ca23c9d295a3289b4b62bfdf0257d32eb94a0151d36" + }, + "vllm/distributed/weight_transfer/factory.py": { + "path": "/vllm/distributed/weight_transfer/factory.py", + "sha256": "4e979eeac8c5bcdbffb10eb4765cfb30120fa7595c6c2561d3fa1a966ced61c8" + }, + "vllm/distributed/weight_transfer/ipc_engine.py": { + "path": "/vllm/distributed/weight_transfer/ipc_engine.py", + "sha256": "1af578293f387a19073c322b24143c3ae4716ce0c5d2bac2a4ef26fe20119330" + }, + "vllm/distributed/weight_transfer/nccl_common.py": { + "path": "/vllm/distributed/weight_transfer/nccl_common.py", + "sha256": "7b2ef7dc7481c3f478f17c49aa36c7bed54142ec5c93d36ed8426c8fdf09e500" + }, + "vllm/distributed/weight_transfer/nccl_engine.py": { + "path": "/vllm/distributed/weight_transfer/nccl_engine.py", + "sha256": "7fd020c919dc7b4723fb78e64da977b180d0fef0cd21df955a037b848dbaa008" + }, + "vllm/distributed/weight_transfer/packed_tensor.py": { + "path": "/vllm/distributed/weight_transfer/packed_tensor.py", + "sha256": "d0a27fb0be1dc029bd5a1d44fdb57a5e54aa4cd74308bedc339e86ac02c7494c" + }, + "vllm/distributed/weight_transfer/sharded_rdt_common.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_common.py", + "sha256": "be0b13801f24e7b62999b19d733c030510353603a2d5320d5dc98ee02daf22a2" + }, + "vllm/distributed/weight_transfer/sharded_rdt_engine.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_engine.py", + "sha256": "2f791970b4815511a7578ef6c957e7da97b071d26a39087a09a17475909791ee" + }, + "vllm/distributed/weight_transfer/sharded_rdt_fake.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_fake.py", + "sha256": "ee11164e17b5f2793252ce77741b8b94e0583046abf896a590131b2008d1fbb9" + }, + "vllm/distributed/weight_transfer/sharded_rdt_trainer.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_trainer.py", + "sha256": "dd413ff461d41826ccd3eb87d3df22f6cd7f24e09aac7644e3e5b40d7beec484" + }, + "vllm/distributed/weight_transfer/sparse_nccl_engine.py": { + "path": "/vllm/distributed/weight_transfer/sparse_nccl_engine.py", + "sha256": "e11b409454dda2b05ea34e8115ac19027c5e65cb2a5e9682c494f16a50e978f4" + }, + "vllm/model_executor/determinism/__init__.py": { + "path": "/vllm/model_executor/determinism/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/determinism/batch_invariant.py": { + "path": "/vllm/model_executor/determinism/batch_invariant.py", + "sha256": "af8f8d256a48fc214edf426fbe891fb15bd8b1d7ae98b811c736ff1eb0fae798" + }, + "vllm/model_executor/determinism/batch_invariant_configs.py": { + "path": "/vllm/model_executor/determinism/batch_invariant_configs.py", + "sha256": "72ea0d4df0ab5ae288abb7df5c203d2ad5f1709c7295d87ec72da775fddc1b7a" + }, + "vllm/model_executor/layers/fused_moe/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/__init__.py", + "sha256": "64a32665be6d5afcfbaf7a0915717267278b66b880b908b0263ea58f08e51b5e" + }, + "vllm/model_executor/layers/fused_moe/activation.py": { + "path": "/vllm/model_executor/layers/fused_moe/activation.py", + "sha256": "78dec0e85e0c040304515f64ccf8f2c6a7a2e5b9f1124a2138a97d9a02585541" + }, + "vllm/model_executor/layers/fused_moe/all2all_utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/all2all_utils.py", + "sha256": "dc4750a446f7de31d09a46034da5fdf479bc169af90f47aa9af8ae15e67b0828" + }, + "vllm/model_executor/layers/fused_moe/b12x.py": { + "path": "/vllm/model_executor/layers/fused_moe/b12x.py", + "sha256": "ee76cc6aa801e24be8ec78a9e8502061ad48667d5ff8711e43f68fba912425bd" + }, + "vllm/model_executor/layers/fused_moe/config.py": { + "path": "/vllm/model_executor/layers/fused_moe/config.py", + "sha256": "a3a87cebcc7ac85d73f471dcfafc2d899c6fc08f264777b74a0e919adac9e03f" + }, + "vllm/model_executor/layers/fused_moe/deep_gemm_utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/deep_gemm_utils.py", + "sha256": "8fdcd857eb333f9c68902105f157568d52067c94ba1e2df6dbfe0474ef1f4c02" + }, + "vllm/model_executor/layers/fused_moe/eep_reconfigure.py": { + "path": "/vllm/model_executor/layers/fused_moe/eep_reconfigure.py", + "sha256": "9d7580265e8563e1140c2bb4c3a81a35ddd54903f5ec0a2720ffc064681f02f9" + }, + "vllm/model_executor/layers/fused_moe/expert_map_manager.py": { + "path": "/vllm/model_executor/layers/fused_moe/expert_map_manager.py", + "sha256": "308c00f63fcb6f44518ec3a56d8f902c7bba75928c2e3aea30fbe1f3f473973b" + }, + "vllm/model_executor/layers/fused_moe/experts/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a16_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a16_moe.py", + "sha256": "53deea255175171971422d14082ad139b5ec7b62e21429a4c7cc0ebbefd29cdc" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a8_moe.py", + "sha256": "f3fc51b95ed89862381908a0134e326228827f44854248db9585a9c4899c34f4" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp8_moe.py", + "sha256": "af6db1760961a5a71234f8b1cdf42e9e30a236e13601b0826a75110b79724948" + }, + "vllm/model_executor/layers/fused_moe/experts/batched_deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/batched_deep_gemm_moe.py", + "sha256": "b0cd4ea706583518dc608fb56f832fc3595f24bd863b03ef1e8c22b36b873508" + }, + "vllm/model_executor/layers/fused_moe/experts/cpu_int4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cpu_int4_moe.py", + "sha256": "67170af3ba9dc4c4f71d78a72efc3fa4e366eac614936a79911dae5c75ac1864" + }, + "vllm/model_executor/layers/fused_moe/experts/cpu_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cpu_moe.py", + "sha256": "0754cd4ff1b28e6d3932a67609d335acefd28f95a841f0492923813356a6d81e" + }, + "vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py", + "sha256": "db901bdbcd3fdac23a1d74e39c51e67f14a82be787b2fd704ed1e787372ae868" + }, + "vllm/model_executor/layers/fused_moe/experts/deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/deep_gemm_moe.py", + "sha256": "16911a64a72eafc26a1bcb544a91f90144d85dc41e3ee57cf20e89925227bbb7" + }, + "vllm/model_executor/layers/fused_moe/experts/fallback.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fallback.py", + "sha256": "1bdd0a4f2ebaa40ec96a5aacc07aee61511af59e6324ce456aa65003b6e2991a" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_b12x_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_b12x_moe.py", + "sha256": "e613afe5da2742e42c717c1a0a56bd9e1c7e3e0452a828db0013d81063518954" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_batched_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_batched_moe.py", + "sha256": "295254dfeeec8df3eb8110e6f659a946cb9cded3de1565ecad4d741b3c3f3e00" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_moe.py", + "sha256": "08578bcd0cf72d6a470e40950175e73639efaa6d8d23c6da0869345312b229c9" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutlass_moe.py", + "sha256": "52887cec5fe628e0a4e7793deb546b40f6c29f7362b3b436c10ca36934ab9826" + }, + "vllm/model_executor/layers/fused_moe/experts/fused_batched_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fused_batched_moe.py", + "sha256": "2435587fc7f8fe8ea341ea0eb8f14c11f3f5b31fbbb9b29ce569ad3bace6e6a0" + }, + "vllm/model_executor/layers/fused_moe/experts/fused_humming_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fused_humming_moe.py", + "sha256": "a6830a76ff7f4cd3479b9c8372a30d03e8301604555cbdbcd9ac89a813b7431a" + }, + "vllm/model_executor/layers/fused_moe/experts/gpt_oss_triton_kernels_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/gpt_oss_triton_kernels_moe.py", + "sha256": "1613a7a6b256e8faee6fdcfae84f293492db6229d28ceb3e8a8d6093af480e36" + }, + "vllm/model_executor/layers/fused_moe/experts/int4_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/int4_emulation_moe.py", + "sha256": "f12857caf0671a341687ad3c5f48616b816ed51e1bcbdefa0a7edbecdb81a79d" + }, + "vllm/model_executor/layers/fused_moe/experts/lora_context.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/lora_context.py", + "sha256": "9b41eefaaa57c5dd0dc54217ef95978821b0c52e90ea4db8b0752e08452bd3e5" + }, + "vllm/model_executor/layers/fused_moe/experts/lora_experts_mixin.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/lora_experts_mixin.py", + "sha256": "b2bc55ed6be98b526c6a5698e2d98300650e78555f56b1820e58c04888e2a373" + }, + "vllm/model_executor/layers/fused_moe/experts/marlin_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/marlin_moe.py", + "sha256": "93916b721548e6194dc70cf6cec224b4b1456a0cc0980235e97beba7bf36541d" + }, + "vllm/model_executor/layers/fused_moe/experts/mxfp8_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/mxfp8_emulation_moe.py", + "sha256": "d09c62ad1398c51ff6f515f2a61014ee9e9a9798d0fe9762c47f446efc5edbef" + }, + "vllm/model_executor/layers/fused_moe/experts/mxfp8_native_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/mxfp8_native_moe.py", + "sha256": "01a42cebf18189e566034111b2145573c655319e8af1a56db60d53a319c40613" + }, + "vllm/model_executor/layers/fused_moe/experts/nvfp4_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/nvfp4_emulation_moe.py", + "sha256": "f24467762b60702f0df122ed64786be839a838a9b6cafaecbd04d35fbfedb189" + }, + "vllm/model_executor/layers/fused_moe/experts/ocp_mx_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/ocp_mx_emulation_moe.py", + "sha256": "dcaa60a9ebdb0bd8223b37af41f018ce7f95716ec7cd8526850f4433a579213b" + }, + "vllm/model_executor/layers/fused_moe/experts/rdna3_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/rdna3_moe.py", + "sha256": "e4abd802dc2f0ad9b338ebde397633c761d881c37813e2dc229902c526b597d8" + }, + "vllm/model_executor/layers/fused_moe/experts/rocm_aiter_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/rocm_aiter_moe.py", + "sha256": "bf09a7b783f5752d61cab76221b32b598d8846d801ee39dc9209d636c9659c6f" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_cutlass_moe.py", + "sha256": "ffce5ad627c540940d122d8df7981644b2eb35d07d480995c0f4f30517815fac" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_deep_gemm_moe.py", + "sha256": "c7209fa5e1ccb184a68b37a0706fc571a76696c2ae79802ddc7f889b1c29684d" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_moe.py", + "sha256": "806fbccfe30f5fbd578acf773add99bdf022b12d617958bd6281aef6de369701" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_bf16_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_bf16_moe.py", + "sha256": "76256de96fefece9c41ffb1108487919e24da364cf4412c6c3474498aba59137" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.py", + "sha256": "b54c7ceb45e5d07aa905f42ea44caccf85ca35ba9fb825d4c01947764510f68b" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_lora_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_lora_moe.py", + "sha256": "dd35a9e4242c0dc8d691168813e14bd5543e591f02ee529d0691e07651942c5a" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_mxfp4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_mxfp4_moe.py", + "sha256": "fe780f125a3dc3ba919659e9b85340bd32afcbfe47733a002bfdfb92eadf400c" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_mxint4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_mxint4_moe.py", + "sha256": "2106d67c2951aa690c4656ca58240d09c366cffe8cb4d9fd575df016c377cc30" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_nvfp4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_nvfp4_moe.py", + "sha256": "e938ac9f058f7c90b41c9610513239bec54a95304bfb5ff5f6897ebd54733d7e" + }, + "vllm/model_executor/layers/fused_moe/experts/xpu_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/xpu_moe.py", + "sha256": "2a11bac0cf9274d963315efd6eebdc62978b0b7aa02e8849ff2a562742f0b86d" + }, + "vllm/model_executor/layers/fused_moe/fused_flydsl_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_flydsl_moe.py", + "sha256": "0e74879ee5c72f616ae4064b9dff3b3a0b583b7fc70b8f92f1e8b730ecd5d39b" + }, + "vllm/model_executor/layers/fused_moe/fused_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe.py", + "sha256": "7072eb06237be9d33dcb0ef7101410f886a6363c98cbee70a014c68b70f639cb" + }, + "vllm/model_executor/layers/fused_moe/fused_moe_method_base.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe_method_base.py", + "sha256": "18dcfc469d3252749801bbf943857f58da85de1f2db8fdff5a9f4986a925dc68" + }, + "vllm/model_executor/layers/fused_moe/fused_moe_modular_method.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe_modular_method.py", + "sha256": "321c744eac1fcaffd6b1b2971204c8baa57dfec53e91e5d24140014d72d64f83" + }, + "vllm/model_executor/layers/fused_moe/hpc_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/hpc_moe.py", + "sha256": "2ca9c5d71b6fd91651027905e2b83103a8823845e053e7153e148cb8e0ee666d" + }, + "vllm/model_executor/layers/fused_moe/layer.py": { + "path": "/vllm/model_executor/layers/fused_moe/layer.py", + "sha256": "def0b4e13bcc1e4e21ee10644e647e2eda1acbf0cc01e76d6128abb59ea08224" + }, + "vllm/model_executor/layers/fused_moe/modular_kernel.py": { + "path": "/vllm/model_executor/layers/fused_moe/modular_kernel.py", + "sha256": "8dc4e0dbbf35b3aac8add63ca6f2a7bbfdadaabbd60826e24598b22c7d8e5c22" + }, + "vllm/model_executor/layers/fused_moe/moe_align_block_size.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_align_block_size.py", + "sha256": "c3f7fc2087836f0160a32ab99ceb1d8f6e87c793679da34dd672e225cb7fa31b" + }, + "vllm/model_executor/layers/fused_moe/moe_fused_mul_sum.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_fused_mul_sum.py", + "sha256": "112e72578002c3bff538418dac64b3b56d995994a2fc5e32b18d2cf3b8392a13" + }, + "vllm/model_executor/layers/fused_moe/moe_output.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_output.py", + "sha256": "6ea4cbd78f9efc7f842c5df246f553f08b991c3479b8b04b89902ed08aaf8e8f" + }, + "vllm/model_executor/layers/fused_moe/moe_permute_unpermute.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_permute_unpermute.py", + "sha256": "1adc592c6254d0c877d66be5406afbc822459c18a838f4bbd094a992e7609d06" + }, + "vllm/model_executor/layers/fused_moe/oracle/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/__init__.py", + "sha256": "4dcf941d50d48bb812de0f39e9194bf17a76b8035fe324889c6038f710fdc453" + }, + "vllm/model_executor/layers/fused_moe/oracle/base.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/base.py", + "sha256": "555bbcd18a3744e64eee4e953daabef3bd268a1bd4faf967d4cfd14d6074f685" + }, + "vllm/model_executor/layers/fused_moe/oracle/fp8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/fp8.py", + "sha256": "245bd36c285df1e6f7c51e52dcda31ad247894577a9f8d765613c2c2feae9aee" + }, + "vllm/model_executor/layers/fused_moe/oracle/int8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/int8.py", + "sha256": "c1b67886511bd966b162db5bca8930f04895fb37a969818a4a10f0726c59547f" + }, + "vllm/model_executor/layers/fused_moe/oracle/int_wna16.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/int_wna16.py", + "sha256": "cfffe8b8b290330be9d18ffa07aeecf296484395ff04df3147d99393e48b55c1" + }, + "vllm/model_executor/layers/fused_moe/oracle/mxfp4.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/mxfp4.py", + "sha256": "b7915e6779b5c88e7dcd2d227f003a8e45071d6d86877013067142d4feb64a8c" + }, + "vllm/model_executor/layers/fused_moe/oracle/mxfp8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/mxfp8.py", + "sha256": "9cfdc8102a04bb844dcd7ed88043bba96ec751794bc093da76c69aa8cf88cf48" + }, + "vllm/model_executor/layers/fused_moe/oracle/nvfp4.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/nvfp4.py", + "sha256": "735b4cdeb1258f11fb02320fc0c70cab5edaca468dd60b07b2d369389d2b0313" + }, + "vllm/model_executor/layers/fused_moe/oracle/unquantized.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/unquantized.py", + "sha256": "c8b8203bd0b73bb7f586f703607394d663f14c05711416ad42d45af564382223" + }, + "vllm/model_executor/layers/fused_moe/oracle/w4a8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/w4a8.py", + "sha256": "d7fa6e2982f20b34d5ce9c5ce28a61122762a3fcdd53d249479472a4f2316c6a" + }, + "vllm/model_executor/layers/fused_moe/oracle/w4a8_int8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/w4a8_int8.py", + "sha256": "6d6f9ca2e67b630002873de2f8d8a231d091c5c2f0f3354a9e8209449b481a4c" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/__init__.py", + "sha256": "2800113263a83c2632e522fb22790b29f63384da75d43de32f0ae2f95e8ae4c1" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/batched.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/batched.py", + "sha256": "d52425dd8c08e47cf8d9c3088daf3b1cc721c8667de4c738d04ba997f9a08ccb" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ht.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ht.py", + "sha256": "465cdf1d6cee91b2ee8c2e43abbea6e8408976e3048c10f44c089f34b415bc60" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ll.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ll.py", + "sha256": "f704922b1db680c4c212982a096e09d6b3eb97d89110313f86ed958a00df21b7" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_v2.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_v2.py", + "sha256": "8d690b016bbcfbc9eb599bcc36a6f798b2f1720c828f4347ea742e218c0cc60d" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_one_sided.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_one_sided.py", + "sha256": "acb57d8342af62bb5672036871cd4b27ecc7f37dfa7c894850bb860e6152a1f0" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_two_sided.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_two_sided.py", + "sha256": "cc5b00d6a157b6eca5afaaf7435165dbd1b4524d6d88bf75808cbe074a389f79" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/mori.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/mori.py", + "sha256": "8e9c3b5b1f0de13f467d95bf2f451cba0e4b0d9a1bdcf98da0988a3a9a79a045" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/naive_dp_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/naive_dp_ep.py", + "sha256": "db015e5b18750bbbf5b2bbaceca877dd6f3f3e74c2a94e8dc185f7413b387f91" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/nixl_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/nixl_ep.py", + "sha256": "1f71d70ac509bf5d3d67a8d95a8ee108a50af6bb5d4bde7181ca28e286f6ffce" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/no_dp_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/no_dp_ep.py", + "sha256": "adbbf529cd22059c95b5380952943a70cf11e05e321dcd707f296bebde61a6e7" + }, + "vllm/model_executor/layers/fused_moe/routed_experts.py": { + "path": "/vllm/model_executor/layers/fused_moe/routed_experts.py", + "sha256": "68c48e5df0ea4a7cc1f04436b7b9153eb53802ecd9bb55d38db8738508daac6d" + }, + "vllm/model_executor/layers/fused_moe/routed_experts_capturer.py": { + "path": "/vllm/model_executor/layers/fused_moe/routed_experts_capturer.py", + "sha256": "cd006bc1a1703418cca3b589fafb2abc4268a086fb3db044bbb64348aeac8b13" + }, + "vllm/model_executor/layers/fused_moe/router/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/layers/fused_moe/router/aiter_shared_routed_fused_moe_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/aiter_shared_routed_fused_moe_router.py", + "sha256": "f47046db1275601a2c67c9232afc7b866c9623a19639d5be867e4c7914a35069" + }, + "vllm/model_executor/layers/fused_moe/router/base_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/base_router.py", + "sha256": "47fa2324bcd9b6ebdc138d69ae6b6ecc0f2463d34bda8c5988bdb0a2a76d3fae" + }, + "vllm/model_executor/layers/fused_moe/router/bf16x3_router_gemm_cutedsl.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/bf16x3_router_gemm_cutedsl.py", + "sha256": "d0f1edd1ebc48d88e490bdb3c93db49bdc0a135ff83e7e0b57130e9f8255fc32" + }, + "vllm/model_executor/layers/fused_moe/router/cpu_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/cpu_router.py", + "sha256": "bff36b15818c87bfbb7ee3def7dc7f6396860abbe5893ff6148801fe941a4b92" + }, + "vllm/model_executor/layers/fused_moe/router/custom_routing_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/custom_routing_router.py", + "sha256": "1a40c7054e3c3a1b3ee2e98f6bc9efa9dfdc11f316a8edf7357dd91533487bfe" + }, + "vllm/model_executor/layers/fused_moe/router/dsv4_topk.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/dsv4_topk.py", + "sha256": "14f7c8487b9aef652dd61c91e0e3c3640b643bf9cd0d8a7184157d71f4beb63e" + }, + "vllm/model_executor/layers/fused_moe/router/fused_moe_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_moe_router.py", + "sha256": "0daa0dc05b931d66767feca444a4cd57ecf140f59b40ea0e8ad213eef6da2b36" + }, + "vllm/model_executor/layers/fused_moe/router/fused_topk_bias_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_topk_bias_router.py", + "sha256": "8fdc28cc248180ad4f11bb4bcda3df47926ec12665a0d84bb712fe83fc6b9376" + }, + "vllm/model_executor/layers/fused_moe/router/fused_topk_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_topk_router.py", + "sha256": "1c80f4af4d781fd66b12aa6a7a0fd30082bc521df40f1252987a8ac4c0bef51c" + }, + "vllm/model_executor/layers/fused_moe/router/gate_linear.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/gate_linear.py", + "sha256": "faa43362c2e7c568498a923c682ca18cae75e87f48d00882770821cb19c21198" + }, + "vllm/model_executor/layers/fused_moe/router/grouped_topk_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/grouped_topk_router.py", + "sha256": "048339e1799cdd42c9dae686a6cb891046577fb391b500f0d12eed73c8f61e52" + }, + "vllm/model_executor/layers/fused_moe/router/rocm_fp32_router_gemm.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/rocm_fp32_router_gemm.py", + "sha256": "9c331ef3d0bb2fb6954387d77ac62a99c5c76d2753c7438bfbb5115f68aae5ac" + }, + "vllm/model_executor/layers/fused_moe/router/router_factory.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/router_factory.py", + "sha256": "019bc8adaa7642abab82843efd53cd1a378f62c652521a1de2b781480eb88742" + }, + "vllm/model_executor/layers/fused_moe/router/routing_simulator_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/routing_simulator_router.py", + "sha256": "a7345df5add00cf3bd93024492d6fc1189fd3ecf2754a11cef1b03a295d791f7" + }, + "vllm/model_executor/layers/fused_moe/router/zero_expert_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/zero_expert_router.py", + "sha256": "dea306edd92e2b9c1b43f982ede8e1e10770d2c66220f5a106e0ed0165276e9c" + }, + "vllm/model_executor/layers/fused_moe/runner/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/layers/fused_moe/runner/moe_runner.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/moe_runner.py", + "sha256": "05893188402fe37229bf72d75088d66193c417d5d502daafd3a55e1bfedaa60c" + }, + "vllm/model_executor/layers/fused_moe/runner/moe_runner_interface.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/moe_runner_interface.py", + "sha256": "189cad01611124eb44594713cbf5918d16fc70196dc81a525ae0a7a97a5fcc51" + }, + "vllm/model_executor/layers/fused_moe/runner/shared_experts.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/shared_experts.py", + "sha256": "d89e4c79c46f6fe61262c51f3facf102e71ce1e4eb3db67f72b6bd8470937be9" + }, + "vllm/model_executor/layers/fused_moe/topk_weight_and_reduce.py": { + "path": "/vllm/model_executor/layers/fused_moe/topk_weight_and_reduce.py", + "sha256": "3dfede72d52bf99af40997994704e6c502ee3bab2bd39bfaa8a68d7dae440203" + }, + "vllm/model_executor/layers/fused_moe/unquantized_fused_moe_method.py": { + "path": "/vllm/model_executor/layers/fused_moe/unquantized_fused_moe_method.py", + "sha256": "182a5ec1874ece2091a24c5303f6ab9ea64a9a61adf325b863927f0cdd83e5d3" + }, + "vllm/model_executor/layers/fused_moe/utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/utils.py", + "sha256": "a93a0bded4008db19d8b38370526ae34fafb9c8278e5b4f60acb6acc8fdc1850" + }, + "vllm/model_executor/layers/mamba/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/abstract.py": { + "path": "/vllm/model_executor/layers/mamba/abstract.py", + "sha256": "dfdc8c836894f574e41d93d76ab989cacd3d7ecf59c97a929abfa48d9364e8ad" + }, + "vllm/model_executor/layers/mamba/gdn/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/gdn/base.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/base.py", + "sha256": "7fec748fc74131f5a45bcaf2644b3fa3a0598fd437d7347f8207ea3644a951c5" + }, + "vllm/model_executor/layers/mamba/gdn/kimi_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/kimi_gdn_linear_attn.py", + "sha256": "1cec4da5c9da73557e192bfb36cd540aae51d3e91283b554449c4a97f0f89bd9" + }, + "vllm/model_executor/layers/mamba/gdn/olmo_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/olmo_gdn_linear_attn.py", + "sha256": "60873ca3bb0c4d17c33bd259b62b658db4883cd23138f47dd4ead62cd2ff0605" + }, + "vllm/model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py", + "sha256": "b80f8e6f3fff442fb880aebb3209c52f814f66490009f4ac4003de603576d10a" + }, + "vllm/model_executor/layers/mamba/linear/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/linear/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/linear/bailing_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/linear/bailing_linear_attn.py", + "sha256": "3c480ddd6eba0766ed012a1074bbec5f241d868a87b020b0f6312222c32f93eb" + }, + "vllm/model_executor/layers/mamba/linear/base.py": { + "path": "/vllm/model_executor/layers/mamba/linear/base.py", + "sha256": "26125cd427225954e1846ca361cdaf43f2b56f11b1e217cf26e91a80ef0edb6a" + }, + "vllm/model_executor/layers/mamba/linear/minimax_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/linear/minimax_linear_attn.py", + "sha256": "4adc00f54893b5bc6c31c613deda152a19af3b1bba04153ab5924c3bf2a3aaae" + }, + "vllm/model_executor/layers/mamba/mamba_mixer.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_mixer.py", + "sha256": "a485e937ad9db14d3ad03fde5a9fe795cfa863649563e52fc7e6c52ef631164e" + }, + "vllm/model_executor/layers/mamba/mamba_mixer2.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_mixer2.py", + "sha256": "d58d93e90d9eb90bc5133b79f07c7c62d0032b35d6cf916e3fe34367b81c5cd5" + }, + "vllm/model_executor/layers/mamba/mamba_utils.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_utils.py", + "sha256": "ce9845b4a4ef4bc46577a33038ed69d59ceccb52f30e9c5bdaa36e48be3b2ca4" + }, + "vllm/model_executor/layers/mamba/ops/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/ops/causal_conv1d.py": { + "path": "/vllm/model_executor/layers/mamba/ops/causal_conv1d.py", + "sha256": "044d005cfe59fd0818ed421274e04f3e8dd679b8cdb64fca9f4422f2643484b2" + }, + "vllm/model_executor/layers/mamba/ops/cpu/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/ops/cpu/causal_conv1d.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/causal_conv1d.py", + "sha256": "64104672890ac2ef240c20c7f8059beeade707178574809dbca8721dff5ea6fa" + }, + "vllm/model_executor/layers/mamba/ops/cpu/gdn_attention.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/gdn_attention.py", + "sha256": "a50288945bf5b102ad3025ae536638dcc32d84cf7c22aaf3a85326b0c1c56c1f" + }, + "vllm/model_executor/layers/mamba/ops/cpu/mamba_ssm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/mamba_ssm.py", + "sha256": "5839e576172a3246337f5e4fb1bc19eb583b3e2b2f7e35dd060dc3041eb8372d" + }, + "vllm/model_executor/layers/mamba/ops/gather_initial_states.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gather_initial_states.py", + "sha256": "5198bb6de6d91c583a5f65d926412a76ee04a06fa72aaba76eaf156b27cd0523" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/__init__.py", + "sha256": "b88b52e71fcb21bd3fa215ea171dcd2ad2ff17c97788cfe64caa7ba45c7ecf97" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_h.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_h.py", + "sha256": "f50bbe5c0b6382323ec5dfc24a5e0c7971113d59727515e60c9fe3689734e5ba" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_kkt_inv_uw.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_kkt_inv_uw.py", + "sha256": "b4a65dd194907db08865e0596fe254f915e670a9e6b27ffa2933c1026dde9b1e" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_o.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_o.py", + "sha256": "629f7843a7e611efb9390f2ebb7a4b924b2c328d48a317fddfaa96af4d9bc60a" + }, + "vllm/model_executor/layers/mamba/ops/layernorm_gated.py": { + "path": "/vllm/model_executor/layers/mamba/ops/layernorm_gated.py", + "sha256": "3433f2e3b87c2b2ccf8e9794ce40762c86a6da38a94ecee001f439ea0d0373dd" + }, + "vllm/model_executor/layers/mamba/ops/mamba_ssm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/mamba_ssm.py", + "sha256": "a4515ec7895b40ed878cf380445034b25faa61fbaa799d96c49217bbdfd7e400" + }, + "vllm/model_executor/layers/mamba/ops/replayssm_config.py": { + "path": "/vllm/model_executor/layers/mamba/ops/replayssm_config.py", + "sha256": "5fe9d5d7aa2de6a65875b3796a919b22bc435fd76055ba054bbff43aa005bc44" + }, + "vllm/model_executor/layers/mamba/ops/scatter_states.py": { + "path": "/vllm/model_executor/layers/mamba/ops/scatter_states.py", + "sha256": "f3bb004c73edaba56337747893eb07faf29b270dc8bb9c893ee9b1044e4ead9a" + }, + "vllm/model_executor/layers/mamba/ops/selective_state_update_replayssm_output_only.py": { + "path": "/vllm/model_executor/layers/mamba/ops/selective_state_update_replayssm_output_only.py", + "sha256": "cea7fd3063ca9dcc4e33f180d01ea379195ec515cedc9d0b03b11dc67670d695" + }, + "vllm/model_executor/layers/mamba/ops/ssd_bmm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_bmm.py", + "sha256": "26983d97a7f5c5f9197a16a6bee7b1294839b9ae31a14c14aaee38b43523e630" + }, + "vllm/model_executor/layers/mamba/ops/ssd_chunk_scan.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_chunk_scan.py", + "sha256": "d5ef32e8cb47e2ce71984579df78ab69754895f891766394daf327867cfa4f8f" + }, + "vllm/model_executor/layers/mamba/ops/ssd_chunk_state.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_chunk_state.py", + "sha256": "177e3aa7fe72647133bbd86135533e8688a5802678d4d1564aa549410362316f" + }, + "vllm/model_executor/layers/mamba/ops/ssd_combined.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_combined.py", + "sha256": "1317bbb668d3c60dfe0658850f9968614f03fa5eb61196f8ce6ac17dbb31b480" + }, + "vllm/model_executor/layers/mamba/ops/ssd_state_passing.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_state_passing.py", + "sha256": "36b8c8edba437916a5b789717c61fc22077de01e77892cb96dbff3b00a57410e" + }, + "vllm/model_executor/layers/mamba/ops/ssu_dispatch.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssu_dispatch.py", + "sha256": "bbe0f0e61da87f3ddfead19a79ca376516b63f1ea868be3485333c63fa20ef41" + }, + "vllm/model_executor/layers/mamba/ops/triton_helpers.py": { + "path": "/vllm/model_executor/layers/mamba/ops/triton_helpers.py", + "sha256": "a8795532f22c37a93e82c9d8e3fadcb5f4da98673d7b321fe8481305eaafad30" + }, + "vllm/model_executor/layers/mamba/short_conv.py": { + "path": "/vllm/model_executor/layers/mamba/short_conv.py", + "sha256": "228494efab185ee17374f762874f4c8b9a26aac9decfa8c906ce38446e0de51a" + }, + "vllm/model_executor/models/qwen3_next.py": { + "path": "/vllm/model_executor/models/qwen3_next.py", + "sha256": "4fa5112ac2bf7886d41d9e1f6c3da8793620d1ec49c961b31e9609459a6a7f7a" + }, + "vllm/third_party/flash_linear_attention/__init__.py": { + "path": "/vllm/third_party/flash_linear_attention/__init__.py", + "sha256": "5dbbfa3fc286edb2e970e175ef33cee4f6181c89b0784f5a8986201b2312f54e" + }, + "vllm/third_party/flash_linear_attention/ops/__init__.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/__init__.py", + "sha256": "dd738dc1d08045e76455cdbe16052a5b769e0eb11d6e87ff28353994f880cd6c" + }, + "vllm/third_party/flash_linear_attention/ops/chunk.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk.py", + "sha256": "c105ead259e86aedc248c53e7c4cef07034d0ff12da608d80265d1dd0990803f" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_delta_h.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_delta_h.py", + "sha256": "1b3ad391f939d9443c6b7adb19e57fe381bd5dccea064e8417a4f85b0e713b26" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_o.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_o.py", + "sha256": "3b63b836a8cc561723c23db5a528a0b474d9cd78508d610f0b348c585a889a19" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_scaled_dot_kkt.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_scaled_dot_kkt.py", + "sha256": "7ae41df3755acc7e925a134d848f78bb5fc00b90069039d86403c5853323ea42" + }, + "vllm/third_party/flash_linear_attention/ops/cumsum.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/cumsum.py", + "sha256": "d818215669b451868823202ac0bcea77e7a9d75957254c7c1060a73a55dc39b6" + }, + "vllm/third_party/flash_linear_attention/ops/fused_gdn_prefill_post_conv.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_gdn_prefill_post_conv.py", + "sha256": "590717b2107abc90d72548de06b5d315229eb2775c94614f3f545df11cc2b5df" + }, + "vllm/third_party/flash_linear_attention/ops/fused_norm_gate.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_norm_gate.py", + "sha256": "e6eb90467f29d8a0a04f2a364d20a2c3191b6ab857841bfb82076b33a6022d1a" + }, + "vllm/third_party/flash_linear_attention/ops/fused_recurrent.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_recurrent.py", + "sha256": "fe6f1311014809040497aa0a623e7fa97f4b3457cdc7ee1f1f8aed21f326f755" + }, + "vllm/third_party/flash_linear_attention/ops/fused_sigmoid_gating.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_sigmoid_gating.py", + "sha256": "000ab8996af9788fdb8843a6a3b91833e7a14c8acc0e1ea073a536330f64cb6f" + }, + "vllm/third_party/flash_linear_attention/ops/index.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/index.py", + "sha256": "a4f8b2c052635cb519a80099e8a85411d1d5d6880b38f466788259bbe66b154d" + }, + "vllm/third_party/flash_linear_attention/ops/kda.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/kda.py", + "sha256": "e1f31aaa89b91f8e5db6d070b229e2c81c7206e8caec67de41db97d06be0c476" + }, + "vllm/third_party/flash_linear_attention/ops/l2norm.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/l2norm.py", + "sha256": "520f4513ef4fc97e6b88dc07877cca8e29da0d34e44673fe989e3af002d86381" + }, + "vllm/third_party/flash_linear_attention/ops/layernorm_guard.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/layernorm_guard.py", + "sha256": "42af29be26e8fc94a4658e053c095fcdab9ffdc1bc2446a01e787deda2a298c0" + }, + "vllm/third_party/flash_linear_attention/ops/op.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/op.py", + "sha256": "456da84fd12411cf53c96a90dd4f78f49afb454c3d51d2c524ea8e7106fe8ae5" + }, + "vllm/third_party/flash_linear_attention/ops/solve_tril.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/solve_tril.py", + "sha256": "d1a4ff27623a938825052500afa7e2aa24fadd2fa4c9be6376c9128824f86f82" + }, + "vllm/third_party/flash_linear_attention/ops/utils.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/utils.py", + "sha256": "d6c90d36505e02086954c23ca4dd2fea82a69416d68ff1d0501e16b3148b5b0c" + }, + "vllm/third_party/flash_linear_attention/ops/wy_fast.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/wy_fast.py", + "sha256": "c9fc8259db0a8746dc04f1d799cb73333457118cf89a0bdce8dde8a80a28cd96" + }, + "vllm/v1/attention/__init__.py": { + "path": "/vllm/v1/attention/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backend.py": { + "path": "/vllm/v1/attention/backend.py", + "sha256": "01ac364372afa75fdb22486aa3a9c7cf9aebb742e3471dfb9e0f9d9d36b734bc" + }, + "vllm/v1/attention/backends/__init__.py": { + "path": "/vllm/v1/attention/backends/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backends/b12x.py": { + "path": "/vllm/v1/attention/backends/b12x.py", + "sha256": "443f0a98738fdfefe5b9ab151d278bfd43a8ac807eb2b0b9b2a13d51922afbf9" + }, + "vllm/v1/attention/backends/composite.py": { + "path": "/vllm/v1/attention/backends/composite.py", + "sha256": "4cf3d66dca891562709eed4f50aa14b0ae6c8240d9ea86504a3304b2f356cce0" + }, + "vllm/v1/attention/backends/cpu_attn.py": { + "path": "/vllm/v1/attention/backends/cpu_attn.py", + "sha256": "76fb02a6bd725125565d84bf04f627cf16da5f7ff8f31f87c01ed6a1439398c7" + }, + "vllm/v1/attention/backends/fa_utils.py": { + "path": "/vllm/v1/attention/backends/fa_utils.py", + "sha256": "08fa6e231d3af3a71a6e59162dd12328aa8beb28548165ae58f130a92adb5a83" + }, + "vllm/v1/attention/backends/flash_attn.py": { + "path": "/vllm/v1/attention/backends/flash_attn.py", + "sha256": "b170a4789e18104c1bee35bea70df51abe6766693d8f4726a59f2e6f5c4282aa" + }, + "vllm/v1/attention/backends/flash_attn_diffkv.py": { + "path": "/vllm/v1/attention/backends/flash_attn_diffkv.py", + "sha256": "e4627c88c3ba8caee260540e994cc8137fd2ff7cd7813356b36387c6c88ce30a" + }, + "vllm/v1/attention/backends/flashinfer.py": { + "path": "/vllm/v1/attention/backends/flashinfer.py", + "sha256": "8ee541fde43ed92a417b3f01ea1e6fc64af8ab2eb54cbfc28308a49aaca4ed7f" + }, + "vllm/v1/attention/backends/flex_attention.py": { + "path": "/vllm/v1/attention/backends/flex_attention.py", + "sha256": "ad07f0ad73aeeadc3534b3a05c14f88a62cb3638874239ae9823c49b36276dc3" + }, + "vllm/v1/attention/backends/gdn_attn.py": { + "path": "/vllm/v1/attention/backends/gdn_attn.py", + "sha256": "3831019404a92200a38b43571c040cffeb6638bbdc71e4cb5e680dbc6c93d054" + }, + "vllm/v1/attention/backends/hpc_attn.py": { + "path": "/vllm/v1/attention/backends/hpc_attn.py", + "sha256": "af9e2aec1b498f0ee48a2dce3cf5646edf1976466980b2fd927c0e82b875427c" + }, + "vllm/v1/attention/backends/linear_attn.py": { + "path": "/vllm/v1/attention/backends/linear_attn.py", + "sha256": "bc42144fcd027434c6a10dc9f4c5f991db8899d387af5f6485402ce097eb0513" + }, + "vllm/v1/attention/backends/mamba1_attn.py": { + "path": "/vllm/v1/attention/backends/mamba1_attn.py", + "sha256": "32159dae11cab3c8c576b9514ad97d5108c8d1b4cac9fcfe345ec6a76223aee7" + }, + "vllm/v1/attention/backends/mamba2_attn.py": { + "path": "/vllm/v1/attention/backends/mamba2_attn.py", + "sha256": "a5bcdecb7b9547137023e1c77a386003358fa940eaf5f319ed142211dcdba139" + }, + "vllm/v1/attention/backends/mamba_attn.py": { + "path": "/vllm/v1/attention/backends/mamba_attn.py", + "sha256": "5e7b2c4058fc5e6096d001bff6c789b78368b025bbe4600f191aaca2ff59b59f" + }, + "vllm/v1/attention/backends/mla/__init__.py": { + "path": "/vllm/v1/attention/backends/mla/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backends/mla/aiter_triton_mla.py": { + "path": "/vllm/v1/attention/backends/mla/aiter_triton_mla.py", + "sha256": "ed0e285cdae06a019150c41cc958b3c0b5ceb0e4f299d5318d1c90e2c2395390" + }, + "vllm/v1/attention/backends/mla/amx_mla.py": { + "path": "/vllm/v1/attention/backends/mla/amx_mla.py", + "sha256": "7f5cddec30b2dfe22ccdbd3b9da673c879719bf6da4074317bd60add55f5d15f" + }, + "vllm/v1/attention/backends/mla/compressor_utils.py": { + "path": "/vllm/v1/attention/backends/mla/compressor_utils.py", + "sha256": "3589e94105368ea285c40b82db1a0332682ff5d071fe363627cf4c0d10f3facf" + }, + "vllm/v1/attention/backends/mla/cpu_mla.py": { + "path": "/vllm/v1/attention/backends/mla/cpu_mla.py", + "sha256": "ff2110b9f78e92adf6bab294465cbc294ae1ff71cb1780fed158179e134a4ca6" + }, + "vllm/v1/attention/backends/mla/cutlass_mla.py": { + "path": "/vllm/v1/attention/backends/mla/cutlass_mla.py", + "sha256": "211d298680f9bd793cc468281b316d6633c5f4eb6dcec71d3329b034a23ab9b5" + }, + "vllm/v1/attention/backends/mla/flashattn_mla.py": { + "path": "/vllm/v1/attention/backends/mla/flashattn_mla.py", + "sha256": "ac89e0ad75a37e92566d264bafe324735a80f9ab4709241a4454d17b3d38bb63" + }, + "vllm/v1/attention/backends/mla/flashattn_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashattn_mla_sparse.py", + "sha256": "67dd3ead2e8b9d8cda0825ecc93779cb7d670628bc741c759a7d3cd5d474030f" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla.py", + "sha256": "0c24ff016fb6b0bb41d9e7484b6f1af42f37bcc384ed613473fc3e01ad25f664" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse.py", + "sha256": "2116d965b2067134d8afa5878d4d16c0149b061258f50c4106d993aa13b073cc" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm120.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm120.py", + "sha256": "102ca08793d567f95598eefeb34c3f6ec50b3b9d704f162d1402b97b12b5777b" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm90.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm90.py", + "sha256": "df9fe4970aa3f53cf24784b8534b89e0101a2ca20a35a2ebbc9a12a4463d5993" + }, + "vllm/v1/attention/backends/mla/flashmla.py": { + "path": "/vllm/v1/attention/backends/mla/flashmla.py", + "sha256": "c9d8046a853ecbdeff9ebfc738f5bb34c4f272b278231a09a0fbf73708c7c188" + }, + "vllm/v1/attention/backends/mla/flashmla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashmla_sparse.py", + "sha256": "7a379c717adb9667ce94cbc16c0e3a1fb22a169713db6d7941c141fa84077b3f" + }, + "vllm/v1/attention/backends/mla/index_group.py": { + "path": "/vllm/v1/attention/backends/mla/index_group.py", + "sha256": "c24e028c3c160a9bb92e043da5b5b34c805e84745b7c4b8da6fb8702a0ddd641" + }, + "vllm/v1/attention/backends/mla/indexer.py": { + "path": "/vllm/v1/attention/backends/mla/indexer.py", + "sha256": "2acbc1c4fa57c3424ad95e6ecbe76eb7141747773c3e867ce704f4adccba892a" + }, + "vllm/v1/attention/backends/mla/prefill/__init__.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/__init__.py", + "sha256": "903630eb705dd175bf4ae4558a4bcaa07c110056b6a11eb830fdd2fb21b3c48a" + }, + "vllm/v1/attention/backends/mla/prefill/aiter_flash_attn.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/aiter_flash_attn.py", + "sha256": "571b8a9910c4ea3fefda60659026f3bf0d7b542c34553c8c9a4d43bb82077e61" + }, + "vllm/v1/attention/backends/mla/prefill/base.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/base.py", + "sha256": "138bf3ddaf5a94c3cdbc4e08ac676edcae84b32fc76625e546f3b47f7d8b82ec" + }, + "vllm/v1/attention/backends/mla/prefill/cpu_sdpa.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/cpu_sdpa.py", + "sha256": "1bb686395274a8ec0d9fd7327410a527655fe060cbbc263eab138fea988d96de" + }, + "vllm/v1/attention/backends/mla/prefill/flash_attn.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/flash_attn.py", + "sha256": "5e648c82c82e5f81fe11458eb82b9f90b50fc06df2ade3bf111ee6b7a2ee8481" + }, + "vllm/v1/attention/backends/mla/prefill/flashinfer.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/flashinfer.py", + "sha256": "63861219c35b8abc0ebe01e1f51543c5ed40bd46119ca261d927da7c6826b49b" + }, + "vllm/v1/attention/backends/mla/prefill/registry.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/registry.py", + "sha256": "c8c30b92213d594beaa3cab4d5003da26a85870dbb11d1ab73191962d0645b53" + }, + "vllm/v1/attention/backends/mla/prefill/selector.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/selector.py", + "sha256": "101d9fca7924b0c5d7891a17fe8942611bd6759e32b03a571dc87b14c1430f2f" + }, + "vllm/v1/attention/backends/mla/prefill/tokenspeed_mla.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/tokenspeed_mla.py", + "sha256": "047cf07bfcc83db3b11a6a54ffe189f6146e6ec9ad33ce2fa7d18860bf4210f0" + }, + "vllm/v1/attention/backends/mla/prefill/trtllm_ragged.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/trtllm_ragged.py", + "sha256": "9e13ea6f6a25accedd918c0de64bbb812ccb20ffb95350ab018a6e76d493789b" + }, + "vllm/v1/attention/backends/mla/rocm_aiter_mla.py": { + "path": "/vllm/v1/attention/backends/mla/rocm_aiter_mla.py", + "sha256": "b489f5830c655bfb6299801a70d69b9821513c69568ecab3689db5a7be867be5" + }, + "vllm/v1/attention/backends/mla/rocm_aiter_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/rocm_aiter_mla_sparse.py", + "sha256": "91b1d9b3d860a9720bc01b8ebe9bbe8649a7d6bca20d4b63939bc100309bca19" + }, + "vllm/v1/attention/backends/mla/sparse_swa.py": { + "path": "/vllm/v1/attention/backends/mla/sparse_swa.py", + "sha256": "a47853ad8a3fe40f24704592581ea323a18041b84610df010a5534da634e311e" + }, + "vllm/v1/attention/backends/mla/sparse_utils.py": { + "path": "/vllm/v1/attention/backends/mla/sparse_utils.py", + "sha256": "c3cdf060288c05542243a9fe8b5ad3a963ad75e9ce399009b5e45c1235a88ce4" + }, + "vllm/v1/attention/backends/mla/tokenspeed_mla.py": { + "path": "/vllm/v1/attention/backends/mla/tokenspeed_mla.py", + "sha256": "b9ba523c606430cecb99a88b28c53d98a99dcf5e76105a80664338110a20f1ad" + }, + "vllm/v1/attention/backends/mla/triton_mla.py": { + "path": "/vllm/v1/attention/backends/mla/triton_mla.py", + "sha256": "21b16b3b34470edcc33d0423e560837c1d37d4bab31c7b3b9cfd7faa47864b51" + }, + "vllm/v1/attention/backends/mla/xpu_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/xpu_mla_sparse.py", + "sha256": "559c6240fe466521a6b2df4c94aea02ddf3f5efa5ba6954fa180c5a51c0f12d2" + }, + "vllm/v1/attention/backends/recoverssm_metadata.py": { + "path": "/vllm/v1/attention/backends/recoverssm_metadata.py", + "sha256": "02896a667db0f0308371ceb50048b18e5866c0235d163c0357e9a05dcedb3394" + }, + "vllm/v1/attention/backends/registry.py": { + "path": "/vllm/v1/attention/backends/registry.py", + "sha256": "378e8ee78734bd8c8adbe287d4c0a4058dcbb553195a09fbcce00a3cc30adc29" + }, + "vllm/v1/attention/backends/rocm_aiter_fa.py": { + "path": "/vllm/v1/attention/backends/rocm_aiter_fa.py", + "sha256": "d1418af03bf58209c850f466b712d3ea22a14ebb758c42dd43e65738281841fd" + }, + "vllm/v1/attention/backends/rocm_aiter_unified_attn.py": { + "path": "/vllm/v1/attention/backends/rocm_aiter_unified_attn.py", + "sha256": "59d2645eb4c91dc0567754a7163d066f4f2faf48f1957b254fcdd5604e9d8c8c" + }, + "vllm/v1/attention/backends/rocm_attn.py": { + "path": "/vllm/v1/attention/backends/rocm_attn.py", + "sha256": "4a8f57067073fbceb784af6c3467487c450d00fa3957928fadb99a79f6036292" + }, + "vllm/v1/attention/backends/short_conv_attn.py": { + "path": "/vllm/v1/attention/backends/short_conv_attn.py", + "sha256": "84fc460ef2fbd09743b069bec0c14b39542af6c2254a403e37a048427e151121" + }, + "vllm/v1/attention/backends/triton_attn.py": { + "path": "/vllm/v1/attention/backends/triton_attn.py", + "sha256": "1057663d110e1d5229495a799027b27277c1eca325d5b6780fa2259afbf58a1a" + }, + "vllm/v1/attention/backends/triton_attn_diffkv.py": { + "path": "/vllm/v1/attention/backends/triton_attn_diffkv.py", + "sha256": "de0357eae005246642140f1ab8842ba5ed8bff5c84b18a6d3a7bbf409c578301" + }, + "vllm/v1/attention/backends/triton_flash_attn.py": { + "path": "/vllm/v1/attention/backends/triton_flash_attn.py", + "sha256": "176e45329aeb28a2008362bb607d1b8c89816eb665859ab908b0385a11acf1c2" + }, + "vllm/v1/attention/backends/triton_flashinfer.py": { + "path": "/vllm/v1/attention/backends/triton_flashinfer.py", + "sha256": "48d5f967e388d4e8d6bbec8d827b44d855346bc2fada28adf65768bf6623527b" + }, + "vllm/v1/attention/backends/turboquant_attn.py": { + "path": "/vllm/v1/attention/backends/turboquant_attn.py", + "sha256": "616d16d608d9d1fbf6c29548037e7e9cf330f4d36a01aa3ffabf42a731eb6e2b" + }, + "vllm/v1/attention/backends/utils.py": { + "path": "/vllm/v1/attention/backends/utils.py", + "sha256": "fbc221360d2d54cb21ef3f625dc8711500de345a355801548b4337bb9b8abee0" + }, + "vllm/v1/attention/ops/__init__.py": { + "path": "/vllm/v1/attention/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/ops/chunked_prefill_paged_decode.py": { + "path": "/vllm/v1/attention/ops/chunked_prefill_paged_decode.py", + "sha256": "973db848a790b2e8d99e728b2fc4f44b501bbe58c62747244ddff04cfcf11a85" + }, + "vllm/v1/attention/ops/common.py": { + "path": "/vllm/v1/attention/ops/common.py", + "sha256": "b4b67e7fc0cce471e337d742c097fba06da7563816e8799e27719714e31e1d5b" + }, + "vllm/v1/attention/ops/cp_common.py": { + "path": "/vllm/v1/attention/ops/cp_common.py", + "sha256": "2369181862e96db64b14ef20c5c2e249ed2ea5f3dea2467a2aa388372bb86d9d" + }, + "vllm/v1/attention/ops/dcp.py": { + "path": "/vllm/v1/attention/ops/dcp.py", + "sha256": "a478bdc781460f0582cfaf74d6431f1a826c201f02f39d882d12a96139bc3f28" + }, + "vllm/v1/attention/ops/flashmla.py": { + "path": "/vllm/v1/attention/ops/flashmla.py", + "sha256": "8a40d6e120e3ab25a95fcfeb32b0b5b4c1ea02b984633866628536dcd26ed2e8" + }, + "vllm/v1/attention/ops/flydsl_kernels/__init__.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/attention/ops/flydsl_kernels/tq_decode.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/tq_decode.py", + "sha256": "cc4b7f82897596e0974b3d3a710a1a8bc58c3d22b72cc7f461dd1c4acd2e451b" + }, + "vllm/v1/attention/ops/flydsl_kernels/tq_decode_gqa6.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/tq_decode_gqa6.py", + "sha256": "a983f6d375c325900955e11696dab1e2665770e83f84d51f93d3ed5e1d8880e0" + }, + "vllm/v1/attention/ops/flydsl_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/flydsl_turboquant_decode.py", + "sha256": "7b1dd0ef7c7fb28a6a8831759e00b939ab844d067657155cc11cf75532a22c63" + }, + "vllm/v1/attention/ops/int4_per_token_head.py": { + "path": "/vllm/v1/attention/ops/int4_per_token_head.py", + "sha256": "d91968f280cd8eaed7570ab255f0276b40e833e18a25066d371d9ca8149425f2" + }, + "vllm/v1/attention/ops/merge_attn_states.py": { + "path": "/vllm/v1/attention/ops/merge_attn_states.py", + "sha256": "ad08403d2843fc892f0b0b4b9f5fabb81884556f89f7170dca46ccef498a3539" + }, + "vllm/v1/attention/ops/metadata.py": { + "path": "/vllm/v1/attention/ops/metadata.py", + "sha256": "ca882b84c5aaefb1f77e4d8ea09a00103fbc53defa8671bba036c961c17fc760" + }, + "vllm/v1/attention/ops/paged_attn.py": { + "path": "/vllm/v1/attention/ops/paged_attn.py", + "sha256": "016a95f892ec751c86b37be1e12171bad9f0b4076bbf2219ff336f4e9c503653" + }, + "vllm/v1/attention/ops/pcp.py": { + "path": "/vllm/v1/attention/ops/pcp.py", + "sha256": "dadeff95fe2df2be8028baabeef01b0d2d628cd67de2176915e737ce096de3dd" + }, + "vllm/v1/attention/ops/prefix_prefill.py": { + "path": "/vllm/v1/attention/ops/prefix_prefill.py", + "sha256": "b08ad92db715fc03c11699de3de463d55e411f42f77548e06b41049a61de692f" + }, + "vllm/v1/attention/ops/rocm_aiter_mla_merge.py": { + "path": "/vllm/v1/attention/ops/rocm_aiter_mla_merge.py", + "sha256": "564c66e4877732e48a6f7d52405c43dc952eec0f0ae4353d34886bca056132b9" + }, + "vllm/v1/attention/ops/rocm_aiter_mla_sparse.py": { + "path": "/vllm/v1/attention/ops/rocm_aiter_mla_sparse.py", + "sha256": "feec664be5045fd1ba13b8f6ef83b52c96910ddc78baca0431bcf610c9e8f5cc" + }, + "vllm/v1/attention/ops/triton_attention_helpers.py": { + "path": "/vllm/v1/attention/ops/triton_attention_helpers.py", + "sha256": "35aa993d01345f535d2641cf9dcabb8b64c51b20a19707bc5987e616aaa87ddd" + }, + "vllm/v1/attention/ops/triton_decode_attention.py": { + "path": "/vllm/v1/attention/ops/triton_decode_attention.py", + "sha256": "b9823c65eba22d76abf64dad7d7d16a950f67471c86d6cb5b3e983aaf14381ac" + }, + "vllm/v1/attention/ops/triton_merge_attn_states.py": { + "path": "/vllm/v1/attention/ops/triton_merge_attn_states.py", + "sha256": "f63229162181ab93198550b73a115f1cc1034cfd60e6f58bc8ab3e22a6e8ce60" + }, + "vllm/v1/attention/ops/triton_prefill_attention.py": { + "path": "/vllm/v1/attention/ops/triton_prefill_attention.py", + "sha256": "352c1a4ac86146580040579fb217c2e288268830d6602b735713e154f36d74fe" + }, + "vllm/v1/attention/ops/triton_reshape_and_cache_flash.py": { + "path": "/vllm/v1/attention/ops/triton_reshape_and_cache_flash.py", + "sha256": "6cac51475b8c656992a21b2d150acd3a16a95a7ab7d49aab151a3ef13c24b80d" + }, + "vllm/v1/attention/ops/triton_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/triton_turboquant_decode.py", + "sha256": "8e52678136449e4bbca2195fbcbb87426c955a2b1b8422e7ab9511e45ee5f5c6" + }, + "vllm/v1/attention/ops/triton_turboquant_store.py": { + "path": "/vllm/v1/attention/ops/triton_turboquant_store.py", + "sha256": "6e6e2fe74a307d40f0be786ccbaea76d989e3c7b5985f3144a5218c61bf6d902" + }, + "vllm/v1/attention/ops/triton_unified_attention.py": { + "path": "/vllm/v1/attention/ops/triton_unified_attention.py", + "sha256": "65d0fbcf33d00789df8ca688c0a1c908e710cfaef53471178747ecae11f05829" + }, + "vllm/v1/attention/ops/triton_unified_attention_diffkv.py": { + "path": "/vllm/v1/attention/ops/triton_unified_attention_diffkv.py", + "sha256": "7fa36d7b7441f1c396e0348eac61d691d2e459e5c4c393c4aa262dfb670e68f7" + }, + "vllm/v1/attention/ops/turboquant_soa/__init__.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/__init__.py", + "sha256": "6b43b6fcb2a71c44ceff4ed1edd417a839f4901251ba15831b09ad979baa4984" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode.py", + "sha256": "bf00634191bba14cbf4a23c1d67dc3dcb244c2b8989f08362757b54435830986" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode_v2.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode_v2.py", + "sha256": "28e7ecc15c450d3591983a50c46a03aa6ca6fa99304c17c333940617d9916485" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_store.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_store.py", + "sha256": "dccf93b9fdd34f9b9eacd468e9de35b9d93378594487c335cf50642aaec681f2" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_unified_attention.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_unified_attention.py", + "sha256": "b4b2b5f3985b3a6126fd052e6ec1ed91c610da8a525a9ae7470ac829405bd85c" + }, + "vllm/v1/attention/ops/vit_attn_wrappers.py": { + "path": "/vllm/v1/attention/ops/vit_attn_wrappers.py", + "sha256": "a99d57b58269c7521fa5d7d47af06551f3bab2b5c7358ef78165a7f6e20a92a6" + }, + "vllm/v1/attention/ops/xpu_mla_sparse.py": { + "path": "/vllm/v1/attention/ops/xpu_mla_sparse.py", + "sha256": "d98d17110577c2b7b4d05e07bfdae15faf83321b6342a5daaaecce45b9503f38" + }, + "vllm/v1/attention/selector.py": { + "path": "/vllm/v1/attention/selector.py", + "sha256": "87f653ded7974875183c920e3e4589c28116bcbc99714d1da7cb51ae77c0b182" + }, + "vllm/v1/core/sched/__init__.py": { + "path": "/vllm/v1/core/sched/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/core/sched/async_scheduler.py": { + "path": "/vllm/v1/core/sched/async_scheduler.py", + "sha256": "e586a0ef3c6778be56a93e7f9bb712d4de9de6e7d7fe7e3e1d51dae83ecfc508" + }, + "vllm/v1/core/sched/interface.py": { + "path": "/vllm/v1/core/sched/interface.py", + "sha256": "be6c008664096c5660a8879de72b315bbe479bf1d688be9b25891063ec53a367" + }, + "vllm/v1/core/sched/output.py": { + "path": "/vllm/v1/core/sched/output.py", + "sha256": "3a66c8efaefe10c572f6f33cf1f8aa4610758c945130cad62eb9f7331005677c" + }, + "vllm/v1/core/sched/request_queue.py": { + "path": "/vllm/v1/core/sched/request_queue.py", + "sha256": "4b8d938e5fb8152fe61030b8aa991f983fcac9a405c37ed8908045e05e82ae5e" + }, + "vllm/v1/core/sched/scheduler.py": { + "path": "/vllm/v1/core/sched/scheduler.py", + "sha256": "c1db45f3bbad3a875dd8638331b8870c4380ac1ab4734265ba5c863833a82884" + }, + "vllm/v1/core/sched/utils.py": { + "path": "/vllm/v1/core/sched/utils.py", + "sha256": "1ed988044eb8028c77ede875bd1a5fd05ff6998b455d61e3997d6a3d7fc1c3a7" + }, + "vllm/v1/sample/__init__.py": { + "path": "/vllm/v1/sample/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/sample/logits_processor/__init__.py": { + "path": "/vllm/v1/sample/logits_processor/__init__.py", + "sha256": "1f9b02dae8cf6d44484638037123d3a2dec6b7b9a2bcc9afceef1a9bf3eaedec" + }, + "vllm/v1/sample/logits_processor/builtin.py": { + "path": "/vllm/v1/sample/logits_processor/builtin.py", + "sha256": "6105816ece77e5b1dbee0d07abc90ce039d650bac2ddb85c93280c48b00f2ebe" + }, + "vllm/v1/sample/logits_processor/interface.py": { + "path": "/vllm/v1/sample/logits_processor/interface.py", + "sha256": "171dfc6ef9b5b53128e8eaecc4bdf1de413a706d64bf5be686048f583c66eee1" + }, + "vllm/v1/sample/logits_processor/state.py": { + "path": "/vllm/v1/sample/logits_processor/state.py", + "sha256": "a96411f14362c45f839e181dcb3ac01d5b880812bccb3552fc17863b219f44ac" + }, + "vllm/v1/sample/metadata.py": { + "path": "/vllm/v1/sample/metadata.py", + "sha256": "6582cfe1a240c7ddb975f0ef6dd7dcd28dcf0fc7670394390250013977aa7ffd" + }, + "vllm/v1/sample/ops/__init__.py": { + "path": "/vllm/v1/sample/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/sample/ops/bad_words.py": { + "path": "/vllm/v1/sample/ops/bad_words.py", + "sha256": "0b1d0a9b13b92ddcae2c83393c07a34c0f107813725700dee794caa7fe7f3b12" + }, + "vllm/v1/sample/ops/logprobs.py": { + "path": "/vllm/v1/sample/ops/logprobs.py", + "sha256": "b286f69012a6758bfe9250038b0697294dbffe0d32c6906f284c39f75ee48be3" + }, + "vllm/v1/sample/ops/penalties.py": { + "path": "/vllm/v1/sample/ops/penalties.py", + "sha256": "4debfcf247b3887478d2b9ec98f108756bbed2805462777ef6b56f3bdf4ce682" + }, + "vllm/v1/sample/ops/topk_topp_sampler.py": { + "path": "/vllm/v1/sample/ops/topk_topp_sampler.py", + "sha256": "13ea4359832bc914492330958ec4f5ac140f408b8f410cc05c6eaf7ddcd70be4" + }, + "vllm/v1/sample/ops/topk_topp_triton.py": { + "path": "/vllm/v1/sample/ops/topk_topp_triton.py", + "sha256": "0b5fc337058e22bc28a8530ccec904d6ccd89b9548b02955c657ac429b1669d2" + }, + "vllm/v1/sample/rejection_sampler.py": { + "path": "/vllm/v1/sample/rejection_sampler.py", + "sha256": "0bb9d224887ccb1355e16199005cc23a4afc6fa75156eca419851b7247d99750" + }, + "vllm/v1/sample/sampler.py": { + "path": "/vllm/v1/sample/sampler.py", + "sha256": "f95805b2c6d06218c724826aa5f881a606e8d0a534a566aee7c85948520dd216" + }, + "vllm/v1/sample/thinking_budget_state.py": { + "path": "/vllm/v1/sample/thinking_budget_state.py", + "sha256": "962f8f55210eb0a431cb9c78b013e35f7a7dd58d06d6fb2e7fcff1b457356f8e" + }, + "vllm/v1/worker/__init__.py": { + "path": "/vllm/v1/worker/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/block_table.py": { + "path": "/vllm/v1/worker/block_table.py", + "sha256": "a09b8819e1417b7a186cf3472224e2138fc5d41a291c6692bb7df711b0c44259" + }, + "vllm/v1/worker/cp_utils.py": { + "path": "/vllm/v1/worker/cp_utils.py", + "sha256": "e32625d83a641b8dd8df82e92d1b6fb20af0cdf2e8fbd2fb131aa3c215415448" + }, + "vllm/v1/worker/cpu/__init__.py": { + "path": "/vllm/v1/worker/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/cpu/buffer_utils.py": { + "path": "/vllm/v1/worker/cpu/buffer_utils.py", + "sha256": "e7313fd8c2c76ebfb98d2fa53008bc9691d0f83a7d7c05e87602b5a29fb79e04" + }, + "vllm/v1/worker/cpu/model_runner.py": { + "path": "/vllm/v1/worker/cpu/model_runner.py", + "sha256": "24a1c916550051327dd5893243a6d4200f3824b91b3af8aa6f6c793fd7c68c3e" + }, + "vllm/v1/worker/cpu/shm.py": { + "path": "/vllm/v1/worker/cpu/shm.py", + "sha256": "08491af8ad341399d1375f2d21ad00414d4c89b0a5c03f55de8704914bbfcbd9" + }, + "vllm/v1/worker/cpu_model_runner.py": { + "path": "/vllm/v1/worker/cpu_model_runner.py", + "sha256": "92111aba92f00571f1a3c4c6e43cf1da6ccb4d2afac2f4d5abc018a4a6e7e8bd" + }, + "vllm/v1/worker/cpu_worker.py": { + "path": "/vllm/v1/worker/cpu_worker.py", + "sha256": "a8051b9e510ef0af9cc34004f2cbe5c0f902bd0cebc32c9464e744344dfdf849" + }, + "vllm/v1/worker/dp_utils.py": { + "path": "/vllm/v1/worker/dp_utils.py", + "sha256": "8cd19f1bfbc5c4f6ec60df89aea7c8a19b400ebc264f372b103014152e92158c" + }, + "vllm/v1/worker/ec_connector_model_runner_mixin.py": { + "path": "/vllm/v1/worker/ec_connector_model_runner_mixin.py", + "sha256": "fe9b11cebb8562f1bfe98b98a5647b2b081a6e424cb60d4ffe2412c91a99215e" + }, + "vllm/v1/worker/encoder_cudagraph.py": { + "path": "/vllm/v1/worker/encoder_cudagraph.py", + "sha256": "6a08d3779bca1b47dbf9daf6eafe2d3c70dbcb8aeb7d63ba7efacc68241ee3bc" + }, + "vllm/v1/worker/encoder_cudagraph_defs.py": { + "path": "/vllm/v1/worker/encoder_cudagraph_defs.py", + "sha256": "bb7be050fcaa8868e7816c84caec875da57050d65fe7eaf00f3d41473df25e3a" + }, + "vllm/v1/worker/gpu/__init__.py": { + "path": "/vllm/v1/worker/gpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/async_utils.py": { + "path": "/vllm/v1/worker/gpu/async_utils.py", + "sha256": "77e17a4570ead2be30ae9b00888cf077a3b873018c12ca0549b853bfda02c1ba" + }, + "vllm/v1/worker/gpu/attn_utils.py": { + "path": "/vllm/v1/worker/gpu/attn_utils.py", + "sha256": "b9b81e59dda2720b1f9c434471381f879228832443e52756e469b4ad4905888f" + }, + "vllm/v1/worker/gpu/block_table.py": { + "path": "/vllm/v1/worker/gpu/block_table.py", + "sha256": "61c004315d5af7e7eae4e2a9e6be92ea82c520327690a7f55a73bb9ce95f520a" + }, + "vllm/v1/worker/gpu/buffer_utils.py": { + "path": "/vllm/v1/worker/gpu/buffer_utils.py", + "sha256": "6597f701a30261bf250e9ad5a29737264624a1caa20527aeea0dad630325b093" + }, + "vllm/v1/worker/gpu/cp_utils.py": { + "path": "/vllm/v1/worker/gpu/cp_utils.py", + "sha256": "456c1bb7e262d99ff555522a4f134e5a9b42aee23290be25455eaef36ee8eaaf" + }, + "vllm/v1/worker/gpu/cudagraph_utils.py": { + "path": "/vllm/v1/worker/gpu/cudagraph_utils.py", + "sha256": "6e9c042890603535e300a40df8ee159dbed1058a64a83ae50ff0329e332e05ff" + }, + "vllm/v1/worker/gpu/dp_utils.py": { + "path": "/vllm/v1/worker/gpu/dp_utils.py", + "sha256": "e26867bc89e6bfc933cabc5ed13e5dc7b8d2d3030118ca1ca64c8785dabc0fc1" + }, + "vllm/v1/worker/gpu/ec_connector.py": { + "path": "/vllm/v1/worker/gpu/ec_connector.py", + "sha256": "2afe6e641f4ae3eb3b8da336c74eaa7479bf617b27cfb39a1fcbe487686f0a08" + }, + "vllm/v1/worker/gpu/eplb_utils.py": { + "path": "/vllm/v1/worker/gpu/eplb_utils.py", + "sha256": "1829fac11464aed4649179b302df198de51b95d0589f4e56bea305a876a63e26" + }, + "vllm/v1/worker/gpu/input_batch.py": { + "path": "/vllm/v1/worker/gpu/input_batch.py", + "sha256": "d5dd956eb319bd69dd9e762047833d81ad40b21fce619fcb2133759e73620694" + }, + "vllm/v1/worker/gpu/kv_connector.py": { + "path": "/vllm/v1/worker/gpu/kv_connector.py", + "sha256": "b89a4333f1e552d86e1815674b59e9f1335f0f49c0a7b46082439076f62c6a81" + }, + "vllm/v1/worker/gpu/lora_utils.py": { + "path": "/vllm/v1/worker/gpu/lora_utils.py", + "sha256": "1e90eddd9ddb4ca55e574bb28e87ae3a6f6750175a62d373102426543f4ccd66" + }, + "vllm/v1/worker/gpu/metrics/__init__.py": { + "path": "/vllm/v1/worker/gpu/metrics/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/metrics/logits.py": { + "path": "/vllm/v1/worker/gpu/metrics/logits.py", + "sha256": "ea058d7510a077a55f8ac7e4c3d596508346244e908cb372865d7159f62edc89" + }, + "vllm/v1/worker/gpu/mm/__init__.py": { + "path": "/vllm/v1/worker/gpu/mm/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/mm/encoder_cache.py": { + "path": "/vllm/v1/worker/gpu/mm/encoder_cache.py", + "sha256": "89c500338fddbeee7c4fca978a3a7c4c566a03e848e399d303fbee3c80631cd2" + }, + "vllm/v1/worker/gpu/mm/encoder_runner.py": { + "path": "/vllm/v1/worker/gpu/mm/encoder_runner.py", + "sha256": "0981e352d70301b7154a217a48665ffe35f215d053ec5740c2515a3e1e11b4e6" + }, + "vllm/v1/worker/gpu/mm/lora.py": { + "path": "/vllm/v1/worker/gpu/mm/lora.py", + "sha256": "a3eddfad6ad64de276964240c28dc080888df4a56dd5eac18f89428f2cbb7a01" + }, + "vllm/v1/worker/gpu/mm/rope.py": { + "path": "/vllm/v1/worker/gpu/mm/rope.py", + "sha256": "0924375bcb367267e783b57dd2ad9de1189d97025ce4313baaa54f2911eaaf1e" + }, + "vllm/v1/worker/gpu/model_runner.py": { + "path": "/vllm/v1/worker/gpu/model_runner.py", + "sha256": "174c93db921c23cf0396eee4764be25b2bd2d4b6a06e9fa41ce3598b884ce8ce" + }, + "vllm/v1/worker/gpu/model_states/__init__.py": { + "path": "/vllm/v1/worker/gpu/model_states/__init__.py", + "sha256": "07815d0b788fc88185772f581bbf892a675259f9288375571f29887622f8d93c" + }, + "vllm/v1/worker/gpu/model_states/default.py": { + "path": "/vllm/v1/worker/gpu/model_states/default.py", + "sha256": "bb614f814780f052e869f9acf31dfbfa68718ee7dc6252eefa901b5730ee8a2a" + }, + "vllm/v1/worker/gpu/model_states/encoder_decoder.py": { + "path": "/vllm/v1/worker/gpu/model_states/encoder_decoder.py", + "sha256": "a5868059d8af672548b41d0e623e884320e6ed61e6aaca2d2828ff5be0356f2f" + }, + "vllm/v1/worker/gpu/model_states/encoder_only.py": { + "path": "/vllm/v1/worker/gpu/model_states/encoder_only.py", + "sha256": "84e96b55a2639e2a73fa4a0308acc89c8d053dc715481180b237e0196dcef99f" + }, + "vllm/v1/worker/gpu/model_states/interface.py": { + "path": "/vllm/v1/worker/gpu/model_states/interface.py", + "sha256": "5675b6fedc7403a9ab410b1e5565974e78fac23c42ab4253ae1da52d6e09b594" + }, + "vllm/v1/worker/gpu/model_states/mamba_hybrid.py": { + "path": "/vllm/v1/worker/gpu/model_states/mamba_hybrid.py", + "sha256": "573e130ac5587d4822fabf97adad1ad0fda02ff83c5e70df879a5bb175ae845c" + }, + "vllm/v1/worker/gpu/model_states/mm_pruning.py": { + "path": "/vllm/v1/worker/gpu/model_states/mm_pruning.py", + "sha256": "b150940b12ae76048f050a8eeb54d532bbdc530a18ffbf320ddeeb0cfaa90f93" + }, + "vllm/v1/worker/gpu/model_states/prompt_embeds.py": { + "path": "/vllm/v1/worker/gpu/model_states/prompt_embeds.py", + "sha256": "11f9e270925c2df6a505557605ac2b859bb145cf3420b0111e7482a1c544f9b1" + }, + "vllm/v1/worker/gpu/model_states/recoverssm.py": { + "path": "/vllm/v1/worker/gpu/model_states/recoverssm.py", + "sha256": "b4b660e62eaf33f4fe8271f83ed1fb6de6bc08f800a8073b27803e42fb29a645" + }, + "vllm/v1/worker/gpu/pcp_manager.py": { + "path": "/vllm/v1/worker/gpu/pcp_manager.py", + "sha256": "2d80df0ed5b18a2069f9d0689cb59923ffe324ba200fcafe242da23da3a6ddaa" + }, + "vllm/v1/worker/gpu/pool/__init__.py": { + "path": "/vllm/v1/worker/gpu/pool/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/pool/pooling_runner.py": { + "path": "/vllm/v1/worker/gpu/pool/pooling_runner.py", + "sha256": "f8463f7648cce0f3f29418a4d9fee61634ead760957cf236d06d61cf8cd986e7" + }, + "vllm/v1/worker/gpu/pp_utils.py": { + "path": "/vllm/v1/worker/gpu/pp_utils.py", + "sha256": "dadeef0bebf61d0ad44a28d06372208ec4e6389224d6017f412683b026bdbb5c" + }, + "vllm/v1/worker/gpu/sample/__init__.py": { + "path": "/vllm/v1/worker/gpu/sample/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/sample/bad_words.py": { + "path": "/vllm/v1/worker/gpu/sample/bad_words.py", + "sha256": "8d3cbd5613398260314d94739d8ee0e1ac0c22abf2f960f541d3c0d4e39d360b" + }, + "vllm/v1/worker/gpu/sample/batch_shard.py": { + "path": "/vllm/v1/worker/gpu/sample/batch_shard.py", + "sha256": "c30274a3a04e6a03e89be9cd7c62de602b1aba4d412f64540ab6201036de3928" + }, + "vllm/v1/worker/gpu/sample/gumbel.py": { + "path": "/vllm/v1/worker/gpu/sample/gumbel.py", + "sha256": "3ec1df510bdad13e8b0a457b5b67c98affdf6e57369e56cb471246cc8f40dd34" + }, + "vllm/v1/worker/gpu/sample/logit_bias.py": { + "path": "/vllm/v1/worker/gpu/sample/logit_bias.py", + "sha256": "9e80a3fe6f3c7474723408cfff52183f4585fdeedd9c2312843ee98d0b12724c" + }, + "vllm/v1/worker/gpu/sample/logprob.py": { + "path": "/vllm/v1/worker/gpu/sample/logprob.py", + "sha256": "f47479a818192acb6b297c79fa67a3b2f9820e3492a394d5adda777e9b7c832e" + }, + "vllm/v1/worker/gpu/sample/min_p.py": { + "path": "/vllm/v1/worker/gpu/sample/min_p.py", + "sha256": "4cb5e2f45e1ced6f9685283a7a5c8cfd7204d9a249822e866cfff756c7f04f62" + }, + "vllm/v1/worker/gpu/sample/output.py": { + "path": "/vllm/v1/worker/gpu/sample/output.py", + "sha256": "d6e298c0f197d487a8faaf7200f500fa83df1d7a4bbf4339cadd6a18008f7f9c" + }, + "vllm/v1/worker/gpu/sample/penalties.py": { + "path": "/vllm/v1/worker/gpu/sample/penalties.py", + "sha256": "46c29434caf5f415129ef4a9bb2b8d4f62d2765596e3e07f73ad2b198c7def1b" + }, + "vllm/v1/worker/gpu/sample/prompt_logprob.py": { + "path": "/vllm/v1/worker/gpu/sample/prompt_logprob.py", + "sha256": "4cf22d390e7bf59e44c458cff7180268db63e95d06af2f1e14d720a2d77c9663" + }, + "vllm/v1/worker/gpu/sample/sampler.py": { + "path": "/vllm/v1/worker/gpu/sample/sampler.py", + "sha256": "832c9945d201a1e730ff9b4b52076aa83bd4a5064e1e4cfea952cf84d4a8d1f0" + }, + "vllm/v1/worker/gpu/sample/states.py": { + "path": "/vllm/v1/worker/gpu/sample/states.py", + "sha256": "4e3671f93695ba5a48fad7d2d13beb231ac8741034904ed5a15d9f7b9b86662e" + }, + "vllm/v1/worker/gpu/sample/thinking_budget.py": { + "path": "/vllm/v1/worker/gpu/sample/thinking_budget.py", + "sha256": "020513e1d3406f367de6ad995a95055008fd0c28f2873647e8283c9870e22404" + }, + "vllm/v1/worker/gpu/sample/trace_replay.py": { + "path": "/vllm/v1/worker/gpu/sample/trace_replay.py", + "sha256": "d2a7d3b3b55379efabe4740a4b7f14030126dc11be36f6ea974164ce42316a50" + }, + "vllm/v1/worker/gpu/sample/watermark.py": { + "path": "/vllm/v1/worker/gpu/sample/watermark.py", + "sha256": "a3581458169dab9153eb09fd67218e0ee5585406537a9de80ad528ae62b030c0" + }, + "vllm/v1/worker/gpu/shutdown.py": { + "path": "/vllm/v1/worker/gpu/shutdown.py", + "sha256": "bb470f14b17c7e52571ef8938b2a9527e7c2846852ae8a3a94b69cd1c30aa4b1" + }, + "vllm/v1/worker/gpu/spec_decode/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/__init__.py", + "sha256": "1f1f84bfe6f4f5af3a7e21a7a8716ecf7b9013da1d03327668a3ee36afc24c32" + }, + "vllm/v1/worker/gpu/spec_decode/acceptance_estimator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/acceptance_estimator.py", + "sha256": "505b843bdd75928b03793b395b47b8be914bd7fe2a3351c8ec04339baeebb1c2" + }, + "vllm/v1/worker/gpu/spec_decode/adaptive_verification.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/adaptive_verification.py", + "sha256": "276b2fec56758a94c71b717f6786b8a6f126db2e20cf964350202feee61a0a39" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py", + "sha256": "13392ef0a9ed59eb9c2b2bad43d7c61beb212a8805849e46b5130c230275d0a5" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/speculator.py", + "sha256": "5b97f54e20ddf65b98e939832d050745f67ef43cfa145786da300f1a8322e3c6" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/cudagraph.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/cudagraph.py", + "sha256": "beab567ae2df6a2ba2cd92fe7ee452c6b959b8a7037a4b5f493993a1824619bb" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/speculator.py", + "sha256": "f9c100f42f9326e48eb84e89281897e859ba761943f54d593523555ccd98dc63" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/utils.py", + "sha256": "53d2c3ad474d290d2c6df027446bbd80ac7447684e5242ab2c3c5337d2abd383" + }, + "vllm/v1/worker/gpu/spec_decode/dflash2/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash2/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/dflash2/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash2/speculator.py", + "sha256": "b70043550938a1df9aecc85d8c8224c38c929ca34f68834572f6e723854d2027" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/speculator.py", + "sha256": "dcf4abdedbd2bddd0d76be198ccf5b4e467c46f645038c35fcab821491a35b03" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/utils.py", + "sha256": "86af2bf30604a184312e8f076097b91ecfec704f409f9d68d634b03d6b318070" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/eagle3_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/eagle3_utils.py", + "sha256": "201ee875fcc3d076a8fc1f3876dcbf85736b221a368555243a8987ff26a1674e" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/speculator.py", + "sha256": "746e318a4f266d75522ff7f3731ea9b4527b7b4824f71364d1a62184ea1f7b3d" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/utils.py", + "sha256": "94de6f55a1761f24f4aa1388cbc3b3763d4ab3ee53260330056ad31ce0b78236" + }, + "vllm/v1/worker/gpu/spec_decode/extract_hidden_states.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/extract_hidden_states.py", + "sha256": "93c4233be7b2d2290b33902ea9b3bb5274c11701830851d03967a22144536e2d" + }, + "vllm/v1/worker/gpu/spec_decode/gemma4/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/gemma4/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/gemma4/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/gemma4/speculator.py", + "sha256": "9991210d7babd2caf2cd10797ca8688543dedeafbc3b86bc7c979c1a6ae9f949" + }, + "vllm/v1/worker/gpu/spec_decode/mtp/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/mtp/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/mtp/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/mtp/speculator.py", + "sha256": "926d6c9ffdb368c971647911a60493820d056ce236fcae9d94a42fa2e006255d" + }, + "vllm/v1/worker/gpu/spec_decode/multi_module_mtp/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/multi_module_mtp/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/multi_module_mtp/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/multi_module_mtp/speculator.py", + "sha256": "d9d4735b9b33829332b0e845b6d3073b2f0436045ed693b25c6434f351644127" + }, + "vllm/v1/worker/gpu/spec_decode/rejection_sampler.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/rejection_sampler.py", + "sha256": "030db5bfca162cc1f305112f299de5d6d61c59d3ed0807fee46575441ca4086d" + }, + "vllm/v1/worker/gpu/spec_decode/rejection_sampler_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/rejection_sampler_utils.py", + "sha256": "214b61fa0abe88573beb779872c035b3954e5651a85bd438d99ee5905d3a62ec" + }, + "vllm/v1/worker/gpu/spec_decode/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/speculator.py", + "sha256": "3a1ab15bf8b20918852eb835fe9755046e99dcbac6ba6ca3d414949fc8bc695a" + }, + "vllm/v1/worker/gpu/spec_decode/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/utils.py", + "sha256": "282f2929eddae9ca7312269f799be07472334b6df9fd91878b5e839ec05e418c" + }, + "vllm/v1/worker/gpu/states.py": { + "path": "/vllm/v1/worker/gpu/states.py", + "sha256": "99418f5df43ca612ded72609fee011620b065b2cab2f249ccb387096bf4ae71a" + }, + "vllm/v1/worker/gpu/structured_outputs.py": { + "path": "/vllm/v1/worker/gpu/structured_outputs.py", + "sha256": "18a10532db7e66b55e334acacd1fd989ad6361adf31dd0de9a9a65e23db25951" + }, + "vllm/v1/worker/gpu/ubatch_utils.py": { + "path": "/vllm/v1/worker/gpu/ubatch_utils.py", + "sha256": "5092e2e58af0561c8dc12e62847cfc6dda9ca20dfbd33e7f0cd77a83fe87f7c5" + }, + "vllm/v1/worker/gpu/warmup.py": { + "path": "/vllm/v1/worker/gpu/warmup.py", + "sha256": "423ac32d58fe008c228cfa223e4fcebfcf87e3463a9dbdf80a083c0578d73723" + }, + "vllm/v1/worker/gpu_input_batch.py": { + "path": "/vllm/v1/worker/gpu_input_batch.py", + "sha256": "18cf455c9d0eea61cc581c7932f2e6cd09786914e82dd35eef1c1430da359a0f" + }, + "vllm/v1/worker/gpu_model_runner.py": { + "path": "/vllm/v1/worker/gpu_model_runner.py", + "sha256": "87c29d08c0bbf66993d8b984811e7325e35e6436242a773feb55ec88f16b2c51" + }, + "vllm/v1/worker/gpu_ubatch_wrapper.py": { + "path": "/vllm/v1/worker/gpu_ubatch_wrapper.py", + "sha256": "4233cfbe8c9884b042c4363890108f616483b694ebe9a6e69578dcf89c6dac5c" + }, + "vllm/v1/worker/gpu_worker.py": { + "path": "/vllm/v1/worker/gpu_worker.py", + "sha256": "6994436e4547c0996ab555b3e814e8ccea26b650dfc1b378b97d640745309347" + }, + "vllm/v1/worker/kv_connector_model_runner_mixin.py": { + "path": "/vllm/v1/worker/kv_connector_model_runner_mixin.py", + "sha256": "e1cc76d065a7e60aacddb190ae795a480b65cd02ba71a1fc699a02a85c1a3de2" + }, + "vllm/v1/worker/lora_model_runner_mixin.py": { + "path": "/vllm/v1/worker/lora_model_runner_mixin.py", + "sha256": "fef6092a15d8d37f6fa22495e6106e2e5280180908d61ce43d9ff5bf4eef3f2f" + }, + "vllm/v1/worker/mamba_utils.py": { + "path": "/vllm/v1/worker/mamba_utils.py", + "sha256": "23fdaa4e8f63ee8f938eaa1a2b39f803cb04fa6ecd69789563254b1a0691413a" + }, + "vllm/v1/worker/mm_encoder_model_runner.py": { + "path": "/vllm/v1/worker/mm_encoder_model_runner.py", + "sha256": "780c41be84ad022205c21c1decb6bb8d5afb03bc7be120c1f7df03b710acc3d7" + }, + "vllm/v1/worker/sentinel/__init__.py": { + "path": "/vllm/v1/worker/sentinel/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/sentinel/gpu_worker_sentinel.py": { + "path": "/vllm/v1/worker/sentinel/gpu_worker_sentinel.py", + "sha256": "3959b8619d052c5dd247815074e03ec21ec9b43cc424ff2d296abc19b227b852" + }, + "vllm/v1/worker/startup_plan.py": { + "path": "/vllm/v1/worker/startup_plan.py", + "sha256": "84bcbb4f7a9fd7c8d10c9c895aadd9673d44c767b9132368d11eb5e017afe86b" + }, + "vllm/v1/worker/ubatch_utils.py": { + "path": "/vllm/v1/worker/ubatch_utils.py", + "sha256": "b34dce551b5195c414e6a3a997c75961cc7a17f24c7c980487fe3d3e2ba7a798" + }, + "vllm/v1/worker/ubatching.py": { + "path": "/vllm/v1/worker/ubatching.py", + "sha256": "40391241c564feb5f16c77898ae6ae152ed6e71a4682e2a406387785d8de02d7" + }, + "vllm/v1/worker/utils.py": { + "path": "/vllm/v1/worker/utils.py", + "sha256": "0ca3ec6bf4d20076145b7fe64e564962adebedc8f75a856b517ba0b2f2d77acf" + }, + "vllm/v1/worker/worker_base.py": { + "path": "/vllm/v1/worker/worker_base.py", + "sha256": "4a1a5266b912fe97991d8dc89d92b923990da9f6cb4b817d00d52e9c0d26dd7c" + }, + "vllm/v1/worker/workspace.py": { + "path": "/vllm/v1/worker/workspace.py", + "sha256": "d21c08167d1d0d1c0cddaa80453a53a0b4dec5d81b5a537c94a21324344976b3" + }, + "vllm/v1/worker/xpu_model_runner.py": { + "path": "/vllm/v1/worker/xpu_model_runner.py", + "sha256": "07fa0390d28f2b8c3c3c0019eb9c3b126e2397aea268ba47c889f06b423deb23" + }, + "vllm/v1/worker/xpu_worker.py": { + "path": "/vllm/v1/worker/xpu_worker.py", + "sha256": "711b56432506b58041cd86e71320c3960413f7bd61061990b66488421d81cfc3" + } + }, + "prefix": "", + "pth": { + "/__editable__.megatron_core-0.16.0rc0.pth": "d55c9b64480b34aae3d4d31e7706b93391c969dec6e0498e50963b03445a57b0", + "/__editable__.rl_kernel-0.1.0.pth": "1454c4987b35762a0d189d4e901c5d077fde62a1944fbaabecea230e57f3923a", + "/__editable__.vime-0.3.2.pth": "77eec5d06d628cb952e65edd813ca88d8db67ccc785083e1b7b29011b92bec4f", + "/distutils-precedence.pth": "2638ce9e2500e572a5e0de7faed6661eb569d1b696fcba07b0dd223da5f5d224", + "/qwen3_next_cuda_runtime.pth": "e0d3ab57dd3ff4f5d55fcf76e83c549cc00b3c813e6f717c540d5ded79fa2f49", + "/qwen3_next_megatron_source.pth": "8556ac057538e82856cb76cbbc954f58312a3f45373daec3eec826031cfd2709", + "/__editable__.rl_kernel-0.1.0.pth": "1454c4987b35762a0d189d4e901c5d077fde62a1944fbaabecea230e57f3923a", + "/distutils-precedence.pth": "2638ce9e2500e572a5e0de7faed6661eb569d1b696fcba07b0dd223da5f5d224", + "/nvidia_cutlass_dsl_packages.pth": "cc710b99ddb3d76361a70461461d274212a979d00c381d821fce5bb3ad9cf246" + }, + "pyvenv_cfg_sha256": "48579f2c6d35c3d535c2690d7d426587c4b8e92021463f0266b38d35dfbbb834", + "sources": { + "/Megatron-LM-training": { + "patch_sha256": "f66035f12501aa1d08e8884e0dea5a22d59825d717aeda73c3e83876e3efd79f", + "path": "/Megatron-LM-training", + "tree": "731fc44a368d6cac8c6171a29d5c687ff0d95bd1" + }, + "/vime": { + "patch_sha256": "66949839d4c18329444f4f9f6dcd702b53ce1b94e9aa15ed111f28743bfaa4b9", + "path": "/vime", + "tree": "f5174e67dbcdaef983eecd45f215fef2d8429dd0" + } + }, + "version": "3.12.14 | packaged by Anaconda, Inc. | (main, Aug 27 2026, 14:46:43) [GCC 14.3.0]" + }, + "sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca" + }, + "memory": { + "limits": { + "/memory.limit_in_bytes": "9223372036854771712", + "/memory.limit_in_bytes": "9223372036854771712", + "/memory.limit_in_bytes": "9223372036854771712" + }, + "cgroup_bytes": null, + "declared_bytes": 549755813888, + "effective_bytes": 549755813888, + "available_bytes": 2091057872896 + }, + "gpu_uuids": [ + "f84b0ae3-604b-7194-e772-280f5d102d46", + "225c7841-f606-0248-cce4-31f3ae0b215d", + "46fa983d-5878-1d92-4a61-197f569e8b01", + "79936bd2-1377-8dcf-bdb1-e6e772d0e0f3" + ], + "execution_gpus": 4 +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/l2/l2_matrix.json b/docs/usage/evidence/qwen3-next-chain-b200/l2/l2_matrix.json new file mode 100644 index 000000000..9fe45617f --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/l2/l2_matrix.json @@ -0,0 +1,1186 @@ +{ + "schema_version": 1, + "status": "passed", + "scope": "qwen3_next_full_model_l2", + "identity": { + "scheduler_profile_certificate": { + "path": "/result.json", + "sha256": "bf3a74423b3636145cad903d5cf9d70f2c3c777b019a24d125c2ca79f8b1e8d9" + }, + "source_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "checkpoint": "", + "weight_version": "baseline", + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "architecture_layers": 48, + "weights_dtype": "bfloat16", + "recurrent_state_dtype": "float32" + }, + "fixture": { + "path": "/inputs/frozen.pt", + "sha256": "a8fc79cea6c76e5989743429b76811b3a93b6b85e1eb7f03164c9850c50f1ca8", + "content_sha256": "b59298acf5ecbe64abb4639e7596e052f1993ee5e3c7289b63738f1b04463d01" + }, + "case_ids": [ + "p0008-b1-full", + "p0008-b1-chunked", + "p0008-b4-full", + "p0008-b4-chunked", + "p0064-b1-full", + "p0064-b1-chunked", + "p0064-b4-full", + "p0064-b4-chunked", + "p0256-b1-full", + "p0256-b1-chunked", + "p0256-b4-full", + "p0256-b4-chunked", + "p1024-b1-full", + "p1024-b1-chunked", + "p1024-b4-full", + "p1024-b4-chunked" + ], + "cases": { + "p0008-b1-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "artifacts": { + "rollout": { + "path": "/attempts/0/rollout/p0008-b1-full.pt", + "sha256": "cb5cf1f80989b331a5569359505eaba888adfdb591465f7429ee1a5128ceb999" + }, + "recompute": { + "path": "/attempts/0/recompute/p0008-b1-full.pt", + "sha256": "65c45da2f889994ab298c265c3dde9d24361c494c861ccf9abd9edccc4c16f73" + } + } + }, + "p0008-b1-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "artifacts": { + "rollout": { + "path": "/attempts/0/rollout/p0008-b1-chunked.pt", + "sha256": "2cce1f5b71a7f1393ec86a62e11cbecccdce7e76c7c0df81c60fb339753b1b9a" + }, + "recompute": { + "path": "/attempts/0/recompute/p0008-b1-chunked.pt", + "sha256": "f3122d41752d58a98ea993b55f105707ba2143889bb7925fa75122cda290a2eb" + } + } + }, + "p0008-b4-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "artifacts": { + "rollout": { + "path": "/attempts/0/rollout/p0008-b4-full.pt", + "sha256": "7dbf864f68670c9e25c70f4e1f6ab7d41735eadf8c5827abe58adb8ec99986e4" + }, + "recompute": { + "path": "/attempts/0/recompute/p0008-b4-full.pt", + "sha256": "b5ebdf0c05917ade2c9b5e059cefdd2796b168e3b94fb8c62d978ffa9f9c2db8" + } + } + }, + "p0008-b4-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "artifacts": { + "rollout": { + "path": "/attempts/0/rollout/p0008-b4-chunked.pt", + "sha256": "2588dac82cc115c18d8cb5a2c7dec8615e63a2d95e019ec5682a491352552b2e" + }, + "recompute": { + "path": "/attempts/0/recompute/p0008-b4-chunked.pt", + "sha256": "61cfcfc08957fc0b59317d3431cc51a3ba4bcbf125c542f3059a4b1910538211" + } + } + }, + "p0064-b1-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "artifacts": { + "rollout": { + "path": "/attempts/0/rollout/p0064-b1-full.pt", + "sha256": "b069f87ef7fb72a07231a9172499390aae6c18cabbf67399ea5d3ba8113cab03" + }, + "recompute": { + "path": "/attempts/0/recompute/p0064-b1-full.pt", + "sha256": "39889b6593fad7aebef719f6aace04baa3145a97935536c1f83f838e617981d0" + } + } + }, + "p0064-b1-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "artifacts": { + "rollout": { + "path": "/attempts/0/rollout/p0064-b1-chunked.pt", + "sha256": "0509f53f8c196cf84b255f0ddb56ef4d3895a9fcd4f402814b1fca5f99b10db0" + }, + "recompute": { + "path": "/attempts/0/recompute/p0064-b1-chunked.pt", + "sha256": "1ffa9e794aa2013c56d9b86d4e943a42d6a5b390c4c382ec6d8864a96746b8cc" + } + } + }, + "p0064-b4-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "artifacts": { + "rollout": { + "path": "/attempts/0/rollout/p0064-b4-full.pt", + "sha256": "14e59bdf3dd892529aa52976a7acaa849956139f452ed5f88946efbac8eebf84" + }, + "recompute": { + "path": "/attempts/0/recompute/p0064-b4-full.pt", + "sha256": "dbe090366e381add82cfad8e515519495d0d80a9062d6a2cef4548d81c66a3e9" + } + } + }, + "p0064-b4-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "artifacts": { + "rollout": { + "path": "/attempts/0/rollout/p0064-b4-chunked.pt", + "sha256": "58a67621411fb59b1c9851304efd2ec1835ac84335566307b955b73d49f2ab65" + }, + "recompute": { + "path": "/attempts/0/recompute/p0064-b4-chunked.pt", + "sha256": "4320d49a960450508b351b2b6c90a91fa376df457ee0a293d5686c5651943019" + } + } + }, + "p0256-b1-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "artifacts": { + "rollout": { + "path": "/attempts/0/rollout/p0256-b1-full.pt", + "sha256": "a2989d8ddbb207c0353c32495a4d5b8f36fd16ea2103989c28c7e9ff526633e8" + }, + "recompute": { + "path": "/attempts/0/recompute/p0256-b1-full.pt", + "sha256": "a5e04568c7b32b2c5eb0aa03acb0decb56645ca2dfde23316590a846030139b2" + } + } + }, + "p0256-b1-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "artifacts": { + "rollout": { + "path": "/attempts/0/rollout/p0256-b1-chunked.pt", + "sha256": "c2070712ccbaa37b1c945b4834377250f3add60fb62b13fcadb7baa4ee0b89d5" + }, + "recompute": { + "path": "/attempts/0/recompute/p0256-b1-chunked.pt", + "sha256": "4d6e085b66bd980ff53d3de0703cdba502a9cd48fc6a13d40cf27355c4fb6b9e" + } + } + }, + "p0256-b4-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "artifacts": { + "rollout": { + "path": "/attempts/0/rollout/p0256-b4-full.pt", + "sha256": "3fa898eafe4041bafb60ba9d0ab23ebfd6c0643c7fe8061ea95597a0b90f8408" + }, + "recompute": { + "path": "/attempts/0/recompute/p0256-b4-full.pt", + "sha256": "149f524b74d75bb2ade6b8558f20ac98dcdaae84b3ba1165ff73818a60ba6e5d" + } + } + }, + "p0256-b4-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "artifacts": { + "rollout": { + "path": "/attempts/0/rollout/p0256-b4-chunked.pt", + "sha256": "bf666e5a8c5cb782927f56bdecc174e04def5e32bc550a44bcc65b7695bb50d7" + }, + "recompute": { + "path": "/attempts/0/recompute/p0256-b4-chunked.pt", + "sha256": "6286b4e2ea884d5e2510c0e8cbd0b84a7d5c617fd4ff5c830fc8426bd138cb73" + } + } + }, + "p1024-b1-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "artifacts": { + "rollout": { + "path": "/attempts/0/rollout/p1024-b1-full.pt", + "sha256": "c0d22adf9711ec9e6c12aaab9e1d484fa9cfb6252e2c93d9c325c41cde5741fa" + }, + "recompute": { + "path": "/attempts/0/recompute/p1024-b1-full.pt", + "sha256": "a299b4c46b1f0d688d56df7a246b1d85332c1d8aef4c7b1fba4969b0f1e0b7c3" + } + } + }, + "p1024-b1-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "artifacts": { + "rollout": { + "path": "/attempts/0/rollout/p1024-b1-chunked.pt", + "sha256": "8e1379dc45726ea7278e876f42cec9b5a046378370ff281b86118433b16a1db1" + }, + "recompute": { + "path": "/attempts/0/recompute/p1024-b1-chunked.pt", + "sha256": "10ca34d4d4cdcb70b4cb22148537ec492d4cc462a9fb5209793dea54635316a8" + } + } + }, + "p1024-b4-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "artifacts": { + "rollout": { + "path": "/attempts/0/rollout/p1024-b4-full.pt", + "sha256": "0953e5b25b65848a7c9e12356996a9a867ee9f3def74fe900be9645a18311a5c" + }, + "recompute": { + "path": "/attempts/0/recompute/p1024-b4-full.pt", + "sha256": "ca9ed1f35e23d5f6333fe6011df9771bf68721c7bb6559fbcf90c0eb186c9ba7" + } + } + }, + "p1024-b4-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "artifacts": { + "rollout": { + "path": "/attempts/0/rollout/p1024-b4-chunked.pt", + "sha256": "ebeebb60f1339777cbb90643c1b1d017e6555d19c8958992f220e2b7efb012e8" + }, + "recompute": { + "path": "/attempts/0/recompute/p1024-b4-chunked.pt", + "sha256": "0965acf2b26c0b78bc87340ee266406984b93ce3df6814fcf45fcd323ecbd74f" + } + } + } + }, + "processes": { + "rollout": { + "pid": 257775, + "exit_code": 0, + "log": "/attempts/0/rollout.log", + "gpu_release_verified": true + }, + "recompute": { + "pid": 272086, + "exit_code": 0, + "log": "/attempts/0/recompute.log", + "gpu_release_verified": true + } + }, + "worker_results": { + "rollout": { + "path": "/attempts/0/rollout/worker-result.json", + "sha256": "b615174fc3d6bc544c9cffe7d1fd2b4ba6e6cdab947776dafe5878e6db49031b" + }, + "recompute": { + "path": "/attempts/0/recompute/worker-result.json", + "sha256": "fa672094f7b571daefc45f16aba83b31a29a707e6c3d9e5c61b67f2786e84f43" + } + }, + "raw_bit_comparison": true, + "logits_dtype": "bfloat16", + "logprobs_dtype": "float32", + "response_length": 16, + "vocab_size": 151936, + "provider_binary": { + "path": "/attempts/0/provider-binary.json", + "sha256": "cf4d7ff7f1e2752cb8c5379ec63edaa0bb1dd2980514e49fa394a01fbbb5dfe7" + } +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/l2/operators.json b/docs/usage/evidence/qwen3-next-chain-b200/l2/operators.json new file mode 100644 index 000000000..500251cce --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/l2/operators.json @@ -0,0 +1,304 @@ +{ + "scope": "qwen3_next_operators_only", + "status": "passed", + "suite": "all", + "diagnostic_only": false, + "full_model_l2": "not_evaluated", + "git_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "git_dirty": false, + "versions": { + "torch": "2.13.0", + "vllm": "0.30.0", + "transformers": "5.17.0", + "triton": "3.7.1" + }, + "mandatory_case_ids": [ + "tests/check_qwen3_next_attention.py::test_d256_backward_with_cached_prefix_matches_float64_formula", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[1024]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[256]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[64]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[8]", + "tests/check_qwen3_next_attention.py::test_d256_input_device_guard_and_nondefault_stream", + "tests/check_qwen3_next_attention.py::test_native_backward_rejects_malformed_probability_and_gradient_buffers", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[0]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[2]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_target_inputs_do_not_depend_on_companions", + "tests/check_qwen3_next_batch_invariance.py::test_triton_chunked_prefill_is_batch_invariant", + "tests/check_qwen3_next_conv_bridge.py::test_chunked_and_reordered_sequences_match", + "tests/check_qwen3_next_conv_bridge.py::test_empty_sequence_preserves_cache_and_gradients", + "tests/check_qwen3_next_conv_bridge.py::test_response_gradient_reaches_prompt_and_convolution_weight", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths0]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths1]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths2]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-4]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[1]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[4]", + "tests/check_qwen3_next_core_matrix.py::test_variable_lengths_empty_and_mixed_step_match_independent_sequences", + "tests/check_qwen3_next_forward.py::test_combine_has_fixed_route_order_and_differentiable_weights", + "tests/check_qwen3_next_forward.py::test_full_vocabulary_logprob_entropy_modes_and_gradient", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_fail_closed_on_the_tensor_descriptor_path", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[128]", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[512]", + "tests/check_qwen3_next_forward.py::test_logprob_nan_rejected_before_comparison", + "tests/check_qwen3_next_forward.py::test_moe_vjp_matches_independent_double_formula", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[1024-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[128-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-16]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-256]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-3072]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-37984]", + "tests/check_qwen3_next_forward.py::test_qwen_moe_actual_tp4_shapes_and_independent_training_forward", + "tests/check_qwen3_next_forward.py::test_route_weights_are_batch_invariant", + "tests/check_qwen3_next_forward.py::test_shared_linear_vjp_and_empty_tokens", + "tests/check_qwen3_next_forward.py::test_stable_route_tie_boundary_and_router_gradient", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_backward_matches_recomputed_recurrence_vjp", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_forward_is_provider_exact_and_does_not_mutate_inputs", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_keeps_prompt_state_gradient_through_response", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[False]", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[True]", + "tests/check_qwen3_next_gdn_bridge.py::test_initial_state_vjp_matches_provider_directional_difference", + "tests/check_qwen3_next_gdn_sequence.py::test_1024_token_chunk_continuation_is_bitwise_exact", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad0]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad1]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad2]", + "tests/check_qwen3_next_gdn_sequence.py::test_chunk_boundary_retains_prompt_and_initial_state_gradients", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths0]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths1]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths2]", + "tests/check_qwen3_next_gdn_sequence.py::test_reserved_and_duplicate_slots_are_rejected", + "tests/check_qwen3_next_norm_providers.py::test_custom_op_has_distinct_native_and_cuda_paths", + "tests/check_qwen3_next_norm_providers.py::test_gdn_decode_provider_env_defaults_are_recorded", + "tests/check_qwen3_next_norm_providers.py::test_our_gated_op_is_batch_invariant", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_cuda]", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_native]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots0]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots2]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots3]", + "tests/check_qwen3_next_shared_core.py::test_independent_training_forward_matches_inference_and_retains_gradients", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[1024]", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[8]", + "tests/check_qwen3_next_shared_core.py::test_unimplemented_provider_profile_is_rejected", + "tests/test_qwen3_next_norm.py::test_bad_weight_shape_raises", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[16]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[1]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[2]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[32]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[48]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[64]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[8]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[128]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[2048]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_with_padding", + "tests/test_qwen3_next_norm.py::test_call_matches_forward", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[128]", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[2048]", + "tests/test_qwen3_next_norm.py::test_cuda_default_offset_preserves_plain_convention", + "tests/test_qwen3_next_norm.py::test_cuda_gated_backward_matches_autograd_golden", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_matches_golden_within_contract", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_bad_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_mismatched_gate", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_backward_uses_the_sigmoid_derivative", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_swish_is_an_alias_for_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_unit_weight_is_plain_norm_times_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_weight_offset_is_applied_in_fp32", + "tests/test_qwen3_next_norm.py::test_cuda_gated_wrapper_rejects_equal_numel_wrong_shape", + "tests/test_qwen3_next_norm.py::test_cuda_gated_zero_gate_zeroes_output", + "tests/test_qwen3_next_norm.py::test_cuda_offset_equals_explicit_fp32_weight", + "tests/test_qwen3_next_norm.py::test_cuda_offset_is_not_folded_through_bfloat16", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_backward_is_offset_aware", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_within_tolerance_of_golden", + "tests/test_qwen3_next_norm.py::test_deterministic_repeat", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype0]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype1]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype2]", + "tests/test_qwen3_next_norm.py::test_eps_inside_sqrt", + "tests/test_qwen3_next_norm.py::test_gated_batch_invariance_slice", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedHFOp]", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedOp]", + "tests/test_qwen3_next_norm.py::test_gated_conventions_diverge_in_low_precision", + "tests/test_qwen3_next_norm.py::test_gated_cuda_op_rejects_bad_activation_at_construction", + "tests/test_qwen3_next_norm.py::test_gated_extension_handles_empty_batch_and_nondefault_stream", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[dy_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[gate_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[rstd_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_shape]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_matches_hf_formula_fp32", + "tests/test_qwen3_next_norm.py::test_gated_shape_mismatch_raises", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_strict_matches_vllm_formula_fp32", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[128]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[2048]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_offset_applied_in_fp32_not_folded_into_bf16", + "tests/test_qwen3_next_norm.py::test_op_batch_invariance_on_device", + "tests/test_qwen3_next_norm.py::test_plain_reference_is_unchanged_by_the_offset_plumbing", + "tests/test_qwen3_next_norm.py::test_weight_offset_is_one", + "tests/test_qwen3_next_norm.py::test_zero_centred_cuda_constructor_rejects_missing_extension", + "tests/test_qwen3_next_norm.py::test_zero_centred_op_inherits_the_plain_reference", + "tests/test_qwen3_next_norm.py::test_zero_weight_is_identity_scaling" + ], + "case_ids_sha256": "694c931b65f9cfa5db963f2eca6d11bd309546c824a1df52f9da2ab128e83e0f", + "pytest_exit_code": 0, + "provider_tests": { + "tests": 233, + "failures": 0, + "errors": 0, + "skipped": 0 + }, + "norm_gates": { + "qwen3_next_rms_norm-forward.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + }, + "qwen3_next_rms_norm-gradient.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + }, + "rms_norm_gated-forward.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + }, + "rms_norm_gated-gradient.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + } + } +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/l2/predecessor.json b/docs/usage/evidence/qwen3-next-chain-b200/l2/predecessor.json new file mode 100644 index 000000000..28ce9bec5 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/l2/predecessor.json @@ -0,0 +1,5 @@ +{ + "run_id": "20261009T032730Z-layers-c67ec144-397c157d", + "execution_id": "397c157d5a60491c891d1ebc5490189b", + "result_sha256": "bf3a74423b3636145cad903d5cf9d70f2c3c777b019a24d125c2ca79f8b1e8d9" +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/l2/provider_binary.json b/docs/usage/evidence/qwen3-next-chain-b200/l2/provider_binary.json new file mode 100644 index 000000000..fbd6a2721 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/l2/provider_binary.json @@ -0,0 +1,13 @@ +{ + "schema_version": 1, + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "actual": { + "module": "rl_engine._C", + "path": "/source/rl_engine/_C.cpython-312-x86_64-linux-gnu.so", + "sha256": "9cc187da3c78c0fd326134d618856f53c869155b51bfd6c47e6fa410fb188090" + }, + "archive": { + "path": "/attempts/0/provider-binary.so", + "sha256": "9cc187da3c78c0fd326134d618856f53c869155b51bfd6c47e6fa410fb188090" + } +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/l2/result.json b/docs/usage/evidence/qwen3-next-chain-b200/l2/result.json new file mode 100644 index 000000000..03c539b31 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/l2/result.json @@ -0,0 +1,775 @@ +{ + "contract_version": 4, + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "cuda_identity": { + "home": "", + "nvcc_sha256": "b8e2347d9d7fcadf8812a27324d515de99d033d3e48611811ece7e66d7895f8a" + }, + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "operator_requirements": { + "suite": "all", + "case_ids": [ + "tests/check_qwen3_next_attention.py::test_d256_backward_with_cached_prefix_matches_float64_formula", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[1024]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[256]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[64]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[8]", + "tests/check_qwen3_next_attention.py::test_d256_input_device_guard_and_nondefault_stream", + "tests/check_qwen3_next_attention.py::test_native_backward_rejects_malformed_probability_and_gradient_buffers", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[0]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[2]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_target_inputs_do_not_depend_on_companions", + "tests/check_qwen3_next_batch_invariance.py::test_triton_chunked_prefill_is_batch_invariant", + "tests/check_qwen3_next_conv_bridge.py::test_chunked_and_reordered_sequences_match", + "tests/check_qwen3_next_conv_bridge.py::test_empty_sequence_preserves_cache_and_gradients", + "tests/check_qwen3_next_conv_bridge.py::test_response_gradient_reaches_prompt_and_convolution_weight", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths0]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths1]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths2]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-4]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[1]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[4]", + "tests/check_qwen3_next_core_matrix.py::test_variable_lengths_empty_and_mixed_step_match_independent_sequences", + "tests/check_qwen3_next_forward.py::test_combine_has_fixed_route_order_and_differentiable_weights", + "tests/check_qwen3_next_forward.py::test_full_vocabulary_logprob_entropy_modes_and_gradient", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_fail_closed_on_the_tensor_descriptor_path", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[128]", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[512]", + "tests/check_qwen3_next_forward.py::test_logprob_nan_rejected_before_comparison", + "tests/check_qwen3_next_forward.py::test_moe_vjp_matches_independent_double_formula", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[1024-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[128-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-16]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-256]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-3072]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-37984]", + "tests/check_qwen3_next_forward.py::test_qwen_moe_actual_tp4_shapes_and_independent_training_forward", + "tests/check_qwen3_next_forward.py::test_route_weights_are_batch_invariant", + "tests/check_qwen3_next_forward.py::test_shared_linear_vjp_and_empty_tokens", + "tests/check_qwen3_next_forward.py::test_stable_route_tie_boundary_and_router_gradient", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_backward_matches_recomputed_recurrence_vjp", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_forward_is_provider_exact_and_does_not_mutate_inputs", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_keeps_prompt_state_gradient_through_response", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[False]", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[True]", + "tests/check_qwen3_next_gdn_bridge.py::test_initial_state_vjp_matches_provider_directional_difference", + "tests/check_qwen3_next_gdn_sequence.py::test_1024_token_chunk_continuation_is_bitwise_exact", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad0]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad1]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad2]", + "tests/check_qwen3_next_gdn_sequence.py::test_chunk_boundary_retains_prompt_and_initial_state_gradients", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths0]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths1]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths2]", + "tests/check_qwen3_next_gdn_sequence.py::test_reserved_and_duplicate_slots_are_rejected", + "tests/check_qwen3_next_norm_providers.py::test_custom_op_has_distinct_native_and_cuda_paths", + "tests/check_qwen3_next_norm_providers.py::test_gdn_decode_provider_env_defaults_are_recorded", + "tests/check_qwen3_next_norm_providers.py::test_our_gated_op_is_batch_invariant", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_cuda]", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_native]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots0]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots2]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots3]", + "tests/check_qwen3_next_shared_core.py::test_independent_training_forward_matches_inference_and_retains_gradients", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[1024]", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[8]", + "tests/check_qwen3_next_shared_core.py::test_unimplemented_provider_profile_is_rejected", + "tests/test_qwen3_next_norm.py::test_bad_weight_shape_raises", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[16]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[1]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[2]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[32]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[48]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[64]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[8]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[128]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[2048]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_with_padding", + "tests/test_qwen3_next_norm.py::test_call_matches_forward", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[128]", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[2048]", + "tests/test_qwen3_next_norm.py::test_cuda_default_offset_preserves_plain_convention", + "tests/test_qwen3_next_norm.py::test_cuda_gated_backward_matches_autograd_golden", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_matches_golden_within_contract", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_bad_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_mismatched_gate", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_backward_uses_the_sigmoid_derivative", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_swish_is_an_alias_for_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_unit_weight_is_plain_norm_times_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_weight_offset_is_applied_in_fp32", + "tests/test_qwen3_next_norm.py::test_cuda_gated_wrapper_rejects_equal_numel_wrong_shape", + "tests/test_qwen3_next_norm.py::test_cuda_gated_zero_gate_zeroes_output", + "tests/test_qwen3_next_norm.py::test_cuda_offset_equals_explicit_fp32_weight", + "tests/test_qwen3_next_norm.py::test_cuda_offset_is_not_folded_through_bfloat16", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_backward_is_offset_aware", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_within_tolerance_of_golden", + "tests/test_qwen3_next_norm.py::test_deterministic_repeat", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype0]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype1]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype2]", + "tests/test_qwen3_next_norm.py::test_eps_inside_sqrt", + "tests/test_qwen3_next_norm.py::test_gated_batch_invariance_slice", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedHFOp]", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedOp]", + "tests/test_qwen3_next_norm.py::test_gated_conventions_diverge_in_low_precision", + "tests/test_qwen3_next_norm.py::test_gated_cuda_op_rejects_bad_activation_at_construction", + "tests/test_qwen3_next_norm.py::test_gated_extension_handles_empty_batch_and_nondefault_stream", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[dy_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[gate_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[rstd_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_shape]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_matches_hf_formula_fp32", + "tests/test_qwen3_next_norm.py::test_gated_shape_mismatch_raises", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_strict_matches_vllm_formula_fp32", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[128]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[2048]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_offset_applied_in_fp32_not_folded_into_bf16", + "tests/test_qwen3_next_norm.py::test_op_batch_invariance_on_device", + "tests/test_qwen3_next_norm.py::test_plain_reference_is_unchanged_by_the_offset_plumbing", + "tests/test_qwen3_next_norm.py::test_weight_offset_is_one", + "tests/test_qwen3_next_norm.py::test_zero_centred_cuda_constructor_rejects_missing_extension", + "tests/test_qwen3_next_norm.py::test_zero_centred_op_inherits_the_plain_reference", + "tests/test_qwen3_next_norm.py::test_zero_weight_is_identity_scaling" + ], + "case_ids_sha256": "694c931b65f9cfa5db963f2eca6d11bd309546c824a1df52f9da2ab128e83e0f", + "norm_gates": [ + "qwen3_next_rms_norm-forward.json", + "qwen3_next_rms_norm-gradient.json", + "rms_norm_gated-forward.json", + "rms_norm_gated-gradient.json" + ] + }, + "layer_requirements": { + "schema_version": 1, + "gates": { + "gdn": { + "script": "scripts/qwen3_next_tp_gdn_check.py", + "output_option": "--output", + "scope": "tp4_gdn_layer0", + "groups": { + "cases": [ + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "prompt-gradient", + "replicated-norm-gradient", + "hf-load-export" + ] + }, + "script_sha256": "cc4338893f90af004c51c20fc67d1a9a3f4bf8d26775277f72671c02983e4df5" + }, + "attention": { + "script": "scripts/qwen3_next_tp_attention_check.py", + "output_option": "--output", + "scope": "tp4_full_attention_layer3", + "groups": { + "attention.cases": [ + "hf-load-export", + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "batch4-varlen-reorder", + "sixteen-token-decode", + "prompt-gradient", + "kv-pair-gradient", + "qk-norm-gradient" + ] + }, + "script_sha256": "d27d43efb05415a8ef5892c3c2238a2b9744a4821f5466faf46c6510e6e01bec" + }, + "moe": { + "script": "scripts/qwen3_next_tp_moe_check.py", + "output_option": "--output", + "scope": "tp4_moe_block_layer0", + "groups": { + "moe.cases": [ + "hf-load-export-all512experts", + "routes-replicated-8", + "full-chunk-reorder-8", + "routes-replicated-64", + "full-chunk-reorder-64", + "routes-replicated-256", + "full-chunk-reorder-256", + "routes-replicated-1024", + "full-chunk-reorder-1024", + "training-forward", + "all-parameter-gradient", + "replicated-router-gradient" + ] + }, + "script_sha256": "d5c1bbbb82e408b65871b0cb1638d7a6cf8cfe07f0a3315a657b7dc232d544be" + }, + "adapters": { + "script": "scripts/qwen3_next_adapter_check.py", + "output_option": "--out", + "scope": "gdn_engine_adapter_component", + "groups": { + "cases": [ + "batch1-length8", + "batch1-length64", + "batch1-length256", + "batch1-length1024", + "batch4-length8", + "batch4-length64", + "batch4-length256", + "batch4-length1024", + "mixed-prefill-decode16-reorder" + ] + }, + "fields": { + "prompt_gradient": "passed", + "hf_conv_roundtrip": "passed", + "batch_invariance_capability_registered": false + }, + "script_sha256": "3ce45bb317237c1a06533116d65fb77c2a23b6f503ae46406ede543036eb0f20" + }, + "heads": { + "script": "scripts/qwen3_next_tp_head_check.py", + "output_option": "--output", + "scope": "tp4_embedding_lm_head_only", + "groups": { + "cases": [ + "hf-embedding-roundtrip", + "hf-lm-head-roundtrip", + "replicated-norm-gradient", + "nonzero-finite-embedding-head-gradient", + "embedding-repeat-100", + "batch-invariant-prompt8", + "batch-invariant-prompt64", + "batch-invariant-prompt256", + "batch-invariant-prompt1024", + "logprob-original-and-promoted-logits", + "entropy-interface" + ] + }, + "script_sha256": "0504185d21a75405c8e994bc57b016cf4ec357d8b16e7430772c11934f2af876" + } + }, + "scheduler_case_ids": [ + "p0008-b1-full", + "p0008-b1-chunked", + "p0008-b4-full", + "p0008-b4-chunked", + "p0064-b1-full", + "p0064-b1-chunked", + "p0064-b4-full", + "p0064-b4-chunked", + "p0256-b1-full", + "p0256-b1-chunked", + "p0256-b4-full", + "p0256-b4-chunked", + "p1024-b1-full", + "p1024-b1-chunked", + "p1024-b4-full", + "p1024-b4-chunked" + ], + "registry_sha256": "e3949a750cb27c1897a000f3b023f912629906612ae8949c1575d0acc36df5ec", + "case_ids_per_rank": [ + "adapters/cases/batch1-length1024", + "adapters/cases/batch1-length256", + "adapters/cases/batch1-length64", + "adapters/cases/batch1-length8", + "adapters/cases/batch4-length1024", + "adapters/cases/batch4-length256", + "adapters/cases/batch4-length64", + "adapters/cases/batch4-length8", + "adapters/cases/mixed-prefill-decode16-reorder", + "attention/attention.cases/batch4-varlen-reorder", + "attention/attention.cases/full-chunk-1024", + "attention/attention.cases/full-chunk-256", + "attention/attention.cases/full-chunk-64", + "attention/attention.cases/full-chunk-8", + "attention/attention.cases/hf-load-export", + "attention/attention.cases/kv-pair-gradient", + "attention/attention.cases/prompt-gradient", + "attention/attention.cases/qk-norm-gradient", + "attention/attention.cases/sixteen-token-decode", + "gdn/cases/full-chunk-1024", + "gdn/cases/full-chunk-256", + "gdn/cases/full-chunk-64", + "gdn/cases/full-chunk-8", + "gdn/cases/hf-load-export", + "gdn/cases/prompt-gradient", + "gdn/cases/replicated-norm-gradient", + "heads/cases/batch-invariant-prompt1024", + "heads/cases/batch-invariant-prompt256", + "heads/cases/batch-invariant-prompt64", + "heads/cases/batch-invariant-prompt8", + "heads/cases/embedding-repeat-100", + "heads/cases/entropy-interface", + "heads/cases/hf-embedding-roundtrip", + "heads/cases/hf-lm-head-roundtrip", + "heads/cases/logprob-original-and-promoted-logits", + "heads/cases/nonzero-finite-embedding-head-gradient", + "heads/cases/replicated-norm-gradient", + "moe/moe.cases/all-parameter-gradient", + "moe/moe.cases/full-chunk-reorder-1024", + "moe/moe.cases/full-chunk-reorder-256", + "moe/moe.cases/full-chunk-reorder-64", + "moe/moe.cases/full-chunk-reorder-8", + "moe/moe.cases/hf-load-export-all512experts", + "moe/moe.cases/replicated-router-gradient", + "moe/moe.cases/routes-replicated-1024", + "moe/moe.cases/routes-replicated-256", + "moe/moe.cases/routes-replicated-64", + "moe/moe.cases/routes-replicated-8", + "moe/moe.cases/training-forward" + ], + "case_ids_sha256": "be74417dfbd6031ba27978d06d04bb15daaab2aeb57d132c7e0d41176b28b46e" + }, + "source_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "run_id": "20261009T035215Z-l2-c67ec144-f44cbd79", + "stage": "l2", + "suite": "all", + "execution_id": "f44cbd79269e4fcc97d8877044764e11", + "attempt": "0", + "status": "passed", + "phase": "complete", + "scope": "qwen3_next_full_model_l2", + "full_model_l2": "passed", + "evidence": { + "operators": { + "path": "attempts/0/operators.json", + "sha256": "dedb24b6ac2a01d37eb795a001376ca0b200a03e417f8131688aac67c19c2ebd" + }, + "environment": { + "path": "attempts/0/environment.json", + "sha256": "2ac9de8d3bd34729c151e1392c94cddbd9533b4816449aca9399a839cdedc76d" + }, + "l2_matrix": { + "path": "attempts/0/l2-matrix.json", + "sha256": "bf9da6060e882fb3707df9093e63a4c6e6664e8a75f25e9809020c4f687bf953" + }, + "predecessor": { + "path": "attempts/0/predecessor-evidence.json", + "sha256": "256c03b084be2a675d0fa5e3c1e0358ab886f5cb9a9efde6b7d800fdef872929" + }, + "provider_binary": { + "path": "attempts/0/provider-binary.json", + "sha256": "cf4d7ff7f1e2752cb8c5379ec63edaa0bb1dd2980514e49fa394a01fbbb5dfe7" + } + } +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/l2/run.json b/docs/usage/evidence/qwen3-next-chain-b200/l2/run.json new file mode 100644 index 000000000..3b7414597 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/l2/run.json @@ -0,0 +1,5252 @@ +{ + "run_id": "20261009T035215Z-l2-c67ec144-f44cbd79", + "execution_id": "f44cbd79269e4fcc97d8877044764e11", + "contract_version": 4, + "suite": "all", + "execution_gpus": 4, + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "stage": "l2", + "source_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "source": "/source", + "python": "", + "cuda_home": "", + "checkpoint": "", + "memory": "512G", + "previous": "", + "status": "prepared", + "full_model_l2": "not_evaluated", + "environment": { + "identity": { + "base_prefix": "/miniconda3/envs/rlkernel", + "binary": "/python3.12", + "binary_sha256": "6a1eb3ffc29f3a6b0ece607b016b4cfa5ca3ac57b34f17ed3266b404f78d2729", + "build_tools": { + "ninja": { + "path": "/miniconda3/envs/rlkernel/bin/ninja", + "sha256": "08639e194fffa7f08b259fc4abfa4803aff66b64de52549cee42ec527d55cea6" + } + }, + "distributions": [ + { + "direct_url": null, + "metadata_sha256": "6f1038270be40f9b8c0bcf391c627e7d7f41ccdd19aa192d6eac1dbfc3b19abc", + "name": "GitPython", + "version": "3.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "3f71971502087521f123c9daa26bc12d31d3466738b567390b8602acad3be22a", + "name": "Jinja2", + "version": "3.1.6" + }, + { + "direct_url": null, + "metadata_sha256": "818fb343b7b6b99a32771bf4813521ae6440b4c7579b3ae46e32dd02da0afeee", + "name": "Markdown", + "version": "3.11" + }, + { + "direct_url": null, + "metadata_sha256": "dc1ee42cf8ecfeee0ab60b15b21d291833e0732548efcb7bb5b3564dca3e5bf7", + "name": "MarkupSafe", + "version": "3.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "de7389b142450a0014234286b0876f328439b823c355c73d0aed41fd67ec208c", + "name": "PyJWT", + "version": "2.15.1" + }, + { + "direct_url": null, + "metadata_sha256": "ffcad4415cafb22b8b536a61595e9ee13438b51d31b0763c1b273ce3bc58e840", + "name": "PyYAML", + "version": "6.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "8562d701cc52d9cafbb418942b0e072fc087ed8ddcf35cd10224c1b2ed8bdd91", + "name": "Pygments", + "version": "2.21.0" + }, + { + "direct_url": null, + "metadata_sha256": "b6c25fcfdcc495edf248a10ca4ad28327ef2ed6047a6ec5c6346e121414c7f21", + "name": "Werkzeug", + "version": "3.1.9" + }, + { + "direct_url": null, + "metadata_sha256": "55c400d24c71b581d9c0992f71df6047cf6c878bebe61a7d45d6e02dc0e4c510", + "name": "absl-py", + "version": "2.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "13db521f90a6a882027b2388eaa2ebf252945f9c2adb7e7e371da18239da4df0", + "name": "accelerate", + "version": "1.15.0" + }, + { + "direct_url": null, + "metadata_sha256": "86fe44e38e67872dd895c729044942ba2c2f934ae439a899fb83a186206b7fd4", + "name": "agent-detector", + "version": "2.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "afe11fe9f5aa54e734cdd51659bed8c89dc6bcd5aef0ad96f2d20149c8de5456", + "name": "aiohappyeyeballs", + "version": "2.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "570b307bc0b53fbbd3ed2ce0b7eca6bbf2fa73bf75e24a480f1034d8c0b832bf", + "name": "aiohttp", + "version": "3.14.3" + }, + { + "direct_url": null, + "metadata_sha256": "44b7f8e14c4770793e747fad50c9e0a6ee7357651d878554f192d94768dc14a8", + "name": "aiohttp-cors", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "648813a44a9ae0ab2f20ee86d2404dcc38e3f9e80c63316cf6e536735df14e54", + "name": "aiosignal", + "version": "1.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "f6a3f6668bacef7f73a2c19ccb2be910b2363d1731c4725cb04364d99e24935a", + "name": "annotated-doc", + "version": "0.0.5" + }, + { + "direct_url": null, + "metadata_sha256": "fc6d752cde6a6a4bff03474386de750e130b75da3c7815ee909f45b51fea98c8", + "name": "annotated-types", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "4e89d670a4b20029da30e5a9e8ebcbc844deff9c44209552bafd5537249c8b9e", + "name": "anthropic", + "version": "1.9.0" + }, + { + "direct_url": null, + "metadata_sha256": "b5a6f00800956387fcddab1fe1b5aa8502c249b86cfb16d58ed700f282f60142", + "name": "antlr4-python3-runtime", + "version": "4.9.3" + }, + { + "direct_url": null, + "metadata_sha256": "a6008defa9492cd08250217b134782cad1db4580e1d7ddf69cc2a2a48cea24e0", + "name": "anyio", + "version": "4.15.1" + }, + { + "direct_url": null, + "metadata_sha256": "7877c64ce8957237363f2df313819bb07f50752df016d14c5a5a99bec10f5deb", + "name": "apache-tvm-ffi", + "version": "0.1.11" + }, + { + "direct_url": null, + "metadata_sha256": "3543ca8f0e072c00ab111b20eba99ce86dbf93ada28988775bc2677284b3c07a", + "name": "astor", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "d4b328c09c024fe1e4d788a9c7715ad726095131b815cd35fd933268226f6269", + "name": "attrs", + "version": "26.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "4850c4d696a5e2a2ecbb3dd792b060acc1de79e09800669b0b9fc3a22c055e6d", + "name": "av", + "version": "19.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "863ff92208d0a02dabfa008bfe91846a5c401ded301e5687dca7dc63c911865f", + "name": "babel", + "version": "2.18.0" + }, + { + "direct_url": null, + "metadata_sha256": "f32e6df3197f05202e586624d95c5e217003d80cee655c165d533102f628df21", + "name": "backrefs", + "version": "8.0" + }, + { + "direct_url": null, + "metadata_sha256": "905c362f655fbc6d37a24686efc2b3bfbd3123b8ee5a443a43f6750d87455e90", + "name": "blake3", + "version": "1.0.10" + }, + { + "direct_url": null, + "metadata_sha256": "07c85682b6aefd5c9b48890d306c1604311902295704892ede48e5a83219a8d3", + "name": "blobfile", + "version": "3.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "2d582941a7081625a35f35a0c4a2e80f7737312e29c38e5fdb6fc08f9c113077", + "name": "bracex", + "version": "3.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "3b60c55bae0d0340c3a3fd918635bbfa3087579da66e0fd7f6be7a3782c0da3d", + "name": "cachetools", + "version": "7.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "5d11a6878d5bc3f22290281a19ef7b36daa95c910780950608b95cd788c7e12e", + "name": "cbor2", + "version": "6.1.4" + }, + { + "direct_url": null, + "metadata_sha256": "362c9942c48051f168ed2b9f2146266b7792d3c05e164cd6afc3f3b65884fdc9", + "name": "certifi", + "version": "2026.7.22" + }, + { + "direct_url": null, + "metadata_sha256": "b4abf1bcf1c1d8e0272d8007fc974499ea59e5f2a5b98af3c78a5e67515a9d87", + "name": "cffi", + "version": "2.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "766120f13c177446f51929a4d201104bc935b6d5a2a176cd6716edce757d3d95", + "name": "cfgv", + "version": "3.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "610e9a9d03ce837ffe6e42be5e02e70087f73863f7350bf7bb7f0511edcc5ec0", + "name": "charset-normalizer", + "version": "3.5.2" + }, + { + "direct_url": null, + "metadata_sha256": "7ad836b3147c9702546d9c28b4fa5be23b24445439db5d0d2a58d17281c84daa", + "name": "click", + "version": "8.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "4c5f00599ebcbf11d337e48a72784d256ca3d704fa9e9f5daadd60065e6776b7", + "name": "cloudpickle", + "version": "3.1.2" + }, + { + "direct_url": null, + "metadata_sha256": "a0970189e3ab7a596d6902d5f61f93b414f138f03d3cf19029145657bfceb382", + "name": "cmake", + "version": "4.1.2" + }, + { + "direct_url": null, + "metadata_sha256": "94a6ebf9718e55f254a43ce0d2f04e0d6d44e7141b6f3144a84feb6519a77bfd", + "name": "colorama", + "version": "0.4.6" + }, + { + "direct_url": null, + "metadata_sha256": "ca8ec227f406d970a645ec482b20619128dd34b9cf71159cc24e27db461a2711", + "name": "colorful", + "version": "0.5.8" + }, + { + "direct_url": null, + "metadata_sha256": "bbaa51b7e4d8f142bd075d01257c0572c0c844796d51426e35c8096a13e8da76", + "name": "compressed-tensors", + "version": "0.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "6063d8ff7ebc458d63a4332853d7ababf4ee2b86336362c8d2b12be6e998eb6b", + "name": "connectrpc", + "version": "0.11.1" + }, + { + "direct_url": null, + "metadata_sha256": "ac5f4b5a5f68080bd9c3fe77399fe8a1bff2ee5923c49db1df544dd054cbf15b", + "name": "cryptography", + "version": "50.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "f41d2f6b4616accca2f5e1dd47aa9e8937c28076cde698226d93e727751f3099", + "name": "cuda-bindings", + "version": "13.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "e5ca6ed34c687c6f4a4d157ad0a2cf06ec0316fe8c4c0ddeb666ad76dd6f30f4", + "name": "cuda-core", + "version": "1.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "89baadd9da23dce9990481519544115615ba3cbd2d1a41e09feea7756fffb378", + "name": "cuda-pathfinder", + "version": "1.8.2" + }, + { + "direct_url": null, + "metadata_sha256": "1ab914b9a57ca601df2e3cfe9608427b15d8afb78029076ace5d1caf9fd45f08", + "name": "cuda-python", + "version": "13.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "73d97a5eb578223b4895ef4f234574d14219cef9999ff7d0e92a3d0dd057bd3f", + "name": "cuda-tile", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "ae6f957fe66ed63081d1d83ee6e8838f3a0af2c6fce1223629d0dd6264565ead", + "name": "cuda-toolkit", + "version": "13.0.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "1f8e0ae51ad5feea63f58ed2e24f3da6f23ed548043235a14f7623d961dd9b64", + "name": "datasets", + "version": "5.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "153f4a4d6ff03dbe5c8ad7fe54bc2e7b989a4947b70f7aa77fbf652b394f2a2e", + "name": "depyf", + "version": "0.20.0" + }, + { + "direct_url": null, + "metadata_sha256": "ee09fc752d7271aac93079cfd63409957dc6b536c1ffd9355a01bf7297e72aa6", + "name": "detect-installer", + "version": "0.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "a7feab2c4f69fd5f85e5a3cb495a7f1870a6bf8199dcee5339e8118f7acbdc09", + "name": "dill", + "version": "0.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "fef3fde661fe30ba7bd1d78841a797136b2b3461705bb4eb92dc54f8308bbaae", + "name": "distlib", + "version": "0.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "fef3fde661fe30ba7bd1d78841a797136b2b3461705bb4eb92dc54f8308bbaae", + "name": "distlib", + "version": "0.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "a3ca2e39abe76c4a33d5fe4a2a84375ec9f25cdfdb7e1d8ea406bd6f1603205c", + "name": "dnspython", + "version": "2.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "92a07daad5e6ff461199de14e845d9b376e309ef916ce5379f3c9cd4e3b1623f", + "name": "dockerfile-parse", + "version": "2.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "5b566b25f0cbe4955d0b16844a7cc6d2002caa3bde2dfda7f301fd8870cbaa56", + "name": "docstring_parser", + "version": "0.18.0" + }, + { + "direct_url": null, + "metadata_sha256": "5a1080b5768c6c591e1c4f9c9812cafa808781b9eeb198043bf185e22d4a1613", + "name": "e2b", + "version": "2.51.0" + }, + { + "direct_url": null, + "metadata_sha256": "0a63979e0b946e16238e4339e60d9c1eb5a7ce3ea93dae78b5da9c65a6190540", + "name": "einops", + "version": "0.8.2" + }, + { + "direct_url": null, + "metadata_sha256": "16cbe67a57558f1d4bfdbc22a454434ba301750c57a62b1d3f5361c9e5cddc00", + "name": "email-validator", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "0617ddb55b90b42ddc9398dc7e91d61fe928a2504939f76526dc15b22d238caa", + "name": "fastapi", + "version": "0.136.3" + }, + { + "direct_url": null, + "metadata_sha256": "ddd82b9666c21988e234d623e2575e1b89fd4133260eeab43fc9a7c074f7024a", + "name": "fastapi-cli", + "version": "0.0.32" + }, + { + "direct_url": null, + "metadata_sha256": "611602e834d42e10433155ff5f5581358d732fa6b6f6f7820a8f79e74b1ce1f9", + "name": "fastapi-cloud-cli", + "version": "0.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "794524e4a9659bda6043721d848d028ea49996085a33326094fbaaa3f6e6b895", + "name": "fastar", + "version": "0.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "711401d36e60e10e35beb4d0f1bb42bf0c4d86339ae52f32b9aa4a4d790530dd", + "name": "fastsafetensors", + "version": "0.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "efaea9742e348c4c4bdcc6f616a33cc5aa3ae926494a72a46690b7da2f08ed5c", + "name": "filelock", + "version": "4.0.7" + }, + { + "direct_url": null, + "metadata_sha256": "99bd6c3f10781d3d2d350f2c3c9fc4765b55f25de8a6d6dd1f71501802d1255e", + "name": "fla-core", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "0a6ef979b75295cee2b5293ad4942b0cf2682e9e38680203064e0b70249c1a96", + "name": "flash-linear-attention", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "76b70a11ca82ea4606b529e7a8658cb3fe71412afa46f2ed57101dd91ba27558", + "name": "flashinfer-python", + "version": "0.6.18.post1" + }, + { + "direct_url": null, + "metadata_sha256": "ba8ff415192b5cbb90efce046e2271a00c8184afc362d8b47fbbc84d5e558b05", + "name": "frozenlist", + "version": "1.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "e7712831c80eb13b08fb7f7cc33988a8f24654af9eba7c6f5f943b2636e4306a", + "name": "fsspec", + "version": "2026.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "025de85c794878d0caa737869307447595f514ebf9599eacb5b1a501bae479b6", + "name": "fsspec", + "version": "2026.9.0" + }, + { + "direct_url": null, + "metadata_sha256": "ca94883bdeaa3740b45b6994443b445fd67c6e4a8064ac3bf9d92d2a5221eee8", + "name": "ghp-import", + "version": "2.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "a7e90983562a035cf767baa63d8c32bc37e1de7cad71ac7b6b2bc70a95bba4eb", + "name": "gitdb", + "version": "4.0.12" + }, + { + "direct_url": null, + "metadata_sha256": "dd96143ec79178bef685c1f5c0a58a87a66d003b421e605de65697308321d518", + "name": "google-api-core", + "version": "2.40.0" + }, + { + "direct_url": null, + "metadata_sha256": "0735d57088a83df2355e16843107fb0112abe2178fc5bb8132947a7ad962aa41", + "name": "google-auth", + "version": "2.59.1" + }, + { + "direct_url": null, + "metadata_sha256": "2f3aa9d9500d329560440e6a5a152e420aad5f5bbb23701f45b740be721784a1", + "name": "googleapis-common-protos", + "version": "1.75.5" + }, + { + "direct_url": null, + "metadata_sha256": "06d74ab04fdc03fad368868907f0d10e7d9f397aab58d58965c0b78ffaec34cc", + "name": "griffelib", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "7ee1c179e2c68a62968308b2f96f4f3469176ee3ac8bdb494ac80188d4d41271", + "name": "grpcio", + "version": "1.84.0" + }, + { + "direct_url": null, + "metadata_sha256": "04cf3a4a91575850f386f4fcfdedd8e7fbfba08feff038fbc1296d1e854db2dd", + "name": "h11", + "version": "0.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "b954a6ba4739c0cc878bb8ea27ea7c7154a48bb4b7c06dba9e9cf880cf0ec930", + "name": "h2", + "version": "4.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "6f0d7bf86e75d0bda1ceccc82367c0145ad0ec522c4d4f51bb454f467faadcc9", + "name": "hf-xet", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "f991b847550cf8225f69562902b5ccb591b2ce9a08fe07ef6e6d701bdb4694a7", + "name": "hpack", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "314d194165c4700034c1c67cee847d549a6d7091374c71f2cef0186ec56a3eb9", + "name": "httpcore", + "version": "1.0.9" + }, + { + "direct_url": null, + "metadata_sha256": "aed9767360bed1bcbda71e3b1a3c996603f86558bc77a1693ee3d09973d20cad", + "name": "httpcore2", + "version": "2.13.1" + }, + { + "direct_url": null, + "metadata_sha256": "8fa3bf3510c35e2eea9f523a1cace7120079cf51d76c4acea97de95806aaa14a", + "name": "httptools", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "3bf4804c215d111b6a4702cf9000021ab39807d1ed3207dd011b14b2843b2d14", + "name": "httpx", + "version": "0.28.1" + }, + { + "direct_url": null, + "metadata_sha256": "d11dd50813b8914bd9455e8b2b591171cd2b1618883943153afadc8bb9224678", + "name": "httpx2", + "version": "2.13.1" + }, + { + "direct_url": null, + "metadata_sha256": "43b119c34ad2b2aacc032a1a6a8feb142fdb5ca407a3519325d74dd53d8904df", + "name": "huggingface_hub", + "version": "1.33.0" + }, + { + "direct_url": null, + "metadata_sha256": "9ce850d5a6b775e5ef4a335f907e579a878e058213121b6eec567781ea68c585", + "name": "humming-kernels", + "version": "0.1.12" + }, + { + "direct_url": null, + "metadata_sha256": "67aa4f6717d82446a51ce350e7c4769eba0c4a22d2f428255cddd9d24b11a914", + "name": "hyperframe", + "version": "6.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd9511ede42f63b995c3f71944f908cb8f014048b63ecc1c8d420525a3354b59", + "name": "identify", + "version": "2.6.20" + }, + { + "direct_url": null, + "metadata_sha256": "af3c3a62bb5d82d6a43454684e0b1dedde27a21ea90eacfb1bed9814619f06d0", + "name": "idna", + "version": "3.20" + }, + { + "direct_url": null, + "metadata_sha256": "cf71393f3d079ce2e859384573e65aaacd1709bef700701f629df32398b598f0", + "name": "ijson", + "version": "3.5.1" + }, + { + "direct_url": null, + "metadata_sha256": "9305763e93d03df0e36516b1125fa046a6ebe37d44589e200e0593cf4bdfd980", + "name": "importlib_metadata", + "version": "9.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "32860c3c19b2e91f6cb5bd83400b5870cda051bc74a5a08822c8c666af0990db", + "name": "iniconfig", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "560faabb3d45d779e445a74e7e806a786f95f2200fa06d979603b7f0ee1cfb39", + "name": "instanttensor", + "version": "0.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "f6fc1f0d389e4245fc2a1a0fdfee09422e56200cb6f94659668456997ff4f7a9", + "name": "interegular", + "version": "0.3.3" + }, + { + "direct_url": null, + "metadata_sha256": "d10f300731197a4829b77f0c883bb3cf8a37ae8c76a302e095fa95d6427706d0", + "name": "jiter", + "version": "0.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "5b0c8d4b4c535a2432fb206223d774509b6e20af374c6a4b6f98bf72a7de6702", + "name": "jmespath", + "version": "1.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "6c4032c2e74273452cd77399af2ee85198f49c22da897983f26d2ed6f787c4e8", + "name": "jsonschema", + "version": "4.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "aaa6cd66f423729e8da397c9d533b7d731f6b25f3d6371b9338c36bdb9be74a0", + "name": "jsonschema-specifications", + "version": "2025.9.1" + }, + { + "direct_url": null, + "metadata_sha256": "f7c0687c032593106a2e5a3c241cf8043e7e2c222bddb0022b4cb2bf5de67115", + "name": "lark", + "version": "1.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "4511c6b04efc57a5f5333edc1f5f48b9f5412c3923d4bc19b715bdf47977511c", + "name": "linkify-it-py", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "be929870f6ecae18a819c56118f1101f3076e25ac6a4843ca6f4707ebd1e87c6", + "name": "llguidance", + "version": "1.7.6" + }, + { + "direct_url": null, + "metadata_sha256": "cf2b87669bead3e76ec54207f3354c13f73b50c32fcd13c8d627084b3379139e", + "name": "llvmlite", + "version": "0.47.0" + }, + { + "direct_url": null, + "metadata_sha256": "0a416d79c5543d94d2b18807626293d4f47655d1d22724c7ae296e413078aaba", + "name": "lm-format-enforcer", + "version": "0.11.3" + }, + { + "direct_url": null, + "metadata_sha256": "16bc1f59e34fd2a6633bd395276052eacd2c777b2cf72781e76b203f013a8fac", + "name": "loguru", + "version": "0.7.3" + }, + { + "direct_url": null, + "metadata_sha256": "5216d5acfd039a7b581a826186309594b228d37d2c8d56864124ea666689fe4e", + "name": "lxml", + "version": "6.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "f59d772b35315a928672bfcccfb89d82c0aac672c5275c048f7a93b79015bcea", + "name": "markdown-it-py", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "b137367ef0056711cbf5e53015df9168cab80373104e7899b1c0263a21d9c99c", + "name": "mcp", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "38e0b9edaae09e58cd1461fc961ced22672038a697930bedef153a74befb3de1", + "name": "mcp-types", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "799f49685865fd9cc8915fdb92a33e102eeeffad562b03b4aeffb6f422b771c1", + "name": "mdit-py-plugins", + "version": "0.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "481f9cbe08596c6eaba6343e0efa1b13b2362c30dce0610f7c08523f1d98388d", + "name": "mdurl", + "version": "0.1.2" + }, + { + "direct_url": "{\"dir_info\": {\"editable\": true}, \"url\": \"file:///Megatron-LM-training\"}", + "metadata_sha256": "2876c0c760bbfc93bd7d737bf0db2866a937308a7c1707c3a2bb59d4795986ff", + "name": "megatron-core", + "version": "0.16.0rc0" + }, + { + "direct_url": null, + "metadata_sha256": "a6e34d488c879f57ce042bec38f8864ba3ea7d6ecf0ab757fc88fe8dc0a22f26", + "name": "memray", + "version": "1.20.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd26d80dc9676b1fb8c894355bd525fbe7f49a6a86a555c72e9ec6d927247c33", + "name": "mergedeep", + "version": "1.3.4" + }, + { + "direct_url": null, + "metadata_sha256": "dd1b3b89e88d1c65a26e6e72dd075eabbc220bfb138769ec8b64578ee911795c", + "name": "mistral_common", + "version": "1.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "4859847a9f6321daf8849cf7fd1542ff430db6563a2abf9ac0d62a5b21bd951d", + "name": "mkdocs", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "1729fc31479f2582486cdc85397417659dd3b2fb3f920553de66cfe59d5f0b3e", + "name": "mkdocs-awesome-nav", + "version": "3.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "88b4b7b7c0aba5547befdedaf515c8df4867361daf55ff60b72578464d72dcbe", + "name": "mkdocs-get-deps", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "ad33bb33fb16b1f69689c4682550e97232154e367e2c8c8aee9dad0f10d269ce", + "name": "mkdocs-git-revision-date-localized-plugin", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "ed69fbfb9ac00c10c5a383a12ff9d2b9919ae184e408554434199211643d6040", + "name": "mkdocs-material", + "version": "9.7.7" + }, + { + "direct_url": null, + "metadata_sha256": "d1c549b61701148b97f8246bc924b2840e504b37b0ce7a27e78ddf81261e5363", + "name": "mkdocs-material-extensions", + "version": "1.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "4ad6171f3bf6812e4de90670ff0089d445093d4fe1d05d55f17b96a4a192a816", + "name": "ml_dtypes", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "4ad6171f3bf6812e4de90670ff0089d445093d4fe1d05d55f17b96a4a192a816", + "name": "ml_dtypes", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "b0dbdfa30ab6b1ce637a794899c9e43019182b6d1ab2d07b90f647f7331eba6b", + "name": "model-hosting-container-standards", + "version": "0.1.16" + }, + { + "direct_url": null, + "metadata_sha256": "95424470e481cfa8d18b30963b6de3aafe16614b1ea0414e184a008571dde84f", + "name": "mpmath", + "version": "1.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "eb184d83489401903615ce8a78d98d5b933dec0f7246811d396a529915fe797c", + "name": "msgpack", + "version": "1.2.3" + }, + { + "direct_url": null, + "metadata_sha256": "520006303d6a0e859970b83f7d452196e2e8f6dab08f6dcf1ba5823c1230025f", + "name": "msgspec", + "version": "0.22.0" + }, + { + "direct_url": null, + "metadata_sha256": "010d2fe039006070a711a476b171b7b7da5c29ccad3c4eecd77ef3711b07c2d0", + "name": "multidict", + "version": "6.9.1" + }, + { + "direct_url": null, + "metadata_sha256": "235634cc7ebda45f8a84dfdb1b9b35ac1a77a1888b34650c3a616d23e4a7e93f", + "name": "multiprocess", + "version": "0.70.19" + }, + { + "direct_url": null, + "metadata_sha256": "7c545b4b3e5e83d3fde41352272c10cb9deeaba5b7138fbf24383e952af8822e", + "name": "natsort", + "version": "8.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "311ee8cdaeaf9f11acf51cda9c3b5b191f76ce9d98bc3418164c3189bbc37a08", + "name": "nccl4py", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "66360539217852c3b44b37f409eade7e1559baf018bb363bacb2aa3a9759b203", + "name": "networkx", + "version": "3.7" + }, + { + "direct_url": null, + "metadata_sha256": "e8b0b1746808b87816c47e4531780ded7f246bed9575a89e8b40200aa81e9a13", + "name": "ninja", + "version": "1.13.2" + }, + { + "direct_url": null, + "metadata_sha256": "77c1117f0dbc41560ddc6e6b37b542fb4e88afcd4ef82ec06593e5bbd5f37121", + "name": "nodeenv", + "version": "1.11.0" + }, + { + "direct_url": null, + "metadata_sha256": "9af629898406c9eaa69897fe09220dc483270cdba89f6b20bf0165cdf0e1668e", + "name": "numba", + "version": "0.65.0" + }, + { + "direct_url": null, + "metadata_sha256": "0c7281a81cf76e40b27c1385ffd8a215d7227adc219f177ce807ead9e91994a5", + "name": "numpy", + "version": "2.3.5" + }, + { + "direct_url": null, + "metadata_sha256": "0c7281a81cf76e40b27c1385ffd8a215d7227adc219f177ce807ead9e91994a5", + "name": "numpy", + "version": "2.3.5" + }, + { + "direct_url": null, + "metadata_sha256": "bab990ced4537ce74ef5961ca933c4c6fd604fd09a5827a4a428c55bcb0be35b", + "name": "nvdlfw_inspect", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "10f6595146332d35f7f15a000e08b5c81432528c5d026470c1d03f0c1399fb70", + "name": "nvidia-cublas", + "version": "13.1.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "58e933b4ac8e49f098b16ab7480d03bd792afc3d1db10d0aacbdcc2c62e48fa3", + "name": "nvidia-cuda-cccl", + "version": "13.3.4.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "baac937970681d41aa0c3708b3d55d73f8d29e70aceaac0e71fe6d1548e94a09", + "name": "nvidia-cuda-crt", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "8d51e5c76ef5707b0b80d5ec9a791c0f11a480ab721820cf100a3cc566017eef", + "name": "nvidia-cuda-cupti", + "version": "13.0.85" + }, + { + "direct_url": null, + "metadata_sha256": "724bf56e61ddef5d4c2482ff64103a973b911b110b668acaea5373f6c83c1c5c", + "name": "nvidia-cuda-nvcc", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "c54801dbd815d534519a761f1f328325aa0f1d1f1659aa969fa74e7a2c76eee9", + "name": "nvidia-cuda-nvdisasm", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "af51f248363020b9fdfd2743704e901bf3d19a1a1ce1fe44fb98ba148bfc0157", + "name": "nvidia-cuda-nvrtc", + "version": "13.0.88" + }, + { + "direct_url": null, + "metadata_sha256": "055f7fc69a5a2159de82cd0718da02c8852e81c8a71ebb117b8e799badd7167e", + "name": "nvidia-cuda-runtime", + "version": "13.0.96" + }, + { + "direct_url": null, + "metadata_sha256": "df18686dbdb3074ca375a1d6c623a04102fd348950c67a721397349c6d4f0477", + "name": "nvidia-cudnn-cu13", + "version": "9.20.0.48" + }, + { + "direct_url": null, + "metadata_sha256": "abd0ca3f67af19a4d383ff2a012ae0090d4731c6492fd47236615308a50b3981", + "name": "nvidia-cudnn-frontend", + "version": "1.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "4a78545d424d0c5038353f7046a8ae40ceaf312045d71399eac9511f5fc15434", + "name": "nvidia-cufft", + "version": "12.0.0.61" + }, + { + "direct_url": null, + "metadata_sha256": "e49b909195c03ddbe203729d9b31dd88e3f207368333d1909c67c6b130a0c696", + "name": "nvidia-cufile", + "version": "1.15.1.6" + }, + { + "direct_url": null, + "metadata_sha256": "bb15a754c6be32c23aaac13c1cfa7a8ce53d92bc26652ec3b609f7a5cce3e7d1", + "name": "nvidia-curand", + "version": "10.4.0.35" + }, + { + "direct_url": null, + "metadata_sha256": "0dd58f677811eac04901a793740932e5a2a8fff2f5453aa6351614eb18391bb6", + "name": "nvidia-cusolver", + "version": "12.0.4.66" + }, + { + "direct_url": null, + "metadata_sha256": "8aeb284782ef6883095a5d1c110e221cad023a99afcfd5cdb4969a25e146d562", + "name": "nvidia-cusparse", + "version": "12.6.3.3" + }, + { + "direct_url": null, + "metadata_sha256": "09555246122896eaca3b8313eecfca4b339fefd3b597874cb9fe3bf29dab38c9", + "name": "nvidia-cusparselt-cu13", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "ac77bac79fbfb0c52ac6e2e5abc936b1e127be2192f0cbc27b00be3125fa86ae", + "name": "nvidia-cutlass-dsl", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "1ec968ec7c4083f7fe4e1fb8384c7e9b853a81491fef9f4cb1cf755961aaedf6", + "name": "nvidia-cutlass-dsl-libs-base", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "cc6f3846cd820013eaa6e2665c493d70c607be6ce7349b939eb4742888470585", + "name": "nvidia-cutlass-dsl-libs-core", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "2357d0df2d0d17c0b16663b8a89df53f751b19721f66821fd88fa78112c08e55", + "name": "nvidia-cutlass-dsl-libs-cu12", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "244590c25662dcf777b1daae97a858afe1a1aec62e5e6678b217007a459ab552", + "name": "nvidia-cutlass-dsl-libs-cu13", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "c3a25ada01f57418c1b897406c3abab18834e6adc573ab7b060620c453afb6db", + "name": "nvidia-ml-py", + "version": "13.615.71" + }, + { + "direct_url": null, + "metadata_sha256": "56baad4e7f699902b03b17580933f7bd50b6ea97b7df9d7e807750973da7529c", + "name": "nvidia-nccl-cu13", + "version": "2.29.7" + }, + { + "direct_url": null, + "metadata_sha256": "98810ef0ab8badc369e6a46a038f8ee9f412c0c753fb5ad580544f23a0aa7962", + "name": "nvidia-nvjitlink", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "b0f54ee21909d19640a58e05da755c91763eb5725f544fd0d4b84b2f5f94deba", + "name": "nvidia-nvshmem-cu13", + "version": "3.4.5" + }, + { + "direct_url": null, + "metadata_sha256": "06dc1a593c7e8b8c3f29184228c83f8f7ef57787ad91f3e5bcae1d238dd3092a", + "name": "nvidia-nvtx", + "version": "13.0.85" + }, + { + "direct_url": null, + "metadata_sha256": "32ee63450a437b6a6ed227ff6549144aa596197a322993521ec7af826ebd413e", + "name": "nvidia-nvvm", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "32c2efdcd2c673b3b7f35ca9c2cccefaad36f1f0a920648a13cad85f6a5767b2", + "name": "nvtx", + "version": "0.2.15" + }, + { + "direct_url": null, + "metadata_sha256": "3419d80e114a2c19fa9bd3582939a3942f19673055707ba6ca2ca489d58b41e0", + "name": "omegaconf", + "version": "2.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "28971076ce9c279d4b889496b046d55a1e05b02fb9851ceb717e9a10df799572", + "name": "onnx", + "version": "1.23.1" + }, + { + "direct_url": null, + "metadata_sha256": "1246f5a4d8295907a42e809ed9173ede2510ec9d260d2168989d126564897fa5", + "name": "onnx-ir", + "version": "1.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "e14643636835759700dff286f949c5ec34e7eac7ac47f44096414f0e0f1c3101", + "name": "onnxscript", + "version": "0.7.2" + }, + { + "direct_url": null, + "metadata_sha256": "00f847e99939207bd70dfd806428f6b20a3d01074b59325e4c76149a2e19be26", + "name": "openai", + "version": "3.22.1" + }, + { + "direct_url": null, + "metadata_sha256": "598d3ad5a22a14a7c4f1d218b43e345f32b0ba094b753467bae8a3f708fd48cb", + "name": "openai-agents", + "version": "0.22.3" + }, + { + "direct_url": null, + "metadata_sha256": "5a0afcb1ce845e05da12beb1767f5d2749bbc9e9050718c6b9fa3c225713c9eb", + "name": "openai-harmony", + "version": "0.0.8" + }, + { + "direct_url": null, + "metadata_sha256": "e86a6b6fcbbe152805f782c57df321002892e163019574877e9829272e25eb4e", + "name": "opencensus", + "version": "0.11.4" + }, + { + "direct_url": null, + "metadata_sha256": "53d669c8bd3d32d3275153b454e515ca5cc6dec92fae3a98309b5a2b19fe6d2d", + "name": "opencensus-context", + "version": "0.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "19778b6d66b0e45bf73e11fa37a208949d5b393aef914627394d5601455546a6", + "name": "opencv-python-headless", + "version": "5.0.0.93" + }, + { + "direct_url": null, + "metadata_sha256": "19778b6d66b0e45bf73e11fa37a208949d5b393aef914627394d5601455546a6", + "name": "opencv-python-headless", + "version": "5.0.0.93" + }, + { + "direct_url": null, + "metadata_sha256": "a3f5434fa7c80f7f7abc82173da639c8e9c59d30b4027182645562bd3d2f4f97", + "name": "opentelemetry-api", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "8611977ea596e4827874582e86250618444e1c718229dddfc16e5ea437ce5fcb", + "name": "opentelemetry-exporter-http-transport", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "2cfd41e5ca33292d987ba71fa6186d11e16ed66888f3a26f8a3a99060c4b5e90", + "name": "opentelemetry-exporter-otlp", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "3bb4494220732d4bf10e1dba231ea7638cedaa5362e1f23a50d34a14f520fea8", + "name": "opentelemetry-exporter-otlp-common", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "27fb1c8aa5c2cd07776f9f3281fc618cd3feb96017757c33d2b3586fb7fec88b", + "name": "opentelemetry-exporter-otlp-proto-common", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "5cba6098cdd0bfb06853a6c704a2451c4f82c9dea376a30b59ecd279296648ad", + "name": "opentelemetry-exporter-otlp-proto-grpc", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "6f53ef1c172ebf87af69b9ef390aa908506d0cd14bc7811985fdd937a4058808", + "name": "opentelemetry-exporter-otlp-proto-http", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "1910f4e7ebd497e98b6d231e10275288fda2cd1885117575706c62f45e065889", + "name": "opentelemetry-exporter-prometheus", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "fab18b721e30be41448be252e1dca43b48e7f15d971e0bb552492c0ef4b07bee", + "name": "opentelemetry-proto", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "3644a79f55762a646799ff52b9d837e01c8192b7b28f735a383f55c90edb9bc2", + "name": "opentelemetry-sdk", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "add3db481f7f401f65cfbddb058fde3bb4c9dd7b61064a84f8598ad7efe0b11c", + "name": "opentelemetry-semantic-conventions", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "0dfff30e912520a226bcf7a547393484cfcd8c738439c7b48418f61c95109480", + "name": "opentelemetry-semantic-conventions-ai", + "version": "0.5.1" + }, + { + "direct_url": null, + "metadata_sha256": "210ce26bad0a245a72831b4fa029708c245d4d670a88c8d5a69b1446c24a95e4", + "name": "orjson", + "version": "3.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "35ff73511848f5f934ccc39d538014716ec4579e76d54e0e407ff51794a7939c", + "name": "outlines_core", + "version": "0.2.14" + }, + { + "direct_url": null, + "metadata_sha256": "8ee2f7138ade46b6e348a6d099612f5bd6caff13511f3b4144327f37ce50eacf", + "name": "packaging", + "version": "26.3" + }, + { + "direct_url": null, + "metadata_sha256": "a4ab87bf8083001f25ccdc46095f05b678b3569dd58edc2cf941e3e7f64d7c88", + "name": "paginate", + "version": "0.5.7" + }, + { + "direct_url": null, + "metadata_sha256": "1de96a6c28c2e5613c9c87cd4ad9484791001cf58df43cf2ba74d5c4f85f0ad2", + "name": "pandas", + "version": "3.0.6" + }, + { + "direct_url": null, + "metadata_sha256": "d05b8d05da9f78176b2eefaacdfaa5e96708ec4f488daea8bbc52e3ed1bc3954", + "name": "partial-json-parser", + "version": "0.2.1.1.post7" + }, + { + "direct_url": null, + "metadata_sha256": "c1d126edceac2685e29403a8ae3a27c47143dce1f0252fa3931771562f1e2b4f", + "name": "pathspec", + "version": "1.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "30325dc8ce17bc64f9dbc0a449232fd35841a019df22a6f481007c9c5a28c1cb", + "name": "pillow", + "version": "12.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "cbc0b7b6e63b50dcb7c17cf3526a9304f285d9a31353adf3b22acc2059ab23f5", + "name": "pip", + "version": "25.0.1" + }, + { + "direct_url": "{\"dir_info\": {}, \"url\": \"file:///work\"}", + "metadata_sha256": "6ba03b5bc457a2a3d92468729501b5892a0d38ebcc36766c58859449498c5743", + "name": "pip", + "version": "26.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "0421937c4410b61c5325233d5b7671ae933bae8de174f87586ac55aa804851ea", + "name": "platformdirs", + "version": "4.12.2" + }, + { + "direct_url": null, + "metadata_sha256": "2bcffab42626e1fb50d6329765619312d30fe7f4880e98dcee99c92ebd283bb4", + "name": "pluggy", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "7e7562ba7c032f8edd02641ae71b1ac2d8f388103a68d777a7e907d19e75bc17", + "name": "pre_commit", + "version": "4.6.2" + }, + { + "direct_url": null, + "metadata_sha256": "bbe0a7662602ddd23f929fe0ee98e9d04406e138aeee18ce4861af186ea6060d", + "name": "prometheus-fastapi-instrumentator", + "version": "8.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "ece4a61f3ffb92a083fd5e47e180e3e070342e60a3bd93876a879e79a643e821", + "name": "prometheus_client", + "version": "0.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "5feba21a58eaa126e7e7739e57e2572e5bb251fcbf56e439e508acc47d769314", + "name": "propcache", + "version": "0.5.4" + }, + { + "direct_url": null, + "metadata_sha256": "3f136dbf7239c987a7685acd33440cc5efd6c4107b4b11c425201b4de70ae36f", + "name": "proto-plus", + "version": "1.29.0" + }, + { + "direct_url": null, + "metadata_sha256": "118b5ad013120a7a6e24714595ad776bf264d7b0060389133310d18ea1480902", + "name": "protobuf", + "version": "7.36.2" + }, + { + "direct_url": null, + "metadata_sha256": "0849f5a519bf9bc23ef204443fdd8d6d10678863acac7ca9340fc11bfba5a856", + "name": "protobuf-py", + "version": "0.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "eab5f2f4fd98f67a710a8fb1975b64ffa880a4f977566f022c567e08e324ccd6", + "name": "protobuf-py-ext", + "version": "0.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "39009938840de3a8b2a37eb4668d2601aae8c74e4b74743f73e59996b5b7e6e1", + "name": "psutil", + "version": "7.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "df44b58e8a4cfe57f65773ec47f7bdf2a14c8f5f73a7abf331a6b6237d6d691a", + "name": "py-cpuinfo", + "version": "9.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "2fd4a9efc5e5c74ae4c2fcf1970193c524c62ab22af8d5e66ebf7df9e6e46e83", + "name": "py-spy", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "d2ccdeb15cddedc81637a83e40baa6397fe269023b738d0fc3cb2d90722e290b", + "name": "pyarrow", + "version": "25.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "47b9f28e971a56f5adf949e0bcf105b0bf6587946566ecf197a2819d8848cc01", + "name": "pyasn1", + "version": "0.6.4" + }, + { + "direct_url": null, + "metadata_sha256": "82ce4c01c6d36841b9801fcdabab9bfe61d0b5e4e440c275941d8a2d4a790730", + "name": "pyasn1_modules", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "45cb345e4c12f63bc843b8c88902cc44c4d624a55aaef8cd5ffbc0ad16356fbe", + "name": "pybase64", + "version": "1.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "d311ae661edeac8ff029ab2960d065a7e792ebf8f79af682daa53109fe81318b", + "name": "pybind11", + "version": "3.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "cce9c0d440d065d4cdfb0d00004b8ddd65cf363a740efc5b0920b29201a59cd9", + "name": "pycountry", + "version": "26.2.16" + }, + { + "direct_url": null, + "metadata_sha256": "a1e33542883c249bf6c263b0023b9ea8a6131a77d9cb2cbc88316968e5eada83", + "name": "pycparser", + "version": "3.0" + }, + { + "direct_url": null, + "metadata_sha256": "faffcc4d7d359cb1047a9f67f7c65096b838c6db6c62852ef20fb27d55649a95", + "name": "pycryptodomex", + "version": "3.23.0" + }, + { + "direct_url": null, + "metadata_sha256": "98929f4cb80451dc3c6c8cd541a3081dccf0dee94afe7d9fa5c214a18ff236ce", + "name": "pydantic", + "version": "2.13.5" + }, + { + "direct_url": null, + "metadata_sha256": "8eccadbe707db97c397fb79073fe791b7998ef3a85f04f817f8991f7697b190b", + "name": "pydantic-extra-types", + "version": "2.11.1" + }, + { + "direct_url": null, + "metadata_sha256": "8f00c91deb34399316a5386eb2e76fe09f14a08dc3045f2e7dce9bf8573796bd", + "name": "pydantic-settings", + "version": "2.15.0" + }, + { + "direct_url": null, + "metadata_sha256": "66c729edddc20bf2764bb18bd87d907b08690e50355f39b97acc737b26d1d164", + "name": "pydantic_core", + "version": "2.46.5" + }, + { + "direct_url": null, + "metadata_sha256": "394500d78a0c1a433ae8ca3693152c08f6a901121d4b069cf1540a19759e2950", + "name": "pylatexenc", + "version": "2.11" + }, + { + "direct_url": null, + "metadata_sha256": "df2e9e9847a2aea0ae6e20fd325aeb16cf3ce7f8913462db6c2398363cd0c0bf", + "name": "pymdown-extensions", + "version": "12.1" + }, + { + "direct_url": null, + "metadata_sha256": "82fcfe724db9f0b51348da89f4f5cdc0b08d08882b1bbc0ca4913d3a0a93bcb9", + "name": "pynvvideocodec", + "version": "2.0.4" + }, + { + "direct_url": null, + "metadata_sha256": "3722422cc1478b175879143dfb78f98b7a5f53f4f684d71b7054fe2e8acd3b89", + "name": "pyqwest", + "version": "0.10.0" + }, + { + "direct_url": null, + "metadata_sha256": "7d1d1c276b7c372d55d17ac7d30f0a4b80a746e147347b8510d1355eea7f80c8", + "name": "pytest", + "version": "9.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "89e7c1c932e52b74bdcaf504389d2d1a2d7ca559b02bf5a09fc80ebd58ad10f7", + "name": "python-dateutil", + "version": "2.9.0.post0" + }, + { + "direct_url": null, + "metadata_sha256": "54f30f811841b6d772f31715712c85bfe0041839cb071f78daf41c700a98642b", + "name": "python-discovery", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "54f30f811841b6d772f31715712c85bfe0041839cb071f78daf41c700a98642b", + "name": "python-discovery", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "0cc19efd76cfbf3bcb2cb0d3ab82191036855859455aa3812c5e9e591e3f34e8", + "name": "python-dotenv", + "version": "1.2.3" + }, + { + "direct_url": null, + "metadata_sha256": "1d866c6124631b9ce1797ad412fff298ab53fc2d95210281d7c8f20e920753fa", + "name": "python-json-logger", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "2d18a1e7286d92a656ead5ec6f83d5ae6dc858634624f6b264703ae88d24d718", + "name": "python-multipart", + "version": "0.0.32" + }, + { + "direct_url": null, + "metadata_sha256": "beaa0efe9ba4b34843f5a0fc7379a73f10e95adb8cc0c31f359ab6f3a42b4def", + "name": "pyyaml_env_tag", + "version": "1.1" + }, + { + "direct_url": null, + "metadata_sha256": "238dc769e22d4f5626750cdff36e920e4a8d69c10d88de6d79b40a59cc13d873", + "name": "pyzmq", + "version": "27.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "de0a5e855bb5bb78b7acdcd2ca60619c6a0c109814881589caf158ec07155662", + "name": "quack-kernels", + "version": "0.6.5" + }, + { + "direct_url": null, + "metadata_sha256": "961ffef199b876fb4d7b10903d78e79f359d703b1638834c61d70b9879932918", + "name": "qwen-vl-utils", + "version": "0.0.14" + }, + { + "direct_url": null, + "metadata_sha256": "faf6ab9027d12de992827a2d8a224996fe6747a8c5f7d31ae495983dc73eefe9", + "name": "ray", + "version": "2.54.0" + }, + { + "direct_url": null, + "metadata_sha256": "c50d8b3ff4d113925b60dc47d1d28e87248a3338024241b0a3a66c8794fbce0c", + "name": "referencing", + "version": "0.37.0" + }, + { + "direct_url": null, + "metadata_sha256": "02acdc52d6f21d5f4b172254daaa94edfaa44c9ebe14d1c00cc4c8fe99b0e1df", + "name": "regex", + "version": "2026.9.29" + }, + { + "direct_url": null, + "metadata_sha256": "ac08207697217d1ffde8a161b424d77d6e2af6b62630fa26d75d08f11076cdca", + "name": "requests", + "version": "2.34.2" + }, + { + "direct_url": null, + "metadata_sha256": "f1abd635c3dff607a4fd654c62a88d9d4c21843cfc9176116c156f4269ca21b5", + "name": "rich", + "version": "15.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "932ff7743a756d0efcc45528d64c275ac3cb40a8dd1787ea10cb303907f0ae4f", + "name": "rich-toolkit", + "version": "0.20.5" + }, + { + "direct_url": null, + "metadata_sha256": "294a1405c0fa34b5f735bcb46459050436849a1e584c643544de99c07c529fb7", + "name": "rignore", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "5e54dd00b4ad336c5161d47de2a5c2212090c44629c28b6538b156256e49282d", + "name": "rpds-py", + "version": "2026.6.3" + }, + { + "direct_url": null, + "metadata_sha256": "0d5895abd80bfc0027c02943abaea4547061b9004bd134950d640d619a697835", + "name": "safetensors", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "91d5de3f641f33a8fbb4b6e91772da68d50b68686971d7b66af2068f2e77b694", + "name": "scipy", + "version": "1.17.1" + }, + { + "direct_url": null, + "metadata_sha256": "297fb30f701a800489c12893a951da3e5bd1f80061a1f43f0d3e9f1d4c6bc6fd", + "name": "sentencepiece", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "4245e0388ddf2048a38ae2a24a3d2c583408b2454aadc680d3c3beede639db3f", + "name": "sentry-sdk", + "version": "2.71.0" + }, + { + "direct_url": null, + "metadata_sha256": "ae8a9e6feec1a76e954d65ea48ac57842c9a7bfb5ac6e5ea82400a5ba9f71a98", + "name": "setproctitle", + "version": "1.3.7" + }, + { + "direct_url": null, + "metadata_sha256": "341d00772017437d0f6e3c943ae353f243c39fedfba403aea47cced927a76516", + "name": "setuptools", + "version": "79.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "ff4bcfb192bd542ed8f1794fb32ffc9eabd932d6e03cb00a4ad5e35a2469af88", + "name": "setuptools", + "version": "80.10.2" + }, + { + "direct_url": null, + "metadata_sha256": "f1e5a532fb8cda0bbc370e3db6cb9cea72a065d12ddd6a14976ba3cf66264221", + "name": "shellingham", + "version": "1.5.4" + }, + { + "direct_url": null, + "metadata_sha256": "2aba2cfd9c2ad7625a5d374d141af317d8f92d3534997bf98d127e52848dfc81", + "name": "six", + "version": "1.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "69ae2dfe547624be97fae348e1cfa3793f8854eed32cc1603badedc7d48fb36e", + "name": "smart_open", + "version": "8.0.2" + }, + { + "direct_url": null, + "metadata_sha256": "d415e6c6de7dee117d254a342668c489931bc88eac7ec8678b452078e366da6e", + "name": "smmap", + "version": "5.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "093bc4f0740a6fc28692e616aa8fe68d7e1d76426cc5a5faf9ea722a8ee7aaae", + "name": "sniffio", + "version": "1.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "b3cef071eb1dbeaa76a1273fe2ca2cc8ef36e835165253952d93780962529ac1", + "name": "sse-starlette", + "version": "3.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "3c01ca830e213f0311fe37bc3b46b8ab230a5e7acb894bf0fc8785cb7ccfed48", + "name": "starlette", + "version": "1.7.0" + }, + { + "direct_url": null, + "metadata_sha256": "6017ca508a293cf47a88a78cb330e9cbd131d74ec3c7fbf89bd4300ed3129d30", + "name": "supervisor", + "version": "4.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "fd5eb4925b04f9bffbc6c4f92bf8aea7243b918b43cd359493fce48a7dd3b336", + "name": "sympy", + "version": "1.14.0" + }, + { + "direct_url": null, + "metadata_sha256": "f09f0e24282c5a86346bcd5b10ae5ff81869fa8ef69c3ba524bd0a817a87dda9", + "name": "tabulate", + "version": "0.10.0" + }, + { + "direct_url": null, + "metadata_sha256": "519fa19c146fd58a0a75ecf1461e4bd98f9c06d01800c37d4a80f5fef095f4e1", + "name": "tensorboard", + "version": "2.21.0" + }, + { + "direct_url": null, + "metadata_sha256": "1af7ad76e4073b01ab147eb3c1d8e38b95d38062c6c9bc63890150738642e8eb", + "name": "tensorboard-data-server", + "version": "0.7.2" + }, + { + "direct_url": null, + "metadata_sha256": "9e597f62fc07e3b931d5c8fb0e90706fb6d45465cfb5d01dbd27ba7fc135c02c", + "name": "tensorstore", + "version": "0.1.80" + }, + { + "direct_url": null, + "metadata_sha256": "0da993d16ef6326f471796fcb065622f309c5c1aae6c6295b488ea64bb5c880c", + "name": "textual", + "version": "8.2.8" + }, + { + "direct_url": null, + "metadata_sha256": "52ca6148d4fd1497254855fa610cfdde99191cd42bce7a452fd3a68855504ac0", + "name": "tiktoken", + "version": "0.14.0" + }, + { + "direct_url": null, + "metadata_sha256": "0df9eb495cfb477dcbdfbdcd8c04d952d3eb00d77831630760571e13545398e5", + "name": "tilelang", + "version": "0.1.12" + }, + { + "direct_url": null, + "metadata_sha256": "802b576e011dc61bd2681593e8d802714b6c4ce636a9cf87035026db32ce6262", + "name": "tokenizers", + "version": "0.23.2" + }, + { + "direct_url": null, + "metadata_sha256": "4e1631b2164a49ff9a848d86ce504fdcc15e3540dbb262df8f33a2681a8de513", + "name": "tokenspeed-mla", + "version": "0.1.8" + }, + { + "direct_url": null, + "metadata_sha256": "05086095a775c5dca70998dcf442a848c13f9c68b54a54c510c3542c5abb6563", + "name": "tokenspeed-triton", + "version": "3.8.10.post20260920" + }, + { + "direct_url": null, + "metadata_sha256": "71daba472d0c5ffc25c0231dc29688ab0cb13d5bc7e7d93f6c4cce4169c50048", + "name": "torch", + "version": "2.13.0" + }, + { + "direct_url": null, + "metadata_sha256": "cccd2f1c0e5866e63732f58798c8d642ee6d10cd560d6f691e7981b908c246c9", + "name": "torch_c_dlpack_ext", + "version": "0.1.5" + }, + { + "direct_url": "{\"dir_info\": {}, \"url\": \"file:///torch_memory_saver\"}", + "metadata_sha256": "6276cef17dedbb5ee0d6157bbf63b832e916026281328d995ad3d488c2539618", + "name": "torch_memory_saver", + "version": "0.0.9.post1+slime" + }, + { + "direct_url": null, + "metadata_sha256": "29809ca2c86dda5079654f1f70564a64435e9d08f1964a2412b6f514e1b5ff64", + "name": "torchaudio", + "version": "2.11.0" + }, + { + "direct_url": null, + "metadata_sha256": "7e9be0f3a290e3fd9370d8fe010c7ffd006d5d3d05ab8bdf7df8f92f0fca9c39", + "name": "torchcodec", + "version": "0.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "181fa5e6b399c378711eddcdacd756d3c51317916f8eb160ee36cae7fae9589f", + "name": "torchvision", + "version": "0.28.0" + }, + { + "direct_url": null, + "metadata_sha256": "43d1261aff90cf3d5b1b40cf1f94234d61409b14e59f3766f457c1eec7f7ac15", + "name": "tqdm", + "version": "4.70.1" + }, + { + "direct_url": "{\"archive_info\": {\"hash\": \"sha256=3e1d9f534781c8e608240da0b495b8246317a36382f7609017cbaa7fb1d53f7b\", \"hashes\": {\"sha256\": \"3e1d9f534781c8e608240da0b495b8246317a36382f7609017cbaa7fb1d53f7b\"}}, \"url\": \"file:///wheels/transformer_engine-2.16.1%2Bc9877beb-cp312-cp312-linux_x86_64.whl\"}", + "metadata_sha256": "d882f743161d9d9f35dee4e1a8cc9136fa495f7c660caace01ab8f5602d76aa7", + "name": "transformer_engine", + "version": "2.16.1+c9877beb" + }, + { + "direct_url": null, + "metadata_sha256": "465797a59706d83b45c93fde750b228c3b6e1addc44115de2c4c02ad66d9c5ea", + "name": "transformers", + "version": "5.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "a91982ca086667c592a951973434f7c5a9f27a8300bc97af78dfb496afe53e71", + "name": "triton", + "version": "3.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "d26fbb244532c4051e715f9047cd943e2cc4abb0ac6f2a517fa2986eb1ea726a", + "name": "truststore", + "version": "0.10.4" + }, + { + "direct_url": null, + "metadata_sha256": "c84af1a069084b1b440b3594068dec29200d52d4c1a9b652030448717f270158", + "name": "typer", + "version": "0.27.2" + }, + { + "direct_url": null, + "metadata_sha256": "0ad6653b7439f4bb6a596cb7b01ed1b716458467525c4dc40b75d62bdb943c98", + "name": "typing-inspection", + "version": "0.4.4" + }, + { + "direct_url": null, + "metadata_sha256": "d005280aa13b334ac942d20219102865e559f69ffd06c35c248b2f0d0da3b933", + "name": "typing_extensions", + "version": "4.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "fba2930e9030a18965d243f8d330748db2e67572a81b3b68710462fb5110332a", + "name": "urllib3", + "version": "2.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "bc5717bd6524a33838f285261868bcc8e311e8c29fdb19e41d56c38b04890e84", + "name": "uvicorn", + "version": "0.54.0" + }, + { + "direct_url": null, + "metadata_sha256": "741c006d8441f562aa853a5430df236fbb4af923445491f396bf09943bd30258", + "name": "uvloop", + "version": "0.22.1" + }, + { + "direct_url": "{\"dir_info\": {\"editable\": true}, \"url\": \"file:///vime\"}", + "metadata_sha256": "f85aa01dfdc868756a6583434bbff040f29eb511d47d5b25ada063a84353aac6", + "name": "vime", + "version": "0.3.2" + }, + { + "direct_url": null, + "metadata_sha256": "c25431aaf1950971fe96292f395a41a55b403127bfca0d0b8f7dc9cff5dab75d", + "name": "virtualenv", + "version": "21.14.1" + }, + { + "direct_url": null, + "metadata_sha256": "4e3ee0a31d85e56268640aae853bcee4794dfe8c0483c5c6370517e480c81ae0", + "name": "virtualenv", + "version": "21.14.5" + }, + { + "direct_url": null, + "metadata_sha256": "d4ed5c7551cddb8c1aeff2f9f27b3491f6ad2c9afda8e7bb9779c33fa12a536c", + "name": "vllm", + "version": "0.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "84b482e09bac949e992594757214a1920c667a5d898ee320e309250697f6d26e", + "name": "vllm-router", + "version": "0.1.15" + }, + { + "direct_url": null, + "metadata_sha256": "9b16c871eb1060a5218e9b9a9ad33288d94844cfaf43f08dbb6c32423bde8fe3", + "name": "wandb", + "version": "0.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "8e4f2be437dfe4eb3c6c959e517ac20b75d06525563f1ebcbf06f9ec648bd7c1", + "name": "watchdog", + "version": "6.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "15218afb42938907c2ca74c54e3d8e3a5406493c4761e29e38e82bfec0f84296", + "name": "watchfiles", + "version": "1.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "8863af96e88b7db9990da99aa6c46816eacc3d2f9ae1297b53381b033cd70119", + "name": "wcmatch", + "version": "11.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "f46e6bd6cfafb2b684c29587b017b7096fd9155b74eda25a22eca784b9803ab7", + "name": "websockets", + "version": "16.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "ce82db5ccfefa4bfbe4e25a36e1f91e8e7d51fcaeb31586c4d48e1c69f99168b", + "name": "websockets", + "version": "17.1" + }, + { + "direct_url": null, + "metadata_sha256": "0f142a2c09eac643c7d0bfe77f3f121184c0b17914afbd32af669ed19b2b02ef", + "name": "wheel", + "version": "0.47.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd58938e51a3c5cb363f6f22eaa2a8a7accc1ce373388de167a82f77d3e5783f", + "name": "wrapt", + "version": "2.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "b0b72c1941f04499ca7e1a3a6e479aee8df902c3d49979624b59dba8c3228d37", + "name": "xgrammar", + "version": "0.2.8" + }, + { + "direct_url": null, + "metadata_sha256": "ef8861f39e5c36255966a36032651f937d890d55f31f1c26304b488f1ba34332", + "name": "xxhash", + "version": "4.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "740c08057b6eb69c58402c87d652af0a471e46325d811f2c605632a18817152f", + "name": "yarl", + "version": "1.25.1" + }, + { + "direct_url": null, + "metadata_sha256": "7b060e4d24394b5431875e2f74fec8e6bffa79d2e6b4cb8c7e2a5187dd2d8d69", + "name": "z3-solver", + "version": "4.15.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "3d76d4fbc95f0851191147db12300938c67a6f8fb1df884886d9601272ccc4e8", + "name": "zipp", + "version": "4.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "d3de2651e4e908dbb7c9d80508e5179590217dfac4993dc8b04381c5b9718c4c", + "name": "zstandard", + "version": "0.25.0" + } + ], + "executable": "", + "installed_provider_sources": { + "vllm/compilation/__init__.py": { + "path": "/vllm/compilation/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/backends.py": { + "path": "/vllm/compilation/backends.py", + "sha256": "fa4bff8920b363efbbde9456f135fa9d2c004a5bde1898877f177418b2d8b008" + }, + "vllm/compilation/base_static_graph.py": { + "path": "/vllm/compilation/base_static_graph.py", + "sha256": "5cfe8e06db84aa42cd41cdd93ebe93af00b3a242c8011042057530e2922b523a" + }, + "vllm/compilation/breakable_cudagraph.py": { + "path": "/vllm/compilation/breakable_cudagraph.py", + "sha256": "3cc427612a08e2b9b3fee47548026400c1d0776e2d4747535e59ef5512bdf1e8" + }, + "vllm/compilation/caching.py": { + "path": "/vllm/compilation/caching.py", + "sha256": "71d212452dde742fbf28b8a01ed29d3c08a7457ff7f8da2a20ce9d17e902c2cf" + }, + "vllm/compilation/codegen.py": { + "path": "/vllm/compilation/codegen.py", + "sha256": "e04833bec88cf9d1a13aa7341e30e3233d1138bfe23424e0fd34d664b3fedb9f" + }, + "vllm/compilation/compiler_interface.py": { + "path": "/vllm/compilation/compiler_interface.py", + "sha256": "8d84e2864bf83f754bae9e9f77119e0287cca9f97f5fa5ec2535e07b5ad88944" + }, + "vllm/compilation/counter.py": { + "path": "/vllm/compilation/counter.py", + "sha256": "d8158c54dd36a357bf24f6f84dc22f572d3a27f4875f3d5779b12bc5d454ff76" + }, + "vllm/compilation/cuda_graph.py": { + "path": "/vllm/compilation/cuda_graph.py", + "sha256": "05c86392d7fae967ac73076dba7e01990a0e3ae619e4866450a0c1be56bd1192" + }, + "vllm/compilation/decorators.py": { + "path": "/vllm/compilation/decorators.py", + "sha256": "cab6962e8a1fead59c75f5ed8cb4732f9e5441ff972030c2f4b1c4ba0c58de3c" + }, + "vllm/compilation/monitor.py": { + "path": "/vllm/compilation/monitor.py", + "sha256": "43b24c5cb1bc4d32dc979f3222596905c7b3acc58415328a234402e6edc76abf" + }, + "vllm/compilation/partition_rules.py": { + "path": "/vllm/compilation/partition_rules.py", + "sha256": "857d2fb06dc871ea1d3717cd01fbd4e5205984100d98b7b72a2933d6ff1cfa4d" + }, + "vllm/compilation/passes/__init__.py": { + "path": "/vllm/compilation/passes/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/fusion/__init__.py": { + "path": "/vllm/compilation/passes/fusion/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/fusion/act_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/act_quant_fusion.py", + "sha256": "1fa9c3ca4fb424685b7053c3dda89dda16c98dc5645d85f0f28dca58429792b3" + }, + "vllm/compilation/passes/fusion/add_rms_fusion.py": { + "path": "/vllm/compilation/passes/fusion/add_rms_fusion.py", + "sha256": "e46998552628aa5cd5962fc39ea39ae824fd97e6aeba1d176e9cc7cade39837b" + }, + "vllm/compilation/passes/fusion/allreduce_rms_fusion.py": { + "path": "/vllm/compilation/passes/fusion/allreduce_rms_fusion.py", + "sha256": "0af193505880cec0f6ffa224c688bce3c9ddc318dccdf04a696b4e4b4506a963" + }, + "vllm/compilation/passes/fusion/attn_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/attn_quant_fusion.py", + "sha256": "ecc64e82be4481954c9cac6c23d7794846ab19486b570f2dda07ab5ad67c5a49" + }, + "vllm/compilation/passes/fusion/collective_fusion.py": { + "path": "/vllm/compilation/passes/fusion/collective_fusion.py", + "sha256": "1e2c8539d6960b45907fb3bf0482441ea7250e97c56ffdea1500514efa0b164d" + }, + "vllm/compilation/passes/fusion/matcher_utils.py": { + "path": "/vllm/compilation/passes/fusion/matcher_utils.py", + "sha256": "50ac5714ce1bb113520de769ea6234316acc470a8cdf2537a996ce9a9d54337d" + }, + "vllm/compilation/passes/fusion/mla_attn_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/mla_attn_quant_fusion.py", + "sha256": "a966fe7f58bf9228379f793f5fd851735a97f9639722766b2a20cb79a9e4baec" + }, + "vllm/compilation/passes/fusion/mla_rope_kvcache_cat_fusion.py": { + "path": "/vllm/compilation/passes/fusion/mla_rope_kvcache_cat_fusion.py", + "sha256": "1602cc28055ffa8d1123ddb1d256bf0bd12006fd06ea7e16a986c55746dbe0dc" + }, + "vllm/compilation/passes/fusion/qk_norm_rope_fusion.py": { + "path": "/vllm/compilation/passes/fusion/qk_norm_rope_fusion.py", + "sha256": "aebc7d1a5189b65ac665afcc169e7baebd53efe719c48e35e7c5babe85af0d39" + }, + "vllm/compilation/passes/fusion/qk_norm_rope_kvcache_fusion.py": { + "path": "/vllm/compilation/passes/fusion/qk_norm_rope_kvcache_fusion.py", + "sha256": "f0cfd0d83ec4acb09f9bf91d199b114e9d4995e3059c13eb23a6978ce7c07eb2" + }, + "vllm/compilation/passes/fusion/rms_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rms_quant_fusion.py", + "sha256": "4852aa44e0e2087043fdac271bda9b8d9bfe3201bb84ce3919b8ed454d8083c4" + }, + "vllm/compilation/passes/fusion/rocm_aiter_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rocm_aiter_fusion.py", + "sha256": "372e76c68c75209a085deec6dd22b3816be633613ca82f6f2925c1b3773d61a0" + }, + "vllm/compilation/passes/fusion/rope_kvcache_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rope_kvcache_fusion.py", + "sha256": "3a756e9049593537143b5a56ab9185a6bc83f57ed81d84226d7791a46a984b53" + }, + "vllm/compilation/passes/fusion/sequence_parallelism.py": { + "path": "/vllm/compilation/passes/fusion/sequence_parallelism.py", + "sha256": "3af7e420dcb35fff0bae0f8f599d0f1bda34445ebe194059892a434b2976d654" + }, + "vllm/compilation/passes/fx_utils.py": { + "path": "/vllm/compilation/passes/fx_utils.py", + "sha256": "730708213acf9d1b5f3176b433dfc197a5f3c81b5ce443f0923c526924833003" + }, + "vllm/compilation/passes/inductor_pass.py": { + "path": "/vllm/compilation/passes/inductor_pass.py", + "sha256": "1f380aacf7adabb8bf8b7d41c0a93473947f0716f7445bd910fd448f6c08e672" + }, + "vllm/compilation/passes/ir/__init__.py": { + "path": "/vllm/compilation/passes/ir/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/ir/clone_elimination.py": { + "path": "/vllm/compilation/passes/ir/clone_elimination.py", + "sha256": "5297078f5cddce081faba5215814275381d2083b32318fcfeb2bf9d69fedb7c7" + }, + "vllm/compilation/passes/ir/inplace_functionalization.py": { + "path": "/vllm/compilation/passes/ir/inplace_functionalization.py", + "sha256": "2dc4f22c6f05224828c2941479185b1452d4490f488b7f0bfd124334e7809fed" + }, + "vllm/compilation/passes/ir/lowering_pass.py": { + "path": "/vllm/compilation/passes/ir/lowering_pass.py", + "sha256": "d9c3d90f63138420f0e5489447b5996573fcfbbab939da2efccd00848492b172" + }, + "vllm/compilation/passes/ir/utils.py": { + "path": "/vllm/compilation/passes/ir/utils.py", + "sha256": "f59d33a6c7d0616cbeec1e9fb1d6c948881bf81fe124caeb906eac2e2197ea21" + }, + "vllm/compilation/passes/pass_manager.py": { + "path": "/vllm/compilation/passes/pass_manager.py", + "sha256": "486979a058aa2e20ebedcbb6e039f7a59f38d2efd2cda11219fae4067be0968d" + }, + "vllm/compilation/passes/utility/__init__.py": { + "path": "/vllm/compilation/passes/utility/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/utility/fix_functionalization.py": { + "path": "/vllm/compilation/passes/utility/fix_functionalization.py", + "sha256": "ad5b504a05ccee023869b0c8df70ec2fff9a4a80d25fd903e2b532f470e7203f" + }, + "vllm/compilation/passes/utility/noop_elimination.py": { + "path": "/vllm/compilation/passes/utility/noop_elimination.py", + "sha256": "8abf85d28c13f95059f2acbc0275b9b9ed2ad4990f7c5763bbe3067a4aa629ce" + }, + "vllm/compilation/passes/utility/post_cleanup.py": { + "path": "/vllm/compilation/passes/utility/post_cleanup.py", + "sha256": "1c38b14fc209165cbcf8ca763a17ac4e528b97f59b573e5d52df2cce7d758de3" + }, + "vllm/compilation/passes/utility/scatter_split_replace.py": { + "path": "/vllm/compilation/passes/utility/scatter_split_replace.py", + "sha256": "138402cc3097768a32e9e5b8d1a054b6176e494bddc8684e23ca2dc5fdc3fdda" + }, + "vllm/compilation/passes/utility/split_coalescing.py": { + "path": "/vllm/compilation/passes/utility/split_coalescing.py", + "sha256": "0b02acd9e1ad43d7b3e128b914e969b9580773f2818078846dfbf163a8bd0871" + }, + "vllm/compilation/passes/vllm_inductor_pass.py": { + "path": "/vllm/compilation/passes/vllm_inductor_pass.py", + "sha256": "4f83ffb67f834a214221d810c7843a8e41eb4e5930eb40adbd8cf054ff6fb9c6" + }, + "vllm/compilation/piecewise_backend.py": { + "path": "/vllm/compilation/piecewise_backend.py", + "sha256": "6525318ff3ca2e4978e24dd9232a7ae0a02e920e19604b83db6f6043d1f8a54d" + }, + "vllm/compilation/wrapper.py": { + "path": "/vllm/compilation/wrapper.py", + "sha256": "c1b1fca679ea16aa07a696831a810c0d531da2bb0ea32dd6f1a95cdaef36de07" + }, + "vllm/config/__init__.py": { + "path": "/vllm/config/__init__.py", + "sha256": "56fb0cb1598d297e4f95a97e5d86dc624145d1532f5faa432b7d2834d7155bd5" + }, + "vllm/config/attention.py": { + "path": "/vllm/config/attention.py", + "sha256": "c41f345b512d9b7df882328257eb3a6381f41088c11ae83b5ecd8a9e8265d1bc" + }, + "vllm/config/cache.py": { + "path": "/vllm/config/cache.py", + "sha256": "f1c226ba679c884930dbfcaf41a57248b137a9a20d3ed8e3d3b31752bb484c07" + }, + "vllm/config/compilation.py": { + "path": "/vllm/config/compilation.py", + "sha256": "c9cec5c7200e8e559810ec8c30113ad61dab6780f9f7fb3c116bd0d9b5a43065" + }, + "vllm/config/device.py": { + "path": "/vllm/config/device.py", + "sha256": "7b82eee02ceb5842337451a27a3d5729920c47e25e8f6bf3997f5146f9330a9c" + }, + "vllm/config/diffusion.py": { + "path": "/vllm/config/diffusion.py", + "sha256": "1fa9fd2478a866098a28a3586b55af2f9738656b7813a55d76539c10dd99fe8d" + }, + "vllm/config/ec_manager_config.py": { + "path": "/vllm/config/ec_manager_config.py", + "sha256": "418b387dbe7bdf67deddce331c205768a2d42aea37141f59fb02a8a1528e3552" + }, + "vllm/config/ec_transfer.py": { + "path": "/vllm/config/ec_transfer.py", + "sha256": "0eabb2c25194676d23c6acf59562672a1dd24415043ac5737d621ce0d681ec70" + }, + "vllm/config/engram.py": { + "path": "/vllm/config/engram.py", + "sha256": "34043a22385a041d4e9be8857f64174c990c2ca8308b97b6a952b5ab96c20ee5" + }, + "vllm/config/fault_tolerance.py": { + "path": "/vllm/config/fault_tolerance.py", + "sha256": "b166b24373d599fb15ddc575e3061cf0dcb42174d0369d8468008e7ffbb2a4e2" + }, + "vllm/config/kernel.py": { + "path": "/vllm/config/kernel.py", + "sha256": "27e23c584cf862f4091858db6dc85bbc2a01f4baf9dca3f232ae6f3bac02390e" + }, + "vllm/config/kv_events.py": { + "path": "/vllm/config/kv_events.py", + "sha256": "b1dbaee3e6830e381e9157fe3bab0d65c357da88ff7cdf8b1e4b3a4e75c82a87" + }, + "vllm/config/kv_transfer.py": { + "path": "/vllm/config/kv_transfer.py", + "sha256": "506fae7a9d7f32cb3646156cf9249a856f6317dff6c4c85db70efd34418c429b" + }, + "vllm/config/load.py": { + "path": "/vllm/config/load.py", + "sha256": "bd6431c22e078362d749a56a2c84145432ebf2605d8bcfa2ac679182d18ed630" + }, + "vllm/config/lora.py": { + "path": "/vllm/config/lora.py", + "sha256": "ed6cf6575f5950f079a62f904caeae93d1a4745dd8c21788b74367883bcd4b08" + }, + "vllm/config/mamba.py": { + "path": "/vllm/config/mamba.py", + "sha256": "2090f791201ca45dd4f1d72b8651268890eb07574b6084721194eb8fdf612c48" + }, + "vllm/config/model.py": { + "path": "/vllm/config/model.py", + "sha256": "f4168b67cc93ce72ff2a6d4c66974223e32fd0f1fab4c05e44bd68a275e18d69" + }, + "vllm/config/model_arch.py": { + "path": "/vllm/config/model_arch.py", + "sha256": "2babe28329d7b60b4e205f6d72c687f0f66e6535aa2f20411469e5ec362f6b5f" + }, + "vllm/config/multimodal.py": { + "path": "/vllm/config/multimodal.py", + "sha256": "271911aee151f17f092228cecee82af0713e9a47340ffdf66834ca7638a50d22" + }, + "vllm/config/observability.py": { + "path": "/vllm/config/observability.py", + "sha256": "d57c59ec776477ab0a20e9f2b945bc954d8ea3737c869259480e9aa10dfb9f6d" + }, + "vllm/config/offload.py": { + "path": "/vllm/config/offload.py", + "sha256": "6f2db3d9a2730588473d5155811690c6241b167a21dcb62fbbd9ebb6386de42c" + }, + "vllm/config/parallel.py": { + "path": "/vllm/config/parallel.py", + "sha256": "f012ace89e3fb730a467f729f602679bc145c49f0d10721811c9d818570e7b2b" + }, + "vllm/config/pooler.py": { + "path": "/vllm/config/pooler.py", + "sha256": "9f01913dcb7bccbf9b672b16643f18471ae202455992e8afaf0725a17f2b3d08" + }, + "vllm/config/profiler.py": { + "path": "/vllm/config/profiler.py", + "sha256": "04d24fa1dc7cfedca6b5c7d9115f7f7021722fc46a5b15234a1e3b3a506c93e5" + }, + "vllm/config/quantization.py": { + "path": "/vllm/config/quantization.py", + "sha256": "acffc52f525b39a88efd656f1ed705ce3a1b758298bb0684fac7694776bc10b4" + }, + "vllm/config/reasoning.py": { + "path": "/vllm/config/reasoning.py", + "sha256": "2c4f7bdee48a9fb3d93787c4c32361c2411417cce452cfde86808d8759977861" + }, + "vllm/config/scheduler.py": { + "path": "/vllm/config/scheduler.py", + "sha256": "822179da62be4bca0619c8590082ae09123f5c4415f9cc2037be673748239edb" + }, + "vllm/config/speculative.py": { + "path": "/vllm/config/speculative.py", + "sha256": "9c642a87264339c0dbc1d0b57330572149df0f9d5e16c6893b9895e50a619e19" + }, + "vllm/config/speech_to_text.py": { + "path": "/vllm/config/speech_to_text.py", + "sha256": "bf4a566fbde6a1cec1e209070b739650c3302c12696739c88049cb8f723a4c3f" + }, + "vllm/config/structured_outputs.py": { + "path": "/vllm/config/structured_outputs.py", + "sha256": "55649776594349b8b4aa3e08fc4c88068366732a486d6fb235079188044aa829" + }, + "vllm/config/utils.py": { + "path": "/vllm/config/utils.py", + "sha256": "d035e9e488ba92b6c47a96cf05d9b2a850d53eda8a05115b22ff9af8dbc2fc64" + }, + "vllm/config/vllm.py": { + "path": "/vllm/config/vllm.py", + "sha256": "956b812e5a719bcbfa3a3958801361b38b9c928c96b8c073311bbb96376dfb7a" + }, + "vllm/config/watermarking.py": { + "path": "/vllm/config/watermarking.py", + "sha256": "30e6620a3cd7529f0736ad55e38bc326a6a78dee4552f0722208400041c94a1f" + }, + "vllm/config/weight_transfer.py": { + "path": "/vllm/config/weight_transfer.py", + "sha256": "92edd9e5ea90c97a8f3c5f20abf1734a105ee1f3f89e306e7ba87e758f1f767e" + }, + "vllm/distributed/__init__.py": { + "path": "/vllm/distributed/__init__.py", + "sha256": "97f28c30b32662af8cab163939e4ee423037f11630752e13b55cbc25a7d0ab71" + }, + "vllm/distributed/communication_op.py": { + "path": "/vllm/distributed/communication_op.py", + "sha256": "3c3f8ac60db38ece891d39dc1e2f6f1947ad438685893d2e5777d072320bd1b8" + }, + "vllm/distributed/device_communicators/__init__.py": { + "path": "/vllm/distributed/device_communicators/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/device_communicators/aiter_custom_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/aiter_custom_all_reduce.py", + "sha256": "f8eb027ce7a85d94af6260960ceb7f36fc6f1406c9af9c9b6285fddb3f178009" + }, + "vllm/distributed/device_communicators/all2all.py": { + "path": "/vllm/distributed/device_communicators/all2all.py", + "sha256": "1f1b69236acd3cd7bd94520fd6d591bfd31b57c4bc7c9f9f4161ea8bbd0c5f26" + }, + "vllm/distributed/device_communicators/all_reduce_utils.py": { + "path": "/vllm/distributed/device_communicators/all_reduce_utils.py", + "sha256": "ed0ab4dd05b2519a6313892e68824c97b540034664d7f8c3d031b322e33e1bfc" + }, + "vllm/distributed/device_communicators/base_device_communicator.py": { + "path": "/vllm/distributed/device_communicators/base_device_communicator.py", + "sha256": "4a7670f12ed7c7621b25d476e2687c24ca01f3be183fff4a6a25337596fe506b" + }, + "vllm/distributed/device_communicators/cpu_communicator.py": { + "path": "/vllm/distributed/device_communicators/cpu_communicator.py", + "sha256": "e1856c8e91cfbbb4d9ce990c1236e258ba4021e226afcbab645653380b38d64b" + }, + "vllm/distributed/device_communicators/cuda_communicator.py": { + "path": "/vllm/distributed/device_communicators/cuda_communicator.py", + "sha256": "102d95c67ec798cf352b817ba92e8abc9da37f30d1bbdf3aab45d3927b627b93" + }, + "vllm/distributed/device_communicators/cuda_wrapper.py": { + "path": "/vllm/distributed/device_communicators/cuda_wrapper.py", + "sha256": "333b6d9ed173e7a18c7f2b6627a3c9c9ed88892ce52015f05e29d6d245e48ee3" + }, + "vllm/distributed/device_communicators/custom_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/custom_all_reduce.py", + "sha256": "a048c1327c23580805600c0c951831bec333b1ffc4eb26a0e3d34119c4f0c445" + }, + "vllm/distributed/device_communicators/flashinfer_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/flashinfer_all_reduce.py", + "sha256": "b4359760e9b55963676109a5c3a015fb82e190d4df1d021de9ee01e7814cbdda" + }, + "vllm/distributed/device_communicators/flashinfer_pcie_ipc_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/flashinfer_pcie_ipc_all_reduce.py", + "sha256": "8b67b0fc356a565095f56b475cc89c513e3a5eff051ab1c52e5beb0c1a79e9f2" + }, + "vllm/distributed/device_communicators/mnnvl_compat.py": { + "path": "/vllm/distributed/device_communicators/mnnvl_compat.py", + "sha256": "72ee1e6f9571b4c8ecbd9f60cd469d1b565cb79cab519a688a93f290906a2615" + }, + "vllm/distributed/device_communicators/pynccl.py": { + "path": "/vllm/distributed/device_communicators/pynccl.py", + "sha256": "882fb83c5a3c565a3f8fd664b79f5ceae566dca180019ecafd74bc8c11d9f8cf" + }, + "vllm/distributed/device_communicators/pynccl_allocator.py": { + "path": "/vllm/distributed/device_communicators/pynccl_allocator.py", + "sha256": "390e2576cbf4ae06341ca4dab24fc7e4d4f7c24dd444329ed05d828a9ce91460" + }, + "vllm/distributed/device_communicators/pynccl_wrapper.py": { + "path": "/vllm/distributed/device_communicators/pynccl_wrapper.py", + "sha256": "ce63c8da57bb88d4cf89956bd70bb63f0f44bfad468ddb37b765611551f6d99f" + }, + "vllm/distributed/device_communicators/quick_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/quick_all_reduce.py", + "sha256": "8aacb23e7c297b0ae2f80d99c5affd2e7517115d7874be51069d14a44db7b5f2" + }, + "vllm/distributed/device_communicators/ray_communicator.py": { + "path": "/vllm/distributed/device_communicators/ray_communicator.py", + "sha256": "332c37f65495b60564d61db59bc2d30ca0236adc33442d01464790bde9aec897" + }, + "vllm/distributed/device_communicators/shm_broadcast.py": { + "path": "/vllm/distributed/device_communicators/shm_broadcast.py", + "sha256": "f3e7a3f3ff713fccbd535e0d41650ee05bdf8677e83d4b90519910645022c30b" + }, + "vllm/distributed/device_communicators/shm_object_storage.py": { + "path": "/vllm/distributed/device_communicators/shm_object_storage.py", + "sha256": "e097bf7ac0141fe8db4131e8fd553ca2ad5b0600b22a56f3924af6b795e7207c" + }, + "vllm/distributed/device_communicators/symm_mem.py": { + "path": "/vllm/distributed/device_communicators/symm_mem.py", + "sha256": "b06e3ddb9ae880a30ec4a103ce32eb9794223bb0293832e89572af28adaaa544" + }, + "vllm/distributed/device_communicators/xpu_communicator.py": { + "path": "/vllm/distributed/device_communicators/xpu_communicator.py", + "sha256": "527cbfb250760abc62096ee7cd612307b821f21b72dee1687ad866620ec89b6d" + }, + "vllm/distributed/ec_transfer/__init__.py": { + "path": "/vllm/distributed/ec_transfer/__init__.py", + "sha256": "061405bb51df7409c9938b62e25caa8bd6ebf85da6d1700dbd4affe2a0825135" + }, + "vllm/distributed/ec_transfer/ec_connector/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/base.py", + "sha256": "22d4913375bb622473fbe1a77f9376b804949cd8a7e31e9518208f9561d161e2" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/common.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/common.py", + "sha256": "e2267abd8d00a6d2605e1a82ea5c73396a71b427452eab469fcca0134c334e7c" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/connector.py", + "sha256": "72cd35d9fd754a2992dd090a8af13c91e0789b4038ac29276750d823120235db" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/base.py", + "sha256": "19e8df88b0fa831997896355ecdd49e0d86cb074cd7ae28aed0b328b0bb3ab2e" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/zmq.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/zmq.py", + "sha256": "435641c0e37551ab4937855abd067be26905b91215e759cbd9d28a419a34ff9a" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/base.py", + "sha256": "3be698aeb67d32ee3741e76b2fb71806941c587578583acf8fbc42fbf22b46a5" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/nixl.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/nixl.py", + "sha256": "03af8f6549a6027b7262a482907af591e45f28b9b1c5a3408bbc6600e38797e5" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/ec_shared_region.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/ec_shared_region.py", + "sha256": "e40607952c9920024455eca2f419e8c3ef1de9a4d8b27c147a33bb941b8c08b1" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/protocol.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/protocol.py", + "sha256": "05878336884396bfbef77b96b0fa6359f6fa0aba912961f14a84f5a436f27038" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/__init__.py", + "sha256": "01c42385bf3a55cff09cc05ba956f6dd4b8b6b986bf4d6eca4e566cb045b48e0" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/embedding_cache.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/embedding_cache.py", + "sha256": "7359fb980af1fc30b3253681310ef636e2b4a19134e04a93270c9c45de2572d8" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/session.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/session.py", + "sha256": "5973548a919e13c866222b91d502686a6757a31e5a5664b879bf2887ed9fb212" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/utils.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/utils.py", + "sha256": "160ac665f20f2c75b343c1e784084f2b0b4d1cf8fdb28ee15deee4dc8ed0ce45" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/worker/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/worker/__init__.py", + "sha256": "f08d296d3560c42173ae8af961af4a768033ccf1e36e9c17c0cdd53013d0c52e" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/worker/descriptor_buffers.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/worker/descriptor_buffers.py", + "sha256": "be7c81be214e995da8499105ba485854d9c19d6f8e905f8f1b87b83694ca0864" + }, + "vllm/distributed/ec_transfer/ec_connector/example_connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/example_connector.py", + "sha256": "09022ce07a89114bb65d9befd2e60873453aed11bbac8c0a75c1e6084e785a5f" + }, + "vllm/distributed/ec_transfer/ec_connector/factory.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/factory.py", + "sha256": "d6cedca0a99c3dd2b03cd1c15d17472b983e3f7d8f5baf4a12eecaf6abedb817" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/__init__.py", + "sha256": "1cbfc2f95f8f4d48a9253056eb1fd4b562062884e3fd5cb6571583c352fc16f3" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/config.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/config.py", + "sha256": "98c60696f79d1de67d2364cd9e8a42a393b5c8e17ed9af2f971368e47891d7b3" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/control.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/control.py", + "sha256": "58e0d1a423fbe958bfa586ac26a17107e08d0b31d044b4c74ab4dde880e7ca9b" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/memory.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/memory.py", + "sha256": "d5e90b1348de670a70f110d58eedcbdbd053db72c21dd007c3f5275c53951149" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/metadata.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/metadata.py", + "sha256": "497a7e6dfffb7fce80a41d5989f96119b970c143df77bb9d0f9c91d7a46e8c42" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/producer.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/producer.py", + "sha256": "97fa4d0b19475574778eab02f55fad73db9642beb9156da890314fd53fa1a7ab" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/reservation.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/reservation.py", + "sha256": "4790bc65cde4db5f17733ca2c2910980ba594a8a9b79ee27c5b957dffd4c1113" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/scheduler.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/scheduler.py", + "sha256": "53004b62529a31fdd80dfb2e6026610b95041a77e91f731ae526fefd84e7968d" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/state.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/state.py", + "sha256": "92f375d6c5cc9c83dbe95a7977ad8eb0f1b5629ccee92968bcacdc94eee15d65" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/transfer.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/transfer.py", + "sha256": "ada2113a5402054f1149d3edc2537f4e5e1bd696c9b17291c9f2b4cbf6b59753" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/worker.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/worker.py", + "sha256": "89eb91bb64845b3b121d502972a6b04d448714253becd2ea662e5691cd5acdd7" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake_ec_connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake_ec_connector.py", + "sha256": "aaebab4711bc00dd0c622dfbfd8639fc41e7ed5d1658d7d68fe33e4d5fbef3ba" + }, + "vllm/distributed/ec_transfer/ec_connector/utils.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/utils.py", + "sha256": "11b9014b9c0697f8846deff1a55a22fa86a15dc2ac3e139442fb6d513ac03059" + }, + "vllm/distributed/ec_transfer/ec_transfer_state.py": { + "path": "/vllm/distributed/ec_transfer/ec_transfer_state.py", + "sha256": "9487a41f23fa1a4fa6dfca8b42b8e97a0ee19d8406ffd1dcf4bef66315180827" + }, + "vllm/distributed/elastic_ep/__init__.py": { + "path": "/vllm/distributed/elastic_ep/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/elastic_ep/elastic_execute.py": { + "path": "/vllm/distributed/elastic_ep/elastic_execute.py", + "sha256": "b8f60a4183c79ff6051095b5f95bb385bc7fea0cffe8cd9ebc9087ab0e9f01b5" + }, + "vllm/distributed/elastic_ep/elastic_state.py": { + "path": "/vllm/distributed/elastic_ep/elastic_state.py", + "sha256": "fbf049199841a086fdf2fc1ab8498ef017ad3bf319db65c3ae61acbb536d2e10" + }, + "vllm/distributed/elastic_ep/standby_state.py": { + "path": "/vllm/distributed/elastic_ep/standby_state.py", + "sha256": "15282597550ebd0e07b8492ff192aea1ec0dcec8f0ad34009123e1002cc140c1" + }, + "vllm/distributed/eplb/__init__.py": { + "path": "/vllm/distributed/eplb/__init__.py", + "sha256": "1b9c2ee22abb5888c354c5aa01f0944f253e5e24e135d019778398bbe495a628" + }, + "vllm/distributed/eplb/async_worker.py": { + "path": "/vllm/distributed/eplb/async_worker.py", + "sha256": "424328600ad1003286fc5dfffa1f9482007314c060947818b2f94a8b97811f5e" + }, + "vllm/distributed/eplb/eplb_communicator.py": { + "path": "/vllm/distributed/eplb/eplb_communicator.py", + "sha256": "ba30d9d40e7b81d3f42aa9041d2f328edca4073cfe2de920285eb68375501ed8" + }, + "vllm/distributed/eplb/eplb_state.py": { + "path": "/vllm/distributed/eplb/eplb_state.py", + "sha256": "2f06bc8c63f3fdf55edb5032ae55c0ffcac3e67720ce74ea312e3d141b12acf4" + }, + "vllm/distributed/eplb/eplb_utils.py": { + "path": "/vllm/distributed/eplb/eplb_utils.py", + "sha256": "058af6104faa6d4085c1dca80bbe60d92bf0a7ec9cd92c775a180546c9d8c9c3" + }, + "vllm/distributed/eplb/policy/__init__.py": { + "path": "/vllm/distributed/eplb/policy/__init__.py", + "sha256": "daeb266c88442832b1ab8c8c4cc064891b38b9e9ba00aea324f926c87dc6d37e" + }, + "vllm/distributed/eplb/policy/abstract.py": { + "path": "/vllm/distributed/eplb/policy/abstract.py", + "sha256": "b9fd34c28bbfdded03360d7f3f6f8fb978e82689190d7ae4501dfe520e958c62" + }, + "vllm/distributed/eplb/policy/default.py": { + "path": "/vllm/distributed/eplb/policy/default.py", + "sha256": "3b54229e6240d050480390f6b29d4744fd38437d23719f78a6decf7002296a29" + }, + "vllm/distributed/eplb/rebalance_execute.py": { + "path": "/vllm/distributed/eplb/rebalance_execute.py", + "sha256": "b387e228791149018536eee96cf955b33ba79d801cdc36849d1b47a580ec2597" + }, + "vllm/distributed/kv_events.py": { + "path": "/vllm/distributed/kv_events.py", + "sha256": "de08f01e8736881560256c350a3b6418999dd4aa30f9c6ec9159527f7ed6899a" + }, + "vllm/distributed/kv_transfer/__init__.py": { + "path": "/vllm/distributed/kv_transfer/__init__.py", + "sha256": "c1be4e58ec6923bae607a355ad22891c740f056a69ff7358b1e10ea3fd2680ea" + }, + "vllm/distributed/kv_transfer/kv_connector/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/base.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/base.py", + "sha256": "2ae2a2c48f5731f3533166a75440fe91e764332305b5d713df840edba970789d" + }, + "vllm/distributed/kv_transfer/kv_connector/factory.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/factory.py", + "sha256": "add99c93c587b0098b90b1f8fd6940bdd1f15c236c5c6f1a258411863cb902d3" + }, + "vllm/distributed/kv_transfer/kv_connector/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/utils.py", + "sha256": "317ed40dc837671ca6e666165222e641a0f9b3992aea63bbf54de7e13d40b3a4" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/__init__.py", + "sha256": "5beb6ccad12fdcfe1581982da6f18321caca50e73a6b3259ebf3c8dc8b3ffcca" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/base.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/base.py", + "sha256": "97af64220475c6c9e8273438d7b5138b105ebe6944beb783facb36a3bb76f31b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/decode_bench_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/decode_bench_connector.py", + "sha256": "b4151c88cdec28f1ff9259047abc17baf23b892f4b68769a93bf26e0442b9017" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/example_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/example_connector.py", + "sha256": "6226876ef52d10d0d284d29c337ab44698e8bac6abdb2e0ece53b5756c55d068" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/example_hidden_states_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/example_hidden_states_connector.py", + "sha256": "58c22534dcad0fb73599a2d70a2fb104d5b612a4723be5e777f56a56fe07892c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/flexkv_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/flexkv_connector.py", + "sha256": "de4f68c3bd565ed898e47e0b2980049b966ff31888f1957050d30995d4953762" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_client.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_client.py", + "sha256": "bea6ecff2be281c7e96c1551c7bf463cbb01f2964696067c0ebdb683844f9aab" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_connector.py", + "sha256": "e67ed58015090e5eea9d499883f2a9422673d07f8bdbe0ccff7db15d2460de13" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_metadata_server.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_metadata_server.py", + "sha256": "6800e5cf37809f8a8e28c469c14a434db288bc3bf83a8b62ee06910a20c2da19" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/common.py", + "sha256": "8f2c02c08227a9093e6aeb183961aba36b7812cfc29b8c047a2b2c9d82f79c15" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/gather_scatter_helper.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/gather_scatter_helper.py", + "sha256": "08c1b43de34fbeca77357d7576ac1d17cba974b59d695562f68bb713061e7b54" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/hf3fs_mock_client.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/hf3fs_mock_client.py", + "sha256": "bec61a9b0c4b9124b2292d7646d76411da44396389349b53cdcbc46353c8780e" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/connector.py", + "sha256": "8c61094ce0a3a702908f9576f69482e6bf314738a2cbe33a7d3b47258fa0ab43" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/stats.py", + "sha256": "d9383a6ad6ab6b8f812d29d90495407b770eeddb79b86e9d0e3216c0bd16e0ed" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/worker.py", + "sha256": "251c0d8e57e4739c03ce3e1c899a95ff5b1752eb27676c28ab88c4ebd62c4776" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_connector.py", + "sha256": "5991f9ff8832df32bd421eb67e48237270ea0a408180e523810bb43606acf8f3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/__init__.py", + "sha256": "c53be9796e76cde637514bfc40a525d8c09bb2784b406cb516790d8285dfe433" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/multi_process_adapter.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/multi_process_adapter.py", + "sha256": "6480d67b31ed603027a83edf327880a38aee45eaeee2da9a4efa93e95527c166" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/utils.py", + "sha256": "e204fa6a853ac9c122d7a4e9d146902230f81c48d4321ed5edfdbf979dd49ba2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/vllm_v1_adapter.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/vllm_v1_adapter.py", + "sha256": "e6fe55049c6b007248516d69640e2f3a4809f9d286091a1014ae0949987fa8f1" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py", + "sha256": "c712c386a7c57bf0355a1441ba574232c3aa5498fcb70713a2b3f5d18b64f9c1" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/metrics.py", + "sha256": "de1b1797d0448f74370919dbb0278767f390e8f59e00a0c0528abefb302babc2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_connector.py", + "sha256": "516be01320e64b0110e102eeb69a6ba766dd5ac8cb3036db6b97b7d54413323d" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_utils.py", + "sha256": "26877610463fa8e9d6b092772f2551bcc0c3ac794cbe63996df0414666a8ebba" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/rdma_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/rdma_utils.py", + "sha256": "716e5042edecaba36c7ca763474988f32fa09c2668b8260260149df610af8f83" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/stats.py", + "sha256": "f39b2f0b1db2e4f922e27e684a3f7bbf5bb279b82a0a8c3bb0c7ae69b6d14d24" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/connector.py", + "sha256": "17a350bdb89e17e415d6c52a48684dc15c35a804378daf03e1f3bee1b1b123a3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/coordinator.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/coordinator.py", + "sha256": "a8eb6c2157a96e8d25233b82347ac8409a41d6390b4f2c64242119c05911010c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/data.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/data.py", + "sha256": "d3cfefdb4165a24995749cba452641b318065baa95bb1bae62f922a2f8886e7b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/metrics.py", + "sha256": "f2b9ef8927632d142aad11a374d0725c6e619ea0bb7fea9eda3f3895eb7d277a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/protocol.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/protocol.py", + "sha256": "ccb1cf6a84a932a375215627d2aaac482c351a05df015d636d05373a6845b7c8" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/scheduler.py", + "sha256": "283849ff581ec206444cdf5621622377f1c925e8d7e05cb9294af2f3a5094e79" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/worker.py", + "sha256": "55f1682dfd1ed7af689166421337126a0e1d08afa4774a242e098d79e0c1e95b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_common.py", + "sha256": "549bb4fe22dca5095515b9c0712c31cc81a9d4923881e9f112317640fd8c04ab" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_connector.py", + "sha256": "c0f474bc34b579d889fae92eaf43eaca241be51a4697a187a942f0df4e6b6a98" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_engine.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_engine.py", + "sha256": "d842f3772fc6588d5a329a67572324cb74709aa3df4033e64c791a1e706c8e88" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_layout.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_layout.py", + "sha256": "2b4ec046a78897236b0626939bb828b6ec095355097d10bca39e5f3e1c992553" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/multi_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/multi_connector.py", + "sha256": "12d8387239f3194f2cb63ccbd64824648047210323572d66671e6a1eed349fc3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/__init__.py", + "sha256": "cc3145fe3b6d219a267bf40a0f7c0cc9430e4289f94acab2df761b99b671e7ba" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py", + "sha256": "7a1db8c54e4cd846bdac747344f2aea2c2fcf507817928796063225223b7e169" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_worker.py", + "sha256": "49a2e4faf99bef146b5a1d4d18d48f240b1e561c438252274494b359db96ef52" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/connector.py", + "sha256": "b6a0dc916d052f344be72ecfcb111509c13580102c11a860fa726cf0888949a9" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/metadata.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/metadata.py", + "sha256": "2b23a07c1ec5ac5490c3b818737c7192e344ea9f52cd5623f75939f741ab4e21" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_scheduler.py", + "sha256": "ac3daf8e2246581fec84ab28f2133569421b62c32a120be4923e2f4d0f2f9de9" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_worker.py", + "sha256": "e5060c9b6cf022de35ca3d1da7a369cd6a6a2dea26219af9f7633aaf78af8a76" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_scheduler.py", + "sha256": "2d9008e33937a4d6c5cf9cc2f96160f2bdbc8e987fe37f0798a7fd7eb84c9572" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_worker.py", + "sha256": "87de3ea383dd3aa95fb2c287ea26ded8a330859cc1295f9faa69047e80865c2c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/scheduler.py", + "sha256": "09f1bfe7075b926b26a94529480e33b62c3ac273ff826f6c502084f08b1b2a08" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/stats.py", + "sha256": "3e710654e0b68d1a8592f0c4735c81b22f4bf698fb1a2dfea126d35bf2dd1ef2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/tp_mapping.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/tp_mapping.py", + "sha256": "2d43607f98701b2fad6cc0ac2767619a80b7fc2b3a3c2eb6ed0da4fb05dcd8f6" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/utils.py", + "sha256": "93de863fc8307a61d40b62f1b176b57ae93c363d34b9e9ddc8e666265b6d45dc" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/worker.py", + "sha256": "5134a36ac100ce7a64f5311029a37ac12c38d91093f63100f51f7fe53ea7c3ee" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/canonical_mapping.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/canonical_mapping.py", + "sha256": "e0b3c6f9806a650e0370c43c5068fc31c0fec94615089e15fdf270d7d96f2b64" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/common.py", + "sha256": "9b3f042c6fa1581d10e8f688d2d9bc927bb41b780a9ea01f514d57228e20c978" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/config.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/config.py", + "sha256": "aea82e60889e78dcad8564ec8285b65a6a372824a1545a98ea8e78b6f4fd418a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/events.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/events.py", + "sha256": "d7039b67be95fd444966628184040a94880873c0611c0e6e7525a22650ffdefb" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/metrics.py", + "sha256": "13d76df014e86691f58dc89a879f9808b124690c9267dd5fa3b2d4004d4c5fdf" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py", + "sha256": "2c5282f4a3165cd787fb355e215e3869f1bdd3f2c795b2155fc537c9d135191a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/worker.py", + "sha256": "acc2df53262441dfc6421a3af7f0cbd68cbfaedbd42bbc384d8e1da2d965d194" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading_connector.py", + "sha256": "cdc16ca7339a10e1993bd6220e6273f86a4e99779f58f25098a24ad31bb0dbd8" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/simple_cpu_offload_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/simple_cpu_offload_connector.py", + "sha256": "96238ca82ccf07a1eeb59b8f66de17b09034e3eb993ad9a0a836511d3f69706b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/ssm_conv_transfer_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/ssm_conv_transfer_utils.py", + "sha256": "59a949709482e65a007fbe5352fe9b4bb54c2dcc10ad2c1c41f754b6e13299f4" + }, + "vllm/distributed/kv_transfer/kv_transfer_state.py": { + "path": "/vllm/distributed/kv_transfer/kv_transfer_state.py", + "sha256": "2e5fe09438d6e2ee642f8a26cf7dcf632e870d955d30baf002b76a8bfe836d05" + }, + "vllm/distributed/nixl_utils.py": { + "path": "/vllm/distributed/nixl_utils.py", + "sha256": "0bffa3c052c9f67472b1c0bc3816114891b010c968bf4b8a292e7da4d687db53" + }, + "vllm/distributed/parallel_state.py": { + "path": "/vllm/distributed/parallel_state.py", + "sha256": "d9b10ad56833ebc08a753e1a050ef0989c30d4134021b7b7b00150b7bd01adc6" + }, + "vllm/distributed/stateless_coordinator.py": { + "path": "/vllm/distributed/stateless_coordinator.py", + "sha256": "f52848fbe985ed47b1f3e3ca555314736ca06436e8d738ab4390101f0672dcb0" + }, + "vllm/distributed/utils.py": { + "path": "/vllm/distributed/utils.py", + "sha256": "792146b357139e705064a68d3b66858de8a0baaca4dc7db1232fa217d45db231" + }, + "vllm/distributed/weight_transfer/__init__.py": { + "path": "/vllm/distributed/weight_transfer/__init__.py", + "sha256": "3fb9d4712b7c131d522f5e76e73cd8c333f3cc7af86e2d5ecf9b61b57b3b7f5a" + }, + "vllm/distributed/weight_transfer/base.py": { + "path": "/vllm/distributed/weight_transfer/base.py", + "sha256": "8ab06feb04f1379d0558fbdb77fde46bc84f179e0a26742cabab937e88caa38d" + }, + "vllm/distributed/weight_transfer/clients.py": { + "path": "/vllm/distributed/weight_transfer/clients.py", + "sha256": "ff85c79c350241e6d2749ca23c9d295a3289b4b62bfdf0257d32eb94a0151d36" + }, + "vllm/distributed/weight_transfer/factory.py": { + "path": "/vllm/distributed/weight_transfer/factory.py", + "sha256": "4e979eeac8c5bcdbffb10eb4765cfb30120fa7595c6c2561d3fa1a966ced61c8" + }, + "vllm/distributed/weight_transfer/ipc_engine.py": { + "path": "/vllm/distributed/weight_transfer/ipc_engine.py", + "sha256": "1af578293f387a19073c322b24143c3ae4716ce0c5d2bac2a4ef26fe20119330" + }, + "vllm/distributed/weight_transfer/nccl_common.py": { + "path": "/vllm/distributed/weight_transfer/nccl_common.py", + "sha256": "7b2ef7dc7481c3f478f17c49aa36c7bed54142ec5c93d36ed8426c8fdf09e500" + }, + "vllm/distributed/weight_transfer/nccl_engine.py": { + "path": "/vllm/distributed/weight_transfer/nccl_engine.py", + "sha256": "7fd020c919dc7b4723fb78e64da977b180d0fef0cd21df955a037b848dbaa008" + }, + "vllm/distributed/weight_transfer/packed_tensor.py": { + "path": "/vllm/distributed/weight_transfer/packed_tensor.py", + "sha256": "d0a27fb0be1dc029bd5a1d44fdb57a5e54aa4cd74308bedc339e86ac02c7494c" + }, + "vllm/distributed/weight_transfer/sharded_rdt_common.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_common.py", + "sha256": "be0b13801f24e7b62999b19d733c030510353603a2d5320d5dc98ee02daf22a2" + }, + "vllm/distributed/weight_transfer/sharded_rdt_engine.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_engine.py", + "sha256": "2f791970b4815511a7578ef6c957e7da97b071d26a39087a09a17475909791ee" + }, + "vllm/distributed/weight_transfer/sharded_rdt_fake.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_fake.py", + "sha256": "ee11164e17b5f2793252ce77741b8b94e0583046abf896a590131b2008d1fbb9" + }, + "vllm/distributed/weight_transfer/sharded_rdt_trainer.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_trainer.py", + "sha256": "dd413ff461d41826ccd3eb87d3df22f6cd7f24e09aac7644e3e5b40d7beec484" + }, + "vllm/distributed/weight_transfer/sparse_nccl_engine.py": { + "path": "/vllm/distributed/weight_transfer/sparse_nccl_engine.py", + "sha256": "e11b409454dda2b05ea34e8115ac19027c5e65cb2a5e9682c494f16a50e978f4" + }, + "vllm/model_executor/determinism/__init__.py": { + "path": "/vllm/model_executor/determinism/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/determinism/batch_invariant.py": { + "path": "/vllm/model_executor/determinism/batch_invariant.py", + "sha256": "af8f8d256a48fc214edf426fbe891fb15bd8b1d7ae98b811c736ff1eb0fae798" + }, + "vllm/model_executor/determinism/batch_invariant_configs.py": { + "path": "/vllm/model_executor/determinism/batch_invariant_configs.py", + "sha256": "72ea0d4df0ab5ae288abb7df5c203d2ad5f1709c7295d87ec72da775fddc1b7a" + }, + "vllm/model_executor/layers/fused_moe/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/__init__.py", + "sha256": "64a32665be6d5afcfbaf7a0915717267278b66b880b908b0263ea58f08e51b5e" + }, + "vllm/model_executor/layers/fused_moe/activation.py": { + "path": "/vllm/model_executor/layers/fused_moe/activation.py", + "sha256": "78dec0e85e0c040304515f64ccf8f2c6a7a2e5b9f1124a2138a97d9a02585541" + }, + "vllm/model_executor/layers/fused_moe/all2all_utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/all2all_utils.py", + "sha256": "dc4750a446f7de31d09a46034da5fdf479bc169af90f47aa9af8ae15e67b0828" + }, + "vllm/model_executor/layers/fused_moe/b12x.py": { + "path": "/vllm/model_executor/layers/fused_moe/b12x.py", + "sha256": "ee76cc6aa801e24be8ec78a9e8502061ad48667d5ff8711e43f68fba912425bd" + }, + "vllm/model_executor/layers/fused_moe/config.py": { + "path": "/vllm/model_executor/layers/fused_moe/config.py", + "sha256": "a3a87cebcc7ac85d73f471dcfafc2d899c6fc08f264777b74a0e919adac9e03f" + }, + "vllm/model_executor/layers/fused_moe/deep_gemm_utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/deep_gemm_utils.py", + "sha256": "8fdcd857eb333f9c68902105f157568d52067c94ba1e2df6dbfe0474ef1f4c02" + }, + "vllm/model_executor/layers/fused_moe/eep_reconfigure.py": { + "path": "/vllm/model_executor/layers/fused_moe/eep_reconfigure.py", + "sha256": "9d7580265e8563e1140c2bb4c3a81a35ddd54903f5ec0a2720ffc064681f02f9" + }, + "vllm/model_executor/layers/fused_moe/expert_map_manager.py": { + "path": "/vllm/model_executor/layers/fused_moe/expert_map_manager.py", + "sha256": "308c00f63fcb6f44518ec3a56d8f902c7bba75928c2e3aea30fbe1f3f473973b" + }, + "vllm/model_executor/layers/fused_moe/experts/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a16_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a16_moe.py", + "sha256": "53deea255175171971422d14082ad139b5ec7b62e21429a4c7cc0ebbefd29cdc" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a8_moe.py", + "sha256": "f3fc51b95ed89862381908a0134e326228827f44854248db9585a9c4899c34f4" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp8_moe.py", + "sha256": "af6db1760961a5a71234f8b1cdf42e9e30a236e13601b0826a75110b79724948" + }, + "vllm/model_executor/layers/fused_moe/experts/batched_deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/batched_deep_gemm_moe.py", + "sha256": "b0cd4ea706583518dc608fb56f832fc3595f24bd863b03ef1e8c22b36b873508" + }, + "vllm/model_executor/layers/fused_moe/experts/cpu_int4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cpu_int4_moe.py", + "sha256": "67170af3ba9dc4c4f71d78a72efc3fa4e366eac614936a79911dae5c75ac1864" + }, + "vllm/model_executor/layers/fused_moe/experts/cpu_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cpu_moe.py", + "sha256": "0754cd4ff1b28e6d3932a67609d335acefd28f95a841f0492923813356a6d81e" + }, + "vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py", + "sha256": "db901bdbcd3fdac23a1d74e39c51e67f14a82be787b2fd704ed1e787372ae868" + }, + "vllm/model_executor/layers/fused_moe/experts/deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/deep_gemm_moe.py", + "sha256": "16911a64a72eafc26a1bcb544a91f90144d85dc41e3ee57cf20e89925227bbb7" + }, + "vllm/model_executor/layers/fused_moe/experts/fallback.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fallback.py", + "sha256": "1bdd0a4f2ebaa40ec96a5aacc07aee61511af59e6324ce456aa65003b6e2991a" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_b12x_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_b12x_moe.py", + "sha256": "e613afe5da2742e42c717c1a0a56bd9e1c7e3e0452a828db0013d81063518954" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_batched_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_batched_moe.py", + "sha256": "295254dfeeec8df3eb8110e6f659a946cb9cded3de1565ecad4d741b3c3f3e00" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_moe.py", + "sha256": "08578bcd0cf72d6a470e40950175e73639efaa6d8d23c6da0869345312b229c9" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutlass_moe.py", + "sha256": "52887cec5fe628e0a4e7793deb546b40f6c29f7362b3b436c10ca36934ab9826" + }, + "vllm/model_executor/layers/fused_moe/experts/fused_batched_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fused_batched_moe.py", + "sha256": "2435587fc7f8fe8ea341ea0eb8f14c11f3f5b31fbbb9b29ce569ad3bace6e6a0" + }, + "vllm/model_executor/layers/fused_moe/experts/fused_humming_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fused_humming_moe.py", + "sha256": "a6830a76ff7f4cd3479b9c8372a30d03e8301604555cbdbcd9ac89a813b7431a" + }, + "vllm/model_executor/layers/fused_moe/experts/gpt_oss_triton_kernels_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/gpt_oss_triton_kernels_moe.py", + "sha256": "1613a7a6b256e8faee6fdcfae84f293492db6229d28ceb3e8a8d6093af480e36" + }, + "vllm/model_executor/layers/fused_moe/experts/int4_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/int4_emulation_moe.py", + "sha256": "f12857caf0671a341687ad3c5f48616b816ed51e1bcbdefa0a7edbecdb81a79d" + }, + "vllm/model_executor/layers/fused_moe/experts/lora_context.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/lora_context.py", + "sha256": "9b41eefaaa57c5dd0dc54217ef95978821b0c52e90ea4db8b0752e08452bd3e5" + }, + "vllm/model_executor/layers/fused_moe/experts/lora_experts_mixin.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/lora_experts_mixin.py", + "sha256": "b2bc55ed6be98b526c6a5698e2d98300650e78555f56b1820e58c04888e2a373" + }, + "vllm/model_executor/layers/fused_moe/experts/marlin_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/marlin_moe.py", + "sha256": "93916b721548e6194dc70cf6cec224b4b1456a0cc0980235e97beba7bf36541d" + }, + "vllm/model_executor/layers/fused_moe/experts/mxfp8_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/mxfp8_emulation_moe.py", + "sha256": "d09c62ad1398c51ff6f515f2a61014ee9e9a9798d0fe9762c47f446efc5edbef" + }, + "vllm/model_executor/layers/fused_moe/experts/mxfp8_native_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/mxfp8_native_moe.py", + "sha256": "01a42cebf18189e566034111b2145573c655319e8af1a56db60d53a319c40613" + }, + "vllm/model_executor/layers/fused_moe/experts/nvfp4_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/nvfp4_emulation_moe.py", + "sha256": "f24467762b60702f0df122ed64786be839a838a9b6cafaecbd04d35fbfedb189" + }, + "vllm/model_executor/layers/fused_moe/experts/ocp_mx_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/ocp_mx_emulation_moe.py", + "sha256": "dcaa60a9ebdb0bd8223b37af41f018ce7f95716ec7cd8526850f4433a579213b" + }, + "vllm/model_executor/layers/fused_moe/experts/rdna3_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/rdna3_moe.py", + "sha256": "e4abd802dc2f0ad9b338ebde397633c761d881c37813e2dc229902c526b597d8" + }, + "vllm/model_executor/layers/fused_moe/experts/rocm_aiter_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/rocm_aiter_moe.py", + "sha256": "bf09a7b783f5752d61cab76221b32b598d8846d801ee39dc9209d636c9659c6f" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_cutlass_moe.py", + "sha256": "ffce5ad627c540940d122d8df7981644b2eb35d07d480995c0f4f30517815fac" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_deep_gemm_moe.py", + "sha256": "c7209fa5e1ccb184a68b37a0706fc571a76696c2ae79802ddc7f889b1c29684d" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_moe.py", + "sha256": "806fbccfe30f5fbd578acf773add99bdf022b12d617958bd6281aef6de369701" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_bf16_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_bf16_moe.py", + "sha256": "76256de96fefece9c41ffb1108487919e24da364cf4412c6c3474498aba59137" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.py", + "sha256": "b54c7ceb45e5d07aa905f42ea44caccf85ca35ba9fb825d4c01947764510f68b" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_lora_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_lora_moe.py", + "sha256": "dd35a9e4242c0dc8d691168813e14bd5543e591f02ee529d0691e07651942c5a" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_mxfp4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_mxfp4_moe.py", + "sha256": "fe780f125a3dc3ba919659e9b85340bd32afcbfe47733a002bfdfb92eadf400c" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_mxint4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_mxint4_moe.py", + "sha256": "2106d67c2951aa690c4656ca58240d09c366cffe8cb4d9fd575df016c377cc30" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_nvfp4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_nvfp4_moe.py", + "sha256": "e938ac9f058f7c90b41c9610513239bec54a95304bfb5ff5f6897ebd54733d7e" + }, + "vllm/model_executor/layers/fused_moe/experts/xpu_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/xpu_moe.py", + "sha256": "2a11bac0cf9274d963315efd6eebdc62978b0b7aa02e8849ff2a562742f0b86d" + }, + "vllm/model_executor/layers/fused_moe/fused_flydsl_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_flydsl_moe.py", + "sha256": "0e74879ee5c72f616ae4064b9dff3b3a0b583b7fc70b8f92f1e8b730ecd5d39b" + }, + "vllm/model_executor/layers/fused_moe/fused_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe.py", + "sha256": "7072eb06237be9d33dcb0ef7101410f886a6363c98cbee70a014c68b70f639cb" + }, + "vllm/model_executor/layers/fused_moe/fused_moe_method_base.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe_method_base.py", + "sha256": "18dcfc469d3252749801bbf943857f58da85de1f2db8fdff5a9f4986a925dc68" + }, + "vllm/model_executor/layers/fused_moe/fused_moe_modular_method.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe_modular_method.py", + "sha256": "321c744eac1fcaffd6b1b2971204c8baa57dfec53e91e5d24140014d72d64f83" + }, + "vllm/model_executor/layers/fused_moe/hpc_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/hpc_moe.py", + "sha256": "2ca9c5d71b6fd91651027905e2b83103a8823845e053e7153e148cb8e0ee666d" + }, + "vllm/model_executor/layers/fused_moe/layer.py": { + "path": "/vllm/model_executor/layers/fused_moe/layer.py", + "sha256": "def0b4e13bcc1e4e21ee10644e647e2eda1acbf0cc01e76d6128abb59ea08224" + }, + "vllm/model_executor/layers/fused_moe/modular_kernel.py": { + "path": "/vllm/model_executor/layers/fused_moe/modular_kernel.py", + "sha256": "8dc4e0dbbf35b3aac8add63ca6f2a7bbfdadaabbd60826e24598b22c7d8e5c22" + }, + "vllm/model_executor/layers/fused_moe/moe_align_block_size.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_align_block_size.py", + "sha256": "c3f7fc2087836f0160a32ab99ceb1d8f6e87c793679da34dd672e225cb7fa31b" + }, + "vllm/model_executor/layers/fused_moe/moe_fused_mul_sum.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_fused_mul_sum.py", + "sha256": "112e72578002c3bff538418dac64b3b56d995994a2fc5e32b18d2cf3b8392a13" + }, + "vllm/model_executor/layers/fused_moe/moe_output.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_output.py", + "sha256": "6ea4cbd78f9efc7f842c5df246f553f08b991c3479b8b04b89902ed08aaf8e8f" + }, + "vllm/model_executor/layers/fused_moe/moe_permute_unpermute.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_permute_unpermute.py", + "sha256": "1adc592c6254d0c877d66be5406afbc822459c18a838f4bbd094a992e7609d06" + }, + "vllm/model_executor/layers/fused_moe/oracle/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/__init__.py", + "sha256": "4dcf941d50d48bb812de0f39e9194bf17a76b8035fe324889c6038f710fdc453" + }, + "vllm/model_executor/layers/fused_moe/oracle/base.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/base.py", + "sha256": "555bbcd18a3744e64eee4e953daabef3bd268a1bd4faf967d4cfd14d6074f685" + }, + "vllm/model_executor/layers/fused_moe/oracle/fp8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/fp8.py", + "sha256": "245bd36c285df1e6f7c51e52dcda31ad247894577a9f8d765613c2c2feae9aee" + }, + "vllm/model_executor/layers/fused_moe/oracle/int8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/int8.py", + "sha256": "c1b67886511bd966b162db5bca8930f04895fb37a969818a4a10f0726c59547f" + }, + "vllm/model_executor/layers/fused_moe/oracle/int_wna16.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/int_wna16.py", + "sha256": "cfffe8b8b290330be9d18ffa07aeecf296484395ff04df3147d99393e48b55c1" + }, + "vllm/model_executor/layers/fused_moe/oracle/mxfp4.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/mxfp4.py", + "sha256": "b7915e6779b5c88e7dcd2d227f003a8e45071d6d86877013067142d4feb64a8c" + }, + "vllm/model_executor/layers/fused_moe/oracle/mxfp8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/mxfp8.py", + "sha256": "9cfdc8102a04bb844dcd7ed88043bba96ec751794bc093da76c69aa8cf88cf48" + }, + "vllm/model_executor/layers/fused_moe/oracle/nvfp4.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/nvfp4.py", + "sha256": "735b4cdeb1258f11fb02320fc0c70cab5edaca468dd60b07b2d369389d2b0313" + }, + "vllm/model_executor/layers/fused_moe/oracle/unquantized.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/unquantized.py", + "sha256": "c8b8203bd0b73bb7f586f703607394d663f14c05711416ad42d45af564382223" + }, + "vllm/model_executor/layers/fused_moe/oracle/w4a8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/w4a8.py", + "sha256": "d7fa6e2982f20b34d5ce9c5ce28a61122762a3fcdd53d249479472a4f2316c6a" + }, + "vllm/model_executor/layers/fused_moe/oracle/w4a8_int8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/w4a8_int8.py", + "sha256": "6d6f9ca2e67b630002873de2f8d8a231d091c5c2f0f3354a9e8209449b481a4c" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/__init__.py", + "sha256": "2800113263a83c2632e522fb22790b29f63384da75d43de32f0ae2f95e8ae4c1" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/batched.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/batched.py", + "sha256": "d52425dd8c08e47cf8d9c3088daf3b1cc721c8667de4c738d04ba997f9a08ccb" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ht.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ht.py", + "sha256": "465cdf1d6cee91b2ee8c2e43abbea6e8408976e3048c10f44c089f34b415bc60" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ll.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ll.py", + "sha256": "f704922b1db680c4c212982a096e09d6b3eb97d89110313f86ed958a00df21b7" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_v2.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_v2.py", + "sha256": "8d690b016bbcfbc9eb599bcc36a6f798b2f1720c828f4347ea742e218c0cc60d" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_one_sided.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_one_sided.py", + "sha256": "acb57d8342af62bb5672036871cd4b27ecc7f37dfa7c894850bb860e6152a1f0" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_two_sided.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_two_sided.py", + "sha256": "cc5b00d6a157b6eca5afaaf7435165dbd1b4524d6d88bf75808cbe074a389f79" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/mori.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/mori.py", + "sha256": "8e9c3b5b1f0de13f467d95bf2f451cba0e4b0d9a1bdcf98da0988a3a9a79a045" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/naive_dp_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/naive_dp_ep.py", + "sha256": "db015e5b18750bbbf5b2bbaceca877dd6f3f3e74c2a94e8dc185f7413b387f91" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/nixl_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/nixl_ep.py", + "sha256": "1f71d70ac509bf5d3d67a8d95a8ee108a50af6bb5d4bde7181ca28e286f6ffce" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/no_dp_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/no_dp_ep.py", + "sha256": "adbbf529cd22059c95b5380952943a70cf11e05e321dcd707f296bebde61a6e7" + }, + "vllm/model_executor/layers/fused_moe/routed_experts.py": { + "path": "/vllm/model_executor/layers/fused_moe/routed_experts.py", + "sha256": "68c48e5df0ea4a7cc1f04436b7b9153eb53802ecd9bb55d38db8738508daac6d" + }, + "vllm/model_executor/layers/fused_moe/routed_experts_capturer.py": { + "path": "/vllm/model_executor/layers/fused_moe/routed_experts_capturer.py", + "sha256": "cd006bc1a1703418cca3b589fafb2abc4268a086fb3db044bbb64348aeac8b13" + }, + "vllm/model_executor/layers/fused_moe/router/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/layers/fused_moe/router/aiter_shared_routed_fused_moe_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/aiter_shared_routed_fused_moe_router.py", + "sha256": "f47046db1275601a2c67c9232afc7b866c9623a19639d5be867e4c7914a35069" + }, + "vllm/model_executor/layers/fused_moe/router/base_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/base_router.py", + "sha256": "47fa2324bcd9b6ebdc138d69ae6b6ecc0f2463d34bda8c5988bdb0a2a76d3fae" + }, + "vllm/model_executor/layers/fused_moe/router/bf16x3_router_gemm_cutedsl.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/bf16x3_router_gemm_cutedsl.py", + "sha256": "d0f1edd1ebc48d88e490bdb3c93db49bdc0a135ff83e7e0b57130e9f8255fc32" + }, + "vllm/model_executor/layers/fused_moe/router/cpu_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/cpu_router.py", + "sha256": "bff36b15818c87bfbb7ee3def7dc7f6396860abbe5893ff6148801fe941a4b92" + }, + "vllm/model_executor/layers/fused_moe/router/custom_routing_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/custom_routing_router.py", + "sha256": "1a40c7054e3c3a1b3ee2e98f6bc9efa9dfdc11f316a8edf7357dd91533487bfe" + }, + "vllm/model_executor/layers/fused_moe/router/dsv4_topk.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/dsv4_topk.py", + "sha256": "14f7c8487b9aef652dd61c91e0e3c3640b643bf9cd0d8a7184157d71f4beb63e" + }, + "vllm/model_executor/layers/fused_moe/router/fused_moe_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_moe_router.py", + "sha256": "0daa0dc05b931d66767feca444a4cd57ecf140f59b40ea0e8ad213eef6da2b36" + }, + "vllm/model_executor/layers/fused_moe/router/fused_topk_bias_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_topk_bias_router.py", + "sha256": "8fdc28cc248180ad4f11bb4bcda3df47926ec12665a0d84bb712fe83fc6b9376" + }, + "vllm/model_executor/layers/fused_moe/router/fused_topk_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_topk_router.py", + "sha256": "1c80f4af4d781fd66b12aa6a7a0fd30082bc521df40f1252987a8ac4c0bef51c" + }, + "vllm/model_executor/layers/fused_moe/router/gate_linear.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/gate_linear.py", + "sha256": "faa43362c2e7c568498a923c682ca18cae75e87f48d00882770821cb19c21198" + }, + "vllm/model_executor/layers/fused_moe/router/grouped_topk_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/grouped_topk_router.py", + "sha256": "048339e1799cdd42c9dae686a6cb891046577fb391b500f0d12eed73c8f61e52" + }, + "vllm/model_executor/layers/fused_moe/router/rocm_fp32_router_gemm.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/rocm_fp32_router_gemm.py", + "sha256": "9c331ef3d0bb2fb6954387d77ac62a99c5c76d2753c7438bfbb5115f68aae5ac" + }, + "vllm/model_executor/layers/fused_moe/router/router_factory.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/router_factory.py", + "sha256": "019bc8adaa7642abab82843efd53cd1a378f62c652521a1de2b781480eb88742" + }, + "vllm/model_executor/layers/fused_moe/router/routing_simulator_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/routing_simulator_router.py", + "sha256": "a7345df5add00cf3bd93024492d6fc1189fd3ecf2754a11cef1b03a295d791f7" + }, + "vllm/model_executor/layers/fused_moe/router/zero_expert_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/zero_expert_router.py", + "sha256": "dea306edd92e2b9c1b43f982ede8e1e10770d2c66220f5a106e0ed0165276e9c" + }, + "vllm/model_executor/layers/fused_moe/runner/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/layers/fused_moe/runner/moe_runner.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/moe_runner.py", + "sha256": "05893188402fe37229bf72d75088d66193c417d5d502daafd3a55e1bfedaa60c" + }, + "vllm/model_executor/layers/fused_moe/runner/moe_runner_interface.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/moe_runner_interface.py", + "sha256": "189cad01611124eb44594713cbf5918d16fc70196dc81a525ae0a7a97a5fcc51" + }, + "vllm/model_executor/layers/fused_moe/runner/shared_experts.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/shared_experts.py", + "sha256": "d89e4c79c46f6fe61262c51f3facf102e71ce1e4eb3db67f72b6bd8470937be9" + }, + "vllm/model_executor/layers/fused_moe/topk_weight_and_reduce.py": { + "path": "/vllm/model_executor/layers/fused_moe/topk_weight_and_reduce.py", + "sha256": "3dfede72d52bf99af40997994704e6c502ee3bab2bd39bfaa8a68d7dae440203" + }, + "vllm/model_executor/layers/fused_moe/unquantized_fused_moe_method.py": { + "path": "/vllm/model_executor/layers/fused_moe/unquantized_fused_moe_method.py", + "sha256": "182a5ec1874ece2091a24c5303f6ab9ea64a9a61adf325b863927f0cdd83e5d3" + }, + "vllm/model_executor/layers/fused_moe/utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/utils.py", + "sha256": "a93a0bded4008db19d8b38370526ae34fafb9c8278e5b4f60acb6acc8fdc1850" + }, + "vllm/model_executor/layers/mamba/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/abstract.py": { + "path": "/vllm/model_executor/layers/mamba/abstract.py", + "sha256": "dfdc8c836894f574e41d93d76ab989cacd3d7ecf59c97a929abfa48d9364e8ad" + }, + "vllm/model_executor/layers/mamba/gdn/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/gdn/base.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/base.py", + "sha256": "7fec748fc74131f5a45bcaf2644b3fa3a0598fd437d7347f8207ea3644a951c5" + }, + "vllm/model_executor/layers/mamba/gdn/kimi_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/kimi_gdn_linear_attn.py", + "sha256": "1cec4da5c9da73557e192bfb36cd540aae51d3e91283b554449c4a97f0f89bd9" + }, + "vllm/model_executor/layers/mamba/gdn/olmo_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/olmo_gdn_linear_attn.py", + "sha256": "60873ca3bb0c4d17c33bd259b62b658db4883cd23138f47dd4ead62cd2ff0605" + }, + "vllm/model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py", + "sha256": "b80f8e6f3fff442fb880aebb3209c52f814f66490009f4ac4003de603576d10a" + }, + "vllm/model_executor/layers/mamba/linear/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/linear/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/linear/bailing_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/linear/bailing_linear_attn.py", + "sha256": "3c480ddd6eba0766ed012a1074bbec5f241d868a87b020b0f6312222c32f93eb" + }, + "vllm/model_executor/layers/mamba/linear/base.py": { + "path": "/vllm/model_executor/layers/mamba/linear/base.py", + "sha256": "26125cd427225954e1846ca361cdaf43f2b56f11b1e217cf26e91a80ef0edb6a" + }, + "vllm/model_executor/layers/mamba/linear/minimax_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/linear/minimax_linear_attn.py", + "sha256": "4adc00f54893b5bc6c31c613deda152a19af3b1bba04153ab5924c3bf2a3aaae" + }, + "vllm/model_executor/layers/mamba/mamba_mixer.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_mixer.py", + "sha256": "a485e937ad9db14d3ad03fde5a9fe795cfa863649563e52fc7e6c52ef631164e" + }, + "vllm/model_executor/layers/mamba/mamba_mixer2.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_mixer2.py", + "sha256": "d58d93e90d9eb90bc5133b79f07c7c62d0032b35d6cf916e3fe34367b81c5cd5" + }, + "vllm/model_executor/layers/mamba/mamba_utils.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_utils.py", + "sha256": "ce9845b4a4ef4bc46577a33038ed69d59ceccb52f30e9c5bdaa36e48be3b2ca4" + }, + "vllm/model_executor/layers/mamba/ops/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/ops/causal_conv1d.py": { + "path": "/vllm/model_executor/layers/mamba/ops/causal_conv1d.py", + "sha256": "044d005cfe59fd0818ed421274e04f3e8dd679b8cdb64fca9f4422f2643484b2" + }, + "vllm/model_executor/layers/mamba/ops/cpu/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/ops/cpu/causal_conv1d.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/causal_conv1d.py", + "sha256": "64104672890ac2ef240c20c7f8059beeade707178574809dbca8721dff5ea6fa" + }, + "vllm/model_executor/layers/mamba/ops/cpu/gdn_attention.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/gdn_attention.py", + "sha256": "a50288945bf5b102ad3025ae536638dcc32d84cf7c22aaf3a85326b0c1c56c1f" + }, + "vllm/model_executor/layers/mamba/ops/cpu/mamba_ssm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/mamba_ssm.py", + "sha256": "5839e576172a3246337f5e4fb1bc19eb583b3e2b2f7e35dd060dc3041eb8372d" + }, + "vllm/model_executor/layers/mamba/ops/gather_initial_states.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gather_initial_states.py", + "sha256": "5198bb6de6d91c583a5f65d926412a76ee04a06fa72aaba76eaf156b27cd0523" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/__init__.py", + "sha256": "b88b52e71fcb21bd3fa215ea171dcd2ad2ff17c97788cfe64caa7ba45c7ecf97" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_h.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_h.py", + "sha256": "f50bbe5c0b6382323ec5dfc24a5e0c7971113d59727515e60c9fe3689734e5ba" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_kkt_inv_uw.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_kkt_inv_uw.py", + "sha256": "b4a65dd194907db08865e0596fe254f915e670a9e6b27ffa2933c1026dde9b1e" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_o.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_o.py", + "sha256": "629f7843a7e611efb9390f2ebb7a4b924b2c328d48a317fddfaa96af4d9bc60a" + }, + "vllm/model_executor/layers/mamba/ops/layernorm_gated.py": { + "path": "/vllm/model_executor/layers/mamba/ops/layernorm_gated.py", + "sha256": "3433f2e3b87c2b2ccf8e9794ce40762c86a6da38a94ecee001f439ea0d0373dd" + }, + "vllm/model_executor/layers/mamba/ops/mamba_ssm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/mamba_ssm.py", + "sha256": "a4515ec7895b40ed878cf380445034b25faa61fbaa799d96c49217bbdfd7e400" + }, + "vllm/model_executor/layers/mamba/ops/replayssm_config.py": { + "path": "/vllm/model_executor/layers/mamba/ops/replayssm_config.py", + "sha256": "5fe9d5d7aa2de6a65875b3796a919b22bc435fd76055ba054bbff43aa005bc44" + }, + "vllm/model_executor/layers/mamba/ops/scatter_states.py": { + "path": "/vllm/model_executor/layers/mamba/ops/scatter_states.py", + "sha256": "f3bb004c73edaba56337747893eb07faf29b270dc8bb9c893ee9b1044e4ead9a" + }, + "vllm/model_executor/layers/mamba/ops/selective_state_update_replayssm_output_only.py": { + "path": "/vllm/model_executor/layers/mamba/ops/selective_state_update_replayssm_output_only.py", + "sha256": "cea7fd3063ca9dcc4e33f180d01ea379195ec515cedc9d0b03b11dc67670d695" + }, + "vllm/model_executor/layers/mamba/ops/ssd_bmm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_bmm.py", + "sha256": "26983d97a7f5c5f9197a16a6bee7b1294839b9ae31a14c14aaee38b43523e630" + }, + "vllm/model_executor/layers/mamba/ops/ssd_chunk_scan.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_chunk_scan.py", + "sha256": "d5ef32e8cb47e2ce71984579df78ab69754895f891766394daf327867cfa4f8f" + }, + "vllm/model_executor/layers/mamba/ops/ssd_chunk_state.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_chunk_state.py", + "sha256": "177e3aa7fe72647133bbd86135533e8688a5802678d4d1564aa549410362316f" + }, + "vllm/model_executor/layers/mamba/ops/ssd_combined.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_combined.py", + "sha256": "1317bbb668d3c60dfe0658850f9968614f03fa5eb61196f8ce6ac17dbb31b480" + }, + "vllm/model_executor/layers/mamba/ops/ssd_state_passing.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_state_passing.py", + "sha256": "36b8c8edba437916a5b789717c61fc22077de01e77892cb96dbff3b00a57410e" + }, + "vllm/model_executor/layers/mamba/ops/ssu_dispatch.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssu_dispatch.py", + "sha256": "bbe0f0e61da87f3ddfead19a79ca376516b63f1ea868be3485333c63fa20ef41" + }, + "vllm/model_executor/layers/mamba/ops/triton_helpers.py": { + "path": "/vllm/model_executor/layers/mamba/ops/triton_helpers.py", + "sha256": "a8795532f22c37a93e82c9d8e3fadcb5f4da98673d7b321fe8481305eaafad30" + }, + "vllm/model_executor/layers/mamba/short_conv.py": { + "path": "/vllm/model_executor/layers/mamba/short_conv.py", + "sha256": "228494efab185ee17374f762874f4c8b9a26aac9decfa8c906ce38446e0de51a" + }, + "vllm/model_executor/models/qwen3_next.py": { + "path": "/vllm/model_executor/models/qwen3_next.py", + "sha256": "4fa5112ac2bf7886d41d9e1f6c3da8793620d1ec49c961b31e9609459a6a7f7a" + }, + "vllm/third_party/flash_linear_attention/__init__.py": { + "path": "/vllm/third_party/flash_linear_attention/__init__.py", + "sha256": "5dbbfa3fc286edb2e970e175ef33cee4f6181c89b0784f5a8986201b2312f54e" + }, + "vllm/third_party/flash_linear_attention/ops/__init__.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/__init__.py", + "sha256": "dd738dc1d08045e76455cdbe16052a5b769e0eb11d6e87ff28353994f880cd6c" + }, + "vllm/third_party/flash_linear_attention/ops/chunk.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk.py", + "sha256": "c105ead259e86aedc248c53e7c4cef07034d0ff12da608d80265d1dd0990803f" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_delta_h.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_delta_h.py", + "sha256": "1b3ad391f939d9443c6b7adb19e57fe381bd5dccea064e8417a4f85b0e713b26" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_o.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_o.py", + "sha256": "3b63b836a8cc561723c23db5a528a0b474d9cd78508d610f0b348c585a889a19" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_scaled_dot_kkt.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_scaled_dot_kkt.py", + "sha256": "7ae41df3755acc7e925a134d848f78bb5fc00b90069039d86403c5853323ea42" + }, + "vllm/third_party/flash_linear_attention/ops/cumsum.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/cumsum.py", + "sha256": "d818215669b451868823202ac0bcea77e7a9d75957254c7c1060a73a55dc39b6" + }, + "vllm/third_party/flash_linear_attention/ops/fused_gdn_prefill_post_conv.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_gdn_prefill_post_conv.py", + "sha256": "590717b2107abc90d72548de06b5d315229eb2775c94614f3f545df11cc2b5df" + }, + "vllm/third_party/flash_linear_attention/ops/fused_norm_gate.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_norm_gate.py", + "sha256": "e6eb90467f29d8a0a04f2a364d20a2c3191b6ab857841bfb82076b33a6022d1a" + }, + "vllm/third_party/flash_linear_attention/ops/fused_recurrent.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_recurrent.py", + "sha256": "fe6f1311014809040497aa0a623e7fa97f4b3457cdc7ee1f1f8aed21f326f755" + }, + "vllm/third_party/flash_linear_attention/ops/fused_sigmoid_gating.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_sigmoid_gating.py", + "sha256": "000ab8996af9788fdb8843a6a3b91833e7a14c8acc0e1ea073a536330f64cb6f" + }, + "vllm/third_party/flash_linear_attention/ops/index.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/index.py", + "sha256": "a4f8b2c052635cb519a80099e8a85411d1d5d6880b38f466788259bbe66b154d" + }, + "vllm/third_party/flash_linear_attention/ops/kda.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/kda.py", + "sha256": "e1f31aaa89b91f8e5db6d070b229e2c81c7206e8caec67de41db97d06be0c476" + }, + "vllm/third_party/flash_linear_attention/ops/l2norm.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/l2norm.py", + "sha256": "520f4513ef4fc97e6b88dc07877cca8e29da0d34e44673fe989e3af002d86381" + }, + "vllm/third_party/flash_linear_attention/ops/layernorm_guard.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/layernorm_guard.py", + "sha256": "42af29be26e8fc94a4658e053c095fcdab9ffdc1bc2446a01e787deda2a298c0" + }, + "vllm/third_party/flash_linear_attention/ops/op.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/op.py", + "sha256": "456da84fd12411cf53c96a90dd4f78f49afb454c3d51d2c524ea8e7106fe8ae5" + }, + "vllm/third_party/flash_linear_attention/ops/solve_tril.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/solve_tril.py", + "sha256": "d1a4ff27623a938825052500afa7e2aa24fadd2fa4c9be6376c9128824f86f82" + }, + "vllm/third_party/flash_linear_attention/ops/utils.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/utils.py", + "sha256": "d6c90d36505e02086954c23ca4dd2fea82a69416d68ff1d0501e16b3148b5b0c" + }, + "vllm/third_party/flash_linear_attention/ops/wy_fast.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/wy_fast.py", + "sha256": "c9fc8259db0a8746dc04f1d799cb73333457118cf89a0bdce8dde8a80a28cd96" + }, + "vllm/v1/attention/__init__.py": { + "path": "/vllm/v1/attention/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backend.py": { + "path": "/vllm/v1/attention/backend.py", + "sha256": "01ac364372afa75fdb22486aa3a9c7cf9aebb742e3471dfb9e0f9d9d36b734bc" + }, + "vllm/v1/attention/backends/__init__.py": { + "path": "/vllm/v1/attention/backends/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backends/b12x.py": { + "path": "/vllm/v1/attention/backends/b12x.py", + "sha256": "443f0a98738fdfefe5b9ab151d278bfd43a8ac807eb2b0b9b2a13d51922afbf9" + }, + "vllm/v1/attention/backends/composite.py": { + "path": "/vllm/v1/attention/backends/composite.py", + "sha256": "4cf3d66dca891562709eed4f50aa14b0ae6c8240d9ea86504a3304b2f356cce0" + }, + "vllm/v1/attention/backends/cpu_attn.py": { + "path": "/vllm/v1/attention/backends/cpu_attn.py", + "sha256": "76fb02a6bd725125565d84bf04f627cf16da5f7ff8f31f87c01ed6a1439398c7" + }, + "vllm/v1/attention/backends/fa_utils.py": { + "path": "/vllm/v1/attention/backends/fa_utils.py", + "sha256": "08fa6e231d3af3a71a6e59162dd12328aa8beb28548165ae58f130a92adb5a83" + }, + "vllm/v1/attention/backends/flash_attn.py": { + "path": "/vllm/v1/attention/backends/flash_attn.py", + "sha256": "b170a4789e18104c1bee35bea70df51abe6766693d8f4726a59f2e6f5c4282aa" + }, + "vllm/v1/attention/backends/flash_attn_diffkv.py": { + "path": "/vllm/v1/attention/backends/flash_attn_diffkv.py", + "sha256": "e4627c88c3ba8caee260540e994cc8137fd2ff7cd7813356b36387c6c88ce30a" + }, + "vllm/v1/attention/backends/flashinfer.py": { + "path": "/vllm/v1/attention/backends/flashinfer.py", + "sha256": "8ee541fde43ed92a417b3f01ea1e6fc64af8ab2eb54cbfc28308a49aaca4ed7f" + }, + "vllm/v1/attention/backends/flex_attention.py": { + "path": "/vllm/v1/attention/backends/flex_attention.py", + "sha256": "ad07f0ad73aeeadc3534b3a05c14f88a62cb3638874239ae9823c49b36276dc3" + }, + "vllm/v1/attention/backends/gdn_attn.py": { + "path": "/vllm/v1/attention/backends/gdn_attn.py", + "sha256": "3831019404a92200a38b43571c040cffeb6638bbdc71e4cb5e680dbc6c93d054" + }, + "vllm/v1/attention/backends/hpc_attn.py": { + "path": "/vllm/v1/attention/backends/hpc_attn.py", + "sha256": "af9e2aec1b498f0ee48a2dce3cf5646edf1976466980b2fd927c0e82b875427c" + }, + "vllm/v1/attention/backends/linear_attn.py": { + "path": "/vllm/v1/attention/backends/linear_attn.py", + "sha256": "bc42144fcd027434c6a10dc9f4c5f991db8899d387af5f6485402ce097eb0513" + }, + "vllm/v1/attention/backends/mamba1_attn.py": { + "path": "/vllm/v1/attention/backends/mamba1_attn.py", + "sha256": "32159dae11cab3c8c576b9514ad97d5108c8d1b4cac9fcfe345ec6a76223aee7" + }, + "vllm/v1/attention/backends/mamba2_attn.py": { + "path": "/vllm/v1/attention/backends/mamba2_attn.py", + "sha256": "a5bcdecb7b9547137023e1c77a386003358fa940eaf5f319ed142211dcdba139" + }, + "vllm/v1/attention/backends/mamba_attn.py": { + "path": "/vllm/v1/attention/backends/mamba_attn.py", + "sha256": "5e7b2c4058fc5e6096d001bff6c789b78368b025bbe4600f191aaca2ff59b59f" + }, + "vllm/v1/attention/backends/mla/__init__.py": { + "path": "/vllm/v1/attention/backends/mla/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backends/mla/aiter_triton_mla.py": { + "path": "/vllm/v1/attention/backends/mla/aiter_triton_mla.py", + "sha256": "ed0e285cdae06a019150c41cc958b3c0b5ceb0e4f299d5318d1c90e2c2395390" + }, + "vllm/v1/attention/backends/mla/amx_mla.py": { + "path": "/vllm/v1/attention/backends/mla/amx_mla.py", + "sha256": "7f5cddec30b2dfe22ccdbd3b9da673c879719bf6da4074317bd60add55f5d15f" + }, + "vllm/v1/attention/backends/mla/compressor_utils.py": { + "path": "/vllm/v1/attention/backends/mla/compressor_utils.py", + "sha256": "3589e94105368ea285c40b82db1a0332682ff5d071fe363627cf4c0d10f3facf" + }, + "vllm/v1/attention/backends/mla/cpu_mla.py": { + "path": "/vllm/v1/attention/backends/mla/cpu_mla.py", + "sha256": "ff2110b9f78e92adf6bab294465cbc294ae1ff71cb1780fed158179e134a4ca6" + }, + "vllm/v1/attention/backends/mla/cutlass_mla.py": { + "path": "/vllm/v1/attention/backends/mla/cutlass_mla.py", + "sha256": "211d298680f9bd793cc468281b316d6633c5f4eb6dcec71d3329b034a23ab9b5" + }, + "vllm/v1/attention/backends/mla/flashattn_mla.py": { + "path": "/vllm/v1/attention/backends/mla/flashattn_mla.py", + "sha256": "ac89e0ad75a37e92566d264bafe324735a80f9ab4709241a4454d17b3d38bb63" + }, + "vllm/v1/attention/backends/mla/flashattn_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashattn_mla_sparse.py", + "sha256": "67dd3ead2e8b9d8cda0825ecc93779cb7d670628bc741c759a7d3cd5d474030f" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla.py", + "sha256": "0c24ff016fb6b0bb41d9e7484b6f1af42f37bcc384ed613473fc3e01ad25f664" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse.py", + "sha256": "2116d965b2067134d8afa5878d4d16c0149b061258f50c4106d993aa13b073cc" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm120.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm120.py", + "sha256": "102ca08793d567f95598eefeb34c3f6ec50b3b9d704f162d1402b97b12b5777b" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm90.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm90.py", + "sha256": "df9fe4970aa3f53cf24784b8534b89e0101a2ca20a35a2ebbc9a12a4463d5993" + }, + "vllm/v1/attention/backends/mla/flashmla.py": { + "path": "/vllm/v1/attention/backends/mla/flashmla.py", + "sha256": "c9d8046a853ecbdeff9ebfc738f5bb34c4f272b278231a09a0fbf73708c7c188" + }, + "vllm/v1/attention/backends/mla/flashmla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashmla_sparse.py", + "sha256": "7a379c717adb9667ce94cbc16c0e3a1fb22a169713db6d7941c141fa84077b3f" + }, + "vllm/v1/attention/backends/mla/index_group.py": { + "path": "/vllm/v1/attention/backends/mla/index_group.py", + "sha256": "c24e028c3c160a9bb92e043da5b5b34c805e84745b7c4b8da6fb8702a0ddd641" + }, + "vllm/v1/attention/backends/mla/indexer.py": { + "path": "/vllm/v1/attention/backends/mla/indexer.py", + "sha256": "2acbc1c4fa57c3424ad95e6ecbe76eb7141747773c3e867ce704f4adccba892a" + }, + "vllm/v1/attention/backends/mla/prefill/__init__.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/__init__.py", + "sha256": "903630eb705dd175bf4ae4558a4bcaa07c110056b6a11eb830fdd2fb21b3c48a" + }, + "vllm/v1/attention/backends/mla/prefill/aiter_flash_attn.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/aiter_flash_attn.py", + "sha256": "571b8a9910c4ea3fefda60659026f3bf0d7b542c34553c8c9a4d43bb82077e61" + }, + "vllm/v1/attention/backends/mla/prefill/base.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/base.py", + "sha256": "138bf3ddaf5a94c3cdbc4e08ac676edcae84b32fc76625e546f3b47f7d8b82ec" + }, + "vllm/v1/attention/backends/mla/prefill/cpu_sdpa.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/cpu_sdpa.py", + "sha256": "1bb686395274a8ec0d9fd7327410a527655fe060cbbc263eab138fea988d96de" + }, + "vllm/v1/attention/backends/mla/prefill/flash_attn.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/flash_attn.py", + "sha256": "5e648c82c82e5f81fe11458eb82b9f90b50fc06df2ade3bf111ee6b7a2ee8481" + }, + "vllm/v1/attention/backends/mla/prefill/flashinfer.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/flashinfer.py", + "sha256": "63861219c35b8abc0ebe01e1f51543c5ed40bd46119ca261d927da7c6826b49b" + }, + "vllm/v1/attention/backends/mla/prefill/registry.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/registry.py", + "sha256": "c8c30b92213d594beaa3cab4d5003da26a85870dbb11d1ab73191962d0645b53" + }, + "vllm/v1/attention/backends/mla/prefill/selector.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/selector.py", + "sha256": "101d9fca7924b0c5d7891a17fe8942611bd6759e32b03a571dc87b14c1430f2f" + }, + "vllm/v1/attention/backends/mla/prefill/tokenspeed_mla.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/tokenspeed_mla.py", + "sha256": "047cf07bfcc83db3b11a6a54ffe189f6146e6ec9ad33ce2fa7d18860bf4210f0" + }, + "vllm/v1/attention/backends/mla/prefill/trtllm_ragged.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/trtllm_ragged.py", + "sha256": "9e13ea6f6a25accedd918c0de64bbb812ccb20ffb95350ab018a6e76d493789b" + }, + "vllm/v1/attention/backends/mla/rocm_aiter_mla.py": { + "path": "/vllm/v1/attention/backends/mla/rocm_aiter_mla.py", + "sha256": "b489f5830c655bfb6299801a70d69b9821513c69568ecab3689db5a7be867be5" + }, + "vllm/v1/attention/backends/mla/rocm_aiter_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/rocm_aiter_mla_sparse.py", + "sha256": "91b1d9b3d860a9720bc01b8ebe9bbe8649a7d6bca20d4b63939bc100309bca19" + }, + "vllm/v1/attention/backends/mla/sparse_swa.py": { + "path": "/vllm/v1/attention/backends/mla/sparse_swa.py", + "sha256": "a47853ad8a3fe40f24704592581ea323a18041b84610df010a5534da634e311e" + }, + "vllm/v1/attention/backends/mla/sparse_utils.py": { + "path": "/vllm/v1/attention/backends/mla/sparse_utils.py", + "sha256": "c3cdf060288c05542243a9fe8b5ad3a963ad75e9ce399009b5e45c1235a88ce4" + }, + "vllm/v1/attention/backends/mla/tokenspeed_mla.py": { + "path": "/vllm/v1/attention/backends/mla/tokenspeed_mla.py", + "sha256": "b9ba523c606430cecb99a88b28c53d98a99dcf5e76105a80664338110a20f1ad" + }, + "vllm/v1/attention/backends/mla/triton_mla.py": { + "path": "/vllm/v1/attention/backends/mla/triton_mla.py", + "sha256": "21b16b3b34470edcc33d0423e560837c1d37d4bab31c7b3b9cfd7faa47864b51" + }, + "vllm/v1/attention/backends/mla/xpu_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/xpu_mla_sparse.py", + "sha256": "559c6240fe466521a6b2df4c94aea02ddf3f5efa5ba6954fa180c5a51c0f12d2" + }, + "vllm/v1/attention/backends/recoverssm_metadata.py": { + "path": "/vllm/v1/attention/backends/recoverssm_metadata.py", + "sha256": "02896a667db0f0308371ceb50048b18e5866c0235d163c0357e9a05dcedb3394" + }, + "vllm/v1/attention/backends/registry.py": { + "path": "/vllm/v1/attention/backends/registry.py", + "sha256": "378e8ee78734bd8c8adbe287d4c0a4058dcbb553195a09fbcce00a3cc30adc29" + }, + "vllm/v1/attention/backends/rocm_aiter_fa.py": { + "path": "/vllm/v1/attention/backends/rocm_aiter_fa.py", + "sha256": "d1418af03bf58209c850f466b712d3ea22a14ebb758c42dd43e65738281841fd" + }, + "vllm/v1/attention/backends/rocm_aiter_unified_attn.py": { + "path": "/vllm/v1/attention/backends/rocm_aiter_unified_attn.py", + "sha256": "59d2645eb4c91dc0567754a7163d066f4f2faf48f1957b254fcdd5604e9d8c8c" + }, + "vllm/v1/attention/backends/rocm_attn.py": { + "path": "/vllm/v1/attention/backends/rocm_attn.py", + "sha256": "4a8f57067073fbceb784af6c3467487c450d00fa3957928fadb99a79f6036292" + }, + "vllm/v1/attention/backends/short_conv_attn.py": { + "path": "/vllm/v1/attention/backends/short_conv_attn.py", + "sha256": "84fc460ef2fbd09743b069bec0c14b39542af6c2254a403e37a048427e151121" + }, + "vllm/v1/attention/backends/triton_attn.py": { + "path": "/vllm/v1/attention/backends/triton_attn.py", + "sha256": "1057663d110e1d5229495a799027b27277c1eca325d5b6780fa2259afbf58a1a" + }, + "vllm/v1/attention/backends/triton_attn_diffkv.py": { + "path": "/vllm/v1/attention/backends/triton_attn_diffkv.py", + "sha256": "de0357eae005246642140f1ab8842ba5ed8bff5c84b18a6d3a7bbf409c578301" + }, + "vllm/v1/attention/backends/triton_flash_attn.py": { + "path": "/vllm/v1/attention/backends/triton_flash_attn.py", + "sha256": "176e45329aeb28a2008362bb607d1b8c89816eb665859ab908b0385a11acf1c2" + }, + "vllm/v1/attention/backends/triton_flashinfer.py": { + "path": "/vllm/v1/attention/backends/triton_flashinfer.py", + "sha256": "48d5f967e388d4e8d6bbec8d827b44d855346bc2fada28adf65768bf6623527b" + }, + "vllm/v1/attention/backends/turboquant_attn.py": { + "path": "/vllm/v1/attention/backends/turboquant_attn.py", + "sha256": "616d16d608d9d1fbf6c29548037e7e9cf330f4d36a01aa3ffabf42a731eb6e2b" + }, + "vllm/v1/attention/backends/utils.py": { + "path": "/vllm/v1/attention/backends/utils.py", + "sha256": "fbc221360d2d54cb21ef3f625dc8711500de345a355801548b4337bb9b8abee0" + }, + "vllm/v1/attention/ops/__init__.py": { + "path": "/vllm/v1/attention/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/ops/chunked_prefill_paged_decode.py": { + "path": "/vllm/v1/attention/ops/chunked_prefill_paged_decode.py", + "sha256": "973db848a790b2e8d99e728b2fc4f44b501bbe58c62747244ddff04cfcf11a85" + }, + "vllm/v1/attention/ops/common.py": { + "path": "/vllm/v1/attention/ops/common.py", + "sha256": "b4b67e7fc0cce471e337d742c097fba06da7563816e8799e27719714e31e1d5b" + }, + "vllm/v1/attention/ops/cp_common.py": { + "path": "/vllm/v1/attention/ops/cp_common.py", + "sha256": "2369181862e96db64b14ef20c5c2e249ed2ea5f3dea2467a2aa388372bb86d9d" + }, + "vllm/v1/attention/ops/dcp.py": { + "path": "/vllm/v1/attention/ops/dcp.py", + "sha256": "a478bdc781460f0582cfaf74d6431f1a826c201f02f39d882d12a96139bc3f28" + }, + "vllm/v1/attention/ops/flashmla.py": { + "path": "/vllm/v1/attention/ops/flashmla.py", + "sha256": "8a40d6e120e3ab25a95fcfeb32b0b5b4c1ea02b984633866628536dcd26ed2e8" + }, + "vllm/v1/attention/ops/flydsl_kernels/__init__.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/attention/ops/flydsl_kernels/tq_decode.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/tq_decode.py", + "sha256": "cc4b7f82897596e0974b3d3a710a1a8bc58c3d22b72cc7f461dd1c4acd2e451b" + }, + "vllm/v1/attention/ops/flydsl_kernels/tq_decode_gqa6.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/tq_decode_gqa6.py", + "sha256": "a983f6d375c325900955e11696dab1e2665770e83f84d51f93d3ed5e1d8880e0" + }, + "vllm/v1/attention/ops/flydsl_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/flydsl_turboquant_decode.py", + "sha256": "7b1dd0ef7c7fb28a6a8831759e00b939ab844d067657155cc11cf75532a22c63" + }, + "vllm/v1/attention/ops/int4_per_token_head.py": { + "path": "/vllm/v1/attention/ops/int4_per_token_head.py", + "sha256": "d91968f280cd8eaed7570ab255f0276b40e833e18a25066d371d9ca8149425f2" + }, + "vllm/v1/attention/ops/merge_attn_states.py": { + "path": "/vllm/v1/attention/ops/merge_attn_states.py", + "sha256": "ad08403d2843fc892f0b0b4b9f5fabb81884556f89f7170dca46ccef498a3539" + }, + "vllm/v1/attention/ops/metadata.py": { + "path": "/vllm/v1/attention/ops/metadata.py", + "sha256": "ca882b84c5aaefb1f77e4d8ea09a00103fbc53defa8671bba036c961c17fc760" + }, + "vllm/v1/attention/ops/paged_attn.py": { + "path": "/vllm/v1/attention/ops/paged_attn.py", + "sha256": "016a95f892ec751c86b37be1e12171bad9f0b4076bbf2219ff336f4e9c503653" + }, + "vllm/v1/attention/ops/pcp.py": { + "path": "/vllm/v1/attention/ops/pcp.py", + "sha256": "dadeff95fe2df2be8028baabeef01b0d2d628cd67de2176915e737ce096de3dd" + }, + "vllm/v1/attention/ops/prefix_prefill.py": { + "path": "/vllm/v1/attention/ops/prefix_prefill.py", + "sha256": "b08ad92db715fc03c11699de3de463d55e411f42f77548e06b41049a61de692f" + }, + "vllm/v1/attention/ops/rocm_aiter_mla_merge.py": { + "path": "/vllm/v1/attention/ops/rocm_aiter_mla_merge.py", + "sha256": "564c66e4877732e48a6f7d52405c43dc952eec0f0ae4353d34886bca056132b9" + }, + "vllm/v1/attention/ops/rocm_aiter_mla_sparse.py": { + "path": "/vllm/v1/attention/ops/rocm_aiter_mla_sparse.py", + "sha256": "feec664be5045fd1ba13b8f6ef83b52c96910ddc78baca0431bcf610c9e8f5cc" + }, + "vllm/v1/attention/ops/triton_attention_helpers.py": { + "path": "/vllm/v1/attention/ops/triton_attention_helpers.py", + "sha256": "35aa993d01345f535d2641cf9dcabb8b64c51b20a19707bc5987e616aaa87ddd" + }, + "vllm/v1/attention/ops/triton_decode_attention.py": { + "path": "/vllm/v1/attention/ops/triton_decode_attention.py", + "sha256": "b9823c65eba22d76abf64dad7d7d16a950f67471c86d6cb5b3e983aaf14381ac" + }, + "vllm/v1/attention/ops/triton_merge_attn_states.py": { + "path": "/vllm/v1/attention/ops/triton_merge_attn_states.py", + "sha256": "f63229162181ab93198550b73a115f1cc1034cfd60e6f58bc8ab3e22a6e8ce60" + }, + "vllm/v1/attention/ops/triton_prefill_attention.py": { + "path": "/vllm/v1/attention/ops/triton_prefill_attention.py", + "sha256": "352c1a4ac86146580040579fb217c2e288268830d6602b735713e154f36d74fe" + }, + "vllm/v1/attention/ops/triton_reshape_and_cache_flash.py": { + "path": "/vllm/v1/attention/ops/triton_reshape_and_cache_flash.py", + "sha256": "6cac51475b8c656992a21b2d150acd3a16a95a7ab7d49aab151a3ef13c24b80d" + }, + "vllm/v1/attention/ops/triton_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/triton_turboquant_decode.py", + "sha256": "8e52678136449e4bbca2195fbcbb87426c955a2b1b8422e7ab9511e45ee5f5c6" + }, + "vllm/v1/attention/ops/triton_turboquant_store.py": { + "path": "/vllm/v1/attention/ops/triton_turboquant_store.py", + "sha256": "6e6e2fe74a307d40f0be786ccbaea76d989e3c7b5985f3144a5218c61bf6d902" + }, + "vllm/v1/attention/ops/triton_unified_attention.py": { + "path": "/vllm/v1/attention/ops/triton_unified_attention.py", + "sha256": "65d0fbcf33d00789df8ca688c0a1c908e710cfaef53471178747ecae11f05829" + }, + "vllm/v1/attention/ops/triton_unified_attention_diffkv.py": { + "path": "/vllm/v1/attention/ops/triton_unified_attention_diffkv.py", + "sha256": "7fa36d7b7441f1c396e0348eac61d691d2e459e5c4c393c4aa262dfb670e68f7" + }, + "vllm/v1/attention/ops/turboquant_soa/__init__.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/__init__.py", + "sha256": "6b43b6fcb2a71c44ceff4ed1edd417a839f4901251ba15831b09ad979baa4984" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode.py", + "sha256": "bf00634191bba14cbf4a23c1d67dc3dcb244c2b8989f08362757b54435830986" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode_v2.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode_v2.py", + "sha256": "28e7ecc15c450d3591983a50c46a03aa6ca6fa99304c17c333940617d9916485" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_store.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_store.py", + "sha256": "dccf93b9fdd34f9b9eacd468e9de35b9d93378594487c335cf50642aaec681f2" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_unified_attention.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_unified_attention.py", + "sha256": "b4b2b5f3985b3a6126fd052e6ec1ed91c610da8a525a9ae7470ac829405bd85c" + }, + "vllm/v1/attention/ops/vit_attn_wrappers.py": { + "path": "/vllm/v1/attention/ops/vit_attn_wrappers.py", + "sha256": "a99d57b58269c7521fa5d7d47af06551f3bab2b5c7358ef78165a7f6e20a92a6" + }, + "vllm/v1/attention/ops/xpu_mla_sparse.py": { + "path": "/vllm/v1/attention/ops/xpu_mla_sparse.py", + "sha256": "d98d17110577c2b7b4d05e07bfdae15faf83321b6342a5daaaecce45b9503f38" + }, + "vllm/v1/attention/selector.py": { + "path": "/vllm/v1/attention/selector.py", + "sha256": "87f653ded7974875183c920e3e4589c28116bcbc99714d1da7cb51ae77c0b182" + }, + "vllm/v1/core/sched/__init__.py": { + "path": "/vllm/v1/core/sched/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/core/sched/async_scheduler.py": { + "path": "/vllm/v1/core/sched/async_scheduler.py", + "sha256": "e586a0ef3c6778be56a93e7f9bb712d4de9de6e7d7fe7e3e1d51dae83ecfc508" + }, + "vllm/v1/core/sched/interface.py": { + "path": "/vllm/v1/core/sched/interface.py", + "sha256": "be6c008664096c5660a8879de72b315bbe479bf1d688be9b25891063ec53a367" + }, + "vllm/v1/core/sched/output.py": { + "path": "/vllm/v1/core/sched/output.py", + "sha256": "3a66c8efaefe10c572f6f33cf1f8aa4610758c945130cad62eb9f7331005677c" + }, + "vllm/v1/core/sched/request_queue.py": { + "path": "/vllm/v1/core/sched/request_queue.py", + "sha256": "4b8d938e5fb8152fe61030b8aa991f983fcac9a405c37ed8908045e05e82ae5e" + }, + "vllm/v1/core/sched/scheduler.py": { + "path": "/vllm/v1/core/sched/scheduler.py", + "sha256": "c1db45f3bbad3a875dd8638331b8870c4380ac1ab4734265ba5c863833a82884" + }, + "vllm/v1/core/sched/utils.py": { + "path": "/vllm/v1/core/sched/utils.py", + "sha256": "1ed988044eb8028c77ede875bd1a5fd05ff6998b455d61e3997d6a3d7fc1c3a7" + }, + "vllm/v1/sample/__init__.py": { + "path": "/vllm/v1/sample/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/sample/logits_processor/__init__.py": { + "path": "/vllm/v1/sample/logits_processor/__init__.py", + "sha256": "1f9b02dae8cf6d44484638037123d3a2dec6b7b9a2bcc9afceef1a9bf3eaedec" + }, + "vllm/v1/sample/logits_processor/builtin.py": { + "path": "/vllm/v1/sample/logits_processor/builtin.py", + "sha256": "6105816ece77e5b1dbee0d07abc90ce039d650bac2ddb85c93280c48b00f2ebe" + }, + "vllm/v1/sample/logits_processor/interface.py": { + "path": "/vllm/v1/sample/logits_processor/interface.py", + "sha256": "171dfc6ef9b5b53128e8eaecc4bdf1de413a706d64bf5be686048f583c66eee1" + }, + "vllm/v1/sample/logits_processor/state.py": { + "path": "/vllm/v1/sample/logits_processor/state.py", + "sha256": "a96411f14362c45f839e181dcb3ac01d5b880812bccb3552fc17863b219f44ac" + }, + "vllm/v1/sample/metadata.py": { + "path": "/vllm/v1/sample/metadata.py", + "sha256": "6582cfe1a240c7ddb975f0ef6dd7dcd28dcf0fc7670394390250013977aa7ffd" + }, + "vllm/v1/sample/ops/__init__.py": { + "path": "/vllm/v1/sample/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/sample/ops/bad_words.py": { + "path": "/vllm/v1/sample/ops/bad_words.py", + "sha256": "0b1d0a9b13b92ddcae2c83393c07a34c0f107813725700dee794caa7fe7f3b12" + }, + "vllm/v1/sample/ops/logprobs.py": { + "path": "/vllm/v1/sample/ops/logprobs.py", + "sha256": "b286f69012a6758bfe9250038b0697294dbffe0d32c6906f284c39f75ee48be3" + }, + "vllm/v1/sample/ops/penalties.py": { + "path": "/vllm/v1/sample/ops/penalties.py", + "sha256": "4debfcf247b3887478d2b9ec98f108756bbed2805462777ef6b56f3bdf4ce682" + }, + "vllm/v1/sample/ops/topk_topp_sampler.py": { + "path": "/vllm/v1/sample/ops/topk_topp_sampler.py", + "sha256": "13ea4359832bc914492330958ec4f5ac140f408b8f410cc05c6eaf7ddcd70be4" + }, + "vllm/v1/sample/ops/topk_topp_triton.py": { + "path": "/vllm/v1/sample/ops/topk_topp_triton.py", + "sha256": "0b5fc337058e22bc28a8530ccec904d6ccd89b9548b02955c657ac429b1669d2" + }, + "vllm/v1/sample/rejection_sampler.py": { + "path": "/vllm/v1/sample/rejection_sampler.py", + "sha256": "0bb9d224887ccb1355e16199005cc23a4afc6fa75156eca419851b7247d99750" + }, + "vllm/v1/sample/sampler.py": { + "path": "/vllm/v1/sample/sampler.py", + "sha256": "f95805b2c6d06218c724826aa5f881a606e8d0a534a566aee7c85948520dd216" + }, + "vllm/v1/sample/thinking_budget_state.py": { + "path": "/vllm/v1/sample/thinking_budget_state.py", + "sha256": "962f8f55210eb0a431cb9c78b013e35f7a7dd58d06d6fb2e7fcff1b457356f8e" + }, + "vllm/v1/worker/__init__.py": { + "path": "/vllm/v1/worker/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/block_table.py": { + "path": "/vllm/v1/worker/block_table.py", + "sha256": "a09b8819e1417b7a186cf3472224e2138fc5d41a291c6692bb7df711b0c44259" + }, + "vllm/v1/worker/cp_utils.py": { + "path": "/vllm/v1/worker/cp_utils.py", + "sha256": "e32625d83a641b8dd8df82e92d1b6fb20af0cdf2e8fbd2fb131aa3c215415448" + }, + "vllm/v1/worker/cpu/__init__.py": { + "path": "/vllm/v1/worker/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/cpu/buffer_utils.py": { + "path": "/vllm/v1/worker/cpu/buffer_utils.py", + "sha256": "e7313fd8c2c76ebfb98d2fa53008bc9691d0f83a7d7c05e87602b5a29fb79e04" + }, + "vllm/v1/worker/cpu/model_runner.py": { + "path": "/vllm/v1/worker/cpu/model_runner.py", + "sha256": "24a1c916550051327dd5893243a6d4200f3824b91b3af8aa6f6c793fd7c68c3e" + }, + "vllm/v1/worker/cpu/shm.py": { + "path": "/vllm/v1/worker/cpu/shm.py", + "sha256": "08491af8ad341399d1375f2d21ad00414d4c89b0a5c03f55de8704914bbfcbd9" + }, + "vllm/v1/worker/cpu_model_runner.py": { + "path": "/vllm/v1/worker/cpu_model_runner.py", + "sha256": "92111aba92f00571f1a3c4c6e43cf1da6ccb4d2afac2f4d5abc018a4a6e7e8bd" + }, + "vllm/v1/worker/cpu_worker.py": { + "path": "/vllm/v1/worker/cpu_worker.py", + "sha256": "a8051b9e510ef0af9cc34004f2cbe5c0f902bd0cebc32c9464e744344dfdf849" + }, + "vllm/v1/worker/dp_utils.py": { + "path": "/vllm/v1/worker/dp_utils.py", + "sha256": "8cd19f1bfbc5c4f6ec60df89aea7c8a19b400ebc264f372b103014152e92158c" + }, + "vllm/v1/worker/ec_connector_model_runner_mixin.py": { + "path": "/vllm/v1/worker/ec_connector_model_runner_mixin.py", + "sha256": "fe9b11cebb8562f1bfe98b98a5647b2b081a6e424cb60d4ffe2412c91a99215e" + }, + "vllm/v1/worker/encoder_cudagraph.py": { + "path": "/vllm/v1/worker/encoder_cudagraph.py", + "sha256": "6a08d3779bca1b47dbf9daf6eafe2d3c70dbcb8aeb7d63ba7efacc68241ee3bc" + }, + "vllm/v1/worker/encoder_cudagraph_defs.py": { + "path": "/vllm/v1/worker/encoder_cudagraph_defs.py", + "sha256": "bb7be050fcaa8868e7816c84caec875da57050d65fe7eaf00f3d41473df25e3a" + }, + "vllm/v1/worker/gpu/__init__.py": { + "path": "/vllm/v1/worker/gpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/async_utils.py": { + "path": "/vllm/v1/worker/gpu/async_utils.py", + "sha256": "77e17a4570ead2be30ae9b00888cf077a3b873018c12ca0549b853bfda02c1ba" + }, + "vllm/v1/worker/gpu/attn_utils.py": { + "path": "/vllm/v1/worker/gpu/attn_utils.py", + "sha256": "b9b81e59dda2720b1f9c434471381f879228832443e52756e469b4ad4905888f" + }, + "vllm/v1/worker/gpu/block_table.py": { + "path": "/vllm/v1/worker/gpu/block_table.py", + "sha256": "61c004315d5af7e7eae4e2a9e6be92ea82c520327690a7f55a73bb9ce95f520a" + }, + "vllm/v1/worker/gpu/buffer_utils.py": { + "path": "/vllm/v1/worker/gpu/buffer_utils.py", + "sha256": "6597f701a30261bf250e9ad5a29737264624a1caa20527aeea0dad630325b093" + }, + "vllm/v1/worker/gpu/cp_utils.py": { + "path": "/vllm/v1/worker/gpu/cp_utils.py", + "sha256": "456c1bb7e262d99ff555522a4f134e5a9b42aee23290be25455eaef36ee8eaaf" + }, + "vllm/v1/worker/gpu/cudagraph_utils.py": { + "path": "/vllm/v1/worker/gpu/cudagraph_utils.py", + "sha256": "6e9c042890603535e300a40df8ee159dbed1058a64a83ae50ff0329e332e05ff" + }, + "vllm/v1/worker/gpu/dp_utils.py": { + "path": "/vllm/v1/worker/gpu/dp_utils.py", + "sha256": "e26867bc89e6bfc933cabc5ed13e5dc7b8d2d3030118ca1ca64c8785dabc0fc1" + }, + "vllm/v1/worker/gpu/ec_connector.py": { + "path": "/vllm/v1/worker/gpu/ec_connector.py", + "sha256": "2afe6e641f4ae3eb3b8da336c74eaa7479bf617b27cfb39a1fcbe487686f0a08" + }, + "vllm/v1/worker/gpu/eplb_utils.py": { + "path": "/vllm/v1/worker/gpu/eplb_utils.py", + "sha256": "1829fac11464aed4649179b302df198de51b95d0589f4e56bea305a876a63e26" + }, + "vllm/v1/worker/gpu/input_batch.py": { + "path": "/vllm/v1/worker/gpu/input_batch.py", + "sha256": "d5dd956eb319bd69dd9e762047833d81ad40b21fce619fcb2133759e73620694" + }, + "vllm/v1/worker/gpu/kv_connector.py": { + "path": "/vllm/v1/worker/gpu/kv_connector.py", + "sha256": "b89a4333f1e552d86e1815674b59e9f1335f0f49c0a7b46082439076f62c6a81" + }, + "vllm/v1/worker/gpu/lora_utils.py": { + "path": "/vllm/v1/worker/gpu/lora_utils.py", + "sha256": "1e90eddd9ddb4ca55e574bb28e87ae3a6f6750175a62d373102426543f4ccd66" + }, + "vllm/v1/worker/gpu/metrics/__init__.py": { + "path": "/vllm/v1/worker/gpu/metrics/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/metrics/logits.py": { + "path": "/vllm/v1/worker/gpu/metrics/logits.py", + "sha256": "ea058d7510a077a55f8ac7e4c3d596508346244e908cb372865d7159f62edc89" + }, + "vllm/v1/worker/gpu/mm/__init__.py": { + "path": "/vllm/v1/worker/gpu/mm/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/mm/encoder_cache.py": { + "path": "/vllm/v1/worker/gpu/mm/encoder_cache.py", + "sha256": "89c500338fddbeee7c4fca978a3a7c4c566a03e848e399d303fbee3c80631cd2" + }, + "vllm/v1/worker/gpu/mm/encoder_runner.py": { + "path": "/vllm/v1/worker/gpu/mm/encoder_runner.py", + "sha256": "0981e352d70301b7154a217a48665ffe35f215d053ec5740c2515a3e1e11b4e6" + }, + "vllm/v1/worker/gpu/mm/lora.py": { + "path": "/vllm/v1/worker/gpu/mm/lora.py", + "sha256": "a3eddfad6ad64de276964240c28dc080888df4a56dd5eac18f89428f2cbb7a01" + }, + "vllm/v1/worker/gpu/mm/rope.py": { + "path": "/vllm/v1/worker/gpu/mm/rope.py", + "sha256": "0924375bcb367267e783b57dd2ad9de1189d97025ce4313baaa54f2911eaaf1e" + }, + "vllm/v1/worker/gpu/model_runner.py": { + "path": "/vllm/v1/worker/gpu/model_runner.py", + "sha256": "174c93db921c23cf0396eee4764be25b2bd2d4b6a06e9fa41ce3598b884ce8ce" + }, + "vllm/v1/worker/gpu/model_states/__init__.py": { + "path": "/vllm/v1/worker/gpu/model_states/__init__.py", + "sha256": "07815d0b788fc88185772f581bbf892a675259f9288375571f29887622f8d93c" + }, + "vllm/v1/worker/gpu/model_states/default.py": { + "path": "/vllm/v1/worker/gpu/model_states/default.py", + "sha256": "bb614f814780f052e869f9acf31dfbfa68718ee7dc6252eefa901b5730ee8a2a" + }, + "vllm/v1/worker/gpu/model_states/encoder_decoder.py": { + "path": "/vllm/v1/worker/gpu/model_states/encoder_decoder.py", + "sha256": "a5868059d8af672548b41d0e623e884320e6ed61e6aaca2d2828ff5be0356f2f" + }, + "vllm/v1/worker/gpu/model_states/encoder_only.py": { + "path": "/vllm/v1/worker/gpu/model_states/encoder_only.py", + "sha256": "84e96b55a2639e2a73fa4a0308acc89c8d053dc715481180b237e0196dcef99f" + }, + "vllm/v1/worker/gpu/model_states/interface.py": { + "path": "/vllm/v1/worker/gpu/model_states/interface.py", + "sha256": "5675b6fedc7403a9ab410b1e5565974e78fac23c42ab4253ae1da52d6e09b594" + }, + "vllm/v1/worker/gpu/model_states/mamba_hybrid.py": { + "path": "/vllm/v1/worker/gpu/model_states/mamba_hybrid.py", + "sha256": "573e130ac5587d4822fabf97adad1ad0fda02ff83c5e70df879a5bb175ae845c" + }, + "vllm/v1/worker/gpu/model_states/mm_pruning.py": { + "path": "/vllm/v1/worker/gpu/model_states/mm_pruning.py", + "sha256": "b150940b12ae76048f050a8eeb54d532bbdc530a18ffbf320ddeeb0cfaa90f93" + }, + "vllm/v1/worker/gpu/model_states/prompt_embeds.py": { + "path": "/vllm/v1/worker/gpu/model_states/prompt_embeds.py", + "sha256": "11f9e270925c2df6a505557605ac2b859bb145cf3420b0111e7482a1c544f9b1" + }, + "vllm/v1/worker/gpu/model_states/recoverssm.py": { + "path": "/vllm/v1/worker/gpu/model_states/recoverssm.py", + "sha256": "b4b660e62eaf33f4fe8271f83ed1fb6de6bc08f800a8073b27803e42fb29a645" + }, + "vllm/v1/worker/gpu/pcp_manager.py": { + "path": "/vllm/v1/worker/gpu/pcp_manager.py", + "sha256": "2d80df0ed5b18a2069f9d0689cb59923ffe324ba200fcafe242da23da3a6ddaa" + }, + "vllm/v1/worker/gpu/pool/__init__.py": { + "path": "/vllm/v1/worker/gpu/pool/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/pool/pooling_runner.py": { + "path": "/vllm/v1/worker/gpu/pool/pooling_runner.py", + "sha256": "f8463f7648cce0f3f29418a4d9fee61634ead760957cf236d06d61cf8cd986e7" + }, + "vllm/v1/worker/gpu/pp_utils.py": { + "path": "/vllm/v1/worker/gpu/pp_utils.py", + "sha256": "dadeef0bebf61d0ad44a28d06372208ec4e6389224d6017f412683b026bdbb5c" + }, + "vllm/v1/worker/gpu/sample/__init__.py": { + "path": "/vllm/v1/worker/gpu/sample/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/sample/bad_words.py": { + "path": "/vllm/v1/worker/gpu/sample/bad_words.py", + "sha256": "8d3cbd5613398260314d94739d8ee0e1ac0c22abf2f960f541d3c0d4e39d360b" + }, + "vllm/v1/worker/gpu/sample/batch_shard.py": { + "path": "/vllm/v1/worker/gpu/sample/batch_shard.py", + "sha256": "c30274a3a04e6a03e89be9cd7c62de602b1aba4d412f64540ab6201036de3928" + }, + "vllm/v1/worker/gpu/sample/gumbel.py": { + "path": "/vllm/v1/worker/gpu/sample/gumbel.py", + "sha256": "3ec1df510bdad13e8b0a457b5b67c98affdf6e57369e56cb471246cc8f40dd34" + }, + "vllm/v1/worker/gpu/sample/logit_bias.py": { + "path": "/vllm/v1/worker/gpu/sample/logit_bias.py", + "sha256": "9e80a3fe6f3c7474723408cfff52183f4585fdeedd9c2312843ee98d0b12724c" + }, + "vllm/v1/worker/gpu/sample/logprob.py": { + "path": "/vllm/v1/worker/gpu/sample/logprob.py", + "sha256": "f47479a818192acb6b297c79fa67a3b2f9820e3492a394d5adda777e9b7c832e" + }, + "vllm/v1/worker/gpu/sample/min_p.py": { + "path": "/vllm/v1/worker/gpu/sample/min_p.py", + "sha256": "4cb5e2f45e1ced6f9685283a7a5c8cfd7204d9a249822e866cfff756c7f04f62" + }, + "vllm/v1/worker/gpu/sample/output.py": { + "path": "/vllm/v1/worker/gpu/sample/output.py", + "sha256": "d6e298c0f197d487a8faaf7200f500fa83df1d7a4bbf4339cadd6a18008f7f9c" + }, + "vllm/v1/worker/gpu/sample/penalties.py": { + "path": "/vllm/v1/worker/gpu/sample/penalties.py", + "sha256": "46c29434caf5f415129ef4a9bb2b8d4f62d2765596e3e07f73ad2b198c7def1b" + }, + "vllm/v1/worker/gpu/sample/prompt_logprob.py": { + "path": "/vllm/v1/worker/gpu/sample/prompt_logprob.py", + "sha256": "4cf22d390e7bf59e44c458cff7180268db63e95d06af2f1e14d720a2d77c9663" + }, + "vllm/v1/worker/gpu/sample/sampler.py": { + "path": "/vllm/v1/worker/gpu/sample/sampler.py", + "sha256": "832c9945d201a1e730ff9b4b52076aa83bd4a5064e1e4cfea952cf84d4a8d1f0" + }, + "vllm/v1/worker/gpu/sample/states.py": { + "path": "/vllm/v1/worker/gpu/sample/states.py", + "sha256": "4e3671f93695ba5a48fad7d2d13beb231ac8741034904ed5a15d9f7b9b86662e" + }, + "vllm/v1/worker/gpu/sample/thinking_budget.py": { + "path": "/vllm/v1/worker/gpu/sample/thinking_budget.py", + "sha256": "020513e1d3406f367de6ad995a95055008fd0c28f2873647e8283c9870e22404" + }, + "vllm/v1/worker/gpu/sample/trace_replay.py": { + "path": "/vllm/v1/worker/gpu/sample/trace_replay.py", + "sha256": "d2a7d3b3b55379efabe4740a4b7f14030126dc11be36f6ea974164ce42316a50" + }, + "vllm/v1/worker/gpu/sample/watermark.py": { + "path": "/vllm/v1/worker/gpu/sample/watermark.py", + "sha256": "a3581458169dab9153eb09fd67218e0ee5585406537a9de80ad528ae62b030c0" + }, + "vllm/v1/worker/gpu/shutdown.py": { + "path": "/vllm/v1/worker/gpu/shutdown.py", + "sha256": "bb470f14b17c7e52571ef8938b2a9527e7c2846852ae8a3a94b69cd1c30aa4b1" + }, + "vllm/v1/worker/gpu/spec_decode/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/__init__.py", + "sha256": "1f1f84bfe6f4f5af3a7e21a7a8716ecf7b9013da1d03327668a3ee36afc24c32" + }, + "vllm/v1/worker/gpu/spec_decode/acceptance_estimator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/acceptance_estimator.py", + "sha256": "505b843bdd75928b03793b395b47b8be914bd7fe2a3351c8ec04339baeebb1c2" + }, + "vllm/v1/worker/gpu/spec_decode/adaptive_verification.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/adaptive_verification.py", + "sha256": "276b2fec56758a94c71b717f6786b8a6f126db2e20cf964350202feee61a0a39" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py", + "sha256": "13392ef0a9ed59eb9c2b2bad43d7c61beb212a8805849e46b5130c230275d0a5" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/speculator.py", + "sha256": "5b97f54e20ddf65b98e939832d050745f67ef43cfa145786da300f1a8322e3c6" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/cudagraph.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/cudagraph.py", + "sha256": "beab567ae2df6a2ba2cd92fe7ee452c6b959b8a7037a4b5f493993a1824619bb" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/speculator.py", + "sha256": "f9c100f42f9326e48eb84e89281897e859ba761943f54d593523555ccd98dc63" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/utils.py", + "sha256": "53d2c3ad474d290d2c6df027446bbd80ac7447684e5242ab2c3c5337d2abd383" + }, + "vllm/v1/worker/gpu/spec_decode/dflash2/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash2/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/dflash2/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash2/speculator.py", + "sha256": "b70043550938a1df9aecc85d8c8224c38c929ca34f68834572f6e723854d2027" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/speculator.py", + "sha256": "dcf4abdedbd2bddd0d76be198ccf5b4e467c46f645038c35fcab821491a35b03" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/utils.py", + "sha256": "86af2bf30604a184312e8f076097b91ecfec704f409f9d68d634b03d6b318070" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/eagle3_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/eagle3_utils.py", + "sha256": "201ee875fcc3d076a8fc1f3876dcbf85736b221a368555243a8987ff26a1674e" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/speculator.py", + "sha256": "746e318a4f266d75522ff7f3731ea9b4527b7b4824f71364d1a62184ea1f7b3d" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/utils.py", + "sha256": "94de6f55a1761f24f4aa1388cbc3b3763d4ab3ee53260330056ad31ce0b78236" + }, + "vllm/v1/worker/gpu/spec_decode/extract_hidden_states.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/extract_hidden_states.py", + "sha256": "93c4233be7b2d2290b33902ea9b3bb5274c11701830851d03967a22144536e2d" + }, + "vllm/v1/worker/gpu/spec_decode/gemma4/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/gemma4/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/gemma4/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/gemma4/speculator.py", + "sha256": "9991210d7babd2caf2cd10797ca8688543dedeafbc3b86bc7c979c1a6ae9f949" + }, + "vllm/v1/worker/gpu/spec_decode/mtp/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/mtp/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/mtp/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/mtp/speculator.py", + "sha256": "926d6c9ffdb368c971647911a60493820d056ce236fcae9d94a42fa2e006255d" + }, + "vllm/v1/worker/gpu/spec_decode/multi_module_mtp/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/multi_module_mtp/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/multi_module_mtp/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/multi_module_mtp/speculator.py", + "sha256": "d9d4735b9b33829332b0e845b6d3073b2f0436045ed693b25c6434f351644127" + }, + "vllm/v1/worker/gpu/spec_decode/rejection_sampler.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/rejection_sampler.py", + "sha256": "030db5bfca162cc1f305112f299de5d6d61c59d3ed0807fee46575441ca4086d" + }, + "vllm/v1/worker/gpu/spec_decode/rejection_sampler_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/rejection_sampler_utils.py", + "sha256": "214b61fa0abe88573beb779872c035b3954e5651a85bd438d99ee5905d3a62ec" + }, + "vllm/v1/worker/gpu/spec_decode/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/speculator.py", + "sha256": "3a1ab15bf8b20918852eb835fe9755046e99dcbac6ba6ca3d414949fc8bc695a" + }, + "vllm/v1/worker/gpu/spec_decode/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/utils.py", + "sha256": "282f2929eddae9ca7312269f799be07472334b6df9fd91878b5e839ec05e418c" + }, + "vllm/v1/worker/gpu/states.py": { + "path": "/vllm/v1/worker/gpu/states.py", + "sha256": "99418f5df43ca612ded72609fee011620b065b2cab2f249ccb387096bf4ae71a" + }, + "vllm/v1/worker/gpu/structured_outputs.py": { + "path": "/vllm/v1/worker/gpu/structured_outputs.py", + "sha256": "18a10532db7e66b55e334acacd1fd989ad6361adf31dd0de9a9a65e23db25951" + }, + "vllm/v1/worker/gpu/ubatch_utils.py": { + "path": "/vllm/v1/worker/gpu/ubatch_utils.py", + "sha256": "5092e2e58af0561c8dc12e62847cfc6dda9ca20dfbd33e7f0cd77a83fe87f7c5" + }, + "vllm/v1/worker/gpu/warmup.py": { + "path": "/vllm/v1/worker/gpu/warmup.py", + "sha256": "423ac32d58fe008c228cfa223e4fcebfcf87e3463a9dbdf80a083c0578d73723" + }, + "vllm/v1/worker/gpu_input_batch.py": { + "path": "/vllm/v1/worker/gpu_input_batch.py", + "sha256": "18cf455c9d0eea61cc581c7932f2e6cd09786914e82dd35eef1c1430da359a0f" + }, + "vllm/v1/worker/gpu_model_runner.py": { + "path": "/vllm/v1/worker/gpu_model_runner.py", + "sha256": "87c29d08c0bbf66993d8b984811e7325e35e6436242a773feb55ec88f16b2c51" + }, + "vllm/v1/worker/gpu_ubatch_wrapper.py": { + "path": "/vllm/v1/worker/gpu_ubatch_wrapper.py", + "sha256": "4233cfbe8c9884b042c4363890108f616483b694ebe9a6e69578dcf89c6dac5c" + }, + "vllm/v1/worker/gpu_worker.py": { + "path": "/vllm/v1/worker/gpu_worker.py", + "sha256": "6994436e4547c0996ab555b3e814e8ccea26b650dfc1b378b97d640745309347" + }, + "vllm/v1/worker/kv_connector_model_runner_mixin.py": { + "path": "/vllm/v1/worker/kv_connector_model_runner_mixin.py", + "sha256": "e1cc76d065a7e60aacddb190ae795a480b65cd02ba71a1fc699a02a85c1a3de2" + }, + "vllm/v1/worker/lora_model_runner_mixin.py": { + "path": "/vllm/v1/worker/lora_model_runner_mixin.py", + "sha256": "fef6092a15d8d37f6fa22495e6106e2e5280180908d61ce43d9ff5bf4eef3f2f" + }, + "vllm/v1/worker/mamba_utils.py": { + "path": "/vllm/v1/worker/mamba_utils.py", + "sha256": "23fdaa4e8f63ee8f938eaa1a2b39f803cb04fa6ecd69789563254b1a0691413a" + }, + "vllm/v1/worker/mm_encoder_model_runner.py": { + "path": "/vllm/v1/worker/mm_encoder_model_runner.py", + "sha256": "780c41be84ad022205c21c1decb6bb8d5afb03bc7be120c1f7df03b710acc3d7" + }, + "vllm/v1/worker/sentinel/__init__.py": { + "path": "/vllm/v1/worker/sentinel/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/sentinel/gpu_worker_sentinel.py": { + "path": "/vllm/v1/worker/sentinel/gpu_worker_sentinel.py", + "sha256": "3959b8619d052c5dd247815074e03ec21ec9b43cc424ff2d296abc19b227b852" + }, + "vllm/v1/worker/startup_plan.py": { + "path": "/vllm/v1/worker/startup_plan.py", + "sha256": "84bcbb4f7a9fd7c8d10c9c895aadd9673d44c767b9132368d11eb5e017afe86b" + }, + "vllm/v1/worker/ubatch_utils.py": { + "path": "/vllm/v1/worker/ubatch_utils.py", + "sha256": "b34dce551b5195c414e6a3a997c75961cc7a17f24c7c980487fe3d3e2ba7a798" + }, + "vllm/v1/worker/ubatching.py": { + "path": "/vllm/v1/worker/ubatching.py", + "sha256": "40391241c564feb5f16c77898ae6ae152ed6e71a4682e2a406387785d8de02d7" + }, + "vllm/v1/worker/utils.py": { + "path": "/vllm/v1/worker/utils.py", + "sha256": "0ca3ec6bf4d20076145b7fe64e564962adebedc8f75a856b517ba0b2f2d77acf" + }, + "vllm/v1/worker/worker_base.py": { + "path": "/vllm/v1/worker/worker_base.py", + "sha256": "4a1a5266b912fe97991d8dc89d92b923990da9f6cb4b817d00d52e9c0d26dd7c" + }, + "vllm/v1/worker/workspace.py": { + "path": "/vllm/v1/worker/workspace.py", + "sha256": "d21c08167d1d0d1c0cddaa80453a53a0b4dec5d81b5a537c94a21324344976b3" + }, + "vllm/v1/worker/xpu_model_runner.py": { + "path": "/vllm/v1/worker/xpu_model_runner.py", + "sha256": "07fa0390d28f2b8c3c3c0019eb9c3b126e2397aea268ba47c889f06b423deb23" + }, + "vllm/v1/worker/xpu_worker.py": { + "path": "/vllm/v1/worker/xpu_worker.py", + "sha256": "711b56432506b58041cd86e71320c3960413f7bd61061990b66488421d81cfc3" + } + }, + "prefix": "", + "pth": { + "/__editable__.megatron_core-0.16.0rc0.pth": "d55c9b64480b34aae3d4d31e7706b93391c969dec6e0498e50963b03445a57b0", + "/__editable__.rl_kernel-0.1.0.pth": "1454c4987b35762a0d189d4e901c5d077fde62a1944fbaabecea230e57f3923a", + "/__editable__.vime-0.3.2.pth": "77eec5d06d628cb952e65edd813ca88d8db67ccc785083e1b7b29011b92bec4f", + "/distutils-precedence.pth": "2638ce9e2500e572a5e0de7faed6661eb569d1b696fcba07b0dd223da5f5d224", + "/qwen3_next_cuda_runtime.pth": "e0d3ab57dd3ff4f5d55fcf76e83c549cc00b3c813e6f717c540d5ded79fa2f49", + "/qwen3_next_megatron_source.pth": "8556ac057538e82856cb76cbbc954f58312a3f45373daec3eec826031cfd2709", + "/__editable__.rl_kernel-0.1.0.pth": "1454c4987b35762a0d189d4e901c5d077fde62a1944fbaabecea230e57f3923a", + "/distutils-precedence.pth": "2638ce9e2500e572a5e0de7faed6661eb569d1b696fcba07b0dd223da5f5d224", + "/nvidia_cutlass_dsl_packages.pth": "cc710b99ddb3d76361a70461461d274212a979d00c381d821fce5bb3ad9cf246" + }, + "pyvenv_cfg_sha256": "48579f2c6d35c3d535c2690d7d426587c4b8e92021463f0266b38d35dfbbb834", + "sources": { + "/Megatron-LM-training": { + "patch_sha256": "f66035f12501aa1d08e8884e0dea5a22d59825d717aeda73c3e83876e3efd79f", + "path": "/Megatron-LM-training", + "tree": "731fc44a368d6cac8c6171a29d5c687ff0d95bd1" + }, + "/vime": { + "patch_sha256": "66949839d4c18329444f4f9f6dcd702b53ce1b94e9aa15ed111f28743bfaa4b9", + "path": "/vime", + "tree": "f5174e67dbcdaef983eecd45f215fef2d8429dd0" + } + }, + "version": "3.12.14 | packaged by Anaconda, Inc. | (main, Aug 27 2026, 14:46:43) [GCC 14.3.0]" + }, + "sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca" + }, + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "cuda_identity": { + "home": "", + "nvcc_sha256": "b8e2347d9d7fcadf8812a27324d515de99d033d3e48611811ece7e66d7895f8a" + }, + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "operator_requirements": { + "suite": "all", + "case_ids": [ + "tests/check_qwen3_next_attention.py::test_d256_backward_with_cached_prefix_matches_float64_formula", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[1024]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[256]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[64]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[8]", + "tests/check_qwen3_next_attention.py::test_d256_input_device_guard_and_nondefault_stream", + "tests/check_qwen3_next_attention.py::test_native_backward_rejects_malformed_probability_and_gradient_buffers", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[0]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[2]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_target_inputs_do_not_depend_on_companions", + "tests/check_qwen3_next_batch_invariance.py::test_triton_chunked_prefill_is_batch_invariant", + "tests/check_qwen3_next_conv_bridge.py::test_chunked_and_reordered_sequences_match", + "tests/check_qwen3_next_conv_bridge.py::test_empty_sequence_preserves_cache_and_gradients", + "tests/check_qwen3_next_conv_bridge.py::test_response_gradient_reaches_prompt_and_convolution_weight", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths0]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths1]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths2]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-4]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[1]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[4]", + "tests/check_qwen3_next_core_matrix.py::test_variable_lengths_empty_and_mixed_step_match_independent_sequences", + "tests/check_qwen3_next_forward.py::test_combine_has_fixed_route_order_and_differentiable_weights", + "tests/check_qwen3_next_forward.py::test_full_vocabulary_logprob_entropy_modes_and_gradient", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_fail_closed_on_the_tensor_descriptor_path", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[128]", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[512]", + "tests/check_qwen3_next_forward.py::test_logprob_nan_rejected_before_comparison", + "tests/check_qwen3_next_forward.py::test_moe_vjp_matches_independent_double_formula", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[1024-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[128-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-16]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-256]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-3072]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-37984]", + "tests/check_qwen3_next_forward.py::test_qwen_moe_actual_tp4_shapes_and_independent_training_forward", + "tests/check_qwen3_next_forward.py::test_route_weights_are_batch_invariant", + "tests/check_qwen3_next_forward.py::test_shared_linear_vjp_and_empty_tokens", + "tests/check_qwen3_next_forward.py::test_stable_route_tie_boundary_and_router_gradient", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_backward_matches_recomputed_recurrence_vjp", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_forward_is_provider_exact_and_does_not_mutate_inputs", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_keeps_prompt_state_gradient_through_response", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[False]", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[True]", + "tests/check_qwen3_next_gdn_bridge.py::test_initial_state_vjp_matches_provider_directional_difference", + "tests/check_qwen3_next_gdn_sequence.py::test_1024_token_chunk_continuation_is_bitwise_exact", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad0]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad1]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad2]", + "tests/check_qwen3_next_gdn_sequence.py::test_chunk_boundary_retains_prompt_and_initial_state_gradients", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths0]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths1]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths2]", + "tests/check_qwen3_next_gdn_sequence.py::test_reserved_and_duplicate_slots_are_rejected", + "tests/check_qwen3_next_norm_providers.py::test_custom_op_has_distinct_native_and_cuda_paths", + "tests/check_qwen3_next_norm_providers.py::test_gdn_decode_provider_env_defaults_are_recorded", + "tests/check_qwen3_next_norm_providers.py::test_our_gated_op_is_batch_invariant", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_cuda]", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_native]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots0]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots2]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots3]", + "tests/check_qwen3_next_shared_core.py::test_independent_training_forward_matches_inference_and_retains_gradients", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[1024]", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[8]", + "tests/check_qwen3_next_shared_core.py::test_unimplemented_provider_profile_is_rejected", + "tests/test_qwen3_next_norm.py::test_bad_weight_shape_raises", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[16]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[1]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[2]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[32]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[48]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[64]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[8]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[128]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[2048]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_with_padding", + "tests/test_qwen3_next_norm.py::test_call_matches_forward", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[128]", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[2048]", + "tests/test_qwen3_next_norm.py::test_cuda_default_offset_preserves_plain_convention", + "tests/test_qwen3_next_norm.py::test_cuda_gated_backward_matches_autograd_golden", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_matches_golden_within_contract", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_bad_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_mismatched_gate", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_backward_uses_the_sigmoid_derivative", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_swish_is_an_alias_for_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_unit_weight_is_plain_norm_times_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_weight_offset_is_applied_in_fp32", + "tests/test_qwen3_next_norm.py::test_cuda_gated_wrapper_rejects_equal_numel_wrong_shape", + "tests/test_qwen3_next_norm.py::test_cuda_gated_zero_gate_zeroes_output", + "tests/test_qwen3_next_norm.py::test_cuda_offset_equals_explicit_fp32_weight", + "tests/test_qwen3_next_norm.py::test_cuda_offset_is_not_folded_through_bfloat16", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_backward_is_offset_aware", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_within_tolerance_of_golden", + "tests/test_qwen3_next_norm.py::test_deterministic_repeat", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype0]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype1]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype2]", + "tests/test_qwen3_next_norm.py::test_eps_inside_sqrt", + "tests/test_qwen3_next_norm.py::test_gated_batch_invariance_slice", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedHFOp]", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedOp]", + "tests/test_qwen3_next_norm.py::test_gated_conventions_diverge_in_low_precision", + "tests/test_qwen3_next_norm.py::test_gated_cuda_op_rejects_bad_activation_at_construction", + "tests/test_qwen3_next_norm.py::test_gated_extension_handles_empty_batch_and_nondefault_stream", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[dy_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[gate_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[rstd_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_shape]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_matches_hf_formula_fp32", + "tests/test_qwen3_next_norm.py::test_gated_shape_mismatch_raises", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_strict_matches_vllm_formula_fp32", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[128]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[2048]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_offset_applied_in_fp32_not_folded_into_bf16", + "tests/test_qwen3_next_norm.py::test_op_batch_invariance_on_device", + "tests/test_qwen3_next_norm.py::test_plain_reference_is_unchanged_by_the_offset_plumbing", + "tests/test_qwen3_next_norm.py::test_weight_offset_is_one", + "tests/test_qwen3_next_norm.py::test_zero_centred_cuda_constructor_rejects_missing_extension", + "tests/test_qwen3_next_norm.py::test_zero_centred_op_inherits_the_plain_reference", + "tests/test_qwen3_next_norm.py::test_zero_weight_is_identity_scaling" + ], + "case_ids_sha256": "694c931b65f9cfa5db963f2eca6d11bd309546c824a1df52f9da2ab128e83e0f", + "norm_gates": [ + "qwen3_next_rms_norm-forward.json", + "qwen3_next_rms_norm-gradient.json", + "rms_norm_gated-forward.json", + "rms_norm_gated-gradient.json" + ] + }, + "layer_requirements": { + "schema_version": 1, + "gates": { + "gdn": { + "script": "scripts/qwen3_next_tp_gdn_check.py", + "output_option": "--output", + "scope": "tp4_gdn_layer0", + "groups": { + "cases": [ + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "prompt-gradient", + "replicated-norm-gradient", + "hf-load-export" + ] + }, + "script_sha256": "cc4338893f90af004c51c20fc67d1a9a3f4bf8d26775277f72671c02983e4df5" + }, + "attention": { + "script": "scripts/qwen3_next_tp_attention_check.py", + "output_option": "--output", + "scope": "tp4_full_attention_layer3", + "groups": { + "attention.cases": [ + "hf-load-export", + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "batch4-varlen-reorder", + "sixteen-token-decode", + "prompt-gradient", + "kv-pair-gradient", + "qk-norm-gradient" + ] + }, + "script_sha256": "d27d43efb05415a8ef5892c3c2238a2b9744a4821f5466faf46c6510e6e01bec" + }, + "moe": { + "script": "scripts/qwen3_next_tp_moe_check.py", + "output_option": "--output", + "scope": "tp4_moe_block_layer0", + "groups": { + "moe.cases": [ + "hf-load-export-all512experts", + "routes-replicated-8", + "full-chunk-reorder-8", + "routes-replicated-64", + "full-chunk-reorder-64", + "routes-replicated-256", + "full-chunk-reorder-256", + "routes-replicated-1024", + "full-chunk-reorder-1024", + "training-forward", + "all-parameter-gradient", + "replicated-router-gradient" + ] + }, + "script_sha256": "d5c1bbbb82e408b65871b0cb1638d7a6cf8cfe07f0a3315a657b7dc232d544be" + }, + "adapters": { + "script": "scripts/qwen3_next_adapter_check.py", + "output_option": "--out", + "scope": "gdn_engine_adapter_component", + "groups": { + "cases": [ + "batch1-length8", + "batch1-length64", + "batch1-length256", + "batch1-length1024", + "batch4-length8", + "batch4-length64", + "batch4-length256", + "batch4-length1024", + "mixed-prefill-decode16-reorder" + ] + }, + "fields": { + "prompt_gradient": "passed", + "hf_conv_roundtrip": "passed", + "batch_invariance_capability_registered": false + }, + "script_sha256": "3ce45bb317237c1a06533116d65fb77c2a23b6f503ae46406ede543036eb0f20" + }, + "heads": { + "script": "scripts/qwen3_next_tp_head_check.py", + "output_option": "--output", + "scope": "tp4_embedding_lm_head_only", + "groups": { + "cases": [ + "hf-embedding-roundtrip", + "hf-lm-head-roundtrip", + "replicated-norm-gradient", + "nonzero-finite-embedding-head-gradient", + "embedding-repeat-100", + "batch-invariant-prompt8", + "batch-invariant-prompt64", + "batch-invariant-prompt256", + "batch-invariant-prompt1024", + "logprob-original-and-promoted-logits", + "entropy-interface" + ] + }, + "script_sha256": "0504185d21a75405c8e994bc57b016cf4ec357d8b16e7430772c11934f2af876" + } + }, + "scheduler_case_ids": [ + "p0008-b1-full", + "p0008-b1-chunked", + "p0008-b4-full", + "p0008-b4-chunked", + "p0064-b1-full", + "p0064-b1-chunked", + "p0064-b4-full", + "p0064-b4-chunked", + "p0256-b1-full", + "p0256-b1-chunked", + "p0256-b4-full", + "p0256-b4-chunked", + "p1024-b1-full", + "p1024-b1-chunked", + "p1024-b4-full", + "p1024-b4-chunked" + ], + "registry_sha256": "e3949a750cb27c1897a000f3b023f912629906612ae8949c1575d0acc36df5ec", + "case_ids_per_rank": [ + "adapters/cases/batch1-length1024", + "adapters/cases/batch1-length256", + "adapters/cases/batch1-length64", + "adapters/cases/batch1-length8", + "adapters/cases/batch4-length1024", + "adapters/cases/batch4-length256", + "adapters/cases/batch4-length64", + "adapters/cases/batch4-length8", + "adapters/cases/mixed-prefill-decode16-reorder", + "attention/attention.cases/batch4-varlen-reorder", + "attention/attention.cases/full-chunk-1024", + "attention/attention.cases/full-chunk-256", + "attention/attention.cases/full-chunk-64", + "attention/attention.cases/full-chunk-8", + "attention/attention.cases/hf-load-export", + "attention/attention.cases/kv-pair-gradient", + "attention/attention.cases/prompt-gradient", + "attention/attention.cases/qk-norm-gradient", + "attention/attention.cases/sixteen-token-decode", + "gdn/cases/full-chunk-1024", + "gdn/cases/full-chunk-256", + "gdn/cases/full-chunk-64", + "gdn/cases/full-chunk-8", + "gdn/cases/hf-load-export", + "gdn/cases/prompt-gradient", + "gdn/cases/replicated-norm-gradient", + "heads/cases/batch-invariant-prompt1024", + "heads/cases/batch-invariant-prompt256", + "heads/cases/batch-invariant-prompt64", + "heads/cases/batch-invariant-prompt8", + "heads/cases/embedding-repeat-100", + "heads/cases/entropy-interface", + "heads/cases/hf-embedding-roundtrip", + "heads/cases/hf-lm-head-roundtrip", + "heads/cases/logprob-original-and-promoted-logits", + "heads/cases/nonzero-finite-embedding-head-gradient", + "heads/cases/replicated-norm-gradient", + "moe/moe.cases/all-parameter-gradient", + "moe/moe.cases/full-chunk-reorder-1024", + "moe/moe.cases/full-chunk-reorder-256", + "moe/moe.cases/full-chunk-reorder-64", + "moe/moe.cases/full-chunk-reorder-8", + "moe/moe.cases/hf-load-export-all512experts", + "moe/moe.cases/replicated-router-gradient", + "moe/moe.cases/routes-replicated-1024", + "moe/moe.cases/routes-replicated-256", + "moe/moe.cases/routes-replicated-64", + "moe/moe.cases/routes-replicated-8", + "moe/moe.cases/training-forward" + ], + "case_ids_sha256": "be74417dfbd6031ba27978d06d04bb15daaab2aeb57d132c7e0d41176b28b46e" + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "scheduler_profile_certificate": { + "path": "/result.json", + "sha256": "bf3a74423b3636145cad903d5cf9d70f2c3c777b019a24d125c2ca79f8b1e8d9" + } +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/layers/checkpoint.json b/docs/usage/evidence/qwen3-next-chain-b200/layers/checkpoint.json new file mode 100644 index 000000000..4488f19f1 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/layers/checkpoint.json @@ -0,0 +1,14 @@ +{ + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "shards_verified": 41, + "metadata_sha256": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + } +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/layers/environment.json b/docs/usage/evidence/qwen3-next-chain-b200/layers/environment.json new file mode 100644 index 000000000..35314d506 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/layers/environment.json @@ -0,0 +1,4511 @@ +{ + "environment": { + "identity": { + "base_prefix": "/miniconda3/envs/rlkernel", + "binary": "/python3.12", + "binary_sha256": "6a1eb3ffc29f3a6b0ece607b016b4cfa5ca3ac57b34f17ed3266b404f78d2729", + "build_tools": { + "ninja": { + "path": "/miniconda3/envs/rlkernel/bin/ninja", + "sha256": "08639e194fffa7f08b259fc4abfa4803aff66b64de52549cee42ec527d55cea6" + } + }, + "distributions": [ + { + "direct_url": null, + "metadata_sha256": "6f1038270be40f9b8c0bcf391c627e7d7f41ccdd19aa192d6eac1dbfc3b19abc", + "name": "GitPython", + "version": "3.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "3f71971502087521f123c9daa26bc12d31d3466738b567390b8602acad3be22a", + "name": "Jinja2", + "version": "3.1.6" + }, + { + "direct_url": null, + "metadata_sha256": "818fb343b7b6b99a32771bf4813521ae6440b4c7579b3ae46e32dd02da0afeee", + "name": "Markdown", + "version": "3.11" + }, + { + "direct_url": null, + "metadata_sha256": "dc1ee42cf8ecfeee0ab60b15b21d291833e0732548efcb7bb5b3564dca3e5bf7", + "name": "MarkupSafe", + "version": "3.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "de7389b142450a0014234286b0876f328439b823c355c73d0aed41fd67ec208c", + "name": "PyJWT", + "version": "2.15.1" + }, + { + "direct_url": null, + "metadata_sha256": "ffcad4415cafb22b8b536a61595e9ee13438b51d31b0763c1b273ce3bc58e840", + "name": "PyYAML", + "version": "6.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "8562d701cc52d9cafbb418942b0e072fc087ed8ddcf35cd10224c1b2ed8bdd91", + "name": "Pygments", + "version": "2.21.0" + }, + { + "direct_url": null, + "metadata_sha256": "b6c25fcfdcc495edf248a10ca4ad28327ef2ed6047a6ec5c6346e121414c7f21", + "name": "Werkzeug", + "version": "3.1.9" + }, + { + "direct_url": null, + "metadata_sha256": "55c400d24c71b581d9c0992f71df6047cf6c878bebe61a7d45d6e02dc0e4c510", + "name": "absl-py", + "version": "2.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "13db521f90a6a882027b2388eaa2ebf252945f9c2adb7e7e371da18239da4df0", + "name": "accelerate", + "version": "1.15.0" + }, + { + "direct_url": null, + "metadata_sha256": "86fe44e38e67872dd895c729044942ba2c2f934ae439a899fb83a186206b7fd4", + "name": "agent-detector", + "version": "2.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "afe11fe9f5aa54e734cdd51659bed8c89dc6bcd5aef0ad96f2d20149c8de5456", + "name": "aiohappyeyeballs", + "version": "2.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "570b307bc0b53fbbd3ed2ce0b7eca6bbf2fa73bf75e24a480f1034d8c0b832bf", + "name": "aiohttp", + "version": "3.14.3" + }, + { + "direct_url": null, + "metadata_sha256": "44b7f8e14c4770793e747fad50c9e0a6ee7357651d878554f192d94768dc14a8", + "name": "aiohttp-cors", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "648813a44a9ae0ab2f20ee86d2404dcc38e3f9e80c63316cf6e536735df14e54", + "name": "aiosignal", + "version": "1.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "f6a3f6668bacef7f73a2c19ccb2be910b2363d1731c4725cb04364d99e24935a", + "name": "annotated-doc", + "version": "0.0.5" + }, + { + "direct_url": null, + "metadata_sha256": "fc6d752cde6a6a4bff03474386de750e130b75da3c7815ee909f45b51fea98c8", + "name": "annotated-types", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "4e89d670a4b20029da30e5a9e8ebcbc844deff9c44209552bafd5537249c8b9e", + "name": "anthropic", + "version": "1.9.0" + }, + { + "direct_url": null, + "metadata_sha256": "b5a6f00800956387fcddab1fe1b5aa8502c249b86cfb16d58ed700f282f60142", + "name": "antlr4-python3-runtime", + "version": "4.9.3" + }, + { + "direct_url": null, + "metadata_sha256": "a6008defa9492cd08250217b134782cad1db4580e1d7ddf69cc2a2a48cea24e0", + "name": "anyio", + "version": "4.15.1" + }, + { + "direct_url": null, + "metadata_sha256": "7877c64ce8957237363f2df313819bb07f50752df016d14c5a5a99bec10f5deb", + "name": "apache-tvm-ffi", + "version": "0.1.11" + }, + { + "direct_url": null, + "metadata_sha256": "3543ca8f0e072c00ab111b20eba99ce86dbf93ada28988775bc2677284b3c07a", + "name": "astor", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "d4b328c09c024fe1e4d788a9c7715ad726095131b815cd35fd933268226f6269", + "name": "attrs", + "version": "26.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "4850c4d696a5e2a2ecbb3dd792b060acc1de79e09800669b0b9fc3a22c055e6d", + "name": "av", + "version": "19.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "863ff92208d0a02dabfa008bfe91846a5c401ded301e5687dca7dc63c911865f", + "name": "babel", + "version": "2.18.0" + }, + { + "direct_url": null, + "metadata_sha256": "f32e6df3197f05202e586624d95c5e217003d80cee655c165d533102f628df21", + "name": "backrefs", + "version": "8.0" + }, + { + "direct_url": null, + "metadata_sha256": "905c362f655fbc6d37a24686efc2b3bfbd3123b8ee5a443a43f6750d87455e90", + "name": "blake3", + "version": "1.0.10" + }, + { + "direct_url": null, + "metadata_sha256": "07c85682b6aefd5c9b48890d306c1604311902295704892ede48e5a83219a8d3", + "name": "blobfile", + "version": "3.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "2d582941a7081625a35f35a0c4a2e80f7737312e29c38e5fdb6fc08f9c113077", + "name": "bracex", + "version": "3.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "3b60c55bae0d0340c3a3fd918635bbfa3087579da66e0fd7f6be7a3782c0da3d", + "name": "cachetools", + "version": "7.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "5d11a6878d5bc3f22290281a19ef7b36daa95c910780950608b95cd788c7e12e", + "name": "cbor2", + "version": "6.1.4" + }, + { + "direct_url": null, + "metadata_sha256": "362c9942c48051f168ed2b9f2146266b7792d3c05e164cd6afc3f3b65884fdc9", + "name": "certifi", + "version": "2026.7.22" + }, + { + "direct_url": null, + "metadata_sha256": "b4abf1bcf1c1d8e0272d8007fc974499ea59e5f2a5b98af3c78a5e67515a9d87", + "name": "cffi", + "version": "2.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "766120f13c177446f51929a4d201104bc935b6d5a2a176cd6716edce757d3d95", + "name": "cfgv", + "version": "3.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "610e9a9d03ce837ffe6e42be5e02e70087f73863f7350bf7bb7f0511edcc5ec0", + "name": "charset-normalizer", + "version": "3.5.2" + }, + { + "direct_url": null, + "metadata_sha256": "7ad836b3147c9702546d9c28b4fa5be23b24445439db5d0d2a58d17281c84daa", + "name": "click", + "version": "8.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "4c5f00599ebcbf11d337e48a72784d256ca3d704fa9e9f5daadd60065e6776b7", + "name": "cloudpickle", + "version": "3.1.2" + }, + { + "direct_url": null, + "metadata_sha256": "a0970189e3ab7a596d6902d5f61f93b414f138f03d3cf19029145657bfceb382", + "name": "cmake", + "version": "4.1.2" + }, + { + "direct_url": null, + "metadata_sha256": "94a6ebf9718e55f254a43ce0d2f04e0d6d44e7141b6f3144a84feb6519a77bfd", + "name": "colorama", + "version": "0.4.6" + }, + { + "direct_url": null, + "metadata_sha256": "ca8ec227f406d970a645ec482b20619128dd34b9cf71159cc24e27db461a2711", + "name": "colorful", + "version": "0.5.8" + }, + { + "direct_url": null, + "metadata_sha256": "bbaa51b7e4d8f142bd075d01257c0572c0c844796d51426e35c8096a13e8da76", + "name": "compressed-tensors", + "version": "0.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "6063d8ff7ebc458d63a4332853d7ababf4ee2b86336362c8d2b12be6e998eb6b", + "name": "connectrpc", + "version": "0.11.1" + }, + { + "direct_url": null, + "metadata_sha256": "ac5f4b5a5f68080bd9c3fe77399fe8a1bff2ee5923c49db1df544dd054cbf15b", + "name": "cryptography", + "version": "50.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "f41d2f6b4616accca2f5e1dd47aa9e8937c28076cde698226d93e727751f3099", + "name": "cuda-bindings", + "version": "13.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "e5ca6ed34c687c6f4a4d157ad0a2cf06ec0316fe8c4c0ddeb666ad76dd6f30f4", + "name": "cuda-core", + "version": "1.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "89baadd9da23dce9990481519544115615ba3cbd2d1a41e09feea7756fffb378", + "name": "cuda-pathfinder", + "version": "1.8.2" + }, + { + "direct_url": null, + "metadata_sha256": "1ab914b9a57ca601df2e3cfe9608427b15d8afb78029076ace5d1caf9fd45f08", + "name": "cuda-python", + "version": "13.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "73d97a5eb578223b4895ef4f234574d14219cef9999ff7d0e92a3d0dd057bd3f", + "name": "cuda-tile", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "ae6f957fe66ed63081d1d83ee6e8838f3a0af2c6fce1223629d0dd6264565ead", + "name": "cuda-toolkit", + "version": "13.0.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "1f8e0ae51ad5feea63f58ed2e24f3da6f23ed548043235a14f7623d961dd9b64", + "name": "datasets", + "version": "5.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "153f4a4d6ff03dbe5c8ad7fe54bc2e7b989a4947b70f7aa77fbf652b394f2a2e", + "name": "depyf", + "version": "0.20.0" + }, + { + "direct_url": null, + "metadata_sha256": "ee09fc752d7271aac93079cfd63409957dc6b536c1ffd9355a01bf7297e72aa6", + "name": "detect-installer", + "version": "0.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "a7feab2c4f69fd5f85e5a3cb495a7f1870a6bf8199dcee5339e8118f7acbdc09", + "name": "dill", + "version": "0.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "fef3fde661fe30ba7bd1d78841a797136b2b3461705bb4eb92dc54f8308bbaae", + "name": "distlib", + "version": "0.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "fef3fde661fe30ba7bd1d78841a797136b2b3461705bb4eb92dc54f8308bbaae", + "name": "distlib", + "version": "0.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "a3ca2e39abe76c4a33d5fe4a2a84375ec9f25cdfdb7e1d8ea406bd6f1603205c", + "name": "dnspython", + "version": "2.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "92a07daad5e6ff461199de14e845d9b376e309ef916ce5379f3c9cd4e3b1623f", + "name": "dockerfile-parse", + "version": "2.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "5b566b25f0cbe4955d0b16844a7cc6d2002caa3bde2dfda7f301fd8870cbaa56", + "name": "docstring_parser", + "version": "0.18.0" + }, + { + "direct_url": null, + "metadata_sha256": "5a1080b5768c6c591e1c4f9c9812cafa808781b9eeb198043bf185e22d4a1613", + "name": "e2b", + "version": "2.51.0" + }, + { + "direct_url": null, + "metadata_sha256": "0a63979e0b946e16238e4339e60d9c1eb5a7ce3ea93dae78b5da9c65a6190540", + "name": "einops", + "version": "0.8.2" + }, + { + "direct_url": null, + "metadata_sha256": "16cbe67a57558f1d4bfdbc22a454434ba301750c57a62b1d3f5361c9e5cddc00", + "name": "email-validator", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "0617ddb55b90b42ddc9398dc7e91d61fe928a2504939f76526dc15b22d238caa", + "name": "fastapi", + "version": "0.136.3" + }, + { + "direct_url": null, + "metadata_sha256": "ddd82b9666c21988e234d623e2575e1b89fd4133260eeab43fc9a7c074f7024a", + "name": "fastapi-cli", + "version": "0.0.32" + }, + { + "direct_url": null, + "metadata_sha256": "611602e834d42e10433155ff5f5581358d732fa6b6f6f7820a8f79e74b1ce1f9", + "name": "fastapi-cloud-cli", + "version": "0.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "794524e4a9659bda6043721d848d028ea49996085a33326094fbaaa3f6e6b895", + "name": "fastar", + "version": "0.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "711401d36e60e10e35beb4d0f1bb42bf0c4d86339ae52f32b9aa4a4d790530dd", + "name": "fastsafetensors", + "version": "0.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "efaea9742e348c4c4bdcc6f616a33cc5aa3ae926494a72a46690b7da2f08ed5c", + "name": "filelock", + "version": "4.0.7" + }, + { + "direct_url": null, + "metadata_sha256": "99bd6c3f10781d3d2d350f2c3c9fc4765b55f25de8a6d6dd1f71501802d1255e", + "name": "fla-core", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "0a6ef979b75295cee2b5293ad4942b0cf2682e9e38680203064e0b70249c1a96", + "name": "flash-linear-attention", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "76b70a11ca82ea4606b529e7a8658cb3fe71412afa46f2ed57101dd91ba27558", + "name": "flashinfer-python", + "version": "0.6.18.post1" + }, + { + "direct_url": null, + "metadata_sha256": "ba8ff415192b5cbb90efce046e2271a00c8184afc362d8b47fbbc84d5e558b05", + "name": "frozenlist", + "version": "1.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "e7712831c80eb13b08fb7f7cc33988a8f24654af9eba7c6f5f943b2636e4306a", + "name": "fsspec", + "version": "2026.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "025de85c794878d0caa737869307447595f514ebf9599eacb5b1a501bae479b6", + "name": "fsspec", + "version": "2026.9.0" + }, + { + "direct_url": null, + "metadata_sha256": "ca94883bdeaa3740b45b6994443b445fd67c6e4a8064ac3bf9d92d2a5221eee8", + "name": "ghp-import", + "version": "2.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "a7e90983562a035cf767baa63d8c32bc37e1de7cad71ac7b6b2bc70a95bba4eb", + "name": "gitdb", + "version": "4.0.12" + }, + { + "direct_url": null, + "metadata_sha256": "dd96143ec79178bef685c1f5c0a58a87a66d003b421e605de65697308321d518", + "name": "google-api-core", + "version": "2.40.0" + }, + { + "direct_url": null, + "metadata_sha256": "0735d57088a83df2355e16843107fb0112abe2178fc5bb8132947a7ad962aa41", + "name": "google-auth", + "version": "2.59.1" + }, + { + "direct_url": null, + "metadata_sha256": "2f3aa9d9500d329560440e6a5a152e420aad5f5bbb23701f45b740be721784a1", + "name": "googleapis-common-protos", + "version": "1.75.5" + }, + { + "direct_url": null, + "metadata_sha256": "06d74ab04fdc03fad368868907f0d10e7d9f397aab58d58965c0b78ffaec34cc", + "name": "griffelib", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "7ee1c179e2c68a62968308b2f96f4f3469176ee3ac8bdb494ac80188d4d41271", + "name": "grpcio", + "version": "1.84.0" + }, + { + "direct_url": null, + "metadata_sha256": "04cf3a4a91575850f386f4fcfdedd8e7fbfba08feff038fbc1296d1e854db2dd", + "name": "h11", + "version": "0.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "b954a6ba4739c0cc878bb8ea27ea7c7154a48bb4b7c06dba9e9cf880cf0ec930", + "name": "h2", + "version": "4.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "6f0d7bf86e75d0bda1ceccc82367c0145ad0ec522c4d4f51bb454f467faadcc9", + "name": "hf-xet", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "f991b847550cf8225f69562902b5ccb591b2ce9a08fe07ef6e6d701bdb4694a7", + "name": "hpack", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "314d194165c4700034c1c67cee847d549a6d7091374c71f2cef0186ec56a3eb9", + "name": "httpcore", + "version": "1.0.9" + }, + { + "direct_url": null, + "metadata_sha256": "aed9767360bed1bcbda71e3b1a3c996603f86558bc77a1693ee3d09973d20cad", + "name": "httpcore2", + "version": "2.13.1" + }, + { + "direct_url": null, + "metadata_sha256": "8fa3bf3510c35e2eea9f523a1cace7120079cf51d76c4acea97de95806aaa14a", + "name": "httptools", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "3bf4804c215d111b6a4702cf9000021ab39807d1ed3207dd011b14b2843b2d14", + "name": "httpx", + "version": "0.28.1" + }, + { + "direct_url": null, + "metadata_sha256": "d11dd50813b8914bd9455e8b2b591171cd2b1618883943153afadc8bb9224678", + "name": "httpx2", + "version": "2.13.1" + }, + { + "direct_url": null, + "metadata_sha256": "43b119c34ad2b2aacc032a1a6a8feb142fdb5ca407a3519325d74dd53d8904df", + "name": "huggingface_hub", + "version": "1.33.0" + }, + { + "direct_url": null, + "metadata_sha256": "9ce850d5a6b775e5ef4a335f907e579a878e058213121b6eec567781ea68c585", + "name": "humming-kernels", + "version": "0.1.12" + }, + { + "direct_url": null, + "metadata_sha256": "67aa4f6717d82446a51ce350e7c4769eba0c4a22d2f428255cddd9d24b11a914", + "name": "hyperframe", + "version": "6.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd9511ede42f63b995c3f71944f908cb8f014048b63ecc1c8d420525a3354b59", + "name": "identify", + "version": "2.6.20" + }, + { + "direct_url": null, + "metadata_sha256": "af3c3a62bb5d82d6a43454684e0b1dedde27a21ea90eacfb1bed9814619f06d0", + "name": "idna", + "version": "3.20" + }, + { + "direct_url": null, + "metadata_sha256": "cf71393f3d079ce2e859384573e65aaacd1709bef700701f629df32398b598f0", + "name": "ijson", + "version": "3.5.1" + }, + { + "direct_url": null, + "metadata_sha256": "9305763e93d03df0e36516b1125fa046a6ebe37d44589e200e0593cf4bdfd980", + "name": "importlib_metadata", + "version": "9.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "32860c3c19b2e91f6cb5bd83400b5870cda051bc74a5a08822c8c666af0990db", + "name": "iniconfig", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "560faabb3d45d779e445a74e7e806a786f95f2200fa06d979603b7f0ee1cfb39", + "name": "instanttensor", + "version": "0.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "f6fc1f0d389e4245fc2a1a0fdfee09422e56200cb6f94659668456997ff4f7a9", + "name": "interegular", + "version": "0.3.3" + }, + { + "direct_url": null, + "metadata_sha256": "d10f300731197a4829b77f0c883bb3cf8a37ae8c76a302e095fa95d6427706d0", + "name": "jiter", + "version": "0.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "5b0c8d4b4c535a2432fb206223d774509b6e20af374c6a4b6f98bf72a7de6702", + "name": "jmespath", + "version": "1.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "6c4032c2e74273452cd77399af2ee85198f49c22da897983f26d2ed6f787c4e8", + "name": "jsonschema", + "version": "4.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "aaa6cd66f423729e8da397c9d533b7d731f6b25f3d6371b9338c36bdb9be74a0", + "name": "jsonschema-specifications", + "version": "2025.9.1" + }, + { + "direct_url": null, + "metadata_sha256": "f7c0687c032593106a2e5a3c241cf8043e7e2c222bddb0022b4cb2bf5de67115", + "name": "lark", + "version": "1.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "4511c6b04efc57a5f5333edc1f5f48b9f5412c3923d4bc19b715bdf47977511c", + "name": "linkify-it-py", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "be929870f6ecae18a819c56118f1101f3076e25ac6a4843ca6f4707ebd1e87c6", + "name": "llguidance", + "version": "1.7.6" + }, + { + "direct_url": null, + "metadata_sha256": "cf2b87669bead3e76ec54207f3354c13f73b50c32fcd13c8d627084b3379139e", + "name": "llvmlite", + "version": "0.47.0" + }, + { + "direct_url": null, + "metadata_sha256": "0a416d79c5543d94d2b18807626293d4f47655d1d22724c7ae296e413078aaba", + "name": "lm-format-enforcer", + "version": "0.11.3" + }, + { + "direct_url": null, + "metadata_sha256": "16bc1f59e34fd2a6633bd395276052eacd2c777b2cf72781e76b203f013a8fac", + "name": "loguru", + "version": "0.7.3" + }, + { + "direct_url": null, + "metadata_sha256": "5216d5acfd039a7b581a826186309594b228d37d2c8d56864124ea666689fe4e", + "name": "lxml", + "version": "6.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "f59d772b35315a928672bfcccfb89d82c0aac672c5275c048f7a93b79015bcea", + "name": "markdown-it-py", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "b137367ef0056711cbf5e53015df9168cab80373104e7899b1c0263a21d9c99c", + "name": "mcp", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "38e0b9edaae09e58cd1461fc961ced22672038a697930bedef153a74befb3de1", + "name": "mcp-types", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "799f49685865fd9cc8915fdb92a33e102eeeffad562b03b4aeffb6f422b771c1", + "name": "mdit-py-plugins", + "version": "0.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "481f9cbe08596c6eaba6343e0efa1b13b2362c30dce0610f7c08523f1d98388d", + "name": "mdurl", + "version": "0.1.2" + }, + { + "direct_url": "{\"dir_info\": {\"editable\": true}, \"url\": \"file:///Megatron-LM-training\"}", + "metadata_sha256": "2876c0c760bbfc93bd7d737bf0db2866a937308a7c1707c3a2bb59d4795986ff", + "name": "megatron-core", + "version": "0.16.0rc0" + }, + { + "direct_url": null, + "metadata_sha256": "a6e34d488c879f57ce042bec38f8864ba3ea7d6ecf0ab757fc88fe8dc0a22f26", + "name": "memray", + "version": "1.20.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd26d80dc9676b1fb8c894355bd525fbe7f49a6a86a555c72e9ec6d927247c33", + "name": "mergedeep", + "version": "1.3.4" + }, + { + "direct_url": null, + "metadata_sha256": "dd1b3b89e88d1c65a26e6e72dd075eabbc220bfb138769ec8b64578ee911795c", + "name": "mistral_common", + "version": "1.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "4859847a9f6321daf8849cf7fd1542ff430db6563a2abf9ac0d62a5b21bd951d", + "name": "mkdocs", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "1729fc31479f2582486cdc85397417659dd3b2fb3f920553de66cfe59d5f0b3e", + "name": "mkdocs-awesome-nav", + "version": "3.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "88b4b7b7c0aba5547befdedaf515c8df4867361daf55ff60b72578464d72dcbe", + "name": "mkdocs-get-deps", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "ad33bb33fb16b1f69689c4682550e97232154e367e2c8c8aee9dad0f10d269ce", + "name": "mkdocs-git-revision-date-localized-plugin", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "ed69fbfb9ac00c10c5a383a12ff9d2b9919ae184e408554434199211643d6040", + "name": "mkdocs-material", + "version": "9.7.7" + }, + { + "direct_url": null, + "metadata_sha256": "d1c549b61701148b97f8246bc924b2840e504b37b0ce7a27e78ddf81261e5363", + "name": "mkdocs-material-extensions", + "version": "1.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "4ad6171f3bf6812e4de90670ff0089d445093d4fe1d05d55f17b96a4a192a816", + "name": "ml_dtypes", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "4ad6171f3bf6812e4de90670ff0089d445093d4fe1d05d55f17b96a4a192a816", + "name": "ml_dtypes", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "b0dbdfa30ab6b1ce637a794899c9e43019182b6d1ab2d07b90f647f7331eba6b", + "name": "model-hosting-container-standards", + "version": "0.1.16" + }, + { + "direct_url": null, + "metadata_sha256": "95424470e481cfa8d18b30963b6de3aafe16614b1ea0414e184a008571dde84f", + "name": "mpmath", + "version": "1.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "eb184d83489401903615ce8a78d98d5b933dec0f7246811d396a529915fe797c", + "name": "msgpack", + "version": "1.2.3" + }, + { + "direct_url": null, + "metadata_sha256": "520006303d6a0e859970b83f7d452196e2e8f6dab08f6dcf1ba5823c1230025f", + "name": "msgspec", + "version": "0.22.0" + }, + { + "direct_url": null, + "metadata_sha256": "010d2fe039006070a711a476b171b7b7da5c29ccad3c4eecd77ef3711b07c2d0", + "name": "multidict", + "version": "6.9.1" + }, + { + "direct_url": null, + "metadata_sha256": "235634cc7ebda45f8a84dfdb1b9b35ac1a77a1888b34650c3a616d23e4a7e93f", + "name": "multiprocess", + "version": "0.70.19" + }, + { + "direct_url": null, + "metadata_sha256": "7c545b4b3e5e83d3fde41352272c10cb9deeaba5b7138fbf24383e952af8822e", + "name": "natsort", + "version": "8.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "311ee8cdaeaf9f11acf51cda9c3b5b191f76ce9d98bc3418164c3189bbc37a08", + "name": "nccl4py", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "66360539217852c3b44b37f409eade7e1559baf018bb363bacb2aa3a9759b203", + "name": "networkx", + "version": "3.7" + }, + { + "direct_url": null, + "metadata_sha256": "e8b0b1746808b87816c47e4531780ded7f246bed9575a89e8b40200aa81e9a13", + "name": "ninja", + "version": "1.13.2" + }, + { + "direct_url": null, + "metadata_sha256": "77c1117f0dbc41560ddc6e6b37b542fb4e88afcd4ef82ec06593e5bbd5f37121", + "name": "nodeenv", + "version": "1.11.0" + }, + { + "direct_url": null, + "metadata_sha256": "9af629898406c9eaa69897fe09220dc483270cdba89f6b20bf0165cdf0e1668e", + "name": "numba", + "version": "0.65.0" + }, + { + "direct_url": null, + "metadata_sha256": "0c7281a81cf76e40b27c1385ffd8a215d7227adc219f177ce807ead9e91994a5", + "name": "numpy", + "version": "2.3.5" + }, + { + "direct_url": null, + "metadata_sha256": "0c7281a81cf76e40b27c1385ffd8a215d7227adc219f177ce807ead9e91994a5", + "name": "numpy", + "version": "2.3.5" + }, + { + "direct_url": null, + "metadata_sha256": "bab990ced4537ce74ef5961ca933c4c6fd604fd09a5827a4a428c55bcb0be35b", + "name": "nvdlfw_inspect", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "10f6595146332d35f7f15a000e08b5c81432528c5d026470c1d03f0c1399fb70", + "name": "nvidia-cublas", + "version": "13.1.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "58e933b4ac8e49f098b16ab7480d03bd792afc3d1db10d0aacbdcc2c62e48fa3", + "name": "nvidia-cuda-cccl", + "version": "13.3.4.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "baac937970681d41aa0c3708b3d55d73f8d29e70aceaac0e71fe6d1548e94a09", + "name": "nvidia-cuda-crt", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "8d51e5c76ef5707b0b80d5ec9a791c0f11a480ab721820cf100a3cc566017eef", + "name": "nvidia-cuda-cupti", + "version": "13.0.85" + }, + { + "direct_url": null, + "metadata_sha256": "724bf56e61ddef5d4c2482ff64103a973b911b110b668acaea5373f6c83c1c5c", + "name": "nvidia-cuda-nvcc", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "c54801dbd815d534519a761f1f328325aa0f1d1f1659aa969fa74e7a2c76eee9", + "name": "nvidia-cuda-nvdisasm", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "af51f248363020b9fdfd2743704e901bf3d19a1a1ce1fe44fb98ba148bfc0157", + "name": "nvidia-cuda-nvrtc", + "version": "13.0.88" + }, + { + "direct_url": null, + "metadata_sha256": "055f7fc69a5a2159de82cd0718da02c8852e81c8a71ebb117b8e799badd7167e", + "name": "nvidia-cuda-runtime", + "version": "13.0.96" + }, + { + "direct_url": null, + "metadata_sha256": "df18686dbdb3074ca375a1d6c623a04102fd348950c67a721397349c6d4f0477", + "name": "nvidia-cudnn-cu13", + "version": "9.20.0.48" + }, + { + "direct_url": null, + "metadata_sha256": "abd0ca3f67af19a4d383ff2a012ae0090d4731c6492fd47236615308a50b3981", + "name": "nvidia-cudnn-frontend", + "version": "1.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "4a78545d424d0c5038353f7046a8ae40ceaf312045d71399eac9511f5fc15434", + "name": "nvidia-cufft", + "version": "12.0.0.61" + }, + { + "direct_url": null, + "metadata_sha256": "e49b909195c03ddbe203729d9b31dd88e3f207368333d1909c67c6b130a0c696", + "name": "nvidia-cufile", + "version": "1.15.1.6" + }, + { + "direct_url": null, + "metadata_sha256": "bb15a754c6be32c23aaac13c1cfa7a8ce53d92bc26652ec3b609f7a5cce3e7d1", + "name": "nvidia-curand", + "version": "10.4.0.35" + }, + { + "direct_url": null, + "metadata_sha256": "0dd58f677811eac04901a793740932e5a2a8fff2f5453aa6351614eb18391bb6", + "name": "nvidia-cusolver", + "version": "12.0.4.66" + }, + { + "direct_url": null, + "metadata_sha256": "8aeb284782ef6883095a5d1c110e221cad023a99afcfd5cdb4969a25e146d562", + "name": "nvidia-cusparse", + "version": "12.6.3.3" + }, + { + "direct_url": null, + "metadata_sha256": "09555246122896eaca3b8313eecfca4b339fefd3b597874cb9fe3bf29dab38c9", + "name": "nvidia-cusparselt-cu13", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "ac77bac79fbfb0c52ac6e2e5abc936b1e127be2192f0cbc27b00be3125fa86ae", + "name": "nvidia-cutlass-dsl", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "1ec968ec7c4083f7fe4e1fb8384c7e9b853a81491fef9f4cb1cf755961aaedf6", + "name": "nvidia-cutlass-dsl-libs-base", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "cc6f3846cd820013eaa6e2665c493d70c607be6ce7349b939eb4742888470585", + "name": "nvidia-cutlass-dsl-libs-core", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "2357d0df2d0d17c0b16663b8a89df53f751b19721f66821fd88fa78112c08e55", + "name": "nvidia-cutlass-dsl-libs-cu12", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "244590c25662dcf777b1daae97a858afe1a1aec62e5e6678b217007a459ab552", + "name": "nvidia-cutlass-dsl-libs-cu13", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "c3a25ada01f57418c1b897406c3abab18834e6adc573ab7b060620c453afb6db", + "name": "nvidia-ml-py", + "version": "13.615.71" + }, + { + "direct_url": null, + "metadata_sha256": "56baad4e7f699902b03b17580933f7bd50b6ea97b7df9d7e807750973da7529c", + "name": "nvidia-nccl-cu13", + "version": "2.29.7" + }, + { + "direct_url": null, + "metadata_sha256": "98810ef0ab8badc369e6a46a038f8ee9f412c0c753fb5ad580544f23a0aa7962", + "name": "nvidia-nvjitlink", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "b0f54ee21909d19640a58e05da755c91763eb5725f544fd0d4b84b2f5f94deba", + "name": "nvidia-nvshmem-cu13", + "version": "3.4.5" + }, + { + "direct_url": null, + "metadata_sha256": "06dc1a593c7e8b8c3f29184228c83f8f7ef57787ad91f3e5bcae1d238dd3092a", + "name": "nvidia-nvtx", + "version": "13.0.85" + }, + { + "direct_url": null, + "metadata_sha256": "32ee63450a437b6a6ed227ff6549144aa596197a322993521ec7af826ebd413e", + "name": "nvidia-nvvm", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "32c2efdcd2c673b3b7f35ca9c2cccefaad36f1f0a920648a13cad85f6a5767b2", + "name": "nvtx", + "version": "0.2.15" + }, + { + "direct_url": null, + "metadata_sha256": "3419d80e114a2c19fa9bd3582939a3942f19673055707ba6ca2ca489d58b41e0", + "name": "omegaconf", + "version": "2.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "28971076ce9c279d4b889496b046d55a1e05b02fb9851ceb717e9a10df799572", + "name": "onnx", + "version": "1.23.1" + }, + { + "direct_url": null, + "metadata_sha256": "1246f5a4d8295907a42e809ed9173ede2510ec9d260d2168989d126564897fa5", + "name": "onnx-ir", + "version": "1.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "e14643636835759700dff286f949c5ec34e7eac7ac47f44096414f0e0f1c3101", + "name": "onnxscript", + "version": "0.7.2" + }, + { + "direct_url": null, + "metadata_sha256": "00f847e99939207bd70dfd806428f6b20a3d01074b59325e4c76149a2e19be26", + "name": "openai", + "version": "3.22.1" + }, + { + "direct_url": null, + "metadata_sha256": "598d3ad5a22a14a7c4f1d218b43e345f32b0ba094b753467bae8a3f708fd48cb", + "name": "openai-agents", + "version": "0.22.3" + }, + { + "direct_url": null, + "metadata_sha256": "5a0afcb1ce845e05da12beb1767f5d2749bbc9e9050718c6b9fa3c225713c9eb", + "name": "openai-harmony", + "version": "0.0.8" + }, + { + "direct_url": null, + "metadata_sha256": "e86a6b6fcbbe152805f782c57df321002892e163019574877e9829272e25eb4e", + "name": "opencensus", + "version": "0.11.4" + }, + { + "direct_url": null, + "metadata_sha256": "53d669c8bd3d32d3275153b454e515ca5cc6dec92fae3a98309b5a2b19fe6d2d", + "name": "opencensus-context", + "version": "0.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "19778b6d66b0e45bf73e11fa37a208949d5b393aef914627394d5601455546a6", + "name": "opencv-python-headless", + "version": "5.0.0.93" + }, + { + "direct_url": null, + "metadata_sha256": "19778b6d66b0e45bf73e11fa37a208949d5b393aef914627394d5601455546a6", + "name": "opencv-python-headless", + "version": "5.0.0.93" + }, + { + "direct_url": null, + "metadata_sha256": "a3f5434fa7c80f7f7abc82173da639c8e9c59d30b4027182645562bd3d2f4f97", + "name": "opentelemetry-api", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "8611977ea596e4827874582e86250618444e1c718229dddfc16e5ea437ce5fcb", + "name": "opentelemetry-exporter-http-transport", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "2cfd41e5ca33292d987ba71fa6186d11e16ed66888f3a26f8a3a99060c4b5e90", + "name": "opentelemetry-exporter-otlp", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "3bb4494220732d4bf10e1dba231ea7638cedaa5362e1f23a50d34a14f520fea8", + "name": "opentelemetry-exporter-otlp-common", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "27fb1c8aa5c2cd07776f9f3281fc618cd3feb96017757c33d2b3586fb7fec88b", + "name": "opentelemetry-exporter-otlp-proto-common", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "5cba6098cdd0bfb06853a6c704a2451c4f82c9dea376a30b59ecd279296648ad", + "name": "opentelemetry-exporter-otlp-proto-grpc", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "6f53ef1c172ebf87af69b9ef390aa908506d0cd14bc7811985fdd937a4058808", + "name": "opentelemetry-exporter-otlp-proto-http", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "1910f4e7ebd497e98b6d231e10275288fda2cd1885117575706c62f45e065889", + "name": "opentelemetry-exporter-prometheus", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "fab18b721e30be41448be252e1dca43b48e7f15d971e0bb552492c0ef4b07bee", + "name": "opentelemetry-proto", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "3644a79f55762a646799ff52b9d837e01c8192b7b28f735a383f55c90edb9bc2", + "name": "opentelemetry-sdk", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "add3db481f7f401f65cfbddb058fde3bb4c9dd7b61064a84f8598ad7efe0b11c", + "name": "opentelemetry-semantic-conventions", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "0dfff30e912520a226bcf7a547393484cfcd8c738439c7b48418f61c95109480", + "name": "opentelemetry-semantic-conventions-ai", + "version": "0.5.1" + }, + { + "direct_url": null, + "metadata_sha256": "210ce26bad0a245a72831b4fa029708c245d4d670a88c8d5a69b1446c24a95e4", + "name": "orjson", + "version": "3.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "35ff73511848f5f934ccc39d538014716ec4579e76d54e0e407ff51794a7939c", + "name": "outlines_core", + "version": "0.2.14" + }, + { + "direct_url": null, + "metadata_sha256": "8ee2f7138ade46b6e348a6d099612f5bd6caff13511f3b4144327f37ce50eacf", + "name": "packaging", + "version": "26.3" + }, + { + "direct_url": null, + "metadata_sha256": "a4ab87bf8083001f25ccdc46095f05b678b3569dd58edc2cf941e3e7f64d7c88", + "name": "paginate", + "version": "0.5.7" + }, + { + "direct_url": null, + "metadata_sha256": "1de96a6c28c2e5613c9c87cd4ad9484791001cf58df43cf2ba74d5c4f85f0ad2", + "name": "pandas", + "version": "3.0.6" + }, + { + "direct_url": null, + "metadata_sha256": "d05b8d05da9f78176b2eefaacdfaa5e96708ec4f488daea8bbc52e3ed1bc3954", + "name": "partial-json-parser", + "version": "0.2.1.1.post7" + }, + { + "direct_url": null, + "metadata_sha256": "c1d126edceac2685e29403a8ae3a27c47143dce1f0252fa3931771562f1e2b4f", + "name": "pathspec", + "version": "1.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "30325dc8ce17bc64f9dbc0a449232fd35841a019df22a6f481007c9c5a28c1cb", + "name": "pillow", + "version": "12.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "cbc0b7b6e63b50dcb7c17cf3526a9304f285d9a31353adf3b22acc2059ab23f5", + "name": "pip", + "version": "25.0.1" + }, + { + "direct_url": "{\"dir_info\": {}, \"url\": \"file:///work\"}", + "metadata_sha256": "6ba03b5bc457a2a3d92468729501b5892a0d38ebcc36766c58859449498c5743", + "name": "pip", + "version": "26.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "0421937c4410b61c5325233d5b7671ae933bae8de174f87586ac55aa804851ea", + "name": "platformdirs", + "version": "4.12.2" + }, + { + "direct_url": null, + "metadata_sha256": "2bcffab42626e1fb50d6329765619312d30fe7f4880e98dcee99c92ebd283bb4", + "name": "pluggy", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "7e7562ba7c032f8edd02641ae71b1ac2d8f388103a68d777a7e907d19e75bc17", + "name": "pre_commit", + "version": "4.6.2" + }, + { + "direct_url": null, + "metadata_sha256": "bbe0a7662602ddd23f929fe0ee98e9d04406e138aeee18ce4861af186ea6060d", + "name": "prometheus-fastapi-instrumentator", + "version": "8.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "ece4a61f3ffb92a083fd5e47e180e3e070342e60a3bd93876a879e79a643e821", + "name": "prometheus_client", + "version": "0.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "5feba21a58eaa126e7e7739e57e2572e5bb251fcbf56e439e508acc47d769314", + "name": "propcache", + "version": "0.5.4" + }, + { + "direct_url": null, + "metadata_sha256": "3f136dbf7239c987a7685acd33440cc5efd6c4107b4b11c425201b4de70ae36f", + "name": "proto-plus", + "version": "1.29.0" + }, + { + "direct_url": null, + "metadata_sha256": "118b5ad013120a7a6e24714595ad776bf264d7b0060389133310d18ea1480902", + "name": "protobuf", + "version": "7.36.2" + }, + { + "direct_url": null, + "metadata_sha256": "0849f5a519bf9bc23ef204443fdd8d6d10678863acac7ca9340fc11bfba5a856", + "name": "protobuf-py", + "version": "0.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "eab5f2f4fd98f67a710a8fb1975b64ffa880a4f977566f022c567e08e324ccd6", + "name": "protobuf-py-ext", + "version": "0.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "39009938840de3a8b2a37eb4668d2601aae8c74e4b74743f73e59996b5b7e6e1", + "name": "psutil", + "version": "7.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "df44b58e8a4cfe57f65773ec47f7bdf2a14c8f5f73a7abf331a6b6237d6d691a", + "name": "py-cpuinfo", + "version": "9.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "2fd4a9efc5e5c74ae4c2fcf1970193c524c62ab22af8d5e66ebf7df9e6e46e83", + "name": "py-spy", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "d2ccdeb15cddedc81637a83e40baa6397fe269023b738d0fc3cb2d90722e290b", + "name": "pyarrow", + "version": "25.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "47b9f28e971a56f5adf949e0bcf105b0bf6587946566ecf197a2819d8848cc01", + "name": "pyasn1", + "version": "0.6.4" + }, + { + "direct_url": null, + "metadata_sha256": "82ce4c01c6d36841b9801fcdabab9bfe61d0b5e4e440c275941d8a2d4a790730", + "name": "pyasn1_modules", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "45cb345e4c12f63bc843b8c88902cc44c4d624a55aaef8cd5ffbc0ad16356fbe", + "name": "pybase64", + "version": "1.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "d311ae661edeac8ff029ab2960d065a7e792ebf8f79af682daa53109fe81318b", + "name": "pybind11", + "version": "3.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "cce9c0d440d065d4cdfb0d00004b8ddd65cf363a740efc5b0920b29201a59cd9", + "name": "pycountry", + "version": "26.2.16" + }, + { + "direct_url": null, + "metadata_sha256": "a1e33542883c249bf6c263b0023b9ea8a6131a77d9cb2cbc88316968e5eada83", + "name": "pycparser", + "version": "3.0" + }, + { + "direct_url": null, + "metadata_sha256": "faffcc4d7d359cb1047a9f67f7c65096b838c6db6c62852ef20fb27d55649a95", + "name": "pycryptodomex", + "version": "3.23.0" + }, + { + "direct_url": null, + "metadata_sha256": "98929f4cb80451dc3c6c8cd541a3081dccf0dee94afe7d9fa5c214a18ff236ce", + "name": "pydantic", + "version": "2.13.5" + }, + { + "direct_url": null, + "metadata_sha256": "8eccadbe707db97c397fb79073fe791b7998ef3a85f04f817f8991f7697b190b", + "name": "pydantic-extra-types", + "version": "2.11.1" + }, + { + "direct_url": null, + "metadata_sha256": "8f00c91deb34399316a5386eb2e76fe09f14a08dc3045f2e7dce9bf8573796bd", + "name": "pydantic-settings", + "version": "2.15.0" + }, + { + "direct_url": null, + "metadata_sha256": "66c729edddc20bf2764bb18bd87d907b08690e50355f39b97acc737b26d1d164", + "name": "pydantic_core", + "version": "2.46.5" + }, + { + "direct_url": null, + "metadata_sha256": "394500d78a0c1a433ae8ca3693152c08f6a901121d4b069cf1540a19759e2950", + "name": "pylatexenc", + "version": "2.11" + }, + { + "direct_url": null, + "metadata_sha256": "df2e9e9847a2aea0ae6e20fd325aeb16cf3ce7f8913462db6c2398363cd0c0bf", + "name": "pymdown-extensions", + "version": "12.1" + }, + { + "direct_url": null, + "metadata_sha256": "82fcfe724db9f0b51348da89f4f5cdc0b08d08882b1bbc0ca4913d3a0a93bcb9", + "name": "pynvvideocodec", + "version": "2.0.4" + }, + { + "direct_url": null, + "metadata_sha256": "3722422cc1478b175879143dfb78f98b7a5f53f4f684d71b7054fe2e8acd3b89", + "name": "pyqwest", + "version": "0.10.0" + }, + { + "direct_url": null, + "metadata_sha256": "7d1d1c276b7c372d55d17ac7d30f0a4b80a746e147347b8510d1355eea7f80c8", + "name": "pytest", + "version": "9.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "89e7c1c932e52b74bdcaf504389d2d1a2d7ca559b02bf5a09fc80ebd58ad10f7", + "name": "python-dateutil", + "version": "2.9.0.post0" + }, + { + "direct_url": null, + "metadata_sha256": "54f30f811841b6d772f31715712c85bfe0041839cb071f78daf41c700a98642b", + "name": "python-discovery", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "54f30f811841b6d772f31715712c85bfe0041839cb071f78daf41c700a98642b", + "name": "python-discovery", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "0cc19efd76cfbf3bcb2cb0d3ab82191036855859455aa3812c5e9e591e3f34e8", + "name": "python-dotenv", + "version": "1.2.3" + }, + { + "direct_url": null, + "metadata_sha256": "1d866c6124631b9ce1797ad412fff298ab53fc2d95210281d7c8f20e920753fa", + "name": "python-json-logger", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "2d18a1e7286d92a656ead5ec6f83d5ae6dc858634624f6b264703ae88d24d718", + "name": "python-multipart", + "version": "0.0.32" + }, + { + "direct_url": null, + "metadata_sha256": "beaa0efe9ba4b34843f5a0fc7379a73f10e95adb8cc0c31f359ab6f3a42b4def", + "name": "pyyaml_env_tag", + "version": "1.1" + }, + { + "direct_url": null, + "metadata_sha256": "238dc769e22d4f5626750cdff36e920e4a8d69c10d88de6d79b40a59cc13d873", + "name": "pyzmq", + "version": "27.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "de0a5e855bb5bb78b7acdcd2ca60619c6a0c109814881589caf158ec07155662", + "name": "quack-kernels", + "version": "0.6.5" + }, + { + "direct_url": null, + "metadata_sha256": "961ffef199b876fb4d7b10903d78e79f359d703b1638834c61d70b9879932918", + "name": "qwen-vl-utils", + "version": "0.0.14" + }, + { + "direct_url": null, + "metadata_sha256": "faf6ab9027d12de992827a2d8a224996fe6747a8c5f7d31ae495983dc73eefe9", + "name": "ray", + "version": "2.54.0" + }, + { + "direct_url": null, + "metadata_sha256": "c50d8b3ff4d113925b60dc47d1d28e87248a3338024241b0a3a66c8794fbce0c", + "name": "referencing", + "version": "0.37.0" + }, + { + "direct_url": null, + "metadata_sha256": "02acdc52d6f21d5f4b172254daaa94edfaa44c9ebe14d1c00cc4c8fe99b0e1df", + "name": "regex", + "version": "2026.9.29" + }, + { + "direct_url": null, + "metadata_sha256": "ac08207697217d1ffde8a161b424d77d6e2af6b62630fa26d75d08f11076cdca", + "name": "requests", + "version": "2.34.2" + }, + { + "direct_url": null, + "metadata_sha256": "f1abd635c3dff607a4fd654c62a88d9d4c21843cfc9176116c156f4269ca21b5", + "name": "rich", + "version": "15.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "932ff7743a756d0efcc45528d64c275ac3cb40a8dd1787ea10cb303907f0ae4f", + "name": "rich-toolkit", + "version": "0.20.5" + }, + { + "direct_url": null, + "metadata_sha256": "294a1405c0fa34b5f735bcb46459050436849a1e584c643544de99c07c529fb7", + "name": "rignore", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "5e54dd00b4ad336c5161d47de2a5c2212090c44629c28b6538b156256e49282d", + "name": "rpds-py", + "version": "2026.6.3" + }, + { + "direct_url": null, + "metadata_sha256": "0d5895abd80bfc0027c02943abaea4547061b9004bd134950d640d619a697835", + "name": "safetensors", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "91d5de3f641f33a8fbb4b6e91772da68d50b68686971d7b66af2068f2e77b694", + "name": "scipy", + "version": "1.17.1" + }, + { + "direct_url": null, + "metadata_sha256": "297fb30f701a800489c12893a951da3e5bd1f80061a1f43f0d3e9f1d4c6bc6fd", + "name": "sentencepiece", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "4245e0388ddf2048a38ae2a24a3d2c583408b2454aadc680d3c3beede639db3f", + "name": "sentry-sdk", + "version": "2.71.0" + }, + { + "direct_url": null, + "metadata_sha256": "ae8a9e6feec1a76e954d65ea48ac57842c9a7bfb5ac6e5ea82400a5ba9f71a98", + "name": "setproctitle", + "version": "1.3.7" + }, + { + "direct_url": null, + "metadata_sha256": "341d00772017437d0f6e3c943ae353f243c39fedfba403aea47cced927a76516", + "name": "setuptools", + "version": "79.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "ff4bcfb192bd542ed8f1794fb32ffc9eabd932d6e03cb00a4ad5e35a2469af88", + "name": "setuptools", + "version": "80.10.2" + }, + { + "direct_url": null, + "metadata_sha256": "f1e5a532fb8cda0bbc370e3db6cb9cea72a065d12ddd6a14976ba3cf66264221", + "name": "shellingham", + "version": "1.5.4" + }, + { + "direct_url": null, + "metadata_sha256": "2aba2cfd9c2ad7625a5d374d141af317d8f92d3534997bf98d127e52848dfc81", + "name": "six", + "version": "1.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "69ae2dfe547624be97fae348e1cfa3793f8854eed32cc1603badedc7d48fb36e", + "name": "smart_open", + "version": "8.0.2" + }, + { + "direct_url": null, + "metadata_sha256": "d415e6c6de7dee117d254a342668c489931bc88eac7ec8678b452078e366da6e", + "name": "smmap", + "version": "5.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "093bc4f0740a6fc28692e616aa8fe68d7e1d76426cc5a5faf9ea722a8ee7aaae", + "name": "sniffio", + "version": "1.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "b3cef071eb1dbeaa76a1273fe2ca2cc8ef36e835165253952d93780962529ac1", + "name": "sse-starlette", + "version": "3.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "3c01ca830e213f0311fe37bc3b46b8ab230a5e7acb894bf0fc8785cb7ccfed48", + "name": "starlette", + "version": "1.7.0" + }, + { + "direct_url": null, + "metadata_sha256": "6017ca508a293cf47a88a78cb330e9cbd131d74ec3c7fbf89bd4300ed3129d30", + "name": "supervisor", + "version": "4.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "fd5eb4925b04f9bffbc6c4f92bf8aea7243b918b43cd359493fce48a7dd3b336", + "name": "sympy", + "version": "1.14.0" + }, + { + "direct_url": null, + "metadata_sha256": "f09f0e24282c5a86346bcd5b10ae5ff81869fa8ef69c3ba524bd0a817a87dda9", + "name": "tabulate", + "version": "0.10.0" + }, + { + "direct_url": null, + "metadata_sha256": "519fa19c146fd58a0a75ecf1461e4bd98f9c06d01800c37d4a80f5fef095f4e1", + "name": "tensorboard", + "version": "2.21.0" + }, + { + "direct_url": null, + "metadata_sha256": "1af7ad76e4073b01ab147eb3c1d8e38b95d38062c6c9bc63890150738642e8eb", + "name": "tensorboard-data-server", + "version": "0.7.2" + }, + { + "direct_url": null, + "metadata_sha256": "9e597f62fc07e3b931d5c8fb0e90706fb6d45465cfb5d01dbd27ba7fc135c02c", + "name": "tensorstore", + "version": "0.1.80" + }, + { + "direct_url": null, + "metadata_sha256": "0da993d16ef6326f471796fcb065622f309c5c1aae6c6295b488ea64bb5c880c", + "name": "textual", + "version": "8.2.8" + }, + { + "direct_url": null, + "metadata_sha256": "52ca6148d4fd1497254855fa610cfdde99191cd42bce7a452fd3a68855504ac0", + "name": "tiktoken", + "version": "0.14.0" + }, + { + "direct_url": null, + "metadata_sha256": "0df9eb495cfb477dcbdfbdcd8c04d952d3eb00d77831630760571e13545398e5", + "name": "tilelang", + "version": "0.1.12" + }, + { + "direct_url": null, + "metadata_sha256": "802b576e011dc61bd2681593e8d802714b6c4ce636a9cf87035026db32ce6262", + "name": "tokenizers", + "version": "0.23.2" + }, + { + "direct_url": null, + "metadata_sha256": "4e1631b2164a49ff9a848d86ce504fdcc15e3540dbb262df8f33a2681a8de513", + "name": "tokenspeed-mla", + "version": "0.1.8" + }, + { + "direct_url": null, + "metadata_sha256": "05086095a775c5dca70998dcf442a848c13f9c68b54a54c510c3542c5abb6563", + "name": "tokenspeed-triton", + "version": "3.8.10.post20260920" + }, + { + "direct_url": null, + "metadata_sha256": "71daba472d0c5ffc25c0231dc29688ab0cb13d5bc7e7d93f6c4cce4169c50048", + "name": "torch", + "version": "2.13.0" + }, + { + "direct_url": null, + "metadata_sha256": "cccd2f1c0e5866e63732f58798c8d642ee6d10cd560d6f691e7981b908c246c9", + "name": "torch_c_dlpack_ext", + "version": "0.1.5" + }, + { + "direct_url": "{\"dir_info\": {}, \"url\": \"file:///torch_memory_saver\"}", + "metadata_sha256": "6276cef17dedbb5ee0d6157bbf63b832e916026281328d995ad3d488c2539618", + "name": "torch_memory_saver", + "version": "0.0.9.post1+slime" + }, + { + "direct_url": null, + "metadata_sha256": "29809ca2c86dda5079654f1f70564a64435e9d08f1964a2412b6f514e1b5ff64", + "name": "torchaudio", + "version": "2.11.0" + }, + { + "direct_url": null, + "metadata_sha256": "7e9be0f3a290e3fd9370d8fe010c7ffd006d5d3d05ab8bdf7df8f92f0fca9c39", + "name": "torchcodec", + "version": "0.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "181fa5e6b399c378711eddcdacd756d3c51317916f8eb160ee36cae7fae9589f", + "name": "torchvision", + "version": "0.28.0" + }, + { + "direct_url": null, + "metadata_sha256": "43d1261aff90cf3d5b1b40cf1f94234d61409b14e59f3766f457c1eec7f7ac15", + "name": "tqdm", + "version": "4.70.1" + }, + { + "direct_url": "{\"archive_info\": {\"hash\": \"sha256=3e1d9f534781c8e608240da0b495b8246317a36382f7609017cbaa7fb1d53f7b\", \"hashes\": {\"sha256\": \"3e1d9f534781c8e608240da0b495b8246317a36382f7609017cbaa7fb1d53f7b\"}}, \"url\": \"file:///wheels/transformer_engine-2.16.1%2Bc9877beb-cp312-cp312-linux_x86_64.whl\"}", + "metadata_sha256": "d882f743161d9d9f35dee4e1a8cc9136fa495f7c660caace01ab8f5602d76aa7", + "name": "transformer_engine", + "version": "2.16.1+c9877beb" + }, + { + "direct_url": null, + "metadata_sha256": "465797a59706d83b45c93fde750b228c3b6e1addc44115de2c4c02ad66d9c5ea", + "name": "transformers", + "version": "5.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "a91982ca086667c592a951973434f7c5a9f27a8300bc97af78dfb496afe53e71", + "name": "triton", + "version": "3.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "d26fbb244532c4051e715f9047cd943e2cc4abb0ac6f2a517fa2986eb1ea726a", + "name": "truststore", + "version": "0.10.4" + }, + { + "direct_url": null, + "metadata_sha256": "c84af1a069084b1b440b3594068dec29200d52d4c1a9b652030448717f270158", + "name": "typer", + "version": "0.27.2" + }, + { + "direct_url": null, + "metadata_sha256": "0ad6653b7439f4bb6a596cb7b01ed1b716458467525c4dc40b75d62bdb943c98", + "name": "typing-inspection", + "version": "0.4.4" + }, + { + "direct_url": null, + "metadata_sha256": "d005280aa13b334ac942d20219102865e559f69ffd06c35c248b2f0d0da3b933", + "name": "typing_extensions", + "version": "4.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "fba2930e9030a18965d243f8d330748db2e67572a81b3b68710462fb5110332a", + "name": "urllib3", + "version": "2.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "bc5717bd6524a33838f285261868bcc8e311e8c29fdb19e41d56c38b04890e84", + "name": "uvicorn", + "version": "0.54.0" + }, + { + "direct_url": null, + "metadata_sha256": "741c006d8441f562aa853a5430df236fbb4af923445491f396bf09943bd30258", + "name": "uvloop", + "version": "0.22.1" + }, + { + "direct_url": "{\"dir_info\": {\"editable\": true}, \"url\": \"file:///vime\"}", + "metadata_sha256": "f85aa01dfdc868756a6583434bbff040f29eb511d47d5b25ada063a84353aac6", + "name": "vime", + "version": "0.3.2" + }, + { + "direct_url": null, + "metadata_sha256": "c25431aaf1950971fe96292f395a41a55b403127bfca0d0b8f7dc9cff5dab75d", + "name": "virtualenv", + "version": "21.14.1" + }, + { + "direct_url": null, + "metadata_sha256": "4e3ee0a31d85e56268640aae853bcee4794dfe8c0483c5c6370517e480c81ae0", + "name": "virtualenv", + "version": "21.14.5" + }, + { + "direct_url": null, + "metadata_sha256": "d4ed5c7551cddb8c1aeff2f9f27b3491f6ad2c9afda8e7bb9779c33fa12a536c", + "name": "vllm", + "version": "0.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "84b482e09bac949e992594757214a1920c667a5d898ee320e309250697f6d26e", + "name": "vllm-router", + "version": "0.1.15" + }, + { + "direct_url": null, + "metadata_sha256": "9b16c871eb1060a5218e9b9a9ad33288d94844cfaf43f08dbb6c32423bde8fe3", + "name": "wandb", + "version": "0.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "8e4f2be437dfe4eb3c6c959e517ac20b75d06525563f1ebcbf06f9ec648bd7c1", + "name": "watchdog", + "version": "6.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "15218afb42938907c2ca74c54e3d8e3a5406493c4761e29e38e82bfec0f84296", + "name": "watchfiles", + "version": "1.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "8863af96e88b7db9990da99aa6c46816eacc3d2f9ae1297b53381b033cd70119", + "name": "wcmatch", + "version": "11.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "f46e6bd6cfafb2b684c29587b017b7096fd9155b74eda25a22eca784b9803ab7", + "name": "websockets", + "version": "16.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "ce82db5ccfefa4bfbe4e25a36e1f91e8e7d51fcaeb31586c4d48e1c69f99168b", + "name": "websockets", + "version": "17.1" + }, + { + "direct_url": null, + "metadata_sha256": "0f142a2c09eac643c7d0bfe77f3f121184c0b17914afbd32af669ed19b2b02ef", + "name": "wheel", + "version": "0.47.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd58938e51a3c5cb363f6f22eaa2a8a7accc1ce373388de167a82f77d3e5783f", + "name": "wrapt", + "version": "2.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "b0b72c1941f04499ca7e1a3a6e479aee8df902c3d49979624b59dba8c3228d37", + "name": "xgrammar", + "version": "0.2.8" + }, + { + "direct_url": null, + "metadata_sha256": "ef8861f39e5c36255966a36032651f937d890d55f31f1c26304b488f1ba34332", + "name": "xxhash", + "version": "4.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "740c08057b6eb69c58402c87d652af0a471e46325d811f2c605632a18817152f", + "name": "yarl", + "version": "1.25.1" + }, + { + "direct_url": null, + "metadata_sha256": "7b060e4d24394b5431875e2f74fec8e6bffa79d2e6b4cb8c7e2a5187dd2d8d69", + "name": "z3-solver", + "version": "4.15.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "3d76d4fbc95f0851191147db12300938c67a6f8fb1df884886d9601272ccc4e8", + "name": "zipp", + "version": "4.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "d3de2651e4e908dbb7c9d80508e5179590217dfac4993dc8b04381c5b9718c4c", + "name": "zstandard", + "version": "0.25.0" + } + ], + "executable": "", + "installed_provider_sources": { + "vllm/compilation/__init__.py": { + "path": "/vllm/compilation/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/backends.py": { + "path": "/vllm/compilation/backends.py", + "sha256": "fa4bff8920b363efbbde9456f135fa9d2c004a5bde1898877f177418b2d8b008" + }, + "vllm/compilation/base_static_graph.py": { + "path": "/vllm/compilation/base_static_graph.py", + "sha256": "5cfe8e06db84aa42cd41cdd93ebe93af00b3a242c8011042057530e2922b523a" + }, + "vllm/compilation/breakable_cudagraph.py": { + "path": "/vllm/compilation/breakable_cudagraph.py", + "sha256": "3cc427612a08e2b9b3fee47548026400c1d0776e2d4747535e59ef5512bdf1e8" + }, + "vllm/compilation/caching.py": { + "path": "/vllm/compilation/caching.py", + "sha256": "71d212452dde742fbf28b8a01ed29d3c08a7457ff7f8da2a20ce9d17e902c2cf" + }, + "vllm/compilation/codegen.py": { + "path": "/vllm/compilation/codegen.py", + "sha256": "e04833bec88cf9d1a13aa7341e30e3233d1138bfe23424e0fd34d664b3fedb9f" + }, + "vllm/compilation/compiler_interface.py": { + "path": "/vllm/compilation/compiler_interface.py", + "sha256": "8d84e2864bf83f754bae9e9f77119e0287cca9f97f5fa5ec2535e07b5ad88944" + }, + "vllm/compilation/counter.py": { + "path": "/vllm/compilation/counter.py", + "sha256": "d8158c54dd36a357bf24f6f84dc22f572d3a27f4875f3d5779b12bc5d454ff76" + }, + "vllm/compilation/cuda_graph.py": { + "path": "/vllm/compilation/cuda_graph.py", + "sha256": "05c86392d7fae967ac73076dba7e01990a0e3ae619e4866450a0c1be56bd1192" + }, + "vllm/compilation/decorators.py": { + "path": "/vllm/compilation/decorators.py", + "sha256": "cab6962e8a1fead59c75f5ed8cb4732f9e5441ff972030c2f4b1c4ba0c58de3c" + }, + "vllm/compilation/monitor.py": { + "path": "/vllm/compilation/monitor.py", + "sha256": "43b24c5cb1bc4d32dc979f3222596905c7b3acc58415328a234402e6edc76abf" + }, + "vllm/compilation/partition_rules.py": { + "path": "/vllm/compilation/partition_rules.py", + "sha256": "857d2fb06dc871ea1d3717cd01fbd4e5205984100d98b7b72a2933d6ff1cfa4d" + }, + "vllm/compilation/passes/__init__.py": { + "path": "/vllm/compilation/passes/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/fusion/__init__.py": { + "path": "/vllm/compilation/passes/fusion/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/fusion/act_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/act_quant_fusion.py", + "sha256": "1fa9c3ca4fb424685b7053c3dda89dda16c98dc5645d85f0f28dca58429792b3" + }, + "vllm/compilation/passes/fusion/add_rms_fusion.py": { + "path": "/vllm/compilation/passes/fusion/add_rms_fusion.py", + "sha256": "e46998552628aa5cd5962fc39ea39ae824fd97e6aeba1d176e9cc7cade39837b" + }, + "vllm/compilation/passes/fusion/allreduce_rms_fusion.py": { + "path": "/vllm/compilation/passes/fusion/allreduce_rms_fusion.py", + "sha256": "0af193505880cec0f6ffa224c688bce3c9ddc318dccdf04a696b4e4b4506a963" + }, + "vllm/compilation/passes/fusion/attn_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/attn_quant_fusion.py", + "sha256": "ecc64e82be4481954c9cac6c23d7794846ab19486b570f2dda07ab5ad67c5a49" + }, + "vllm/compilation/passes/fusion/collective_fusion.py": { + "path": "/vllm/compilation/passes/fusion/collective_fusion.py", + "sha256": "1e2c8539d6960b45907fb3bf0482441ea7250e97c56ffdea1500514efa0b164d" + }, + "vllm/compilation/passes/fusion/matcher_utils.py": { + "path": "/vllm/compilation/passes/fusion/matcher_utils.py", + "sha256": "50ac5714ce1bb113520de769ea6234316acc470a8cdf2537a996ce9a9d54337d" + }, + "vllm/compilation/passes/fusion/mla_attn_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/mla_attn_quant_fusion.py", + "sha256": "a966fe7f58bf9228379f793f5fd851735a97f9639722766b2a20cb79a9e4baec" + }, + "vllm/compilation/passes/fusion/mla_rope_kvcache_cat_fusion.py": { + "path": "/vllm/compilation/passes/fusion/mla_rope_kvcache_cat_fusion.py", + "sha256": "1602cc28055ffa8d1123ddb1d256bf0bd12006fd06ea7e16a986c55746dbe0dc" + }, + "vllm/compilation/passes/fusion/qk_norm_rope_fusion.py": { + "path": "/vllm/compilation/passes/fusion/qk_norm_rope_fusion.py", + "sha256": "aebc7d1a5189b65ac665afcc169e7baebd53efe719c48e35e7c5babe85af0d39" + }, + "vllm/compilation/passes/fusion/qk_norm_rope_kvcache_fusion.py": { + "path": "/vllm/compilation/passes/fusion/qk_norm_rope_kvcache_fusion.py", + "sha256": "f0cfd0d83ec4acb09f9bf91d199b114e9d4995e3059c13eb23a6978ce7c07eb2" + }, + "vllm/compilation/passes/fusion/rms_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rms_quant_fusion.py", + "sha256": "4852aa44e0e2087043fdac271bda9b8d9bfe3201bb84ce3919b8ed454d8083c4" + }, + "vllm/compilation/passes/fusion/rocm_aiter_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rocm_aiter_fusion.py", + "sha256": "372e76c68c75209a085deec6dd22b3816be633613ca82f6f2925c1b3773d61a0" + }, + "vllm/compilation/passes/fusion/rope_kvcache_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rope_kvcache_fusion.py", + "sha256": "3a756e9049593537143b5a56ab9185a6bc83f57ed81d84226d7791a46a984b53" + }, + "vllm/compilation/passes/fusion/sequence_parallelism.py": { + "path": "/vllm/compilation/passes/fusion/sequence_parallelism.py", + "sha256": "3af7e420dcb35fff0bae0f8f599d0f1bda34445ebe194059892a434b2976d654" + }, + "vllm/compilation/passes/fx_utils.py": { + "path": "/vllm/compilation/passes/fx_utils.py", + "sha256": "730708213acf9d1b5f3176b433dfc197a5f3c81b5ce443f0923c526924833003" + }, + "vllm/compilation/passes/inductor_pass.py": { + "path": "/vllm/compilation/passes/inductor_pass.py", + "sha256": "1f380aacf7adabb8bf8b7d41c0a93473947f0716f7445bd910fd448f6c08e672" + }, + "vllm/compilation/passes/ir/__init__.py": { + "path": "/vllm/compilation/passes/ir/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/ir/clone_elimination.py": { + "path": "/vllm/compilation/passes/ir/clone_elimination.py", + "sha256": "5297078f5cddce081faba5215814275381d2083b32318fcfeb2bf9d69fedb7c7" + }, + "vllm/compilation/passes/ir/inplace_functionalization.py": { + "path": "/vllm/compilation/passes/ir/inplace_functionalization.py", + "sha256": "2dc4f22c6f05224828c2941479185b1452d4490f488b7f0bfd124334e7809fed" + }, + "vllm/compilation/passes/ir/lowering_pass.py": { + "path": "/vllm/compilation/passes/ir/lowering_pass.py", + "sha256": "d9c3d90f63138420f0e5489447b5996573fcfbbab939da2efccd00848492b172" + }, + "vllm/compilation/passes/ir/utils.py": { + "path": "/vllm/compilation/passes/ir/utils.py", + "sha256": "f59d33a6c7d0616cbeec1e9fb1d6c948881bf81fe124caeb906eac2e2197ea21" + }, + "vllm/compilation/passes/pass_manager.py": { + "path": "/vllm/compilation/passes/pass_manager.py", + "sha256": "486979a058aa2e20ebedcbb6e039f7a59f38d2efd2cda11219fae4067be0968d" + }, + "vllm/compilation/passes/utility/__init__.py": { + "path": "/vllm/compilation/passes/utility/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/utility/fix_functionalization.py": { + "path": "/vllm/compilation/passes/utility/fix_functionalization.py", + "sha256": "ad5b504a05ccee023869b0c8df70ec2fff9a4a80d25fd903e2b532f470e7203f" + }, + "vllm/compilation/passes/utility/noop_elimination.py": { + "path": "/vllm/compilation/passes/utility/noop_elimination.py", + "sha256": "8abf85d28c13f95059f2acbc0275b9b9ed2ad4990f7c5763bbe3067a4aa629ce" + }, + "vllm/compilation/passes/utility/post_cleanup.py": { + "path": "/vllm/compilation/passes/utility/post_cleanup.py", + "sha256": "1c38b14fc209165cbcf8ca763a17ac4e528b97f59b573e5d52df2cce7d758de3" + }, + "vllm/compilation/passes/utility/scatter_split_replace.py": { + "path": "/vllm/compilation/passes/utility/scatter_split_replace.py", + "sha256": "138402cc3097768a32e9e5b8d1a054b6176e494bddc8684e23ca2dc5fdc3fdda" + }, + "vllm/compilation/passes/utility/split_coalescing.py": { + "path": "/vllm/compilation/passes/utility/split_coalescing.py", + "sha256": "0b02acd9e1ad43d7b3e128b914e969b9580773f2818078846dfbf163a8bd0871" + }, + "vllm/compilation/passes/vllm_inductor_pass.py": { + "path": "/vllm/compilation/passes/vllm_inductor_pass.py", + "sha256": "4f83ffb67f834a214221d810c7843a8e41eb4e5930eb40adbd8cf054ff6fb9c6" + }, + "vllm/compilation/piecewise_backend.py": { + "path": "/vllm/compilation/piecewise_backend.py", + "sha256": "6525318ff3ca2e4978e24dd9232a7ae0a02e920e19604b83db6f6043d1f8a54d" + }, + "vllm/compilation/wrapper.py": { + "path": "/vllm/compilation/wrapper.py", + "sha256": "c1b1fca679ea16aa07a696831a810c0d531da2bb0ea32dd6f1a95cdaef36de07" + }, + "vllm/config/__init__.py": { + "path": "/vllm/config/__init__.py", + "sha256": "56fb0cb1598d297e4f95a97e5d86dc624145d1532f5faa432b7d2834d7155bd5" + }, + "vllm/config/attention.py": { + "path": "/vllm/config/attention.py", + "sha256": "c41f345b512d9b7df882328257eb3a6381f41088c11ae83b5ecd8a9e8265d1bc" + }, + "vllm/config/cache.py": { + "path": "/vllm/config/cache.py", + "sha256": "f1c226ba679c884930dbfcaf41a57248b137a9a20d3ed8e3d3b31752bb484c07" + }, + "vllm/config/compilation.py": { + "path": "/vllm/config/compilation.py", + "sha256": "c9cec5c7200e8e559810ec8c30113ad61dab6780f9f7fb3c116bd0d9b5a43065" + }, + "vllm/config/device.py": { + "path": "/vllm/config/device.py", + "sha256": "7b82eee02ceb5842337451a27a3d5729920c47e25e8f6bf3997f5146f9330a9c" + }, + "vllm/config/diffusion.py": { + "path": "/vllm/config/diffusion.py", + "sha256": "1fa9fd2478a866098a28a3586b55af2f9738656b7813a55d76539c10dd99fe8d" + }, + "vllm/config/ec_manager_config.py": { + "path": "/vllm/config/ec_manager_config.py", + "sha256": "418b387dbe7bdf67deddce331c205768a2d42aea37141f59fb02a8a1528e3552" + }, + "vllm/config/ec_transfer.py": { + "path": "/vllm/config/ec_transfer.py", + "sha256": "0eabb2c25194676d23c6acf59562672a1dd24415043ac5737d621ce0d681ec70" + }, + "vllm/config/engram.py": { + "path": "/vllm/config/engram.py", + "sha256": "34043a22385a041d4e9be8857f64174c990c2ca8308b97b6a952b5ab96c20ee5" + }, + "vllm/config/fault_tolerance.py": { + "path": "/vllm/config/fault_tolerance.py", + "sha256": "b166b24373d599fb15ddc575e3061cf0dcb42174d0369d8468008e7ffbb2a4e2" + }, + "vllm/config/kernel.py": { + "path": "/vllm/config/kernel.py", + "sha256": "27e23c584cf862f4091858db6dc85bbc2a01f4baf9dca3f232ae6f3bac02390e" + }, + "vllm/config/kv_events.py": { + "path": "/vllm/config/kv_events.py", + "sha256": "b1dbaee3e6830e381e9157fe3bab0d65c357da88ff7cdf8b1e4b3a4e75c82a87" + }, + "vllm/config/kv_transfer.py": { + "path": "/vllm/config/kv_transfer.py", + "sha256": "506fae7a9d7f32cb3646156cf9249a856f6317dff6c4c85db70efd34418c429b" + }, + "vllm/config/load.py": { + "path": "/vllm/config/load.py", + "sha256": "bd6431c22e078362d749a56a2c84145432ebf2605d8bcfa2ac679182d18ed630" + }, + "vllm/config/lora.py": { + "path": "/vllm/config/lora.py", + "sha256": "ed6cf6575f5950f079a62f904caeae93d1a4745dd8c21788b74367883bcd4b08" + }, + "vllm/config/mamba.py": { + "path": "/vllm/config/mamba.py", + "sha256": "2090f791201ca45dd4f1d72b8651268890eb07574b6084721194eb8fdf612c48" + }, + "vllm/config/model.py": { + "path": "/vllm/config/model.py", + "sha256": "f4168b67cc93ce72ff2a6d4c66974223e32fd0f1fab4c05e44bd68a275e18d69" + }, + "vllm/config/model_arch.py": { + "path": "/vllm/config/model_arch.py", + "sha256": "2babe28329d7b60b4e205f6d72c687f0f66e6535aa2f20411469e5ec362f6b5f" + }, + "vllm/config/multimodal.py": { + "path": "/vllm/config/multimodal.py", + "sha256": "271911aee151f17f092228cecee82af0713e9a47340ffdf66834ca7638a50d22" + }, + "vllm/config/observability.py": { + "path": "/vllm/config/observability.py", + "sha256": "d57c59ec776477ab0a20e9f2b945bc954d8ea3737c869259480e9aa10dfb9f6d" + }, + "vllm/config/offload.py": { + "path": "/vllm/config/offload.py", + "sha256": "6f2db3d9a2730588473d5155811690c6241b167a21dcb62fbbd9ebb6386de42c" + }, + "vllm/config/parallel.py": { + "path": "/vllm/config/parallel.py", + "sha256": "f012ace89e3fb730a467f729f602679bc145c49f0d10721811c9d818570e7b2b" + }, + "vllm/config/pooler.py": { + "path": "/vllm/config/pooler.py", + "sha256": "9f01913dcb7bccbf9b672b16643f18471ae202455992e8afaf0725a17f2b3d08" + }, + "vllm/config/profiler.py": { + "path": "/vllm/config/profiler.py", + "sha256": "04d24fa1dc7cfedca6b5c7d9115f7f7021722fc46a5b15234a1e3b3a506c93e5" + }, + "vllm/config/quantization.py": { + "path": "/vllm/config/quantization.py", + "sha256": "acffc52f525b39a88efd656f1ed705ce3a1b758298bb0684fac7694776bc10b4" + }, + "vllm/config/reasoning.py": { + "path": "/vllm/config/reasoning.py", + "sha256": "2c4f7bdee48a9fb3d93787c4c32361c2411417cce452cfde86808d8759977861" + }, + "vllm/config/scheduler.py": { + "path": "/vllm/config/scheduler.py", + "sha256": "822179da62be4bca0619c8590082ae09123f5c4415f9cc2037be673748239edb" + }, + "vllm/config/speculative.py": { + "path": "/vllm/config/speculative.py", + "sha256": "9c642a87264339c0dbc1d0b57330572149df0f9d5e16c6893b9895e50a619e19" + }, + "vllm/config/speech_to_text.py": { + "path": "/vllm/config/speech_to_text.py", + "sha256": "bf4a566fbde6a1cec1e209070b739650c3302c12696739c88049cb8f723a4c3f" + }, + "vllm/config/structured_outputs.py": { + "path": "/vllm/config/structured_outputs.py", + "sha256": "55649776594349b8b4aa3e08fc4c88068366732a486d6fb235079188044aa829" + }, + "vllm/config/utils.py": { + "path": "/vllm/config/utils.py", + "sha256": "d035e9e488ba92b6c47a96cf05d9b2a850d53eda8a05115b22ff9af8dbc2fc64" + }, + "vllm/config/vllm.py": { + "path": "/vllm/config/vllm.py", + "sha256": "956b812e5a719bcbfa3a3958801361b38b9c928c96b8c073311bbb96376dfb7a" + }, + "vllm/config/watermarking.py": { + "path": "/vllm/config/watermarking.py", + "sha256": "30e6620a3cd7529f0736ad55e38bc326a6a78dee4552f0722208400041c94a1f" + }, + "vllm/config/weight_transfer.py": { + "path": "/vllm/config/weight_transfer.py", + "sha256": "92edd9e5ea90c97a8f3c5f20abf1734a105ee1f3f89e306e7ba87e758f1f767e" + }, + "vllm/distributed/__init__.py": { + "path": "/vllm/distributed/__init__.py", + "sha256": "97f28c30b32662af8cab163939e4ee423037f11630752e13b55cbc25a7d0ab71" + }, + "vllm/distributed/communication_op.py": { + "path": "/vllm/distributed/communication_op.py", + "sha256": "3c3f8ac60db38ece891d39dc1e2f6f1947ad438685893d2e5777d072320bd1b8" + }, + "vllm/distributed/device_communicators/__init__.py": { + "path": "/vllm/distributed/device_communicators/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/device_communicators/aiter_custom_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/aiter_custom_all_reduce.py", + "sha256": "f8eb027ce7a85d94af6260960ceb7f36fc6f1406c9af9c9b6285fddb3f178009" + }, + "vllm/distributed/device_communicators/all2all.py": { + "path": "/vllm/distributed/device_communicators/all2all.py", + "sha256": "1f1b69236acd3cd7bd94520fd6d591bfd31b57c4bc7c9f9f4161ea8bbd0c5f26" + }, + "vllm/distributed/device_communicators/all_reduce_utils.py": { + "path": "/vllm/distributed/device_communicators/all_reduce_utils.py", + "sha256": "ed0ab4dd05b2519a6313892e68824c97b540034664d7f8c3d031b322e33e1bfc" + }, + "vllm/distributed/device_communicators/base_device_communicator.py": { + "path": "/vllm/distributed/device_communicators/base_device_communicator.py", + "sha256": "4a7670f12ed7c7621b25d476e2687c24ca01f3be183fff4a6a25337596fe506b" + }, + "vllm/distributed/device_communicators/cpu_communicator.py": { + "path": "/vllm/distributed/device_communicators/cpu_communicator.py", + "sha256": "e1856c8e91cfbbb4d9ce990c1236e258ba4021e226afcbab645653380b38d64b" + }, + "vllm/distributed/device_communicators/cuda_communicator.py": { + "path": "/vllm/distributed/device_communicators/cuda_communicator.py", + "sha256": "102d95c67ec798cf352b817ba92e8abc9da37f30d1bbdf3aab45d3927b627b93" + }, + "vllm/distributed/device_communicators/cuda_wrapper.py": { + "path": "/vllm/distributed/device_communicators/cuda_wrapper.py", + "sha256": "333b6d9ed173e7a18c7f2b6627a3c9c9ed88892ce52015f05e29d6d245e48ee3" + }, + "vllm/distributed/device_communicators/custom_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/custom_all_reduce.py", + "sha256": "a048c1327c23580805600c0c951831bec333b1ffc4eb26a0e3d34119c4f0c445" + }, + "vllm/distributed/device_communicators/flashinfer_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/flashinfer_all_reduce.py", + "sha256": "b4359760e9b55963676109a5c3a015fb82e190d4df1d021de9ee01e7814cbdda" + }, + "vllm/distributed/device_communicators/flashinfer_pcie_ipc_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/flashinfer_pcie_ipc_all_reduce.py", + "sha256": "8b67b0fc356a565095f56b475cc89c513e3a5eff051ab1c52e5beb0c1a79e9f2" + }, + "vllm/distributed/device_communicators/mnnvl_compat.py": { + "path": "/vllm/distributed/device_communicators/mnnvl_compat.py", + "sha256": "72ee1e6f9571b4c8ecbd9f60cd469d1b565cb79cab519a688a93f290906a2615" + }, + "vllm/distributed/device_communicators/pynccl.py": { + "path": "/vllm/distributed/device_communicators/pynccl.py", + "sha256": "882fb83c5a3c565a3f8fd664b79f5ceae566dca180019ecafd74bc8c11d9f8cf" + }, + "vllm/distributed/device_communicators/pynccl_allocator.py": { + "path": "/vllm/distributed/device_communicators/pynccl_allocator.py", + "sha256": "390e2576cbf4ae06341ca4dab24fc7e4d4f7c24dd444329ed05d828a9ce91460" + }, + "vllm/distributed/device_communicators/pynccl_wrapper.py": { + "path": "/vllm/distributed/device_communicators/pynccl_wrapper.py", + "sha256": "ce63c8da57bb88d4cf89956bd70bb63f0f44bfad468ddb37b765611551f6d99f" + }, + "vllm/distributed/device_communicators/quick_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/quick_all_reduce.py", + "sha256": "8aacb23e7c297b0ae2f80d99c5affd2e7517115d7874be51069d14a44db7b5f2" + }, + "vllm/distributed/device_communicators/ray_communicator.py": { + "path": "/vllm/distributed/device_communicators/ray_communicator.py", + "sha256": "332c37f65495b60564d61db59bc2d30ca0236adc33442d01464790bde9aec897" + }, + "vllm/distributed/device_communicators/shm_broadcast.py": { + "path": "/vllm/distributed/device_communicators/shm_broadcast.py", + "sha256": "f3e7a3f3ff713fccbd535e0d41650ee05bdf8677e83d4b90519910645022c30b" + }, + "vllm/distributed/device_communicators/shm_object_storage.py": { + "path": "/vllm/distributed/device_communicators/shm_object_storage.py", + "sha256": "e097bf7ac0141fe8db4131e8fd553ca2ad5b0600b22a56f3924af6b795e7207c" + }, + "vllm/distributed/device_communicators/symm_mem.py": { + "path": "/vllm/distributed/device_communicators/symm_mem.py", + "sha256": "b06e3ddb9ae880a30ec4a103ce32eb9794223bb0293832e89572af28adaaa544" + }, + "vllm/distributed/device_communicators/xpu_communicator.py": { + "path": "/vllm/distributed/device_communicators/xpu_communicator.py", + "sha256": "527cbfb250760abc62096ee7cd612307b821f21b72dee1687ad866620ec89b6d" + }, + "vllm/distributed/ec_transfer/__init__.py": { + "path": "/vllm/distributed/ec_transfer/__init__.py", + "sha256": "061405bb51df7409c9938b62e25caa8bd6ebf85da6d1700dbd4affe2a0825135" + }, + "vllm/distributed/ec_transfer/ec_connector/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/base.py", + "sha256": "22d4913375bb622473fbe1a77f9376b804949cd8a7e31e9518208f9561d161e2" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/common.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/common.py", + "sha256": "e2267abd8d00a6d2605e1a82ea5c73396a71b427452eab469fcca0134c334e7c" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/connector.py", + "sha256": "72cd35d9fd754a2992dd090a8af13c91e0789b4038ac29276750d823120235db" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/base.py", + "sha256": "19e8df88b0fa831997896355ecdd49e0d86cb074cd7ae28aed0b328b0bb3ab2e" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/zmq.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/zmq.py", + "sha256": "435641c0e37551ab4937855abd067be26905b91215e759cbd9d28a419a34ff9a" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/base.py", + "sha256": "3be698aeb67d32ee3741e76b2fb71806941c587578583acf8fbc42fbf22b46a5" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/nixl.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/nixl.py", + "sha256": "03af8f6549a6027b7262a482907af591e45f28b9b1c5a3408bbc6600e38797e5" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/ec_shared_region.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/ec_shared_region.py", + "sha256": "e40607952c9920024455eca2f419e8c3ef1de9a4d8b27c147a33bb941b8c08b1" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/protocol.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/protocol.py", + "sha256": "05878336884396bfbef77b96b0fa6359f6fa0aba912961f14a84f5a436f27038" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/__init__.py", + "sha256": "01c42385bf3a55cff09cc05ba956f6dd4b8b6b986bf4d6eca4e566cb045b48e0" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/embedding_cache.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/embedding_cache.py", + "sha256": "7359fb980af1fc30b3253681310ef636e2b4a19134e04a93270c9c45de2572d8" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/session.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/session.py", + "sha256": "5973548a919e13c866222b91d502686a6757a31e5a5664b879bf2887ed9fb212" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/utils.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/utils.py", + "sha256": "160ac665f20f2c75b343c1e784084f2b0b4d1cf8fdb28ee15deee4dc8ed0ce45" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/worker/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/worker/__init__.py", + "sha256": "f08d296d3560c42173ae8af961af4a768033ccf1e36e9c17c0cdd53013d0c52e" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/worker/descriptor_buffers.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/worker/descriptor_buffers.py", + "sha256": "be7c81be214e995da8499105ba485854d9c19d6f8e905f8f1b87b83694ca0864" + }, + "vllm/distributed/ec_transfer/ec_connector/example_connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/example_connector.py", + "sha256": "09022ce07a89114bb65d9befd2e60873453aed11bbac8c0a75c1e6084e785a5f" + }, + "vllm/distributed/ec_transfer/ec_connector/factory.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/factory.py", + "sha256": "d6cedca0a99c3dd2b03cd1c15d17472b983e3f7d8f5baf4a12eecaf6abedb817" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/__init__.py", + "sha256": "1cbfc2f95f8f4d48a9253056eb1fd4b562062884e3fd5cb6571583c352fc16f3" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/config.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/config.py", + "sha256": "98c60696f79d1de67d2364cd9e8a42a393b5c8e17ed9af2f971368e47891d7b3" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/control.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/control.py", + "sha256": "58e0d1a423fbe958bfa586ac26a17107e08d0b31d044b4c74ab4dde880e7ca9b" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/memory.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/memory.py", + "sha256": "d5e90b1348de670a70f110d58eedcbdbd053db72c21dd007c3f5275c53951149" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/metadata.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/metadata.py", + "sha256": "497a7e6dfffb7fce80a41d5989f96119b970c143df77bb9d0f9c91d7a46e8c42" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/producer.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/producer.py", + "sha256": "97fa4d0b19475574778eab02f55fad73db9642beb9156da890314fd53fa1a7ab" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/reservation.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/reservation.py", + "sha256": "4790bc65cde4db5f17733ca2c2910980ba594a8a9b79ee27c5b957dffd4c1113" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/scheduler.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/scheduler.py", + "sha256": "53004b62529a31fdd80dfb2e6026610b95041a77e91f731ae526fefd84e7968d" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/state.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/state.py", + "sha256": "92f375d6c5cc9c83dbe95a7977ad8eb0f1b5629ccee92968bcacdc94eee15d65" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/transfer.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/transfer.py", + "sha256": "ada2113a5402054f1149d3edc2537f4e5e1bd696c9b17291c9f2b4cbf6b59753" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/worker.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/worker.py", + "sha256": "89eb91bb64845b3b121d502972a6b04d448714253becd2ea662e5691cd5acdd7" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake_ec_connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake_ec_connector.py", + "sha256": "aaebab4711bc00dd0c622dfbfd8639fc41e7ed5d1658d7d68fe33e4d5fbef3ba" + }, + "vllm/distributed/ec_transfer/ec_connector/utils.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/utils.py", + "sha256": "11b9014b9c0697f8846deff1a55a22fa86a15dc2ac3e139442fb6d513ac03059" + }, + "vllm/distributed/ec_transfer/ec_transfer_state.py": { + "path": "/vllm/distributed/ec_transfer/ec_transfer_state.py", + "sha256": "9487a41f23fa1a4fa6dfca8b42b8e97a0ee19d8406ffd1dcf4bef66315180827" + }, + "vllm/distributed/elastic_ep/__init__.py": { + "path": "/vllm/distributed/elastic_ep/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/elastic_ep/elastic_execute.py": { + "path": "/vllm/distributed/elastic_ep/elastic_execute.py", + "sha256": "b8f60a4183c79ff6051095b5f95bb385bc7fea0cffe8cd9ebc9087ab0e9f01b5" + }, + "vllm/distributed/elastic_ep/elastic_state.py": { + "path": "/vllm/distributed/elastic_ep/elastic_state.py", + "sha256": "fbf049199841a086fdf2fc1ab8498ef017ad3bf319db65c3ae61acbb536d2e10" + }, + "vllm/distributed/elastic_ep/standby_state.py": { + "path": "/vllm/distributed/elastic_ep/standby_state.py", + "sha256": "15282597550ebd0e07b8492ff192aea1ec0dcec8f0ad34009123e1002cc140c1" + }, + "vllm/distributed/eplb/__init__.py": { + "path": "/vllm/distributed/eplb/__init__.py", + "sha256": "1b9c2ee22abb5888c354c5aa01f0944f253e5e24e135d019778398bbe495a628" + }, + "vllm/distributed/eplb/async_worker.py": { + "path": "/vllm/distributed/eplb/async_worker.py", + "sha256": "424328600ad1003286fc5dfffa1f9482007314c060947818b2f94a8b97811f5e" + }, + "vllm/distributed/eplb/eplb_communicator.py": { + "path": "/vllm/distributed/eplb/eplb_communicator.py", + "sha256": "ba30d9d40e7b81d3f42aa9041d2f328edca4073cfe2de920285eb68375501ed8" + }, + "vllm/distributed/eplb/eplb_state.py": { + "path": "/vllm/distributed/eplb/eplb_state.py", + "sha256": "2f06bc8c63f3fdf55edb5032ae55c0ffcac3e67720ce74ea312e3d141b12acf4" + }, + "vllm/distributed/eplb/eplb_utils.py": { + "path": "/vllm/distributed/eplb/eplb_utils.py", + "sha256": "058af6104faa6d4085c1dca80bbe60d92bf0a7ec9cd92c775a180546c9d8c9c3" + }, + "vllm/distributed/eplb/policy/__init__.py": { + "path": "/vllm/distributed/eplb/policy/__init__.py", + "sha256": "daeb266c88442832b1ab8c8c4cc064891b38b9e9ba00aea324f926c87dc6d37e" + }, + "vllm/distributed/eplb/policy/abstract.py": { + "path": "/vllm/distributed/eplb/policy/abstract.py", + "sha256": "b9fd34c28bbfdded03360d7f3f6f8fb978e82689190d7ae4501dfe520e958c62" + }, + "vllm/distributed/eplb/policy/default.py": { + "path": "/vllm/distributed/eplb/policy/default.py", + "sha256": "3b54229e6240d050480390f6b29d4744fd38437d23719f78a6decf7002296a29" + }, + "vllm/distributed/eplb/rebalance_execute.py": { + "path": "/vllm/distributed/eplb/rebalance_execute.py", + "sha256": "b387e228791149018536eee96cf955b33ba79d801cdc36849d1b47a580ec2597" + }, + "vllm/distributed/kv_events.py": { + "path": "/vllm/distributed/kv_events.py", + "sha256": "de08f01e8736881560256c350a3b6418999dd4aa30f9c6ec9159527f7ed6899a" + }, + "vllm/distributed/kv_transfer/__init__.py": { + "path": "/vllm/distributed/kv_transfer/__init__.py", + "sha256": "c1be4e58ec6923bae607a355ad22891c740f056a69ff7358b1e10ea3fd2680ea" + }, + "vllm/distributed/kv_transfer/kv_connector/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/base.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/base.py", + "sha256": "2ae2a2c48f5731f3533166a75440fe91e764332305b5d713df840edba970789d" + }, + "vllm/distributed/kv_transfer/kv_connector/factory.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/factory.py", + "sha256": "add99c93c587b0098b90b1f8fd6940bdd1f15c236c5c6f1a258411863cb902d3" + }, + "vllm/distributed/kv_transfer/kv_connector/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/utils.py", + "sha256": "317ed40dc837671ca6e666165222e641a0f9b3992aea63bbf54de7e13d40b3a4" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/__init__.py", + "sha256": "5beb6ccad12fdcfe1581982da6f18321caca50e73a6b3259ebf3c8dc8b3ffcca" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/base.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/base.py", + "sha256": "97af64220475c6c9e8273438d7b5138b105ebe6944beb783facb36a3bb76f31b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/decode_bench_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/decode_bench_connector.py", + "sha256": "b4151c88cdec28f1ff9259047abc17baf23b892f4b68769a93bf26e0442b9017" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/example_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/example_connector.py", + "sha256": "6226876ef52d10d0d284d29c337ab44698e8bac6abdb2e0ece53b5756c55d068" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/example_hidden_states_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/example_hidden_states_connector.py", + "sha256": "58c22534dcad0fb73599a2d70a2fb104d5b612a4723be5e777f56a56fe07892c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/flexkv_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/flexkv_connector.py", + "sha256": "de4f68c3bd565ed898e47e0b2980049b966ff31888f1957050d30995d4953762" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_client.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_client.py", + "sha256": "bea6ecff2be281c7e96c1551c7bf463cbb01f2964696067c0ebdb683844f9aab" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_connector.py", + "sha256": "e67ed58015090e5eea9d499883f2a9422673d07f8bdbe0ccff7db15d2460de13" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_metadata_server.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_metadata_server.py", + "sha256": "6800e5cf37809f8a8e28c469c14a434db288bc3bf83a8b62ee06910a20c2da19" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/common.py", + "sha256": "8f2c02c08227a9093e6aeb183961aba36b7812cfc29b8c047a2b2c9d82f79c15" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/gather_scatter_helper.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/gather_scatter_helper.py", + "sha256": "08c1b43de34fbeca77357d7576ac1d17cba974b59d695562f68bb713061e7b54" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/hf3fs_mock_client.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/hf3fs_mock_client.py", + "sha256": "bec61a9b0c4b9124b2292d7646d76411da44396389349b53cdcbc46353c8780e" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/connector.py", + "sha256": "8c61094ce0a3a702908f9576f69482e6bf314738a2cbe33a7d3b47258fa0ab43" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/stats.py", + "sha256": "d9383a6ad6ab6b8f812d29d90495407b770eeddb79b86e9d0e3216c0bd16e0ed" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/worker.py", + "sha256": "251c0d8e57e4739c03ce3e1c899a95ff5b1752eb27676c28ab88c4ebd62c4776" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_connector.py", + "sha256": "5991f9ff8832df32bd421eb67e48237270ea0a408180e523810bb43606acf8f3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/__init__.py", + "sha256": "c53be9796e76cde637514bfc40a525d8c09bb2784b406cb516790d8285dfe433" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/multi_process_adapter.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/multi_process_adapter.py", + "sha256": "6480d67b31ed603027a83edf327880a38aee45eaeee2da9a4efa93e95527c166" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/utils.py", + "sha256": "e204fa6a853ac9c122d7a4e9d146902230f81c48d4321ed5edfdbf979dd49ba2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/vllm_v1_adapter.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/vllm_v1_adapter.py", + "sha256": "e6fe55049c6b007248516d69640e2f3a4809f9d286091a1014ae0949987fa8f1" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py", + "sha256": "c712c386a7c57bf0355a1441ba574232c3aa5498fcb70713a2b3f5d18b64f9c1" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/metrics.py", + "sha256": "de1b1797d0448f74370919dbb0278767f390e8f59e00a0c0528abefb302babc2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_connector.py", + "sha256": "516be01320e64b0110e102eeb69a6ba766dd5ac8cb3036db6b97b7d54413323d" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_utils.py", + "sha256": "26877610463fa8e9d6b092772f2551bcc0c3ac794cbe63996df0414666a8ebba" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/rdma_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/rdma_utils.py", + "sha256": "716e5042edecaba36c7ca763474988f32fa09c2668b8260260149df610af8f83" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/stats.py", + "sha256": "f39b2f0b1db2e4f922e27e684a3f7bbf5bb279b82a0a8c3bb0c7ae69b6d14d24" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/connector.py", + "sha256": "17a350bdb89e17e415d6c52a48684dc15c35a804378daf03e1f3bee1b1b123a3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/coordinator.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/coordinator.py", + "sha256": "a8eb6c2157a96e8d25233b82347ac8409a41d6390b4f2c64242119c05911010c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/data.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/data.py", + "sha256": "d3cfefdb4165a24995749cba452641b318065baa95bb1bae62f922a2f8886e7b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/metrics.py", + "sha256": "f2b9ef8927632d142aad11a374d0725c6e619ea0bb7fea9eda3f3895eb7d277a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/protocol.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/protocol.py", + "sha256": "ccb1cf6a84a932a375215627d2aaac482c351a05df015d636d05373a6845b7c8" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/scheduler.py", + "sha256": "283849ff581ec206444cdf5621622377f1c925e8d7e05cb9294af2f3a5094e79" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/worker.py", + "sha256": "55f1682dfd1ed7af689166421337126a0e1d08afa4774a242e098d79e0c1e95b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_common.py", + "sha256": "549bb4fe22dca5095515b9c0712c31cc81a9d4923881e9f112317640fd8c04ab" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_connector.py", + "sha256": "c0f474bc34b579d889fae92eaf43eaca241be51a4697a187a942f0df4e6b6a98" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_engine.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_engine.py", + "sha256": "d842f3772fc6588d5a329a67572324cb74709aa3df4033e64c791a1e706c8e88" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_layout.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_layout.py", + "sha256": "2b4ec046a78897236b0626939bb828b6ec095355097d10bca39e5f3e1c992553" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/multi_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/multi_connector.py", + "sha256": "12d8387239f3194f2cb63ccbd64824648047210323572d66671e6a1eed349fc3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/__init__.py", + "sha256": "cc3145fe3b6d219a267bf40a0f7c0cc9430e4289f94acab2df761b99b671e7ba" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py", + "sha256": "7a1db8c54e4cd846bdac747344f2aea2c2fcf507817928796063225223b7e169" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_worker.py", + "sha256": "49a2e4faf99bef146b5a1d4d18d48f240b1e561c438252274494b359db96ef52" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/connector.py", + "sha256": "b6a0dc916d052f344be72ecfcb111509c13580102c11a860fa726cf0888949a9" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/metadata.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/metadata.py", + "sha256": "2b23a07c1ec5ac5490c3b818737c7192e344ea9f52cd5623f75939f741ab4e21" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_scheduler.py", + "sha256": "ac3daf8e2246581fec84ab28f2133569421b62c32a120be4923e2f4d0f2f9de9" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_worker.py", + "sha256": "e5060c9b6cf022de35ca3d1da7a369cd6a6a2dea26219af9f7633aaf78af8a76" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_scheduler.py", + "sha256": "2d9008e33937a4d6c5cf9cc2f96160f2bdbc8e987fe37f0798a7fd7eb84c9572" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_worker.py", + "sha256": "87de3ea383dd3aa95fb2c287ea26ded8a330859cc1295f9faa69047e80865c2c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/scheduler.py", + "sha256": "09f1bfe7075b926b26a94529480e33b62c3ac273ff826f6c502084f08b1b2a08" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/stats.py", + "sha256": "3e710654e0b68d1a8592f0c4735c81b22f4bf698fb1a2dfea126d35bf2dd1ef2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/tp_mapping.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/tp_mapping.py", + "sha256": "2d43607f98701b2fad6cc0ac2767619a80b7fc2b3a3c2eb6ed0da4fb05dcd8f6" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/utils.py", + "sha256": "93de863fc8307a61d40b62f1b176b57ae93c363d34b9e9ddc8e666265b6d45dc" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/worker.py", + "sha256": "5134a36ac100ce7a64f5311029a37ac12c38d91093f63100f51f7fe53ea7c3ee" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/canonical_mapping.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/canonical_mapping.py", + "sha256": "e0b3c6f9806a650e0370c43c5068fc31c0fec94615089e15fdf270d7d96f2b64" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/common.py", + "sha256": "9b3f042c6fa1581d10e8f688d2d9bc927bb41b780a9ea01f514d57228e20c978" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/config.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/config.py", + "sha256": "aea82e60889e78dcad8564ec8285b65a6a372824a1545a98ea8e78b6f4fd418a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/events.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/events.py", + "sha256": "d7039b67be95fd444966628184040a94880873c0611c0e6e7525a22650ffdefb" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/metrics.py", + "sha256": "13d76df014e86691f58dc89a879f9808b124690c9267dd5fa3b2d4004d4c5fdf" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py", + "sha256": "2c5282f4a3165cd787fb355e215e3869f1bdd3f2c795b2155fc537c9d135191a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/worker.py", + "sha256": "acc2df53262441dfc6421a3af7f0cbd68cbfaedbd42bbc384d8e1da2d965d194" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading_connector.py", + "sha256": "cdc16ca7339a10e1993bd6220e6273f86a4e99779f58f25098a24ad31bb0dbd8" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/simple_cpu_offload_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/simple_cpu_offload_connector.py", + "sha256": "96238ca82ccf07a1eeb59b8f66de17b09034e3eb993ad9a0a836511d3f69706b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/ssm_conv_transfer_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/ssm_conv_transfer_utils.py", + "sha256": "59a949709482e65a007fbe5352fe9b4bb54c2dcc10ad2c1c41f754b6e13299f4" + }, + "vllm/distributed/kv_transfer/kv_transfer_state.py": { + "path": "/vllm/distributed/kv_transfer/kv_transfer_state.py", + "sha256": "2e5fe09438d6e2ee642f8a26cf7dcf632e870d955d30baf002b76a8bfe836d05" + }, + "vllm/distributed/nixl_utils.py": { + "path": "/vllm/distributed/nixl_utils.py", + "sha256": "0bffa3c052c9f67472b1c0bc3816114891b010c968bf4b8a292e7da4d687db53" + }, + "vllm/distributed/parallel_state.py": { + "path": "/vllm/distributed/parallel_state.py", + "sha256": "d9b10ad56833ebc08a753e1a050ef0989c30d4134021b7b7b00150b7bd01adc6" + }, + "vllm/distributed/stateless_coordinator.py": { + "path": "/vllm/distributed/stateless_coordinator.py", + "sha256": "f52848fbe985ed47b1f3e3ca555314736ca06436e8d738ab4390101f0672dcb0" + }, + "vllm/distributed/utils.py": { + "path": "/vllm/distributed/utils.py", + "sha256": "792146b357139e705064a68d3b66858de8a0baaca4dc7db1232fa217d45db231" + }, + "vllm/distributed/weight_transfer/__init__.py": { + "path": "/vllm/distributed/weight_transfer/__init__.py", + "sha256": "3fb9d4712b7c131d522f5e76e73cd8c333f3cc7af86e2d5ecf9b61b57b3b7f5a" + }, + "vllm/distributed/weight_transfer/base.py": { + "path": "/vllm/distributed/weight_transfer/base.py", + "sha256": "8ab06feb04f1379d0558fbdb77fde46bc84f179e0a26742cabab937e88caa38d" + }, + "vllm/distributed/weight_transfer/clients.py": { + "path": "/vllm/distributed/weight_transfer/clients.py", + "sha256": "ff85c79c350241e6d2749ca23c9d295a3289b4b62bfdf0257d32eb94a0151d36" + }, + "vllm/distributed/weight_transfer/factory.py": { + "path": "/vllm/distributed/weight_transfer/factory.py", + "sha256": "4e979eeac8c5bcdbffb10eb4765cfb30120fa7595c6c2561d3fa1a966ced61c8" + }, + "vllm/distributed/weight_transfer/ipc_engine.py": { + "path": "/vllm/distributed/weight_transfer/ipc_engine.py", + "sha256": "1af578293f387a19073c322b24143c3ae4716ce0c5d2bac2a4ef26fe20119330" + }, + "vllm/distributed/weight_transfer/nccl_common.py": { + "path": "/vllm/distributed/weight_transfer/nccl_common.py", + "sha256": "7b2ef7dc7481c3f478f17c49aa36c7bed54142ec5c93d36ed8426c8fdf09e500" + }, + "vllm/distributed/weight_transfer/nccl_engine.py": { + "path": "/vllm/distributed/weight_transfer/nccl_engine.py", + "sha256": "7fd020c919dc7b4723fb78e64da977b180d0fef0cd21df955a037b848dbaa008" + }, + "vllm/distributed/weight_transfer/packed_tensor.py": { + "path": "/vllm/distributed/weight_transfer/packed_tensor.py", + "sha256": "d0a27fb0be1dc029bd5a1d44fdb57a5e54aa4cd74308bedc339e86ac02c7494c" + }, + "vllm/distributed/weight_transfer/sharded_rdt_common.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_common.py", + "sha256": "be0b13801f24e7b62999b19d733c030510353603a2d5320d5dc98ee02daf22a2" + }, + "vllm/distributed/weight_transfer/sharded_rdt_engine.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_engine.py", + "sha256": "2f791970b4815511a7578ef6c957e7da97b071d26a39087a09a17475909791ee" + }, + "vllm/distributed/weight_transfer/sharded_rdt_fake.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_fake.py", + "sha256": "ee11164e17b5f2793252ce77741b8b94e0583046abf896a590131b2008d1fbb9" + }, + "vllm/distributed/weight_transfer/sharded_rdt_trainer.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_trainer.py", + "sha256": "dd413ff461d41826ccd3eb87d3df22f6cd7f24e09aac7644e3e5b40d7beec484" + }, + "vllm/distributed/weight_transfer/sparse_nccl_engine.py": { + "path": "/vllm/distributed/weight_transfer/sparse_nccl_engine.py", + "sha256": "e11b409454dda2b05ea34e8115ac19027c5e65cb2a5e9682c494f16a50e978f4" + }, + "vllm/model_executor/determinism/__init__.py": { + "path": "/vllm/model_executor/determinism/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/determinism/batch_invariant.py": { + "path": "/vllm/model_executor/determinism/batch_invariant.py", + "sha256": "af8f8d256a48fc214edf426fbe891fb15bd8b1d7ae98b811c736ff1eb0fae798" + }, + "vllm/model_executor/determinism/batch_invariant_configs.py": { + "path": "/vllm/model_executor/determinism/batch_invariant_configs.py", + "sha256": "72ea0d4df0ab5ae288abb7df5c203d2ad5f1709c7295d87ec72da775fddc1b7a" + }, + "vllm/model_executor/layers/fused_moe/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/__init__.py", + "sha256": "64a32665be6d5afcfbaf7a0915717267278b66b880b908b0263ea58f08e51b5e" + }, + "vllm/model_executor/layers/fused_moe/activation.py": { + "path": "/vllm/model_executor/layers/fused_moe/activation.py", + "sha256": "78dec0e85e0c040304515f64ccf8f2c6a7a2e5b9f1124a2138a97d9a02585541" + }, + "vllm/model_executor/layers/fused_moe/all2all_utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/all2all_utils.py", + "sha256": "dc4750a446f7de31d09a46034da5fdf479bc169af90f47aa9af8ae15e67b0828" + }, + "vllm/model_executor/layers/fused_moe/b12x.py": { + "path": "/vllm/model_executor/layers/fused_moe/b12x.py", + "sha256": "ee76cc6aa801e24be8ec78a9e8502061ad48667d5ff8711e43f68fba912425bd" + }, + "vllm/model_executor/layers/fused_moe/config.py": { + "path": "/vllm/model_executor/layers/fused_moe/config.py", + "sha256": "a3a87cebcc7ac85d73f471dcfafc2d899c6fc08f264777b74a0e919adac9e03f" + }, + "vllm/model_executor/layers/fused_moe/deep_gemm_utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/deep_gemm_utils.py", + "sha256": "8fdcd857eb333f9c68902105f157568d52067c94ba1e2df6dbfe0474ef1f4c02" + }, + "vllm/model_executor/layers/fused_moe/eep_reconfigure.py": { + "path": "/vllm/model_executor/layers/fused_moe/eep_reconfigure.py", + "sha256": "9d7580265e8563e1140c2bb4c3a81a35ddd54903f5ec0a2720ffc064681f02f9" + }, + "vllm/model_executor/layers/fused_moe/expert_map_manager.py": { + "path": "/vllm/model_executor/layers/fused_moe/expert_map_manager.py", + "sha256": "308c00f63fcb6f44518ec3a56d8f902c7bba75928c2e3aea30fbe1f3f473973b" + }, + "vllm/model_executor/layers/fused_moe/experts/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a16_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a16_moe.py", + "sha256": "53deea255175171971422d14082ad139b5ec7b62e21429a4c7cc0ebbefd29cdc" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a8_moe.py", + "sha256": "f3fc51b95ed89862381908a0134e326228827f44854248db9585a9c4899c34f4" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp8_moe.py", + "sha256": "af6db1760961a5a71234f8b1cdf42e9e30a236e13601b0826a75110b79724948" + }, + "vllm/model_executor/layers/fused_moe/experts/batched_deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/batched_deep_gemm_moe.py", + "sha256": "b0cd4ea706583518dc608fb56f832fc3595f24bd863b03ef1e8c22b36b873508" + }, + "vllm/model_executor/layers/fused_moe/experts/cpu_int4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cpu_int4_moe.py", + "sha256": "67170af3ba9dc4c4f71d78a72efc3fa4e366eac614936a79911dae5c75ac1864" + }, + "vllm/model_executor/layers/fused_moe/experts/cpu_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cpu_moe.py", + "sha256": "0754cd4ff1b28e6d3932a67609d335acefd28f95a841f0492923813356a6d81e" + }, + "vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py", + "sha256": "db901bdbcd3fdac23a1d74e39c51e67f14a82be787b2fd704ed1e787372ae868" + }, + "vllm/model_executor/layers/fused_moe/experts/deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/deep_gemm_moe.py", + "sha256": "16911a64a72eafc26a1bcb544a91f90144d85dc41e3ee57cf20e89925227bbb7" + }, + "vllm/model_executor/layers/fused_moe/experts/fallback.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fallback.py", + "sha256": "1bdd0a4f2ebaa40ec96a5aacc07aee61511af59e6324ce456aa65003b6e2991a" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_b12x_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_b12x_moe.py", + "sha256": "e613afe5da2742e42c717c1a0a56bd9e1c7e3e0452a828db0013d81063518954" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_batched_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_batched_moe.py", + "sha256": "295254dfeeec8df3eb8110e6f659a946cb9cded3de1565ecad4d741b3c3f3e00" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_moe.py", + "sha256": "08578bcd0cf72d6a470e40950175e73639efaa6d8d23c6da0869345312b229c9" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutlass_moe.py", + "sha256": "52887cec5fe628e0a4e7793deb546b40f6c29f7362b3b436c10ca36934ab9826" + }, + "vllm/model_executor/layers/fused_moe/experts/fused_batched_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fused_batched_moe.py", + "sha256": "2435587fc7f8fe8ea341ea0eb8f14c11f3f5b31fbbb9b29ce569ad3bace6e6a0" + }, + "vllm/model_executor/layers/fused_moe/experts/fused_humming_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fused_humming_moe.py", + "sha256": "a6830a76ff7f4cd3479b9c8372a30d03e8301604555cbdbcd9ac89a813b7431a" + }, + "vllm/model_executor/layers/fused_moe/experts/gpt_oss_triton_kernels_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/gpt_oss_triton_kernels_moe.py", + "sha256": "1613a7a6b256e8faee6fdcfae84f293492db6229d28ceb3e8a8d6093af480e36" + }, + "vllm/model_executor/layers/fused_moe/experts/int4_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/int4_emulation_moe.py", + "sha256": "f12857caf0671a341687ad3c5f48616b816ed51e1bcbdefa0a7edbecdb81a79d" + }, + "vllm/model_executor/layers/fused_moe/experts/lora_context.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/lora_context.py", + "sha256": "9b41eefaaa57c5dd0dc54217ef95978821b0c52e90ea4db8b0752e08452bd3e5" + }, + "vllm/model_executor/layers/fused_moe/experts/lora_experts_mixin.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/lora_experts_mixin.py", + "sha256": "b2bc55ed6be98b526c6a5698e2d98300650e78555f56b1820e58c04888e2a373" + }, + "vllm/model_executor/layers/fused_moe/experts/marlin_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/marlin_moe.py", + "sha256": "93916b721548e6194dc70cf6cec224b4b1456a0cc0980235e97beba7bf36541d" + }, + "vllm/model_executor/layers/fused_moe/experts/mxfp8_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/mxfp8_emulation_moe.py", + "sha256": "d09c62ad1398c51ff6f515f2a61014ee9e9a9798d0fe9762c47f446efc5edbef" + }, + "vllm/model_executor/layers/fused_moe/experts/mxfp8_native_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/mxfp8_native_moe.py", + "sha256": "01a42cebf18189e566034111b2145573c655319e8af1a56db60d53a319c40613" + }, + "vllm/model_executor/layers/fused_moe/experts/nvfp4_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/nvfp4_emulation_moe.py", + "sha256": "f24467762b60702f0df122ed64786be839a838a9b6cafaecbd04d35fbfedb189" + }, + "vllm/model_executor/layers/fused_moe/experts/ocp_mx_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/ocp_mx_emulation_moe.py", + "sha256": "dcaa60a9ebdb0bd8223b37af41f018ce7f95716ec7cd8526850f4433a579213b" + }, + "vllm/model_executor/layers/fused_moe/experts/rdna3_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/rdna3_moe.py", + "sha256": "e4abd802dc2f0ad9b338ebde397633c761d881c37813e2dc229902c526b597d8" + }, + "vllm/model_executor/layers/fused_moe/experts/rocm_aiter_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/rocm_aiter_moe.py", + "sha256": "bf09a7b783f5752d61cab76221b32b598d8846d801ee39dc9209d636c9659c6f" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_cutlass_moe.py", + "sha256": "ffce5ad627c540940d122d8df7981644b2eb35d07d480995c0f4f30517815fac" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_deep_gemm_moe.py", + "sha256": "c7209fa5e1ccb184a68b37a0706fc571a76696c2ae79802ddc7f889b1c29684d" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_moe.py", + "sha256": "806fbccfe30f5fbd578acf773add99bdf022b12d617958bd6281aef6de369701" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_bf16_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_bf16_moe.py", + "sha256": "76256de96fefece9c41ffb1108487919e24da364cf4412c6c3474498aba59137" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.py", + "sha256": "b54c7ceb45e5d07aa905f42ea44caccf85ca35ba9fb825d4c01947764510f68b" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_lora_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_lora_moe.py", + "sha256": "dd35a9e4242c0dc8d691168813e14bd5543e591f02ee529d0691e07651942c5a" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_mxfp4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_mxfp4_moe.py", + "sha256": "fe780f125a3dc3ba919659e9b85340bd32afcbfe47733a002bfdfb92eadf400c" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_mxint4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_mxint4_moe.py", + "sha256": "2106d67c2951aa690c4656ca58240d09c366cffe8cb4d9fd575df016c377cc30" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_nvfp4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_nvfp4_moe.py", + "sha256": "e938ac9f058f7c90b41c9610513239bec54a95304bfb5ff5f6897ebd54733d7e" + }, + "vllm/model_executor/layers/fused_moe/experts/xpu_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/xpu_moe.py", + "sha256": "2a11bac0cf9274d963315efd6eebdc62978b0b7aa02e8849ff2a562742f0b86d" + }, + "vllm/model_executor/layers/fused_moe/fused_flydsl_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_flydsl_moe.py", + "sha256": "0e74879ee5c72f616ae4064b9dff3b3a0b583b7fc70b8f92f1e8b730ecd5d39b" + }, + "vllm/model_executor/layers/fused_moe/fused_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe.py", + "sha256": "7072eb06237be9d33dcb0ef7101410f886a6363c98cbee70a014c68b70f639cb" + }, + "vllm/model_executor/layers/fused_moe/fused_moe_method_base.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe_method_base.py", + "sha256": "18dcfc469d3252749801bbf943857f58da85de1f2db8fdff5a9f4986a925dc68" + }, + "vllm/model_executor/layers/fused_moe/fused_moe_modular_method.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe_modular_method.py", + "sha256": "321c744eac1fcaffd6b1b2971204c8baa57dfec53e91e5d24140014d72d64f83" + }, + "vllm/model_executor/layers/fused_moe/hpc_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/hpc_moe.py", + "sha256": "2ca9c5d71b6fd91651027905e2b83103a8823845e053e7153e148cb8e0ee666d" + }, + "vllm/model_executor/layers/fused_moe/layer.py": { + "path": "/vllm/model_executor/layers/fused_moe/layer.py", + "sha256": "def0b4e13bcc1e4e21ee10644e647e2eda1acbf0cc01e76d6128abb59ea08224" + }, + "vllm/model_executor/layers/fused_moe/modular_kernel.py": { + "path": "/vllm/model_executor/layers/fused_moe/modular_kernel.py", + "sha256": "8dc4e0dbbf35b3aac8add63ca6f2a7bbfdadaabbd60826e24598b22c7d8e5c22" + }, + "vllm/model_executor/layers/fused_moe/moe_align_block_size.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_align_block_size.py", + "sha256": "c3f7fc2087836f0160a32ab99ceb1d8f6e87c793679da34dd672e225cb7fa31b" + }, + "vllm/model_executor/layers/fused_moe/moe_fused_mul_sum.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_fused_mul_sum.py", + "sha256": "112e72578002c3bff538418dac64b3b56d995994a2fc5e32b18d2cf3b8392a13" + }, + "vllm/model_executor/layers/fused_moe/moe_output.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_output.py", + "sha256": "6ea4cbd78f9efc7f842c5df246f553f08b991c3479b8b04b89902ed08aaf8e8f" + }, + "vllm/model_executor/layers/fused_moe/moe_permute_unpermute.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_permute_unpermute.py", + "sha256": "1adc592c6254d0c877d66be5406afbc822459c18a838f4bbd094a992e7609d06" + }, + "vllm/model_executor/layers/fused_moe/oracle/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/__init__.py", + "sha256": "4dcf941d50d48bb812de0f39e9194bf17a76b8035fe324889c6038f710fdc453" + }, + "vllm/model_executor/layers/fused_moe/oracle/base.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/base.py", + "sha256": "555bbcd18a3744e64eee4e953daabef3bd268a1bd4faf967d4cfd14d6074f685" + }, + "vllm/model_executor/layers/fused_moe/oracle/fp8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/fp8.py", + "sha256": "245bd36c285df1e6f7c51e52dcda31ad247894577a9f8d765613c2c2feae9aee" + }, + "vllm/model_executor/layers/fused_moe/oracle/int8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/int8.py", + "sha256": "c1b67886511bd966b162db5bca8930f04895fb37a969818a4a10f0726c59547f" + }, + "vllm/model_executor/layers/fused_moe/oracle/int_wna16.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/int_wna16.py", + "sha256": "cfffe8b8b290330be9d18ffa07aeecf296484395ff04df3147d99393e48b55c1" + }, + "vllm/model_executor/layers/fused_moe/oracle/mxfp4.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/mxfp4.py", + "sha256": "b7915e6779b5c88e7dcd2d227f003a8e45071d6d86877013067142d4feb64a8c" + }, + "vllm/model_executor/layers/fused_moe/oracle/mxfp8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/mxfp8.py", + "sha256": "9cfdc8102a04bb844dcd7ed88043bba96ec751794bc093da76c69aa8cf88cf48" + }, + "vllm/model_executor/layers/fused_moe/oracle/nvfp4.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/nvfp4.py", + "sha256": "735b4cdeb1258f11fb02320fc0c70cab5edaca468dd60b07b2d369389d2b0313" + }, + "vllm/model_executor/layers/fused_moe/oracle/unquantized.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/unquantized.py", + "sha256": "c8b8203bd0b73bb7f586f703607394d663f14c05711416ad42d45af564382223" + }, + "vllm/model_executor/layers/fused_moe/oracle/w4a8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/w4a8.py", + "sha256": "d7fa6e2982f20b34d5ce9c5ce28a61122762a3fcdd53d249479472a4f2316c6a" + }, + "vllm/model_executor/layers/fused_moe/oracle/w4a8_int8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/w4a8_int8.py", + "sha256": "6d6f9ca2e67b630002873de2f8d8a231d091c5c2f0f3354a9e8209449b481a4c" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/__init__.py", + "sha256": "2800113263a83c2632e522fb22790b29f63384da75d43de32f0ae2f95e8ae4c1" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/batched.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/batched.py", + "sha256": "d52425dd8c08e47cf8d9c3088daf3b1cc721c8667de4c738d04ba997f9a08ccb" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ht.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ht.py", + "sha256": "465cdf1d6cee91b2ee8c2e43abbea6e8408976e3048c10f44c089f34b415bc60" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ll.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ll.py", + "sha256": "f704922b1db680c4c212982a096e09d6b3eb97d89110313f86ed958a00df21b7" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_v2.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_v2.py", + "sha256": "8d690b016bbcfbc9eb599bcc36a6f798b2f1720c828f4347ea742e218c0cc60d" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_one_sided.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_one_sided.py", + "sha256": "acb57d8342af62bb5672036871cd4b27ecc7f37dfa7c894850bb860e6152a1f0" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_two_sided.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_two_sided.py", + "sha256": "cc5b00d6a157b6eca5afaaf7435165dbd1b4524d6d88bf75808cbe074a389f79" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/mori.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/mori.py", + "sha256": "8e9c3b5b1f0de13f467d95bf2f451cba0e4b0d9a1bdcf98da0988a3a9a79a045" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/naive_dp_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/naive_dp_ep.py", + "sha256": "db015e5b18750bbbf5b2bbaceca877dd6f3f3e74c2a94e8dc185f7413b387f91" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/nixl_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/nixl_ep.py", + "sha256": "1f71d70ac509bf5d3d67a8d95a8ee108a50af6bb5d4bde7181ca28e286f6ffce" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/no_dp_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/no_dp_ep.py", + "sha256": "adbbf529cd22059c95b5380952943a70cf11e05e321dcd707f296bebde61a6e7" + }, + "vllm/model_executor/layers/fused_moe/routed_experts.py": { + "path": "/vllm/model_executor/layers/fused_moe/routed_experts.py", + "sha256": "68c48e5df0ea4a7cc1f04436b7b9153eb53802ecd9bb55d38db8738508daac6d" + }, + "vllm/model_executor/layers/fused_moe/routed_experts_capturer.py": { + "path": "/vllm/model_executor/layers/fused_moe/routed_experts_capturer.py", + "sha256": "cd006bc1a1703418cca3b589fafb2abc4268a086fb3db044bbb64348aeac8b13" + }, + "vllm/model_executor/layers/fused_moe/router/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/layers/fused_moe/router/aiter_shared_routed_fused_moe_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/aiter_shared_routed_fused_moe_router.py", + "sha256": "f47046db1275601a2c67c9232afc7b866c9623a19639d5be867e4c7914a35069" + }, + "vllm/model_executor/layers/fused_moe/router/base_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/base_router.py", + "sha256": "47fa2324bcd9b6ebdc138d69ae6b6ecc0f2463d34bda8c5988bdb0a2a76d3fae" + }, + "vllm/model_executor/layers/fused_moe/router/bf16x3_router_gemm_cutedsl.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/bf16x3_router_gemm_cutedsl.py", + "sha256": "d0f1edd1ebc48d88e490bdb3c93db49bdc0a135ff83e7e0b57130e9f8255fc32" + }, + "vllm/model_executor/layers/fused_moe/router/cpu_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/cpu_router.py", + "sha256": "bff36b15818c87bfbb7ee3def7dc7f6396860abbe5893ff6148801fe941a4b92" + }, + "vllm/model_executor/layers/fused_moe/router/custom_routing_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/custom_routing_router.py", + "sha256": "1a40c7054e3c3a1b3ee2e98f6bc9efa9dfdc11f316a8edf7357dd91533487bfe" + }, + "vllm/model_executor/layers/fused_moe/router/dsv4_topk.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/dsv4_topk.py", + "sha256": "14f7c8487b9aef652dd61c91e0e3c3640b643bf9cd0d8a7184157d71f4beb63e" + }, + "vllm/model_executor/layers/fused_moe/router/fused_moe_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_moe_router.py", + "sha256": "0daa0dc05b931d66767feca444a4cd57ecf140f59b40ea0e8ad213eef6da2b36" + }, + "vllm/model_executor/layers/fused_moe/router/fused_topk_bias_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_topk_bias_router.py", + "sha256": "8fdc28cc248180ad4f11bb4bcda3df47926ec12665a0d84bb712fe83fc6b9376" + }, + "vllm/model_executor/layers/fused_moe/router/fused_topk_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_topk_router.py", + "sha256": "1c80f4af4d781fd66b12aa6a7a0fd30082bc521df40f1252987a8ac4c0bef51c" + }, + "vllm/model_executor/layers/fused_moe/router/gate_linear.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/gate_linear.py", + "sha256": "faa43362c2e7c568498a923c682ca18cae75e87f48d00882770821cb19c21198" + }, + "vllm/model_executor/layers/fused_moe/router/grouped_topk_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/grouped_topk_router.py", + "sha256": "048339e1799cdd42c9dae686a6cb891046577fb391b500f0d12eed73c8f61e52" + }, + "vllm/model_executor/layers/fused_moe/router/rocm_fp32_router_gemm.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/rocm_fp32_router_gemm.py", + "sha256": "9c331ef3d0bb2fb6954387d77ac62a99c5c76d2753c7438bfbb5115f68aae5ac" + }, + "vllm/model_executor/layers/fused_moe/router/router_factory.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/router_factory.py", + "sha256": "019bc8adaa7642abab82843efd53cd1a378f62c652521a1de2b781480eb88742" + }, + "vllm/model_executor/layers/fused_moe/router/routing_simulator_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/routing_simulator_router.py", + "sha256": "a7345df5add00cf3bd93024492d6fc1189fd3ecf2754a11cef1b03a295d791f7" + }, + "vllm/model_executor/layers/fused_moe/router/zero_expert_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/zero_expert_router.py", + "sha256": "dea306edd92e2b9c1b43f982ede8e1e10770d2c66220f5a106e0ed0165276e9c" + }, + "vllm/model_executor/layers/fused_moe/runner/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/layers/fused_moe/runner/moe_runner.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/moe_runner.py", + "sha256": "05893188402fe37229bf72d75088d66193c417d5d502daafd3a55e1bfedaa60c" + }, + "vllm/model_executor/layers/fused_moe/runner/moe_runner_interface.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/moe_runner_interface.py", + "sha256": "189cad01611124eb44594713cbf5918d16fc70196dc81a525ae0a7a97a5fcc51" + }, + "vllm/model_executor/layers/fused_moe/runner/shared_experts.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/shared_experts.py", + "sha256": "d89e4c79c46f6fe61262c51f3facf102e71ce1e4eb3db67f72b6bd8470937be9" + }, + "vllm/model_executor/layers/fused_moe/topk_weight_and_reduce.py": { + "path": "/vllm/model_executor/layers/fused_moe/topk_weight_and_reduce.py", + "sha256": "3dfede72d52bf99af40997994704e6c502ee3bab2bd39bfaa8a68d7dae440203" + }, + "vllm/model_executor/layers/fused_moe/unquantized_fused_moe_method.py": { + "path": "/vllm/model_executor/layers/fused_moe/unquantized_fused_moe_method.py", + "sha256": "182a5ec1874ece2091a24c5303f6ab9ea64a9a61adf325b863927f0cdd83e5d3" + }, + "vllm/model_executor/layers/fused_moe/utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/utils.py", + "sha256": "a93a0bded4008db19d8b38370526ae34fafb9c8278e5b4f60acb6acc8fdc1850" + }, + "vllm/model_executor/layers/mamba/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/abstract.py": { + "path": "/vllm/model_executor/layers/mamba/abstract.py", + "sha256": "dfdc8c836894f574e41d93d76ab989cacd3d7ecf59c97a929abfa48d9364e8ad" + }, + "vllm/model_executor/layers/mamba/gdn/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/gdn/base.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/base.py", + "sha256": "7fec748fc74131f5a45bcaf2644b3fa3a0598fd437d7347f8207ea3644a951c5" + }, + "vllm/model_executor/layers/mamba/gdn/kimi_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/kimi_gdn_linear_attn.py", + "sha256": "1cec4da5c9da73557e192bfb36cd540aae51d3e91283b554449c4a97f0f89bd9" + }, + "vllm/model_executor/layers/mamba/gdn/olmo_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/olmo_gdn_linear_attn.py", + "sha256": "60873ca3bb0c4d17c33bd259b62b658db4883cd23138f47dd4ead62cd2ff0605" + }, + "vllm/model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py", + "sha256": "b80f8e6f3fff442fb880aebb3209c52f814f66490009f4ac4003de603576d10a" + }, + "vllm/model_executor/layers/mamba/linear/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/linear/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/linear/bailing_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/linear/bailing_linear_attn.py", + "sha256": "3c480ddd6eba0766ed012a1074bbec5f241d868a87b020b0f6312222c32f93eb" + }, + "vllm/model_executor/layers/mamba/linear/base.py": { + "path": "/vllm/model_executor/layers/mamba/linear/base.py", + "sha256": "26125cd427225954e1846ca361cdaf43f2b56f11b1e217cf26e91a80ef0edb6a" + }, + "vllm/model_executor/layers/mamba/linear/minimax_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/linear/minimax_linear_attn.py", + "sha256": "4adc00f54893b5bc6c31c613deda152a19af3b1bba04153ab5924c3bf2a3aaae" + }, + "vllm/model_executor/layers/mamba/mamba_mixer.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_mixer.py", + "sha256": "a485e937ad9db14d3ad03fde5a9fe795cfa863649563e52fc7e6c52ef631164e" + }, + "vllm/model_executor/layers/mamba/mamba_mixer2.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_mixer2.py", + "sha256": "d58d93e90d9eb90bc5133b79f07c7c62d0032b35d6cf916e3fe34367b81c5cd5" + }, + "vllm/model_executor/layers/mamba/mamba_utils.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_utils.py", + "sha256": "ce9845b4a4ef4bc46577a33038ed69d59ceccb52f30e9c5bdaa36e48be3b2ca4" + }, + "vllm/model_executor/layers/mamba/ops/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/ops/causal_conv1d.py": { + "path": "/vllm/model_executor/layers/mamba/ops/causal_conv1d.py", + "sha256": "044d005cfe59fd0818ed421274e04f3e8dd679b8cdb64fca9f4422f2643484b2" + }, + "vllm/model_executor/layers/mamba/ops/cpu/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/ops/cpu/causal_conv1d.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/causal_conv1d.py", + "sha256": "64104672890ac2ef240c20c7f8059beeade707178574809dbca8721dff5ea6fa" + }, + "vllm/model_executor/layers/mamba/ops/cpu/gdn_attention.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/gdn_attention.py", + "sha256": "a50288945bf5b102ad3025ae536638dcc32d84cf7c22aaf3a85326b0c1c56c1f" + }, + "vllm/model_executor/layers/mamba/ops/cpu/mamba_ssm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/mamba_ssm.py", + "sha256": "5839e576172a3246337f5e4fb1bc19eb583b3e2b2f7e35dd060dc3041eb8372d" + }, + "vllm/model_executor/layers/mamba/ops/gather_initial_states.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gather_initial_states.py", + "sha256": "5198bb6de6d91c583a5f65d926412a76ee04a06fa72aaba76eaf156b27cd0523" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/__init__.py", + "sha256": "b88b52e71fcb21bd3fa215ea171dcd2ad2ff17c97788cfe64caa7ba45c7ecf97" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_h.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_h.py", + "sha256": "f50bbe5c0b6382323ec5dfc24a5e0c7971113d59727515e60c9fe3689734e5ba" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_kkt_inv_uw.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_kkt_inv_uw.py", + "sha256": "b4a65dd194907db08865e0596fe254f915e670a9e6b27ffa2933c1026dde9b1e" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_o.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_o.py", + "sha256": "629f7843a7e611efb9390f2ebb7a4b924b2c328d48a317fddfaa96af4d9bc60a" + }, + "vllm/model_executor/layers/mamba/ops/layernorm_gated.py": { + "path": "/vllm/model_executor/layers/mamba/ops/layernorm_gated.py", + "sha256": "3433f2e3b87c2b2ccf8e9794ce40762c86a6da38a94ecee001f439ea0d0373dd" + }, + "vllm/model_executor/layers/mamba/ops/mamba_ssm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/mamba_ssm.py", + "sha256": "a4515ec7895b40ed878cf380445034b25faa61fbaa799d96c49217bbdfd7e400" + }, + "vllm/model_executor/layers/mamba/ops/replayssm_config.py": { + "path": "/vllm/model_executor/layers/mamba/ops/replayssm_config.py", + "sha256": "5fe9d5d7aa2de6a65875b3796a919b22bc435fd76055ba054bbff43aa005bc44" + }, + "vllm/model_executor/layers/mamba/ops/scatter_states.py": { + "path": "/vllm/model_executor/layers/mamba/ops/scatter_states.py", + "sha256": "f3bb004c73edaba56337747893eb07faf29b270dc8bb9c893ee9b1044e4ead9a" + }, + "vllm/model_executor/layers/mamba/ops/selective_state_update_replayssm_output_only.py": { + "path": "/vllm/model_executor/layers/mamba/ops/selective_state_update_replayssm_output_only.py", + "sha256": "cea7fd3063ca9dcc4e33f180d01ea379195ec515cedc9d0b03b11dc67670d695" + }, + "vllm/model_executor/layers/mamba/ops/ssd_bmm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_bmm.py", + "sha256": "26983d97a7f5c5f9197a16a6bee7b1294839b9ae31a14c14aaee38b43523e630" + }, + "vllm/model_executor/layers/mamba/ops/ssd_chunk_scan.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_chunk_scan.py", + "sha256": "d5ef32e8cb47e2ce71984579df78ab69754895f891766394daf327867cfa4f8f" + }, + "vllm/model_executor/layers/mamba/ops/ssd_chunk_state.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_chunk_state.py", + "sha256": "177e3aa7fe72647133bbd86135533e8688a5802678d4d1564aa549410362316f" + }, + "vllm/model_executor/layers/mamba/ops/ssd_combined.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_combined.py", + "sha256": "1317bbb668d3c60dfe0658850f9968614f03fa5eb61196f8ce6ac17dbb31b480" + }, + "vllm/model_executor/layers/mamba/ops/ssd_state_passing.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_state_passing.py", + "sha256": "36b8c8edba437916a5b789717c61fc22077de01e77892cb96dbff3b00a57410e" + }, + "vllm/model_executor/layers/mamba/ops/ssu_dispatch.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssu_dispatch.py", + "sha256": "bbe0f0e61da87f3ddfead19a79ca376516b63f1ea868be3485333c63fa20ef41" + }, + "vllm/model_executor/layers/mamba/ops/triton_helpers.py": { + "path": "/vllm/model_executor/layers/mamba/ops/triton_helpers.py", + "sha256": "a8795532f22c37a93e82c9d8e3fadcb5f4da98673d7b321fe8481305eaafad30" + }, + "vllm/model_executor/layers/mamba/short_conv.py": { + "path": "/vllm/model_executor/layers/mamba/short_conv.py", + "sha256": "228494efab185ee17374f762874f4c8b9a26aac9decfa8c906ce38446e0de51a" + }, + "vllm/model_executor/models/qwen3_next.py": { + "path": "/vllm/model_executor/models/qwen3_next.py", + "sha256": "4fa5112ac2bf7886d41d9e1f6c3da8793620d1ec49c961b31e9609459a6a7f7a" + }, + "vllm/third_party/flash_linear_attention/__init__.py": { + "path": "/vllm/third_party/flash_linear_attention/__init__.py", + "sha256": "5dbbfa3fc286edb2e970e175ef33cee4f6181c89b0784f5a8986201b2312f54e" + }, + "vllm/third_party/flash_linear_attention/ops/__init__.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/__init__.py", + "sha256": "dd738dc1d08045e76455cdbe16052a5b769e0eb11d6e87ff28353994f880cd6c" + }, + "vllm/third_party/flash_linear_attention/ops/chunk.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk.py", + "sha256": "c105ead259e86aedc248c53e7c4cef07034d0ff12da608d80265d1dd0990803f" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_delta_h.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_delta_h.py", + "sha256": "1b3ad391f939d9443c6b7adb19e57fe381bd5dccea064e8417a4f85b0e713b26" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_o.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_o.py", + "sha256": "3b63b836a8cc561723c23db5a528a0b474d9cd78508d610f0b348c585a889a19" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_scaled_dot_kkt.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_scaled_dot_kkt.py", + "sha256": "7ae41df3755acc7e925a134d848f78bb5fc00b90069039d86403c5853323ea42" + }, + "vllm/third_party/flash_linear_attention/ops/cumsum.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/cumsum.py", + "sha256": "d818215669b451868823202ac0bcea77e7a9d75957254c7c1060a73a55dc39b6" + }, + "vllm/third_party/flash_linear_attention/ops/fused_gdn_prefill_post_conv.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_gdn_prefill_post_conv.py", + "sha256": "590717b2107abc90d72548de06b5d315229eb2775c94614f3f545df11cc2b5df" + }, + "vllm/third_party/flash_linear_attention/ops/fused_norm_gate.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_norm_gate.py", + "sha256": "e6eb90467f29d8a0a04f2a364d20a2c3191b6ab857841bfb82076b33a6022d1a" + }, + "vllm/third_party/flash_linear_attention/ops/fused_recurrent.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_recurrent.py", + "sha256": "fe6f1311014809040497aa0a623e7fa97f4b3457cdc7ee1f1f8aed21f326f755" + }, + "vllm/third_party/flash_linear_attention/ops/fused_sigmoid_gating.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_sigmoid_gating.py", + "sha256": "000ab8996af9788fdb8843a6a3b91833e7a14c8acc0e1ea073a536330f64cb6f" + }, + "vllm/third_party/flash_linear_attention/ops/index.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/index.py", + "sha256": "a4f8b2c052635cb519a80099e8a85411d1d5d6880b38f466788259bbe66b154d" + }, + "vllm/third_party/flash_linear_attention/ops/kda.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/kda.py", + "sha256": "e1f31aaa89b91f8e5db6d070b229e2c81c7206e8caec67de41db97d06be0c476" + }, + "vllm/third_party/flash_linear_attention/ops/l2norm.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/l2norm.py", + "sha256": "520f4513ef4fc97e6b88dc07877cca8e29da0d34e44673fe989e3af002d86381" + }, + "vllm/third_party/flash_linear_attention/ops/layernorm_guard.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/layernorm_guard.py", + "sha256": "42af29be26e8fc94a4658e053c095fcdab9ffdc1bc2446a01e787deda2a298c0" + }, + "vllm/third_party/flash_linear_attention/ops/op.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/op.py", + "sha256": "456da84fd12411cf53c96a90dd4f78f49afb454c3d51d2c524ea8e7106fe8ae5" + }, + "vllm/third_party/flash_linear_attention/ops/solve_tril.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/solve_tril.py", + "sha256": "d1a4ff27623a938825052500afa7e2aa24fadd2fa4c9be6376c9128824f86f82" + }, + "vllm/third_party/flash_linear_attention/ops/utils.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/utils.py", + "sha256": "d6c90d36505e02086954c23ca4dd2fea82a69416d68ff1d0501e16b3148b5b0c" + }, + "vllm/third_party/flash_linear_attention/ops/wy_fast.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/wy_fast.py", + "sha256": "c9fc8259db0a8746dc04f1d799cb73333457118cf89a0bdce8dde8a80a28cd96" + }, + "vllm/v1/attention/__init__.py": { + "path": "/vllm/v1/attention/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backend.py": { + "path": "/vllm/v1/attention/backend.py", + "sha256": "01ac364372afa75fdb22486aa3a9c7cf9aebb742e3471dfb9e0f9d9d36b734bc" + }, + "vllm/v1/attention/backends/__init__.py": { + "path": "/vllm/v1/attention/backends/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backends/b12x.py": { + "path": "/vllm/v1/attention/backends/b12x.py", + "sha256": "443f0a98738fdfefe5b9ab151d278bfd43a8ac807eb2b0b9b2a13d51922afbf9" + }, + "vllm/v1/attention/backends/composite.py": { + "path": "/vllm/v1/attention/backends/composite.py", + "sha256": "4cf3d66dca891562709eed4f50aa14b0ae6c8240d9ea86504a3304b2f356cce0" + }, + "vllm/v1/attention/backends/cpu_attn.py": { + "path": "/vllm/v1/attention/backends/cpu_attn.py", + "sha256": "76fb02a6bd725125565d84bf04f627cf16da5f7ff8f31f87c01ed6a1439398c7" + }, + "vllm/v1/attention/backends/fa_utils.py": { + "path": "/vllm/v1/attention/backends/fa_utils.py", + "sha256": "08fa6e231d3af3a71a6e59162dd12328aa8beb28548165ae58f130a92adb5a83" + }, + "vllm/v1/attention/backends/flash_attn.py": { + "path": "/vllm/v1/attention/backends/flash_attn.py", + "sha256": "b170a4789e18104c1bee35bea70df51abe6766693d8f4726a59f2e6f5c4282aa" + }, + "vllm/v1/attention/backends/flash_attn_diffkv.py": { + "path": "/vllm/v1/attention/backends/flash_attn_diffkv.py", + "sha256": "e4627c88c3ba8caee260540e994cc8137fd2ff7cd7813356b36387c6c88ce30a" + }, + "vllm/v1/attention/backends/flashinfer.py": { + "path": "/vllm/v1/attention/backends/flashinfer.py", + "sha256": "8ee541fde43ed92a417b3f01ea1e6fc64af8ab2eb54cbfc28308a49aaca4ed7f" + }, + "vllm/v1/attention/backends/flex_attention.py": { + "path": "/vllm/v1/attention/backends/flex_attention.py", + "sha256": "ad07f0ad73aeeadc3534b3a05c14f88a62cb3638874239ae9823c49b36276dc3" + }, + "vllm/v1/attention/backends/gdn_attn.py": { + "path": "/vllm/v1/attention/backends/gdn_attn.py", + "sha256": "3831019404a92200a38b43571c040cffeb6638bbdc71e4cb5e680dbc6c93d054" + }, + "vllm/v1/attention/backends/hpc_attn.py": { + "path": "/vllm/v1/attention/backends/hpc_attn.py", + "sha256": "af9e2aec1b498f0ee48a2dce3cf5646edf1976466980b2fd927c0e82b875427c" + }, + "vllm/v1/attention/backends/linear_attn.py": { + "path": "/vllm/v1/attention/backends/linear_attn.py", + "sha256": "bc42144fcd027434c6a10dc9f4c5f991db8899d387af5f6485402ce097eb0513" + }, + "vllm/v1/attention/backends/mamba1_attn.py": { + "path": "/vllm/v1/attention/backends/mamba1_attn.py", + "sha256": "32159dae11cab3c8c576b9514ad97d5108c8d1b4cac9fcfe345ec6a76223aee7" + }, + "vllm/v1/attention/backends/mamba2_attn.py": { + "path": "/vllm/v1/attention/backends/mamba2_attn.py", + "sha256": "a5bcdecb7b9547137023e1c77a386003358fa940eaf5f319ed142211dcdba139" + }, + "vllm/v1/attention/backends/mamba_attn.py": { + "path": "/vllm/v1/attention/backends/mamba_attn.py", + "sha256": "5e7b2c4058fc5e6096d001bff6c789b78368b025bbe4600f191aaca2ff59b59f" + }, + "vllm/v1/attention/backends/mla/__init__.py": { + "path": "/vllm/v1/attention/backends/mla/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backends/mla/aiter_triton_mla.py": { + "path": "/vllm/v1/attention/backends/mla/aiter_triton_mla.py", + "sha256": "ed0e285cdae06a019150c41cc958b3c0b5ceb0e4f299d5318d1c90e2c2395390" + }, + "vllm/v1/attention/backends/mla/amx_mla.py": { + "path": "/vllm/v1/attention/backends/mla/amx_mla.py", + "sha256": "7f5cddec30b2dfe22ccdbd3b9da673c879719bf6da4074317bd60add55f5d15f" + }, + "vllm/v1/attention/backends/mla/compressor_utils.py": { + "path": "/vllm/v1/attention/backends/mla/compressor_utils.py", + "sha256": "3589e94105368ea285c40b82db1a0332682ff5d071fe363627cf4c0d10f3facf" + }, + "vllm/v1/attention/backends/mla/cpu_mla.py": { + "path": "/vllm/v1/attention/backends/mla/cpu_mla.py", + "sha256": "ff2110b9f78e92adf6bab294465cbc294ae1ff71cb1780fed158179e134a4ca6" + }, + "vllm/v1/attention/backends/mla/cutlass_mla.py": { + "path": "/vllm/v1/attention/backends/mla/cutlass_mla.py", + "sha256": "211d298680f9bd793cc468281b316d6633c5f4eb6dcec71d3329b034a23ab9b5" + }, + "vllm/v1/attention/backends/mla/flashattn_mla.py": { + "path": "/vllm/v1/attention/backends/mla/flashattn_mla.py", + "sha256": "ac89e0ad75a37e92566d264bafe324735a80f9ab4709241a4454d17b3d38bb63" + }, + "vllm/v1/attention/backends/mla/flashattn_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashattn_mla_sparse.py", + "sha256": "67dd3ead2e8b9d8cda0825ecc93779cb7d670628bc741c759a7d3cd5d474030f" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla.py", + "sha256": "0c24ff016fb6b0bb41d9e7484b6f1af42f37bcc384ed613473fc3e01ad25f664" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse.py", + "sha256": "2116d965b2067134d8afa5878d4d16c0149b061258f50c4106d993aa13b073cc" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm120.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm120.py", + "sha256": "102ca08793d567f95598eefeb34c3f6ec50b3b9d704f162d1402b97b12b5777b" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm90.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm90.py", + "sha256": "df9fe4970aa3f53cf24784b8534b89e0101a2ca20a35a2ebbc9a12a4463d5993" + }, + "vllm/v1/attention/backends/mla/flashmla.py": { + "path": "/vllm/v1/attention/backends/mla/flashmla.py", + "sha256": "c9d8046a853ecbdeff9ebfc738f5bb34c4f272b278231a09a0fbf73708c7c188" + }, + "vllm/v1/attention/backends/mla/flashmla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashmla_sparse.py", + "sha256": "7a379c717adb9667ce94cbc16c0e3a1fb22a169713db6d7941c141fa84077b3f" + }, + "vllm/v1/attention/backends/mla/index_group.py": { + "path": "/vllm/v1/attention/backends/mla/index_group.py", + "sha256": "c24e028c3c160a9bb92e043da5b5b34c805e84745b7c4b8da6fb8702a0ddd641" + }, + "vllm/v1/attention/backends/mla/indexer.py": { + "path": "/vllm/v1/attention/backends/mla/indexer.py", + "sha256": "2acbc1c4fa57c3424ad95e6ecbe76eb7141747773c3e867ce704f4adccba892a" + }, + "vllm/v1/attention/backends/mla/prefill/__init__.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/__init__.py", + "sha256": "903630eb705dd175bf4ae4558a4bcaa07c110056b6a11eb830fdd2fb21b3c48a" + }, + "vllm/v1/attention/backends/mla/prefill/aiter_flash_attn.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/aiter_flash_attn.py", + "sha256": "571b8a9910c4ea3fefda60659026f3bf0d7b542c34553c8c9a4d43bb82077e61" + }, + "vllm/v1/attention/backends/mla/prefill/base.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/base.py", + "sha256": "138bf3ddaf5a94c3cdbc4e08ac676edcae84b32fc76625e546f3b47f7d8b82ec" + }, + "vllm/v1/attention/backends/mla/prefill/cpu_sdpa.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/cpu_sdpa.py", + "sha256": "1bb686395274a8ec0d9fd7327410a527655fe060cbbc263eab138fea988d96de" + }, + "vllm/v1/attention/backends/mla/prefill/flash_attn.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/flash_attn.py", + "sha256": "5e648c82c82e5f81fe11458eb82b9f90b50fc06df2ade3bf111ee6b7a2ee8481" + }, + "vllm/v1/attention/backends/mla/prefill/flashinfer.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/flashinfer.py", + "sha256": "63861219c35b8abc0ebe01e1f51543c5ed40bd46119ca261d927da7c6826b49b" + }, + "vllm/v1/attention/backends/mla/prefill/registry.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/registry.py", + "sha256": "c8c30b92213d594beaa3cab4d5003da26a85870dbb11d1ab73191962d0645b53" + }, + "vllm/v1/attention/backends/mla/prefill/selector.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/selector.py", + "sha256": "101d9fca7924b0c5d7891a17fe8942611bd6759e32b03a571dc87b14c1430f2f" + }, + "vllm/v1/attention/backends/mla/prefill/tokenspeed_mla.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/tokenspeed_mla.py", + "sha256": "047cf07bfcc83db3b11a6a54ffe189f6146e6ec9ad33ce2fa7d18860bf4210f0" + }, + "vllm/v1/attention/backends/mla/prefill/trtllm_ragged.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/trtllm_ragged.py", + "sha256": "9e13ea6f6a25accedd918c0de64bbb812ccb20ffb95350ab018a6e76d493789b" + }, + "vllm/v1/attention/backends/mla/rocm_aiter_mla.py": { + "path": "/vllm/v1/attention/backends/mla/rocm_aiter_mla.py", + "sha256": "b489f5830c655bfb6299801a70d69b9821513c69568ecab3689db5a7be867be5" + }, + "vllm/v1/attention/backends/mla/rocm_aiter_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/rocm_aiter_mla_sparse.py", + "sha256": "91b1d9b3d860a9720bc01b8ebe9bbe8649a7d6bca20d4b63939bc100309bca19" + }, + "vllm/v1/attention/backends/mla/sparse_swa.py": { + "path": "/vllm/v1/attention/backends/mla/sparse_swa.py", + "sha256": "a47853ad8a3fe40f24704592581ea323a18041b84610df010a5534da634e311e" + }, + "vllm/v1/attention/backends/mla/sparse_utils.py": { + "path": "/vllm/v1/attention/backends/mla/sparse_utils.py", + "sha256": "c3cdf060288c05542243a9fe8b5ad3a963ad75e9ce399009b5e45c1235a88ce4" + }, + "vllm/v1/attention/backends/mla/tokenspeed_mla.py": { + "path": "/vllm/v1/attention/backends/mla/tokenspeed_mla.py", + "sha256": "b9ba523c606430cecb99a88b28c53d98a99dcf5e76105a80664338110a20f1ad" + }, + "vllm/v1/attention/backends/mla/triton_mla.py": { + "path": "/vllm/v1/attention/backends/mla/triton_mla.py", + "sha256": "21b16b3b34470edcc33d0423e560837c1d37d4bab31c7b3b9cfd7faa47864b51" + }, + "vllm/v1/attention/backends/mla/xpu_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/xpu_mla_sparse.py", + "sha256": "559c6240fe466521a6b2df4c94aea02ddf3f5efa5ba6954fa180c5a51c0f12d2" + }, + "vllm/v1/attention/backends/recoverssm_metadata.py": { + "path": "/vllm/v1/attention/backends/recoverssm_metadata.py", + "sha256": "02896a667db0f0308371ceb50048b18e5866c0235d163c0357e9a05dcedb3394" + }, + "vllm/v1/attention/backends/registry.py": { + "path": "/vllm/v1/attention/backends/registry.py", + "sha256": "378e8ee78734bd8c8adbe287d4c0a4058dcbb553195a09fbcce00a3cc30adc29" + }, + "vllm/v1/attention/backends/rocm_aiter_fa.py": { + "path": "/vllm/v1/attention/backends/rocm_aiter_fa.py", + "sha256": "d1418af03bf58209c850f466b712d3ea22a14ebb758c42dd43e65738281841fd" + }, + "vllm/v1/attention/backends/rocm_aiter_unified_attn.py": { + "path": "/vllm/v1/attention/backends/rocm_aiter_unified_attn.py", + "sha256": "59d2645eb4c91dc0567754a7163d066f4f2faf48f1957b254fcdd5604e9d8c8c" + }, + "vllm/v1/attention/backends/rocm_attn.py": { + "path": "/vllm/v1/attention/backends/rocm_attn.py", + "sha256": "4a8f57067073fbceb784af6c3467487c450d00fa3957928fadb99a79f6036292" + }, + "vllm/v1/attention/backends/short_conv_attn.py": { + "path": "/vllm/v1/attention/backends/short_conv_attn.py", + "sha256": "84fc460ef2fbd09743b069bec0c14b39542af6c2254a403e37a048427e151121" + }, + "vllm/v1/attention/backends/triton_attn.py": { + "path": "/vllm/v1/attention/backends/triton_attn.py", + "sha256": "1057663d110e1d5229495a799027b27277c1eca325d5b6780fa2259afbf58a1a" + }, + "vllm/v1/attention/backends/triton_attn_diffkv.py": { + "path": "/vllm/v1/attention/backends/triton_attn_diffkv.py", + "sha256": "de0357eae005246642140f1ab8842ba5ed8bff5c84b18a6d3a7bbf409c578301" + }, + "vllm/v1/attention/backends/triton_flash_attn.py": { + "path": "/vllm/v1/attention/backends/triton_flash_attn.py", + "sha256": "176e45329aeb28a2008362bb607d1b8c89816eb665859ab908b0385a11acf1c2" + }, + "vllm/v1/attention/backends/triton_flashinfer.py": { + "path": "/vllm/v1/attention/backends/triton_flashinfer.py", + "sha256": "48d5f967e388d4e8d6bbec8d827b44d855346bc2fada28adf65768bf6623527b" + }, + "vllm/v1/attention/backends/turboquant_attn.py": { + "path": "/vllm/v1/attention/backends/turboquant_attn.py", + "sha256": "616d16d608d9d1fbf6c29548037e7e9cf330f4d36a01aa3ffabf42a731eb6e2b" + }, + "vllm/v1/attention/backends/utils.py": { + "path": "/vllm/v1/attention/backends/utils.py", + "sha256": "fbc221360d2d54cb21ef3f625dc8711500de345a355801548b4337bb9b8abee0" + }, + "vllm/v1/attention/ops/__init__.py": { + "path": "/vllm/v1/attention/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/ops/chunked_prefill_paged_decode.py": { + "path": "/vllm/v1/attention/ops/chunked_prefill_paged_decode.py", + "sha256": "973db848a790b2e8d99e728b2fc4f44b501bbe58c62747244ddff04cfcf11a85" + }, + "vllm/v1/attention/ops/common.py": { + "path": "/vllm/v1/attention/ops/common.py", + "sha256": "b4b67e7fc0cce471e337d742c097fba06da7563816e8799e27719714e31e1d5b" + }, + "vllm/v1/attention/ops/cp_common.py": { + "path": "/vllm/v1/attention/ops/cp_common.py", + "sha256": "2369181862e96db64b14ef20c5c2e249ed2ea5f3dea2467a2aa388372bb86d9d" + }, + "vllm/v1/attention/ops/dcp.py": { + "path": "/vllm/v1/attention/ops/dcp.py", + "sha256": "a478bdc781460f0582cfaf74d6431f1a826c201f02f39d882d12a96139bc3f28" + }, + "vllm/v1/attention/ops/flashmla.py": { + "path": "/vllm/v1/attention/ops/flashmla.py", + "sha256": "8a40d6e120e3ab25a95fcfeb32b0b5b4c1ea02b984633866628536dcd26ed2e8" + }, + "vllm/v1/attention/ops/flydsl_kernels/__init__.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/attention/ops/flydsl_kernels/tq_decode.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/tq_decode.py", + "sha256": "cc4b7f82897596e0974b3d3a710a1a8bc58c3d22b72cc7f461dd1c4acd2e451b" + }, + "vllm/v1/attention/ops/flydsl_kernels/tq_decode_gqa6.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/tq_decode_gqa6.py", + "sha256": "a983f6d375c325900955e11696dab1e2665770e83f84d51f93d3ed5e1d8880e0" + }, + "vllm/v1/attention/ops/flydsl_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/flydsl_turboquant_decode.py", + "sha256": "7b1dd0ef7c7fb28a6a8831759e00b939ab844d067657155cc11cf75532a22c63" + }, + "vllm/v1/attention/ops/int4_per_token_head.py": { + "path": "/vllm/v1/attention/ops/int4_per_token_head.py", + "sha256": "d91968f280cd8eaed7570ab255f0276b40e833e18a25066d371d9ca8149425f2" + }, + "vllm/v1/attention/ops/merge_attn_states.py": { + "path": "/vllm/v1/attention/ops/merge_attn_states.py", + "sha256": "ad08403d2843fc892f0b0b4b9f5fabb81884556f89f7170dca46ccef498a3539" + }, + "vllm/v1/attention/ops/metadata.py": { + "path": "/vllm/v1/attention/ops/metadata.py", + "sha256": "ca882b84c5aaefb1f77e4d8ea09a00103fbc53defa8671bba036c961c17fc760" + }, + "vllm/v1/attention/ops/paged_attn.py": { + "path": "/vllm/v1/attention/ops/paged_attn.py", + "sha256": "016a95f892ec751c86b37be1e12171bad9f0b4076bbf2219ff336f4e9c503653" + }, + "vllm/v1/attention/ops/pcp.py": { + "path": "/vllm/v1/attention/ops/pcp.py", + "sha256": "dadeff95fe2df2be8028baabeef01b0d2d628cd67de2176915e737ce096de3dd" + }, + "vllm/v1/attention/ops/prefix_prefill.py": { + "path": "/vllm/v1/attention/ops/prefix_prefill.py", + "sha256": "b08ad92db715fc03c11699de3de463d55e411f42f77548e06b41049a61de692f" + }, + "vllm/v1/attention/ops/rocm_aiter_mla_merge.py": { + "path": "/vllm/v1/attention/ops/rocm_aiter_mla_merge.py", + "sha256": "564c66e4877732e48a6f7d52405c43dc952eec0f0ae4353d34886bca056132b9" + }, + "vllm/v1/attention/ops/rocm_aiter_mla_sparse.py": { + "path": "/vllm/v1/attention/ops/rocm_aiter_mla_sparse.py", + "sha256": "feec664be5045fd1ba13b8f6ef83b52c96910ddc78baca0431bcf610c9e8f5cc" + }, + "vllm/v1/attention/ops/triton_attention_helpers.py": { + "path": "/vllm/v1/attention/ops/triton_attention_helpers.py", + "sha256": "35aa993d01345f535d2641cf9dcabb8b64c51b20a19707bc5987e616aaa87ddd" + }, + "vllm/v1/attention/ops/triton_decode_attention.py": { + "path": "/vllm/v1/attention/ops/triton_decode_attention.py", + "sha256": "b9823c65eba22d76abf64dad7d7d16a950f67471c86d6cb5b3e983aaf14381ac" + }, + "vllm/v1/attention/ops/triton_merge_attn_states.py": { + "path": "/vllm/v1/attention/ops/triton_merge_attn_states.py", + "sha256": "f63229162181ab93198550b73a115f1cc1034cfd60e6f58bc8ab3e22a6e8ce60" + }, + "vllm/v1/attention/ops/triton_prefill_attention.py": { + "path": "/vllm/v1/attention/ops/triton_prefill_attention.py", + "sha256": "352c1a4ac86146580040579fb217c2e288268830d6602b735713e154f36d74fe" + }, + "vllm/v1/attention/ops/triton_reshape_and_cache_flash.py": { + "path": "/vllm/v1/attention/ops/triton_reshape_and_cache_flash.py", + "sha256": "6cac51475b8c656992a21b2d150acd3a16a95a7ab7d49aab151a3ef13c24b80d" + }, + "vllm/v1/attention/ops/triton_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/triton_turboquant_decode.py", + "sha256": "8e52678136449e4bbca2195fbcbb87426c955a2b1b8422e7ab9511e45ee5f5c6" + }, + "vllm/v1/attention/ops/triton_turboquant_store.py": { + "path": "/vllm/v1/attention/ops/triton_turboquant_store.py", + "sha256": "6e6e2fe74a307d40f0be786ccbaea76d989e3c7b5985f3144a5218c61bf6d902" + }, + "vllm/v1/attention/ops/triton_unified_attention.py": { + "path": "/vllm/v1/attention/ops/triton_unified_attention.py", + "sha256": "65d0fbcf33d00789df8ca688c0a1c908e710cfaef53471178747ecae11f05829" + }, + "vllm/v1/attention/ops/triton_unified_attention_diffkv.py": { + "path": "/vllm/v1/attention/ops/triton_unified_attention_diffkv.py", + "sha256": "7fa36d7b7441f1c396e0348eac61d691d2e459e5c4c393c4aa262dfb670e68f7" + }, + "vllm/v1/attention/ops/turboquant_soa/__init__.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/__init__.py", + "sha256": "6b43b6fcb2a71c44ceff4ed1edd417a839f4901251ba15831b09ad979baa4984" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode.py", + "sha256": "bf00634191bba14cbf4a23c1d67dc3dcb244c2b8989f08362757b54435830986" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode_v2.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode_v2.py", + "sha256": "28e7ecc15c450d3591983a50c46a03aa6ca6fa99304c17c333940617d9916485" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_store.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_store.py", + "sha256": "dccf93b9fdd34f9b9eacd468e9de35b9d93378594487c335cf50642aaec681f2" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_unified_attention.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_unified_attention.py", + "sha256": "b4b2b5f3985b3a6126fd052e6ec1ed91c610da8a525a9ae7470ac829405bd85c" + }, + "vllm/v1/attention/ops/vit_attn_wrappers.py": { + "path": "/vllm/v1/attention/ops/vit_attn_wrappers.py", + "sha256": "a99d57b58269c7521fa5d7d47af06551f3bab2b5c7358ef78165a7f6e20a92a6" + }, + "vllm/v1/attention/ops/xpu_mla_sparse.py": { + "path": "/vllm/v1/attention/ops/xpu_mla_sparse.py", + "sha256": "d98d17110577c2b7b4d05e07bfdae15faf83321b6342a5daaaecce45b9503f38" + }, + "vllm/v1/attention/selector.py": { + "path": "/vllm/v1/attention/selector.py", + "sha256": "87f653ded7974875183c920e3e4589c28116bcbc99714d1da7cb51ae77c0b182" + }, + "vllm/v1/core/sched/__init__.py": { + "path": "/vllm/v1/core/sched/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/core/sched/async_scheduler.py": { + "path": "/vllm/v1/core/sched/async_scheduler.py", + "sha256": "e586a0ef3c6778be56a93e7f9bb712d4de9de6e7d7fe7e3e1d51dae83ecfc508" + }, + "vllm/v1/core/sched/interface.py": { + "path": "/vllm/v1/core/sched/interface.py", + "sha256": "be6c008664096c5660a8879de72b315bbe479bf1d688be9b25891063ec53a367" + }, + "vllm/v1/core/sched/output.py": { + "path": "/vllm/v1/core/sched/output.py", + "sha256": "3a66c8efaefe10c572f6f33cf1f8aa4610758c945130cad62eb9f7331005677c" + }, + "vllm/v1/core/sched/request_queue.py": { + "path": "/vllm/v1/core/sched/request_queue.py", + "sha256": "4b8d938e5fb8152fe61030b8aa991f983fcac9a405c37ed8908045e05e82ae5e" + }, + "vllm/v1/core/sched/scheduler.py": { + "path": "/vllm/v1/core/sched/scheduler.py", + "sha256": "c1db45f3bbad3a875dd8638331b8870c4380ac1ab4734265ba5c863833a82884" + }, + "vllm/v1/core/sched/utils.py": { + "path": "/vllm/v1/core/sched/utils.py", + "sha256": "1ed988044eb8028c77ede875bd1a5fd05ff6998b455d61e3997d6a3d7fc1c3a7" + }, + "vllm/v1/sample/__init__.py": { + "path": "/vllm/v1/sample/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/sample/logits_processor/__init__.py": { + "path": "/vllm/v1/sample/logits_processor/__init__.py", + "sha256": "1f9b02dae8cf6d44484638037123d3a2dec6b7b9a2bcc9afceef1a9bf3eaedec" + }, + "vllm/v1/sample/logits_processor/builtin.py": { + "path": "/vllm/v1/sample/logits_processor/builtin.py", + "sha256": "6105816ece77e5b1dbee0d07abc90ce039d650bac2ddb85c93280c48b00f2ebe" + }, + "vllm/v1/sample/logits_processor/interface.py": { + "path": "/vllm/v1/sample/logits_processor/interface.py", + "sha256": "171dfc6ef9b5b53128e8eaecc4bdf1de413a706d64bf5be686048f583c66eee1" + }, + "vllm/v1/sample/logits_processor/state.py": { + "path": "/vllm/v1/sample/logits_processor/state.py", + "sha256": "a96411f14362c45f839e181dcb3ac01d5b880812bccb3552fc17863b219f44ac" + }, + "vllm/v1/sample/metadata.py": { + "path": "/vllm/v1/sample/metadata.py", + "sha256": "6582cfe1a240c7ddb975f0ef6dd7dcd28dcf0fc7670394390250013977aa7ffd" + }, + "vllm/v1/sample/ops/__init__.py": { + "path": "/vllm/v1/sample/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/sample/ops/bad_words.py": { + "path": "/vllm/v1/sample/ops/bad_words.py", + "sha256": "0b1d0a9b13b92ddcae2c83393c07a34c0f107813725700dee794caa7fe7f3b12" + }, + "vllm/v1/sample/ops/logprobs.py": { + "path": "/vllm/v1/sample/ops/logprobs.py", + "sha256": "b286f69012a6758bfe9250038b0697294dbffe0d32c6906f284c39f75ee48be3" + }, + "vllm/v1/sample/ops/penalties.py": { + "path": "/vllm/v1/sample/ops/penalties.py", + "sha256": "4debfcf247b3887478d2b9ec98f108756bbed2805462777ef6b56f3bdf4ce682" + }, + "vllm/v1/sample/ops/topk_topp_sampler.py": { + "path": "/vllm/v1/sample/ops/topk_topp_sampler.py", + "sha256": "13ea4359832bc914492330958ec4f5ac140f408b8f410cc05c6eaf7ddcd70be4" + }, + "vllm/v1/sample/ops/topk_topp_triton.py": { + "path": "/vllm/v1/sample/ops/topk_topp_triton.py", + "sha256": "0b5fc337058e22bc28a8530ccec904d6ccd89b9548b02955c657ac429b1669d2" + }, + "vllm/v1/sample/rejection_sampler.py": { + "path": "/vllm/v1/sample/rejection_sampler.py", + "sha256": "0bb9d224887ccb1355e16199005cc23a4afc6fa75156eca419851b7247d99750" + }, + "vllm/v1/sample/sampler.py": { + "path": "/vllm/v1/sample/sampler.py", + "sha256": "f95805b2c6d06218c724826aa5f881a606e8d0a534a566aee7c85948520dd216" + }, + "vllm/v1/sample/thinking_budget_state.py": { + "path": "/vllm/v1/sample/thinking_budget_state.py", + "sha256": "962f8f55210eb0a431cb9c78b013e35f7a7dd58d06d6fb2e7fcff1b457356f8e" + }, + "vllm/v1/worker/__init__.py": { + "path": "/vllm/v1/worker/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/block_table.py": { + "path": "/vllm/v1/worker/block_table.py", + "sha256": "a09b8819e1417b7a186cf3472224e2138fc5d41a291c6692bb7df711b0c44259" + }, + "vllm/v1/worker/cp_utils.py": { + "path": "/vllm/v1/worker/cp_utils.py", + "sha256": "e32625d83a641b8dd8df82e92d1b6fb20af0cdf2e8fbd2fb131aa3c215415448" + }, + "vllm/v1/worker/cpu/__init__.py": { + "path": "/vllm/v1/worker/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/cpu/buffer_utils.py": { + "path": "/vllm/v1/worker/cpu/buffer_utils.py", + "sha256": "e7313fd8c2c76ebfb98d2fa53008bc9691d0f83a7d7c05e87602b5a29fb79e04" + }, + "vllm/v1/worker/cpu/model_runner.py": { + "path": "/vllm/v1/worker/cpu/model_runner.py", + "sha256": "24a1c916550051327dd5893243a6d4200f3824b91b3af8aa6f6c793fd7c68c3e" + }, + "vllm/v1/worker/cpu/shm.py": { + "path": "/vllm/v1/worker/cpu/shm.py", + "sha256": "08491af8ad341399d1375f2d21ad00414d4c89b0a5c03f55de8704914bbfcbd9" + }, + "vllm/v1/worker/cpu_model_runner.py": { + "path": "/vllm/v1/worker/cpu_model_runner.py", + "sha256": "92111aba92f00571f1a3c4c6e43cf1da6ccb4d2afac2f4d5abc018a4a6e7e8bd" + }, + "vllm/v1/worker/cpu_worker.py": { + "path": "/vllm/v1/worker/cpu_worker.py", + "sha256": "a8051b9e510ef0af9cc34004f2cbe5c0f902bd0cebc32c9464e744344dfdf849" + }, + "vllm/v1/worker/dp_utils.py": { + "path": "/vllm/v1/worker/dp_utils.py", + "sha256": "8cd19f1bfbc5c4f6ec60df89aea7c8a19b400ebc264f372b103014152e92158c" + }, + "vllm/v1/worker/ec_connector_model_runner_mixin.py": { + "path": "/vllm/v1/worker/ec_connector_model_runner_mixin.py", + "sha256": "fe9b11cebb8562f1bfe98b98a5647b2b081a6e424cb60d4ffe2412c91a99215e" + }, + "vllm/v1/worker/encoder_cudagraph.py": { + "path": "/vllm/v1/worker/encoder_cudagraph.py", + "sha256": "6a08d3779bca1b47dbf9daf6eafe2d3c70dbcb8aeb7d63ba7efacc68241ee3bc" + }, + "vllm/v1/worker/encoder_cudagraph_defs.py": { + "path": "/vllm/v1/worker/encoder_cudagraph_defs.py", + "sha256": "bb7be050fcaa8868e7816c84caec875da57050d65fe7eaf00f3d41473df25e3a" + }, + "vllm/v1/worker/gpu/__init__.py": { + "path": "/vllm/v1/worker/gpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/async_utils.py": { + "path": "/vllm/v1/worker/gpu/async_utils.py", + "sha256": "77e17a4570ead2be30ae9b00888cf077a3b873018c12ca0549b853bfda02c1ba" + }, + "vllm/v1/worker/gpu/attn_utils.py": { + "path": "/vllm/v1/worker/gpu/attn_utils.py", + "sha256": "b9b81e59dda2720b1f9c434471381f879228832443e52756e469b4ad4905888f" + }, + "vllm/v1/worker/gpu/block_table.py": { + "path": "/vllm/v1/worker/gpu/block_table.py", + "sha256": "61c004315d5af7e7eae4e2a9e6be92ea82c520327690a7f55a73bb9ce95f520a" + }, + "vllm/v1/worker/gpu/buffer_utils.py": { + "path": "/vllm/v1/worker/gpu/buffer_utils.py", + "sha256": "6597f701a30261bf250e9ad5a29737264624a1caa20527aeea0dad630325b093" + }, + "vllm/v1/worker/gpu/cp_utils.py": { + "path": "/vllm/v1/worker/gpu/cp_utils.py", + "sha256": "456c1bb7e262d99ff555522a4f134e5a9b42aee23290be25455eaef36ee8eaaf" + }, + "vllm/v1/worker/gpu/cudagraph_utils.py": { + "path": "/vllm/v1/worker/gpu/cudagraph_utils.py", + "sha256": "6e9c042890603535e300a40df8ee159dbed1058a64a83ae50ff0329e332e05ff" + }, + "vllm/v1/worker/gpu/dp_utils.py": { + "path": "/vllm/v1/worker/gpu/dp_utils.py", + "sha256": "e26867bc89e6bfc933cabc5ed13e5dc7b8d2d3030118ca1ca64c8785dabc0fc1" + }, + "vllm/v1/worker/gpu/ec_connector.py": { + "path": "/vllm/v1/worker/gpu/ec_connector.py", + "sha256": "2afe6e641f4ae3eb3b8da336c74eaa7479bf617b27cfb39a1fcbe487686f0a08" + }, + "vllm/v1/worker/gpu/eplb_utils.py": { + "path": "/vllm/v1/worker/gpu/eplb_utils.py", + "sha256": "1829fac11464aed4649179b302df198de51b95d0589f4e56bea305a876a63e26" + }, + "vllm/v1/worker/gpu/input_batch.py": { + "path": "/vllm/v1/worker/gpu/input_batch.py", + "sha256": "d5dd956eb319bd69dd9e762047833d81ad40b21fce619fcb2133759e73620694" + }, + "vllm/v1/worker/gpu/kv_connector.py": { + "path": "/vllm/v1/worker/gpu/kv_connector.py", + "sha256": "b89a4333f1e552d86e1815674b59e9f1335f0f49c0a7b46082439076f62c6a81" + }, + "vllm/v1/worker/gpu/lora_utils.py": { + "path": "/vllm/v1/worker/gpu/lora_utils.py", + "sha256": "1e90eddd9ddb4ca55e574bb28e87ae3a6f6750175a62d373102426543f4ccd66" + }, + "vllm/v1/worker/gpu/metrics/__init__.py": { + "path": "/vllm/v1/worker/gpu/metrics/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/metrics/logits.py": { + "path": "/vllm/v1/worker/gpu/metrics/logits.py", + "sha256": "ea058d7510a077a55f8ac7e4c3d596508346244e908cb372865d7159f62edc89" + }, + "vllm/v1/worker/gpu/mm/__init__.py": { + "path": "/vllm/v1/worker/gpu/mm/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/mm/encoder_cache.py": { + "path": "/vllm/v1/worker/gpu/mm/encoder_cache.py", + "sha256": "89c500338fddbeee7c4fca978a3a7c4c566a03e848e399d303fbee3c80631cd2" + }, + "vllm/v1/worker/gpu/mm/encoder_runner.py": { + "path": "/vllm/v1/worker/gpu/mm/encoder_runner.py", + "sha256": "0981e352d70301b7154a217a48665ffe35f215d053ec5740c2515a3e1e11b4e6" + }, + "vllm/v1/worker/gpu/mm/lora.py": { + "path": "/vllm/v1/worker/gpu/mm/lora.py", + "sha256": "a3eddfad6ad64de276964240c28dc080888df4a56dd5eac18f89428f2cbb7a01" + }, + "vllm/v1/worker/gpu/mm/rope.py": { + "path": "/vllm/v1/worker/gpu/mm/rope.py", + "sha256": "0924375bcb367267e783b57dd2ad9de1189d97025ce4313baaa54f2911eaaf1e" + }, + "vllm/v1/worker/gpu/model_runner.py": { + "path": "/vllm/v1/worker/gpu/model_runner.py", + "sha256": "174c93db921c23cf0396eee4764be25b2bd2d4b6a06e9fa41ce3598b884ce8ce" + }, + "vllm/v1/worker/gpu/model_states/__init__.py": { + "path": "/vllm/v1/worker/gpu/model_states/__init__.py", + "sha256": "07815d0b788fc88185772f581bbf892a675259f9288375571f29887622f8d93c" + }, + "vllm/v1/worker/gpu/model_states/default.py": { + "path": "/vllm/v1/worker/gpu/model_states/default.py", + "sha256": "bb614f814780f052e869f9acf31dfbfa68718ee7dc6252eefa901b5730ee8a2a" + }, + "vllm/v1/worker/gpu/model_states/encoder_decoder.py": { + "path": "/vllm/v1/worker/gpu/model_states/encoder_decoder.py", + "sha256": "a5868059d8af672548b41d0e623e884320e6ed61e6aaca2d2828ff5be0356f2f" + }, + "vllm/v1/worker/gpu/model_states/encoder_only.py": { + "path": "/vllm/v1/worker/gpu/model_states/encoder_only.py", + "sha256": "84e96b55a2639e2a73fa4a0308acc89c8d053dc715481180b237e0196dcef99f" + }, + "vllm/v1/worker/gpu/model_states/interface.py": { + "path": "/vllm/v1/worker/gpu/model_states/interface.py", + "sha256": "5675b6fedc7403a9ab410b1e5565974e78fac23c42ab4253ae1da52d6e09b594" + }, + "vllm/v1/worker/gpu/model_states/mamba_hybrid.py": { + "path": "/vllm/v1/worker/gpu/model_states/mamba_hybrid.py", + "sha256": "573e130ac5587d4822fabf97adad1ad0fda02ff83c5e70df879a5bb175ae845c" + }, + "vllm/v1/worker/gpu/model_states/mm_pruning.py": { + "path": "/vllm/v1/worker/gpu/model_states/mm_pruning.py", + "sha256": "b150940b12ae76048f050a8eeb54d532bbdc530a18ffbf320ddeeb0cfaa90f93" + }, + "vllm/v1/worker/gpu/model_states/prompt_embeds.py": { + "path": "/vllm/v1/worker/gpu/model_states/prompt_embeds.py", + "sha256": "11f9e270925c2df6a505557605ac2b859bb145cf3420b0111e7482a1c544f9b1" + }, + "vllm/v1/worker/gpu/model_states/recoverssm.py": { + "path": "/vllm/v1/worker/gpu/model_states/recoverssm.py", + "sha256": "b4b660e62eaf33f4fe8271f83ed1fb6de6bc08f800a8073b27803e42fb29a645" + }, + "vllm/v1/worker/gpu/pcp_manager.py": { + "path": "/vllm/v1/worker/gpu/pcp_manager.py", + "sha256": "2d80df0ed5b18a2069f9d0689cb59923ffe324ba200fcafe242da23da3a6ddaa" + }, + "vllm/v1/worker/gpu/pool/__init__.py": { + "path": "/vllm/v1/worker/gpu/pool/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/pool/pooling_runner.py": { + "path": "/vllm/v1/worker/gpu/pool/pooling_runner.py", + "sha256": "f8463f7648cce0f3f29418a4d9fee61634ead760957cf236d06d61cf8cd986e7" + }, + "vllm/v1/worker/gpu/pp_utils.py": { + "path": "/vllm/v1/worker/gpu/pp_utils.py", + "sha256": "dadeef0bebf61d0ad44a28d06372208ec4e6389224d6017f412683b026bdbb5c" + }, + "vllm/v1/worker/gpu/sample/__init__.py": { + "path": "/vllm/v1/worker/gpu/sample/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/sample/bad_words.py": { + "path": "/vllm/v1/worker/gpu/sample/bad_words.py", + "sha256": "8d3cbd5613398260314d94739d8ee0e1ac0c22abf2f960f541d3c0d4e39d360b" + }, + "vllm/v1/worker/gpu/sample/batch_shard.py": { + "path": "/vllm/v1/worker/gpu/sample/batch_shard.py", + "sha256": "c30274a3a04e6a03e89be9cd7c62de602b1aba4d412f64540ab6201036de3928" + }, + "vllm/v1/worker/gpu/sample/gumbel.py": { + "path": "/vllm/v1/worker/gpu/sample/gumbel.py", + "sha256": "3ec1df510bdad13e8b0a457b5b67c98affdf6e57369e56cb471246cc8f40dd34" + }, + "vllm/v1/worker/gpu/sample/logit_bias.py": { + "path": "/vllm/v1/worker/gpu/sample/logit_bias.py", + "sha256": "9e80a3fe6f3c7474723408cfff52183f4585fdeedd9c2312843ee98d0b12724c" + }, + "vllm/v1/worker/gpu/sample/logprob.py": { + "path": "/vllm/v1/worker/gpu/sample/logprob.py", + "sha256": "f47479a818192acb6b297c79fa67a3b2f9820e3492a394d5adda777e9b7c832e" + }, + "vllm/v1/worker/gpu/sample/min_p.py": { + "path": "/vllm/v1/worker/gpu/sample/min_p.py", + "sha256": "4cb5e2f45e1ced6f9685283a7a5c8cfd7204d9a249822e866cfff756c7f04f62" + }, + "vllm/v1/worker/gpu/sample/output.py": { + "path": "/vllm/v1/worker/gpu/sample/output.py", + "sha256": "d6e298c0f197d487a8faaf7200f500fa83df1d7a4bbf4339cadd6a18008f7f9c" + }, + "vllm/v1/worker/gpu/sample/penalties.py": { + "path": "/vllm/v1/worker/gpu/sample/penalties.py", + "sha256": "46c29434caf5f415129ef4a9bb2b8d4f62d2765596e3e07f73ad2b198c7def1b" + }, + "vllm/v1/worker/gpu/sample/prompt_logprob.py": { + "path": "/vllm/v1/worker/gpu/sample/prompt_logprob.py", + "sha256": "4cf22d390e7bf59e44c458cff7180268db63e95d06af2f1e14d720a2d77c9663" + }, + "vllm/v1/worker/gpu/sample/sampler.py": { + "path": "/vllm/v1/worker/gpu/sample/sampler.py", + "sha256": "832c9945d201a1e730ff9b4b52076aa83bd4a5064e1e4cfea952cf84d4a8d1f0" + }, + "vllm/v1/worker/gpu/sample/states.py": { + "path": "/vllm/v1/worker/gpu/sample/states.py", + "sha256": "4e3671f93695ba5a48fad7d2d13beb231ac8741034904ed5a15d9f7b9b86662e" + }, + "vllm/v1/worker/gpu/sample/thinking_budget.py": { + "path": "/vllm/v1/worker/gpu/sample/thinking_budget.py", + "sha256": "020513e1d3406f367de6ad995a95055008fd0c28f2873647e8283c9870e22404" + }, + "vllm/v1/worker/gpu/sample/trace_replay.py": { + "path": "/vllm/v1/worker/gpu/sample/trace_replay.py", + "sha256": "d2a7d3b3b55379efabe4740a4b7f14030126dc11be36f6ea974164ce42316a50" + }, + "vllm/v1/worker/gpu/sample/watermark.py": { + "path": "/vllm/v1/worker/gpu/sample/watermark.py", + "sha256": "a3581458169dab9153eb09fd67218e0ee5585406537a9de80ad528ae62b030c0" + }, + "vllm/v1/worker/gpu/shutdown.py": { + "path": "/vllm/v1/worker/gpu/shutdown.py", + "sha256": "bb470f14b17c7e52571ef8938b2a9527e7c2846852ae8a3a94b69cd1c30aa4b1" + }, + "vllm/v1/worker/gpu/spec_decode/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/__init__.py", + "sha256": "1f1f84bfe6f4f5af3a7e21a7a8716ecf7b9013da1d03327668a3ee36afc24c32" + }, + "vllm/v1/worker/gpu/spec_decode/acceptance_estimator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/acceptance_estimator.py", + "sha256": "505b843bdd75928b03793b395b47b8be914bd7fe2a3351c8ec04339baeebb1c2" + }, + "vllm/v1/worker/gpu/spec_decode/adaptive_verification.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/adaptive_verification.py", + "sha256": "276b2fec56758a94c71b717f6786b8a6f126db2e20cf964350202feee61a0a39" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py", + "sha256": "13392ef0a9ed59eb9c2b2bad43d7c61beb212a8805849e46b5130c230275d0a5" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/speculator.py", + "sha256": "5b97f54e20ddf65b98e939832d050745f67ef43cfa145786da300f1a8322e3c6" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/cudagraph.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/cudagraph.py", + "sha256": "beab567ae2df6a2ba2cd92fe7ee452c6b959b8a7037a4b5f493993a1824619bb" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/speculator.py", + "sha256": "f9c100f42f9326e48eb84e89281897e859ba761943f54d593523555ccd98dc63" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/utils.py", + "sha256": "53d2c3ad474d290d2c6df027446bbd80ac7447684e5242ab2c3c5337d2abd383" + }, + "vllm/v1/worker/gpu/spec_decode/dflash2/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash2/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/dflash2/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash2/speculator.py", + "sha256": "b70043550938a1df9aecc85d8c8224c38c929ca34f68834572f6e723854d2027" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/speculator.py", + "sha256": "dcf4abdedbd2bddd0d76be198ccf5b4e467c46f645038c35fcab821491a35b03" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/utils.py", + "sha256": "86af2bf30604a184312e8f076097b91ecfec704f409f9d68d634b03d6b318070" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/eagle3_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/eagle3_utils.py", + "sha256": "201ee875fcc3d076a8fc1f3876dcbf85736b221a368555243a8987ff26a1674e" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/speculator.py", + "sha256": "746e318a4f266d75522ff7f3731ea9b4527b7b4824f71364d1a62184ea1f7b3d" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/utils.py", + "sha256": "94de6f55a1761f24f4aa1388cbc3b3763d4ab3ee53260330056ad31ce0b78236" + }, + "vllm/v1/worker/gpu/spec_decode/extract_hidden_states.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/extract_hidden_states.py", + "sha256": "93c4233be7b2d2290b33902ea9b3bb5274c11701830851d03967a22144536e2d" + }, + "vllm/v1/worker/gpu/spec_decode/gemma4/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/gemma4/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/gemma4/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/gemma4/speculator.py", + "sha256": "9991210d7babd2caf2cd10797ca8688543dedeafbc3b86bc7c979c1a6ae9f949" + }, + "vllm/v1/worker/gpu/spec_decode/mtp/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/mtp/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/mtp/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/mtp/speculator.py", + "sha256": "926d6c9ffdb368c971647911a60493820d056ce236fcae9d94a42fa2e006255d" + }, + "vllm/v1/worker/gpu/spec_decode/multi_module_mtp/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/multi_module_mtp/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/multi_module_mtp/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/multi_module_mtp/speculator.py", + "sha256": "d9d4735b9b33829332b0e845b6d3073b2f0436045ed693b25c6434f351644127" + }, + "vllm/v1/worker/gpu/spec_decode/rejection_sampler.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/rejection_sampler.py", + "sha256": "030db5bfca162cc1f305112f299de5d6d61c59d3ed0807fee46575441ca4086d" + }, + "vllm/v1/worker/gpu/spec_decode/rejection_sampler_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/rejection_sampler_utils.py", + "sha256": "214b61fa0abe88573beb779872c035b3954e5651a85bd438d99ee5905d3a62ec" + }, + "vllm/v1/worker/gpu/spec_decode/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/speculator.py", + "sha256": "3a1ab15bf8b20918852eb835fe9755046e99dcbac6ba6ca3d414949fc8bc695a" + }, + "vllm/v1/worker/gpu/spec_decode/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/utils.py", + "sha256": "282f2929eddae9ca7312269f799be07472334b6df9fd91878b5e839ec05e418c" + }, + "vllm/v1/worker/gpu/states.py": { + "path": "/vllm/v1/worker/gpu/states.py", + "sha256": "99418f5df43ca612ded72609fee011620b065b2cab2f249ccb387096bf4ae71a" + }, + "vllm/v1/worker/gpu/structured_outputs.py": { + "path": "/vllm/v1/worker/gpu/structured_outputs.py", + "sha256": "18a10532db7e66b55e334acacd1fd989ad6361adf31dd0de9a9a65e23db25951" + }, + "vllm/v1/worker/gpu/ubatch_utils.py": { + "path": "/vllm/v1/worker/gpu/ubatch_utils.py", + "sha256": "5092e2e58af0561c8dc12e62847cfc6dda9ca20dfbd33e7f0cd77a83fe87f7c5" + }, + "vllm/v1/worker/gpu/warmup.py": { + "path": "/vllm/v1/worker/gpu/warmup.py", + "sha256": "423ac32d58fe008c228cfa223e4fcebfcf87e3463a9dbdf80a083c0578d73723" + }, + "vllm/v1/worker/gpu_input_batch.py": { + "path": "/vllm/v1/worker/gpu_input_batch.py", + "sha256": "18cf455c9d0eea61cc581c7932f2e6cd09786914e82dd35eef1c1430da359a0f" + }, + "vllm/v1/worker/gpu_model_runner.py": { + "path": "/vllm/v1/worker/gpu_model_runner.py", + "sha256": "87c29d08c0bbf66993d8b984811e7325e35e6436242a773feb55ec88f16b2c51" + }, + "vllm/v1/worker/gpu_ubatch_wrapper.py": { + "path": "/vllm/v1/worker/gpu_ubatch_wrapper.py", + "sha256": "4233cfbe8c9884b042c4363890108f616483b694ebe9a6e69578dcf89c6dac5c" + }, + "vllm/v1/worker/gpu_worker.py": { + "path": "/vllm/v1/worker/gpu_worker.py", + "sha256": "6994436e4547c0996ab555b3e814e8ccea26b650dfc1b378b97d640745309347" + }, + "vllm/v1/worker/kv_connector_model_runner_mixin.py": { + "path": "/vllm/v1/worker/kv_connector_model_runner_mixin.py", + "sha256": "e1cc76d065a7e60aacddb190ae795a480b65cd02ba71a1fc699a02a85c1a3de2" + }, + "vllm/v1/worker/lora_model_runner_mixin.py": { + "path": "/vllm/v1/worker/lora_model_runner_mixin.py", + "sha256": "fef6092a15d8d37f6fa22495e6106e2e5280180908d61ce43d9ff5bf4eef3f2f" + }, + "vllm/v1/worker/mamba_utils.py": { + "path": "/vllm/v1/worker/mamba_utils.py", + "sha256": "23fdaa4e8f63ee8f938eaa1a2b39f803cb04fa6ecd69789563254b1a0691413a" + }, + "vllm/v1/worker/mm_encoder_model_runner.py": { + "path": "/vllm/v1/worker/mm_encoder_model_runner.py", + "sha256": "780c41be84ad022205c21c1decb6bb8d5afb03bc7be120c1f7df03b710acc3d7" + }, + "vllm/v1/worker/sentinel/__init__.py": { + "path": "/vllm/v1/worker/sentinel/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/sentinel/gpu_worker_sentinel.py": { + "path": "/vllm/v1/worker/sentinel/gpu_worker_sentinel.py", + "sha256": "3959b8619d052c5dd247815074e03ec21ec9b43cc424ff2d296abc19b227b852" + }, + "vllm/v1/worker/startup_plan.py": { + "path": "/vllm/v1/worker/startup_plan.py", + "sha256": "84bcbb4f7a9fd7c8d10c9c895aadd9673d44c767b9132368d11eb5e017afe86b" + }, + "vllm/v1/worker/ubatch_utils.py": { + "path": "/vllm/v1/worker/ubatch_utils.py", + "sha256": "b34dce551b5195c414e6a3a997c75961cc7a17f24c7c980487fe3d3e2ba7a798" + }, + "vllm/v1/worker/ubatching.py": { + "path": "/vllm/v1/worker/ubatching.py", + "sha256": "40391241c564feb5f16c77898ae6ae152ed6e71a4682e2a406387785d8de02d7" + }, + "vllm/v1/worker/utils.py": { + "path": "/vllm/v1/worker/utils.py", + "sha256": "0ca3ec6bf4d20076145b7fe64e564962adebedc8f75a856b517ba0b2f2d77acf" + }, + "vllm/v1/worker/worker_base.py": { + "path": "/vllm/v1/worker/worker_base.py", + "sha256": "4a1a5266b912fe97991d8dc89d92b923990da9f6cb4b817d00d52e9c0d26dd7c" + }, + "vllm/v1/worker/workspace.py": { + "path": "/vllm/v1/worker/workspace.py", + "sha256": "d21c08167d1d0d1c0cddaa80453a53a0b4dec5d81b5a537c94a21324344976b3" + }, + "vllm/v1/worker/xpu_model_runner.py": { + "path": "/vllm/v1/worker/xpu_model_runner.py", + "sha256": "07fa0390d28f2b8c3c3c0019eb9c3b126e2397aea268ba47c889f06b423deb23" + }, + "vllm/v1/worker/xpu_worker.py": { + "path": "/vllm/v1/worker/xpu_worker.py", + "sha256": "711b56432506b58041cd86e71320c3960413f7bd61061990b66488421d81cfc3" + } + }, + "prefix": "", + "pth": { + "/__editable__.megatron_core-0.16.0rc0.pth": "d55c9b64480b34aae3d4d31e7706b93391c969dec6e0498e50963b03445a57b0", + "/__editable__.rl_kernel-0.1.0.pth": "1454c4987b35762a0d189d4e901c5d077fde62a1944fbaabecea230e57f3923a", + "/__editable__.vime-0.3.2.pth": "77eec5d06d628cb952e65edd813ca88d8db67ccc785083e1b7b29011b92bec4f", + "/distutils-precedence.pth": "2638ce9e2500e572a5e0de7faed6661eb569d1b696fcba07b0dd223da5f5d224", + "/qwen3_next_cuda_runtime.pth": "e0d3ab57dd3ff4f5d55fcf76e83c549cc00b3c813e6f717c540d5ded79fa2f49", + "/qwen3_next_megatron_source.pth": "8556ac057538e82856cb76cbbc954f58312a3f45373daec3eec826031cfd2709", + "/__editable__.rl_kernel-0.1.0.pth": "1454c4987b35762a0d189d4e901c5d077fde62a1944fbaabecea230e57f3923a", + "/distutils-precedence.pth": "2638ce9e2500e572a5e0de7faed6661eb569d1b696fcba07b0dd223da5f5d224", + "/nvidia_cutlass_dsl_packages.pth": "cc710b99ddb3d76361a70461461d274212a979d00c381d821fce5bb3ad9cf246" + }, + "pyvenv_cfg_sha256": "48579f2c6d35c3d535c2690d7d426587c4b8e92021463f0266b38d35dfbbb834", + "sources": { + "/Megatron-LM-training": { + "patch_sha256": "f66035f12501aa1d08e8884e0dea5a22d59825d717aeda73c3e83876e3efd79f", + "path": "/Megatron-LM-training", + "tree": "731fc44a368d6cac8c6171a29d5c687ff0d95bd1" + }, + "/vime": { + "patch_sha256": "66949839d4c18329444f4f9f6dcd702b53ce1b94e9aa15ed111f28743bfaa4b9", + "path": "/vime", + "tree": "f5174e67dbcdaef983eecd45f215fef2d8429dd0" + } + }, + "version": "3.12.14 | packaged by Anaconda, Inc. | (main, Aug 27 2026, 14:46:43) [GCC 14.3.0]" + }, + "sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca" + }, + "memory": { + "limits": { + "/memory.limit_in_bytes": "9223372036854771712", + "/memory.limit_in_bytes": "9223372036854771712", + "/memory.limit_in_bytes": "9223372036854771712" + }, + "cgroup_bytes": null, + "declared_bytes": 549755813888, + "effective_bytes": 549755813888, + "available_bytes": 2090224148480 + }, + "gpu_uuids": [ + "f84b0ae3-604b-7194-e772-280f5d102d46", + "225c7841-f606-0248-cce4-31f3ae0b215d", + "46fa983d-5878-1d92-4a61-197f569e8b01", + "79936bd2-1377-8dcf-bdb1-e6e772d0e0f3" + ], + "execution_gpus": 4 +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/layers/layers.json b/docs/usage/evidence/qwen3-next-chain-b200/layers/layers.json new file mode 100644 index 000000000..0eb4ff345 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/layers/layers.json @@ -0,0 +1,457 @@ +{ + "schema_version": 1, + "status": "passed", + "phase": "complete", + "scope": "qwen3_next_layer_and_scheduler_gates", + "full_model_l2": "not_evaluated", + "identity": { + "source_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "checkpoint": "", + "weight_version": "baseline", + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "architecture_layers": 48, + "weights_dtype": "bfloat16", + "recurrent_state_dtype": "float32" + }, + "requirements_sha256": "b1513a1392b9f5d668d697ac529541f4aee0efa18d6d2e0b6909a6987f50f762", + "gates": { + "gdn": { + "pid": 223868, + "exit_code": 0, + "log": "/attempts/0/gdn.log", + "gpu_release_verified": true, + "ranks": { + "0": { + "path": "/attempts/0/gdn/rank-0.json", + "sha256": "07a8483c933bb3c7cabfb4fa1e3f9159f5c1b7d9ff418e99c8ec67ebe02e3bc9" + }, + "1": { + "path": "/attempts/0/gdn/rank-1.json", + "sha256": "0e203e3c3cdf032f57bda4d8d744ab1c6c5e31c18abef5357f4022d62ac3ace8" + }, + "2": { + "path": "/attempts/0/gdn/rank-2.json", + "sha256": "9d854ae177d2bda209a926d6164110a622e17eb8adb822f2dfe6470c50ccd2cc" + }, + "3": { + "path": "/attempts/0/gdn/rank-3.json", + "sha256": "93645a11211bb18bee45248869eeb7c419f0238525946315be23089085aa318e" + } + } + }, + "attention": { + "pid": 226184, + "exit_code": 0, + "log": "/attempts/0/attention.log", + "gpu_release_verified": true, + "ranks": { + "0": { + "path": "/attempts/0/attention/rank-0.json", + "sha256": "91692235ed321070387b5dfbc0dd98a482955633899f1b6a57010e294a6bb28b" + }, + "1": { + "path": "/attempts/0/attention/rank-1.json", + "sha256": "96fddfd0800fb638ba2014dc8cbae7d3c8bcee43750395fc774ab9293064b945" + }, + "2": { + "path": "/attempts/0/attention/rank-2.json", + "sha256": "5d1f28ea549a2837df274a58dc7e36f3fec24fb79aab4314a6068e90e19474d9" + }, + "3": { + "path": "/attempts/0/attention/rank-3.json", + "sha256": "7a206edc5e12a8cfce9384b7598c5986c91361759c0db224e99de35841c89d86" + } + } + }, + "moe": { + "pid": 226862, + "exit_code": 0, + "log": "/attempts/0/moe.log", + "gpu_release_verified": true, + "ranks": { + "0": { + "path": "/attempts/0/moe/rank-0.json", + "sha256": "9e4a30ba3b70e8f388b4edd7adc20ffa1548499fc5020ccde4bd10089634d9bb" + }, + "1": { + "path": "/attempts/0/moe/rank-1.json", + "sha256": "59757c1135171be8dd465b721aa8211c903e794bef011c9f128ef0fc7ed9f97c" + }, + "2": { + "path": "/attempts/0/moe/rank-2.json", + "sha256": "926791368dc31d7f396d5c6e13fa3082560e79e5381df05697c5f89d2674cc74" + }, + "3": { + "path": "/attempts/0/moe/rank-3.json", + "sha256": "08698e2f63f8bf301956d1cac73c4404bad27a4a3a0edcc0ad6a4b14419f1b50" + } + } + }, + "adapters": { + "pid": 229079, + "exit_code": 0, + "log": "/attempts/0/adapters.log", + "gpu_release_verified": true, + "ranks": { + "0": { + "path": "/attempts/0/adapters/rank-0.json", + "sha256": "e0d0b81cce5275a4b300e73907ee188c451d3b5fe4f9bc7fe4d8b102844234be" + }, + "1": { + "path": "/attempts/0/adapters/rank-1.json", + "sha256": "3235285ec77ef743875cb4b96e736029ad0d42e2e07f6ebb69f0abc2f87610fc" + }, + "2": { + "path": "/attempts/0/adapters/rank-2.json", + "sha256": "8b0c3043ed8bd06960795279af650471369aecb8ecc70f9a24353775b55d9926" + }, + "3": { + "path": "/attempts/0/adapters/rank-3.json", + "sha256": "360e04fbf952d44dc15dee84b758bd96bd9cba1b7eb8f4441e6d54145022803d" + } + } + }, + "heads": { + "pid": 233053, + "exit_code": 0, + "log": "/attempts/0/heads.log", + "gpu_release_verified": true, + "ranks": { + "0": { + "path": "/attempts/0/heads/rank-0.json", + "sha256": "cedaf6a87ca96b29755ae7bb3a388bbd640fff57b0421eb895932e9068be5107" + }, + "1": { + "path": "/attempts/0/heads/rank-1.json", + "sha256": "6cb21db2d049d23d37c7f45fa1e24e11a8260be34b0209a3bcd9e536f3192daa" + }, + "2": { + "path": "/attempts/0/heads/rank-2.json", + "sha256": "71518967fbf6baa1e1fde70f47c0b0049451f4281335d91fd336801c5b444055" + }, + "3": { + "path": "/attempts/0/heads/rank-3.json", + "sha256": "0091b5f7495d36bb7edf3a411cb22cf8c9249fe729015a2756e07c1fa862ccfa" + } + } + } + }, + "provider_binary": { + "path": "/attempts/0/provider-binary.json", + "sha256": "57d008e706cc4875d1c471ca18f007aeacc659e675a01921e3d1ca6944489846" + }, + "scheduler": { + "path": "/attempts/0/scheduler-report.json", + "sha256": "c536b5c6c6724777dd33168fad39be540e46f166f5e8d5beaf60d015f34e83e2" + } +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/layers/operators.json b/docs/usage/evidence/qwen3-next-chain-b200/layers/operators.json new file mode 100644 index 000000000..500251cce --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/layers/operators.json @@ -0,0 +1,304 @@ +{ + "scope": "qwen3_next_operators_only", + "status": "passed", + "suite": "all", + "diagnostic_only": false, + "full_model_l2": "not_evaluated", + "git_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "git_dirty": false, + "versions": { + "torch": "2.13.0", + "vllm": "0.30.0", + "transformers": "5.17.0", + "triton": "3.7.1" + }, + "mandatory_case_ids": [ + "tests/check_qwen3_next_attention.py::test_d256_backward_with_cached_prefix_matches_float64_formula", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[1024]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[256]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[64]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[8]", + "tests/check_qwen3_next_attention.py::test_d256_input_device_guard_and_nondefault_stream", + "tests/check_qwen3_next_attention.py::test_native_backward_rejects_malformed_probability_and_gradient_buffers", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[0]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[2]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_target_inputs_do_not_depend_on_companions", + "tests/check_qwen3_next_batch_invariance.py::test_triton_chunked_prefill_is_batch_invariant", + "tests/check_qwen3_next_conv_bridge.py::test_chunked_and_reordered_sequences_match", + "tests/check_qwen3_next_conv_bridge.py::test_empty_sequence_preserves_cache_and_gradients", + "tests/check_qwen3_next_conv_bridge.py::test_response_gradient_reaches_prompt_and_convolution_weight", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths0]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths1]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths2]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-4]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[1]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[4]", + "tests/check_qwen3_next_core_matrix.py::test_variable_lengths_empty_and_mixed_step_match_independent_sequences", + "tests/check_qwen3_next_forward.py::test_combine_has_fixed_route_order_and_differentiable_weights", + "tests/check_qwen3_next_forward.py::test_full_vocabulary_logprob_entropy_modes_and_gradient", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_fail_closed_on_the_tensor_descriptor_path", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[128]", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[512]", + "tests/check_qwen3_next_forward.py::test_logprob_nan_rejected_before_comparison", + "tests/check_qwen3_next_forward.py::test_moe_vjp_matches_independent_double_formula", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[1024-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[128-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-16]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-256]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-3072]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-37984]", + "tests/check_qwen3_next_forward.py::test_qwen_moe_actual_tp4_shapes_and_independent_training_forward", + "tests/check_qwen3_next_forward.py::test_route_weights_are_batch_invariant", + "tests/check_qwen3_next_forward.py::test_shared_linear_vjp_and_empty_tokens", + "tests/check_qwen3_next_forward.py::test_stable_route_tie_boundary_and_router_gradient", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_backward_matches_recomputed_recurrence_vjp", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_forward_is_provider_exact_and_does_not_mutate_inputs", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_keeps_prompt_state_gradient_through_response", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[False]", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[True]", + "tests/check_qwen3_next_gdn_bridge.py::test_initial_state_vjp_matches_provider_directional_difference", + "tests/check_qwen3_next_gdn_sequence.py::test_1024_token_chunk_continuation_is_bitwise_exact", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad0]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad1]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad2]", + "tests/check_qwen3_next_gdn_sequence.py::test_chunk_boundary_retains_prompt_and_initial_state_gradients", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths0]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths1]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths2]", + "tests/check_qwen3_next_gdn_sequence.py::test_reserved_and_duplicate_slots_are_rejected", + "tests/check_qwen3_next_norm_providers.py::test_custom_op_has_distinct_native_and_cuda_paths", + "tests/check_qwen3_next_norm_providers.py::test_gdn_decode_provider_env_defaults_are_recorded", + "tests/check_qwen3_next_norm_providers.py::test_our_gated_op_is_batch_invariant", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_cuda]", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_native]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots0]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots2]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots3]", + "tests/check_qwen3_next_shared_core.py::test_independent_training_forward_matches_inference_and_retains_gradients", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[1024]", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[8]", + "tests/check_qwen3_next_shared_core.py::test_unimplemented_provider_profile_is_rejected", + "tests/test_qwen3_next_norm.py::test_bad_weight_shape_raises", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[16]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[1]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[2]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[32]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[48]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[64]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[8]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[128]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[2048]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_with_padding", + "tests/test_qwen3_next_norm.py::test_call_matches_forward", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[128]", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[2048]", + "tests/test_qwen3_next_norm.py::test_cuda_default_offset_preserves_plain_convention", + "tests/test_qwen3_next_norm.py::test_cuda_gated_backward_matches_autograd_golden", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_matches_golden_within_contract", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_bad_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_mismatched_gate", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_backward_uses_the_sigmoid_derivative", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_swish_is_an_alias_for_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_unit_weight_is_plain_norm_times_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_weight_offset_is_applied_in_fp32", + "tests/test_qwen3_next_norm.py::test_cuda_gated_wrapper_rejects_equal_numel_wrong_shape", + "tests/test_qwen3_next_norm.py::test_cuda_gated_zero_gate_zeroes_output", + "tests/test_qwen3_next_norm.py::test_cuda_offset_equals_explicit_fp32_weight", + "tests/test_qwen3_next_norm.py::test_cuda_offset_is_not_folded_through_bfloat16", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_backward_is_offset_aware", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_within_tolerance_of_golden", + "tests/test_qwen3_next_norm.py::test_deterministic_repeat", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype0]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype1]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype2]", + "tests/test_qwen3_next_norm.py::test_eps_inside_sqrt", + "tests/test_qwen3_next_norm.py::test_gated_batch_invariance_slice", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedHFOp]", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedOp]", + "tests/test_qwen3_next_norm.py::test_gated_conventions_diverge_in_low_precision", + "tests/test_qwen3_next_norm.py::test_gated_cuda_op_rejects_bad_activation_at_construction", + "tests/test_qwen3_next_norm.py::test_gated_extension_handles_empty_batch_and_nondefault_stream", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[dy_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[gate_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[rstd_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_shape]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_matches_hf_formula_fp32", + "tests/test_qwen3_next_norm.py::test_gated_shape_mismatch_raises", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_strict_matches_vllm_formula_fp32", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[128]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[2048]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_offset_applied_in_fp32_not_folded_into_bf16", + "tests/test_qwen3_next_norm.py::test_op_batch_invariance_on_device", + "tests/test_qwen3_next_norm.py::test_plain_reference_is_unchanged_by_the_offset_plumbing", + "tests/test_qwen3_next_norm.py::test_weight_offset_is_one", + "tests/test_qwen3_next_norm.py::test_zero_centred_cuda_constructor_rejects_missing_extension", + "tests/test_qwen3_next_norm.py::test_zero_centred_op_inherits_the_plain_reference", + "tests/test_qwen3_next_norm.py::test_zero_weight_is_identity_scaling" + ], + "case_ids_sha256": "694c931b65f9cfa5db963f2eca6d11bd309546c824a1df52f9da2ab128e83e0f", + "pytest_exit_code": 0, + "provider_tests": { + "tests": 233, + "failures": 0, + "errors": 0, + "skipped": 0 + }, + "norm_gates": { + "qwen3_next_rms_norm-forward.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + }, + "qwen3_next_rms_norm-gradient.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + }, + "rms_norm_gated-forward.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + }, + "rms_norm_gated-gradient.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + } + } +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/layers/provider_binary.json b/docs/usage/evidence/qwen3-next-chain-b200/layers/provider_binary.json new file mode 100644 index 000000000..4f70ebb27 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/layers/provider_binary.json @@ -0,0 +1,13 @@ +{ + "schema_version": 1, + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "actual": { + "module": "rl_engine._C", + "path": "/source/rl_engine/_C.cpython-312-x86_64-linux-gnu.so", + "sha256": "7d0df906594504667e3a0570af9f599bd8c5b915e0dd298a830ab19255e06124" + }, + "archive": { + "path": "/attempts/0/provider-binary.so", + "sha256": "7d0df906594504667e3a0570af9f599bd8c5b915e0dd298a830ab19255e06124" + } +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/layers/result.json b/docs/usage/evidence/qwen3-next-chain-b200/layers/result.json new file mode 100644 index 000000000..bada855df --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/layers/result.json @@ -0,0 +1,775 @@ +{ + "contract_version": 4, + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "cuda_identity": { + "home": "", + "nvcc_sha256": "b8e2347d9d7fcadf8812a27324d515de99d033d3e48611811ece7e66d7895f8a" + }, + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "operator_requirements": { + "suite": "all", + "case_ids": [ + "tests/check_qwen3_next_attention.py::test_d256_backward_with_cached_prefix_matches_float64_formula", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[1024]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[256]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[64]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[8]", + "tests/check_qwen3_next_attention.py::test_d256_input_device_guard_and_nondefault_stream", + "tests/check_qwen3_next_attention.py::test_native_backward_rejects_malformed_probability_and_gradient_buffers", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[0]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[2]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_target_inputs_do_not_depend_on_companions", + "tests/check_qwen3_next_batch_invariance.py::test_triton_chunked_prefill_is_batch_invariant", + "tests/check_qwen3_next_conv_bridge.py::test_chunked_and_reordered_sequences_match", + "tests/check_qwen3_next_conv_bridge.py::test_empty_sequence_preserves_cache_and_gradients", + "tests/check_qwen3_next_conv_bridge.py::test_response_gradient_reaches_prompt_and_convolution_weight", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths0]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths1]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths2]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-4]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[1]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[4]", + "tests/check_qwen3_next_core_matrix.py::test_variable_lengths_empty_and_mixed_step_match_independent_sequences", + "tests/check_qwen3_next_forward.py::test_combine_has_fixed_route_order_and_differentiable_weights", + "tests/check_qwen3_next_forward.py::test_full_vocabulary_logprob_entropy_modes_and_gradient", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_fail_closed_on_the_tensor_descriptor_path", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[128]", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[512]", + "tests/check_qwen3_next_forward.py::test_logprob_nan_rejected_before_comparison", + "tests/check_qwen3_next_forward.py::test_moe_vjp_matches_independent_double_formula", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[1024-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[128-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-16]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-256]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-3072]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-37984]", + "tests/check_qwen3_next_forward.py::test_qwen_moe_actual_tp4_shapes_and_independent_training_forward", + "tests/check_qwen3_next_forward.py::test_route_weights_are_batch_invariant", + "tests/check_qwen3_next_forward.py::test_shared_linear_vjp_and_empty_tokens", + "tests/check_qwen3_next_forward.py::test_stable_route_tie_boundary_and_router_gradient", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_backward_matches_recomputed_recurrence_vjp", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_forward_is_provider_exact_and_does_not_mutate_inputs", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_keeps_prompt_state_gradient_through_response", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[False]", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[True]", + "tests/check_qwen3_next_gdn_bridge.py::test_initial_state_vjp_matches_provider_directional_difference", + "tests/check_qwen3_next_gdn_sequence.py::test_1024_token_chunk_continuation_is_bitwise_exact", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad0]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad1]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad2]", + "tests/check_qwen3_next_gdn_sequence.py::test_chunk_boundary_retains_prompt_and_initial_state_gradients", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths0]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths1]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths2]", + "tests/check_qwen3_next_gdn_sequence.py::test_reserved_and_duplicate_slots_are_rejected", + "tests/check_qwen3_next_norm_providers.py::test_custom_op_has_distinct_native_and_cuda_paths", + "tests/check_qwen3_next_norm_providers.py::test_gdn_decode_provider_env_defaults_are_recorded", + "tests/check_qwen3_next_norm_providers.py::test_our_gated_op_is_batch_invariant", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_cuda]", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_native]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots0]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots2]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots3]", + "tests/check_qwen3_next_shared_core.py::test_independent_training_forward_matches_inference_and_retains_gradients", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[1024]", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[8]", + "tests/check_qwen3_next_shared_core.py::test_unimplemented_provider_profile_is_rejected", + "tests/test_qwen3_next_norm.py::test_bad_weight_shape_raises", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[16]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[1]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[2]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[32]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[48]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[64]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[8]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[128]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[2048]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_with_padding", + "tests/test_qwen3_next_norm.py::test_call_matches_forward", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[128]", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[2048]", + "tests/test_qwen3_next_norm.py::test_cuda_default_offset_preserves_plain_convention", + "tests/test_qwen3_next_norm.py::test_cuda_gated_backward_matches_autograd_golden", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_matches_golden_within_contract", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_bad_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_mismatched_gate", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_backward_uses_the_sigmoid_derivative", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_swish_is_an_alias_for_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_unit_weight_is_plain_norm_times_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_weight_offset_is_applied_in_fp32", + "tests/test_qwen3_next_norm.py::test_cuda_gated_wrapper_rejects_equal_numel_wrong_shape", + "tests/test_qwen3_next_norm.py::test_cuda_gated_zero_gate_zeroes_output", + "tests/test_qwen3_next_norm.py::test_cuda_offset_equals_explicit_fp32_weight", + "tests/test_qwen3_next_norm.py::test_cuda_offset_is_not_folded_through_bfloat16", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_backward_is_offset_aware", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_within_tolerance_of_golden", + "tests/test_qwen3_next_norm.py::test_deterministic_repeat", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype0]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype1]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype2]", + "tests/test_qwen3_next_norm.py::test_eps_inside_sqrt", + "tests/test_qwen3_next_norm.py::test_gated_batch_invariance_slice", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedHFOp]", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedOp]", + "tests/test_qwen3_next_norm.py::test_gated_conventions_diverge_in_low_precision", + "tests/test_qwen3_next_norm.py::test_gated_cuda_op_rejects_bad_activation_at_construction", + "tests/test_qwen3_next_norm.py::test_gated_extension_handles_empty_batch_and_nondefault_stream", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[dy_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[gate_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[rstd_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_shape]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_matches_hf_formula_fp32", + "tests/test_qwen3_next_norm.py::test_gated_shape_mismatch_raises", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_strict_matches_vllm_formula_fp32", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[128]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[2048]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_offset_applied_in_fp32_not_folded_into_bf16", + "tests/test_qwen3_next_norm.py::test_op_batch_invariance_on_device", + "tests/test_qwen3_next_norm.py::test_plain_reference_is_unchanged_by_the_offset_plumbing", + "tests/test_qwen3_next_norm.py::test_weight_offset_is_one", + "tests/test_qwen3_next_norm.py::test_zero_centred_cuda_constructor_rejects_missing_extension", + "tests/test_qwen3_next_norm.py::test_zero_centred_op_inherits_the_plain_reference", + "tests/test_qwen3_next_norm.py::test_zero_weight_is_identity_scaling" + ], + "case_ids_sha256": "694c931b65f9cfa5db963f2eca6d11bd309546c824a1df52f9da2ab128e83e0f", + "norm_gates": [ + "qwen3_next_rms_norm-forward.json", + "qwen3_next_rms_norm-gradient.json", + "rms_norm_gated-forward.json", + "rms_norm_gated-gradient.json" + ] + }, + "layer_requirements": { + "schema_version": 1, + "gates": { + "gdn": { + "script": "scripts/qwen3_next_tp_gdn_check.py", + "output_option": "--output", + "scope": "tp4_gdn_layer0", + "groups": { + "cases": [ + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "prompt-gradient", + "replicated-norm-gradient", + "hf-load-export" + ] + }, + "script_sha256": "cc4338893f90af004c51c20fc67d1a9a3f4bf8d26775277f72671c02983e4df5" + }, + "attention": { + "script": "scripts/qwen3_next_tp_attention_check.py", + "output_option": "--output", + "scope": "tp4_full_attention_layer3", + "groups": { + "attention.cases": [ + "hf-load-export", + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "batch4-varlen-reorder", + "sixteen-token-decode", + "prompt-gradient", + "kv-pair-gradient", + "qk-norm-gradient" + ] + }, + "script_sha256": "d27d43efb05415a8ef5892c3c2238a2b9744a4821f5466faf46c6510e6e01bec" + }, + "moe": { + "script": "scripts/qwen3_next_tp_moe_check.py", + "output_option": "--output", + "scope": "tp4_moe_block_layer0", + "groups": { + "moe.cases": [ + "hf-load-export-all512experts", + "routes-replicated-8", + "full-chunk-reorder-8", + "routes-replicated-64", + "full-chunk-reorder-64", + "routes-replicated-256", + "full-chunk-reorder-256", + "routes-replicated-1024", + "full-chunk-reorder-1024", + "training-forward", + "all-parameter-gradient", + "replicated-router-gradient" + ] + }, + "script_sha256": "d5c1bbbb82e408b65871b0cb1638d7a6cf8cfe07f0a3315a657b7dc232d544be" + }, + "adapters": { + "script": "scripts/qwen3_next_adapter_check.py", + "output_option": "--out", + "scope": "gdn_engine_adapter_component", + "groups": { + "cases": [ + "batch1-length8", + "batch1-length64", + "batch1-length256", + "batch1-length1024", + "batch4-length8", + "batch4-length64", + "batch4-length256", + "batch4-length1024", + "mixed-prefill-decode16-reorder" + ] + }, + "fields": { + "prompt_gradient": "passed", + "hf_conv_roundtrip": "passed", + "batch_invariance_capability_registered": false + }, + "script_sha256": "3ce45bb317237c1a06533116d65fb77c2a23b6f503ae46406ede543036eb0f20" + }, + "heads": { + "script": "scripts/qwen3_next_tp_head_check.py", + "output_option": "--output", + "scope": "tp4_embedding_lm_head_only", + "groups": { + "cases": [ + "hf-embedding-roundtrip", + "hf-lm-head-roundtrip", + "replicated-norm-gradient", + "nonzero-finite-embedding-head-gradient", + "embedding-repeat-100", + "batch-invariant-prompt8", + "batch-invariant-prompt64", + "batch-invariant-prompt256", + "batch-invariant-prompt1024", + "logprob-original-and-promoted-logits", + "entropy-interface" + ] + }, + "script_sha256": "0504185d21a75405c8e994bc57b016cf4ec357d8b16e7430772c11934f2af876" + } + }, + "scheduler_case_ids": [ + "p0008-b1-full", + "p0008-b1-chunked", + "p0008-b4-full", + "p0008-b4-chunked", + "p0064-b1-full", + "p0064-b1-chunked", + "p0064-b4-full", + "p0064-b4-chunked", + "p0256-b1-full", + "p0256-b1-chunked", + "p0256-b4-full", + "p0256-b4-chunked", + "p1024-b1-full", + "p1024-b1-chunked", + "p1024-b4-full", + "p1024-b4-chunked" + ], + "registry_sha256": "e3949a750cb27c1897a000f3b023f912629906612ae8949c1575d0acc36df5ec", + "case_ids_per_rank": [ + "adapters/cases/batch1-length1024", + "adapters/cases/batch1-length256", + "adapters/cases/batch1-length64", + "adapters/cases/batch1-length8", + "adapters/cases/batch4-length1024", + "adapters/cases/batch4-length256", + "adapters/cases/batch4-length64", + "adapters/cases/batch4-length8", + "adapters/cases/mixed-prefill-decode16-reorder", + "attention/attention.cases/batch4-varlen-reorder", + "attention/attention.cases/full-chunk-1024", + "attention/attention.cases/full-chunk-256", + "attention/attention.cases/full-chunk-64", + "attention/attention.cases/full-chunk-8", + "attention/attention.cases/hf-load-export", + "attention/attention.cases/kv-pair-gradient", + "attention/attention.cases/prompt-gradient", + "attention/attention.cases/qk-norm-gradient", + "attention/attention.cases/sixteen-token-decode", + "gdn/cases/full-chunk-1024", + "gdn/cases/full-chunk-256", + "gdn/cases/full-chunk-64", + "gdn/cases/full-chunk-8", + "gdn/cases/hf-load-export", + "gdn/cases/prompt-gradient", + "gdn/cases/replicated-norm-gradient", + "heads/cases/batch-invariant-prompt1024", + "heads/cases/batch-invariant-prompt256", + "heads/cases/batch-invariant-prompt64", + "heads/cases/batch-invariant-prompt8", + "heads/cases/embedding-repeat-100", + "heads/cases/entropy-interface", + "heads/cases/hf-embedding-roundtrip", + "heads/cases/hf-lm-head-roundtrip", + "heads/cases/logprob-original-and-promoted-logits", + "heads/cases/nonzero-finite-embedding-head-gradient", + "heads/cases/replicated-norm-gradient", + "moe/moe.cases/all-parameter-gradient", + "moe/moe.cases/full-chunk-reorder-1024", + "moe/moe.cases/full-chunk-reorder-256", + "moe/moe.cases/full-chunk-reorder-64", + "moe/moe.cases/full-chunk-reorder-8", + "moe/moe.cases/hf-load-export-all512experts", + "moe/moe.cases/replicated-router-gradient", + "moe/moe.cases/routes-replicated-1024", + "moe/moe.cases/routes-replicated-256", + "moe/moe.cases/routes-replicated-64", + "moe/moe.cases/routes-replicated-8", + "moe/moe.cases/training-forward" + ], + "case_ids_sha256": "be74417dfbd6031ba27978d06d04bb15daaab2aeb57d132c7e0d41176b28b46e" + }, + "source_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "run_id": "20261009T032730Z-layers-c67ec144-397c157d", + "stage": "layers", + "suite": "all", + "execution_id": "397c157d5a60491c891d1ebc5490189b", + "attempt": "0", + "status": "passed", + "phase": "complete", + "scope": "qwen3_next_layer_and_scheduler_gates", + "full_model_l2": "not_evaluated", + "evidence": { + "operators": { + "path": "attempts/0/operators.json", + "sha256": "dedb24b6ac2a01d37eb795a001376ca0b200a03e417f8131688aac67c19c2ebd" + }, + "environment": { + "path": "attempts/0/environment.json", + "sha256": "1ae63cfcc6908791e61832bab21f5a7ff7afc4f3d90a13a97d318e503d372193" + }, + "layers": { + "path": "attempts/0/layers.json", + "sha256": "291b1bd405287c1b5368c3be40b32b93c9521cca397ede466d26e5d93326f594" + }, + "checkpoint": { + "path": "attempts/0/weight-verification.json", + "sha256": "7ceb9dab2ce8c0a2551a970819f9f0adbb538f04c4124982458a42f997d7c934" + }, + "provider_binary": { + "path": "attempts/0/provider-binary.json", + "sha256": "57d008e706cc4875d1c471ca18f007aeacc659e675a01921e3d1ca6944489846" + } + } +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/layers/run.json b/docs/usage/evidence/qwen3-next-chain-b200/layers/run.json new file mode 100644 index 000000000..b6b556f19 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/layers/run.json @@ -0,0 +1,5248 @@ +{ + "run_id": "20261009T032730Z-layers-c67ec144-397c157d", + "execution_id": "397c157d5a60491c891d1ebc5490189b", + "contract_version": 4, + "suite": "all", + "execution_gpus": 4, + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "stage": "layers", + "source_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "source": "/source", + "python": "", + "cuda_home": "", + "checkpoint": "", + "memory": "512G", + "previous": "", + "status": "prepared", + "full_model_l2": "not_evaluated", + "environment": { + "identity": { + "base_prefix": "/miniconda3/envs/rlkernel", + "binary": "/python3.12", + "binary_sha256": "6a1eb3ffc29f3a6b0ece607b016b4cfa5ca3ac57b34f17ed3266b404f78d2729", + "build_tools": { + "ninja": { + "path": "/miniconda3/envs/rlkernel/bin/ninja", + "sha256": "08639e194fffa7f08b259fc4abfa4803aff66b64de52549cee42ec527d55cea6" + } + }, + "distributions": [ + { + "direct_url": null, + "metadata_sha256": "6f1038270be40f9b8c0bcf391c627e7d7f41ccdd19aa192d6eac1dbfc3b19abc", + "name": "GitPython", + "version": "3.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "3f71971502087521f123c9daa26bc12d31d3466738b567390b8602acad3be22a", + "name": "Jinja2", + "version": "3.1.6" + }, + { + "direct_url": null, + "metadata_sha256": "818fb343b7b6b99a32771bf4813521ae6440b4c7579b3ae46e32dd02da0afeee", + "name": "Markdown", + "version": "3.11" + }, + { + "direct_url": null, + "metadata_sha256": "dc1ee42cf8ecfeee0ab60b15b21d291833e0732548efcb7bb5b3564dca3e5bf7", + "name": "MarkupSafe", + "version": "3.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "de7389b142450a0014234286b0876f328439b823c355c73d0aed41fd67ec208c", + "name": "PyJWT", + "version": "2.15.1" + }, + { + "direct_url": null, + "metadata_sha256": "ffcad4415cafb22b8b536a61595e9ee13438b51d31b0763c1b273ce3bc58e840", + "name": "PyYAML", + "version": "6.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "8562d701cc52d9cafbb418942b0e072fc087ed8ddcf35cd10224c1b2ed8bdd91", + "name": "Pygments", + "version": "2.21.0" + }, + { + "direct_url": null, + "metadata_sha256": "b6c25fcfdcc495edf248a10ca4ad28327ef2ed6047a6ec5c6346e121414c7f21", + "name": "Werkzeug", + "version": "3.1.9" + }, + { + "direct_url": null, + "metadata_sha256": "55c400d24c71b581d9c0992f71df6047cf6c878bebe61a7d45d6e02dc0e4c510", + "name": "absl-py", + "version": "2.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "13db521f90a6a882027b2388eaa2ebf252945f9c2adb7e7e371da18239da4df0", + "name": "accelerate", + "version": "1.15.0" + }, + { + "direct_url": null, + "metadata_sha256": "86fe44e38e67872dd895c729044942ba2c2f934ae439a899fb83a186206b7fd4", + "name": "agent-detector", + "version": "2.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "afe11fe9f5aa54e734cdd51659bed8c89dc6bcd5aef0ad96f2d20149c8de5456", + "name": "aiohappyeyeballs", + "version": "2.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "570b307bc0b53fbbd3ed2ce0b7eca6bbf2fa73bf75e24a480f1034d8c0b832bf", + "name": "aiohttp", + "version": "3.14.3" + }, + { + "direct_url": null, + "metadata_sha256": "44b7f8e14c4770793e747fad50c9e0a6ee7357651d878554f192d94768dc14a8", + "name": "aiohttp-cors", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "648813a44a9ae0ab2f20ee86d2404dcc38e3f9e80c63316cf6e536735df14e54", + "name": "aiosignal", + "version": "1.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "f6a3f6668bacef7f73a2c19ccb2be910b2363d1731c4725cb04364d99e24935a", + "name": "annotated-doc", + "version": "0.0.5" + }, + { + "direct_url": null, + "metadata_sha256": "fc6d752cde6a6a4bff03474386de750e130b75da3c7815ee909f45b51fea98c8", + "name": "annotated-types", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "4e89d670a4b20029da30e5a9e8ebcbc844deff9c44209552bafd5537249c8b9e", + "name": "anthropic", + "version": "1.9.0" + }, + { + "direct_url": null, + "metadata_sha256": "b5a6f00800956387fcddab1fe1b5aa8502c249b86cfb16d58ed700f282f60142", + "name": "antlr4-python3-runtime", + "version": "4.9.3" + }, + { + "direct_url": null, + "metadata_sha256": "a6008defa9492cd08250217b134782cad1db4580e1d7ddf69cc2a2a48cea24e0", + "name": "anyio", + "version": "4.15.1" + }, + { + "direct_url": null, + "metadata_sha256": "7877c64ce8957237363f2df313819bb07f50752df016d14c5a5a99bec10f5deb", + "name": "apache-tvm-ffi", + "version": "0.1.11" + }, + { + "direct_url": null, + "metadata_sha256": "3543ca8f0e072c00ab111b20eba99ce86dbf93ada28988775bc2677284b3c07a", + "name": "astor", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "d4b328c09c024fe1e4d788a9c7715ad726095131b815cd35fd933268226f6269", + "name": "attrs", + "version": "26.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "4850c4d696a5e2a2ecbb3dd792b060acc1de79e09800669b0b9fc3a22c055e6d", + "name": "av", + "version": "19.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "863ff92208d0a02dabfa008bfe91846a5c401ded301e5687dca7dc63c911865f", + "name": "babel", + "version": "2.18.0" + }, + { + "direct_url": null, + "metadata_sha256": "f32e6df3197f05202e586624d95c5e217003d80cee655c165d533102f628df21", + "name": "backrefs", + "version": "8.0" + }, + { + "direct_url": null, + "metadata_sha256": "905c362f655fbc6d37a24686efc2b3bfbd3123b8ee5a443a43f6750d87455e90", + "name": "blake3", + "version": "1.0.10" + }, + { + "direct_url": null, + "metadata_sha256": "07c85682b6aefd5c9b48890d306c1604311902295704892ede48e5a83219a8d3", + "name": "blobfile", + "version": "3.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "2d582941a7081625a35f35a0c4a2e80f7737312e29c38e5fdb6fc08f9c113077", + "name": "bracex", + "version": "3.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "3b60c55bae0d0340c3a3fd918635bbfa3087579da66e0fd7f6be7a3782c0da3d", + "name": "cachetools", + "version": "7.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "5d11a6878d5bc3f22290281a19ef7b36daa95c910780950608b95cd788c7e12e", + "name": "cbor2", + "version": "6.1.4" + }, + { + "direct_url": null, + "metadata_sha256": "362c9942c48051f168ed2b9f2146266b7792d3c05e164cd6afc3f3b65884fdc9", + "name": "certifi", + "version": "2026.7.22" + }, + { + "direct_url": null, + "metadata_sha256": "b4abf1bcf1c1d8e0272d8007fc974499ea59e5f2a5b98af3c78a5e67515a9d87", + "name": "cffi", + "version": "2.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "766120f13c177446f51929a4d201104bc935b6d5a2a176cd6716edce757d3d95", + "name": "cfgv", + "version": "3.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "610e9a9d03ce837ffe6e42be5e02e70087f73863f7350bf7bb7f0511edcc5ec0", + "name": "charset-normalizer", + "version": "3.5.2" + }, + { + "direct_url": null, + "metadata_sha256": "7ad836b3147c9702546d9c28b4fa5be23b24445439db5d0d2a58d17281c84daa", + "name": "click", + "version": "8.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "4c5f00599ebcbf11d337e48a72784d256ca3d704fa9e9f5daadd60065e6776b7", + "name": "cloudpickle", + "version": "3.1.2" + }, + { + "direct_url": null, + "metadata_sha256": "a0970189e3ab7a596d6902d5f61f93b414f138f03d3cf19029145657bfceb382", + "name": "cmake", + "version": "4.1.2" + }, + { + "direct_url": null, + "metadata_sha256": "94a6ebf9718e55f254a43ce0d2f04e0d6d44e7141b6f3144a84feb6519a77bfd", + "name": "colorama", + "version": "0.4.6" + }, + { + "direct_url": null, + "metadata_sha256": "ca8ec227f406d970a645ec482b20619128dd34b9cf71159cc24e27db461a2711", + "name": "colorful", + "version": "0.5.8" + }, + { + "direct_url": null, + "metadata_sha256": "bbaa51b7e4d8f142bd075d01257c0572c0c844796d51426e35c8096a13e8da76", + "name": "compressed-tensors", + "version": "0.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "6063d8ff7ebc458d63a4332853d7ababf4ee2b86336362c8d2b12be6e998eb6b", + "name": "connectrpc", + "version": "0.11.1" + }, + { + "direct_url": null, + "metadata_sha256": "ac5f4b5a5f68080bd9c3fe77399fe8a1bff2ee5923c49db1df544dd054cbf15b", + "name": "cryptography", + "version": "50.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "f41d2f6b4616accca2f5e1dd47aa9e8937c28076cde698226d93e727751f3099", + "name": "cuda-bindings", + "version": "13.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "e5ca6ed34c687c6f4a4d157ad0a2cf06ec0316fe8c4c0ddeb666ad76dd6f30f4", + "name": "cuda-core", + "version": "1.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "89baadd9da23dce9990481519544115615ba3cbd2d1a41e09feea7756fffb378", + "name": "cuda-pathfinder", + "version": "1.8.2" + }, + { + "direct_url": null, + "metadata_sha256": "1ab914b9a57ca601df2e3cfe9608427b15d8afb78029076ace5d1caf9fd45f08", + "name": "cuda-python", + "version": "13.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "73d97a5eb578223b4895ef4f234574d14219cef9999ff7d0e92a3d0dd057bd3f", + "name": "cuda-tile", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "ae6f957fe66ed63081d1d83ee6e8838f3a0af2c6fce1223629d0dd6264565ead", + "name": "cuda-toolkit", + "version": "13.0.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "1f8e0ae51ad5feea63f58ed2e24f3da6f23ed548043235a14f7623d961dd9b64", + "name": "datasets", + "version": "5.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "153f4a4d6ff03dbe5c8ad7fe54bc2e7b989a4947b70f7aa77fbf652b394f2a2e", + "name": "depyf", + "version": "0.20.0" + }, + { + "direct_url": null, + "metadata_sha256": "ee09fc752d7271aac93079cfd63409957dc6b536c1ffd9355a01bf7297e72aa6", + "name": "detect-installer", + "version": "0.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "a7feab2c4f69fd5f85e5a3cb495a7f1870a6bf8199dcee5339e8118f7acbdc09", + "name": "dill", + "version": "0.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "fef3fde661fe30ba7bd1d78841a797136b2b3461705bb4eb92dc54f8308bbaae", + "name": "distlib", + "version": "0.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "fef3fde661fe30ba7bd1d78841a797136b2b3461705bb4eb92dc54f8308bbaae", + "name": "distlib", + "version": "0.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "a3ca2e39abe76c4a33d5fe4a2a84375ec9f25cdfdb7e1d8ea406bd6f1603205c", + "name": "dnspython", + "version": "2.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "92a07daad5e6ff461199de14e845d9b376e309ef916ce5379f3c9cd4e3b1623f", + "name": "dockerfile-parse", + "version": "2.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "5b566b25f0cbe4955d0b16844a7cc6d2002caa3bde2dfda7f301fd8870cbaa56", + "name": "docstring_parser", + "version": "0.18.0" + }, + { + "direct_url": null, + "metadata_sha256": "5a1080b5768c6c591e1c4f9c9812cafa808781b9eeb198043bf185e22d4a1613", + "name": "e2b", + "version": "2.51.0" + }, + { + "direct_url": null, + "metadata_sha256": "0a63979e0b946e16238e4339e60d9c1eb5a7ce3ea93dae78b5da9c65a6190540", + "name": "einops", + "version": "0.8.2" + }, + { + "direct_url": null, + "metadata_sha256": "16cbe67a57558f1d4bfdbc22a454434ba301750c57a62b1d3f5361c9e5cddc00", + "name": "email-validator", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "0617ddb55b90b42ddc9398dc7e91d61fe928a2504939f76526dc15b22d238caa", + "name": "fastapi", + "version": "0.136.3" + }, + { + "direct_url": null, + "metadata_sha256": "ddd82b9666c21988e234d623e2575e1b89fd4133260eeab43fc9a7c074f7024a", + "name": "fastapi-cli", + "version": "0.0.32" + }, + { + "direct_url": null, + "metadata_sha256": "611602e834d42e10433155ff5f5581358d732fa6b6f6f7820a8f79e74b1ce1f9", + "name": "fastapi-cloud-cli", + "version": "0.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "794524e4a9659bda6043721d848d028ea49996085a33326094fbaaa3f6e6b895", + "name": "fastar", + "version": "0.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "711401d36e60e10e35beb4d0f1bb42bf0c4d86339ae52f32b9aa4a4d790530dd", + "name": "fastsafetensors", + "version": "0.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "efaea9742e348c4c4bdcc6f616a33cc5aa3ae926494a72a46690b7da2f08ed5c", + "name": "filelock", + "version": "4.0.7" + }, + { + "direct_url": null, + "metadata_sha256": "99bd6c3f10781d3d2d350f2c3c9fc4765b55f25de8a6d6dd1f71501802d1255e", + "name": "fla-core", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "0a6ef979b75295cee2b5293ad4942b0cf2682e9e38680203064e0b70249c1a96", + "name": "flash-linear-attention", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "76b70a11ca82ea4606b529e7a8658cb3fe71412afa46f2ed57101dd91ba27558", + "name": "flashinfer-python", + "version": "0.6.18.post1" + }, + { + "direct_url": null, + "metadata_sha256": "ba8ff415192b5cbb90efce046e2271a00c8184afc362d8b47fbbc84d5e558b05", + "name": "frozenlist", + "version": "1.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "e7712831c80eb13b08fb7f7cc33988a8f24654af9eba7c6f5f943b2636e4306a", + "name": "fsspec", + "version": "2026.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "025de85c794878d0caa737869307447595f514ebf9599eacb5b1a501bae479b6", + "name": "fsspec", + "version": "2026.9.0" + }, + { + "direct_url": null, + "metadata_sha256": "ca94883bdeaa3740b45b6994443b445fd67c6e4a8064ac3bf9d92d2a5221eee8", + "name": "ghp-import", + "version": "2.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "a7e90983562a035cf767baa63d8c32bc37e1de7cad71ac7b6b2bc70a95bba4eb", + "name": "gitdb", + "version": "4.0.12" + }, + { + "direct_url": null, + "metadata_sha256": "dd96143ec79178bef685c1f5c0a58a87a66d003b421e605de65697308321d518", + "name": "google-api-core", + "version": "2.40.0" + }, + { + "direct_url": null, + "metadata_sha256": "0735d57088a83df2355e16843107fb0112abe2178fc5bb8132947a7ad962aa41", + "name": "google-auth", + "version": "2.59.1" + }, + { + "direct_url": null, + "metadata_sha256": "2f3aa9d9500d329560440e6a5a152e420aad5f5bbb23701f45b740be721784a1", + "name": "googleapis-common-protos", + "version": "1.75.5" + }, + { + "direct_url": null, + "metadata_sha256": "06d74ab04fdc03fad368868907f0d10e7d9f397aab58d58965c0b78ffaec34cc", + "name": "griffelib", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "7ee1c179e2c68a62968308b2f96f4f3469176ee3ac8bdb494ac80188d4d41271", + "name": "grpcio", + "version": "1.84.0" + }, + { + "direct_url": null, + "metadata_sha256": "04cf3a4a91575850f386f4fcfdedd8e7fbfba08feff038fbc1296d1e854db2dd", + "name": "h11", + "version": "0.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "b954a6ba4739c0cc878bb8ea27ea7c7154a48bb4b7c06dba9e9cf880cf0ec930", + "name": "h2", + "version": "4.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "6f0d7bf86e75d0bda1ceccc82367c0145ad0ec522c4d4f51bb454f467faadcc9", + "name": "hf-xet", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "f991b847550cf8225f69562902b5ccb591b2ce9a08fe07ef6e6d701bdb4694a7", + "name": "hpack", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "314d194165c4700034c1c67cee847d549a6d7091374c71f2cef0186ec56a3eb9", + "name": "httpcore", + "version": "1.0.9" + }, + { + "direct_url": null, + "metadata_sha256": "aed9767360bed1bcbda71e3b1a3c996603f86558bc77a1693ee3d09973d20cad", + "name": "httpcore2", + "version": "2.13.1" + }, + { + "direct_url": null, + "metadata_sha256": "8fa3bf3510c35e2eea9f523a1cace7120079cf51d76c4acea97de95806aaa14a", + "name": "httptools", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "3bf4804c215d111b6a4702cf9000021ab39807d1ed3207dd011b14b2843b2d14", + "name": "httpx", + "version": "0.28.1" + }, + { + "direct_url": null, + "metadata_sha256": "d11dd50813b8914bd9455e8b2b591171cd2b1618883943153afadc8bb9224678", + "name": "httpx2", + "version": "2.13.1" + }, + { + "direct_url": null, + "metadata_sha256": "43b119c34ad2b2aacc032a1a6a8feb142fdb5ca407a3519325d74dd53d8904df", + "name": "huggingface_hub", + "version": "1.33.0" + }, + { + "direct_url": null, + "metadata_sha256": "9ce850d5a6b775e5ef4a335f907e579a878e058213121b6eec567781ea68c585", + "name": "humming-kernels", + "version": "0.1.12" + }, + { + "direct_url": null, + "metadata_sha256": "67aa4f6717d82446a51ce350e7c4769eba0c4a22d2f428255cddd9d24b11a914", + "name": "hyperframe", + "version": "6.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd9511ede42f63b995c3f71944f908cb8f014048b63ecc1c8d420525a3354b59", + "name": "identify", + "version": "2.6.20" + }, + { + "direct_url": null, + "metadata_sha256": "af3c3a62bb5d82d6a43454684e0b1dedde27a21ea90eacfb1bed9814619f06d0", + "name": "idna", + "version": "3.20" + }, + { + "direct_url": null, + "metadata_sha256": "cf71393f3d079ce2e859384573e65aaacd1709bef700701f629df32398b598f0", + "name": "ijson", + "version": "3.5.1" + }, + { + "direct_url": null, + "metadata_sha256": "9305763e93d03df0e36516b1125fa046a6ebe37d44589e200e0593cf4bdfd980", + "name": "importlib_metadata", + "version": "9.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "32860c3c19b2e91f6cb5bd83400b5870cda051bc74a5a08822c8c666af0990db", + "name": "iniconfig", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "560faabb3d45d779e445a74e7e806a786f95f2200fa06d979603b7f0ee1cfb39", + "name": "instanttensor", + "version": "0.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "f6fc1f0d389e4245fc2a1a0fdfee09422e56200cb6f94659668456997ff4f7a9", + "name": "interegular", + "version": "0.3.3" + }, + { + "direct_url": null, + "metadata_sha256": "d10f300731197a4829b77f0c883bb3cf8a37ae8c76a302e095fa95d6427706d0", + "name": "jiter", + "version": "0.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "5b0c8d4b4c535a2432fb206223d774509b6e20af374c6a4b6f98bf72a7de6702", + "name": "jmespath", + "version": "1.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "6c4032c2e74273452cd77399af2ee85198f49c22da897983f26d2ed6f787c4e8", + "name": "jsonschema", + "version": "4.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "aaa6cd66f423729e8da397c9d533b7d731f6b25f3d6371b9338c36bdb9be74a0", + "name": "jsonschema-specifications", + "version": "2025.9.1" + }, + { + "direct_url": null, + "metadata_sha256": "f7c0687c032593106a2e5a3c241cf8043e7e2c222bddb0022b4cb2bf5de67115", + "name": "lark", + "version": "1.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "4511c6b04efc57a5f5333edc1f5f48b9f5412c3923d4bc19b715bdf47977511c", + "name": "linkify-it-py", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "be929870f6ecae18a819c56118f1101f3076e25ac6a4843ca6f4707ebd1e87c6", + "name": "llguidance", + "version": "1.7.6" + }, + { + "direct_url": null, + "metadata_sha256": "cf2b87669bead3e76ec54207f3354c13f73b50c32fcd13c8d627084b3379139e", + "name": "llvmlite", + "version": "0.47.0" + }, + { + "direct_url": null, + "metadata_sha256": "0a416d79c5543d94d2b18807626293d4f47655d1d22724c7ae296e413078aaba", + "name": "lm-format-enforcer", + "version": "0.11.3" + }, + { + "direct_url": null, + "metadata_sha256": "16bc1f59e34fd2a6633bd395276052eacd2c777b2cf72781e76b203f013a8fac", + "name": "loguru", + "version": "0.7.3" + }, + { + "direct_url": null, + "metadata_sha256": "5216d5acfd039a7b581a826186309594b228d37d2c8d56864124ea666689fe4e", + "name": "lxml", + "version": "6.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "f59d772b35315a928672bfcccfb89d82c0aac672c5275c048f7a93b79015bcea", + "name": "markdown-it-py", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "b137367ef0056711cbf5e53015df9168cab80373104e7899b1c0263a21d9c99c", + "name": "mcp", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "38e0b9edaae09e58cd1461fc961ced22672038a697930bedef153a74befb3de1", + "name": "mcp-types", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "799f49685865fd9cc8915fdb92a33e102eeeffad562b03b4aeffb6f422b771c1", + "name": "mdit-py-plugins", + "version": "0.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "481f9cbe08596c6eaba6343e0efa1b13b2362c30dce0610f7c08523f1d98388d", + "name": "mdurl", + "version": "0.1.2" + }, + { + "direct_url": "{\"dir_info\": {\"editable\": true}, \"url\": \"file:///Megatron-LM-training\"}", + "metadata_sha256": "2876c0c760bbfc93bd7d737bf0db2866a937308a7c1707c3a2bb59d4795986ff", + "name": "megatron-core", + "version": "0.16.0rc0" + }, + { + "direct_url": null, + "metadata_sha256": "a6e34d488c879f57ce042bec38f8864ba3ea7d6ecf0ab757fc88fe8dc0a22f26", + "name": "memray", + "version": "1.20.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd26d80dc9676b1fb8c894355bd525fbe7f49a6a86a555c72e9ec6d927247c33", + "name": "mergedeep", + "version": "1.3.4" + }, + { + "direct_url": null, + "metadata_sha256": "dd1b3b89e88d1c65a26e6e72dd075eabbc220bfb138769ec8b64578ee911795c", + "name": "mistral_common", + "version": "1.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "4859847a9f6321daf8849cf7fd1542ff430db6563a2abf9ac0d62a5b21bd951d", + "name": "mkdocs", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "1729fc31479f2582486cdc85397417659dd3b2fb3f920553de66cfe59d5f0b3e", + "name": "mkdocs-awesome-nav", + "version": "3.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "88b4b7b7c0aba5547befdedaf515c8df4867361daf55ff60b72578464d72dcbe", + "name": "mkdocs-get-deps", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "ad33bb33fb16b1f69689c4682550e97232154e367e2c8c8aee9dad0f10d269ce", + "name": "mkdocs-git-revision-date-localized-plugin", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "ed69fbfb9ac00c10c5a383a12ff9d2b9919ae184e408554434199211643d6040", + "name": "mkdocs-material", + "version": "9.7.7" + }, + { + "direct_url": null, + "metadata_sha256": "d1c549b61701148b97f8246bc924b2840e504b37b0ce7a27e78ddf81261e5363", + "name": "mkdocs-material-extensions", + "version": "1.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "4ad6171f3bf6812e4de90670ff0089d445093d4fe1d05d55f17b96a4a192a816", + "name": "ml_dtypes", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "4ad6171f3bf6812e4de90670ff0089d445093d4fe1d05d55f17b96a4a192a816", + "name": "ml_dtypes", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "b0dbdfa30ab6b1ce637a794899c9e43019182b6d1ab2d07b90f647f7331eba6b", + "name": "model-hosting-container-standards", + "version": "0.1.16" + }, + { + "direct_url": null, + "metadata_sha256": "95424470e481cfa8d18b30963b6de3aafe16614b1ea0414e184a008571dde84f", + "name": "mpmath", + "version": "1.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "eb184d83489401903615ce8a78d98d5b933dec0f7246811d396a529915fe797c", + "name": "msgpack", + "version": "1.2.3" + }, + { + "direct_url": null, + "metadata_sha256": "520006303d6a0e859970b83f7d452196e2e8f6dab08f6dcf1ba5823c1230025f", + "name": "msgspec", + "version": "0.22.0" + }, + { + "direct_url": null, + "metadata_sha256": "010d2fe039006070a711a476b171b7b7da5c29ccad3c4eecd77ef3711b07c2d0", + "name": "multidict", + "version": "6.9.1" + }, + { + "direct_url": null, + "metadata_sha256": "235634cc7ebda45f8a84dfdb1b9b35ac1a77a1888b34650c3a616d23e4a7e93f", + "name": "multiprocess", + "version": "0.70.19" + }, + { + "direct_url": null, + "metadata_sha256": "7c545b4b3e5e83d3fde41352272c10cb9deeaba5b7138fbf24383e952af8822e", + "name": "natsort", + "version": "8.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "311ee8cdaeaf9f11acf51cda9c3b5b191f76ce9d98bc3418164c3189bbc37a08", + "name": "nccl4py", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "66360539217852c3b44b37f409eade7e1559baf018bb363bacb2aa3a9759b203", + "name": "networkx", + "version": "3.7" + }, + { + "direct_url": null, + "metadata_sha256": "e8b0b1746808b87816c47e4531780ded7f246bed9575a89e8b40200aa81e9a13", + "name": "ninja", + "version": "1.13.2" + }, + { + "direct_url": null, + "metadata_sha256": "77c1117f0dbc41560ddc6e6b37b542fb4e88afcd4ef82ec06593e5bbd5f37121", + "name": "nodeenv", + "version": "1.11.0" + }, + { + "direct_url": null, + "metadata_sha256": "9af629898406c9eaa69897fe09220dc483270cdba89f6b20bf0165cdf0e1668e", + "name": "numba", + "version": "0.65.0" + }, + { + "direct_url": null, + "metadata_sha256": "0c7281a81cf76e40b27c1385ffd8a215d7227adc219f177ce807ead9e91994a5", + "name": "numpy", + "version": "2.3.5" + }, + { + "direct_url": null, + "metadata_sha256": "0c7281a81cf76e40b27c1385ffd8a215d7227adc219f177ce807ead9e91994a5", + "name": "numpy", + "version": "2.3.5" + }, + { + "direct_url": null, + "metadata_sha256": "bab990ced4537ce74ef5961ca933c4c6fd604fd09a5827a4a428c55bcb0be35b", + "name": "nvdlfw_inspect", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "10f6595146332d35f7f15a000e08b5c81432528c5d026470c1d03f0c1399fb70", + "name": "nvidia-cublas", + "version": "13.1.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "58e933b4ac8e49f098b16ab7480d03bd792afc3d1db10d0aacbdcc2c62e48fa3", + "name": "nvidia-cuda-cccl", + "version": "13.3.4.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "baac937970681d41aa0c3708b3d55d73f8d29e70aceaac0e71fe6d1548e94a09", + "name": "nvidia-cuda-crt", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "8d51e5c76ef5707b0b80d5ec9a791c0f11a480ab721820cf100a3cc566017eef", + "name": "nvidia-cuda-cupti", + "version": "13.0.85" + }, + { + "direct_url": null, + "metadata_sha256": "724bf56e61ddef5d4c2482ff64103a973b911b110b668acaea5373f6c83c1c5c", + "name": "nvidia-cuda-nvcc", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "c54801dbd815d534519a761f1f328325aa0f1d1f1659aa969fa74e7a2c76eee9", + "name": "nvidia-cuda-nvdisasm", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "af51f248363020b9fdfd2743704e901bf3d19a1a1ce1fe44fb98ba148bfc0157", + "name": "nvidia-cuda-nvrtc", + "version": "13.0.88" + }, + { + "direct_url": null, + "metadata_sha256": "055f7fc69a5a2159de82cd0718da02c8852e81c8a71ebb117b8e799badd7167e", + "name": "nvidia-cuda-runtime", + "version": "13.0.96" + }, + { + "direct_url": null, + "metadata_sha256": "df18686dbdb3074ca375a1d6c623a04102fd348950c67a721397349c6d4f0477", + "name": "nvidia-cudnn-cu13", + "version": "9.20.0.48" + }, + { + "direct_url": null, + "metadata_sha256": "abd0ca3f67af19a4d383ff2a012ae0090d4731c6492fd47236615308a50b3981", + "name": "nvidia-cudnn-frontend", + "version": "1.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "4a78545d424d0c5038353f7046a8ae40ceaf312045d71399eac9511f5fc15434", + "name": "nvidia-cufft", + "version": "12.0.0.61" + }, + { + "direct_url": null, + "metadata_sha256": "e49b909195c03ddbe203729d9b31dd88e3f207368333d1909c67c6b130a0c696", + "name": "nvidia-cufile", + "version": "1.15.1.6" + }, + { + "direct_url": null, + "metadata_sha256": "bb15a754c6be32c23aaac13c1cfa7a8ce53d92bc26652ec3b609f7a5cce3e7d1", + "name": "nvidia-curand", + "version": "10.4.0.35" + }, + { + "direct_url": null, + "metadata_sha256": "0dd58f677811eac04901a793740932e5a2a8fff2f5453aa6351614eb18391bb6", + "name": "nvidia-cusolver", + "version": "12.0.4.66" + }, + { + "direct_url": null, + "metadata_sha256": "8aeb284782ef6883095a5d1c110e221cad023a99afcfd5cdb4969a25e146d562", + "name": "nvidia-cusparse", + "version": "12.6.3.3" + }, + { + "direct_url": null, + "metadata_sha256": "09555246122896eaca3b8313eecfca4b339fefd3b597874cb9fe3bf29dab38c9", + "name": "nvidia-cusparselt-cu13", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "ac77bac79fbfb0c52ac6e2e5abc936b1e127be2192f0cbc27b00be3125fa86ae", + "name": "nvidia-cutlass-dsl", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "1ec968ec7c4083f7fe4e1fb8384c7e9b853a81491fef9f4cb1cf755961aaedf6", + "name": "nvidia-cutlass-dsl-libs-base", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "cc6f3846cd820013eaa6e2665c493d70c607be6ce7349b939eb4742888470585", + "name": "nvidia-cutlass-dsl-libs-core", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "2357d0df2d0d17c0b16663b8a89df53f751b19721f66821fd88fa78112c08e55", + "name": "nvidia-cutlass-dsl-libs-cu12", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "244590c25662dcf777b1daae97a858afe1a1aec62e5e6678b217007a459ab552", + "name": "nvidia-cutlass-dsl-libs-cu13", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "c3a25ada01f57418c1b897406c3abab18834e6adc573ab7b060620c453afb6db", + "name": "nvidia-ml-py", + "version": "13.615.71" + }, + { + "direct_url": null, + "metadata_sha256": "56baad4e7f699902b03b17580933f7bd50b6ea97b7df9d7e807750973da7529c", + "name": "nvidia-nccl-cu13", + "version": "2.29.7" + }, + { + "direct_url": null, + "metadata_sha256": "98810ef0ab8badc369e6a46a038f8ee9f412c0c753fb5ad580544f23a0aa7962", + "name": "nvidia-nvjitlink", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "b0f54ee21909d19640a58e05da755c91763eb5725f544fd0d4b84b2f5f94deba", + "name": "nvidia-nvshmem-cu13", + "version": "3.4.5" + }, + { + "direct_url": null, + "metadata_sha256": "06dc1a593c7e8b8c3f29184228c83f8f7ef57787ad91f3e5bcae1d238dd3092a", + "name": "nvidia-nvtx", + "version": "13.0.85" + }, + { + "direct_url": null, + "metadata_sha256": "32ee63450a437b6a6ed227ff6549144aa596197a322993521ec7af826ebd413e", + "name": "nvidia-nvvm", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "32c2efdcd2c673b3b7f35ca9c2cccefaad36f1f0a920648a13cad85f6a5767b2", + "name": "nvtx", + "version": "0.2.15" + }, + { + "direct_url": null, + "metadata_sha256": "3419d80e114a2c19fa9bd3582939a3942f19673055707ba6ca2ca489d58b41e0", + "name": "omegaconf", + "version": "2.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "28971076ce9c279d4b889496b046d55a1e05b02fb9851ceb717e9a10df799572", + "name": "onnx", + "version": "1.23.1" + }, + { + "direct_url": null, + "metadata_sha256": "1246f5a4d8295907a42e809ed9173ede2510ec9d260d2168989d126564897fa5", + "name": "onnx-ir", + "version": "1.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "e14643636835759700dff286f949c5ec34e7eac7ac47f44096414f0e0f1c3101", + "name": "onnxscript", + "version": "0.7.2" + }, + { + "direct_url": null, + "metadata_sha256": "00f847e99939207bd70dfd806428f6b20a3d01074b59325e4c76149a2e19be26", + "name": "openai", + "version": "3.22.1" + }, + { + "direct_url": null, + "metadata_sha256": "598d3ad5a22a14a7c4f1d218b43e345f32b0ba094b753467bae8a3f708fd48cb", + "name": "openai-agents", + "version": "0.22.3" + }, + { + "direct_url": null, + "metadata_sha256": "5a0afcb1ce845e05da12beb1767f5d2749bbc9e9050718c6b9fa3c225713c9eb", + "name": "openai-harmony", + "version": "0.0.8" + }, + { + "direct_url": null, + "metadata_sha256": "e86a6b6fcbbe152805f782c57df321002892e163019574877e9829272e25eb4e", + "name": "opencensus", + "version": "0.11.4" + }, + { + "direct_url": null, + "metadata_sha256": "53d669c8bd3d32d3275153b454e515ca5cc6dec92fae3a98309b5a2b19fe6d2d", + "name": "opencensus-context", + "version": "0.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "19778b6d66b0e45bf73e11fa37a208949d5b393aef914627394d5601455546a6", + "name": "opencv-python-headless", + "version": "5.0.0.93" + }, + { + "direct_url": null, + "metadata_sha256": "19778b6d66b0e45bf73e11fa37a208949d5b393aef914627394d5601455546a6", + "name": "opencv-python-headless", + "version": "5.0.0.93" + }, + { + "direct_url": null, + "metadata_sha256": "a3f5434fa7c80f7f7abc82173da639c8e9c59d30b4027182645562bd3d2f4f97", + "name": "opentelemetry-api", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "8611977ea596e4827874582e86250618444e1c718229dddfc16e5ea437ce5fcb", + "name": "opentelemetry-exporter-http-transport", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "2cfd41e5ca33292d987ba71fa6186d11e16ed66888f3a26f8a3a99060c4b5e90", + "name": "opentelemetry-exporter-otlp", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "3bb4494220732d4bf10e1dba231ea7638cedaa5362e1f23a50d34a14f520fea8", + "name": "opentelemetry-exporter-otlp-common", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "27fb1c8aa5c2cd07776f9f3281fc618cd3feb96017757c33d2b3586fb7fec88b", + "name": "opentelemetry-exporter-otlp-proto-common", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "5cba6098cdd0bfb06853a6c704a2451c4f82c9dea376a30b59ecd279296648ad", + "name": "opentelemetry-exporter-otlp-proto-grpc", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "6f53ef1c172ebf87af69b9ef390aa908506d0cd14bc7811985fdd937a4058808", + "name": "opentelemetry-exporter-otlp-proto-http", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "1910f4e7ebd497e98b6d231e10275288fda2cd1885117575706c62f45e065889", + "name": "opentelemetry-exporter-prometheus", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "fab18b721e30be41448be252e1dca43b48e7f15d971e0bb552492c0ef4b07bee", + "name": "opentelemetry-proto", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "3644a79f55762a646799ff52b9d837e01c8192b7b28f735a383f55c90edb9bc2", + "name": "opentelemetry-sdk", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "add3db481f7f401f65cfbddb058fde3bb4c9dd7b61064a84f8598ad7efe0b11c", + "name": "opentelemetry-semantic-conventions", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "0dfff30e912520a226bcf7a547393484cfcd8c738439c7b48418f61c95109480", + "name": "opentelemetry-semantic-conventions-ai", + "version": "0.5.1" + }, + { + "direct_url": null, + "metadata_sha256": "210ce26bad0a245a72831b4fa029708c245d4d670a88c8d5a69b1446c24a95e4", + "name": "orjson", + "version": "3.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "35ff73511848f5f934ccc39d538014716ec4579e76d54e0e407ff51794a7939c", + "name": "outlines_core", + "version": "0.2.14" + }, + { + "direct_url": null, + "metadata_sha256": "8ee2f7138ade46b6e348a6d099612f5bd6caff13511f3b4144327f37ce50eacf", + "name": "packaging", + "version": "26.3" + }, + { + "direct_url": null, + "metadata_sha256": "a4ab87bf8083001f25ccdc46095f05b678b3569dd58edc2cf941e3e7f64d7c88", + "name": "paginate", + "version": "0.5.7" + }, + { + "direct_url": null, + "metadata_sha256": "1de96a6c28c2e5613c9c87cd4ad9484791001cf58df43cf2ba74d5c4f85f0ad2", + "name": "pandas", + "version": "3.0.6" + }, + { + "direct_url": null, + "metadata_sha256": "d05b8d05da9f78176b2eefaacdfaa5e96708ec4f488daea8bbc52e3ed1bc3954", + "name": "partial-json-parser", + "version": "0.2.1.1.post7" + }, + { + "direct_url": null, + "metadata_sha256": "c1d126edceac2685e29403a8ae3a27c47143dce1f0252fa3931771562f1e2b4f", + "name": "pathspec", + "version": "1.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "30325dc8ce17bc64f9dbc0a449232fd35841a019df22a6f481007c9c5a28c1cb", + "name": "pillow", + "version": "12.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "cbc0b7b6e63b50dcb7c17cf3526a9304f285d9a31353adf3b22acc2059ab23f5", + "name": "pip", + "version": "25.0.1" + }, + { + "direct_url": "{\"dir_info\": {}, \"url\": \"file:///work\"}", + "metadata_sha256": "6ba03b5bc457a2a3d92468729501b5892a0d38ebcc36766c58859449498c5743", + "name": "pip", + "version": "26.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "0421937c4410b61c5325233d5b7671ae933bae8de174f87586ac55aa804851ea", + "name": "platformdirs", + "version": "4.12.2" + }, + { + "direct_url": null, + "metadata_sha256": "2bcffab42626e1fb50d6329765619312d30fe7f4880e98dcee99c92ebd283bb4", + "name": "pluggy", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "7e7562ba7c032f8edd02641ae71b1ac2d8f388103a68d777a7e907d19e75bc17", + "name": "pre_commit", + "version": "4.6.2" + }, + { + "direct_url": null, + "metadata_sha256": "bbe0a7662602ddd23f929fe0ee98e9d04406e138aeee18ce4861af186ea6060d", + "name": "prometheus-fastapi-instrumentator", + "version": "8.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "ece4a61f3ffb92a083fd5e47e180e3e070342e60a3bd93876a879e79a643e821", + "name": "prometheus_client", + "version": "0.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "5feba21a58eaa126e7e7739e57e2572e5bb251fcbf56e439e508acc47d769314", + "name": "propcache", + "version": "0.5.4" + }, + { + "direct_url": null, + "metadata_sha256": "3f136dbf7239c987a7685acd33440cc5efd6c4107b4b11c425201b4de70ae36f", + "name": "proto-plus", + "version": "1.29.0" + }, + { + "direct_url": null, + "metadata_sha256": "118b5ad013120a7a6e24714595ad776bf264d7b0060389133310d18ea1480902", + "name": "protobuf", + "version": "7.36.2" + }, + { + "direct_url": null, + "metadata_sha256": "0849f5a519bf9bc23ef204443fdd8d6d10678863acac7ca9340fc11bfba5a856", + "name": "protobuf-py", + "version": "0.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "eab5f2f4fd98f67a710a8fb1975b64ffa880a4f977566f022c567e08e324ccd6", + "name": "protobuf-py-ext", + "version": "0.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "39009938840de3a8b2a37eb4668d2601aae8c74e4b74743f73e59996b5b7e6e1", + "name": "psutil", + "version": "7.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "df44b58e8a4cfe57f65773ec47f7bdf2a14c8f5f73a7abf331a6b6237d6d691a", + "name": "py-cpuinfo", + "version": "9.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "2fd4a9efc5e5c74ae4c2fcf1970193c524c62ab22af8d5e66ebf7df9e6e46e83", + "name": "py-spy", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "d2ccdeb15cddedc81637a83e40baa6397fe269023b738d0fc3cb2d90722e290b", + "name": "pyarrow", + "version": "25.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "47b9f28e971a56f5adf949e0bcf105b0bf6587946566ecf197a2819d8848cc01", + "name": "pyasn1", + "version": "0.6.4" + }, + { + "direct_url": null, + "metadata_sha256": "82ce4c01c6d36841b9801fcdabab9bfe61d0b5e4e440c275941d8a2d4a790730", + "name": "pyasn1_modules", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "45cb345e4c12f63bc843b8c88902cc44c4d624a55aaef8cd5ffbc0ad16356fbe", + "name": "pybase64", + "version": "1.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "d311ae661edeac8ff029ab2960d065a7e792ebf8f79af682daa53109fe81318b", + "name": "pybind11", + "version": "3.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "cce9c0d440d065d4cdfb0d00004b8ddd65cf363a740efc5b0920b29201a59cd9", + "name": "pycountry", + "version": "26.2.16" + }, + { + "direct_url": null, + "metadata_sha256": "a1e33542883c249bf6c263b0023b9ea8a6131a77d9cb2cbc88316968e5eada83", + "name": "pycparser", + "version": "3.0" + }, + { + "direct_url": null, + "metadata_sha256": "faffcc4d7d359cb1047a9f67f7c65096b838c6db6c62852ef20fb27d55649a95", + "name": "pycryptodomex", + "version": "3.23.0" + }, + { + "direct_url": null, + "metadata_sha256": "98929f4cb80451dc3c6c8cd541a3081dccf0dee94afe7d9fa5c214a18ff236ce", + "name": "pydantic", + "version": "2.13.5" + }, + { + "direct_url": null, + "metadata_sha256": "8eccadbe707db97c397fb79073fe791b7998ef3a85f04f817f8991f7697b190b", + "name": "pydantic-extra-types", + "version": "2.11.1" + }, + { + "direct_url": null, + "metadata_sha256": "8f00c91deb34399316a5386eb2e76fe09f14a08dc3045f2e7dce9bf8573796bd", + "name": "pydantic-settings", + "version": "2.15.0" + }, + { + "direct_url": null, + "metadata_sha256": "66c729edddc20bf2764bb18bd87d907b08690e50355f39b97acc737b26d1d164", + "name": "pydantic_core", + "version": "2.46.5" + }, + { + "direct_url": null, + "metadata_sha256": "394500d78a0c1a433ae8ca3693152c08f6a901121d4b069cf1540a19759e2950", + "name": "pylatexenc", + "version": "2.11" + }, + { + "direct_url": null, + "metadata_sha256": "df2e9e9847a2aea0ae6e20fd325aeb16cf3ce7f8913462db6c2398363cd0c0bf", + "name": "pymdown-extensions", + "version": "12.1" + }, + { + "direct_url": null, + "metadata_sha256": "82fcfe724db9f0b51348da89f4f5cdc0b08d08882b1bbc0ca4913d3a0a93bcb9", + "name": "pynvvideocodec", + "version": "2.0.4" + }, + { + "direct_url": null, + "metadata_sha256": "3722422cc1478b175879143dfb78f98b7a5f53f4f684d71b7054fe2e8acd3b89", + "name": "pyqwest", + "version": "0.10.0" + }, + { + "direct_url": null, + "metadata_sha256": "7d1d1c276b7c372d55d17ac7d30f0a4b80a746e147347b8510d1355eea7f80c8", + "name": "pytest", + "version": "9.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "89e7c1c932e52b74bdcaf504389d2d1a2d7ca559b02bf5a09fc80ebd58ad10f7", + "name": "python-dateutil", + "version": "2.9.0.post0" + }, + { + "direct_url": null, + "metadata_sha256": "54f30f811841b6d772f31715712c85bfe0041839cb071f78daf41c700a98642b", + "name": "python-discovery", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "54f30f811841b6d772f31715712c85bfe0041839cb071f78daf41c700a98642b", + "name": "python-discovery", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "0cc19efd76cfbf3bcb2cb0d3ab82191036855859455aa3812c5e9e591e3f34e8", + "name": "python-dotenv", + "version": "1.2.3" + }, + { + "direct_url": null, + "metadata_sha256": "1d866c6124631b9ce1797ad412fff298ab53fc2d95210281d7c8f20e920753fa", + "name": "python-json-logger", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "2d18a1e7286d92a656ead5ec6f83d5ae6dc858634624f6b264703ae88d24d718", + "name": "python-multipart", + "version": "0.0.32" + }, + { + "direct_url": null, + "metadata_sha256": "beaa0efe9ba4b34843f5a0fc7379a73f10e95adb8cc0c31f359ab6f3a42b4def", + "name": "pyyaml_env_tag", + "version": "1.1" + }, + { + "direct_url": null, + "metadata_sha256": "238dc769e22d4f5626750cdff36e920e4a8d69c10d88de6d79b40a59cc13d873", + "name": "pyzmq", + "version": "27.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "de0a5e855bb5bb78b7acdcd2ca60619c6a0c109814881589caf158ec07155662", + "name": "quack-kernels", + "version": "0.6.5" + }, + { + "direct_url": null, + "metadata_sha256": "961ffef199b876fb4d7b10903d78e79f359d703b1638834c61d70b9879932918", + "name": "qwen-vl-utils", + "version": "0.0.14" + }, + { + "direct_url": null, + "metadata_sha256": "faf6ab9027d12de992827a2d8a224996fe6747a8c5f7d31ae495983dc73eefe9", + "name": "ray", + "version": "2.54.0" + }, + { + "direct_url": null, + "metadata_sha256": "c50d8b3ff4d113925b60dc47d1d28e87248a3338024241b0a3a66c8794fbce0c", + "name": "referencing", + "version": "0.37.0" + }, + { + "direct_url": null, + "metadata_sha256": "02acdc52d6f21d5f4b172254daaa94edfaa44c9ebe14d1c00cc4c8fe99b0e1df", + "name": "regex", + "version": "2026.9.29" + }, + { + "direct_url": null, + "metadata_sha256": "ac08207697217d1ffde8a161b424d77d6e2af6b62630fa26d75d08f11076cdca", + "name": "requests", + "version": "2.34.2" + }, + { + "direct_url": null, + "metadata_sha256": "f1abd635c3dff607a4fd654c62a88d9d4c21843cfc9176116c156f4269ca21b5", + "name": "rich", + "version": "15.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "932ff7743a756d0efcc45528d64c275ac3cb40a8dd1787ea10cb303907f0ae4f", + "name": "rich-toolkit", + "version": "0.20.5" + }, + { + "direct_url": null, + "metadata_sha256": "294a1405c0fa34b5f735bcb46459050436849a1e584c643544de99c07c529fb7", + "name": "rignore", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "5e54dd00b4ad336c5161d47de2a5c2212090c44629c28b6538b156256e49282d", + "name": "rpds-py", + "version": "2026.6.3" + }, + { + "direct_url": null, + "metadata_sha256": "0d5895abd80bfc0027c02943abaea4547061b9004bd134950d640d619a697835", + "name": "safetensors", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "91d5de3f641f33a8fbb4b6e91772da68d50b68686971d7b66af2068f2e77b694", + "name": "scipy", + "version": "1.17.1" + }, + { + "direct_url": null, + "metadata_sha256": "297fb30f701a800489c12893a951da3e5bd1f80061a1f43f0d3e9f1d4c6bc6fd", + "name": "sentencepiece", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "4245e0388ddf2048a38ae2a24a3d2c583408b2454aadc680d3c3beede639db3f", + "name": "sentry-sdk", + "version": "2.71.0" + }, + { + "direct_url": null, + "metadata_sha256": "ae8a9e6feec1a76e954d65ea48ac57842c9a7bfb5ac6e5ea82400a5ba9f71a98", + "name": "setproctitle", + "version": "1.3.7" + }, + { + "direct_url": null, + "metadata_sha256": "341d00772017437d0f6e3c943ae353f243c39fedfba403aea47cced927a76516", + "name": "setuptools", + "version": "79.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "ff4bcfb192bd542ed8f1794fb32ffc9eabd932d6e03cb00a4ad5e35a2469af88", + "name": "setuptools", + "version": "80.10.2" + }, + { + "direct_url": null, + "metadata_sha256": "f1e5a532fb8cda0bbc370e3db6cb9cea72a065d12ddd6a14976ba3cf66264221", + "name": "shellingham", + "version": "1.5.4" + }, + { + "direct_url": null, + "metadata_sha256": "2aba2cfd9c2ad7625a5d374d141af317d8f92d3534997bf98d127e52848dfc81", + "name": "six", + "version": "1.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "69ae2dfe547624be97fae348e1cfa3793f8854eed32cc1603badedc7d48fb36e", + "name": "smart_open", + "version": "8.0.2" + }, + { + "direct_url": null, + "metadata_sha256": "d415e6c6de7dee117d254a342668c489931bc88eac7ec8678b452078e366da6e", + "name": "smmap", + "version": "5.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "093bc4f0740a6fc28692e616aa8fe68d7e1d76426cc5a5faf9ea722a8ee7aaae", + "name": "sniffio", + "version": "1.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "b3cef071eb1dbeaa76a1273fe2ca2cc8ef36e835165253952d93780962529ac1", + "name": "sse-starlette", + "version": "3.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "3c01ca830e213f0311fe37bc3b46b8ab230a5e7acb894bf0fc8785cb7ccfed48", + "name": "starlette", + "version": "1.7.0" + }, + { + "direct_url": null, + "metadata_sha256": "6017ca508a293cf47a88a78cb330e9cbd131d74ec3c7fbf89bd4300ed3129d30", + "name": "supervisor", + "version": "4.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "fd5eb4925b04f9bffbc6c4f92bf8aea7243b918b43cd359493fce48a7dd3b336", + "name": "sympy", + "version": "1.14.0" + }, + { + "direct_url": null, + "metadata_sha256": "f09f0e24282c5a86346bcd5b10ae5ff81869fa8ef69c3ba524bd0a817a87dda9", + "name": "tabulate", + "version": "0.10.0" + }, + { + "direct_url": null, + "metadata_sha256": "519fa19c146fd58a0a75ecf1461e4bd98f9c06d01800c37d4a80f5fef095f4e1", + "name": "tensorboard", + "version": "2.21.0" + }, + { + "direct_url": null, + "metadata_sha256": "1af7ad76e4073b01ab147eb3c1d8e38b95d38062c6c9bc63890150738642e8eb", + "name": "tensorboard-data-server", + "version": "0.7.2" + }, + { + "direct_url": null, + "metadata_sha256": "9e597f62fc07e3b931d5c8fb0e90706fb6d45465cfb5d01dbd27ba7fc135c02c", + "name": "tensorstore", + "version": "0.1.80" + }, + { + "direct_url": null, + "metadata_sha256": "0da993d16ef6326f471796fcb065622f309c5c1aae6c6295b488ea64bb5c880c", + "name": "textual", + "version": "8.2.8" + }, + { + "direct_url": null, + "metadata_sha256": "52ca6148d4fd1497254855fa610cfdde99191cd42bce7a452fd3a68855504ac0", + "name": "tiktoken", + "version": "0.14.0" + }, + { + "direct_url": null, + "metadata_sha256": "0df9eb495cfb477dcbdfbdcd8c04d952d3eb00d77831630760571e13545398e5", + "name": "tilelang", + "version": "0.1.12" + }, + { + "direct_url": null, + "metadata_sha256": "802b576e011dc61bd2681593e8d802714b6c4ce636a9cf87035026db32ce6262", + "name": "tokenizers", + "version": "0.23.2" + }, + { + "direct_url": null, + "metadata_sha256": "4e1631b2164a49ff9a848d86ce504fdcc15e3540dbb262df8f33a2681a8de513", + "name": "tokenspeed-mla", + "version": "0.1.8" + }, + { + "direct_url": null, + "metadata_sha256": "05086095a775c5dca70998dcf442a848c13f9c68b54a54c510c3542c5abb6563", + "name": "tokenspeed-triton", + "version": "3.8.10.post20260920" + }, + { + "direct_url": null, + "metadata_sha256": "71daba472d0c5ffc25c0231dc29688ab0cb13d5bc7e7d93f6c4cce4169c50048", + "name": "torch", + "version": "2.13.0" + }, + { + "direct_url": null, + "metadata_sha256": "cccd2f1c0e5866e63732f58798c8d642ee6d10cd560d6f691e7981b908c246c9", + "name": "torch_c_dlpack_ext", + "version": "0.1.5" + }, + { + "direct_url": "{\"dir_info\": {}, \"url\": \"file:///torch_memory_saver\"}", + "metadata_sha256": "6276cef17dedbb5ee0d6157bbf63b832e916026281328d995ad3d488c2539618", + "name": "torch_memory_saver", + "version": "0.0.9.post1+slime" + }, + { + "direct_url": null, + "metadata_sha256": "29809ca2c86dda5079654f1f70564a64435e9d08f1964a2412b6f514e1b5ff64", + "name": "torchaudio", + "version": "2.11.0" + }, + { + "direct_url": null, + "metadata_sha256": "7e9be0f3a290e3fd9370d8fe010c7ffd006d5d3d05ab8bdf7df8f92f0fca9c39", + "name": "torchcodec", + "version": "0.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "181fa5e6b399c378711eddcdacd756d3c51317916f8eb160ee36cae7fae9589f", + "name": "torchvision", + "version": "0.28.0" + }, + { + "direct_url": null, + "metadata_sha256": "43d1261aff90cf3d5b1b40cf1f94234d61409b14e59f3766f457c1eec7f7ac15", + "name": "tqdm", + "version": "4.70.1" + }, + { + "direct_url": "{\"archive_info\": {\"hash\": \"sha256=3e1d9f534781c8e608240da0b495b8246317a36382f7609017cbaa7fb1d53f7b\", \"hashes\": {\"sha256\": \"3e1d9f534781c8e608240da0b495b8246317a36382f7609017cbaa7fb1d53f7b\"}}, \"url\": \"file:///wheels/transformer_engine-2.16.1%2Bc9877beb-cp312-cp312-linux_x86_64.whl\"}", + "metadata_sha256": "d882f743161d9d9f35dee4e1a8cc9136fa495f7c660caace01ab8f5602d76aa7", + "name": "transformer_engine", + "version": "2.16.1+c9877beb" + }, + { + "direct_url": null, + "metadata_sha256": "465797a59706d83b45c93fde750b228c3b6e1addc44115de2c4c02ad66d9c5ea", + "name": "transformers", + "version": "5.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "a91982ca086667c592a951973434f7c5a9f27a8300bc97af78dfb496afe53e71", + "name": "triton", + "version": "3.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "d26fbb244532c4051e715f9047cd943e2cc4abb0ac6f2a517fa2986eb1ea726a", + "name": "truststore", + "version": "0.10.4" + }, + { + "direct_url": null, + "metadata_sha256": "c84af1a069084b1b440b3594068dec29200d52d4c1a9b652030448717f270158", + "name": "typer", + "version": "0.27.2" + }, + { + "direct_url": null, + "metadata_sha256": "0ad6653b7439f4bb6a596cb7b01ed1b716458467525c4dc40b75d62bdb943c98", + "name": "typing-inspection", + "version": "0.4.4" + }, + { + "direct_url": null, + "metadata_sha256": "d005280aa13b334ac942d20219102865e559f69ffd06c35c248b2f0d0da3b933", + "name": "typing_extensions", + "version": "4.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "fba2930e9030a18965d243f8d330748db2e67572a81b3b68710462fb5110332a", + "name": "urllib3", + "version": "2.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "bc5717bd6524a33838f285261868bcc8e311e8c29fdb19e41d56c38b04890e84", + "name": "uvicorn", + "version": "0.54.0" + }, + { + "direct_url": null, + "metadata_sha256": "741c006d8441f562aa853a5430df236fbb4af923445491f396bf09943bd30258", + "name": "uvloop", + "version": "0.22.1" + }, + { + "direct_url": "{\"dir_info\": {\"editable\": true}, \"url\": \"file:///vime\"}", + "metadata_sha256": "f85aa01dfdc868756a6583434bbff040f29eb511d47d5b25ada063a84353aac6", + "name": "vime", + "version": "0.3.2" + }, + { + "direct_url": null, + "metadata_sha256": "c25431aaf1950971fe96292f395a41a55b403127bfca0d0b8f7dc9cff5dab75d", + "name": "virtualenv", + "version": "21.14.1" + }, + { + "direct_url": null, + "metadata_sha256": "4e3ee0a31d85e56268640aae853bcee4794dfe8c0483c5c6370517e480c81ae0", + "name": "virtualenv", + "version": "21.14.5" + }, + { + "direct_url": null, + "metadata_sha256": "d4ed5c7551cddb8c1aeff2f9f27b3491f6ad2c9afda8e7bb9779c33fa12a536c", + "name": "vllm", + "version": "0.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "84b482e09bac949e992594757214a1920c667a5d898ee320e309250697f6d26e", + "name": "vllm-router", + "version": "0.1.15" + }, + { + "direct_url": null, + "metadata_sha256": "9b16c871eb1060a5218e9b9a9ad33288d94844cfaf43f08dbb6c32423bde8fe3", + "name": "wandb", + "version": "0.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "8e4f2be437dfe4eb3c6c959e517ac20b75d06525563f1ebcbf06f9ec648bd7c1", + "name": "watchdog", + "version": "6.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "15218afb42938907c2ca74c54e3d8e3a5406493c4761e29e38e82bfec0f84296", + "name": "watchfiles", + "version": "1.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "8863af96e88b7db9990da99aa6c46816eacc3d2f9ae1297b53381b033cd70119", + "name": "wcmatch", + "version": "11.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "f46e6bd6cfafb2b684c29587b017b7096fd9155b74eda25a22eca784b9803ab7", + "name": "websockets", + "version": "16.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "ce82db5ccfefa4bfbe4e25a36e1f91e8e7d51fcaeb31586c4d48e1c69f99168b", + "name": "websockets", + "version": "17.1" + }, + { + "direct_url": null, + "metadata_sha256": "0f142a2c09eac643c7d0bfe77f3f121184c0b17914afbd32af669ed19b2b02ef", + "name": "wheel", + "version": "0.47.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd58938e51a3c5cb363f6f22eaa2a8a7accc1ce373388de167a82f77d3e5783f", + "name": "wrapt", + "version": "2.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "b0b72c1941f04499ca7e1a3a6e479aee8df902c3d49979624b59dba8c3228d37", + "name": "xgrammar", + "version": "0.2.8" + }, + { + "direct_url": null, + "metadata_sha256": "ef8861f39e5c36255966a36032651f937d890d55f31f1c26304b488f1ba34332", + "name": "xxhash", + "version": "4.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "740c08057b6eb69c58402c87d652af0a471e46325d811f2c605632a18817152f", + "name": "yarl", + "version": "1.25.1" + }, + { + "direct_url": null, + "metadata_sha256": "7b060e4d24394b5431875e2f74fec8e6bffa79d2e6b4cb8c7e2a5187dd2d8d69", + "name": "z3-solver", + "version": "4.15.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "3d76d4fbc95f0851191147db12300938c67a6f8fb1df884886d9601272ccc4e8", + "name": "zipp", + "version": "4.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "d3de2651e4e908dbb7c9d80508e5179590217dfac4993dc8b04381c5b9718c4c", + "name": "zstandard", + "version": "0.25.0" + } + ], + "executable": "", + "installed_provider_sources": { + "vllm/compilation/__init__.py": { + "path": "/vllm/compilation/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/backends.py": { + "path": "/vllm/compilation/backends.py", + "sha256": "fa4bff8920b363efbbde9456f135fa9d2c004a5bde1898877f177418b2d8b008" + }, + "vllm/compilation/base_static_graph.py": { + "path": "/vllm/compilation/base_static_graph.py", + "sha256": "5cfe8e06db84aa42cd41cdd93ebe93af00b3a242c8011042057530e2922b523a" + }, + "vllm/compilation/breakable_cudagraph.py": { + "path": "/vllm/compilation/breakable_cudagraph.py", + "sha256": "3cc427612a08e2b9b3fee47548026400c1d0776e2d4747535e59ef5512bdf1e8" + }, + "vllm/compilation/caching.py": { + "path": "/vllm/compilation/caching.py", + "sha256": "71d212452dde742fbf28b8a01ed29d3c08a7457ff7f8da2a20ce9d17e902c2cf" + }, + "vllm/compilation/codegen.py": { + "path": "/vllm/compilation/codegen.py", + "sha256": "e04833bec88cf9d1a13aa7341e30e3233d1138bfe23424e0fd34d664b3fedb9f" + }, + "vllm/compilation/compiler_interface.py": { + "path": "/vllm/compilation/compiler_interface.py", + "sha256": "8d84e2864bf83f754bae9e9f77119e0287cca9f97f5fa5ec2535e07b5ad88944" + }, + "vllm/compilation/counter.py": { + "path": "/vllm/compilation/counter.py", + "sha256": "d8158c54dd36a357bf24f6f84dc22f572d3a27f4875f3d5779b12bc5d454ff76" + }, + "vllm/compilation/cuda_graph.py": { + "path": "/vllm/compilation/cuda_graph.py", + "sha256": "05c86392d7fae967ac73076dba7e01990a0e3ae619e4866450a0c1be56bd1192" + }, + "vllm/compilation/decorators.py": { + "path": "/vllm/compilation/decorators.py", + "sha256": "cab6962e8a1fead59c75f5ed8cb4732f9e5441ff972030c2f4b1c4ba0c58de3c" + }, + "vllm/compilation/monitor.py": { + "path": "/vllm/compilation/monitor.py", + "sha256": "43b24c5cb1bc4d32dc979f3222596905c7b3acc58415328a234402e6edc76abf" + }, + "vllm/compilation/partition_rules.py": { + "path": "/vllm/compilation/partition_rules.py", + "sha256": "857d2fb06dc871ea1d3717cd01fbd4e5205984100d98b7b72a2933d6ff1cfa4d" + }, + "vllm/compilation/passes/__init__.py": { + "path": "/vllm/compilation/passes/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/fusion/__init__.py": { + "path": "/vllm/compilation/passes/fusion/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/fusion/act_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/act_quant_fusion.py", + "sha256": "1fa9c3ca4fb424685b7053c3dda89dda16c98dc5645d85f0f28dca58429792b3" + }, + "vllm/compilation/passes/fusion/add_rms_fusion.py": { + "path": "/vllm/compilation/passes/fusion/add_rms_fusion.py", + "sha256": "e46998552628aa5cd5962fc39ea39ae824fd97e6aeba1d176e9cc7cade39837b" + }, + "vllm/compilation/passes/fusion/allreduce_rms_fusion.py": { + "path": "/vllm/compilation/passes/fusion/allreduce_rms_fusion.py", + "sha256": "0af193505880cec0f6ffa224c688bce3c9ddc318dccdf04a696b4e4b4506a963" + }, + "vllm/compilation/passes/fusion/attn_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/attn_quant_fusion.py", + "sha256": "ecc64e82be4481954c9cac6c23d7794846ab19486b570f2dda07ab5ad67c5a49" + }, + "vllm/compilation/passes/fusion/collective_fusion.py": { + "path": "/vllm/compilation/passes/fusion/collective_fusion.py", + "sha256": "1e2c8539d6960b45907fb3bf0482441ea7250e97c56ffdea1500514efa0b164d" + }, + "vllm/compilation/passes/fusion/matcher_utils.py": { + "path": "/vllm/compilation/passes/fusion/matcher_utils.py", + "sha256": "50ac5714ce1bb113520de769ea6234316acc470a8cdf2537a996ce9a9d54337d" + }, + "vllm/compilation/passes/fusion/mla_attn_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/mla_attn_quant_fusion.py", + "sha256": "a966fe7f58bf9228379f793f5fd851735a97f9639722766b2a20cb79a9e4baec" + }, + "vllm/compilation/passes/fusion/mla_rope_kvcache_cat_fusion.py": { + "path": "/vllm/compilation/passes/fusion/mla_rope_kvcache_cat_fusion.py", + "sha256": "1602cc28055ffa8d1123ddb1d256bf0bd12006fd06ea7e16a986c55746dbe0dc" + }, + "vllm/compilation/passes/fusion/qk_norm_rope_fusion.py": { + "path": "/vllm/compilation/passes/fusion/qk_norm_rope_fusion.py", + "sha256": "aebc7d1a5189b65ac665afcc169e7baebd53efe719c48e35e7c5babe85af0d39" + }, + "vllm/compilation/passes/fusion/qk_norm_rope_kvcache_fusion.py": { + "path": "/vllm/compilation/passes/fusion/qk_norm_rope_kvcache_fusion.py", + "sha256": "f0cfd0d83ec4acb09f9bf91d199b114e9d4995e3059c13eb23a6978ce7c07eb2" + }, + "vllm/compilation/passes/fusion/rms_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rms_quant_fusion.py", + "sha256": "4852aa44e0e2087043fdac271bda9b8d9bfe3201bb84ce3919b8ed454d8083c4" + }, + "vllm/compilation/passes/fusion/rocm_aiter_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rocm_aiter_fusion.py", + "sha256": "372e76c68c75209a085deec6dd22b3816be633613ca82f6f2925c1b3773d61a0" + }, + "vllm/compilation/passes/fusion/rope_kvcache_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rope_kvcache_fusion.py", + "sha256": "3a756e9049593537143b5a56ab9185a6bc83f57ed81d84226d7791a46a984b53" + }, + "vllm/compilation/passes/fusion/sequence_parallelism.py": { + "path": "/vllm/compilation/passes/fusion/sequence_parallelism.py", + "sha256": "3af7e420dcb35fff0bae0f8f599d0f1bda34445ebe194059892a434b2976d654" + }, + "vllm/compilation/passes/fx_utils.py": { + "path": "/vllm/compilation/passes/fx_utils.py", + "sha256": "730708213acf9d1b5f3176b433dfc197a5f3c81b5ce443f0923c526924833003" + }, + "vllm/compilation/passes/inductor_pass.py": { + "path": "/vllm/compilation/passes/inductor_pass.py", + "sha256": "1f380aacf7adabb8bf8b7d41c0a93473947f0716f7445bd910fd448f6c08e672" + }, + "vllm/compilation/passes/ir/__init__.py": { + "path": "/vllm/compilation/passes/ir/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/ir/clone_elimination.py": { + "path": "/vllm/compilation/passes/ir/clone_elimination.py", + "sha256": "5297078f5cddce081faba5215814275381d2083b32318fcfeb2bf9d69fedb7c7" + }, + "vllm/compilation/passes/ir/inplace_functionalization.py": { + "path": "/vllm/compilation/passes/ir/inplace_functionalization.py", + "sha256": "2dc4f22c6f05224828c2941479185b1452d4490f488b7f0bfd124334e7809fed" + }, + "vllm/compilation/passes/ir/lowering_pass.py": { + "path": "/vllm/compilation/passes/ir/lowering_pass.py", + "sha256": "d9c3d90f63138420f0e5489447b5996573fcfbbab939da2efccd00848492b172" + }, + "vllm/compilation/passes/ir/utils.py": { + "path": "/vllm/compilation/passes/ir/utils.py", + "sha256": "f59d33a6c7d0616cbeec1e9fb1d6c948881bf81fe124caeb906eac2e2197ea21" + }, + "vllm/compilation/passes/pass_manager.py": { + "path": "/vllm/compilation/passes/pass_manager.py", + "sha256": "486979a058aa2e20ebedcbb6e039f7a59f38d2efd2cda11219fae4067be0968d" + }, + "vllm/compilation/passes/utility/__init__.py": { + "path": "/vllm/compilation/passes/utility/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/utility/fix_functionalization.py": { + "path": "/vllm/compilation/passes/utility/fix_functionalization.py", + "sha256": "ad5b504a05ccee023869b0c8df70ec2fff9a4a80d25fd903e2b532f470e7203f" + }, + "vllm/compilation/passes/utility/noop_elimination.py": { + "path": "/vllm/compilation/passes/utility/noop_elimination.py", + "sha256": "8abf85d28c13f95059f2acbc0275b9b9ed2ad4990f7c5763bbe3067a4aa629ce" + }, + "vllm/compilation/passes/utility/post_cleanup.py": { + "path": "/vllm/compilation/passes/utility/post_cleanup.py", + "sha256": "1c38b14fc209165cbcf8ca763a17ac4e528b97f59b573e5d52df2cce7d758de3" + }, + "vllm/compilation/passes/utility/scatter_split_replace.py": { + "path": "/vllm/compilation/passes/utility/scatter_split_replace.py", + "sha256": "138402cc3097768a32e9e5b8d1a054b6176e494bddc8684e23ca2dc5fdc3fdda" + }, + "vllm/compilation/passes/utility/split_coalescing.py": { + "path": "/vllm/compilation/passes/utility/split_coalescing.py", + "sha256": "0b02acd9e1ad43d7b3e128b914e969b9580773f2818078846dfbf163a8bd0871" + }, + "vllm/compilation/passes/vllm_inductor_pass.py": { + "path": "/vllm/compilation/passes/vllm_inductor_pass.py", + "sha256": "4f83ffb67f834a214221d810c7843a8e41eb4e5930eb40adbd8cf054ff6fb9c6" + }, + "vllm/compilation/piecewise_backend.py": { + "path": "/vllm/compilation/piecewise_backend.py", + "sha256": "6525318ff3ca2e4978e24dd9232a7ae0a02e920e19604b83db6f6043d1f8a54d" + }, + "vllm/compilation/wrapper.py": { + "path": "/vllm/compilation/wrapper.py", + "sha256": "c1b1fca679ea16aa07a696831a810c0d531da2bb0ea32dd6f1a95cdaef36de07" + }, + "vllm/config/__init__.py": { + "path": "/vllm/config/__init__.py", + "sha256": "56fb0cb1598d297e4f95a97e5d86dc624145d1532f5faa432b7d2834d7155bd5" + }, + "vllm/config/attention.py": { + "path": "/vllm/config/attention.py", + "sha256": "c41f345b512d9b7df882328257eb3a6381f41088c11ae83b5ecd8a9e8265d1bc" + }, + "vllm/config/cache.py": { + "path": "/vllm/config/cache.py", + "sha256": "f1c226ba679c884930dbfcaf41a57248b137a9a20d3ed8e3d3b31752bb484c07" + }, + "vllm/config/compilation.py": { + "path": "/vllm/config/compilation.py", + "sha256": "c9cec5c7200e8e559810ec8c30113ad61dab6780f9f7fb3c116bd0d9b5a43065" + }, + "vllm/config/device.py": { + "path": "/vllm/config/device.py", + "sha256": "7b82eee02ceb5842337451a27a3d5729920c47e25e8f6bf3997f5146f9330a9c" + }, + "vllm/config/diffusion.py": { + "path": "/vllm/config/diffusion.py", + "sha256": "1fa9fd2478a866098a28a3586b55af2f9738656b7813a55d76539c10dd99fe8d" + }, + "vllm/config/ec_manager_config.py": { + "path": "/vllm/config/ec_manager_config.py", + "sha256": "418b387dbe7bdf67deddce331c205768a2d42aea37141f59fb02a8a1528e3552" + }, + "vllm/config/ec_transfer.py": { + "path": "/vllm/config/ec_transfer.py", + "sha256": "0eabb2c25194676d23c6acf59562672a1dd24415043ac5737d621ce0d681ec70" + }, + "vllm/config/engram.py": { + "path": "/vllm/config/engram.py", + "sha256": "34043a22385a041d4e9be8857f64174c990c2ca8308b97b6a952b5ab96c20ee5" + }, + "vllm/config/fault_tolerance.py": { + "path": "/vllm/config/fault_tolerance.py", + "sha256": "b166b24373d599fb15ddc575e3061cf0dcb42174d0369d8468008e7ffbb2a4e2" + }, + "vllm/config/kernel.py": { + "path": "/vllm/config/kernel.py", + "sha256": "27e23c584cf862f4091858db6dc85bbc2a01f4baf9dca3f232ae6f3bac02390e" + }, + "vllm/config/kv_events.py": { + "path": "/vllm/config/kv_events.py", + "sha256": "b1dbaee3e6830e381e9157fe3bab0d65c357da88ff7cdf8b1e4b3a4e75c82a87" + }, + "vllm/config/kv_transfer.py": { + "path": "/vllm/config/kv_transfer.py", + "sha256": "506fae7a9d7f32cb3646156cf9249a856f6317dff6c4c85db70efd34418c429b" + }, + "vllm/config/load.py": { + "path": "/vllm/config/load.py", + "sha256": "bd6431c22e078362d749a56a2c84145432ebf2605d8bcfa2ac679182d18ed630" + }, + "vllm/config/lora.py": { + "path": "/vllm/config/lora.py", + "sha256": "ed6cf6575f5950f079a62f904caeae93d1a4745dd8c21788b74367883bcd4b08" + }, + "vllm/config/mamba.py": { + "path": "/vllm/config/mamba.py", + "sha256": "2090f791201ca45dd4f1d72b8651268890eb07574b6084721194eb8fdf612c48" + }, + "vllm/config/model.py": { + "path": "/vllm/config/model.py", + "sha256": "f4168b67cc93ce72ff2a6d4c66974223e32fd0f1fab4c05e44bd68a275e18d69" + }, + "vllm/config/model_arch.py": { + "path": "/vllm/config/model_arch.py", + "sha256": "2babe28329d7b60b4e205f6d72c687f0f66e6535aa2f20411469e5ec362f6b5f" + }, + "vllm/config/multimodal.py": { + "path": "/vllm/config/multimodal.py", + "sha256": "271911aee151f17f092228cecee82af0713e9a47340ffdf66834ca7638a50d22" + }, + "vllm/config/observability.py": { + "path": "/vllm/config/observability.py", + "sha256": "d57c59ec776477ab0a20e9f2b945bc954d8ea3737c869259480e9aa10dfb9f6d" + }, + "vllm/config/offload.py": { + "path": "/vllm/config/offload.py", + "sha256": "6f2db3d9a2730588473d5155811690c6241b167a21dcb62fbbd9ebb6386de42c" + }, + "vllm/config/parallel.py": { + "path": "/vllm/config/parallel.py", + "sha256": "f012ace89e3fb730a467f729f602679bc145c49f0d10721811c9d818570e7b2b" + }, + "vllm/config/pooler.py": { + "path": "/vllm/config/pooler.py", + "sha256": "9f01913dcb7bccbf9b672b16643f18471ae202455992e8afaf0725a17f2b3d08" + }, + "vllm/config/profiler.py": { + "path": "/vllm/config/profiler.py", + "sha256": "04d24fa1dc7cfedca6b5c7d9115f7f7021722fc46a5b15234a1e3b3a506c93e5" + }, + "vllm/config/quantization.py": { + "path": "/vllm/config/quantization.py", + "sha256": "acffc52f525b39a88efd656f1ed705ce3a1b758298bb0684fac7694776bc10b4" + }, + "vllm/config/reasoning.py": { + "path": "/vllm/config/reasoning.py", + "sha256": "2c4f7bdee48a9fb3d93787c4c32361c2411417cce452cfde86808d8759977861" + }, + "vllm/config/scheduler.py": { + "path": "/vllm/config/scheduler.py", + "sha256": "822179da62be4bca0619c8590082ae09123f5c4415f9cc2037be673748239edb" + }, + "vllm/config/speculative.py": { + "path": "/vllm/config/speculative.py", + "sha256": "9c642a87264339c0dbc1d0b57330572149df0f9d5e16c6893b9895e50a619e19" + }, + "vllm/config/speech_to_text.py": { + "path": "/vllm/config/speech_to_text.py", + "sha256": "bf4a566fbde6a1cec1e209070b739650c3302c12696739c88049cb8f723a4c3f" + }, + "vllm/config/structured_outputs.py": { + "path": "/vllm/config/structured_outputs.py", + "sha256": "55649776594349b8b4aa3e08fc4c88068366732a486d6fb235079188044aa829" + }, + "vllm/config/utils.py": { + "path": "/vllm/config/utils.py", + "sha256": "d035e9e488ba92b6c47a96cf05d9b2a850d53eda8a05115b22ff9af8dbc2fc64" + }, + "vllm/config/vllm.py": { + "path": "/vllm/config/vllm.py", + "sha256": "956b812e5a719bcbfa3a3958801361b38b9c928c96b8c073311bbb96376dfb7a" + }, + "vllm/config/watermarking.py": { + "path": "/vllm/config/watermarking.py", + "sha256": "30e6620a3cd7529f0736ad55e38bc326a6a78dee4552f0722208400041c94a1f" + }, + "vllm/config/weight_transfer.py": { + "path": "/vllm/config/weight_transfer.py", + "sha256": "92edd9e5ea90c97a8f3c5f20abf1734a105ee1f3f89e306e7ba87e758f1f767e" + }, + "vllm/distributed/__init__.py": { + "path": "/vllm/distributed/__init__.py", + "sha256": "97f28c30b32662af8cab163939e4ee423037f11630752e13b55cbc25a7d0ab71" + }, + "vllm/distributed/communication_op.py": { + "path": "/vllm/distributed/communication_op.py", + "sha256": "3c3f8ac60db38ece891d39dc1e2f6f1947ad438685893d2e5777d072320bd1b8" + }, + "vllm/distributed/device_communicators/__init__.py": { + "path": "/vllm/distributed/device_communicators/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/device_communicators/aiter_custom_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/aiter_custom_all_reduce.py", + "sha256": "f8eb027ce7a85d94af6260960ceb7f36fc6f1406c9af9c9b6285fddb3f178009" + }, + "vllm/distributed/device_communicators/all2all.py": { + "path": "/vllm/distributed/device_communicators/all2all.py", + "sha256": "1f1b69236acd3cd7bd94520fd6d591bfd31b57c4bc7c9f9f4161ea8bbd0c5f26" + }, + "vllm/distributed/device_communicators/all_reduce_utils.py": { + "path": "/vllm/distributed/device_communicators/all_reduce_utils.py", + "sha256": "ed0ab4dd05b2519a6313892e68824c97b540034664d7f8c3d031b322e33e1bfc" + }, + "vllm/distributed/device_communicators/base_device_communicator.py": { + "path": "/vllm/distributed/device_communicators/base_device_communicator.py", + "sha256": "4a7670f12ed7c7621b25d476e2687c24ca01f3be183fff4a6a25337596fe506b" + }, + "vllm/distributed/device_communicators/cpu_communicator.py": { + "path": "/vllm/distributed/device_communicators/cpu_communicator.py", + "sha256": "e1856c8e91cfbbb4d9ce990c1236e258ba4021e226afcbab645653380b38d64b" + }, + "vllm/distributed/device_communicators/cuda_communicator.py": { + "path": "/vllm/distributed/device_communicators/cuda_communicator.py", + "sha256": "102d95c67ec798cf352b817ba92e8abc9da37f30d1bbdf3aab45d3927b627b93" + }, + "vllm/distributed/device_communicators/cuda_wrapper.py": { + "path": "/vllm/distributed/device_communicators/cuda_wrapper.py", + "sha256": "333b6d9ed173e7a18c7f2b6627a3c9c9ed88892ce52015f05e29d6d245e48ee3" + }, + "vllm/distributed/device_communicators/custom_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/custom_all_reduce.py", + "sha256": "a048c1327c23580805600c0c951831bec333b1ffc4eb26a0e3d34119c4f0c445" + }, + "vllm/distributed/device_communicators/flashinfer_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/flashinfer_all_reduce.py", + "sha256": "b4359760e9b55963676109a5c3a015fb82e190d4df1d021de9ee01e7814cbdda" + }, + "vllm/distributed/device_communicators/flashinfer_pcie_ipc_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/flashinfer_pcie_ipc_all_reduce.py", + "sha256": "8b67b0fc356a565095f56b475cc89c513e3a5eff051ab1c52e5beb0c1a79e9f2" + }, + "vllm/distributed/device_communicators/mnnvl_compat.py": { + "path": "/vllm/distributed/device_communicators/mnnvl_compat.py", + "sha256": "72ee1e6f9571b4c8ecbd9f60cd469d1b565cb79cab519a688a93f290906a2615" + }, + "vllm/distributed/device_communicators/pynccl.py": { + "path": "/vllm/distributed/device_communicators/pynccl.py", + "sha256": "882fb83c5a3c565a3f8fd664b79f5ceae566dca180019ecafd74bc8c11d9f8cf" + }, + "vllm/distributed/device_communicators/pynccl_allocator.py": { + "path": "/vllm/distributed/device_communicators/pynccl_allocator.py", + "sha256": "390e2576cbf4ae06341ca4dab24fc7e4d4f7c24dd444329ed05d828a9ce91460" + }, + "vllm/distributed/device_communicators/pynccl_wrapper.py": { + "path": "/vllm/distributed/device_communicators/pynccl_wrapper.py", + "sha256": "ce63c8da57bb88d4cf89956bd70bb63f0f44bfad468ddb37b765611551f6d99f" + }, + "vllm/distributed/device_communicators/quick_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/quick_all_reduce.py", + "sha256": "8aacb23e7c297b0ae2f80d99c5affd2e7517115d7874be51069d14a44db7b5f2" + }, + "vllm/distributed/device_communicators/ray_communicator.py": { + "path": "/vllm/distributed/device_communicators/ray_communicator.py", + "sha256": "332c37f65495b60564d61db59bc2d30ca0236adc33442d01464790bde9aec897" + }, + "vllm/distributed/device_communicators/shm_broadcast.py": { + "path": "/vllm/distributed/device_communicators/shm_broadcast.py", + "sha256": "f3e7a3f3ff713fccbd535e0d41650ee05bdf8677e83d4b90519910645022c30b" + }, + "vllm/distributed/device_communicators/shm_object_storage.py": { + "path": "/vllm/distributed/device_communicators/shm_object_storage.py", + "sha256": "e097bf7ac0141fe8db4131e8fd553ca2ad5b0600b22a56f3924af6b795e7207c" + }, + "vllm/distributed/device_communicators/symm_mem.py": { + "path": "/vllm/distributed/device_communicators/symm_mem.py", + "sha256": "b06e3ddb9ae880a30ec4a103ce32eb9794223bb0293832e89572af28adaaa544" + }, + "vllm/distributed/device_communicators/xpu_communicator.py": { + "path": "/vllm/distributed/device_communicators/xpu_communicator.py", + "sha256": "527cbfb250760abc62096ee7cd612307b821f21b72dee1687ad866620ec89b6d" + }, + "vllm/distributed/ec_transfer/__init__.py": { + "path": "/vllm/distributed/ec_transfer/__init__.py", + "sha256": "061405bb51df7409c9938b62e25caa8bd6ebf85da6d1700dbd4affe2a0825135" + }, + "vllm/distributed/ec_transfer/ec_connector/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/base.py", + "sha256": "22d4913375bb622473fbe1a77f9376b804949cd8a7e31e9518208f9561d161e2" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/common.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/common.py", + "sha256": "e2267abd8d00a6d2605e1a82ea5c73396a71b427452eab469fcca0134c334e7c" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/connector.py", + "sha256": "72cd35d9fd754a2992dd090a8af13c91e0789b4038ac29276750d823120235db" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/base.py", + "sha256": "19e8df88b0fa831997896355ecdd49e0d86cb074cd7ae28aed0b328b0bb3ab2e" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/zmq.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/zmq.py", + "sha256": "435641c0e37551ab4937855abd067be26905b91215e759cbd9d28a419a34ff9a" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/base.py", + "sha256": "3be698aeb67d32ee3741e76b2fb71806941c587578583acf8fbc42fbf22b46a5" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/nixl.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/nixl.py", + "sha256": "03af8f6549a6027b7262a482907af591e45f28b9b1c5a3408bbc6600e38797e5" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/ec_shared_region.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/ec_shared_region.py", + "sha256": "e40607952c9920024455eca2f419e8c3ef1de9a4d8b27c147a33bb941b8c08b1" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/protocol.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/protocol.py", + "sha256": "05878336884396bfbef77b96b0fa6359f6fa0aba912961f14a84f5a436f27038" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/__init__.py", + "sha256": "01c42385bf3a55cff09cc05ba956f6dd4b8b6b986bf4d6eca4e566cb045b48e0" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/embedding_cache.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/embedding_cache.py", + "sha256": "7359fb980af1fc30b3253681310ef636e2b4a19134e04a93270c9c45de2572d8" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/session.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/session.py", + "sha256": "5973548a919e13c866222b91d502686a6757a31e5a5664b879bf2887ed9fb212" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/utils.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/utils.py", + "sha256": "160ac665f20f2c75b343c1e784084f2b0b4d1cf8fdb28ee15deee4dc8ed0ce45" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/worker/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/worker/__init__.py", + "sha256": "f08d296d3560c42173ae8af961af4a768033ccf1e36e9c17c0cdd53013d0c52e" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/worker/descriptor_buffers.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/worker/descriptor_buffers.py", + "sha256": "be7c81be214e995da8499105ba485854d9c19d6f8e905f8f1b87b83694ca0864" + }, + "vllm/distributed/ec_transfer/ec_connector/example_connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/example_connector.py", + "sha256": "09022ce07a89114bb65d9befd2e60873453aed11bbac8c0a75c1e6084e785a5f" + }, + "vllm/distributed/ec_transfer/ec_connector/factory.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/factory.py", + "sha256": "d6cedca0a99c3dd2b03cd1c15d17472b983e3f7d8f5baf4a12eecaf6abedb817" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/__init__.py", + "sha256": "1cbfc2f95f8f4d48a9253056eb1fd4b562062884e3fd5cb6571583c352fc16f3" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/config.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/config.py", + "sha256": "98c60696f79d1de67d2364cd9e8a42a393b5c8e17ed9af2f971368e47891d7b3" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/control.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/control.py", + "sha256": "58e0d1a423fbe958bfa586ac26a17107e08d0b31d044b4c74ab4dde880e7ca9b" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/memory.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/memory.py", + "sha256": "d5e90b1348de670a70f110d58eedcbdbd053db72c21dd007c3f5275c53951149" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/metadata.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/metadata.py", + "sha256": "497a7e6dfffb7fce80a41d5989f96119b970c143df77bb9d0f9c91d7a46e8c42" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/producer.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/producer.py", + "sha256": "97fa4d0b19475574778eab02f55fad73db9642beb9156da890314fd53fa1a7ab" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/reservation.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/reservation.py", + "sha256": "4790bc65cde4db5f17733ca2c2910980ba594a8a9b79ee27c5b957dffd4c1113" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/scheduler.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/scheduler.py", + "sha256": "53004b62529a31fdd80dfb2e6026610b95041a77e91f731ae526fefd84e7968d" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/state.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/state.py", + "sha256": "92f375d6c5cc9c83dbe95a7977ad8eb0f1b5629ccee92968bcacdc94eee15d65" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/transfer.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/transfer.py", + "sha256": "ada2113a5402054f1149d3edc2537f4e5e1bd696c9b17291c9f2b4cbf6b59753" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/worker.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/worker.py", + "sha256": "89eb91bb64845b3b121d502972a6b04d448714253becd2ea662e5691cd5acdd7" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake_ec_connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake_ec_connector.py", + "sha256": "aaebab4711bc00dd0c622dfbfd8639fc41e7ed5d1658d7d68fe33e4d5fbef3ba" + }, + "vllm/distributed/ec_transfer/ec_connector/utils.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/utils.py", + "sha256": "11b9014b9c0697f8846deff1a55a22fa86a15dc2ac3e139442fb6d513ac03059" + }, + "vllm/distributed/ec_transfer/ec_transfer_state.py": { + "path": "/vllm/distributed/ec_transfer/ec_transfer_state.py", + "sha256": "9487a41f23fa1a4fa6dfca8b42b8e97a0ee19d8406ffd1dcf4bef66315180827" + }, + "vllm/distributed/elastic_ep/__init__.py": { + "path": "/vllm/distributed/elastic_ep/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/elastic_ep/elastic_execute.py": { + "path": "/vllm/distributed/elastic_ep/elastic_execute.py", + "sha256": "b8f60a4183c79ff6051095b5f95bb385bc7fea0cffe8cd9ebc9087ab0e9f01b5" + }, + "vllm/distributed/elastic_ep/elastic_state.py": { + "path": "/vllm/distributed/elastic_ep/elastic_state.py", + "sha256": "fbf049199841a086fdf2fc1ab8498ef017ad3bf319db65c3ae61acbb536d2e10" + }, + "vllm/distributed/elastic_ep/standby_state.py": { + "path": "/vllm/distributed/elastic_ep/standby_state.py", + "sha256": "15282597550ebd0e07b8492ff192aea1ec0dcec8f0ad34009123e1002cc140c1" + }, + "vllm/distributed/eplb/__init__.py": { + "path": "/vllm/distributed/eplb/__init__.py", + "sha256": "1b9c2ee22abb5888c354c5aa01f0944f253e5e24e135d019778398bbe495a628" + }, + "vllm/distributed/eplb/async_worker.py": { + "path": "/vllm/distributed/eplb/async_worker.py", + "sha256": "424328600ad1003286fc5dfffa1f9482007314c060947818b2f94a8b97811f5e" + }, + "vllm/distributed/eplb/eplb_communicator.py": { + "path": "/vllm/distributed/eplb/eplb_communicator.py", + "sha256": "ba30d9d40e7b81d3f42aa9041d2f328edca4073cfe2de920285eb68375501ed8" + }, + "vllm/distributed/eplb/eplb_state.py": { + "path": "/vllm/distributed/eplb/eplb_state.py", + "sha256": "2f06bc8c63f3fdf55edb5032ae55c0ffcac3e67720ce74ea312e3d141b12acf4" + }, + "vllm/distributed/eplb/eplb_utils.py": { + "path": "/vllm/distributed/eplb/eplb_utils.py", + "sha256": "058af6104faa6d4085c1dca80bbe60d92bf0a7ec9cd92c775a180546c9d8c9c3" + }, + "vllm/distributed/eplb/policy/__init__.py": { + "path": "/vllm/distributed/eplb/policy/__init__.py", + "sha256": "daeb266c88442832b1ab8c8c4cc064891b38b9e9ba00aea324f926c87dc6d37e" + }, + "vllm/distributed/eplb/policy/abstract.py": { + "path": "/vllm/distributed/eplb/policy/abstract.py", + "sha256": "b9fd34c28bbfdded03360d7f3f6f8fb978e82689190d7ae4501dfe520e958c62" + }, + "vllm/distributed/eplb/policy/default.py": { + "path": "/vllm/distributed/eplb/policy/default.py", + "sha256": "3b54229e6240d050480390f6b29d4744fd38437d23719f78a6decf7002296a29" + }, + "vllm/distributed/eplb/rebalance_execute.py": { + "path": "/vllm/distributed/eplb/rebalance_execute.py", + "sha256": "b387e228791149018536eee96cf955b33ba79d801cdc36849d1b47a580ec2597" + }, + "vllm/distributed/kv_events.py": { + "path": "/vllm/distributed/kv_events.py", + "sha256": "de08f01e8736881560256c350a3b6418999dd4aa30f9c6ec9159527f7ed6899a" + }, + "vllm/distributed/kv_transfer/__init__.py": { + "path": "/vllm/distributed/kv_transfer/__init__.py", + "sha256": "c1be4e58ec6923bae607a355ad22891c740f056a69ff7358b1e10ea3fd2680ea" + }, + "vllm/distributed/kv_transfer/kv_connector/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/base.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/base.py", + "sha256": "2ae2a2c48f5731f3533166a75440fe91e764332305b5d713df840edba970789d" + }, + "vllm/distributed/kv_transfer/kv_connector/factory.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/factory.py", + "sha256": "add99c93c587b0098b90b1f8fd6940bdd1f15c236c5c6f1a258411863cb902d3" + }, + "vllm/distributed/kv_transfer/kv_connector/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/utils.py", + "sha256": "317ed40dc837671ca6e666165222e641a0f9b3992aea63bbf54de7e13d40b3a4" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/__init__.py", + "sha256": "5beb6ccad12fdcfe1581982da6f18321caca50e73a6b3259ebf3c8dc8b3ffcca" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/base.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/base.py", + "sha256": "97af64220475c6c9e8273438d7b5138b105ebe6944beb783facb36a3bb76f31b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/decode_bench_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/decode_bench_connector.py", + "sha256": "b4151c88cdec28f1ff9259047abc17baf23b892f4b68769a93bf26e0442b9017" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/example_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/example_connector.py", + "sha256": "6226876ef52d10d0d284d29c337ab44698e8bac6abdb2e0ece53b5756c55d068" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/example_hidden_states_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/example_hidden_states_connector.py", + "sha256": "58c22534dcad0fb73599a2d70a2fb104d5b612a4723be5e777f56a56fe07892c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/flexkv_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/flexkv_connector.py", + "sha256": "de4f68c3bd565ed898e47e0b2980049b966ff31888f1957050d30995d4953762" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_client.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_client.py", + "sha256": "bea6ecff2be281c7e96c1551c7bf463cbb01f2964696067c0ebdb683844f9aab" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_connector.py", + "sha256": "e67ed58015090e5eea9d499883f2a9422673d07f8bdbe0ccff7db15d2460de13" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_metadata_server.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_metadata_server.py", + "sha256": "6800e5cf37809f8a8e28c469c14a434db288bc3bf83a8b62ee06910a20c2da19" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/common.py", + "sha256": "8f2c02c08227a9093e6aeb183961aba36b7812cfc29b8c047a2b2c9d82f79c15" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/gather_scatter_helper.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/gather_scatter_helper.py", + "sha256": "08c1b43de34fbeca77357d7576ac1d17cba974b59d695562f68bb713061e7b54" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/hf3fs_mock_client.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/hf3fs_mock_client.py", + "sha256": "bec61a9b0c4b9124b2292d7646d76411da44396389349b53cdcbc46353c8780e" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/connector.py", + "sha256": "8c61094ce0a3a702908f9576f69482e6bf314738a2cbe33a7d3b47258fa0ab43" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/stats.py", + "sha256": "d9383a6ad6ab6b8f812d29d90495407b770eeddb79b86e9d0e3216c0bd16e0ed" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/worker.py", + "sha256": "251c0d8e57e4739c03ce3e1c899a95ff5b1752eb27676c28ab88c4ebd62c4776" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_connector.py", + "sha256": "5991f9ff8832df32bd421eb67e48237270ea0a408180e523810bb43606acf8f3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/__init__.py", + "sha256": "c53be9796e76cde637514bfc40a525d8c09bb2784b406cb516790d8285dfe433" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/multi_process_adapter.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/multi_process_adapter.py", + "sha256": "6480d67b31ed603027a83edf327880a38aee45eaeee2da9a4efa93e95527c166" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/utils.py", + "sha256": "e204fa6a853ac9c122d7a4e9d146902230f81c48d4321ed5edfdbf979dd49ba2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/vllm_v1_adapter.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/vllm_v1_adapter.py", + "sha256": "e6fe55049c6b007248516d69640e2f3a4809f9d286091a1014ae0949987fa8f1" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py", + "sha256": "c712c386a7c57bf0355a1441ba574232c3aa5498fcb70713a2b3f5d18b64f9c1" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/metrics.py", + "sha256": "de1b1797d0448f74370919dbb0278767f390e8f59e00a0c0528abefb302babc2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_connector.py", + "sha256": "516be01320e64b0110e102eeb69a6ba766dd5ac8cb3036db6b97b7d54413323d" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_utils.py", + "sha256": "26877610463fa8e9d6b092772f2551bcc0c3ac794cbe63996df0414666a8ebba" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/rdma_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/rdma_utils.py", + "sha256": "716e5042edecaba36c7ca763474988f32fa09c2668b8260260149df610af8f83" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/stats.py", + "sha256": "f39b2f0b1db2e4f922e27e684a3f7bbf5bb279b82a0a8c3bb0c7ae69b6d14d24" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/connector.py", + "sha256": "17a350bdb89e17e415d6c52a48684dc15c35a804378daf03e1f3bee1b1b123a3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/coordinator.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/coordinator.py", + "sha256": "a8eb6c2157a96e8d25233b82347ac8409a41d6390b4f2c64242119c05911010c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/data.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/data.py", + "sha256": "d3cfefdb4165a24995749cba452641b318065baa95bb1bae62f922a2f8886e7b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/metrics.py", + "sha256": "f2b9ef8927632d142aad11a374d0725c6e619ea0bb7fea9eda3f3895eb7d277a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/protocol.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/protocol.py", + "sha256": "ccb1cf6a84a932a375215627d2aaac482c351a05df015d636d05373a6845b7c8" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/scheduler.py", + "sha256": "283849ff581ec206444cdf5621622377f1c925e8d7e05cb9294af2f3a5094e79" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/worker.py", + "sha256": "55f1682dfd1ed7af689166421337126a0e1d08afa4774a242e098d79e0c1e95b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_common.py", + "sha256": "549bb4fe22dca5095515b9c0712c31cc81a9d4923881e9f112317640fd8c04ab" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_connector.py", + "sha256": "c0f474bc34b579d889fae92eaf43eaca241be51a4697a187a942f0df4e6b6a98" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_engine.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_engine.py", + "sha256": "d842f3772fc6588d5a329a67572324cb74709aa3df4033e64c791a1e706c8e88" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_layout.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_layout.py", + "sha256": "2b4ec046a78897236b0626939bb828b6ec095355097d10bca39e5f3e1c992553" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/multi_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/multi_connector.py", + "sha256": "12d8387239f3194f2cb63ccbd64824648047210323572d66671e6a1eed349fc3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/__init__.py", + "sha256": "cc3145fe3b6d219a267bf40a0f7c0cc9430e4289f94acab2df761b99b671e7ba" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py", + "sha256": "7a1db8c54e4cd846bdac747344f2aea2c2fcf507817928796063225223b7e169" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_worker.py", + "sha256": "49a2e4faf99bef146b5a1d4d18d48f240b1e561c438252274494b359db96ef52" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/connector.py", + "sha256": "b6a0dc916d052f344be72ecfcb111509c13580102c11a860fa726cf0888949a9" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/metadata.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/metadata.py", + "sha256": "2b23a07c1ec5ac5490c3b818737c7192e344ea9f52cd5623f75939f741ab4e21" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_scheduler.py", + "sha256": "ac3daf8e2246581fec84ab28f2133569421b62c32a120be4923e2f4d0f2f9de9" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_worker.py", + "sha256": "e5060c9b6cf022de35ca3d1da7a369cd6a6a2dea26219af9f7633aaf78af8a76" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_scheduler.py", + "sha256": "2d9008e33937a4d6c5cf9cc2f96160f2bdbc8e987fe37f0798a7fd7eb84c9572" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_worker.py", + "sha256": "87de3ea383dd3aa95fb2c287ea26ded8a330859cc1295f9faa69047e80865c2c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/scheduler.py", + "sha256": "09f1bfe7075b926b26a94529480e33b62c3ac273ff826f6c502084f08b1b2a08" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/stats.py", + "sha256": "3e710654e0b68d1a8592f0c4735c81b22f4bf698fb1a2dfea126d35bf2dd1ef2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/tp_mapping.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/tp_mapping.py", + "sha256": "2d43607f98701b2fad6cc0ac2767619a80b7fc2b3a3c2eb6ed0da4fb05dcd8f6" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/utils.py", + "sha256": "93de863fc8307a61d40b62f1b176b57ae93c363d34b9e9ddc8e666265b6d45dc" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/worker.py", + "sha256": "5134a36ac100ce7a64f5311029a37ac12c38d91093f63100f51f7fe53ea7c3ee" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/canonical_mapping.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/canonical_mapping.py", + "sha256": "e0b3c6f9806a650e0370c43c5068fc31c0fec94615089e15fdf270d7d96f2b64" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/common.py", + "sha256": "9b3f042c6fa1581d10e8f688d2d9bc927bb41b780a9ea01f514d57228e20c978" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/config.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/config.py", + "sha256": "aea82e60889e78dcad8564ec8285b65a6a372824a1545a98ea8e78b6f4fd418a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/events.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/events.py", + "sha256": "d7039b67be95fd444966628184040a94880873c0611c0e6e7525a22650ffdefb" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/metrics.py", + "sha256": "13d76df014e86691f58dc89a879f9808b124690c9267dd5fa3b2d4004d4c5fdf" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py", + "sha256": "2c5282f4a3165cd787fb355e215e3869f1bdd3f2c795b2155fc537c9d135191a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/worker.py", + "sha256": "acc2df53262441dfc6421a3af7f0cbd68cbfaedbd42bbc384d8e1da2d965d194" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading_connector.py", + "sha256": "cdc16ca7339a10e1993bd6220e6273f86a4e99779f58f25098a24ad31bb0dbd8" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/simple_cpu_offload_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/simple_cpu_offload_connector.py", + "sha256": "96238ca82ccf07a1eeb59b8f66de17b09034e3eb993ad9a0a836511d3f69706b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/ssm_conv_transfer_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/ssm_conv_transfer_utils.py", + "sha256": "59a949709482e65a007fbe5352fe9b4bb54c2dcc10ad2c1c41f754b6e13299f4" + }, + "vllm/distributed/kv_transfer/kv_transfer_state.py": { + "path": "/vllm/distributed/kv_transfer/kv_transfer_state.py", + "sha256": "2e5fe09438d6e2ee642f8a26cf7dcf632e870d955d30baf002b76a8bfe836d05" + }, + "vllm/distributed/nixl_utils.py": { + "path": "/vllm/distributed/nixl_utils.py", + "sha256": "0bffa3c052c9f67472b1c0bc3816114891b010c968bf4b8a292e7da4d687db53" + }, + "vllm/distributed/parallel_state.py": { + "path": "/vllm/distributed/parallel_state.py", + "sha256": "d9b10ad56833ebc08a753e1a050ef0989c30d4134021b7b7b00150b7bd01adc6" + }, + "vllm/distributed/stateless_coordinator.py": { + "path": "/vllm/distributed/stateless_coordinator.py", + "sha256": "f52848fbe985ed47b1f3e3ca555314736ca06436e8d738ab4390101f0672dcb0" + }, + "vllm/distributed/utils.py": { + "path": "/vllm/distributed/utils.py", + "sha256": "792146b357139e705064a68d3b66858de8a0baaca4dc7db1232fa217d45db231" + }, + "vllm/distributed/weight_transfer/__init__.py": { + "path": "/vllm/distributed/weight_transfer/__init__.py", + "sha256": "3fb9d4712b7c131d522f5e76e73cd8c333f3cc7af86e2d5ecf9b61b57b3b7f5a" + }, + "vllm/distributed/weight_transfer/base.py": { + "path": "/vllm/distributed/weight_transfer/base.py", + "sha256": "8ab06feb04f1379d0558fbdb77fde46bc84f179e0a26742cabab937e88caa38d" + }, + "vllm/distributed/weight_transfer/clients.py": { + "path": "/vllm/distributed/weight_transfer/clients.py", + "sha256": "ff85c79c350241e6d2749ca23c9d295a3289b4b62bfdf0257d32eb94a0151d36" + }, + "vllm/distributed/weight_transfer/factory.py": { + "path": "/vllm/distributed/weight_transfer/factory.py", + "sha256": "4e979eeac8c5bcdbffb10eb4765cfb30120fa7595c6c2561d3fa1a966ced61c8" + }, + "vllm/distributed/weight_transfer/ipc_engine.py": { + "path": "/vllm/distributed/weight_transfer/ipc_engine.py", + "sha256": "1af578293f387a19073c322b24143c3ae4716ce0c5d2bac2a4ef26fe20119330" + }, + "vllm/distributed/weight_transfer/nccl_common.py": { + "path": "/vllm/distributed/weight_transfer/nccl_common.py", + "sha256": "7b2ef7dc7481c3f478f17c49aa36c7bed54142ec5c93d36ed8426c8fdf09e500" + }, + "vllm/distributed/weight_transfer/nccl_engine.py": { + "path": "/vllm/distributed/weight_transfer/nccl_engine.py", + "sha256": "7fd020c919dc7b4723fb78e64da977b180d0fef0cd21df955a037b848dbaa008" + }, + "vllm/distributed/weight_transfer/packed_tensor.py": { + "path": "/vllm/distributed/weight_transfer/packed_tensor.py", + "sha256": "d0a27fb0be1dc029bd5a1d44fdb57a5e54aa4cd74308bedc339e86ac02c7494c" + }, + "vllm/distributed/weight_transfer/sharded_rdt_common.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_common.py", + "sha256": "be0b13801f24e7b62999b19d733c030510353603a2d5320d5dc98ee02daf22a2" + }, + "vllm/distributed/weight_transfer/sharded_rdt_engine.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_engine.py", + "sha256": "2f791970b4815511a7578ef6c957e7da97b071d26a39087a09a17475909791ee" + }, + "vllm/distributed/weight_transfer/sharded_rdt_fake.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_fake.py", + "sha256": "ee11164e17b5f2793252ce77741b8b94e0583046abf896a590131b2008d1fbb9" + }, + "vllm/distributed/weight_transfer/sharded_rdt_trainer.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_trainer.py", + "sha256": "dd413ff461d41826ccd3eb87d3df22f6cd7f24e09aac7644e3e5b40d7beec484" + }, + "vllm/distributed/weight_transfer/sparse_nccl_engine.py": { + "path": "/vllm/distributed/weight_transfer/sparse_nccl_engine.py", + "sha256": "e11b409454dda2b05ea34e8115ac19027c5e65cb2a5e9682c494f16a50e978f4" + }, + "vllm/model_executor/determinism/__init__.py": { + "path": "/vllm/model_executor/determinism/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/determinism/batch_invariant.py": { + "path": "/vllm/model_executor/determinism/batch_invariant.py", + "sha256": "af8f8d256a48fc214edf426fbe891fb15bd8b1d7ae98b811c736ff1eb0fae798" + }, + "vllm/model_executor/determinism/batch_invariant_configs.py": { + "path": "/vllm/model_executor/determinism/batch_invariant_configs.py", + "sha256": "72ea0d4df0ab5ae288abb7df5c203d2ad5f1709c7295d87ec72da775fddc1b7a" + }, + "vllm/model_executor/layers/fused_moe/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/__init__.py", + "sha256": "64a32665be6d5afcfbaf7a0915717267278b66b880b908b0263ea58f08e51b5e" + }, + "vllm/model_executor/layers/fused_moe/activation.py": { + "path": "/vllm/model_executor/layers/fused_moe/activation.py", + "sha256": "78dec0e85e0c040304515f64ccf8f2c6a7a2e5b9f1124a2138a97d9a02585541" + }, + "vllm/model_executor/layers/fused_moe/all2all_utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/all2all_utils.py", + "sha256": "dc4750a446f7de31d09a46034da5fdf479bc169af90f47aa9af8ae15e67b0828" + }, + "vllm/model_executor/layers/fused_moe/b12x.py": { + "path": "/vllm/model_executor/layers/fused_moe/b12x.py", + "sha256": "ee76cc6aa801e24be8ec78a9e8502061ad48667d5ff8711e43f68fba912425bd" + }, + "vllm/model_executor/layers/fused_moe/config.py": { + "path": "/vllm/model_executor/layers/fused_moe/config.py", + "sha256": "a3a87cebcc7ac85d73f471dcfafc2d899c6fc08f264777b74a0e919adac9e03f" + }, + "vllm/model_executor/layers/fused_moe/deep_gemm_utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/deep_gemm_utils.py", + "sha256": "8fdcd857eb333f9c68902105f157568d52067c94ba1e2df6dbfe0474ef1f4c02" + }, + "vllm/model_executor/layers/fused_moe/eep_reconfigure.py": { + "path": "/vllm/model_executor/layers/fused_moe/eep_reconfigure.py", + "sha256": "9d7580265e8563e1140c2bb4c3a81a35ddd54903f5ec0a2720ffc064681f02f9" + }, + "vllm/model_executor/layers/fused_moe/expert_map_manager.py": { + "path": "/vllm/model_executor/layers/fused_moe/expert_map_manager.py", + "sha256": "308c00f63fcb6f44518ec3a56d8f902c7bba75928c2e3aea30fbe1f3f473973b" + }, + "vllm/model_executor/layers/fused_moe/experts/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a16_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a16_moe.py", + "sha256": "53deea255175171971422d14082ad139b5ec7b62e21429a4c7cc0ebbefd29cdc" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a8_moe.py", + "sha256": "f3fc51b95ed89862381908a0134e326228827f44854248db9585a9c4899c34f4" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp8_moe.py", + "sha256": "af6db1760961a5a71234f8b1cdf42e9e30a236e13601b0826a75110b79724948" + }, + "vllm/model_executor/layers/fused_moe/experts/batched_deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/batched_deep_gemm_moe.py", + "sha256": "b0cd4ea706583518dc608fb56f832fc3595f24bd863b03ef1e8c22b36b873508" + }, + "vllm/model_executor/layers/fused_moe/experts/cpu_int4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cpu_int4_moe.py", + "sha256": "67170af3ba9dc4c4f71d78a72efc3fa4e366eac614936a79911dae5c75ac1864" + }, + "vllm/model_executor/layers/fused_moe/experts/cpu_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cpu_moe.py", + "sha256": "0754cd4ff1b28e6d3932a67609d335acefd28f95a841f0492923813356a6d81e" + }, + "vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py", + "sha256": "db901bdbcd3fdac23a1d74e39c51e67f14a82be787b2fd704ed1e787372ae868" + }, + "vllm/model_executor/layers/fused_moe/experts/deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/deep_gemm_moe.py", + "sha256": "16911a64a72eafc26a1bcb544a91f90144d85dc41e3ee57cf20e89925227bbb7" + }, + "vllm/model_executor/layers/fused_moe/experts/fallback.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fallback.py", + "sha256": "1bdd0a4f2ebaa40ec96a5aacc07aee61511af59e6324ce456aa65003b6e2991a" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_b12x_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_b12x_moe.py", + "sha256": "e613afe5da2742e42c717c1a0a56bd9e1c7e3e0452a828db0013d81063518954" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_batched_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_batched_moe.py", + "sha256": "295254dfeeec8df3eb8110e6f659a946cb9cded3de1565ecad4d741b3c3f3e00" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_moe.py", + "sha256": "08578bcd0cf72d6a470e40950175e73639efaa6d8d23c6da0869345312b229c9" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutlass_moe.py", + "sha256": "52887cec5fe628e0a4e7793deb546b40f6c29f7362b3b436c10ca36934ab9826" + }, + "vllm/model_executor/layers/fused_moe/experts/fused_batched_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fused_batched_moe.py", + "sha256": "2435587fc7f8fe8ea341ea0eb8f14c11f3f5b31fbbb9b29ce569ad3bace6e6a0" + }, + "vllm/model_executor/layers/fused_moe/experts/fused_humming_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fused_humming_moe.py", + "sha256": "a6830a76ff7f4cd3479b9c8372a30d03e8301604555cbdbcd9ac89a813b7431a" + }, + "vllm/model_executor/layers/fused_moe/experts/gpt_oss_triton_kernels_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/gpt_oss_triton_kernels_moe.py", + "sha256": "1613a7a6b256e8faee6fdcfae84f293492db6229d28ceb3e8a8d6093af480e36" + }, + "vllm/model_executor/layers/fused_moe/experts/int4_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/int4_emulation_moe.py", + "sha256": "f12857caf0671a341687ad3c5f48616b816ed51e1bcbdefa0a7edbecdb81a79d" + }, + "vllm/model_executor/layers/fused_moe/experts/lora_context.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/lora_context.py", + "sha256": "9b41eefaaa57c5dd0dc54217ef95978821b0c52e90ea4db8b0752e08452bd3e5" + }, + "vllm/model_executor/layers/fused_moe/experts/lora_experts_mixin.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/lora_experts_mixin.py", + "sha256": "b2bc55ed6be98b526c6a5698e2d98300650e78555f56b1820e58c04888e2a373" + }, + "vllm/model_executor/layers/fused_moe/experts/marlin_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/marlin_moe.py", + "sha256": "93916b721548e6194dc70cf6cec224b4b1456a0cc0980235e97beba7bf36541d" + }, + "vllm/model_executor/layers/fused_moe/experts/mxfp8_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/mxfp8_emulation_moe.py", + "sha256": "d09c62ad1398c51ff6f515f2a61014ee9e9a9798d0fe9762c47f446efc5edbef" + }, + "vllm/model_executor/layers/fused_moe/experts/mxfp8_native_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/mxfp8_native_moe.py", + "sha256": "01a42cebf18189e566034111b2145573c655319e8af1a56db60d53a319c40613" + }, + "vllm/model_executor/layers/fused_moe/experts/nvfp4_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/nvfp4_emulation_moe.py", + "sha256": "f24467762b60702f0df122ed64786be839a838a9b6cafaecbd04d35fbfedb189" + }, + "vllm/model_executor/layers/fused_moe/experts/ocp_mx_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/ocp_mx_emulation_moe.py", + "sha256": "dcaa60a9ebdb0bd8223b37af41f018ce7f95716ec7cd8526850f4433a579213b" + }, + "vllm/model_executor/layers/fused_moe/experts/rdna3_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/rdna3_moe.py", + "sha256": "e4abd802dc2f0ad9b338ebde397633c761d881c37813e2dc229902c526b597d8" + }, + "vllm/model_executor/layers/fused_moe/experts/rocm_aiter_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/rocm_aiter_moe.py", + "sha256": "bf09a7b783f5752d61cab76221b32b598d8846d801ee39dc9209d636c9659c6f" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_cutlass_moe.py", + "sha256": "ffce5ad627c540940d122d8df7981644b2eb35d07d480995c0f4f30517815fac" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_deep_gemm_moe.py", + "sha256": "c7209fa5e1ccb184a68b37a0706fc571a76696c2ae79802ddc7f889b1c29684d" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_moe.py", + "sha256": "806fbccfe30f5fbd578acf773add99bdf022b12d617958bd6281aef6de369701" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_bf16_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_bf16_moe.py", + "sha256": "76256de96fefece9c41ffb1108487919e24da364cf4412c6c3474498aba59137" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.py", + "sha256": "b54c7ceb45e5d07aa905f42ea44caccf85ca35ba9fb825d4c01947764510f68b" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_lora_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_lora_moe.py", + "sha256": "dd35a9e4242c0dc8d691168813e14bd5543e591f02ee529d0691e07651942c5a" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_mxfp4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_mxfp4_moe.py", + "sha256": "fe780f125a3dc3ba919659e9b85340bd32afcbfe47733a002bfdfb92eadf400c" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_mxint4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_mxint4_moe.py", + "sha256": "2106d67c2951aa690c4656ca58240d09c366cffe8cb4d9fd575df016c377cc30" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_nvfp4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_nvfp4_moe.py", + "sha256": "e938ac9f058f7c90b41c9610513239bec54a95304bfb5ff5f6897ebd54733d7e" + }, + "vllm/model_executor/layers/fused_moe/experts/xpu_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/xpu_moe.py", + "sha256": "2a11bac0cf9274d963315efd6eebdc62978b0b7aa02e8849ff2a562742f0b86d" + }, + "vllm/model_executor/layers/fused_moe/fused_flydsl_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_flydsl_moe.py", + "sha256": "0e74879ee5c72f616ae4064b9dff3b3a0b583b7fc70b8f92f1e8b730ecd5d39b" + }, + "vllm/model_executor/layers/fused_moe/fused_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe.py", + "sha256": "7072eb06237be9d33dcb0ef7101410f886a6363c98cbee70a014c68b70f639cb" + }, + "vllm/model_executor/layers/fused_moe/fused_moe_method_base.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe_method_base.py", + "sha256": "18dcfc469d3252749801bbf943857f58da85de1f2db8fdff5a9f4986a925dc68" + }, + "vllm/model_executor/layers/fused_moe/fused_moe_modular_method.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe_modular_method.py", + "sha256": "321c744eac1fcaffd6b1b2971204c8baa57dfec53e91e5d24140014d72d64f83" + }, + "vllm/model_executor/layers/fused_moe/hpc_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/hpc_moe.py", + "sha256": "2ca9c5d71b6fd91651027905e2b83103a8823845e053e7153e148cb8e0ee666d" + }, + "vllm/model_executor/layers/fused_moe/layer.py": { + "path": "/vllm/model_executor/layers/fused_moe/layer.py", + "sha256": "def0b4e13bcc1e4e21ee10644e647e2eda1acbf0cc01e76d6128abb59ea08224" + }, + "vllm/model_executor/layers/fused_moe/modular_kernel.py": { + "path": "/vllm/model_executor/layers/fused_moe/modular_kernel.py", + "sha256": "8dc4e0dbbf35b3aac8add63ca6f2a7bbfdadaabbd60826e24598b22c7d8e5c22" + }, + "vllm/model_executor/layers/fused_moe/moe_align_block_size.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_align_block_size.py", + "sha256": "c3f7fc2087836f0160a32ab99ceb1d8f6e87c793679da34dd672e225cb7fa31b" + }, + "vllm/model_executor/layers/fused_moe/moe_fused_mul_sum.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_fused_mul_sum.py", + "sha256": "112e72578002c3bff538418dac64b3b56d995994a2fc5e32b18d2cf3b8392a13" + }, + "vllm/model_executor/layers/fused_moe/moe_output.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_output.py", + "sha256": "6ea4cbd78f9efc7f842c5df246f553f08b991c3479b8b04b89902ed08aaf8e8f" + }, + "vllm/model_executor/layers/fused_moe/moe_permute_unpermute.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_permute_unpermute.py", + "sha256": "1adc592c6254d0c877d66be5406afbc822459c18a838f4bbd094a992e7609d06" + }, + "vllm/model_executor/layers/fused_moe/oracle/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/__init__.py", + "sha256": "4dcf941d50d48bb812de0f39e9194bf17a76b8035fe324889c6038f710fdc453" + }, + "vllm/model_executor/layers/fused_moe/oracle/base.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/base.py", + "sha256": "555bbcd18a3744e64eee4e953daabef3bd268a1bd4faf967d4cfd14d6074f685" + }, + "vllm/model_executor/layers/fused_moe/oracle/fp8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/fp8.py", + "sha256": "245bd36c285df1e6f7c51e52dcda31ad247894577a9f8d765613c2c2feae9aee" + }, + "vllm/model_executor/layers/fused_moe/oracle/int8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/int8.py", + "sha256": "c1b67886511bd966b162db5bca8930f04895fb37a969818a4a10f0726c59547f" + }, + "vllm/model_executor/layers/fused_moe/oracle/int_wna16.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/int_wna16.py", + "sha256": "cfffe8b8b290330be9d18ffa07aeecf296484395ff04df3147d99393e48b55c1" + }, + "vllm/model_executor/layers/fused_moe/oracle/mxfp4.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/mxfp4.py", + "sha256": "b7915e6779b5c88e7dcd2d227f003a8e45071d6d86877013067142d4feb64a8c" + }, + "vllm/model_executor/layers/fused_moe/oracle/mxfp8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/mxfp8.py", + "sha256": "9cfdc8102a04bb844dcd7ed88043bba96ec751794bc093da76c69aa8cf88cf48" + }, + "vllm/model_executor/layers/fused_moe/oracle/nvfp4.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/nvfp4.py", + "sha256": "735b4cdeb1258f11fb02320fc0c70cab5edaca468dd60b07b2d369389d2b0313" + }, + "vllm/model_executor/layers/fused_moe/oracle/unquantized.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/unquantized.py", + "sha256": "c8b8203bd0b73bb7f586f703607394d663f14c05711416ad42d45af564382223" + }, + "vllm/model_executor/layers/fused_moe/oracle/w4a8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/w4a8.py", + "sha256": "d7fa6e2982f20b34d5ce9c5ce28a61122762a3fcdd53d249479472a4f2316c6a" + }, + "vllm/model_executor/layers/fused_moe/oracle/w4a8_int8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/w4a8_int8.py", + "sha256": "6d6f9ca2e67b630002873de2f8d8a231d091c5c2f0f3354a9e8209449b481a4c" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/__init__.py", + "sha256": "2800113263a83c2632e522fb22790b29f63384da75d43de32f0ae2f95e8ae4c1" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/batched.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/batched.py", + "sha256": "d52425dd8c08e47cf8d9c3088daf3b1cc721c8667de4c738d04ba997f9a08ccb" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ht.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ht.py", + "sha256": "465cdf1d6cee91b2ee8c2e43abbea6e8408976e3048c10f44c089f34b415bc60" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ll.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ll.py", + "sha256": "f704922b1db680c4c212982a096e09d6b3eb97d89110313f86ed958a00df21b7" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_v2.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_v2.py", + "sha256": "8d690b016bbcfbc9eb599bcc36a6f798b2f1720c828f4347ea742e218c0cc60d" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_one_sided.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_one_sided.py", + "sha256": "acb57d8342af62bb5672036871cd4b27ecc7f37dfa7c894850bb860e6152a1f0" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_two_sided.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_two_sided.py", + "sha256": "cc5b00d6a157b6eca5afaaf7435165dbd1b4524d6d88bf75808cbe074a389f79" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/mori.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/mori.py", + "sha256": "8e9c3b5b1f0de13f467d95bf2f451cba0e4b0d9a1bdcf98da0988a3a9a79a045" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/naive_dp_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/naive_dp_ep.py", + "sha256": "db015e5b18750bbbf5b2bbaceca877dd6f3f3e74c2a94e8dc185f7413b387f91" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/nixl_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/nixl_ep.py", + "sha256": "1f71d70ac509bf5d3d67a8d95a8ee108a50af6bb5d4bde7181ca28e286f6ffce" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/no_dp_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/no_dp_ep.py", + "sha256": "adbbf529cd22059c95b5380952943a70cf11e05e321dcd707f296bebde61a6e7" + }, + "vllm/model_executor/layers/fused_moe/routed_experts.py": { + "path": "/vllm/model_executor/layers/fused_moe/routed_experts.py", + "sha256": "68c48e5df0ea4a7cc1f04436b7b9153eb53802ecd9bb55d38db8738508daac6d" + }, + "vllm/model_executor/layers/fused_moe/routed_experts_capturer.py": { + "path": "/vllm/model_executor/layers/fused_moe/routed_experts_capturer.py", + "sha256": "cd006bc1a1703418cca3b589fafb2abc4268a086fb3db044bbb64348aeac8b13" + }, + "vllm/model_executor/layers/fused_moe/router/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/layers/fused_moe/router/aiter_shared_routed_fused_moe_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/aiter_shared_routed_fused_moe_router.py", + "sha256": "f47046db1275601a2c67c9232afc7b866c9623a19639d5be867e4c7914a35069" + }, + "vllm/model_executor/layers/fused_moe/router/base_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/base_router.py", + "sha256": "47fa2324bcd9b6ebdc138d69ae6b6ecc0f2463d34bda8c5988bdb0a2a76d3fae" + }, + "vllm/model_executor/layers/fused_moe/router/bf16x3_router_gemm_cutedsl.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/bf16x3_router_gemm_cutedsl.py", + "sha256": "d0f1edd1ebc48d88e490bdb3c93db49bdc0a135ff83e7e0b57130e9f8255fc32" + }, + "vllm/model_executor/layers/fused_moe/router/cpu_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/cpu_router.py", + "sha256": "bff36b15818c87bfbb7ee3def7dc7f6396860abbe5893ff6148801fe941a4b92" + }, + "vllm/model_executor/layers/fused_moe/router/custom_routing_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/custom_routing_router.py", + "sha256": "1a40c7054e3c3a1b3ee2e98f6bc9efa9dfdc11f316a8edf7357dd91533487bfe" + }, + "vllm/model_executor/layers/fused_moe/router/dsv4_topk.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/dsv4_topk.py", + "sha256": "14f7c8487b9aef652dd61c91e0e3c3640b643bf9cd0d8a7184157d71f4beb63e" + }, + "vllm/model_executor/layers/fused_moe/router/fused_moe_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_moe_router.py", + "sha256": "0daa0dc05b931d66767feca444a4cd57ecf140f59b40ea0e8ad213eef6da2b36" + }, + "vllm/model_executor/layers/fused_moe/router/fused_topk_bias_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_topk_bias_router.py", + "sha256": "8fdc28cc248180ad4f11bb4bcda3df47926ec12665a0d84bb712fe83fc6b9376" + }, + "vllm/model_executor/layers/fused_moe/router/fused_topk_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_topk_router.py", + "sha256": "1c80f4af4d781fd66b12aa6a7a0fd30082bc521df40f1252987a8ac4c0bef51c" + }, + "vllm/model_executor/layers/fused_moe/router/gate_linear.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/gate_linear.py", + "sha256": "faa43362c2e7c568498a923c682ca18cae75e87f48d00882770821cb19c21198" + }, + "vllm/model_executor/layers/fused_moe/router/grouped_topk_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/grouped_topk_router.py", + "sha256": "048339e1799cdd42c9dae686a6cb891046577fb391b500f0d12eed73c8f61e52" + }, + "vllm/model_executor/layers/fused_moe/router/rocm_fp32_router_gemm.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/rocm_fp32_router_gemm.py", + "sha256": "9c331ef3d0bb2fb6954387d77ac62a99c5c76d2753c7438bfbb5115f68aae5ac" + }, + "vllm/model_executor/layers/fused_moe/router/router_factory.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/router_factory.py", + "sha256": "019bc8adaa7642abab82843efd53cd1a378f62c652521a1de2b781480eb88742" + }, + "vllm/model_executor/layers/fused_moe/router/routing_simulator_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/routing_simulator_router.py", + "sha256": "a7345df5add00cf3bd93024492d6fc1189fd3ecf2754a11cef1b03a295d791f7" + }, + "vllm/model_executor/layers/fused_moe/router/zero_expert_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/zero_expert_router.py", + "sha256": "dea306edd92e2b9c1b43f982ede8e1e10770d2c66220f5a106e0ed0165276e9c" + }, + "vllm/model_executor/layers/fused_moe/runner/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/layers/fused_moe/runner/moe_runner.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/moe_runner.py", + "sha256": "05893188402fe37229bf72d75088d66193c417d5d502daafd3a55e1bfedaa60c" + }, + "vllm/model_executor/layers/fused_moe/runner/moe_runner_interface.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/moe_runner_interface.py", + "sha256": "189cad01611124eb44594713cbf5918d16fc70196dc81a525ae0a7a97a5fcc51" + }, + "vllm/model_executor/layers/fused_moe/runner/shared_experts.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/shared_experts.py", + "sha256": "d89e4c79c46f6fe61262c51f3facf102e71ce1e4eb3db67f72b6bd8470937be9" + }, + "vllm/model_executor/layers/fused_moe/topk_weight_and_reduce.py": { + "path": "/vllm/model_executor/layers/fused_moe/topk_weight_and_reduce.py", + "sha256": "3dfede72d52bf99af40997994704e6c502ee3bab2bd39bfaa8a68d7dae440203" + }, + "vllm/model_executor/layers/fused_moe/unquantized_fused_moe_method.py": { + "path": "/vllm/model_executor/layers/fused_moe/unquantized_fused_moe_method.py", + "sha256": "182a5ec1874ece2091a24c5303f6ab9ea64a9a61adf325b863927f0cdd83e5d3" + }, + "vllm/model_executor/layers/fused_moe/utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/utils.py", + "sha256": "a93a0bded4008db19d8b38370526ae34fafb9c8278e5b4f60acb6acc8fdc1850" + }, + "vllm/model_executor/layers/mamba/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/abstract.py": { + "path": "/vllm/model_executor/layers/mamba/abstract.py", + "sha256": "dfdc8c836894f574e41d93d76ab989cacd3d7ecf59c97a929abfa48d9364e8ad" + }, + "vllm/model_executor/layers/mamba/gdn/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/gdn/base.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/base.py", + "sha256": "7fec748fc74131f5a45bcaf2644b3fa3a0598fd437d7347f8207ea3644a951c5" + }, + "vllm/model_executor/layers/mamba/gdn/kimi_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/kimi_gdn_linear_attn.py", + "sha256": "1cec4da5c9da73557e192bfb36cd540aae51d3e91283b554449c4a97f0f89bd9" + }, + "vllm/model_executor/layers/mamba/gdn/olmo_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/olmo_gdn_linear_attn.py", + "sha256": "60873ca3bb0c4d17c33bd259b62b658db4883cd23138f47dd4ead62cd2ff0605" + }, + "vllm/model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py", + "sha256": "b80f8e6f3fff442fb880aebb3209c52f814f66490009f4ac4003de603576d10a" + }, + "vllm/model_executor/layers/mamba/linear/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/linear/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/linear/bailing_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/linear/bailing_linear_attn.py", + "sha256": "3c480ddd6eba0766ed012a1074bbec5f241d868a87b020b0f6312222c32f93eb" + }, + "vllm/model_executor/layers/mamba/linear/base.py": { + "path": "/vllm/model_executor/layers/mamba/linear/base.py", + "sha256": "26125cd427225954e1846ca361cdaf43f2b56f11b1e217cf26e91a80ef0edb6a" + }, + "vllm/model_executor/layers/mamba/linear/minimax_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/linear/minimax_linear_attn.py", + "sha256": "4adc00f54893b5bc6c31c613deda152a19af3b1bba04153ab5924c3bf2a3aaae" + }, + "vllm/model_executor/layers/mamba/mamba_mixer.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_mixer.py", + "sha256": "a485e937ad9db14d3ad03fde5a9fe795cfa863649563e52fc7e6c52ef631164e" + }, + "vllm/model_executor/layers/mamba/mamba_mixer2.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_mixer2.py", + "sha256": "d58d93e90d9eb90bc5133b79f07c7c62d0032b35d6cf916e3fe34367b81c5cd5" + }, + "vllm/model_executor/layers/mamba/mamba_utils.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_utils.py", + "sha256": "ce9845b4a4ef4bc46577a33038ed69d59ceccb52f30e9c5bdaa36e48be3b2ca4" + }, + "vllm/model_executor/layers/mamba/ops/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/ops/causal_conv1d.py": { + "path": "/vllm/model_executor/layers/mamba/ops/causal_conv1d.py", + "sha256": "044d005cfe59fd0818ed421274e04f3e8dd679b8cdb64fca9f4422f2643484b2" + }, + "vllm/model_executor/layers/mamba/ops/cpu/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/ops/cpu/causal_conv1d.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/causal_conv1d.py", + "sha256": "64104672890ac2ef240c20c7f8059beeade707178574809dbca8721dff5ea6fa" + }, + "vllm/model_executor/layers/mamba/ops/cpu/gdn_attention.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/gdn_attention.py", + "sha256": "a50288945bf5b102ad3025ae536638dcc32d84cf7c22aaf3a85326b0c1c56c1f" + }, + "vllm/model_executor/layers/mamba/ops/cpu/mamba_ssm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/mamba_ssm.py", + "sha256": "5839e576172a3246337f5e4fb1bc19eb583b3e2b2f7e35dd060dc3041eb8372d" + }, + "vllm/model_executor/layers/mamba/ops/gather_initial_states.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gather_initial_states.py", + "sha256": "5198bb6de6d91c583a5f65d926412a76ee04a06fa72aaba76eaf156b27cd0523" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/__init__.py", + "sha256": "b88b52e71fcb21bd3fa215ea171dcd2ad2ff17c97788cfe64caa7ba45c7ecf97" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_h.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_h.py", + "sha256": "f50bbe5c0b6382323ec5dfc24a5e0c7971113d59727515e60c9fe3689734e5ba" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_kkt_inv_uw.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_kkt_inv_uw.py", + "sha256": "b4a65dd194907db08865e0596fe254f915e670a9e6b27ffa2933c1026dde9b1e" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_o.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_o.py", + "sha256": "629f7843a7e611efb9390f2ebb7a4b924b2c328d48a317fddfaa96af4d9bc60a" + }, + "vllm/model_executor/layers/mamba/ops/layernorm_gated.py": { + "path": "/vllm/model_executor/layers/mamba/ops/layernorm_gated.py", + "sha256": "3433f2e3b87c2b2ccf8e9794ce40762c86a6da38a94ecee001f439ea0d0373dd" + }, + "vllm/model_executor/layers/mamba/ops/mamba_ssm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/mamba_ssm.py", + "sha256": "a4515ec7895b40ed878cf380445034b25faa61fbaa799d96c49217bbdfd7e400" + }, + "vllm/model_executor/layers/mamba/ops/replayssm_config.py": { + "path": "/vllm/model_executor/layers/mamba/ops/replayssm_config.py", + "sha256": "5fe9d5d7aa2de6a65875b3796a919b22bc435fd76055ba054bbff43aa005bc44" + }, + "vllm/model_executor/layers/mamba/ops/scatter_states.py": { + "path": "/vllm/model_executor/layers/mamba/ops/scatter_states.py", + "sha256": "f3bb004c73edaba56337747893eb07faf29b270dc8bb9c893ee9b1044e4ead9a" + }, + "vllm/model_executor/layers/mamba/ops/selective_state_update_replayssm_output_only.py": { + "path": "/vllm/model_executor/layers/mamba/ops/selective_state_update_replayssm_output_only.py", + "sha256": "cea7fd3063ca9dcc4e33f180d01ea379195ec515cedc9d0b03b11dc67670d695" + }, + "vllm/model_executor/layers/mamba/ops/ssd_bmm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_bmm.py", + "sha256": "26983d97a7f5c5f9197a16a6bee7b1294839b9ae31a14c14aaee38b43523e630" + }, + "vllm/model_executor/layers/mamba/ops/ssd_chunk_scan.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_chunk_scan.py", + "sha256": "d5ef32e8cb47e2ce71984579df78ab69754895f891766394daf327867cfa4f8f" + }, + "vllm/model_executor/layers/mamba/ops/ssd_chunk_state.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_chunk_state.py", + "sha256": "177e3aa7fe72647133bbd86135533e8688a5802678d4d1564aa549410362316f" + }, + "vllm/model_executor/layers/mamba/ops/ssd_combined.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_combined.py", + "sha256": "1317bbb668d3c60dfe0658850f9968614f03fa5eb61196f8ce6ac17dbb31b480" + }, + "vllm/model_executor/layers/mamba/ops/ssd_state_passing.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_state_passing.py", + "sha256": "36b8c8edba437916a5b789717c61fc22077de01e77892cb96dbff3b00a57410e" + }, + "vllm/model_executor/layers/mamba/ops/ssu_dispatch.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssu_dispatch.py", + "sha256": "bbe0f0e61da87f3ddfead19a79ca376516b63f1ea868be3485333c63fa20ef41" + }, + "vllm/model_executor/layers/mamba/ops/triton_helpers.py": { + "path": "/vllm/model_executor/layers/mamba/ops/triton_helpers.py", + "sha256": "a8795532f22c37a93e82c9d8e3fadcb5f4da98673d7b321fe8481305eaafad30" + }, + "vllm/model_executor/layers/mamba/short_conv.py": { + "path": "/vllm/model_executor/layers/mamba/short_conv.py", + "sha256": "228494efab185ee17374f762874f4c8b9a26aac9decfa8c906ce38446e0de51a" + }, + "vllm/model_executor/models/qwen3_next.py": { + "path": "/vllm/model_executor/models/qwen3_next.py", + "sha256": "4fa5112ac2bf7886d41d9e1f6c3da8793620d1ec49c961b31e9609459a6a7f7a" + }, + "vllm/third_party/flash_linear_attention/__init__.py": { + "path": "/vllm/third_party/flash_linear_attention/__init__.py", + "sha256": "5dbbfa3fc286edb2e970e175ef33cee4f6181c89b0784f5a8986201b2312f54e" + }, + "vllm/third_party/flash_linear_attention/ops/__init__.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/__init__.py", + "sha256": "dd738dc1d08045e76455cdbe16052a5b769e0eb11d6e87ff28353994f880cd6c" + }, + "vllm/third_party/flash_linear_attention/ops/chunk.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk.py", + "sha256": "c105ead259e86aedc248c53e7c4cef07034d0ff12da608d80265d1dd0990803f" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_delta_h.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_delta_h.py", + "sha256": "1b3ad391f939d9443c6b7adb19e57fe381bd5dccea064e8417a4f85b0e713b26" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_o.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_o.py", + "sha256": "3b63b836a8cc561723c23db5a528a0b474d9cd78508d610f0b348c585a889a19" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_scaled_dot_kkt.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_scaled_dot_kkt.py", + "sha256": "7ae41df3755acc7e925a134d848f78bb5fc00b90069039d86403c5853323ea42" + }, + "vllm/third_party/flash_linear_attention/ops/cumsum.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/cumsum.py", + "sha256": "d818215669b451868823202ac0bcea77e7a9d75957254c7c1060a73a55dc39b6" + }, + "vllm/third_party/flash_linear_attention/ops/fused_gdn_prefill_post_conv.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_gdn_prefill_post_conv.py", + "sha256": "590717b2107abc90d72548de06b5d315229eb2775c94614f3f545df11cc2b5df" + }, + "vllm/third_party/flash_linear_attention/ops/fused_norm_gate.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_norm_gate.py", + "sha256": "e6eb90467f29d8a0a04f2a364d20a2c3191b6ab857841bfb82076b33a6022d1a" + }, + "vllm/third_party/flash_linear_attention/ops/fused_recurrent.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_recurrent.py", + "sha256": "fe6f1311014809040497aa0a623e7fa97f4b3457cdc7ee1f1f8aed21f326f755" + }, + "vllm/third_party/flash_linear_attention/ops/fused_sigmoid_gating.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_sigmoid_gating.py", + "sha256": "000ab8996af9788fdb8843a6a3b91833e7a14c8acc0e1ea073a536330f64cb6f" + }, + "vllm/third_party/flash_linear_attention/ops/index.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/index.py", + "sha256": "a4f8b2c052635cb519a80099e8a85411d1d5d6880b38f466788259bbe66b154d" + }, + "vllm/third_party/flash_linear_attention/ops/kda.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/kda.py", + "sha256": "e1f31aaa89b91f8e5db6d070b229e2c81c7206e8caec67de41db97d06be0c476" + }, + "vllm/third_party/flash_linear_attention/ops/l2norm.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/l2norm.py", + "sha256": "520f4513ef4fc97e6b88dc07877cca8e29da0d34e44673fe989e3af002d86381" + }, + "vllm/third_party/flash_linear_attention/ops/layernorm_guard.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/layernorm_guard.py", + "sha256": "42af29be26e8fc94a4658e053c095fcdab9ffdc1bc2446a01e787deda2a298c0" + }, + "vllm/third_party/flash_linear_attention/ops/op.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/op.py", + "sha256": "456da84fd12411cf53c96a90dd4f78f49afb454c3d51d2c524ea8e7106fe8ae5" + }, + "vllm/third_party/flash_linear_attention/ops/solve_tril.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/solve_tril.py", + "sha256": "d1a4ff27623a938825052500afa7e2aa24fadd2fa4c9be6376c9128824f86f82" + }, + "vllm/third_party/flash_linear_attention/ops/utils.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/utils.py", + "sha256": "d6c90d36505e02086954c23ca4dd2fea82a69416d68ff1d0501e16b3148b5b0c" + }, + "vllm/third_party/flash_linear_attention/ops/wy_fast.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/wy_fast.py", + "sha256": "c9fc8259db0a8746dc04f1d799cb73333457118cf89a0bdce8dde8a80a28cd96" + }, + "vllm/v1/attention/__init__.py": { + "path": "/vllm/v1/attention/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backend.py": { + "path": "/vllm/v1/attention/backend.py", + "sha256": "01ac364372afa75fdb22486aa3a9c7cf9aebb742e3471dfb9e0f9d9d36b734bc" + }, + "vllm/v1/attention/backends/__init__.py": { + "path": "/vllm/v1/attention/backends/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backends/b12x.py": { + "path": "/vllm/v1/attention/backends/b12x.py", + "sha256": "443f0a98738fdfefe5b9ab151d278bfd43a8ac807eb2b0b9b2a13d51922afbf9" + }, + "vllm/v1/attention/backends/composite.py": { + "path": "/vllm/v1/attention/backends/composite.py", + "sha256": "4cf3d66dca891562709eed4f50aa14b0ae6c8240d9ea86504a3304b2f356cce0" + }, + "vllm/v1/attention/backends/cpu_attn.py": { + "path": "/vllm/v1/attention/backends/cpu_attn.py", + "sha256": "76fb02a6bd725125565d84bf04f627cf16da5f7ff8f31f87c01ed6a1439398c7" + }, + "vllm/v1/attention/backends/fa_utils.py": { + "path": "/vllm/v1/attention/backends/fa_utils.py", + "sha256": "08fa6e231d3af3a71a6e59162dd12328aa8beb28548165ae58f130a92adb5a83" + }, + "vllm/v1/attention/backends/flash_attn.py": { + "path": "/vllm/v1/attention/backends/flash_attn.py", + "sha256": "b170a4789e18104c1bee35bea70df51abe6766693d8f4726a59f2e6f5c4282aa" + }, + "vllm/v1/attention/backends/flash_attn_diffkv.py": { + "path": "/vllm/v1/attention/backends/flash_attn_diffkv.py", + "sha256": "e4627c88c3ba8caee260540e994cc8137fd2ff7cd7813356b36387c6c88ce30a" + }, + "vllm/v1/attention/backends/flashinfer.py": { + "path": "/vllm/v1/attention/backends/flashinfer.py", + "sha256": "8ee541fde43ed92a417b3f01ea1e6fc64af8ab2eb54cbfc28308a49aaca4ed7f" + }, + "vllm/v1/attention/backends/flex_attention.py": { + "path": "/vllm/v1/attention/backends/flex_attention.py", + "sha256": "ad07f0ad73aeeadc3534b3a05c14f88a62cb3638874239ae9823c49b36276dc3" + }, + "vllm/v1/attention/backends/gdn_attn.py": { + "path": "/vllm/v1/attention/backends/gdn_attn.py", + "sha256": "3831019404a92200a38b43571c040cffeb6638bbdc71e4cb5e680dbc6c93d054" + }, + "vllm/v1/attention/backends/hpc_attn.py": { + "path": "/vllm/v1/attention/backends/hpc_attn.py", + "sha256": "af9e2aec1b498f0ee48a2dce3cf5646edf1976466980b2fd927c0e82b875427c" + }, + "vllm/v1/attention/backends/linear_attn.py": { + "path": "/vllm/v1/attention/backends/linear_attn.py", + "sha256": "bc42144fcd027434c6a10dc9f4c5f991db8899d387af5f6485402ce097eb0513" + }, + "vllm/v1/attention/backends/mamba1_attn.py": { + "path": "/vllm/v1/attention/backends/mamba1_attn.py", + "sha256": "32159dae11cab3c8c576b9514ad97d5108c8d1b4cac9fcfe345ec6a76223aee7" + }, + "vllm/v1/attention/backends/mamba2_attn.py": { + "path": "/vllm/v1/attention/backends/mamba2_attn.py", + "sha256": "a5bcdecb7b9547137023e1c77a386003358fa940eaf5f319ed142211dcdba139" + }, + "vllm/v1/attention/backends/mamba_attn.py": { + "path": "/vllm/v1/attention/backends/mamba_attn.py", + "sha256": "5e7b2c4058fc5e6096d001bff6c789b78368b025bbe4600f191aaca2ff59b59f" + }, + "vllm/v1/attention/backends/mla/__init__.py": { + "path": "/vllm/v1/attention/backends/mla/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backends/mla/aiter_triton_mla.py": { + "path": "/vllm/v1/attention/backends/mla/aiter_triton_mla.py", + "sha256": "ed0e285cdae06a019150c41cc958b3c0b5ceb0e4f299d5318d1c90e2c2395390" + }, + "vllm/v1/attention/backends/mla/amx_mla.py": { + "path": "/vllm/v1/attention/backends/mla/amx_mla.py", + "sha256": "7f5cddec30b2dfe22ccdbd3b9da673c879719bf6da4074317bd60add55f5d15f" + }, + "vllm/v1/attention/backends/mla/compressor_utils.py": { + "path": "/vllm/v1/attention/backends/mla/compressor_utils.py", + "sha256": "3589e94105368ea285c40b82db1a0332682ff5d071fe363627cf4c0d10f3facf" + }, + "vllm/v1/attention/backends/mla/cpu_mla.py": { + "path": "/vllm/v1/attention/backends/mla/cpu_mla.py", + "sha256": "ff2110b9f78e92adf6bab294465cbc294ae1ff71cb1780fed158179e134a4ca6" + }, + "vllm/v1/attention/backends/mla/cutlass_mla.py": { + "path": "/vllm/v1/attention/backends/mla/cutlass_mla.py", + "sha256": "211d298680f9bd793cc468281b316d6633c5f4eb6dcec71d3329b034a23ab9b5" + }, + "vllm/v1/attention/backends/mla/flashattn_mla.py": { + "path": "/vllm/v1/attention/backends/mla/flashattn_mla.py", + "sha256": "ac89e0ad75a37e92566d264bafe324735a80f9ab4709241a4454d17b3d38bb63" + }, + "vllm/v1/attention/backends/mla/flashattn_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashattn_mla_sparse.py", + "sha256": "67dd3ead2e8b9d8cda0825ecc93779cb7d670628bc741c759a7d3cd5d474030f" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla.py", + "sha256": "0c24ff016fb6b0bb41d9e7484b6f1af42f37bcc384ed613473fc3e01ad25f664" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse.py", + "sha256": "2116d965b2067134d8afa5878d4d16c0149b061258f50c4106d993aa13b073cc" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm120.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm120.py", + "sha256": "102ca08793d567f95598eefeb34c3f6ec50b3b9d704f162d1402b97b12b5777b" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm90.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm90.py", + "sha256": "df9fe4970aa3f53cf24784b8534b89e0101a2ca20a35a2ebbc9a12a4463d5993" + }, + "vllm/v1/attention/backends/mla/flashmla.py": { + "path": "/vllm/v1/attention/backends/mla/flashmla.py", + "sha256": "c9d8046a853ecbdeff9ebfc738f5bb34c4f272b278231a09a0fbf73708c7c188" + }, + "vllm/v1/attention/backends/mla/flashmla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashmla_sparse.py", + "sha256": "7a379c717adb9667ce94cbc16c0e3a1fb22a169713db6d7941c141fa84077b3f" + }, + "vllm/v1/attention/backends/mla/index_group.py": { + "path": "/vllm/v1/attention/backends/mla/index_group.py", + "sha256": "c24e028c3c160a9bb92e043da5b5b34c805e84745b7c4b8da6fb8702a0ddd641" + }, + "vllm/v1/attention/backends/mla/indexer.py": { + "path": "/vllm/v1/attention/backends/mla/indexer.py", + "sha256": "2acbc1c4fa57c3424ad95e6ecbe76eb7141747773c3e867ce704f4adccba892a" + }, + "vllm/v1/attention/backends/mla/prefill/__init__.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/__init__.py", + "sha256": "903630eb705dd175bf4ae4558a4bcaa07c110056b6a11eb830fdd2fb21b3c48a" + }, + "vllm/v1/attention/backends/mla/prefill/aiter_flash_attn.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/aiter_flash_attn.py", + "sha256": "571b8a9910c4ea3fefda60659026f3bf0d7b542c34553c8c9a4d43bb82077e61" + }, + "vllm/v1/attention/backends/mla/prefill/base.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/base.py", + "sha256": "138bf3ddaf5a94c3cdbc4e08ac676edcae84b32fc76625e546f3b47f7d8b82ec" + }, + "vllm/v1/attention/backends/mla/prefill/cpu_sdpa.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/cpu_sdpa.py", + "sha256": "1bb686395274a8ec0d9fd7327410a527655fe060cbbc263eab138fea988d96de" + }, + "vllm/v1/attention/backends/mla/prefill/flash_attn.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/flash_attn.py", + "sha256": "5e648c82c82e5f81fe11458eb82b9f90b50fc06df2ade3bf111ee6b7a2ee8481" + }, + "vllm/v1/attention/backends/mla/prefill/flashinfer.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/flashinfer.py", + "sha256": "63861219c35b8abc0ebe01e1f51543c5ed40bd46119ca261d927da7c6826b49b" + }, + "vllm/v1/attention/backends/mla/prefill/registry.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/registry.py", + "sha256": "c8c30b92213d594beaa3cab4d5003da26a85870dbb11d1ab73191962d0645b53" + }, + "vllm/v1/attention/backends/mla/prefill/selector.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/selector.py", + "sha256": "101d9fca7924b0c5d7891a17fe8942611bd6759e32b03a571dc87b14c1430f2f" + }, + "vllm/v1/attention/backends/mla/prefill/tokenspeed_mla.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/tokenspeed_mla.py", + "sha256": "047cf07bfcc83db3b11a6a54ffe189f6146e6ec9ad33ce2fa7d18860bf4210f0" + }, + "vllm/v1/attention/backends/mla/prefill/trtllm_ragged.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/trtllm_ragged.py", + "sha256": "9e13ea6f6a25accedd918c0de64bbb812ccb20ffb95350ab018a6e76d493789b" + }, + "vllm/v1/attention/backends/mla/rocm_aiter_mla.py": { + "path": "/vllm/v1/attention/backends/mla/rocm_aiter_mla.py", + "sha256": "b489f5830c655bfb6299801a70d69b9821513c69568ecab3689db5a7be867be5" + }, + "vllm/v1/attention/backends/mla/rocm_aiter_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/rocm_aiter_mla_sparse.py", + "sha256": "91b1d9b3d860a9720bc01b8ebe9bbe8649a7d6bca20d4b63939bc100309bca19" + }, + "vllm/v1/attention/backends/mla/sparse_swa.py": { + "path": "/vllm/v1/attention/backends/mla/sparse_swa.py", + "sha256": "a47853ad8a3fe40f24704592581ea323a18041b84610df010a5534da634e311e" + }, + "vllm/v1/attention/backends/mla/sparse_utils.py": { + "path": "/vllm/v1/attention/backends/mla/sparse_utils.py", + "sha256": "c3cdf060288c05542243a9fe8b5ad3a963ad75e9ce399009b5e45c1235a88ce4" + }, + "vllm/v1/attention/backends/mla/tokenspeed_mla.py": { + "path": "/vllm/v1/attention/backends/mla/tokenspeed_mla.py", + "sha256": "b9ba523c606430cecb99a88b28c53d98a99dcf5e76105a80664338110a20f1ad" + }, + "vllm/v1/attention/backends/mla/triton_mla.py": { + "path": "/vllm/v1/attention/backends/mla/triton_mla.py", + "sha256": "21b16b3b34470edcc33d0423e560837c1d37d4bab31c7b3b9cfd7faa47864b51" + }, + "vllm/v1/attention/backends/mla/xpu_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/xpu_mla_sparse.py", + "sha256": "559c6240fe466521a6b2df4c94aea02ddf3f5efa5ba6954fa180c5a51c0f12d2" + }, + "vllm/v1/attention/backends/recoverssm_metadata.py": { + "path": "/vllm/v1/attention/backends/recoverssm_metadata.py", + "sha256": "02896a667db0f0308371ceb50048b18e5866c0235d163c0357e9a05dcedb3394" + }, + "vllm/v1/attention/backends/registry.py": { + "path": "/vllm/v1/attention/backends/registry.py", + "sha256": "378e8ee78734bd8c8adbe287d4c0a4058dcbb553195a09fbcce00a3cc30adc29" + }, + "vllm/v1/attention/backends/rocm_aiter_fa.py": { + "path": "/vllm/v1/attention/backends/rocm_aiter_fa.py", + "sha256": "d1418af03bf58209c850f466b712d3ea22a14ebb758c42dd43e65738281841fd" + }, + "vllm/v1/attention/backends/rocm_aiter_unified_attn.py": { + "path": "/vllm/v1/attention/backends/rocm_aiter_unified_attn.py", + "sha256": "59d2645eb4c91dc0567754a7163d066f4f2faf48f1957b254fcdd5604e9d8c8c" + }, + "vllm/v1/attention/backends/rocm_attn.py": { + "path": "/vllm/v1/attention/backends/rocm_attn.py", + "sha256": "4a8f57067073fbceb784af6c3467487c450d00fa3957928fadb99a79f6036292" + }, + "vllm/v1/attention/backends/short_conv_attn.py": { + "path": "/vllm/v1/attention/backends/short_conv_attn.py", + "sha256": "84fc460ef2fbd09743b069bec0c14b39542af6c2254a403e37a048427e151121" + }, + "vllm/v1/attention/backends/triton_attn.py": { + "path": "/vllm/v1/attention/backends/triton_attn.py", + "sha256": "1057663d110e1d5229495a799027b27277c1eca325d5b6780fa2259afbf58a1a" + }, + "vllm/v1/attention/backends/triton_attn_diffkv.py": { + "path": "/vllm/v1/attention/backends/triton_attn_diffkv.py", + "sha256": "de0357eae005246642140f1ab8842ba5ed8bff5c84b18a6d3a7bbf409c578301" + }, + "vllm/v1/attention/backends/triton_flash_attn.py": { + "path": "/vllm/v1/attention/backends/triton_flash_attn.py", + "sha256": "176e45329aeb28a2008362bb607d1b8c89816eb665859ab908b0385a11acf1c2" + }, + "vllm/v1/attention/backends/triton_flashinfer.py": { + "path": "/vllm/v1/attention/backends/triton_flashinfer.py", + "sha256": "48d5f967e388d4e8d6bbec8d827b44d855346bc2fada28adf65768bf6623527b" + }, + "vllm/v1/attention/backends/turboquant_attn.py": { + "path": "/vllm/v1/attention/backends/turboquant_attn.py", + "sha256": "616d16d608d9d1fbf6c29548037e7e9cf330f4d36a01aa3ffabf42a731eb6e2b" + }, + "vllm/v1/attention/backends/utils.py": { + "path": "/vllm/v1/attention/backends/utils.py", + "sha256": "fbc221360d2d54cb21ef3f625dc8711500de345a355801548b4337bb9b8abee0" + }, + "vllm/v1/attention/ops/__init__.py": { + "path": "/vllm/v1/attention/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/ops/chunked_prefill_paged_decode.py": { + "path": "/vllm/v1/attention/ops/chunked_prefill_paged_decode.py", + "sha256": "973db848a790b2e8d99e728b2fc4f44b501bbe58c62747244ddff04cfcf11a85" + }, + "vllm/v1/attention/ops/common.py": { + "path": "/vllm/v1/attention/ops/common.py", + "sha256": "b4b67e7fc0cce471e337d742c097fba06da7563816e8799e27719714e31e1d5b" + }, + "vllm/v1/attention/ops/cp_common.py": { + "path": "/vllm/v1/attention/ops/cp_common.py", + "sha256": "2369181862e96db64b14ef20c5c2e249ed2ea5f3dea2467a2aa388372bb86d9d" + }, + "vllm/v1/attention/ops/dcp.py": { + "path": "/vllm/v1/attention/ops/dcp.py", + "sha256": "a478bdc781460f0582cfaf74d6431f1a826c201f02f39d882d12a96139bc3f28" + }, + "vllm/v1/attention/ops/flashmla.py": { + "path": "/vllm/v1/attention/ops/flashmla.py", + "sha256": "8a40d6e120e3ab25a95fcfeb32b0b5b4c1ea02b984633866628536dcd26ed2e8" + }, + "vllm/v1/attention/ops/flydsl_kernels/__init__.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/attention/ops/flydsl_kernels/tq_decode.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/tq_decode.py", + "sha256": "cc4b7f82897596e0974b3d3a710a1a8bc58c3d22b72cc7f461dd1c4acd2e451b" + }, + "vllm/v1/attention/ops/flydsl_kernels/tq_decode_gqa6.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/tq_decode_gqa6.py", + "sha256": "a983f6d375c325900955e11696dab1e2665770e83f84d51f93d3ed5e1d8880e0" + }, + "vllm/v1/attention/ops/flydsl_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/flydsl_turboquant_decode.py", + "sha256": "7b1dd0ef7c7fb28a6a8831759e00b939ab844d067657155cc11cf75532a22c63" + }, + "vllm/v1/attention/ops/int4_per_token_head.py": { + "path": "/vllm/v1/attention/ops/int4_per_token_head.py", + "sha256": "d91968f280cd8eaed7570ab255f0276b40e833e18a25066d371d9ca8149425f2" + }, + "vllm/v1/attention/ops/merge_attn_states.py": { + "path": "/vllm/v1/attention/ops/merge_attn_states.py", + "sha256": "ad08403d2843fc892f0b0b4b9f5fabb81884556f89f7170dca46ccef498a3539" + }, + "vllm/v1/attention/ops/metadata.py": { + "path": "/vllm/v1/attention/ops/metadata.py", + "sha256": "ca882b84c5aaefb1f77e4d8ea09a00103fbc53defa8671bba036c961c17fc760" + }, + "vllm/v1/attention/ops/paged_attn.py": { + "path": "/vllm/v1/attention/ops/paged_attn.py", + "sha256": "016a95f892ec751c86b37be1e12171bad9f0b4076bbf2219ff336f4e9c503653" + }, + "vllm/v1/attention/ops/pcp.py": { + "path": "/vllm/v1/attention/ops/pcp.py", + "sha256": "dadeff95fe2df2be8028baabeef01b0d2d628cd67de2176915e737ce096de3dd" + }, + "vllm/v1/attention/ops/prefix_prefill.py": { + "path": "/vllm/v1/attention/ops/prefix_prefill.py", + "sha256": "b08ad92db715fc03c11699de3de463d55e411f42f77548e06b41049a61de692f" + }, + "vllm/v1/attention/ops/rocm_aiter_mla_merge.py": { + "path": "/vllm/v1/attention/ops/rocm_aiter_mla_merge.py", + "sha256": "564c66e4877732e48a6f7d52405c43dc952eec0f0ae4353d34886bca056132b9" + }, + "vllm/v1/attention/ops/rocm_aiter_mla_sparse.py": { + "path": "/vllm/v1/attention/ops/rocm_aiter_mla_sparse.py", + "sha256": "feec664be5045fd1ba13b8f6ef83b52c96910ddc78baca0431bcf610c9e8f5cc" + }, + "vllm/v1/attention/ops/triton_attention_helpers.py": { + "path": "/vllm/v1/attention/ops/triton_attention_helpers.py", + "sha256": "35aa993d01345f535d2641cf9dcabb8b64c51b20a19707bc5987e616aaa87ddd" + }, + "vllm/v1/attention/ops/triton_decode_attention.py": { + "path": "/vllm/v1/attention/ops/triton_decode_attention.py", + "sha256": "b9823c65eba22d76abf64dad7d7d16a950f67471c86d6cb5b3e983aaf14381ac" + }, + "vllm/v1/attention/ops/triton_merge_attn_states.py": { + "path": "/vllm/v1/attention/ops/triton_merge_attn_states.py", + "sha256": "f63229162181ab93198550b73a115f1cc1034cfd60e6f58bc8ab3e22a6e8ce60" + }, + "vllm/v1/attention/ops/triton_prefill_attention.py": { + "path": "/vllm/v1/attention/ops/triton_prefill_attention.py", + "sha256": "352c1a4ac86146580040579fb217c2e288268830d6602b735713e154f36d74fe" + }, + "vllm/v1/attention/ops/triton_reshape_and_cache_flash.py": { + "path": "/vllm/v1/attention/ops/triton_reshape_and_cache_flash.py", + "sha256": "6cac51475b8c656992a21b2d150acd3a16a95a7ab7d49aab151a3ef13c24b80d" + }, + "vllm/v1/attention/ops/triton_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/triton_turboquant_decode.py", + "sha256": "8e52678136449e4bbca2195fbcbb87426c955a2b1b8422e7ab9511e45ee5f5c6" + }, + "vllm/v1/attention/ops/triton_turboquant_store.py": { + "path": "/vllm/v1/attention/ops/triton_turboquant_store.py", + "sha256": "6e6e2fe74a307d40f0be786ccbaea76d989e3c7b5985f3144a5218c61bf6d902" + }, + "vllm/v1/attention/ops/triton_unified_attention.py": { + "path": "/vllm/v1/attention/ops/triton_unified_attention.py", + "sha256": "65d0fbcf33d00789df8ca688c0a1c908e710cfaef53471178747ecae11f05829" + }, + "vllm/v1/attention/ops/triton_unified_attention_diffkv.py": { + "path": "/vllm/v1/attention/ops/triton_unified_attention_diffkv.py", + "sha256": "7fa36d7b7441f1c396e0348eac61d691d2e459e5c4c393c4aa262dfb670e68f7" + }, + "vllm/v1/attention/ops/turboquant_soa/__init__.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/__init__.py", + "sha256": "6b43b6fcb2a71c44ceff4ed1edd417a839f4901251ba15831b09ad979baa4984" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode.py", + "sha256": "bf00634191bba14cbf4a23c1d67dc3dcb244c2b8989f08362757b54435830986" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode_v2.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode_v2.py", + "sha256": "28e7ecc15c450d3591983a50c46a03aa6ca6fa99304c17c333940617d9916485" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_store.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_store.py", + "sha256": "dccf93b9fdd34f9b9eacd468e9de35b9d93378594487c335cf50642aaec681f2" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_unified_attention.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_unified_attention.py", + "sha256": "b4b2b5f3985b3a6126fd052e6ec1ed91c610da8a525a9ae7470ac829405bd85c" + }, + "vllm/v1/attention/ops/vit_attn_wrappers.py": { + "path": "/vllm/v1/attention/ops/vit_attn_wrappers.py", + "sha256": "a99d57b58269c7521fa5d7d47af06551f3bab2b5c7358ef78165a7f6e20a92a6" + }, + "vllm/v1/attention/ops/xpu_mla_sparse.py": { + "path": "/vllm/v1/attention/ops/xpu_mla_sparse.py", + "sha256": "d98d17110577c2b7b4d05e07bfdae15faf83321b6342a5daaaecce45b9503f38" + }, + "vllm/v1/attention/selector.py": { + "path": "/vllm/v1/attention/selector.py", + "sha256": "87f653ded7974875183c920e3e4589c28116bcbc99714d1da7cb51ae77c0b182" + }, + "vllm/v1/core/sched/__init__.py": { + "path": "/vllm/v1/core/sched/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/core/sched/async_scheduler.py": { + "path": "/vllm/v1/core/sched/async_scheduler.py", + "sha256": "e586a0ef3c6778be56a93e7f9bb712d4de9de6e7d7fe7e3e1d51dae83ecfc508" + }, + "vllm/v1/core/sched/interface.py": { + "path": "/vllm/v1/core/sched/interface.py", + "sha256": "be6c008664096c5660a8879de72b315bbe479bf1d688be9b25891063ec53a367" + }, + "vllm/v1/core/sched/output.py": { + "path": "/vllm/v1/core/sched/output.py", + "sha256": "3a66c8efaefe10c572f6f33cf1f8aa4610758c945130cad62eb9f7331005677c" + }, + "vllm/v1/core/sched/request_queue.py": { + "path": "/vllm/v1/core/sched/request_queue.py", + "sha256": "4b8d938e5fb8152fe61030b8aa991f983fcac9a405c37ed8908045e05e82ae5e" + }, + "vllm/v1/core/sched/scheduler.py": { + "path": "/vllm/v1/core/sched/scheduler.py", + "sha256": "c1db45f3bbad3a875dd8638331b8870c4380ac1ab4734265ba5c863833a82884" + }, + "vllm/v1/core/sched/utils.py": { + "path": "/vllm/v1/core/sched/utils.py", + "sha256": "1ed988044eb8028c77ede875bd1a5fd05ff6998b455d61e3997d6a3d7fc1c3a7" + }, + "vllm/v1/sample/__init__.py": { + "path": "/vllm/v1/sample/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/sample/logits_processor/__init__.py": { + "path": "/vllm/v1/sample/logits_processor/__init__.py", + "sha256": "1f9b02dae8cf6d44484638037123d3a2dec6b7b9a2bcc9afceef1a9bf3eaedec" + }, + "vllm/v1/sample/logits_processor/builtin.py": { + "path": "/vllm/v1/sample/logits_processor/builtin.py", + "sha256": "6105816ece77e5b1dbee0d07abc90ce039d650bac2ddb85c93280c48b00f2ebe" + }, + "vllm/v1/sample/logits_processor/interface.py": { + "path": "/vllm/v1/sample/logits_processor/interface.py", + "sha256": "171dfc6ef9b5b53128e8eaecc4bdf1de413a706d64bf5be686048f583c66eee1" + }, + "vllm/v1/sample/logits_processor/state.py": { + "path": "/vllm/v1/sample/logits_processor/state.py", + "sha256": "a96411f14362c45f839e181dcb3ac01d5b880812bccb3552fc17863b219f44ac" + }, + "vllm/v1/sample/metadata.py": { + "path": "/vllm/v1/sample/metadata.py", + "sha256": "6582cfe1a240c7ddb975f0ef6dd7dcd28dcf0fc7670394390250013977aa7ffd" + }, + "vllm/v1/sample/ops/__init__.py": { + "path": "/vllm/v1/sample/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/sample/ops/bad_words.py": { + "path": "/vllm/v1/sample/ops/bad_words.py", + "sha256": "0b1d0a9b13b92ddcae2c83393c07a34c0f107813725700dee794caa7fe7f3b12" + }, + "vllm/v1/sample/ops/logprobs.py": { + "path": "/vllm/v1/sample/ops/logprobs.py", + "sha256": "b286f69012a6758bfe9250038b0697294dbffe0d32c6906f284c39f75ee48be3" + }, + "vllm/v1/sample/ops/penalties.py": { + "path": "/vllm/v1/sample/ops/penalties.py", + "sha256": "4debfcf247b3887478d2b9ec98f108756bbed2805462777ef6b56f3bdf4ce682" + }, + "vllm/v1/sample/ops/topk_topp_sampler.py": { + "path": "/vllm/v1/sample/ops/topk_topp_sampler.py", + "sha256": "13ea4359832bc914492330958ec4f5ac140f408b8f410cc05c6eaf7ddcd70be4" + }, + "vllm/v1/sample/ops/topk_topp_triton.py": { + "path": "/vllm/v1/sample/ops/topk_topp_triton.py", + "sha256": "0b5fc337058e22bc28a8530ccec904d6ccd89b9548b02955c657ac429b1669d2" + }, + "vllm/v1/sample/rejection_sampler.py": { + "path": "/vllm/v1/sample/rejection_sampler.py", + "sha256": "0bb9d224887ccb1355e16199005cc23a4afc6fa75156eca419851b7247d99750" + }, + "vllm/v1/sample/sampler.py": { + "path": "/vllm/v1/sample/sampler.py", + "sha256": "f95805b2c6d06218c724826aa5f881a606e8d0a534a566aee7c85948520dd216" + }, + "vllm/v1/sample/thinking_budget_state.py": { + "path": "/vllm/v1/sample/thinking_budget_state.py", + "sha256": "962f8f55210eb0a431cb9c78b013e35f7a7dd58d06d6fb2e7fcff1b457356f8e" + }, + "vllm/v1/worker/__init__.py": { + "path": "/vllm/v1/worker/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/block_table.py": { + "path": "/vllm/v1/worker/block_table.py", + "sha256": "a09b8819e1417b7a186cf3472224e2138fc5d41a291c6692bb7df711b0c44259" + }, + "vllm/v1/worker/cp_utils.py": { + "path": "/vllm/v1/worker/cp_utils.py", + "sha256": "e32625d83a641b8dd8df82e92d1b6fb20af0cdf2e8fbd2fb131aa3c215415448" + }, + "vllm/v1/worker/cpu/__init__.py": { + "path": "/vllm/v1/worker/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/cpu/buffer_utils.py": { + "path": "/vllm/v1/worker/cpu/buffer_utils.py", + "sha256": "e7313fd8c2c76ebfb98d2fa53008bc9691d0f83a7d7c05e87602b5a29fb79e04" + }, + "vllm/v1/worker/cpu/model_runner.py": { + "path": "/vllm/v1/worker/cpu/model_runner.py", + "sha256": "24a1c916550051327dd5893243a6d4200f3824b91b3af8aa6f6c793fd7c68c3e" + }, + "vllm/v1/worker/cpu/shm.py": { + "path": "/vllm/v1/worker/cpu/shm.py", + "sha256": "08491af8ad341399d1375f2d21ad00414d4c89b0a5c03f55de8704914bbfcbd9" + }, + "vllm/v1/worker/cpu_model_runner.py": { + "path": "/vllm/v1/worker/cpu_model_runner.py", + "sha256": "92111aba92f00571f1a3c4c6e43cf1da6ccb4d2afac2f4d5abc018a4a6e7e8bd" + }, + "vllm/v1/worker/cpu_worker.py": { + "path": "/vllm/v1/worker/cpu_worker.py", + "sha256": "a8051b9e510ef0af9cc34004f2cbe5c0f902bd0cebc32c9464e744344dfdf849" + }, + "vllm/v1/worker/dp_utils.py": { + "path": "/vllm/v1/worker/dp_utils.py", + "sha256": "8cd19f1bfbc5c4f6ec60df89aea7c8a19b400ebc264f372b103014152e92158c" + }, + "vllm/v1/worker/ec_connector_model_runner_mixin.py": { + "path": "/vllm/v1/worker/ec_connector_model_runner_mixin.py", + "sha256": "fe9b11cebb8562f1bfe98b98a5647b2b081a6e424cb60d4ffe2412c91a99215e" + }, + "vllm/v1/worker/encoder_cudagraph.py": { + "path": "/vllm/v1/worker/encoder_cudagraph.py", + "sha256": "6a08d3779bca1b47dbf9daf6eafe2d3c70dbcb8aeb7d63ba7efacc68241ee3bc" + }, + "vllm/v1/worker/encoder_cudagraph_defs.py": { + "path": "/vllm/v1/worker/encoder_cudagraph_defs.py", + "sha256": "bb7be050fcaa8868e7816c84caec875da57050d65fe7eaf00f3d41473df25e3a" + }, + "vllm/v1/worker/gpu/__init__.py": { + "path": "/vllm/v1/worker/gpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/async_utils.py": { + "path": "/vllm/v1/worker/gpu/async_utils.py", + "sha256": "77e17a4570ead2be30ae9b00888cf077a3b873018c12ca0549b853bfda02c1ba" + }, + "vllm/v1/worker/gpu/attn_utils.py": { + "path": "/vllm/v1/worker/gpu/attn_utils.py", + "sha256": "b9b81e59dda2720b1f9c434471381f879228832443e52756e469b4ad4905888f" + }, + "vllm/v1/worker/gpu/block_table.py": { + "path": "/vllm/v1/worker/gpu/block_table.py", + "sha256": "61c004315d5af7e7eae4e2a9e6be92ea82c520327690a7f55a73bb9ce95f520a" + }, + "vllm/v1/worker/gpu/buffer_utils.py": { + "path": "/vllm/v1/worker/gpu/buffer_utils.py", + "sha256": "6597f701a30261bf250e9ad5a29737264624a1caa20527aeea0dad630325b093" + }, + "vllm/v1/worker/gpu/cp_utils.py": { + "path": "/vllm/v1/worker/gpu/cp_utils.py", + "sha256": "456c1bb7e262d99ff555522a4f134e5a9b42aee23290be25455eaef36ee8eaaf" + }, + "vllm/v1/worker/gpu/cudagraph_utils.py": { + "path": "/vllm/v1/worker/gpu/cudagraph_utils.py", + "sha256": "6e9c042890603535e300a40df8ee159dbed1058a64a83ae50ff0329e332e05ff" + }, + "vllm/v1/worker/gpu/dp_utils.py": { + "path": "/vllm/v1/worker/gpu/dp_utils.py", + "sha256": "e26867bc89e6bfc933cabc5ed13e5dc7b8d2d3030118ca1ca64c8785dabc0fc1" + }, + "vllm/v1/worker/gpu/ec_connector.py": { + "path": "/vllm/v1/worker/gpu/ec_connector.py", + "sha256": "2afe6e641f4ae3eb3b8da336c74eaa7479bf617b27cfb39a1fcbe487686f0a08" + }, + "vllm/v1/worker/gpu/eplb_utils.py": { + "path": "/vllm/v1/worker/gpu/eplb_utils.py", + "sha256": "1829fac11464aed4649179b302df198de51b95d0589f4e56bea305a876a63e26" + }, + "vllm/v1/worker/gpu/input_batch.py": { + "path": "/vllm/v1/worker/gpu/input_batch.py", + "sha256": "d5dd956eb319bd69dd9e762047833d81ad40b21fce619fcb2133759e73620694" + }, + "vllm/v1/worker/gpu/kv_connector.py": { + "path": "/vllm/v1/worker/gpu/kv_connector.py", + "sha256": "b89a4333f1e552d86e1815674b59e9f1335f0f49c0a7b46082439076f62c6a81" + }, + "vllm/v1/worker/gpu/lora_utils.py": { + "path": "/vllm/v1/worker/gpu/lora_utils.py", + "sha256": "1e90eddd9ddb4ca55e574bb28e87ae3a6f6750175a62d373102426543f4ccd66" + }, + "vllm/v1/worker/gpu/metrics/__init__.py": { + "path": "/vllm/v1/worker/gpu/metrics/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/metrics/logits.py": { + "path": "/vllm/v1/worker/gpu/metrics/logits.py", + "sha256": "ea058d7510a077a55f8ac7e4c3d596508346244e908cb372865d7159f62edc89" + }, + "vllm/v1/worker/gpu/mm/__init__.py": { + "path": "/vllm/v1/worker/gpu/mm/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/mm/encoder_cache.py": { + "path": "/vllm/v1/worker/gpu/mm/encoder_cache.py", + "sha256": "89c500338fddbeee7c4fca978a3a7c4c566a03e848e399d303fbee3c80631cd2" + }, + "vllm/v1/worker/gpu/mm/encoder_runner.py": { + "path": "/vllm/v1/worker/gpu/mm/encoder_runner.py", + "sha256": "0981e352d70301b7154a217a48665ffe35f215d053ec5740c2515a3e1e11b4e6" + }, + "vllm/v1/worker/gpu/mm/lora.py": { + "path": "/vllm/v1/worker/gpu/mm/lora.py", + "sha256": "a3eddfad6ad64de276964240c28dc080888df4a56dd5eac18f89428f2cbb7a01" + }, + "vllm/v1/worker/gpu/mm/rope.py": { + "path": "/vllm/v1/worker/gpu/mm/rope.py", + "sha256": "0924375bcb367267e783b57dd2ad9de1189d97025ce4313baaa54f2911eaaf1e" + }, + "vllm/v1/worker/gpu/model_runner.py": { + "path": "/vllm/v1/worker/gpu/model_runner.py", + "sha256": "174c93db921c23cf0396eee4764be25b2bd2d4b6a06e9fa41ce3598b884ce8ce" + }, + "vllm/v1/worker/gpu/model_states/__init__.py": { + "path": "/vllm/v1/worker/gpu/model_states/__init__.py", + "sha256": "07815d0b788fc88185772f581bbf892a675259f9288375571f29887622f8d93c" + }, + "vllm/v1/worker/gpu/model_states/default.py": { + "path": "/vllm/v1/worker/gpu/model_states/default.py", + "sha256": "bb614f814780f052e869f9acf31dfbfa68718ee7dc6252eefa901b5730ee8a2a" + }, + "vllm/v1/worker/gpu/model_states/encoder_decoder.py": { + "path": "/vllm/v1/worker/gpu/model_states/encoder_decoder.py", + "sha256": "a5868059d8af672548b41d0e623e884320e6ed61e6aaca2d2828ff5be0356f2f" + }, + "vllm/v1/worker/gpu/model_states/encoder_only.py": { + "path": "/vllm/v1/worker/gpu/model_states/encoder_only.py", + "sha256": "84e96b55a2639e2a73fa4a0308acc89c8d053dc715481180b237e0196dcef99f" + }, + "vllm/v1/worker/gpu/model_states/interface.py": { + "path": "/vllm/v1/worker/gpu/model_states/interface.py", + "sha256": "5675b6fedc7403a9ab410b1e5565974e78fac23c42ab4253ae1da52d6e09b594" + }, + "vllm/v1/worker/gpu/model_states/mamba_hybrid.py": { + "path": "/vllm/v1/worker/gpu/model_states/mamba_hybrid.py", + "sha256": "573e130ac5587d4822fabf97adad1ad0fda02ff83c5e70df879a5bb175ae845c" + }, + "vllm/v1/worker/gpu/model_states/mm_pruning.py": { + "path": "/vllm/v1/worker/gpu/model_states/mm_pruning.py", + "sha256": "b150940b12ae76048f050a8eeb54d532bbdc530a18ffbf320ddeeb0cfaa90f93" + }, + "vllm/v1/worker/gpu/model_states/prompt_embeds.py": { + "path": "/vllm/v1/worker/gpu/model_states/prompt_embeds.py", + "sha256": "11f9e270925c2df6a505557605ac2b859bb145cf3420b0111e7482a1c544f9b1" + }, + "vllm/v1/worker/gpu/model_states/recoverssm.py": { + "path": "/vllm/v1/worker/gpu/model_states/recoverssm.py", + "sha256": "b4b660e62eaf33f4fe8271f83ed1fb6de6bc08f800a8073b27803e42fb29a645" + }, + "vllm/v1/worker/gpu/pcp_manager.py": { + "path": "/vllm/v1/worker/gpu/pcp_manager.py", + "sha256": "2d80df0ed5b18a2069f9d0689cb59923ffe324ba200fcafe242da23da3a6ddaa" + }, + "vllm/v1/worker/gpu/pool/__init__.py": { + "path": "/vllm/v1/worker/gpu/pool/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/pool/pooling_runner.py": { + "path": "/vllm/v1/worker/gpu/pool/pooling_runner.py", + "sha256": "f8463f7648cce0f3f29418a4d9fee61634ead760957cf236d06d61cf8cd986e7" + }, + "vllm/v1/worker/gpu/pp_utils.py": { + "path": "/vllm/v1/worker/gpu/pp_utils.py", + "sha256": "dadeef0bebf61d0ad44a28d06372208ec4e6389224d6017f412683b026bdbb5c" + }, + "vllm/v1/worker/gpu/sample/__init__.py": { + "path": "/vllm/v1/worker/gpu/sample/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/sample/bad_words.py": { + "path": "/vllm/v1/worker/gpu/sample/bad_words.py", + "sha256": "8d3cbd5613398260314d94739d8ee0e1ac0c22abf2f960f541d3c0d4e39d360b" + }, + "vllm/v1/worker/gpu/sample/batch_shard.py": { + "path": "/vllm/v1/worker/gpu/sample/batch_shard.py", + "sha256": "c30274a3a04e6a03e89be9cd7c62de602b1aba4d412f64540ab6201036de3928" + }, + "vllm/v1/worker/gpu/sample/gumbel.py": { + "path": "/vllm/v1/worker/gpu/sample/gumbel.py", + "sha256": "3ec1df510bdad13e8b0a457b5b67c98affdf6e57369e56cb471246cc8f40dd34" + }, + "vllm/v1/worker/gpu/sample/logit_bias.py": { + "path": "/vllm/v1/worker/gpu/sample/logit_bias.py", + "sha256": "9e80a3fe6f3c7474723408cfff52183f4585fdeedd9c2312843ee98d0b12724c" + }, + "vllm/v1/worker/gpu/sample/logprob.py": { + "path": "/vllm/v1/worker/gpu/sample/logprob.py", + "sha256": "f47479a818192acb6b297c79fa67a3b2f9820e3492a394d5adda777e9b7c832e" + }, + "vllm/v1/worker/gpu/sample/min_p.py": { + "path": "/vllm/v1/worker/gpu/sample/min_p.py", + "sha256": "4cb5e2f45e1ced6f9685283a7a5c8cfd7204d9a249822e866cfff756c7f04f62" + }, + "vllm/v1/worker/gpu/sample/output.py": { + "path": "/vllm/v1/worker/gpu/sample/output.py", + "sha256": "d6e298c0f197d487a8faaf7200f500fa83df1d7a4bbf4339cadd6a18008f7f9c" + }, + "vllm/v1/worker/gpu/sample/penalties.py": { + "path": "/vllm/v1/worker/gpu/sample/penalties.py", + "sha256": "46c29434caf5f415129ef4a9bb2b8d4f62d2765596e3e07f73ad2b198c7def1b" + }, + "vllm/v1/worker/gpu/sample/prompt_logprob.py": { + "path": "/vllm/v1/worker/gpu/sample/prompt_logprob.py", + "sha256": "4cf22d390e7bf59e44c458cff7180268db63e95d06af2f1e14d720a2d77c9663" + }, + "vllm/v1/worker/gpu/sample/sampler.py": { + "path": "/vllm/v1/worker/gpu/sample/sampler.py", + "sha256": "832c9945d201a1e730ff9b4b52076aa83bd4a5064e1e4cfea952cf84d4a8d1f0" + }, + "vllm/v1/worker/gpu/sample/states.py": { + "path": "/vllm/v1/worker/gpu/sample/states.py", + "sha256": "4e3671f93695ba5a48fad7d2d13beb231ac8741034904ed5a15d9f7b9b86662e" + }, + "vllm/v1/worker/gpu/sample/thinking_budget.py": { + "path": "/vllm/v1/worker/gpu/sample/thinking_budget.py", + "sha256": "020513e1d3406f367de6ad995a95055008fd0c28f2873647e8283c9870e22404" + }, + "vllm/v1/worker/gpu/sample/trace_replay.py": { + "path": "/vllm/v1/worker/gpu/sample/trace_replay.py", + "sha256": "d2a7d3b3b55379efabe4740a4b7f14030126dc11be36f6ea974164ce42316a50" + }, + "vllm/v1/worker/gpu/sample/watermark.py": { + "path": "/vllm/v1/worker/gpu/sample/watermark.py", + "sha256": "a3581458169dab9153eb09fd67218e0ee5585406537a9de80ad528ae62b030c0" + }, + "vllm/v1/worker/gpu/shutdown.py": { + "path": "/vllm/v1/worker/gpu/shutdown.py", + "sha256": "bb470f14b17c7e52571ef8938b2a9527e7c2846852ae8a3a94b69cd1c30aa4b1" + }, + "vllm/v1/worker/gpu/spec_decode/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/__init__.py", + "sha256": "1f1f84bfe6f4f5af3a7e21a7a8716ecf7b9013da1d03327668a3ee36afc24c32" + }, + "vllm/v1/worker/gpu/spec_decode/acceptance_estimator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/acceptance_estimator.py", + "sha256": "505b843bdd75928b03793b395b47b8be914bd7fe2a3351c8ec04339baeebb1c2" + }, + "vllm/v1/worker/gpu/spec_decode/adaptive_verification.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/adaptive_verification.py", + "sha256": "276b2fec56758a94c71b717f6786b8a6f126db2e20cf964350202feee61a0a39" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py", + "sha256": "13392ef0a9ed59eb9c2b2bad43d7c61beb212a8805849e46b5130c230275d0a5" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/speculator.py", + "sha256": "5b97f54e20ddf65b98e939832d050745f67ef43cfa145786da300f1a8322e3c6" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/cudagraph.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/cudagraph.py", + "sha256": "beab567ae2df6a2ba2cd92fe7ee452c6b959b8a7037a4b5f493993a1824619bb" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/speculator.py", + "sha256": "f9c100f42f9326e48eb84e89281897e859ba761943f54d593523555ccd98dc63" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/utils.py", + "sha256": "53d2c3ad474d290d2c6df027446bbd80ac7447684e5242ab2c3c5337d2abd383" + }, + "vllm/v1/worker/gpu/spec_decode/dflash2/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash2/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/dflash2/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash2/speculator.py", + "sha256": "b70043550938a1df9aecc85d8c8224c38c929ca34f68834572f6e723854d2027" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/speculator.py", + "sha256": "dcf4abdedbd2bddd0d76be198ccf5b4e467c46f645038c35fcab821491a35b03" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/utils.py", + "sha256": "86af2bf30604a184312e8f076097b91ecfec704f409f9d68d634b03d6b318070" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/eagle3_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/eagle3_utils.py", + "sha256": "201ee875fcc3d076a8fc1f3876dcbf85736b221a368555243a8987ff26a1674e" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/speculator.py", + "sha256": "746e318a4f266d75522ff7f3731ea9b4527b7b4824f71364d1a62184ea1f7b3d" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/utils.py", + "sha256": "94de6f55a1761f24f4aa1388cbc3b3763d4ab3ee53260330056ad31ce0b78236" + }, + "vllm/v1/worker/gpu/spec_decode/extract_hidden_states.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/extract_hidden_states.py", + "sha256": "93c4233be7b2d2290b33902ea9b3bb5274c11701830851d03967a22144536e2d" + }, + "vllm/v1/worker/gpu/spec_decode/gemma4/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/gemma4/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/gemma4/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/gemma4/speculator.py", + "sha256": "9991210d7babd2caf2cd10797ca8688543dedeafbc3b86bc7c979c1a6ae9f949" + }, + "vllm/v1/worker/gpu/spec_decode/mtp/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/mtp/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/mtp/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/mtp/speculator.py", + "sha256": "926d6c9ffdb368c971647911a60493820d056ce236fcae9d94a42fa2e006255d" + }, + "vllm/v1/worker/gpu/spec_decode/multi_module_mtp/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/multi_module_mtp/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/multi_module_mtp/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/multi_module_mtp/speculator.py", + "sha256": "d9d4735b9b33829332b0e845b6d3073b2f0436045ed693b25c6434f351644127" + }, + "vllm/v1/worker/gpu/spec_decode/rejection_sampler.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/rejection_sampler.py", + "sha256": "030db5bfca162cc1f305112f299de5d6d61c59d3ed0807fee46575441ca4086d" + }, + "vllm/v1/worker/gpu/spec_decode/rejection_sampler_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/rejection_sampler_utils.py", + "sha256": "214b61fa0abe88573beb779872c035b3954e5651a85bd438d99ee5905d3a62ec" + }, + "vllm/v1/worker/gpu/spec_decode/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/speculator.py", + "sha256": "3a1ab15bf8b20918852eb835fe9755046e99dcbac6ba6ca3d414949fc8bc695a" + }, + "vllm/v1/worker/gpu/spec_decode/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/utils.py", + "sha256": "282f2929eddae9ca7312269f799be07472334b6df9fd91878b5e839ec05e418c" + }, + "vllm/v1/worker/gpu/states.py": { + "path": "/vllm/v1/worker/gpu/states.py", + "sha256": "99418f5df43ca612ded72609fee011620b065b2cab2f249ccb387096bf4ae71a" + }, + "vllm/v1/worker/gpu/structured_outputs.py": { + "path": "/vllm/v1/worker/gpu/structured_outputs.py", + "sha256": "18a10532db7e66b55e334acacd1fd989ad6361adf31dd0de9a9a65e23db25951" + }, + "vllm/v1/worker/gpu/ubatch_utils.py": { + "path": "/vllm/v1/worker/gpu/ubatch_utils.py", + "sha256": "5092e2e58af0561c8dc12e62847cfc6dda9ca20dfbd33e7f0cd77a83fe87f7c5" + }, + "vllm/v1/worker/gpu/warmup.py": { + "path": "/vllm/v1/worker/gpu/warmup.py", + "sha256": "423ac32d58fe008c228cfa223e4fcebfcf87e3463a9dbdf80a083c0578d73723" + }, + "vllm/v1/worker/gpu_input_batch.py": { + "path": "/vllm/v1/worker/gpu_input_batch.py", + "sha256": "18cf455c9d0eea61cc581c7932f2e6cd09786914e82dd35eef1c1430da359a0f" + }, + "vllm/v1/worker/gpu_model_runner.py": { + "path": "/vllm/v1/worker/gpu_model_runner.py", + "sha256": "87c29d08c0bbf66993d8b984811e7325e35e6436242a773feb55ec88f16b2c51" + }, + "vllm/v1/worker/gpu_ubatch_wrapper.py": { + "path": "/vllm/v1/worker/gpu_ubatch_wrapper.py", + "sha256": "4233cfbe8c9884b042c4363890108f616483b694ebe9a6e69578dcf89c6dac5c" + }, + "vllm/v1/worker/gpu_worker.py": { + "path": "/vllm/v1/worker/gpu_worker.py", + "sha256": "6994436e4547c0996ab555b3e814e8ccea26b650dfc1b378b97d640745309347" + }, + "vllm/v1/worker/kv_connector_model_runner_mixin.py": { + "path": "/vllm/v1/worker/kv_connector_model_runner_mixin.py", + "sha256": "e1cc76d065a7e60aacddb190ae795a480b65cd02ba71a1fc699a02a85c1a3de2" + }, + "vllm/v1/worker/lora_model_runner_mixin.py": { + "path": "/vllm/v1/worker/lora_model_runner_mixin.py", + "sha256": "fef6092a15d8d37f6fa22495e6106e2e5280180908d61ce43d9ff5bf4eef3f2f" + }, + "vllm/v1/worker/mamba_utils.py": { + "path": "/vllm/v1/worker/mamba_utils.py", + "sha256": "23fdaa4e8f63ee8f938eaa1a2b39f803cb04fa6ecd69789563254b1a0691413a" + }, + "vllm/v1/worker/mm_encoder_model_runner.py": { + "path": "/vllm/v1/worker/mm_encoder_model_runner.py", + "sha256": "780c41be84ad022205c21c1decb6bb8d5afb03bc7be120c1f7df03b710acc3d7" + }, + "vllm/v1/worker/sentinel/__init__.py": { + "path": "/vllm/v1/worker/sentinel/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/sentinel/gpu_worker_sentinel.py": { + "path": "/vllm/v1/worker/sentinel/gpu_worker_sentinel.py", + "sha256": "3959b8619d052c5dd247815074e03ec21ec9b43cc424ff2d296abc19b227b852" + }, + "vllm/v1/worker/startup_plan.py": { + "path": "/vllm/v1/worker/startup_plan.py", + "sha256": "84bcbb4f7a9fd7c8d10c9c895aadd9673d44c767b9132368d11eb5e017afe86b" + }, + "vllm/v1/worker/ubatch_utils.py": { + "path": "/vllm/v1/worker/ubatch_utils.py", + "sha256": "b34dce551b5195c414e6a3a997c75961cc7a17f24c7c980487fe3d3e2ba7a798" + }, + "vllm/v1/worker/ubatching.py": { + "path": "/vllm/v1/worker/ubatching.py", + "sha256": "40391241c564feb5f16c77898ae6ae152ed6e71a4682e2a406387785d8de02d7" + }, + "vllm/v1/worker/utils.py": { + "path": "/vllm/v1/worker/utils.py", + "sha256": "0ca3ec6bf4d20076145b7fe64e564962adebedc8f75a856b517ba0b2f2d77acf" + }, + "vllm/v1/worker/worker_base.py": { + "path": "/vllm/v1/worker/worker_base.py", + "sha256": "4a1a5266b912fe97991d8dc89d92b923990da9f6cb4b817d00d52e9c0d26dd7c" + }, + "vllm/v1/worker/workspace.py": { + "path": "/vllm/v1/worker/workspace.py", + "sha256": "d21c08167d1d0d1c0cddaa80453a53a0b4dec5d81b5a537c94a21324344976b3" + }, + "vllm/v1/worker/xpu_model_runner.py": { + "path": "/vllm/v1/worker/xpu_model_runner.py", + "sha256": "07fa0390d28f2b8c3c3c0019eb9c3b126e2397aea268ba47c889f06b423deb23" + }, + "vllm/v1/worker/xpu_worker.py": { + "path": "/vllm/v1/worker/xpu_worker.py", + "sha256": "711b56432506b58041cd86e71320c3960413f7bd61061990b66488421d81cfc3" + } + }, + "prefix": "", + "pth": { + "/__editable__.megatron_core-0.16.0rc0.pth": "d55c9b64480b34aae3d4d31e7706b93391c969dec6e0498e50963b03445a57b0", + "/__editable__.rl_kernel-0.1.0.pth": "1454c4987b35762a0d189d4e901c5d077fde62a1944fbaabecea230e57f3923a", + "/__editable__.vime-0.3.2.pth": "77eec5d06d628cb952e65edd813ca88d8db67ccc785083e1b7b29011b92bec4f", + "/distutils-precedence.pth": "2638ce9e2500e572a5e0de7faed6661eb569d1b696fcba07b0dd223da5f5d224", + "/qwen3_next_cuda_runtime.pth": "e0d3ab57dd3ff4f5d55fcf76e83c549cc00b3c813e6f717c540d5ded79fa2f49", + "/qwen3_next_megatron_source.pth": "8556ac057538e82856cb76cbbc954f58312a3f45373daec3eec826031cfd2709", + "/__editable__.rl_kernel-0.1.0.pth": "1454c4987b35762a0d189d4e901c5d077fde62a1944fbaabecea230e57f3923a", + "/distutils-precedence.pth": "2638ce9e2500e572a5e0de7faed6661eb569d1b696fcba07b0dd223da5f5d224", + "/nvidia_cutlass_dsl_packages.pth": "cc710b99ddb3d76361a70461461d274212a979d00c381d821fce5bb3ad9cf246" + }, + "pyvenv_cfg_sha256": "48579f2c6d35c3d535c2690d7d426587c4b8e92021463f0266b38d35dfbbb834", + "sources": { + "/Megatron-LM-training": { + "patch_sha256": "f66035f12501aa1d08e8884e0dea5a22d59825d717aeda73c3e83876e3efd79f", + "path": "/Megatron-LM-training", + "tree": "731fc44a368d6cac8c6171a29d5c687ff0d95bd1" + }, + "/vime": { + "patch_sha256": "66949839d4c18329444f4f9f6dcd702b53ce1b94e9aa15ed111f28743bfaa4b9", + "path": "/vime", + "tree": "f5174e67dbcdaef983eecd45f215fef2d8429dd0" + } + }, + "version": "3.12.14 | packaged by Anaconda, Inc. | (main, Aug 27 2026, 14:46:43) [GCC 14.3.0]" + }, + "sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca" + }, + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "cuda_identity": { + "home": "", + "nvcc_sha256": "b8e2347d9d7fcadf8812a27324d515de99d033d3e48611811ece7e66d7895f8a" + }, + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "operator_requirements": { + "suite": "all", + "case_ids": [ + "tests/check_qwen3_next_attention.py::test_d256_backward_with_cached_prefix_matches_float64_formula", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[1024]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[256]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[64]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[8]", + "tests/check_qwen3_next_attention.py::test_d256_input_device_guard_and_nondefault_stream", + "tests/check_qwen3_next_attention.py::test_native_backward_rejects_malformed_probability_and_gradient_buffers", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[0]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[2]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_target_inputs_do_not_depend_on_companions", + "tests/check_qwen3_next_batch_invariance.py::test_triton_chunked_prefill_is_batch_invariant", + "tests/check_qwen3_next_conv_bridge.py::test_chunked_and_reordered_sequences_match", + "tests/check_qwen3_next_conv_bridge.py::test_empty_sequence_preserves_cache_and_gradients", + "tests/check_qwen3_next_conv_bridge.py::test_response_gradient_reaches_prompt_and_convolution_weight", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths0]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths1]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths2]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-4]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[1]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[4]", + "tests/check_qwen3_next_core_matrix.py::test_variable_lengths_empty_and_mixed_step_match_independent_sequences", + "tests/check_qwen3_next_forward.py::test_combine_has_fixed_route_order_and_differentiable_weights", + "tests/check_qwen3_next_forward.py::test_full_vocabulary_logprob_entropy_modes_and_gradient", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_fail_closed_on_the_tensor_descriptor_path", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[128]", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[512]", + "tests/check_qwen3_next_forward.py::test_logprob_nan_rejected_before_comparison", + "tests/check_qwen3_next_forward.py::test_moe_vjp_matches_independent_double_formula", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[1024-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[128-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-16]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-256]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-3072]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-37984]", + "tests/check_qwen3_next_forward.py::test_qwen_moe_actual_tp4_shapes_and_independent_training_forward", + "tests/check_qwen3_next_forward.py::test_route_weights_are_batch_invariant", + "tests/check_qwen3_next_forward.py::test_shared_linear_vjp_and_empty_tokens", + "tests/check_qwen3_next_forward.py::test_stable_route_tie_boundary_and_router_gradient", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_backward_matches_recomputed_recurrence_vjp", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_forward_is_provider_exact_and_does_not_mutate_inputs", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_keeps_prompt_state_gradient_through_response", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[False]", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[True]", + "tests/check_qwen3_next_gdn_bridge.py::test_initial_state_vjp_matches_provider_directional_difference", + "tests/check_qwen3_next_gdn_sequence.py::test_1024_token_chunk_continuation_is_bitwise_exact", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad0]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad1]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad2]", + "tests/check_qwen3_next_gdn_sequence.py::test_chunk_boundary_retains_prompt_and_initial_state_gradients", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths0]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths1]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths2]", + "tests/check_qwen3_next_gdn_sequence.py::test_reserved_and_duplicate_slots_are_rejected", + "tests/check_qwen3_next_norm_providers.py::test_custom_op_has_distinct_native_and_cuda_paths", + "tests/check_qwen3_next_norm_providers.py::test_gdn_decode_provider_env_defaults_are_recorded", + "tests/check_qwen3_next_norm_providers.py::test_our_gated_op_is_batch_invariant", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_cuda]", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_native]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots0]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots2]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots3]", + "tests/check_qwen3_next_shared_core.py::test_independent_training_forward_matches_inference_and_retains_gradients", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[1024]", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[8]", + "tests/check_qwen3_next_shared_core.py::test_unimplemented_provider_profile_is_rejected", + "tests/test_qwen3_next_norm.py::test_bad_weight_shape_raises", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[16]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[1]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[2]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[32]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[48]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[64]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[8]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[128]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[2048]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_with_padding", + "tests/test_qwen3_next_norm.py::test_call_matches_forward", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[128]", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[2048]", + "tests/test_qwen3_next_norm.py::test_cuda_default_offset_preserves_plain_convention", + "tests/test_qwen3_next_norm.py::test_cuda_gated_backward_matches_autograd_golden", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_matches_golden_within_contract", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_bad_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_mismatched_gate", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_backward_uses_the_sigmoid_derivative", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_swish_is_an_alias_for_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_unit_weight_is_plain_norm_times_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_weight_offset_is_applied_in_fp32", + "tests/test_qwen3_next_norm.py::test_cuda_gated_wrapper_rejects_equal_numel_wrong_shape", + "tests/test_qwen3_next_norm.py::test_cuda_gated_zero_gate_zeroes_output", + "tests/test_qwen3_next_norm.py::test_cuda_offset_equals_explicit_fp32_weight", + "tests/test_qwen3_next_norm.py::test_cuda_offset_is_not_folded_through_bfloat16", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_backward_is_offset_aware", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_within_tolerance_of_golden", + "tests/test_qwen3_next_norm.py::test_deterministic_repeat", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype0]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype1]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype2]", + "tests/test_qwen3_next_norm.py::test_eps_inside_sqrt", + "tests/test_qwen3_next_norm.py::test_gated_batch_invariance_slice", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedHFOp]", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedOp]", + "tests/test_qwen3_next_norm.py::test_gated_conventions_diverge_in_low_precision", + "tests/test_qwen3_next_norm.py::test_gated_cuda_op_rejects_bad_activation_at_construction", + "tests/test_qwen3_next_norm.py::test_gated_extension_handles_empty_batch_and_nondefault_stream", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[dy_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[gate_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[rstd_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_shape]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_matches_hf_formula_fp32", + "tests/test_qwen3_next_norm.py::test_gated_shape_mismatch_raises", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_strict_matches_vllm_formula_fp32", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[128]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[2048]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_offset_applied_in_fp32_not_folded_into_bf16", + "tests/test_qwen3_next_norm.py::test_op_batch_invariance_on_device", + "tests/test_qwen3_next_norm.py::test_plain_reference_is_unchanged_by_the_offset_plumbing", + "tests/test_qwen3_next_norm.py::test_weight_offset_is_one", + "tests/test_qwen3_next_norm.py::test_zero_centred_cuda_constructor_rejects_missing_extension", + "tests/test_qwen3_next_norm.py::test_zero_centred_op_inherits_the_plain_reference", + "tests/test_qwen3_next_norm.py::test_zero_weight_is_identity_scaling" + ], + "case_ids_sha256": "694c931b65f9cfa5db963f2eca6d11bd309546c824a1df52f9da2ab128e83e0f", + "norm_gates": [ + "qwen3_next_rms_norm-forward.json", + "qwen3_next_rms_norm-gradient.json", + "rms_norm_gated-forward.json", + "rms_norm_gated-gradient.json" + ] + }, + "layer_requirements": { + "schema_version": 1, + "gates": { + "gdn": { + "script": "scripts/qwen3_next_tp_gdn_check.py", + "output_option": "--output", + "scope": "tp4_gdn_layer0", + "groups": { + "cases": [ + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "prompt-gradient", + "replicated-norm-gradient", + "hf-load-export" + ] + }, + "script_sha256": "cc4338893f90af004c51c20fc67d1a9a3f4bf8d26775277f72671c02983e4df5" + }, + "attention": { + "script": "scripts/qwen3_next_tp_attention_check.py", + "output_option": "--output", + "scope": "tp4_full_attention_layer3", + "groups": { + "attention.cases": [ + "hf-load-export", + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "batch4-varlen-reorder", + "sixteen-token-decode", + "prompt-gradient", + "kv-pair-gradient", + "qk-norm-gradient" + ] + }, + "script_sha256": "d27d43efb05415a8ef5892c3c2238a2b9744a4821f5466faf46c6510e6e01bec" + }, + "moe": { + "script": "scripts/qwen3_next_tp_moe_check.py", + "output_option": "--output", + "scope": "tp4_moe_block_layer0", + "groups": { + "moe.cases": [ + "hf-load-export-all512experts", + "routes-replicated-8", + "full-chunk-reorder-8", + "routes-replicated-64", + "full-chunk-reorder-64", + "routes-replicated-256", + "full-chunk-reorder-256", + "routes-replicated-1024", + "full-chunk-reorder-1024", + "training-forward", + "all-parameter-gradient", + "replicated-router-gradient" + ] + }, + "script_sha256": "d5c1bbbb82e408b65871b0cb1638d7a6cf8cfe07f0a3315a657b7dc232d544be" + }, + "adapters": { + "script": "scripts/qwen3_next_adapter_check.py", + "output_option": "--out", + "scope": "gdn_engine_adapter_component", + "groups": { + "cases": [ + "batch1-length8", + "batch1-length64", + "batch1-length256", + "batch1-length1024", + "batch4-length8", + "batch4-length64", + "batch4-length256", + "batch4-length1024", + "mixed-prefill-decode16-reorder" + ] + }, + "fields": { + "prompt_gradient": "passed", + "hf_conv_roundtrip": "passed", + "batch_invariance_capability_registered": false + }, + "script_sha256": "3ce45bb317237c1a06533116d65fb77c2a23b6f503ae46406ede543036eb0f20" + }, + "heads": { + "script": "scripts/qwen3_next_tp_head_check.py", + "output_option": "--output", + "scope": "tp4_embedding_lm_head_only", + "groups": { + "cases": [ + "hf-embedding-roundtrip", + "hf-lm-head-roundtrip", + "replicated-norm-gradient", + "nonzero-finite-embedding-head-gradient", + "embedding-repeat-100", + "batch-invariant-prompt8", + "batch-invariant-prompt64", + "batch-invariant-prompt256", + "batch-invariant-prompt1024", + "logprob-original-and-promoted-logits", + "entropy-interface" + ] + }, + "script_sha256": "0504185d21a75405c8e994bc57b016cf4ec357d8b16e7430772c11934f2af876" + } + }, + "scheduler_case_ids": [ + "p0008-b1-full", + "p0008-b1-chunked", + "p0008-b4-full", + "p0008-b4-chunked", + "p0064-b1-full", + "p0064-b1-chunked", + "p0064-b4-full", + "p0064-b4-chunked", + "p0256-b1-full", + "p0256-b1-chunked", + "p0256-b4-full", + "p0256-b4-chunked", + "p1024-b1-full", + "p1024-b1-chunked", + "p1024-b4-full", + "p1024-b4-chunked" + ], + "registry_sha256": "e3949a750cb27c1897a000f3b023f912629906612ae8949c1575d0acc36df5ec", + "case_ids_per_rank": [ + "adapters/cases/batch1-length1024", + "adapters/cases/batch1-length256", + "adapters/cases/batch1-length64", + "adapters/cases/batch1-length8", + "adapters/cases/batch4-length1024", + "adapters/cases/batch4-length256", + "adapters/cases/batch4-length64", + "adapters/cases/batch4-length8", + "adapters/cases/mixed-prefill-decode16-reorder", + "attention/attention.cases/batch4-varlen-reorder", + "attention/attention.cases/full-chunk-1024", + "attention/attention.cases/full-chunk-256", + "attention/attention.cases/full-chunk-64", + "attention/attention.cases/full-chunk-8", + "attention/attention.cases/hf-load-export", + "attention/attention.cases/kv-pair-gradient", + "attention/attention.cases/prompt-gradient", + "attention/attention.cases/qk-norm-gradient", + "attention/attention.cases/sixteen-token-decode", + "gdn/cases/full-chunk-1024", + "gdn/cases/full-chunk-256", + "gdn/cases/full-chunk-64", + "gdn/cases/full-chunk-8", + "gdn/cases/hf-load-export", + "gdn/cases/prompt-gradient", + "gdn/cases/replicated-norm-gradient", + "heads/cases/batch-invariant-prompt1024", + "heads/cases/batch-invariant-prompt256", + "heads/cases/batch-invariant-prompt64", + "heads/cases/batch-invariant-prompt8", + "heads/cases/embedding-repeat-100", + "heads/cases/entropy-interface", + "heads/cases/hf-embedding-roundtrip", + "heads/cases/hf-lm-head-roundtrip", + "heads/cases/logprob-original-and-promoted-logits", + "heads/cases/nonzero-finite-embedding-head-gradient", + "heads/cases/replicated-norm-gradient", + "moe/moe.cases/all-parameter-gradient", + "moe/moe.cases/full-chunk-reorder-1024", + "moe/moe.cases/full-chunk-reorder-256", + "moe/moe.cases/full-chunk-reorder-64", + "moe/moe.cases/full-chunk-reorder-8", + "moe/moe.cases/hf-load-export-all512experts", + "moe/moe.cases/replicated-router-gradient", + "moe/moe.cases/routes-replicated-1024", + "moe/moe.cases/routes-replicated-256", + "moe/moe.cases/routes-replicated-64", + "moe/moe.cases/routes-replicated-8", + "moe/moe.cases/training-forward" + ], + "case_ids_sha256": "be74417dfbd6031ba27978d06d04bb15daaab2aeb57d132c7e0d41176b28b46e" + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + } +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/measured-commit.txt b/docs/usage/evidence/qwen3-next-chain-b200/measured-commit.txt new file mode 100644 index 000000000..40b91b81a --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/measured-commit.txt @@ -0,0 +1 @@ +c67ec14401b0847ac96441a24acfaac0b17b77ec diff --git a/docs/usage/evidence/qwen3-next-chain-b200/preflight/checkpoint.json b/docs/usage/evidence/qwen3-next-chain-b200/preflight/checkpoint.json new file mode 100644 index 000000000..4488f19f1 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/preflight/checkpoint.json @@ -0,0 +1,14 @@ +{ + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "shards_verified": 41, + "metadata_sha256": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + } +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/preflight/device_guards.xml b/docs/usage/evidence/qwen3-next-chain-b200/preflight/device_guards.xml new file mode 100644 index 000000000..f4624846d --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/preflight/device_guards.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/usage/evidence/qwen3-next-chain-b200/preflight/environment.json b/docs/usage/evidence/qwen3-next-chain-b200/preflight/environment.json new file mode 100644 index 000000000..e7ccbb35a --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/preflight/environment.json @@ -0,0 +1,40 @@ +{ + "source_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "visible_gpu_ids": "0,1,2,3", + "execution_gpus": 4, + "python": "3.12.14 | packaged by Anaconda, Inc. | (main, Aug 27 2026, 14:46:43) [GCC 14.3.0]", + "executable": "", + "platform": "Linux-6.8.0-111-generic-x86_64-with-glibc2.39", + "versions": { + "torch": "2.13.0", + "vllm": "0.30.0", + "triton": "3.7.1", + "transformers": "5.17.0", + "flashinfer-python": "0.6.18.post1", + "safetensors": "0.8.0" + }, + "torch_cuda": "13.0", + "nvcc": "nvcc: NVIDIA (R) Cuda compiler driver\nCopyright (c) 2005-2025 NVIDIA Corporation\nBuilt on Wed_Aug_20_01:58:59_PM_PDT_2025\nCuda compilation tools, release 13.0, V13.0.88\nBuild cuda_13.0.r13.0/compiler.36424714_0\n", + "compiler": "g++ (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0\nCopyright (C) 2023 Free Software Foundation, Inc.\nThis is free software; see the source for copying conditions. There is NO\nwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n", + "nvidia_smi": "Fri Oct 9 03:11:54 2026 \n+-----------------------------------------------------------------------------------------+\n| NVIDIA-SMI 580.126.20 Driver Version: 580.126.20 CUDA Version: 13.0 |\n+-----------------------------------------+------------------------+----------------------+\n| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |\n| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |\n| | | MIG M. |\n|=========================================+========================+======================|\n| 0 NVIDIA B200 On | 00000000:1B:00.0 Off | 0 |\n| N/A 35C P0 253W / 1000W | 0MiB / 183359MiB | 0% Default |\n| | | Disabled |\n+-----------------------------------------+------------------------+----------------------+\n| 1 NVIDIA B200 On | 00000000:43:00.0 Off | 0 |\n| N/A 36C P0 254W / 1000W | 0MiB / 183359MiB | 0% Default |\n| | | Disabled |\n+-----------------------------------------+------------------------+----------------------+\n| 2 NVIDIA B200 On | 00000000:52:00.0 Off | 0 |\n| N/A 41C P0 256W / 1000W | 0MiB / 183359MiB | 0% Default |\n| | | Disabled |\n+-----------------------------------------+------------------------+----------------------+\n| 3 NVIDIA B200 On | 00000000:61:00.0 Off | 0 |\n| N/A 41C P0 256W / 1000W | 0MiB / 183359MiB | 0% Default |\n| | | Disabled |\n+-----------------------------------------+------------------------+----------------------+\n| 4 NVIDIA B200 On | 00000000:9D:00.0 Off | 0 |\n| N/A 36C P0 250W / 1000W | 0MiB / 183359MiB | 0% Default |\n| | | Disabled |\n+-----------------------------------------+------------------------+----------------------+\n| 5 NVIDIA B200 On | 00000000:C3:00.0 Off | 0 |\n| N/A 36C P0 250W / 1000W | 0MiB / 183359MiB | 0% Default |\n| | | Disabled |\n+-----------------------------------------+------------------------+----------------------+\n| 6 NVIDIA B200 On | 00000000:D1:00.0 Off | 0 |\n| N/A 42C P0 256W / 1000W | 0MiB / 183359MiB | 0% Default |\n| | | Disabled |\n+-----------------------------------------+------------------------+----------------------+\n| 7 NVIDIA B200 On | 00000000:DF:00.0 Off | 0 |\n| N/A 41C P0 253W / 1000W | 0MiB / 183359MiB | 0% Default |\n| | | Disabled |\n+-----------------------------------------+------------------------+----------------------+\n\n+-----------------------------------------------------------------------------------------+\n| Processes: |\n| GPU GI CI PID Type Process name GPU Memory |\n| ID ID Usage |\n|=========================================================================================|\n| No running processes found |\n+-----------------------------------------------------------------------------------------+\n", + "gpu_topology": "\t\u001b[4mGPU0\tGPU1\tGPU2\tGPU3\tGPU4\tGPU5\tGPU6\tGPU7\tNIC0\tNIC1\tNIC2\tNIC3\tNIC4\tNIC5\tNIC6\tNIC7\tNIC8\tNIC9\tNIC10\tNIC11\tNIC12\tNIC13\tNIC14\tNIC15\tCPU Affinity\tNUMA Affinity\tGPU NUMA ID\u001b[0m\nGPU0\t X \tNV18\tNV18\tNV18\tNV18\tNV18\tNV18\tNV18\tNODE\tNODE\tNODE\tNODE\tPXB\tNODE\tNODE\tNODE\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\t0-53,112-165\t0\t\tN/A\nGPU1\tNV18\t X \tNV18\tNV18\tNV18\tNV18\tNV18\tNV18\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\tPXB\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\t0-53,112-165\t0\t\tN/A\nGPU2\tNV18\tNV18\t X \tNV18\tNV18\tNV18\tNV18\tNV18\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\tPXB\tNODE\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\t0-53,112-165\t0\t\tN/A\nGPU3\tNV18\tNV18\tNV18\t X \tNV18\tNV18\tNV18\tNV18\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\tPXB\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\t0-53,112-165\t0\t\tN/A\nGPU4\tNV18\tNV18\tNV18\tNV18\t X \tNV18\tNV18\tNV18\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tPXB\tNODE\tNODE\tNODE\tNODE\tNODE\t56-109,168-221\t1\t\tN/A\nGPU5\tNV18\tNV18\tNV18\tNV18\tNV18\t X \tNV18\tNV18\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tNODE\tNODE\tNODE\tPXB\tNODE\tNODE\t56-109,168-221\t1\t\tN/A\nGPU6\tNV18\tNV18\tNV18\tNV18\tNV18\tNV18\t X \tNV18\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tNODE\tNODE\tNODE\tNODE\tPXB\tNODE\t56-109,168-221\t1\t\tN/A\nGPU7\tNV18\tNV18\tNV18\tNV18\tNV18\tNV18\tNV18\t X \tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tNODE\tNODE\tNODE\tNODE\tNODE\tPXB\t56-109,168-221\t1\t\tN/A\nNIC0\tNODE\tNODE\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\t X \tPIX\tPIX\tPIX\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\t\t\t\t\nNIC1\tNODE\tNODE\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tPIX\t X \tPIX\tPIX\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\t\t\t\t\nNIC2\tNODE\tNODE\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tPIX\tPIX\t X \tPIX\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\t\t\t\t\nNIC3\tNODE\tNODE\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tPIX\tPIX\tPIX\t X \tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\t\t\t\t\nNIC4\tPXB\tNODE\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tNODE\tNODE\tNODE\tNODE\t X \tNODE\tNODE\tNODE\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\t\t\t\t\nNIC5\tNODE\tNODE\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tNODE\tNODE\tNODE\tNODE\tNODE\t X \tPIX\tNODE\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\t\t\t\t\nNIC6\tNODE\tNODE\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tNODE\tNODE\tNODE\tNODE\tNODE\tPIX\t X \tNODE\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\t\t\t\t\nNIC7\tNODE\tPXB\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\t X \tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\t\t\t\t\nNIC8\tNODE\tNODE\tPXB\tNODE\tSYS\tSYS\tSYS\tSYS\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\t X \tNODE\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\t\t\t\t\nNIC9\tNODE\tNODE\tNODE\tPXB\tSYS\tSYS\tSYS\tSYS\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\tNODE\t X \tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\t\t\t\t\nNIC10\tSYS\tSYS\tSYS\tSYS\tPXB\tNODE\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\t X \tNODE\tNODE\tNODE\tNODE\tNODE\t\t\t\t\nNIC11\tSYS\tSYS\tSYS\tSYS\tNODE\tNODE\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tNODE\t X \tPIX\tNODE\tNODE\tNODE\t\t\t\t\nNIC12\tSYS\tSYS\tSYS\tSYS\tNODE\tNODE\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tNODE\tPIX\t X \tNODE\tNODE\tNODE\t\t\t\t\nNIC13\tSYS\tSYS\tSYS\tSYS\tNODE\tPXB\tNODE\tNODE\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tNODE\tNODE\tNODE\t X \tNODE\tNODE\t\t\t\t\nNIC14\tSYS\tSYS\tSYS\tSYS\tNODE\tNODE\tPXB\tNODE\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tNODE\tNODE\tNODE\tNODE\t X \tNODE\t\t\t\t\nNIC15\tSYS\tSYS\tSYS\tSYS\tNODE\tNODE\tNODE\tPXB\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tSYS\tNODE\tNODE\tNODE\tNODE\tNODE\t X \t\t\t\t\n\nLegend:\n\n X = Self\n SYS = Connection traversing PCIe as well as the SMP interconnect between NUMA nodes (e.g., QPI/UPI)\n NODE = Connection traversing PCIe as well as the interconnect between PCIe Host Bridges within a NUMA node\n PHB = Connection traversing PCIe as well as a PCIe Host Bridge (typically the CPU)\n PXB = Connection traversing multiple PCIe bridges (without traversing the PCIe Host Bridge)\n PIX = Connection traversing at most a single PCIe bridge\n NV# = Connection traversing a bonded set of # NVLinks\n\nNIC Legend:\n\n NIC0: mlx5_0\n NIC1: mlx5_1\n NIC2: mlx5_2\n NIC3: mlx5_3\n NIC4: mlx5_4\n NIC5: mlx5_5\n NIC6: mlx5_6\n NIC7: mlx5_7\n NIC8: mlx5_8\n NIC9: mlx5_9\n NIC10: mlx5_10\n NIC11: mlx5_11\n NIC12: mlx5_12\n NIC13: mlx5_13\n NIC14: mlx5_14\n NIC15: mlx5_15\n\n", + "visible_gpus": [ + "_CudaDeviceProperties(name='NVIDIA B200', major=10, minor=0, total_memory=182631MB, multi_processor_count=148, uuid=f84b0ae3-604b-7194-e772-280f5d102d46, pci_bus_id=27, pci_device_id=0, pci_domain_id=0, L2_cache_size=126MB)", + "_CudaDeviceProperties(name='NVIDIA B200', major=10, minor=0, total_memory=182631MB, multi_processor_count=148, uuid=225c7841-f606-0248-cce4-31f3ae0b215d, pci_bus_id=67, pci_device_id=0, pci_domain_id=0, L2_cache_size=126MB)", + "_CudaDeviceProperties(name='NVIDIA B200', major=10, minor=0, total_memory=182631MB, multi_processor_count=148, uuid=46fa983d-5878-1d92-4a61-197f569e8b01, pci_bus_id=82, pci_device_id=0, pci_domain_id=0, L2_cache_size=126MB)", + "_CudaDeviceProperties(name='NVIDIA B200', major=10, minor=0, total_memory=182631MB, multi_processor_count=148, uuid=79936bd2-1377-8dcf-bdb1-e6e772d0e0f3, pci_bus_id=97, pci_device_id=0, pci_domain_id=0, L2_cache_size=126MB)" + ], + "memory": { + "limits": { + "/memory.limit_in_bytes": "9223372036854771712", + "/memory.limit_in_bytes": "9223372036854771712", + "/memory.limit_in_bytes": "9223372036854771712" + }, + "cgroup_bytes": null, + "declared_bytes": 549755813888, + "effective_bytes": 549755813888, + "available_bytes": 2091552657408 + }, + "memory_requested": "512G" +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/preflight/operators.json b/docs/usage/evidence/qwen3-next-chain-b200/preflight/operators.json new file mode 100644 index 000000000..500251cce --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/preflight/operators.json @@ -0,0 +1,304 @@ +{ + "scope": "qwen3_next_operators_only", + "status": "passed", + "suite": "all", + "diagnostic_only": false, + "full_model_l2": "not_evaluated", + "git_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "git_dirty": false, + "versions": { + "torch": "2.13.0", + "vllm": "0.30.0", + "transformers": "5.17.0", + "triton": "3.7.1" + }, + "mandatory_case_ids": [ + "tests/check_qwen3_next_attention.py::test_d256_backward_with_cached_prefix_matches_float64_formula", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[1024]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[256]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[64]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[8]", + "tests/check_qwen3_next_attention.py::test_d256_input_device_guard_and_nondefault_stream", + "tests/check_qwen3_next_attention.py::test_native_backward_rejects_malformed_probability_and_gradient_buffers", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[0]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[2]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_target_inputs_do_not_depend_on_companions", + "tests/check_qwen3_next_batch_invariance.py::test_triton_chunked_prefill_is_batch_invariant", + "tests/check_qwen3_next_conv_bridge.py::test_chunked_and_reordered_sequences_match", + "tests/check_qwen3_next_conv_bridge.py::test_empty_sequence_preserves_cache_and_gradients", + "tests/check_qwen3_next_conv_bridge.py::test_response_gradient_reaches_prompt_and_convolution_weight", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths0]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths1]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths2]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-4]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[1]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[4]", + "tests/check_qwen3_next_core_matrix.py::test_variable_lengths_empty_and_mixed_step_match_independent_sequences", + "tests/check_qwen3_next_forward.py::test_combine_has_fixed_route_order_and_differentiable_weights", + "tests/check_qwen3_next_forward.py::test_full_vocabulary_logprob_entropy_modes_and_gradient", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_fail_closed_on_the_tensor_descriptor_path", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[128]", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[512]", + "tests/check_qwen3_next_forward.py::test_logprob_nan_rejected_before_comparison", + "tests/check_qwen3_next_forward.py::test_moe_vjp_matches_independent_double_formula", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[1024-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[128-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-16]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-256]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-3072]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-37984]", + "tests/check_qwen3_next_forward.py::test_qwen_moe_actual_tp4_shapes_and_independent_training_forward", + "tests/check_qwen3_next_forward.py::test_route_weights_are_batch_invariant", + "tests/check_qwen3_next_forward.py::test_shared_linear_vjp_and_empty_tokens", + "tests/check_qwen3_next_forward.py::test_stable_route_tie_boundary_and_router_gradient", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_backward_matches_recomputed_recurrence_vjp", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_forward_is_provider_exact_and_does_not_mutate_inputs", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_keeps_prompt_state_gradient_through_response", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[False]", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[True]", + "tests/check_qwen3_next_gdn_bridge.py::test_initial_state_vjp_matches_provider_directional_difference", + "tests/check_qwen3_next_gdn_sequence.py::test_1024_token_chunk_continuation_is_bitwise_exact", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad0]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad1]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad2]", + "tests/check_qwen3_next_gdn_sequence.py::test_chunk_boundary_retains_prompt_and_initial_state_gradients", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths0]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths1]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths2]", + "tests/check_qwen3_next_gdn_sequence.py::test_reserved_and_duplicate_slots_are_rejected", + "tests/check_qwen3_next_norm_providers.py::test_custom_op_has_distinct_native_and_cuda_paths", + "tests/check_qwen3_next_norm_providers.py::test_gdn_decode_provider_env_defaults_are_recorded", + "tests/check_qwen3_next_norm_providers.py::test_our_gated_op_is_batch_invariant", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_cuda]", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_native]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots0]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots2]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots3]", + "tests/check_qwen3_next_shared_core.py::test_independent_training_forward_matches_inference_and_retains_gradients", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[1024]", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[8]", + "tests/check_qwen3_next_shared_core.py::test_unimplemented_provider_profile_is_rejected", + "tests/test_qwen3_next_norm.py::test_bad_weight_shape_raises", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[16]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[1]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[2]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[32]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[48]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[64]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[8]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[128]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[2048]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_with_padding", + "tests/test_qwen3_next_norm.py::test_call_matches_forward", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[128]", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[2048]", + "tests/test_qwen3_next_norm.py::test_cuda_default_offset_preserves_plain_convention", + "tests/test_qwen3_next_norm.py::test_cuda_gated_backward_matches_autograd_golden", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_matches_golden_within_contract", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_bad_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_mismatched_gate", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_backward_uses_the_sigmoid_derivative", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_swish_is_an_alias_for_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_unit_weight_is_plain_norm_times_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_weight_offset_is_applied_in_fp32", + "tests/test_qwen3_next_norm.py::test_cuda_gated_wrapper_rejects_equal_numel_wrong_shape", + "tests/test_qwen3_next_norm.py::test_cuda_gated_zero_gate_zeroes_output", + "tests/test_qwen3_next_norm.py::test_cuda_offset_equals_explicit_fp32_weight", + "tests/test_qwen3_next_norm.py::test_cuda_offset_is_not_folded_through_bfloat16", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_backward_is_offset_aware", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_within_tolerance_of_golden", + "tests/test_qwen3_next_norm.py::test_deterministic_repeat", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype0]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype1]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype2]", + "tests/test_qwen3_next_norm.py::test_eps_inside_sqrt", + "tests/test_qwen3_next_norm.py::test_gated_batch_invariance_slice", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedHFOp]", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedOp]", + "tests/test_qwen3_next_norm.py::test_gated_conventions_diverge_in_low_precision", + "tests/test_qwen3_next_norm.py::test_gated_cuda_op_rejects_bad_activation_at_construction", + "tests/test_qwen3_next_norm.py::test_gated_extension_handles_empty_batch_and_nondefault_stream", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[dy_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[gate_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[rstd_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_shape]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_matches_hf_formula_fp32", + "tests/test_qwen3_next_norm.py::test_gated_shape_mismatch_raises", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_strict_matches_vllm_formula_fp32", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[128]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[2048]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_offset_applied_in_fp32_not_folded_into_bf16", + "tests/test_qwen3_next_norm.py::test_op_batch_invariance_on_device", + "tests/test_qwen3_next_norm.py::test_plain_reference_is_unchanged_by_the_offset_plumbing", + "tests/test_qwen3_next_norm.py::test_weight_offset_is_one", + "tests/test_qwen3_next_norm.py::test_zero_centred_cuda_constructor_rejects_missing_extension", + "tests/test_qwen3_next_norm.py::test_zero_centred_op_inherits_the_plain_reference", + "tests/test_qwen3_next_norm.py::test_zero_weight_is_identity_scaling" + ], + "case_ids_sha256": "694c931b65f9cfa5db963f2eca6d11bd309546c824a1df52f9da2ab128e83e0f", + "pytest_exit_code": 0, + "provider_tests": { + "tests": 233, + "failures": 0, + "errors": 0, + "skipped": 0 + }, + "norm_gates": { + "qwen3_next_rms_norm-forward.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + }, + "qwen3_next_rms_norm-gradient.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + }, + "rms_norm_gated-forward.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + }, + "rms_norm_gated-gradient.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + } + } +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/preflight/result.json b/docs/usage/evidence/qwen3-next-chain-b200/preflight/result.json new file mode 100644 index 000000000..5458370f0 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/preflight/result.json @@ -0,0 +1,797 @@ +{ + "contract_version": 4, + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "cuda_identity": { + "home": "", + "nvcc_sha256": "b8e2347d9d7fcadf8812a27324d515de99d033d3e48611811ece7e66d7895f8a" + }, + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "operator_requirements": { + "suite": "all", + "case_ids": [ + "tests/check_qwen3_next_attention.py::test_d256_backward_with_cached_prefix_matches_float64_formula", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[1024]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[256]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[64]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[8]", + "tests/check_qwen3_next_attention.py::test_d256_input_device_guard_and_nondefault_stream", + "tests/check_qwen3_next_attention.py::test_native_backward_rejects_malformed_probability_and_gradient_buffers", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[0]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[2]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_target_inputs_do_not_depend_on_companions", + "tests/check_qwen3_next_batch_invariance.py::test_triton_chunked_prefill_is_batch_invariant", + "tests/check_qwen3_next_conv_bridge.py::test_chunked_and_reordered_sequences_match", + "tests/check_qwen3_next_conv_bridge.py::test_empty_sequence_preserves_cache_and_gradients", + "tests/check_qwen3_next_conv_bridge.py::test_response_gradient_reaches_prompt_and_convolution_weight", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths0]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths1]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths2]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-4]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[1]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[4]", + "tests/check_qwen3_next_core_matrix.py::test_variable_lengths_empty_and_mixed_step_match_independent_sequences", + "tests/check_qwen3_next_forward.py::test_combine_has_fixed_route_order_and_differentiable_weights", + "tests/check_qwen3_next_forward.py::test_full_vocabulary_logprob_entropy_modes_and_gradient", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_fail_closed_on_the_tensor_descriptor_path", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[128]", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[512]", + "tests/check_qwen3_next_forward.py::test_logprob_nan_rejected_before_comparison", + "tests/check_qwen3_next_forward.py::test_moe_vjp_matches_independent_double_formula", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[1024-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[128-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-16]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-256]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-3072]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-37984]", + "tests/check_qwen3_next_forward.py::test_qwen_moe_actual_tp4_shapes_and_independent_training_forward", + "tests/check_qwen3_next_forward.py::test_route_weights_are_batch_invariant", + "tests/check_qwen3_next_forward.py::test_shared_linear_vjp_and_empty_tokens", + "tests/check_qwen3_next_forward.py::test_stable_route_tie_boundary_and_router_gradient", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_backward_matches_recomputed_recurrence_vjp", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_forward_is_provider_exact_and_does_not_mutate_inputs", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_keeps_prompt_state_gradient_through_response", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[False]", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[True]", + "tests/check_qwen3_next_gdn_bridge.py::test_initial_state_vjp_matches_provider_directional_difference", + "tests/check_qwen3_next_gdn_sequence.py::test_1024_token_chunk_continuation_is_bitwise_exact", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad0]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad1]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad2]", + "tests/check_qwen3_next_gdn_sequence.py::test_chunk_boundary_retains_prompt_and_initial_state_gradients", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths0]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths1]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths2]", + "tests/check_qwen3_next_gdn_sequence.py::test_reserved_and_duplicate_slots_are_rejected", + "tests/check_qwen3_next_norm_providers.py::test_custom_op_has_distinct_native_and_cuda_paths", + "tests/check_qwen3_next_norm_providers.py::test_gdn_decode_provider_env_defaults_are_recorded", + "tests/check_qwen3_next_norm_providers.py::test_our_gated_op_is_batch_invariant", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_cuda]", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_native]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots0]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots2]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots3]", + "tests/check_qwen3_next_shared_core.py::test_independent_training_forward_matches_inference_and_retains_gradients", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[1024]", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[8]", + "tests/check_qwen3_next_shared_core.py::test_unimplemented_provider_profile_is_rejected", + "tests/test_qwen3_next_norm.py::test_bad_weight_shape_raises", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[16]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[1]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[2]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[32]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[48]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[64]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[8]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[128]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[2048]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_with_padding", + "tests/test_qwen3_next_norm.py::test_call_matches_forward", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[128]", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[2048]", + "tests/test_qwen3_next_norm.py::test_cuda_default_offset_preserves_plain_convention", + "tests/test_qwen3_next_norm.py::test_cuda_gated_backward_matches_autograd_golden", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_matches_golden_within_contract", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_bad_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_mismatched_gate", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_backward_uses_the_sigmoid_derivative", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_swish_is_an_alias_for_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_unit_weight_is_plain_norm_times_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_weight_offset_is_applied_in_fp32", + "tests/test_qwen3_next_norm.py::test_cuda_gated_wrapper_rejects_equal_numel_wrong_shape", + "tests/test_qwen3_next_norm.py::test_cuda_gated_zero_gate_zeroes_output", + "tests/test_qwen3_next_norm.py::test_cuda_offset_equals_explicit_fp32_weight", + "tests/test_qwen3_next_norm.py::test_cuda_offset_is_not_folded_through_bfloat16", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_backward_is_offset_aware", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_within_tolerance_of_golden", + "tests/test_qwen3_next_norm.py::test_deterministic_repeat", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype0]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype1]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype2]", + "tests/test_qwen3_next_norm.py::test_eps_inside_sqrt", + "tests/test_qwen3_next_norm.py::test_gated_batch_invariance_slice", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedHFOp]", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedOp]", + "tests/test_qwen3_next_norm.py::test_gated_conventions_diverge_in_low_precision", + "tests/test_qwen3_next_norm.py::test_gated_cuda_op_rejects_bad_activation_at_construction", + "tests/test_qwen3_next_norm.py::test_gated_extension_handles_empty_batch_and_nondefault_stream", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[dy_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[gate_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[rstd_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_shape]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_matches_hf_formula_fp32", + "tests/test_qwen3_next_norm.py::test_gated_shape_mismatch_raises", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_strict_matches_vllm_formula_fp32", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[128]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[2048]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_offset_applied_in_fp32_not_folded_into_bf16", + "tests/test_qwen3_next_norm.py::test_op_batch_invariance_on_device", + "tests/test_qwen3_next_norm.py::test_plain_reference_is_unchanged_by_the_offset_plumbing", + "tests/test_qwen3_next_norm.py::test_weight_offset_is_one", + "tests/test_qwen3_next_norm.py::test_zero_centred_cuda_constructor_rejects_missing_extension", + "tests/test_qwen3_next_norm.py::test_zero_centred_op_inherits_the_plain_reference", + "tests/test_qwen3_next_norm.py::test_zero_weight_is_identity_scaling" + ], + "case_ids_sha256": "694c931b65f9cfa5db963f2eca6d11bd309546c824a1df52f9da2ab128e83e0f", + "norm_gates": [ + "qwen3_next_rms_norm-forward.json", + "qwen3_next_rms_norm-gradient.json", + "rms_norm_gated-forward.json", + "rms_norm_gated-gradient.json" + ] + }, + "layer_requirements": { + "schema_version": 1, + "gates": { + "gdn": { + "script": "scripts/qwen3_next_tp_gdn_check.py", + "output_option": "--output", + "scope": "tp4_gdn_layer0", + "groups": { + "cases": [ + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "prompt-gradient", + "replicated-norm-gradient", + "hf-load-export" + ] + }, + "script_sha256": "cc4338893f90af004c51c20fc67d1a9a3f4bf8d26775277f72671c02983e4df5" + }, + "attention": { + "script": "scripts/qwen3_next_tp_attention_check.py", + "output_option": "--output", + "scope": "tp4_full_attention_layer3", + "groups": { + "attention.cases": [ + "hf-load-export", + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "batch4-varlen-reorder", + "sixteen-token-decode", + "prompt-gradient", + "kv-pair-gradient", + "qk-norm-gradient" + ] + }, + "script_sha256": "d27d43efb05415a8ef5892c3c2238a2b9744a4821f5466faf46c6510e6e01bec" + }, + "moe": { + "script": "scripts/qwen3_next_tp_moe_check.py", + "output_option": "--output", + "scope": "tp4_moe_block_layer0", + "groups": { + "moe.cases": [ + "hf-load-export-all512experts", + "routes-replicated-8", + "full-chunk-reorder-8", + "routes-replicated-64", + "full-chunk-reorder-64", + "routes-replicated-256", + "full-chunk-reorder-256", + "routes-replicated-1024", + "full-chunk-reorder-1024", + "training-forward", + "all-parameter-gradient", + "replicated-router-gradient" + ] + }, + "script_sha256": "d5c1bbbb82e408b65871b0cb1638d7a6cf8cfe07f0a3315a657b7dc232d544be" + }, + "adapters": { + "script": "scripts/qwen3_next_adapter_check.py", + "output_option": "--out", + "scope": "gdn_engine_adapter_component", + "groups": { + "cases": [ + "batch1-length8", + "batch1-length64", + "batch1-length256", + "batch1-length1024", + "batch4-length8", + "batch4-length64", + "batch4-length256", + "batch4-length1024", + "mixed-prefill-decode16-reorder" + ] + }, + "fields": { + "prompt_gradient": "passed", + "hf_conv_roundtrip": "passed", + "batch_invariance_capability_registered": false + }, + "script_sha256": "3ce45bb317237c1a06533116d65fb77c2a23b6f503ae46406ede543036eb0f20" + }, + "heads": { + "script": "scripts/qwen3_next_tp_head_check.py", + "output_option": "--output", + "scope": "tp4_embedding_lm_head_only", + "groups": { + "cases": [ + "hf-embedding-roundtrip", + "hf-lm-head-roundtrip", + "replicated-norm-gradient", + "nonzero-finite-embedding-head-gradient", + "embedding-repeat-100", + "batch-invariant-prompt8", + "batch-invariant-prompt64", + "batch-invariant-prompt256", + "batch-invariant-prompt1024", + "logprob-original-and-promoted-logits", + "entropy-interface" + ] + }, + "script_sha256": "0504185d21a75405c8e994bc57b016cf4ec357d8b16e7430772c11934f2af876" + } + }, + "scheduler_case_ids": [ + "p0008-b1-full", + "p0008-b1-chunked", + "p0008-b4-full", + "p0008-b4-chunked", + "p0064-b1-full", + "p0064-b1-chunked", + "p0064-b4-full", + "p0064-b4-chunked", + "p0256-b1-full", + "p0256-b1-chunked", + "p0256-b4-full", + "p0256-b4-chunked", + "p1024-b1-full", + "p1024-b1-chunked", + "p1024-b4-full", + "p1024-b4-chunked" + ], + "registry_sha256": "e3949a750cb27c1897a000f3b023f912629906612ae8949c1575d0acc36df5ec", + "case_ids_per_rank": [ + "adapters/cases/batch1-length1024", + "adapters/cases/batch1-length256", + "adapters/cases/batch1-length64", + "adapters/cases/batch1-length8", + "adapters/cases/batch4-length1024", + "adapters/cases/batch4-length256", + "adapters/cases/batch4-length64", + "adapters/cases/batch4-length8", + "adapters/cases/mixed-prefill-decode16-reorder", + "attention/attention.cases/batch4-varlen-reorder", + "attention/attention.cases/full-chunk-1024", + "attention/attention.cases/full-chunk-256", + "attention/attention.cases/full-chunk-64", + "attention/attention.cases/full-chunk-8", + "attention/attention.cases/hf-load-export", + "attention/attention.cases/kv-pair-gradient", + "attention/attention.cases/prompt-gradient", + "attention/attention.cases/qk-norm-gradient", + "attention/attention.cases/sixteen-token-decode", + "gdn/cases/full-chunk-1024", + "gdn/cases/full-chunk-256", + "gdn/cases/full-chunk-64", + "gdn/cases/full-chunk-8", + "gdn/cases/hf-load-export", + "gdn/cases/prompt-gradient", + "gdn/cases/replicated-norm-gradient", + "heads/cases/batch-invariant-prompt1024", + "heads/cases/batch-invariant-prompt256", + "heads/cases/batch-invariant-prompt64", + "heads/cases/batch-invariant-prompt8", + "heads/cases/embedding-repeat-100", + "heads/cases/entropy-interface", + "heads/cases/hf-embedding-roundtrip", + "heads/cases/hf-lm-head-roundtrip", + "heads/cases/logprob-original-and-promoted-logits", + "heads/cases/nonzero-finite-embedding-head-gradient", + "heads/cases/replicated-norm-gradient", + "moe/moe.cases/all-parameter-gradient", + "moe/moe.cases/full-chunk-reorder-1024", + "moe/moe.cases/full-chunk-reorder-256", + "moe/moe.cases/full-chunk-reorder-64", + "moe/moe.cases/full-chunk-reorder-8", + "moe/moe.cases/hf-load-export-all512experts", + "moe/moe.cases/replicated-router-gradient", + "moe/moe.cases/routes-replicated-1024", + "moe/moe.cases/routes-replicated-256", + "moe/moe.cases/routes-replicated-64", + "moe/moe.cases/routes-replicated-8", + "moe/moe.cases/training-forward" + ], + "case_ids_sha256": "be74417dfbd6031ba27978d06d04bb15daaab2aeb57d132c7e0d41176b28b46e" + }, + "source_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "run_id": "20261009T031116Z-preflight-c67ec144-430891a5", + "stage": "preflight", + "suite": "all", + "execution_id": "430891a5bf164e1387feafceeadf2d43", + "attempt": "0", + "status": "passed", + "phase": "complete", + "scope": "four_gpu_infrastructure_and_operators_only", + "full_model_l2": "not_evaluated", + "evidence": { + "operators": { + "path": "attempts/0/operators/summary.json", + "sha256": "dedb24b6ac2a01d37eb795a001376ca0b200a03e417f8131688aac67c19c2ebd" + }, + "environment": { + "path": "attempts/0/environment.json", + "sha256": "5bae9cd9e76ff901168160af83cda3820a84008d32bbb2fe9e049cc8c9f666aa" + }, + "device_guards": { + "path": "attempts/0/device-guards.xml", + "sha256": "8682d7d2230a2c231890deb3861a03e08c675bbdf6cd9b9505205c2c34da1e22" + }, + "tp4": { + "path": "attempts/0/tp4.json", + "sha256": "94b8471a1b6c0c75c0af44a25f62b50d633bce4429a8f5de40cc7ab3ef721a9e" + }, + "checkpoint": { + "path": "attempts/0/checkpoint.json", + "sha256": "7ceb9dab2ce8c0a2551a970819f9f0adbb538f04c4124982458a42f997d7c934" + }, + "rollout_smoke": { + "path": "attempts/0/rollout-smoke.json", + "sha256": "f5427f8ff01398280f1a8b216a15702f7f344e947a000e1255f062d1e45801f0" + } + }, + "checkpoint": { + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "shards_verified": 41, + "metadata_sha256": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + } + }, + "provider_paths": { + "norm": "/source/rl_engine/_C.cpython-312-x86_64-linux-gnu.so", + "gdn": "vllm.third_party.flash_linear_attention.ops.fused_recurrent.fused_recurrent_gated_delta_rule_packed_decode" + } +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/preflight/rollout_smoke.json b/docs/usage/evidence/qwen3-next-chain-b200/preflight/rollout_smoke.json new file mode 100644 index 000000000..4029711ca --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/preflight/rollout_smoke.json @@ -0,0 +1,75 @@ +{ + "scope": "rollout_smoke_only", + "full_model_l2": "not_evaluated", + "batch_invariant_requested": false, + "moe_backend": "triton", + "model": "", + "tensor_parallel_size": 4, + "results": [ + { + "prompt_token_ids": [ + 785, + 6722, + 315, + 9625, + 374 + ], + "response_token_ids": [ + 12095, + 13, + 576, + 6722, + 315, + 9856, + 374, + 19846 + ], + "selected_logprobs": [ + -0.14352020621299744, + -0.7613688111305237, + -0.7894042134284973, + -0.4375315308570862, + -0.031600143760442734, + -1.0866872072219849, + -0.00048828122089616954, + -0.015291244722902775 + ], + "text": " Paris. The capital of Germany is Berlin" + }, + { + "prompt_token_ids": [ + 47866, + 220, + 22, + 5519, + 220, + 20, + 13, + 576, + 1102, + 374 + ], + "response_token_ids": [ + 510, + 32, + 13, + 220, + 16, + 16, + 198, + 33 + ], + "selected_logprobs": [ + -0.6616742610931396, + -0.00334596517495811, + -0.001652424456551671, + -0.5070273876190186, + -0.07833854109048843, + -1.0462173223495483, + -0.0008693729760125279, + -1.5497195136049413e-06 + ], + "text": ":\nA. 11\nB" + } + ] +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/preflight/run.json b/docs/usage/evidence/qwen3-next-chain-b200/preflight/run.json new file mode 100644 index 000000000..d7104619b --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/preflight/run.json @@ -0,0 +1,5248 @@ +{ + "run_id": "20261009T031116Z-preflight-c67ec144-430891a5", + "execution_id": "430891a5bf164e1387feafceeadf2d43", + "contract_version": 4, + "suite": "all", + "execution_gpus": 4, + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "stage": "preflight", + "source_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "source": "/source", + "python": "", + "cuda_home": "", + "checkpoint": "", + "memory": "512G", + "previous": null, + "status": "prepared", + "full_model_l2": "not_evaluated", + "environment": { + "identity": { + "base_prefix": "/miniconda3/envs/rlkernel", + "binary": "/python3.12", + "binary_sha256": "6a1eb3ffc29f3a6b0ece607b016b4cfa5ca3ac57b34f17ed3266b404f78d2729", + "build_tools": { + "ninja": { + "path": "/miniconda3/envs/rlkernel/bin/ninja", + "sha256": "08639e194fffa7f08b259fc4abfa4803aff66b64de52549cee42ec527d55cea6" + } + }, + "distributions": [ + { + "direct_url": null, + "metadata_sha256": "6f1038270be40f9b8c0bcf391c627e7d7f41ccdd19aa192d6eac1dbfc3b19abc", + "name": "GitPython", + "version": "3.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "3f71971502087521f123c9daa26bc12d31d3466738b567390b8602acad3be22a", + "name": "Jinja2", + "version": "3.1.6" + }, + { + "direct_url": null, + "metadata_sha256": "818fb343b7b6b99a32771bf4813521ae6440b4c7579b3ae46e32dd02da0afeee", + "name": "Markdown", + "version": "3.11" + }, + { + "direct_url": null, + "metadata_sha256": "dc1ee42cf8ecfeee0ab60b15b21d291833e0732548efcb7bb5b3564dca3e5bf7", + "name": "MarkupSafe", + "version": "3.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "de7389b142450a0014234286b0876f328439b823c355c73d0aed41fd67ec208c", + "name": "PyJWT", + "version": "2.15.1" + }, + { + "direct_url": null, + "metadata_sha256": "ffcad4415cafb22b8b536a61595e9ee13438b51d31b0763c1b273ce3bc58e840", + "name": "PyYAML", + "version": "6.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "8562d701cc52d9cafbb418942b0e072fc087ed8ddcf35cd10224c1b2ed8bdd91", + "name": "Pygments", + "version": "2.21.0" + }, + { + "direct_url": null, + "metadata_sha256": "b6c25fcfdcc495edf248a10ca4ad28327ef2ed6047a6ec5c6346e121414c7f21", + "name": "Werkzeug", + "version": "3.1.9" + }, + { + "direct_url": null, + "metadata_sha256": "55c400d24c71b581d9c0992f71df6047cf6c878bebe61a7d45d6e02dc0e4c510", + "name": "absl-py", + "version": "2.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "13db521f90a6a882027b2388eaa2ebf252945f9c2adb7e7e371da18239da4df0", + "name": "accelerate", + "version": "1.15.0" + }, + { + "direct_url": null, + "metadata_sha256": "86fe44e38e67872dd895c729044942ba2c2f934ae439a899fb83a186206b7fd4", + "name": "agent-detector", + "version": "2.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "afe11fe9f5aa54e734cdd51659bed8c89dc6bcd5aef0ad96f2d20149c8de5456", + "name": "aiohappyeyeballs", + "version": "2.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "570b307bc0b53fbbd3ed2ce0b7eca6bbf2fa73bf75e24a480f1034d8c0b832bf", + "name": "aiohttp", + "version": "3.14.3" + }, + { + "direct_url": null, + "metadata_sha256": "44b7f8e14c4770793e747fad50c9e0a6ee7357651d878554f192d94768dc14a8", + "name": "aiohttp-cors", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "648813a44a9ae0ab2f20ee86d2404dcc38e3f9e80c63316cf6e536735df14e54", + "name": "aiosignal", + "version": "1.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "f6a3f6668bacef7f73a2c19ccb2be910b2363d1731c4725cb04364d99e24935a", + "name": "annotated-doc", + "version": "0.0.5" + }, + { + "direct_url": null, + "metadata_sha256": "fc6d752cde6a6a4bff03474386de750e130b75da3c7815ee909f45b51fea98c8", + "name": "annotated-types", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "4e89d670a4b20029da30e5a9e8ebcbc844deff9c44209552bafd5537249c8b9e", + "name": "anthropic", + "version": "1.9.0" + }, + { + "direct_url": null, + "metadata_sha256": "b5a6f00800956387fcddab1fe1b5aa8502c249b86cfb16d58ed700f282f60142", + "name": "antlr4-python3-runtime", + "version": "4.9.3" + }, + { + "direct_url": null, + "metadata_sha256": "a6008defa9492cd08250217b134782cad1db4580e1d7ddf69cc2a2a48cea24e0", + "name": "anyio", + "version": "4.15.1" + }, + { + "direct_url": null, + "metadata_sha256": "7877c64ce8957237363f2df313819bb07f50752df016d14c5a5a99bec10f5deb", + "name": "apache-tvm-ffi", + "version": "0.1.11" + }, + { + "direct_url": null, + "metadata_sha256": "3543ca8f0e072c00ab111b20eba99ce86dbf93ada28988775bc2677284b3c07a", + "name": "astor", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "d4b328c09c024fe1e4d788a9c7715ad726095131b815cd35fd933268226f6269", + "name": "attrs", + "version": "26.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "4850c4d696a5e2a2ecbb3dd792b060acc1de79e09800669b0b9fc3a22c055e6d", + "name": "av", + "version": "19.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "863ff92208d0a02dabfa008bfe91846a5c401ded301e5687dca7dc63c911865f", + "name": "babel", + "version": "2.18.0" + }, + { + "direct_url": null, + "metadata_sha256": "f32e6df3197f05202e586624d95c5e217003d80cee655c165d533102f628df21", + "name": "backrefs", + "version": "8.0" + }, + { + "direct_url": null, + "metadata_sha256": "905c362f655fbc6d37a24686efc2b3bfbd3123b8ee5a443a43f6750d87455e90", + "name": "blake3", + "version": "1.0.10" + }, + { + "direct_url": null, + "metadata_sha256": "07c85682b6aefd5c9b48890d306c1604311902295704892ede48e5a83219a8d3", + "name": "blobfile", + "version": "3.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "2d582941a7081625a35f35a0c4a2e80f7737312e29c38e5fdb6fc08f9c113077", + "name": "bracex", + "version": "3.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "3b60c55bae0d0340c3a3fd918635bbfa3087579da66e0fd7f6be7a3782c0da3d", + "name": "cachetools", + "version": "7.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "5d11a6878d5bc3f22290281a19ef7b36daa95c910780950608b95cd788c7e12e", + "name": "cbor2", + "version": "6.1.4" + }, + { + "direct_url": null, + "metadata_sha256": "362c9942c48051f168ed2b9f2146266b7792d3c05e164cd6afc3f3b65884fdc9", + "name": "certifi", + "version": "2026.7.22" + }, + { + "direct_url": null, + "metadata_sha256": "b4abf1bcf1c1d8e0272d8007fc974499ea59e5f2a5b98af3c78a5e67515a9d87", + "name": "cffi", + "version": "2.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "766120f13c177446f51929a4d201104bc935b6d5a2a176cd6716edce757d3d95", + "name": "cfgv", + "version": "3.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "610e9a9d03ce837ffe6e42be5e02e70087f73863f7350bf7bb7f0511edcc5ec0", + "name": "charset-normalizer", + "version": "3.5.2" + }, + { + "direct_url": null, + "metadata_sha256": "7ad836b3147c9702546d9c28b4fa5be23b24445439db5d0d2a58d17281c84daa", + "name": "click", + "version": "8.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "4c5f00599ebcbf11d337e48a72784d256ca3d704fa9e9f5daadd60065e6776b7", + "name": "cloudpickle", + "version": "3.1.2" + }, + { + "direct_url": null, + "metadata_sha256": "a0970189e3ab7a596d6902d5f61f93b414f138f03d3cf19029145657bfceb382", + "name": "cmake", + "version": "4.1.2" + }, + { + "direct_url": null, + "metadata_sha256": "94a6ebf9718e55f254a43ce0d2f04e0d6d44e7141b6f3144a84feb6519a77bfd", + "name": "colorama", + "version": "0.4.6" + }, + { + "direct_url": null, + "metadata_sha256": "ca8ec227f406d970a645ec482b20619128dd34b9cf71159cc24e27db461a2711", + "name": "colorful", + "version": "0.5.8" + }, + { + "direct_url": null, + "metadata_sha256": "bbaa51b7e4d8f142bd075d01257c0572c0c844796d51426e35c8096a13e8da76", + "name": "compressed-tensors", + "version": "0.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "6063d8ff7ebc458d63a4332853d7ababf4ee2b86336362c8d2b12be6e998eb6b", + "name": "connectrpc", + "version": "0.11.1" + }, + { + "direct_url": null, + "metadata_sha256": "ac5f4b5a5f68080bd9c3fe77399fe8a1bff2ee5923c49db1df544dd054cbf15b", + "name": "cryptography", + "version": "50.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "f41d2f6b4616accca2f5e1dd47aa9e8937c28076cde698226d93e727751f3099", + "name": "cuda-bindings", + "version": "13.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "e5ca6ed34c687c6f4a4d157ad0a2cf06ec0316fe8c4c0ddeb666ad76dd6f30f4", + "name": "cuda-core", + "version": "1.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "89baadd9da23dce9990481519544115615ba3cbd2d1a41e09feea7756fffb378", + "name": "cuda-pathfinder", + "version": "1.8.2" + }, + { + "direct_url": null, + "metadata_sha256": "1ab914b9a57ca601df2e3cfe9608427b15d8afb78029076ace5d1caf9fd45f08", + "name": "cuda-python", + "version": "13.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "73d97a5eb578223b4895ef4f234574d14219cef9999ff7d0e92a3d0dd057bd3f", + "name": "cuda-tile", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "ae6f957fe66ed63081d1d83ee6e8838f3a0af2c6fce1223629d0dd6264565ead", + "name": "cuda-toolkit", + "version": "13.0.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "1f8e0ae51ad5feea63f58ed2e24f3da6f23ed548043235a14f7623d961dd9b64", + "name": "datasets", + "version": "5.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "153f4a4d6ff03dbe5c8ad7fe54bc2e7b989a4947b70f7aa77fbf652b394f2a2e", + "name": "depyf", + "version": "0.20.0" + }, + { + "direct_url": null, + "metadata_sha256": "ee09fc752d7271aac93079cfd63409957dc6b536c1ffd9355a01bf7297e72aa6", + "name": "detect-installer", + "version": "0.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "a7feab2c4f69fd5f85e5a3cb495a7f1870a6bf8199dcee5339e8118f7acbdc09", + "name": "dill", + "version": "0.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "fef3fde661fe30ba7bd1d78841a797136b2b3461705bb4eb92dc54f8308bbaae", + "name": "distlib", + "version": "0.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "fef3fde661fe30ba7bd1d78841a797136b2b3461705bb4eb92dc54f8308bbaae", + "name": "distlib", + "version": "0.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "a3ca2e39abe76c4a33d5fe4a2a84375ec9f25cdfdb7e1d8ea406bd6f1603205c", + "name": "dnspython", + "version": "2.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "92a07daad5e6ff461199de14e845d9b376e309ef916ce5379f3c9cd4e3b1623f", + "name": "dockerfile-parse", + "version": "2.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "5b566b25f0cbe4955d0b16844a7cc6d2002caa3bde2dfda7f301fd8870cbaa56", + "name": "docstring_parser", + "version": "0.18.0" + }, + { + "direct_url": null, + "metadata_sha256": "5a1080b5768c6c591e1c4f9c9812cafa808781b9eeb198043bf185e22d4a1613", + "name": "e2b", + "version": "2.51.0" + }, + { + "direct_url": null, + "metadata_sha256": "0a63979e0b946e16238e4339e60d9c1eb5a7ce3ea93dae78b5da9c65a6190540", + "name": "einops", + "version": "0.8.2" + }, + { + "direct_url": null, + "metadata_sha256": "16cbe67a57558f1d4bfdbc22a454434ba301750c57a62b1d3f5361c9e5cddc00", + "name": "email-validator", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "0617ddb55b90b42ddc9398dc7e91d61fe928a2504939f76526dc15b22d238caa", + "name": "fastapi", + "version": "0.136.3" + }, + { + "direct_url": null, + "metadata_sha256": "ddd82b9666c21988e234d623e2575e1b89fd4133260eeab43fc9a7c074f7024a", + "name": "fastapi-cli", + "version": "0.0.32" + }, + { + "direct_url": null, + "metadata_sha256": "611602e834d42e10433155ff5f5581358d732fa6b6f6f7820a8f79e74b1ce1f9", + "name": "fastapi-cloud-cli", + "version": "0.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "794524e4a9659bda6043721d848d028ea49996085a33326094fbaaa3f6e6b895", + "name": "fastar", + "version": "0.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "711401d36e60e10e35beb4d0f1bb42bf0c4d86339ae52f32b9aa4a4d790530dd", + "name": "fastsafetensors", + "version": "0.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "efaea9742e348c4c4bdcc6f616a33cc5aa3ae926494a72a46690b7da2f08ed5c", + "name": "filelock", + "version": "4.0.7" + }, + { + "direct_url": null, + "metadata_sha256": "99bd6c3f10781d3d2d350f2c3c9fc4765b55f25de8a6d6dd1f71501802d1255e", + "name": "fla-core", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "0a6ef979b75295cee2b5293ad4942b0cf2682e9e38680203064e0b70249c1a96", + "name": "flash-linear-attention", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "76b70a11ca82ea4606b529e7a8658cb3fe71412afa46f2ed57101dd91ba27558", + "name": "flashinfer-python", + "version": "0.6.18.post1" + }, + { + "direct_url": null, + "metadata_sha256": "ba8ff415192b5cbb90efce046e2271a00c8184afc362d8b47fbbc84d5e558b05", + "name": "frozenlist", + "version": "1.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "e7712831c80eb13b08fb7f7cc33988a8f24654af9eba7c6f5f943b2636e4306a", + "name": "fsspec", + "version": "2026.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "025de85c794878d0caa737869307447595f514ebf9599eacb5b1a501bae479b6", + "name": "fsspec", + "version": "2026.9.0" + }, + { + "direct_url": null, + "metadata_sha256": "ca94883bdeaa3740b45b6994443b445fd67c6e4a8064ac3bf9d92d2a5221eee8", + "name": "ghp-import", + "version": "2.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "a7e90983562a035cf767baa63d8c32bc37e1de7cad71ac7b6b2bc70a95bba4eb", + "name": "gitdb", + "version": "4.0.12" + }, + { + "direct_url": null, + "metadata_sha256": "dd96143ec79178bef685c1f5c0a58a87a66d003b421e605de65697308321d518", + "name": "google-api-core", + "version": "2.40.0" + }, + { + "direct_url": null, + "metadata_sha256": "0735d57088a83df2355e16843107fb0112abe2178fc5bb8132947a7ad962aa41", + "name": "google-auth", + "version": "2.59.1" + }, + { + "direct_url": null, + "metadata_sha256": "2f3aa9d9500d329560440e6a5a152e420aad5f5bbb23701f45b740be721784a1", + "name": "googleapis-common-protos", + "version": "1.75.5" + }, + { + "direct_url": null, + "metadata_sha256": "06d74ab04fdc03fad368868907f0d10e7d9f397aab58d58965c0b78ffaec34cc", + "name": "griffelib", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "7ee1c179e2c68a62968308b2f96f4f3469176ee3ac8bdb494ac80188d4d41271", + "name": "grpcio", + "version": "1.84.0" + }, + { + "direct_url": null, + "metadata_sha256": "04cf3a4a91575850f386f4fcfdedd8e7fbfba08feff038fbc1296d1e854db2dd", + "name": "h11", + "version": "0.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "b954a6ba4739c0cc878bb8ea27ea7c7154a48bb4b7c06dba9e9cf880cf0ec930", + "name": "h2", + "version": "4.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "6f0d7bf86e75d0bda1ceccc82367c0145ad0ec522c4d4f51bb454f467faadcc9", + "name": "hf-xet", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "f991b847550cf8225f69562902b5ccb591b2ce9a08fe07ef6e6d701bdb4694a7", + "name": "hpack", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "314d194165c4700034c1c67cee847d549a6d7091374c71f2cef0186ec56a3eb9", + "name": "httpcore", + "version": "1.0.9" + }, + { + "direct_url": null, + "metadata_sha256": "aed9767360bed1bcbda71e3b1a3c996603f86558bc77a1693ee3d09973d20cad", + "name": "httpcore2", + "version": "2.13.1" + }, + { + "direct_url": null, + "metadata_sha256": "8fa3bf3510c35e2eea9f523a1cace7120079cf51d76c4acea97de95806aaa14a", + "name": "httptools", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "3bf4804c215d111b6a4702cf9000021ab39807d1ed3207dd011b14b2843b2d14", + "name": "httpx", + "version": "0.28.1" + }, + { + "direct_url": null, + "metadata_sha256": "d11dd50813b8914bd9455e8b2b591171cd2b1618883943153afadc8bb9224678", + "name": "httpx2", + "version": "2.13.1" + }, + { + "direct_url": null, + "metadata_sha256": "43b119c34ad2b2aacc032a1a6a8feb142fdb5ca407a3519325d74dd53d8904df", + "name": "huggingface_hub", + "version": "1.33.0" + }, + { + "direct_url": null, + "metadata_sha256": "9ce850d5a6b775e5ef4a335f907e579a878e058213121b6eec567781ea68c585", + "name": "humming-kernels", + "version": "0.1.12" + }, + { + "direct_url": null, + "metadata_sha256": "67aa4f6717d82446a51ce350e7c4769eba0c4a22d2f428255cddd9d24b11a914", + "name": "hyperframe", + "version": "6.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd9511ede42f63b995c3f71944f908cb8f014048b63ecc1c8d420525a3354b59", + "name": "identify", + "version": "2.6.20" + }, + { + "direct_url": null, + "metadata_sha256": "af3c3a62bb5d82d6a43454684e0b1dedde27a21ea90eacfb1bed9814619f06d0", + "name": "idna", + "version": "3.20" + }, + { + "direct_url": null, + "metadata_sha256": "cf71393f3d079ce2e859384573e65aaacd1709bef700701f629df32398b598f0", + "name": "ijson", + "version": "3.5.1" + }, + { + "direct_url": null, + "metadata_sha256": "9305763e93d03df0e36516b1125fa046a6ebe37d44589e200e0593cf4bdfd980", + "name": "importlib_metadata", + "version": "9.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "32860c3c19b2e91f6cb5bd83400b5870cda051bc74a5a08822c8c666af0990db", + "name": "iniconfig", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "560faabb3d45d779e445a74e7e806a786f95f2200fa06d979603b7f0ee1cfb39", + "name": "instanttensor", + "version": "0.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "f6fc1f0d389e4245fc2a1a0fdfee09422e56200cb6f94659668456997ff4f7a9", + "name": "interegular", + "version": "0.3.3" + }, + { + "direct_url": null, + "metadata_sha256": "d10f300731197a4829b77f0c883bb3cf8a37ae8c76a302e095fa95d6427706d0", + "name": "jiter", + "version": "0.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "5b0c8d4b4c535a2432fb206223d774509b6e20af374c6a4b6f98bf72a7de6702", + "name": "jmespath", + "version": "1.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "6c4032c2e74273452cd77399af2ee85198f49c22da897983f26d2ed6f787c4e8", + "name": "jsonschema", + "version": "4.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "aaa6cd66f423729e8da397c9d533b7d731f6b25f3d6371b9338c36bdb9be74a0", + "name": "jsonschema-specifications", + "version": "2025.9.1" + }, + { + "direct_url": null, + "metadata_sha256": "f7c0687c032593106a2e5a3c241cf8043e7e2c222bddb0022b4cb2bf5de67115", + "name": "lark", + "version": "1.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "4511c6b04efc57a5f5333edc1f5f48b9f5412c3923d4bc19b715bdf47977511c", + "name": "linkify-it-py", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "be929870f6ecae18a819c56118f1101f3076e25ac6a4843ca6f4707ebd1e87c6", + "name": "llguidance", + "version": "1.7.6" + }, + { + "direct_url": null, + "metadata_sha256": "cf2b87669bead3e76ec54207f3354c13f73b50c32fcd13c8d627084b3379139e", + "name": "llvmlite", + "version": "0.47.0" + }, + { + "direct_url": null, + "metadata_sha256": "0a416d79c5543d94d2b18807626293d4f47655d1d22724c7ae296e413078aaba", + "name": "lm-format-enforcer", + "version": "0.11.3" + }, + { + "direct_url": null, + "metadata_sha256": "16bc1f59e34fd2a6633bd395276052eacd2c777b2cf72781e76b203f013a8fac", + "name": "loguru", + "version": "0.7.3" + }, + { + "direct_url": null, + "metadata_sha256": "5216d5acfd039a7b581a826186309594b228d37d2c8d56864124ea666689fe4e", + "name": "lxml", + "version": "6.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "f59d772b35315a928672bfcccfb89d82c0aac672c5275c048f7a93b79015bcea", + "name": "markdown-it-py", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "b137367ef0056711cbf5e53015df9168cab80373104e7899b1c0263a21d9c99c", + "name": "mcp", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "38e0b9edaae09e58cd1461fc961ced22672038a697930bedef153a74befb3de1", + "name": "mcp-types", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "799f49685865fd9cc8915fdb92a33e102eeeffad562b03b4aeffb6f422b771c1", + "name": "mdit-py-plugins", + "version": "0.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "481f9cbe08596c6eaba6343e0efa1b13b2362c30dce0610f7c08523f1d98388d", + "name": "mdurl", + "version": "0.1.2" + }, + { + "direct_url": "{\"dir_info\": {\"editable\": true}, \"url\": \"file:///Megatron-LM-training\"}", + "metadata_sha256": "2876c0c760bbfc93bd7d737bf0db2866a937308a7c1707c3a2bb59d4795986ff", + "name": "megatron-core", + "version": "0.16.0rc0" + }, + { + "direct_url": null, + "metadata_sha256": "a6e34d488c879f57ce042bec38f8864ba3ea7d6ecf0ab757fc88fe8dc0a22f26", + "name": "memray", + "version": "1.20.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd26d80dc9676b1fb8c894355bd525fbe7f49a6a86a555c72e9ec6d927247c33", + "name": "mergedeep", + "version": "1.3.4" + }, + { + "direct_url": null, + "metadata_sha256": "dd1b3b89e88d1c65a26e6e72dd075eabbc220bfb138769ec8b64578ee911795c", + "name": "mistral_common", + "version": "1.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "4859847a9f6321daf8849cf7fd1542ff430db6563a2abf9ac0d62a5b21bd951d", + "name": "mkdocs", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "1729fc31479f2582486cdc85397417659dd3b2fb3f920553de66cfe59d5f0b3e", + "name": "mkdocs-awesome-nav", + "version": "3.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "88b4b7b7c0aba5547befdedaf515c8df4867361daf55ff60b72578464d72dcbe", + "name": "mkdocs-get-deps", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "ad33bb33fb16b1f69689c4682550e97232154e367e2c8c8aee9dad0f10d269ce", + "name": "mkdocs-git-revision-date-localized-plugin", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "ed69fbfb9ac00c10c5a383a12ff9d2b9919ae184e408554434199211643d6040", + "name": "mkdocs-material", + "version": "9.7.7" + }, + { + "direct_url": null, + "metadata_sha256": "d1c549b61701148b97f8246bc924b2840e504b37b0ce7a27e78ddf81261e5363", + "name": "mkdocs-material-extensions", + "version": "1.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "4ad6171f3bf6812e4de90670ff0089d445093d4fe1d05d55f17b96a4a192a816", + "name": "ml_dtypes", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "4ad6171f3bf6812e4de90670ff0089d445093d4fe1d05d55f17b96a4a192a816", + "name": "ml_dtypes", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "b0dbdfa30ab6b1ce637a794899c9e43019182b6d1ab2d07b90f647f7331eba6b", + "name": "model-hosting-container-standards", + "version": "0.1.16" + }, + { + "direct_url": null, + "metadata_sha256": "95424470e481cfa8d18b30963b6de3aafe16614b1ea0414e184a008571dde84f", + "name": "mpmath", + "version": "1.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "eb184d83489401903615ce8a78d98d5b933dec0f7246811d396a529915fe797c", + "name": "msgpack", + "version": "1.2.3" + }, + { + "direct_url": null, + "metadata_sha256": "520006303d6a0e859970b83f7d452196e2e8f6dab08f6dcf1ba5823c1230025f", + "name": "msgspec", + "version": "0.22.0" + }, + { + "direct_url": null, + "metadata_sha256": "010d2fe039006070a711a476b171b7b7da5c29ccad3c4eecd77ef3711b07c2d0", + "name": "multidict", + "version": "6.9.1" + }, + { + "direct_url": null, + "metadata_sha256": "235634cc7ebda45f8a84dfdb1b9b35ac1a77a1888b34650c3a616d23e4a7e93f", + "name": "multiprocess", + "version": "0.70.19" + }, + { + "direct_url": null, + "metadata_sha256": "7c545b4b3e5e83d3fde41352272c10cb9deeaba5b7138fbf24383e952af8822e", + "name": "natsort", + "version": "8.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "311ee8cdaeaf9f11acf51cda9c3b5b191f76ce9d98bc3418164c3189bbc37a08", + "name": "nccl4py", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "66360539217852c3b44b37f409eade7e1559baf018bb363bacb2aa3a9759b203", + "name": "networkx", + "version": "3.7" + }, + { + "direct_url": null, + "metadata_sha256": "e8b0b1746808b87816c47e4531780ded7f246bed9575a89e8b40200aa81e9a13", + "name": "ninja", + "version": "1.13.2" + }, + { + "direct_url": null, + "metadata_sha256": "77c1117f0dbc41560ddc6e6b37b542fb4e88afcd4ef82ec06593e5bbd5f37121", + "name": "nodeenv", + "version": "1.11.0" + }, + { + "direct_url": null, + "metadata_sha256": "9af629898406c9eaa69897fe09220dc483270cdba89f6b20bf0165cdf0e1668e", + "name": "numba", + "version": "0.65.0" + }, + { + "direct_url": null, + "metadata_sha256": "0c7281a81cf76e40b27c1385ffd8a215d7227adc219f177ce807ead9e91994a5", + "name": "numpy", + "version": "2.3.5" + }, + { + "direct_url": null, + "metadata_sha256": "0c7281a81cf76e40b27c1385ffd8a215d7227adc219f177ce807ead9e91994a5", + "name": "numpy", + "version": "2.3.5" + }, + { + "direct_url": null, + "metadata_sha256": "bab990ced4537ce74ef5961ca933c4c6fd604fd09a5827a4a428c55bcb0be35b", + "name": "nvdlfw_inspect", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "10f6595146332d35f7f15a000e08b5c81432528c5d026470c1d03f0c1399fb70", + "name": "nvidia-cublas", + "version": "13.1.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "58e933b4ac8e49f098b16ab7480d03bd792afc3d1db10d0aacbdcc2c62e48fa3", + "name": "nvidia-cuda-cccl", + "version": "13.3.4.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "baac937970681d41aa0c3708b3d55d73f8d29e70aceaac0e71fe6d1548e94a09", + "name": "nvidia-cuda-crt", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "8d51e5c76ef5707b0b80d5ec9a791c0f11a480ab721820cf100a3cc566017eef", + "name": "nvidia-cuda-cupti", + "version": "13.0.85" + }, + { + "direct_url": null, + "metadata_sha256": "724bf56e61ddef5d4c2482ff64103a973b911b110b668acaea5373f6c83c1c5c", + "name": "nvidia-cuda-nvcc", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "c54801dbd815d534519a761f1f328325aa0f1d1f1659aa969fa74e7a2c76eee9", + "name": "nvidia-cuda-nvdisasm", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "af51f248363020b9fdfd2743704e901bf3d19a1a1ce1fe44fb98ba148bfc0157", + "name": "nvidia-cuda-nvrtc", + "version": "13.0.88" + }, + { + "direct_url": null, + "metadata_sha256": "055f7fc69a5a2159de82cd0718da02c8852e81c8a71ebb117b8e799badd7167e", + "name": "nvidia-cuda-runtime", + "version": "13.0.96" + }, + { + "direct_url": null, + "metadata_sha256": "df18686dbdb3074ca375a1d6c623a04102fd348950c67a721397349c6d4f0477", + "name": "nvidia-cudnn-cu13", + "version": "9.20.0.48" + }, + { + "direct_url": null, + "metadata_sha256": "abd0ca3f67af19a4d383ff2a012ae0090d4731c6492fd47236615308a50b3981", + "name": "nvidia-cudnn-frontend", + "version": "1.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "4a78545d424d0c5038353f7046a8ae40ceaf312045d71399eac9511f5fc15434", + "name": "nvidia-cufft", + "version": "12.0.0.61" + }, + { + "direct_url": null, + "metadata_sha256": "e49b909195c03ddbe203729d9b31dd88e3f207368333d1909c67c6b130a0c696", + "name": "nvidia-cufile", + "version": "1.15.1.6" + }, + { + "direct_url": null, + "metadata_sha256": "bb15a754c6be32c23aaac13c1cfa7a8ce53d92bc26652ec3b609f7a5cce3e7d1", + "name": "nvidia-curand", + "version": "10.4.0.35" + }, + { + "direct_url": null, + "metadata_sha256": "0dd58f677811eac04901a793740932e5a2a8fff2f5453aa6351614eb18391bb6", + "name": "nvidia-cusolver", + "version": "12.0.4.66" + }, + { + "direct_url": null, + "metadata_sha256": "8aeb284782ef6883095a5d1c110e221cad023a99afcfd5cdb4969a25e146d562", + "name": "nvidia-cusparse", + "version": "12.6.3.3" + }, + { + "direct_url": null, + "metadata_sha256": "09555246122896eaca3b8313eecfca4b339fefd3b597874cb9fe3bf29dab38c9", + "name": "nvidia-cusparselt-cu13", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "ac77bac79fbfb0c52ac6e2e5abc936b1e127be2192f0cbc27b00be3125fa86ae", + "name": "nvidia-cutlass-dsl", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "1ec968ec7c4083f7fe4e1fb8384c7e9b853a81491fef9f4cb1cf755961aaedf6", + "name": "nvidia-cutlass-dsl-libs-base", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "cc6f3846cd820013eaa6e2665c493d70c607be6ce7349b939eb4742888470585", + "name": "nvidia-cutlass-dsl-libs-core", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "2357d0df2d0d17c0b16663b8a89df53f751b19721f66821fd88fa78112c08e55", + "name": "nvidia-cutlass-dsl-libs-cu12", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "244590c25662dcf777b1daae97a858afe1a1aec62e5e6678b217007a459ab552", + "name": "nvidia-cutlass-dsl-libs-cu13", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "c3a25ada01f57418c1b897406c3abab18834e6adc573ab7b060620c453afb6db", + "name": "nvidia-ml-py", + "version": "13.615.71" + }, + { + "direct_url": null, + "metadata_sha256": "56baad4e7f699902b03b17580933f7bd50b6ea97b7df9d7e807750973da7529c", + "name": "nvidia-nccl-cu13", + "version": "2.29.7" + }, + { + "direct_url": null, + "metadata_sha256": "98810ef0ab8badc369e6a46a038f8ee9f412c0c753fb5ad580544f23a0aa7962", + "name": "nvidia-nvjitlink", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "b0f54ee21909d19640a58e05da755c91763eb5725f544fd0d4b84b2f5f94deba", + "name": "nvidia-nvshmem-cu13", + "version": "3.4.5" + }, + { + "direct_url": null, + "metadata_sha256": "06dc1a593c7e8b8c3f29184228c83f8f7ef57787ad91f3e5bcae1d238dd3092a", + "name": "nvidia-nvtx", + "version": "13.0.85" + }, + { + "direct_url": null, + "metadata_sha256": "32ee63450a437b6a6ed227ff6549144aa596197a322993521ec7af826ebd413e", + "name": "nvidia-nvvm", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "32c2efdcd2c673b3b7f35ca9c2cccefaad36f1f0a920648a13cad85f6a5767b2", + "name": "nvtx", + "version": "0.2.15" + }, + { + "direct_url": null, + "metadata_sha256": "3419d80e114a2c19fa9bd3582939a3942f19673055707ba6ca2ca489d58b41e0", + "name": "omegaconf", + "version": "2.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "28971076ce9c279d4b889496b046d55a1e05b02fb9851ceb717e9a10df799572", + "name": "onnx", + "version": "1.23.1" + }, + { + "direct_url": null, + "metadata_sha256": "1246f5a4d8295907a42e809ed9173ede2510ec9d260d2168989d126564897fa5", + "name": "onnx-ir", + "version": "1.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "e14643636835759700dff286f949c5ec34e7eac7ac47f44096414f0e0f1c3101", + "name": "onnxscript", + "version": "0.7.2" + }, + { + "direct_url": null, + "metadata_sha256": "00f847e99939207bd70dfd806428f6b20a3d01074b59325e4c76149a2e19be26", + "name": "openai", + "version": "3.22.1" + }, + { + "direct_url": null, + "metadata_sha256": "598d3ad5a22a14a7c4f1d218b43e345f32b0ba094b753467bae8a3f708fd48cb", + "name": "openai-agents", + "version": "0.22.3" + }, + { + "direct_url": null, + "metadata_sha256": "5a0afcb1ce845e05da12beb1767f5d2749bbc9e9050718c6b9fa3c225713c9eb", + "name": "openai-harmony", + "version": "0.0.8" + }, + { + "direct_url": null, + "metadata_sha256": "e86a6b6fcbbe152805f782c57df321002892e163019574877e9829272e25eb4e", + "name": "opencensus", + "version": "0.11.4" + }, + { + "direct_url": null, + "metadata_sha256": "53d669c8bd3d32d3275153b454e515ca5cc6dec92fae3a98309b5a2b19fe6d2d", + "name": "opencensus-context", + "version": "0.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "19778b6d66b0e45bf73e11fa37a208949d5b393aef914627394d5601455546a6", + "name": "opencv-python-headless", + "version": "5.0.0.93" + }, + { + "direct_url": null, + "metadata_sha256": "19778b6d66b0e45bf73e11fa37a208949d5b393aef914627394d5601455546a6", + "name": "opencv-python-headless", + "version": "5.0.0.93" + }, + { + "direct_url": null, + "metadata_sha256": "a3f5434fa7c80f7f7abc82173da639c8e9c59d30b4027182645562bd3d2f4f97", + "name": "opentelemetry-api", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "8611977ea596e4827874582e86250618444e1c718229dddfc16e5ea437ce5fcb", + "name": "opentelemetry-exporter-http-transport", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "2cfd41e5ca33292d987ba71fa6186d11e16ed66888f3a26f8a3a99060c4b5e90", + "name": "opentelemetry-exporter-otlp", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "3bb4494220732d4bf10e1dba231ea7638cedaa5362e1f23a50d34a14f520fea8", + "name": "opentelemetry-exporter-otlp-common", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "27fb1c8aa5c2cd07776f9f3281fc618cd3feb96017757c33d2b3586fb7fec88b", + "name": "opentelemetry-exporter-otlp-proto-common", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "5cba6098cdd0bfb06853a6c704a2451c4f82c9dea376a30b59ecd279296648ad", + "name": "opentelemetry-exporter-otlp-proto-grpc", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "6f53ef1c172ebf87af69b9ef390aa908506d0cd14bc7811985fdd937a4058808", + "name": "opentelemetry-exporter-otlp-proto-http", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "1910f4e7ebd497e98b6d231e10275288fda2cd1885117575706c62f45e065889", + "name": "opentelemetry-exporter-prometheus", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "fab18b721e30be41448be252e1dca43b48e7f15d971e0bb552492c0ef4b07bee", + "name": "opentelemetry-proto", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "3644a79f55762a646799ff52b9d837e01c8192b7b28f735a383f55c90edb9bc2", + "name": "opentelemetry-sdk", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "add3db481f7f401f65cfbddb058fde3bb4c9dd7b61064a84f8598ad7efe0b11c", + "name": "opentelemetry-semantic-conventions", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "0dfff30e912520a226bcf7a547393484cfcd8c738439c7b48418f61c95109480", + "name": "opentelemetry-semantic-conventions-ai", + "version": "0.5.1" + }, + { + "direct_url": null, + "metadata_sha256": "210ce26bad0a245a72831b4fa029708c245d4d670a88c8d5a69b1446c24a95e4", + "name": "orjson", + "version": "3.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "35ff73511848f5f934ccc39d538014716ec4579e76d54e0e407ff51794a7939c", + "name": "outlines_core", + "version": "0.2.14" + }, + { + "direct_url": null, + "metadata_sha256": "8ee2f7138ade46b6e348a6d099612f5bd6caff13511f3b4144327f37ce50eacf", + "name": "packaging", + "version": "26.3" + }, + { + "direct_url": null, + "metadata_sha256": "a4ab87bf8083001f25ccdc46095f05b678b3569dd58edc2cf941e3e7f64d7c88", + "name": "paginate", + "version": "0.5.7" + }, + { + "direct_url": null, + "metadata_sha256": "1de96a6c28c2e5613c9c87cd4ad9484791001cf58df43cf2ba74d5c4f85f0ad2", + "name": "pandas", + "version": "3.0.6" + }, + { + "direct_url": null, + "metadata_sha256": "d05b8d05da9f78176b2eefaacdfaa5e96708ec4f488daea8bbc52e3ed1bc3954", + "name": "partial-json-parser", + "version": "0.2.1.1.post7" + }, + { + "direct_url": null, + "metadata_sha256": "c1d126edceac2685e29403a8ae3a27c47143dce1f0252fa3931771562f1e2b4f", + "name": "pathspec", + "version": "1.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "30325dc8ce17bc64f9dbc0a449232fd35841a019df22a6f481007c9c5a28c1cb", + "name": "pillow", + "version": "12.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "cbc0b7b6e63b50dcb7c17cf3526a9304f285d9a31353adf3b22acc2059ab23f5", + "name": "pip", + "version": "25.0.1" + }, + { + "direct_url": "{\"dir_info\": {}, \"url\": \"file:///work\"}", + "metadata_sha256": "6ba03b5bc457a2a3d92468729501b5892a0d38ebcc36766c58859449498c5743", + "name": "pip", + "version": "26.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "0421937c4410b61c5325233d5b7671ae933bae8de174f87586ac55aa804851ea", + "name": "platformdirs", + "version": "4.12.2" + }, + { + "direct_url": null, + "metadata_sha256": "2bcffab42626e1fb50d6329765619312d30fe7f4880e98dcee99c92ebd283bb4", + "name": "pluggy", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "7e7562ba7c032f8edd02641ae71b1ac2d8f388103a68d777a7e907d19e75bc17", + "name": "pre_commit", + "version": "4.6.2" + }, + { + "direct_url": null, + "metadata_sha256": "bbe0a7662602ddd23f929fe0ee98e9d04406e138aeee18ce4861af186ea6060d", + "name": "prometheus-fastapi-instrumentator", + "version": "8.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "ece4a61f3ffb92a083fd5e47e180e3e070342e60a3bd93876a879e79a643e821", + "name": "prometheus_client", + "version": "0.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "5feba21a58eaa126e7e7739e57e2572e5bb251fcbf56e439e508acc47d769314", + "name": "propcache", + "version": "0.5.4" + }, + { + "direct_url": null, + "metadata_sha256": "3f136dbf7239c987a7685acd33440cc5efd6c4107b4b11c425201b4de70ae36f", + "name": "proto-plus", + "version": "1.29.0" + }, + { + "direct_url": null, + "metadata_sha256": "118b5ad013120a7a6e24714595ad776bf264d7b0060389133310d18ea1480902", + "name": "protobuf", + "version": "7.36.2" + }, + { + "direct_url": null, + "metadata_sha256": "0849f5a519bf9bc23ef204443fdd8d6d10678863acac7ca9340fc11bfba5a856", + "name": "protobuf-py", + "version": "0.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "eab5f2f4fd98f67a710a8fb1975b64ffa880a4f977566f022c567e08e324ccd6", + "name": "protobuf-py-ext", + "version": "0.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "39009938840de3a8b2a37eb4668d2601aae8c74e4b74743f73e59996b5b7e6e1", + "name": "psutil", + "version": "7.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "df44b58e8a4cfe57f65773ec47f7bdf2a14c8f5f73a7abf331a6b6237d6d691a", + "name": "py-cpuinfo", + "version": "9.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "2fd4a9efc5e5c74ae4c2fcf1970193c524c62ab22af8d5e66ebf7df9e6e46e83", + "name": "py-spy", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "d2ccdeb15cddedc81637a83e40baa6397fe269023b738d0fc3cb2d90722e290b", + "name": "pyarrow", + "version": "25.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "47b9f28e971a56f5adf949e0bcf105b0bf6587946566ecf197a2819d8848cc01", + "name": "pyasn1", + "version": "0.6.4" + }, + { + "direct_url": null, + "metadata_sha256": "82ce4c01c6d36841b9801fcdabab9bfe61d0b5e4e440c275941d8a2d4a790730", + "name": "pyasn1_modules", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "45cb345e4c12f63bc843b8c88902cc44c4d624a55aaef8cd5ffbc0ad16356fbe", + "name": "pybase64", + "version": "1.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "d311ae661edeac8ff029ab2960d065a7e792ebf8f79af682daa53109fe81318b", + "name": "pybind11", + "version": "3.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "cce9c0d440d065d4cdfb0d00004b8ddd65cf363a740efc5b0920b29201a59cd9", + "name": "pycountry", + "version": "26.2.16" + }, + { + "direct_url": null, + "metadata_sha256": "a1e33542883c249bf6c263b0023b9ea8a6131a77d9cb2cbc88316968e5eada83", + "name": "pycparser", + "version": "3.0" + }, + { + "direct_url": null, + "metadata_sha256": "faffcc4d7d359cb1047a9f67f7c65096b838c6db6c62852ef20fb27d55649a95", + "name": "pycryptodomex", + "version": "3.23.0" + }, + { + "direct_url": null, + "metadata_sha256": "98929f4cb80451dc3c6c8cd541a3081dccf0dee94afe7d9fa5c214a18ff236ce", + "name": "pydantic", + "version": "2.13.5" + }, + { + "direct_url": null, + "metadata_sha256": "8eccadbe707db97c397fb79073fe791b7998ef3a85f04f817f8991f7697b190b", + "name": "pydantic-extra-types", + "version": "2.11.1" + }, + { + "direct_url": null, + "metadata_sha256": "8f00c91deb34399316a5386eb2e76fe09f14a08dc3045f2e7dce9bf8573796bd", + "name": "pydantic-settings", + "version": "2.15.0" + }, + { + "direct_url": null, + "metadata_sha256": "66c729edddc20bf2764bb18bd87d907b08690e50355f39b97acc737b26d1d164", + "name": "pydantic_core", + "version": "2.46.5" + }, + { + "direct_url": null, + "metadata_sha256": "394500d78a0c1a433ae8ca3693152c08f6a901121d4b069cf1540a19759e2950", + "name": "pylatexenc", + "version": "2.11" + }, + { + "direct_url": null, + "metadata_sha256": "df2e9e9847a2aea0ae6e20fd325aeb16cf3ce7f8913462db6c2398363cd0c0bf", + "name": "pymdown-extensions", + "version": "12.1" + }, + { + "direct_url": null, + "metadata_sha256": "82fcfe724db9f0b51348da89f4f5cdc0b08d08882b1bbc0ca4913d3a0a93bcb9", + "name": "pynvvideocodec", + "version": "2.0.4" + }, + { + "direct_url": null, + "metadata_sha256": "3722422cc1478b175879143dfb78f98b7a5f53f4f684d71b7054fe2e8acd3b89", + "name": "pyqwest", + "version": "0.10.0" + }, + { + "direct_url": null, + "metadata_sha256": "7d1d1c276b7c372d55d17ac7d30f0a4b80a746e147347b8510d1355eea7f80c8", + "name": "pytest", + "version": "9.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "89e7c1c932e52b74bdcaf504389d2d1a2d7ca559b02bf5a09fc80ebd58ad10f7", + "name": "python-dateutil", + "version": "2.9.0.post0" + }, + { + "direct_url": null, + "metadata_sha256": "54f30f811841b6d772f31715712c85bfe0041839cb071f78daf41c700a98642b", + "name": "python-discovery", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "54f30f811841b6d772f31715712c85bfe0041839cb071f78daf41c700a98642b", + "name": "python-discovery", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "0cc19efd76cfbf3bcb2cb0d3ab82191036855859455aa3812c5e9e591e3f34e8", + "name": "python-dotenv", + "version": "1.2.3" + }, + { + "direct_url": null, + "metadata_sha256": "1d866c6124631b9ce1797ad412fff298ab53fc2d95210281d7c8f20e920753fa", + "name": "python-json-logger", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "2d18a1e7286d92a656ead5ec6f83d5ae6dc858634624f6b264703ae88d24d718", + "name": "python-multipart", + "version": "0.0.32" + }, + { + "direct_url": null, + "metadata_sha256": "beaa0efe9ba4b34843f5a0fc7379a73f10e95adb8cc0c31f359ab6f3a42b4def", + "name": "pyyaml_env_tag", + "version": "1.1" + }, + { + "direct_url": null, + "metadata_sha256": "238dc769e22d4f5626750cdff36e920e4a8d69c10d88de6d79b40a59cc13d873", + "name": "pyzmq", + "version": "27.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "de0a5e855bb5bb78b7acdcd2ca60619c6a0c109814881589caf158ec07155662", + "name": "quack-kernels", + "version": "0.6.5" + }, + { + "direct_url": null, + "metadata_sha256": "961ffef199b876fb4d7b10903d78e79f359d703b1638834c61d70b9879932918", + "name": "qwen-vl-utils", + "version": "0.0.14" + }, + { + "direct_url": null, + "metadata_sha256": "faf6ab9027d12de992827a2d8a224996fe6747a8c5f7d31ae495983dc73eefe9", + "name": "ray", + "version": "2.54.0" + }, + { + "direct_url": null, + "metadata_sha256": "c50d8b3ff4d113925b60dc47d1d28e87248a3338024241b0a3a66c8794fbce0c", + "name": "referencing", + "version": "0.37.0" + }, + { + "direct_url": null, + "metadata_sha256": "02acdc52d6f21d5f4b172254daaa94edfaa44c9ebe14d1c00cc4c8fe99b0e1df", + "name": "regex", + "version": "2026.9.29" + }, + { + "direct_url": null, + "metadata_sha256": "ac08207697217d1ffde8a161b424d77d6e2af6b62630fa26d75d08f11076cdca", + "name": "requests", + "version": "2.34.2" + }, + { + "direct_url": null, + "metadata_sha256": "f1abd635c3dff607a4fd654c62a88d9d4c21843cfc9176116c156f4269ca21b5", + "name": "rich", + "version": "15.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "932ff7743a756d0efcc45528d64c275ac3cb40a8dd1787ea10cb303907f0ae4f", + "name": "rich-toolkit", + "version": "0.20.5" + }, + { + "direct_url": null, + "metadata_sha256": "294a1405c0fa34b5f735bcb46459050436849a1e584c643544de99c07c529fb7", + "name": "rignore", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "5e54dd00b4ad336c5161d47de2a5c2212090c44629c28b6538b156256e49282d", + "name": "rpds-py", + "version": "2026.6.3" + }, + { + "direct_url": null, + "metadata_sha256": "0d5895abd80bfc0027c02943abaea4547061b9004bd134950d640d619a697835", + "name": "safetensors", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "91d5de3f641f33a8fbb4b6e91772da68d50b68686971d7b66af2068f2e77b694", + "name": "scipy", + "version": "1.17.1" + }, + { + "direct_url": null, + "metadata_sha256": "297fb30f701a800489c12893a951da3e5bd1f80061a1f43f0d3e9f1d4c6bc6fd", + "name": "sentencepiece", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "4245e0388ddf2048a38ae2a24a3d2c583408b2454aadc680d3c3beede639db3f", + "name": "sentry-sdk", + "version": "2.71.0" + }, + { + "direct_url": null, + "metadata_sha256": "ae8a9e6feec1a76e954d65ea48ac57842c9a7bfb5ac6e5ea82400a5ba9f71a98", + "name": "setproctitle", + "version": "1.3.7" + }, + { + "direct_url": null, + "metadata_sha256": "341d00772017437d0f6e3c943ae353f243c39fedfba403aea47cced927a76516", + "name": "setuptools", + "version": "79.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "ff4bcfb192bd542ed8f1794fb32ffc9eabd932d6e03cb00a4ad5e35a2469af88", + "name": "setuptools", + "version": "80.10.2" + }, + { + "direct_url": null, + "metadata_sha256": "f1e5a532fb8cda0bbc370e3db6cb9cea72a065d12ddd6a14976ba3cf66264221", + "name": "shellingham", + "version": "1.5.4" + }, + { + "direct_url": null, + "metadata_sha256": "2aba2cfd9c2ad7625a5d374d141af317d8f92d3534997bf98d127e52848dfc81", + "name": "six", + "version": "1.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "69ae2dfe547624be97fae348e1cfa3793f8854eed32cc1603badedc7d48fb36e", + "name": "smart_open", + "version": "8.0.2" + }, + { + "direct_url": null, + "metadata_sha256": "d415e6c6de7dee117d254a342668c489931bc88eac7ec8678b452078e366da6e", + "name": "smmap", + "version": "5.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "093bc4f0740a6fc28692e616aa8fe68d7e1d76426cc5a5faf9ea722a8ee7aaae", + "name": "sniffio", + "version": "1.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "b3cef071eb1dbeaa76a1273fe2ca2cc8ef36e835165253952d93780962529ac1", + "name": "sse-starlette", + "version": "3.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "3c01ca830e213f0311fe37bc3b46b8ab230a5e7acb894bf0fc8785cb7ccfed48", + "name": "starlette", + "version": "1.7.0" + }, + { + "direct_url": null, + "metadata_sha256": "6017ca508a293cf47a88a78cb330e9cbd131d74ec3c7fbf89bd4300ed3129d30", + "name": "supervisor", + "version": "4.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "fd5eb4925b04f9bffbc6c4f92bf8aea7243b918b43cd359493fce48a7dd3b336", + "name": "sympy", + "version": "1.14.0" + }, + { + "direct_url": null, + "metadata_sha256": "f09f0e24282c5a86346bcd5b10ae5ff81869fa8ef69c3ba524bd0a817a87dda9", + "name": "tabulate", + "version": "0.10.0" + }, + { + "direct_url": null, + "metadata_sha256": "519fa19c146fd58a0a75ecf1461e4bd98f9c06d01800c37d4a80f5fef095f4e1", + "name": "tensorboard", + "version": "2.21.0" + }, + { + "direct_url": null, + "metadata_sha256": "1af7ad76e4073b01ab147eb3c1d8e38b95d38062c6c9bc63890150738642e8eb", + "name": "tensorboard-data-server", + "version": "0.7.2" + }, + { + "direct_url": null, + "metadata_sha256": "9e597f62fc07e3b931d5c8fb0e90706fb6d45465cfb5d01dbd27ba7fc135c02c", + "name": "tensorstore", + "version": "0.1.80" + }, + { + "direct_url": null, + "metadata_sha256": "0da993d16ef6326f471796fcb065622f309c5c1aae6c6295b488ea64bb5c880c", + "name": "textual", + "version": "8.2.8" + }, + { + "direct_url": null, + "metadata_sha256": "52ca6148d4fd1497254855fa610cfdde99191cd42bce7a452fd3a68855504ac0", + "name": "tiktoken", + "version": "0.14.0" + }, + { + "direct_url": null, + "metadata_sha256": "0df9eb495cfb477dcbdfbdcd8c04d952d3eb00d77831630760571e13545398e5", + "name": "tilelang", + "version": "0.1.12" + }, + { + "direct_url": null, + "metadata_sha256": "802b576e011dc61bd2681593e8d802714b6c4ce636a9cf87035026db32ce6262", + "name": "tokenizers", + "version": "0.23.2" + }, + { + "direct_url": null, + "metadata_sha256": "4e1631b2164a49ff9a848d86ce504fdcc15e3540dbb262df8f33a2681a8de513", + "name": "tokenspeed-mla", + "version": "0.1.8" + }, + { + "direct_url": null, + "metadata_sha256": "05086095a775c5dca70998dcf442a848c13f9c68b54a54c510c3542c5abb6563", + "name": "tokenspeed-triton", + "version": "3.8.10.post20260920" + }, + { + "direct_url": null, + "metadata_sha256": "71daba472d0c5ffc25c0231dc29688ab0cb13d5bc7e7d93f6c4cce4169c50048", + "name": "torch", + "version": "2.13.0" + }, + { + "direct_url": null, + "metadata_sha256": "cccd2f1c0e5866e63732f58798c8d642ee6d10cd560d6f691e7981b908c246c9", + "name": "torch_c_dlpack_ext", + "version": "0.1.5" + }, + { + "direct_url": "{\"dir_info\": {}, \"url\": \"file:///torch_memory_saver\"}", + "metadata_sha256": "6276cef17dedbb5ee0d6157bbf63b832e916026281328d995ad3d488c2539618", + "name": "torch_memory_saver", + "version": "0.0.9.post1+slime" + }, + { + "direct_url": null, + "metadata_sha256": "29809ca2c86dda5079654f1f70564a64435e9d08f1964a2412b6f514e1b5ff64", + "name": "torchaudio", + "version": "2.11.0" + }, + { + "direct_url": null, + "metadata_sha256": "7e9be0f3a290e3fd9370d8fe010c7ffd006d5d3d05ab8bdf7df8f92f0fca9c39", + "name": "torchcodec", + "version": "0.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "181fa5e6b399c378711eddcdacd756d3c51317916f8eb160ee36cae7fae9589f", + "name": "torchvision", + "version": "0.28.0" + }, + { + "direct_url": null, + "metadata_sha256": "43d1261aff90cf3d5b1b40cf1f94234d61409b14e59f3766f457c1eec7f7ac15", + "name": "tqdm", + "version": "4.70.1" + }, + { + "direct_url": "{\"archive_info\": {\"hash\": \"sha256=3e1d9f534781c8e608240da0b495b8246317a36382f7609017cbaa7fb1d53f7b\", \"hashes\": {\"sha256\": \"3e1d9f534781c8e608240da0b495b8246317a36382f7609017cbaa7fb1d53f7b\"}}, \"url\": \"file:///wheels/transformer_engine-2.16.1%2Bc9877beb-cp312-cp312-linux_x86_64.whl\"}", + "metadata_sha256": "d882f743161d9d9f35dee4e1a8cc9136fa495f7c660caace01ab8f5602d76aa7", + "name": "transformer_engine", + "version": "2.16.1+c9877beb" + }, + { + "direct_url": null, + "metadata_sha256": "465797a59706d83b45c93fde750b228c3b6e1addc44115de2c4c02ad66d9c5ea", + "name": "transformers", + "version": "5.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "a91982ca086667c592a951973434f7c5a9f27a8300bc97af78dfb496afe53e71", + "name": "triton", + "version": "3.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "d26fbb244532c4051e715f9047cd943e2cc4abb0ac6f2a517fa2986eb1ea726a", + "name": "truststore", + "version": "0.10.4" + }, + { + "direct_url": null, + "metadata_sha256": "c84af1a069084b1b440b3594068dec29200d52d4c1a9b652030448717f270158", + "name": "typer", + "version": "0.27.2" + }, + { + "direct_url": null, + "metadata_sha256": "0ad6653b7439f4bb6a596cb7b01ed1b716458467525c4dc40b75d62bdb943c98", + "name": "typing-inspection", + "version": "0.4.4" + }, + { + "direct_url": null, + "metadata_sha256": "d005280aa13b334ac942d20219102865e559f69ffd06c35c248b2f0d0da3b933", + "name": "typing_extensions", + "version": "4.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "fba2930e9030a18965d243f8d330748db2e67572a81b3b68710462fb5110332a", + "name": "urllib3", + "version": "2.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "bc5717bd6524a33838f285261868bcc8e311e8c29fdb19e41d56c38b04890e84", + "name": "uvicorn", + "version": "0.54.0" + }, + { + "direct_url": null, + "metadata_sha256": "741c006d8441f562aa853a5430df236fbb4af923445491f396bf09943bd30258", + "name": "uvloop", + "version": "0.22.1" + }, + { + "direct_url": "{\"dir_info\": {\"editable\": true}, \"url\": \"file:///vime\"}", + "metadata_sha256": "f85aa01dfdc868756a6583434bbff040f29eb511d47d5b25ada063a84353aac6", + "name": "vime", + "version": "0.3.2" + }, + { + "direct_url": null, + "metadata_sha256": "c25431aaf1950971fe96292f395a41a55b403127bfca0d0b8f7dc9cff5dab75d", + "name": "virtualenv", + "version": "21.14.1" + }, + { + "direct_url": null, + "metadata_sha256": "4e3ee0a31d85e56268640aae853bcee4794dfe8c0483c5c6370517e480c81ae0", + "name": "virtualenv", + "version": "21.14.5" + }, + { + "direct_url": null, + "metadata_sha256": "d4ed5c7551cddb8c1aeff2f9f27b3491f6ad2c9afda8e7bb9779c33fa12a536c", + "name": "vllm", + "version": "0.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "84b482e09bac949e992594757214a1920c667a5d898ee320e309250697f6d26e", + "name": "vllm-router", + "version": "0.1.15" + }, + { + "direct_url": null, + "metadata_sha256": "9b16c871eb1060a5218e9b9a9ad33288d94844cfaf43f08dbb6c32423bde8fe3", + "name": "wandb", + "version": "0.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "8e4f2be437dfe4eb3c6c959e517ac20b75d06525563f1ebcbf06f9ec648bd7c1", + "name": "watchdog", + "version": "6.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "15218afb42938907c2ca74c54e3d8e3a5406493c4761e29e38e82bfec0f84296", + "name": "watchfiles", + "version": "1.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "8863af96e88b7db9990da99aa6c46816eacc3d2f9ae1297b53381b033cd70119", + "name": "wcmatch", + "version": "11.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "f46e6bd6cfafb2b684c29587b017b7096fd9155b74eda25a22eca784b9803ab7", + "name": "websockets", + "version": "16.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "ce82db5ccfefa4bfbe4e25a36e1f91e8e7d51fcaeb31586c4d48e1c69f99168b", + "name": "websockets", + "version": "17.1" + }, + { + "direct_url": null, + "metadata_sha256": "0f142a2c09eac643c7d0bfe77f3f121184c0b17914afbd32af669ed19b2b02ef", + "name": "wheel", + "version": "0.47.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd58938e51a3c5cb363f6f22eaa2a8a7accc1ce373388de167a82f77d3e5783f", + "name": "wrapt", + "version": "2.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "b0b72c1941f04499ca7e1a3a6e479aee8df902c3d49979624b59dba8c3228d37", + "name": "xgrammar", + "version": "0.2.8" + }, + { + "direct_url": null, + "metadata_sha256": "ef8861f39e5c36255966a36032651f937d890d55f31f1c26304b488f1ba34332", + "name": "xxhash", + "version": "4.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "740c08057b6eb69c58402c87d652af0a471e46325d811f2c605632a18817152f", + "name": "yarl", + "version": "1.25.1" + }, + { + "direct_url": null, + "metadata_sha256": "7b060e4d24394b5431875e2f74fec8e6bffa79d2e6b4cb8c7e2a5187dd2d8d69", + "name": "z3-solver", + "version": "4.15.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "3d76d4fbc95f0851191147db12300938c67a6f8fb1df884886d9601272ccc4e8", + "name": "zipp", + "version": "4.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "d3de2651e4e908dbb7c9d80508e5179590217dfac4993dc8b04381c5b9718c4c", + "name": "zstandard", + "version": "0.25.0" + } + ], + "executable": "", + "installed_provider_sources": { + "vllm/compilation/__init__.py": { + "path": "/vllm/compilation/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/backends.py": { + "path": "/vllm/compilation/backends.py", + "sha256": "fa4bff8920b363efbbde9456f135fa9d2c004a5bde1898877f177418b2d8b008" + }, + "vllm/compilation/base_static_graph.py": { + "path": "/vllm/compilation/base_static_graph.py", + "sha256": "5cfe8e06db84aa42cd41cdd93ebe93af00b3a242c8011042057530e2922b523a" + }, + "vllm/compilation/breakable_cudagraph.py": { + "path": "/vllm/compilation/breakable_cudagraph.py", + "sha256": "3cc427612a08e2b9b3fee47548026400c1d0776e2d4747535e59ef5512bdf1e8" + }, + "vllm/compilation/caching.py": { + "path": "/vllm/compilation/caching.py", + "sha256": "71d212452dde742fbf28b8a01ed29d3c08a7457ff7f8da2a20ce9d17e902c2cf" + }, + "vllm/compilation/codegen.py": { + "path": "/vllm/compilation/codegen.py", + "sha256": "e04833bec88cf9d1a13aa7341e30e3233d1138bfe23424e0fd34d664b3fedb9f" + }, + "vllm/compilation/compiler_interface.py": { + "path": "/vllm/compilation/compiler_interface.py", + "sha256": "8d84e2864bf83f754bae9e9f77119e0287cca9f97f5fa5ec2535e07b5ad88944" + }, + "vllm/compilation/counter.py": { + "path": "/vllm/compilation/counter.py", + "sha256": "d8158c54dd36a357bf24f6f84dc22f572d3a27f4875f3d5779b12bc5d454ff76" + }, + "vllm/compilation/cuda_graph.py": { + "path": "/vllm/compilation/cuda_graph.py", + "sha256": "05c86392d7fae967ac73076dba7e01990a0e3ae619e4866450a0c1be56bd1192" + }, + "vllm/compilation/decorators.py": { + "path": "/vllm/compilation/decorators.py", + "sha256": "cab6962e8a1fead59c75f5ed8cb4732f9e5441ff972030c2f4b1c4ba0c58de3c" + }, + "vllm/compilation/monitor.py": { + "path": "/vllm/compilation/monitor.py", + "sha256": "43b24c5cb1bc4d32dc979f3222596905c7b3acc58415328a234402e6edc76abf" + }, + "vllm/compilation/partition_rules.py": { + "path": "/vllm/compilation/partition_rules.py", + "sha256": "857d2fb06dc871ea1d3717cd01fbd4e5205984100d98b7b72a2933d6ff1cfa4d" + }, + "vllm/compilation/passes/__init__.py": { + "path": "/vllm/compilation/passes/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/fusion/__init__.py": { + "path": "/vllm/compilation/passes/fusion/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/fusion/act_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/act_quant_fusion.py", + "sha256": "1fa9c3ca4fb424685b7053c3dda89dda16c98dc5645d85f0f28dca58429792b3" + }, + "vllm/compilation/passes/fusion/add_rms_fusion.py": { + "path": "/vllm/compilation/passes/fusion/add_rms_fusion.py", + "sha256": "e46998552628aa5cd5962fc39ea39ae824fd97e6aeba1d176e9cc7cade39837b" + }, + "vllm/compilation/passes/fusion/allreduce_rms_fusion.py": { + "path": "/vllm/compilation/passes/fusion/allreduce_rms_fusion.py", + "sha256": "0af193505880cec0f6ffa224c688bce3c9ddc318dccdf04a696b4e4b4506a963" + }, + "vllm/compilation/passes/fusion/attn_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/attn_quant_fusion.py", + "sha256": "ecc64e82be4481954c9cac6c23d7794846ab19486b570f2dda07ab5ad67c5a49" + }, + "vllm/compilation/passes/fusion/collective_fusion.py": { + "path": "/vllm/compilation/passes/fusion/collective_fusion.py", + "sha256": "1e2c8539d6960b45907fb3bf0482441ea7250e97c56ffdea1500514efa0b164d" + }, + "vllm/compilation/passes/fusion/matcher_utils.py": { + "path": "/vllm/compilation/passes/fusion/matcher_utils.py", + "sha256": "50ac5714ce1bb113520de769ea6234316acc470a8cdf2537a996ce9a9d54337d" + }, + "vllm/compilation/passes/fusion/mla_attn_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/mla_attn_quant_fusion.py", + "sha256": "a966fe7f58bf9228379f793f5fd851735a97f9639722766b2a20cb79a9e4baec" + }, + "vllm/compilation/passes/fusion/mla_rope_kvcache_cat_fusion.py": { + "path": "/vllm/compilation/passes/fusion/mla_rope_kvcache_cat_fusion.py", + "sha256": "1602cc28055ffa8d1123ddb1d256bf0bd12006fd06ea7e16a986c55746dbe0dc" + }, + "vllm/compilation/passes/fusion/qk_norm_rope_fusion.py": { + "path": "/vllm/compilation/passes/fusion/qk_norm_rope_fusion.py", + "sha256": "aebc7d1a5189b65ac665afcc169e7baebd53efe719c48e35e7c5babe85af0d39" + }, + "vllm/compilation/passes/fusion/qk_norm_rope_kvcache_fusion.py": { + "path": "/vllm/compilation/passes/fusion/qk_norm_rope_kvcache_fusion.py", + "sha256": "f0cfd0d83ec4acb09f9bf91d199b114e9d4995e3059c13eb23a6978ce7c07eb2" + }, + "vllm/compilation/passes/fusion/rms_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rms_quant_fusion.py", + "sha256": "4852aa44e0e2087043fdac271bda9b8d9bfe3201bb84ce3919b8ed454d8083c4" + }, + "vllm/compilation/passes/fusion/rocm_aiter_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rocm_aiter_fusion.py", + "sha256": "372e76c68c75209a085deec6dd22b3816be633613ca82f6f2925c1b3773d61a0" + }, + "vllm/compilation/passes/fusion/rope_kvcache_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rope_kvcache_fusion.py", + "sha256": "3a756e9049593537143b5a56ab9185a6bc83f57ed81d84226d7791a46a984b53" + }, + "vllm/compilation/passes/fusion/sequence_parallelism.py": { + "path": "/vllm/compilation/passes/fusion/sequence_parallelism.py", + "sha256": "3af7e420dcb35fff0bae0f8f599d0f1bda34445ebe194059892a434b2976d654" + }, + "vllm/compilation/passes/fx_utils.py": { + "path": "/vllm/compilation/passes/fx_utils.py", + "sha256": "730708213acf9d1b5f3176b433dfc197a5f3c81b5ce443f0923c526924833003" + }, + "vllm/compilation/passes/inductor_pass.py": { + "path": "/vllm/compilation/passes/inductor_pass.py", + "sha256": "1f380aacf7adabb8bf8b7d41c0a93473947f0716f7445bd910fd448f6c08e672" + }, + "vllm/compilation/passes/ir/__init__.py": { + "path": "/vllm/compilation/passes/ir/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/ir/clone_elimination.py": { + "path": "/vllm/compilation/passes/ir/clone_elimination.py", + "sha256": "5297078f5cddce081faba5215814275381d2083b32318fcfeb2bf9d69fedb7c7" + }, + "vllm/compilation/passes/ir/inplace_functionalization.py": { + "path": "/vllm/compilation/passes/ir/inplace_functionalization.py", + "sha256": "2dc4f22c6f05224828c2941479185b1452d4490f488b7f0bfd124334e7809fed" + }, + "vllm/compilation/passes/ir/lowering_pass.py": { + "path": "/vllm/compilation/passes/ir/lowering_pass.py", + "sha256": "d9c3d90f63138420f0e5489447b5996573fcfbbab939da2efccd00848492b172" + }, + "vllm/compilation/passes/ir/utils.py": { + "path": "/vllm/compilation/passes/ir/utils.py", + "sha256": "f59d33a6c7d0616cbeec1e9fb1d6c948881bf81fe124caeb906eac2e2197ea21" + }, + "vllm/compilation/passes/pass_manager.py": { + "path": "/vllm/compilation/passes/pass_manager.py", + "sha256": "486979a058aa2e20ebedcbb6e039f7a59f38d2efd2cda11219fae4067be0968d" + }, + "vllm/compilation/passes/utility/__init__.py": { + "path": "/vllm/compilation/passes/utility/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/utility/fix_functionalization.py": { + "path": "/vllm/compilation/passes/utility/fix_functionalization.py", + "sha256": "ad5b504a05ccee023869b0c8df70ec2fff9a4a80d25fd903e2b532f470e7203f" + }, + "vllm/compilation/passes/utility/noop_elimination.py": { + "path": "/vllm/compilation/passes/utility/noop_elimination.py", + "sha256": "8abf85d28c13f95059f2acbc0275b9b9ed2ad4990f7c5763bbe3067a4aa629ce" + }, + "vllm/compilation/passes/utility/post_cleanup.py": { + "path": "/vllm/compilation/passes/utility/post_cleanup.py", + "sha256": "1c38b14fc209165cbcf8ca763a17ac4e528b97f59b573e5d52df2cce7d758de3" + }, + "vllm/compilation/passes/utility/scatter_split_replace.py": { + "path": "/vllm/compilation/passes/utility/scatter_split_replace.py", + "sha256": "138402cc3097768a32e9e5b8d1a054b6176e494bddc8684e23ca2dc5fdc3fdda" + }, + "vllm/compilation/passes/utility/split_coalescing.py": { + "path": "/vllm/compilation/passes/utility/split_coalescing.py", + "sha256": "0b02acd9e1ad43d7b3e128b914e969b9580773f2818078846dfbf163a8bd0871" + }, + "vllm/compilation/passes/vllm_inductor_pass.py": { + "path": "/vllm/compilation/passes/vllm_inductor_pass.py", + "sha256": "4f83ffb67f834a214221d810c7843a8e41eb4e5930eb40adbd8cf054ff6fb9c6" + }, + "vllm/compilation/piecewise_backend.py": { + "path": "/vllm/compilation/piecewise_backend.py", + "sha256": "6525318ff3ca2e4978e24dd9232a7ae0a02e920e19604b83db6f6043d1f8a54d" + }, + "vllm/compilation/wrapper.py": { + "path": "/vllm/compilation/wrapper.py", + "sha256": "c1b1fca679ea16aa07a696831a810c0d531da2bb0ea32dd6f1a95cdaef36de07" + }, + "vllm/config/__init__.py": { + "path": "/vllm/config/__init__.py", + "sha256": "56fb0cb1598d297e4f95a97e5d86dc624145d1532f5faa432b7d2834d7155bd5" + }, + "vllm/config/attention.py": { + "path": "/vllm/config/attention.py", + "sha256": "c41f345b512d9b7df882328257eb3a6381f41088c11ae83b5ecd8a9e8265d1bc" + }, + "vllm/config/cache.py": { + "path": "/vllm/config/cache.py", + "sha256": "f1c226ba679c884930dbfcaf41a57248b137a9a20d3ed8e3d3b31752bb484c07" + }, + "vllm/config/compilation.py": { + "path": "/vllm/config/compilation.py", + "sha256": "c9cec5c7200e8e559810ec8c30113ad61dab6780f9f7fb3c116bd0d9b5a43065" + }, + "vllm/config/device.py": { + "path": "/vllm/config/device.py", + "sha256": "7b82eee02ceb5842337451a27a3d5729920c47e25e8f6bf3997f5146f9330a9c" + }, + "vllm/config/diffusion.py": { + "path": "/vllm/config/diffusion.py", + "sha256": "1fa9fd2478a866098a28a3586b55af2f9738656b7813a55d76539c10dd99fe8d" + }, + "vllm/config/ec_manager_config.py": { + "path": "/vllm/config/ec_manager_config.py", + "sha256": "418b387dbe7bdf67deddce331c205768a2d42aea37141f59fb02a8a1528e3552" + }, + "vllm/config/ec_transfer.py": { + "path": "/vllm/config/ec_transfer.py", + "sha256": "0eabb2c25194676d23c6acf59562672a1dd24415043ac5737d621ce0d681ec70" + }, + "vllm/config/engram.py": { + "path": "/vllm/config/engram.py", + "sha256": "34043a22385a041d4e9be8857f64174c990c2ca8308b97b6a952b5ab96c20ee5" + }, + "vllm/config/fault_tolerance.py": { + "path": "/vllm/config/fault_tolerance.py", + "sha256": "b166b24373d599fb15ddc575e3061cf0dcb42174d0369d8468008e7ffbb2a4e2" + }, + "vllm/config/kernel.py": { + "path": "/vllm/config/kernel.py", + "sha256": "27e23c584cf862f4091858db6dc85bbc2a01f4baf9dca3f232ae6f3bac02390e" + }, + "vllm/config/kv_events.py": { + "path": "/vllm/config/kv_events.py", + "sha256": "b1dbaee3e6830e381e9157fe3bab0d65c357da88ff7cdf8b1e4b3a4e75c82a87" + }, + "vllm/config/kv_transfer.py": { + "path": "/vllm/config/kv_transfer.py", + "sha256": "506fae7a9d7f32cb3646156cf9249a856f6317dff6c4c85db70efd34418c429b" + }, + "vllm/config/load.py": { + "path": "/vllm/config/load.py", + "sha256": "bd6431c22e078362d749a56a2c84145432ebf2605d8bcfa2ac679182d18ed630" + }, + "vllm/config/lora.py": { + "path": "/vllm/config/lora.py", + "sha256": "ed6cf6575f5950f079a62f904caeae93d1a4745dd8c21788b74367883bcd4b08" + }, + "vllm/config/mamba.py": { + "path": "/vllm/config/mamba.py", + "sha256": "2090f791201ca45dd4f1d72b8651268890eb07574b6084721194eb8fdf612c48" + }, + "vllm/config/model.py": { + "path": "/vllm/config/model.py", + "sha256": "f4168b67cc93ce72ff2a6d4c66974223e32fd0f1fab4c05e44bd68a275e18d69" + }, + "vllm/config/model_arch.py": { + "path": "/vllm/config/model_arch.py", + "sha256": "2babe28329d7b60b4e205f6d72c687f0f66e6535aa2f20411469e5ec362f6b5f" + }, + "vllm/config/multimodal.py": { + "path": "/vllm/config/multimodal.py", + "sha256": "271911aee151f17f092228cecee82af0713e9a47340ffdf66834ca7638a50d22" + }, + "vllm/config/observability.py": { + "path": "/vllm/config/observability.py", + "sha256": "d57c59ec776477ab0a20e9f2b945bc954d8ea3737c869259480e9aa10dfb9f6d" + }, + "vllm/config/offload.py": { + "path": "/vllm/config/offload.py", + "sha256": "6f2db3d9a2730588473d5155811690c6241b167a21dcb62fbbd9ebb6386de42c" + }, + "vllm/config/parallel.py": { + "path": "/vllm/config/parallel.py", + "sha256": "f012ace89e3fb730a467f729f602679bc145c49f0d10721811c9d818570e7b2b" + }, + "vllm/config/pooler.py": { + "path": "/vllm/config/pooler.py", + "sha256": "9f01913dcb7bccbf9b672b16643f18471ae202455992e8afaf0725a17f2b3d08" + }, + "vllm/config/profiler.py": { + "path": "/vllm/config/profiler.py", + "sha256": "04d24fa1dc7cfedca6b5c7d9115f7f7021722fc46a5b15234a1e3b3a506c93e5" + }, + "vllm/config/quantization.py": { + "path": "/vllm/config/quantization.py", + "sha256": "acffc52f525b39a88efd656f1ed705ce3a1b758298bb0684fac7694776bc10b4" + }, + "vllm/config/reasoning.py": { + "path": "/vllm/config/reasoning.py", + "sha256": "2c4f7bdee48a9fb3d93787c4c32361c2411417cce452cfde86808d8759977861" + }, + "vllm/config/scheduler.py": { + "path": "/vllm/config/scheduler.py", + "sha256": "822179da62be4bca0619c8590082ae09123f5c4415f9cc2037be673748239edb" + }, + "vllm/config/speculative.py": { + "path": "/vllm/config/speculative.py", + "sha256": "9c642a87264339c0dbc1d0b57330572149df0f9d5e16c6893b9895e50a619e19" + }, + "vllm/config/speech_to_text.py": { + "path": "/vllm/config/speech_to_text.py", + "sha256": "bf4a566fbde6a1cec1e209070b739650c3302c12696739c88049cb8f723a4c3f" + }, + "vllm/config/structured_outputs.py": { + "path": "/vllm/config/structured_outputs.py", + "sha256": "55649776594349b8b4aa3e08fc4c88068366732a486d6fb235079188044aa829" + }, + "vllm/config/utils.py": { + "path": "/vllm/config/utils.py", + "sha256": "d035e9e488ba92b6c47a96cf05d9b2a850d53eda8a05115b22ff9af8dbc2fc64" + }, + "vllm/config/vllm.py": { + "path": "/vllm/config/vllm.py", + "sha256": "956b812e5a719bcbfa3a3958801361b38b9c928c96b8c073311bbb96376dfb7a" + }, + "vllm/config/watermarking.py": { + "path": "/vllm/config/watermarking.py", + "sha256": "30e6620a3cd7529f0736ad55e38bc326a6a78dee4552f0722208400041c94a1f" + }, + "vllm/config/weight_transfer.py": { + "path": "/vllm/config/weight_transfer.py", + "sha256": "92edd9e5ea90c97a8f3c5f20abf1734a105ee1f3f89e306e7ba87e758f1f767e" + }, + "vllm/distributed/__init__.py": { + "path": "/vllm/distributed/__init__.py", + "sha256": "97f28c30b32662af8cab163939e4ee423037f11630752e13b55cbc25a7d0ab71" + }, + "vllm/distributed/communication_op.py": { + "path": "/vllm/distributed/communication_op.py", + "sha256": "3c3f8ac60db38ece891d39dc1e2f6f1947ad438685893d2e5777d072320bd1b8" + }, + "vllm/distributed/device_communicators/__init__.py": { + "path": "/vllm/distributed/device_communicators/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/device_communicators/aiter_custom_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/aiter_custom_all_reduce.py", + "sha256": "f8eb027ce7a85d94af6260960ceb7f36fc6f1406c9af9c9b6285fddb3f178009" + }, + "vllm/distributed/device_communicators/all2all.py": { + "path": "/vllm/distributed/device_communicators/all2all.py", + "sha256": "1f1b69236acd3cd7bd94520fd6d591bfd31b57c4bc7c9f9f4161ea8bbd0c5f26" + }, + "vllm/distributed/device_communicators/all_reduce_utils.py": { + "path": "/vllm/distributed/device_communicators/all_reduce_utils.py", + "sha256": "ed0ab4dd05b2519a6313892e68824c97b540034664d7f8c3d031b322e33e1bfc" + }, + "vllm/distributed/device_communicators/base_device_communicator.py": { + "path": "/vllm/distributed/device_communicators/base_device_communicator.py", + "sha256": "4a7670f12ed7c7621b25d476e2687c24ca01f3be183fff4a6a25337596fe506b" + }, + "vllm/distributed/device_communicators/cpu_communicator.py": { + "path": "/vllm/distributed/device_communicators/cpu_communicator.py", + "sha256": "e1856c8e91cfbbb4d9ce990c1236e258ba4021e226afcbab645653380b38d64b" + }, + "vllm/distributed/device_communicators/cuda_communicator.py": { + "path": "/vllm/distributed/device_communicators/cuda_communicator.py", + "sha256": "102d95c67ec798cf352b817ba92e8abc9da37f30d1bbdf3aab45d3927b627b93" + }, + "vllm/distributed/device_communicators/cuda_wrapper.py": { + "path": "/vllm/distributed/device_communicators/cuda_wrapper.py", + "sha256": "333b6d9ed173e7a18c7f2b6627a3c9c9ed88892ce52015f05e29d6d245e48ee3" + }, + "vllm/distributed/device_communicators/custom_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/custom_all_reduce.py", + "sha256": "a048c1327c23580805600c0c951831bec333b1ffc4eb26a0e3d34119c4f0c445" + }, + "vllm/distributed/device_communicators/flashinfer_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/flashinfer_all_reduce.py", + "sha256": "b4359760e9b55963676109a5c3a015fb82e190d4df1d021de9ee01e7814cbdda" + }, + "vllm/distributed/device_communicators/flashinfer_pcie_ipc_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/flashinfer_pcie_ipc_all_reduce.py", + "sha256": "8b67b0fc356a565095f56b475cc89c513e3a5eff051ab1c52e5beb0c1a79e9f2" + }, + "vllm/distributed/device_communicators/mnnvl_compat.py": { + "path": "/vllm/distributed/device_communicators/mnnvl_compat.py", + "sha256": "72ee1e6f9571b4c8ecbd9f60cd469d1b565cb79cab519a688a93f290906a2615" + }, + "vllm/distributed/device_communicators/pynccl.py": { + "path": "/vllm/distributed/device_communicators/pynccl.py", + "sha256": "882fb83c5a3c565a3f8fd664b79f5ceae566dca180019ecafd74bc8c11d9f8cf" + }, + "vllm/distributed/device_communicators/pynccl_allocator.py": { + "path": "/vllm/distributed/device_communicators/pynccl_allocator.py", + "sha256": "390e2576cbf4ae06341ca4dab24fc7e4d4f7c24dd444329ed05d828a9ce91460" + }, + "vllm/distributed/device_communicators/pynccl_wrapper.py": { + "path": "/vllm/distributed/device_communicators/pynccl_wrapper.py", + "sha256": "ce63c8da57bb88d4cf89956bd70bb63f0f44bfad468ddb37b765611551f6d99f" + }, + "vllm/distributed/device_communicators/quick_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/quick_all_reduce.py", + "sha256": "8aacb23e7c297b0ae2f80d99c5affd2e7517115d7874be51069d14a44db7b5f2" + }, + "vllm/distributed/device_communicators/ray_communicator.py": { + "path": "/vllm/distributed/device_communicators/ray_communicator.py", + "sha256": "332c37f65495b60564d61db59bc2d30ca0236adc33442d01464790bde9aec897" + }, + "vllm/distributed/device_communicators/shm_broadcast.py": { + "path": "/vllm/distributed/device_communicators/shm_broadcast.py", + "sha256": "f3e7a3f3ff713fccbd535e0d41650ee05bdf8677e83d4b90519910645022c30b" + }, + "vllm/distributed/device_communicators/shm_object_storage.py": { + "path": "/vllm/distributed/device_communicators/shm_object_storage.py", + "sha256": "e097bf7ac0141fe8db4131e8fd553ca2ad5b0600b22a56f3924af6b795e7207c" + }, + "vllm/distributed/device_communicators/symm_mem.py": { + "path": "/vllm/distributed/device_communicators/symm_mem.py", + "sha256": "b06e3ddb9ae880a30ec4a103ce32eb9794223bb0293832e89572af28adaaa544" + }, + "vllm/distributed/device_communicators/xpu_communicator.py": { + "path": "/vllm/distributed/device_communicators/xpu_communicator.py", + "sha256": "527cbfb250760abc62096ee7cd612307b821f21b72dee1687ad866620ec89b6d" + }, + "vllm/distributed/ec_transfer/__init__.py": { + "path": "/vllm/distributed/ec_transfer/__init__.py", + "sha256": "061405bb51df7409c9938b62e25caa8bd6ebf85da6d1700dbd4affe2a0825135" + }, + "vllm/distributed/ec_transfer/ec_connector/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/base.py", + "sha256": "22d4913375bb622473fbe1a77f9376b804949cd8a7e31e9518208f9561d161e2" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/common.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/common.py", + "sha256": "e2267abd8d00a6d2605e1a82ea5c73396a71b427452eab469fcca0134c334e7c" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/connector.py", + "sha256": "72cd35d9fd754a2992dd090a8af13c91e0789b4038ac29276750d823120235db" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/base.py", + "sha256": "19e8df88b0fa831997896355ecdd49e0d86cb074cd7ae28aed0b328b0bb3ab2e" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/zmq.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/zmq.py", + "sha256": "435641c0e37551ab4937855abd067be26905b91215e759cbd9d28a419a34ff9a" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/base.py", + "sha256": "3be698aeb67d32ee3741e76b2fb71806941c587578583acf8fbc42fbf22b46a5" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/nixl.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/nixl.py", + "sha256": "03af8f6549a6027b7262a482907af591e45f28b9b1c5a3408bbc6600e38797e5" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/ec_shared_region.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/ec_shared_region.py", + "sha256": "e40607952c9920024455eca2f419e8c3ef1de9a4d8b27c147a33bb941b8c08b1" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/protocol.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/protocol.py", + "sha256": "05878336884396bfbef77b96b0fa6359f6fa0aba912961f14a84f5a436f27038" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/__init__.py", + "sha256": "01c42385bf3a55cff09cc05ba956f6dd4b8b6b986bf4d6eca4e566cb045b48e0" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/embedding_cache.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/embedding_cache.py", + "sha256": "7359fb980af1fc30b3253681310ef636e2b4a19134e04a93270c9c45de2572d8" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/session.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/session.py", + "sha256": "5973548a919e13c866222b91d502686a6757a31e5a5664b879bf2887ed9fb212" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/utils.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/utils.py", + "sha256": "160ac665f20f2c75b343c1e784084f2b0b4d1cf8fdb28ee15deee4dc8ed0ce45" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/worker/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/worker/__init__.py", + "sha256": "f08d296d3560c42173ae8af961af4a768033ccf1e36e9c17c0cdd53013d0c52e" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/worker/descriptor_buffers.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/worker/descriptor_buffers.py", + "sha256": "be7c81be214e995da8499105ba485854d9c19d6f8e905f8f1b87b83694ca0864" + }, + "vllm/distributed/ec_transfer/ec_connector/example_connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/example_connector.py", + "sha256": "09022ce07a89114bb65d9befd2e60873453aed11bbac8c0a75c1e6084e785a5f" + }, + "vllm/distributed/ec_transfer/ec_connector/factory.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/factory.py", + "sha256": "d6cedca0a99c3dd2b03cd1c15d17472b983e3f7d8f5baf4a12eecaf6abedb817" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/__init__.py", + "sha256": "1cbfc2f95f8f4d48a9253056eb1fd4b562062884e3fd5cb6571583c352fc16f3" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/config.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/config.py", + "sha256": "98c60696f79d1de67d2364cd9e8a42a393b5c8e17ed9af2f971368e47891d7b3" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/control.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/control.py", + "sha256": "58e0d1a423fbe958bfa586ac26a17107e08d0b31d044b4c74ab4dde880e7ca9b" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/memory.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/memory.py", + "sha256": "d5e90b1348de670a70f110d58eedcbdbd053db72c21dd007c3f5275c53951149" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/metadata.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/metadata.py", + "sha256": "497a7e6dfffb7fce80a41d5989f96119b970c143df77bb9d0f9c91d7a46e8c42" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/producer.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/producer.py", + "sha256": "97fa4d0b19475574778eab02f55fad73db9642beb9156da890314fd53fa1a7ab" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/reservation.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/reservation.py", + "sha256": "4790bc65cde4db5f17733ca2c2910980ba594a8a9b79ee27c5b957dffd4c1113" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/scheduler.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/scheduler.py", + "sha256": "53004b62529a31fdd80dfb2e6026610b95041a77e91f731ae526fefd84e7968d" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/state.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/state.py", + "sha256": "92f375d6c5cc9c83dbe95a7977ad8eb0f1b5629ccee92968bcacdc94eee15d65" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/transfer.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/transfer.py", + "sha256": "ada2113a5402054f1149d3edc2537f4e5e1bd696c9b17291c9f2b4cbf6b59753" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/worker.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/worker.py", + "sha256": "89eb91bb64845b3b121d502972a6b04d448714253becd2ea662e5691cd5acdd7" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake_ec_connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake_ec_connector.py", + "sha256": "aaebab4711bc00dd0c622dfbfd8639fc41e7ed5d1658d7d68fe33e4d5fbef3ba" + }, + "vllm/distributed/ec_transfer/ec_connector/utils.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/utils.py", + "sha256": "11b9014b9c0697f8846deff1a55a22fa86a15dc2ac3e139442fb6d513ac03059" + }, + "vllm/distributed/ec_transfer/ec_transfer_state.py": { + "path": "/vllm/distributed/ec_transfer/ec_transfer_state.py", + "sha256": "9487a41f23fa1a4fa6dfca8b42b8e97a0ee19d8406ffd1dcf4bef66315180827" + }, + "vllm/distributed/elastic_ep/__init__.py": { + "path": "/vllm/distributed/elastic_ep/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/elastic_ep/elastic_execute.py": { + "path": "/vllm/distributed/elastic_ep/elastic_execute.py", + "sha256": "b8f60a4183c79ff6051095b5f95bb385bc7fea0cffe8cd9ebc9087ab0e9f01b5" + }, + "vllm/distributed/elastic_ep/elastic_state.py": { + "path": "/vllm/distributed/elastic_ep/elastic_state.py", + "sha256": "fbf049199841a086fdf2fc1ab8498ef017ad3bf319db65c3ae61acbb536d2e10" + }, + "vllm/distributed/elastic_ep/standby_state.py": { + "path": "/vllm/distributed/elastic_ep/standby_state.py", + "sha256": "15282597550ebd0e07b8492ff192aea1ec0dcec8f0ad34009123e1002cc140c1" + }, + "vllm/distributed/eplb/__init__.py": { + "path": "/vllm/distributed/eplb/__init__.py", + "sha256": "1b9c2ee22abb5888c354c5aa01f0944f253e5e24e135d019778398bbe495a628" + }, + "vllm/distributed/eplb/async_worker.py": { + "path": "/vllm/distributed/eplb/async_worker.py", + "sha256": "424328600ad1003286fc5dfffa1f9482007314c060947818b2f94a8b97811f5e" + }, + "vllm/distributed/eplb/eplb_communicator.py": { + "path": "/vllm/distributed/eplb/eplb_communicator.py", + "sha256": "ba30d9d40e7b81d3f42aa9041d2f328edca4073cfe2de920285eb68375501ed8" + }, + "vllm/distributed/eplb/eplb_state.py": { + "path": "/vllm/distributed/eplb/eplb_state.py", + "sha256": "2f06bc8c63f3fdf55edb5032ae55c0ffcac3e67720ce74ea312e3d141b12acf4" + }, + "vllm/distributed/eplb/eplb_utils.py": { + "path": "/vllm/distributed/eplb/eplb_utils.py", + "sha256": "058af6104faa6d4085c1dca80bbe60d92bf0a7ec9cd92c775a180546c9d8c9c3" + }, + "vllm/distributed/eplb/policy/__init__.py": { + "path": "/vllm/distributed/eplb/policy/__init__.py", + "sha256": "daeb266c88442832b1ab8c8c4cc064891b38b9e9ba00aea324f926c87dc6d37e" + }, + "vllm/distributed/eplb/policy/abstract.py": { + "path": "/vllm/distributed/eplb/policy/abstract.py", + "sha256": "b9fd34c28bbfdded03360d7f3f6f8fb978e82689190d7ae4501dfe520e958c62" + }, + "vllm/distributed/eplb/policy/default.py": { + "path": "/vllm/distributed/eplb/policy/default.py", + "sha256": "3b54229e6240d050480390f6b29d4744fd38437d23719f78a6decf7002296a29" + }, + "vllm/distributed/eplb/rebalance_execute.py": { + "path": "/vllm/distributed/eplb/rebalance_execute.py", + "sha256": "b387e228791149018536eee96cf955b33ba79d801cdc36849d1b47a580ec2597" + }, + "vllm/distributed/kv_events.py": { + "path": "/vllm/distributed/kv_events.py", + "sha256": "de08f01e8736881560256c350a3b6418999dd4aa30f9c6ec9159527f7ed6899a" + }, + "vllm/distributed/kv_transfer/__init__.py": { + "path": "/vllm/distributed/kv_transfer/__init__.py", + "sha256": "c1be4e58ec6923bae607a355ad22891c740f056a69ff7358b1e10ea3fd2680ea" + }, + "vllm/distributed/kv_transfer/kv_connector/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/base.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/base.py", + "sha256": "2ae2a2c48f5731f3533166a75440fe91e764332305b5d713df840edba970789d" + }, + "vllm/distributed/kv_transfer/kv_connector/factory.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/factory.py", + "sha256": "add99c93c587b0098b90b1f8fd6940bdd1f15c236c5c6f1a258411863cb902d3" + }, + "vllm/distributed/kv_transfer/kv_connector/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/utils.py", + "sha256": "317ed40dc837671ca6e666165222e641a0f9b3992aea63bbf54de7e13d40b3a4" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/__init__.py", + "sha256": "5beb6ccad12fdcfe1581982da6f18321caca50e73a6b3259ebf3c8dc8b3ffcca" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/base.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/base.py", + "sha256": "97af64220475c6c9e8273438d7b5138b105ebe6944beb783facb36a3bb76f31b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/decode_bench_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/decode_bench_connector.py", + "sha256": "b4151c88cdec28f1ff9259047abc17baf23b892f4b68769a93bf26e0442b9017" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/example_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/example_connector.py", + "sha256": "6226876ef52d10d0d284d29c337ab44698e8bac6abdb2e0ece53b5756c55d068" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/example_hidden_states_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/example_hidden_states_connector.py", + "sha256": "58c22534dcad0fb73599a2d70a2fb104d5b612a4723be5e777f56a56fe07892c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/flexkv_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/flexkv_connector.py", + "sha256": "de4f68c3bd565ed898e47e0b2980049b966ff31888f1957050d30995d4953762" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_client.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_client.py", + "sha256": "bea6ecff2be281c7e96c1551c7bf463cbb01f2964696067c0ebdb683844f9aab" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_connector.py", + "sha256": "e67ed58015090e5eea9d499883f2a9422673d07f8bdbe0ccff7db15d2460de13" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_metadata_server.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_metadata_server.py", + "sha256": "6800e5cf37809f8a8e28c469c14a434db288bc3bf83a8b62ee06910a20c2da19" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/common.py", + "sha256": "8f2c02c08227a9093e6aeb183961aba36b7812cfc29b8c047a2b2c9d82f79c15" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/gather_scatter_helper.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/gather_scatter_helper.py", + "sha256": "08c1b43de34fbeca77357d7576ac1d17cba974b59d695562f68bb713061e7b54" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/hf3fs_mock_client.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/hf3fs_mock_client.py", + "sha256": "bec61a9b0c4b9124b2292d7646d76411da44396389349b53cdcbc46353c8780e" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/connector.py", + "sha256": "8c61094ce0a3a702908f9576f69482e6bf314738a2cbe33a7d3b47258fa0ab43" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/stats.py", + "sha256": "d9383a6ad6ab6b8f812d29d90495407b770eeddb79b86e9d0e3216c0bd16e0ed" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/worker.py", + "sha256": "251c0d8e57e4739c03ce3e1c899a95ff5b1752eb27676c28ab88c4ebd62c4776" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_connector.py", + "sha256": "5991f9ff8832df32bd421eb67e48237270ea0a408180e523810bb43606acf8f3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/__init__.py", + "sha256": "c53be9796e76cde637514bfc40a525d8c09bb2784b406cb516790d8285dfe433" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/multi_process_adapter.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/multi_process_adapter.py", + "sha256": "6480d67b31ed603027a83edf327880a38aee45eaeee2da9a4efa93e95527c166" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/utils.py", + "sha256": "e204fa6a853ac9c122d7a4e9d146902230f81c48d4321ed5edfdbf979dd49ba2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/vllm_v1_adapter.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/vllm_v1_adapter.py", + "sha256": "e6fe55049c6b007248516d69640e2f3a4809f9d286091a1014ae0949987fa8f1" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py", + "sha256": "c712c386a7c57bf0355a1441ba574232c3aa5498fcb70713a2b3f5d18b64f9c1" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/metrics.py", + "sha256": "de1b1797d0448f74370919dbb0278767f390e8f59e00a0c0528abefb302babc2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_connector.py", + "sha256": "516be01320e64b0110e102eeb69a6ba766dd5ac8cb3036db6b97b7d54413323d" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_utils.py", + "sha256": "26877610463fa8e9d6b092772f2551bcc0c3ac794cbe63996df0414666a8ebba" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/rdma_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/rdma_utils.py", + "sha256": "716e5042edecaba36c7ca763474988f32fa09c2668b8260260149df610af8f83" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/stats.py", + "sha256": "f39b2f0b1db2e4f922e27e684a3f7bbf5bb279b82a0a8c3bb0c7ae69b6d14d24" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/connector.py", + "sha256": "17a350bdb89e17e415d6c52a48684dc15c35a804378daf03e1f3bee1b1b123a3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/coordinator.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/coordinator.py", + "sha256": "a8eb6c2157a96e8d25233b82347ac8409a41d6390b4f2c64242119c05911010c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/data.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/data.py", + "sha256": "d3cfefdb4165a24995749cba452641b318065baa95bb1bae62f922a2f8886e7b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/metrics.py", + "sha256": "f2b9ef8927632d142aad11a374d0725c6e619ea0bb7fea9eda3f3895eb7d277a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/protocol.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/protocol.py", + "sha256": "ccb1cf6a84a932a375215627d2aaac482c351a05df015d636d05373a6845b7c8" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/scheduler.py", + "sha256": "283849ff581ec206444cdf5621622377f1c925e8d7e05cb9294af2f3a5094e79" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/worker.py", + "sha256": "55f1682dfd1ed7af689166421337126a0e1d08afa4774a242e098d79e0c1e95b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_common.py", + "sha256": "549bb4fe22dca5095515b9c0712c31cc81a9d4923881e9f112317640fd8c04ab" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_connector.py", + "sha256": "c0f474bc34b579d889fae92eaf43eaca241be51a4697a187a942f0df4e6b6a98" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_engine.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_engine.py", + "sha256": "d842f3772fc6588d5a329a67572324cb74709aa3df4033e64c791a1e706c8e88" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_layout.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_layout.py", + "sha256": "2b4ec046a78897236b0626939bb828b6ec095355097d10bca39e5f3e1c992553" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/multi_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/multi_connector.py", + "sha256": "12d8387239f3194f2cb63ccbd64824648047210323572d66671e6a1eed349fc3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/__init__.py", + "sha256": "cc3145fe3b6d219a267bf40a0f7c0cc9430e4289f94acab2df761b99b671e7ba" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py", + "sha256": "7a1db8c54e4cd846bdac747344f2aea2c2fcf507817928796063225223b7e169" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_worker.py", + "sha256": "49a2e4faf99bef146b5a1d4d18d48f240b1e561c438252274494b359db96ef52" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/connector.py", + "sha256": "b6a0dc916d052f344be72ecfcb111509c13580102c11a860fa726cf0888949a9" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/metadata.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/metadata.py", + "sha256": "2b23a07c1ec5ac5490c3b818737c7192e344ea9f52cd5623f75939f741ab4e21" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_scheduler.py", + "sha256": "ac3daf8e2246581fec84ab28f2133569421b62c32a120be4923e2f4d0f2f9de9" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_worker.py", + "sha256": "e5060c9b6cf022de35ca3d1da7a369cd6a6a2dea26219af9f7633aaf78af8a76" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_scheduler.py", + "sha256": "2d9008e33937a4d6c5cf9cc2f96160f2bdbc8e987fe37f0798a7fd7eb84c9572" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_worker.py", + "sha256": "87de3ea383dd3aa95fb2c287ea26ded8a330859cc1295f9faa69047e80865c2c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/scheduler.py", + "sha256": "09f1bfe7075b926b26a94529480e33b62c3ac273ff826f6c502084f08b1b2a08" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/stats.py", + "sha256": "3e710654e0b68d1a8592f0c4735c81b22f4bf698fb1a2dfea126d35bf2dd1ef2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/tp_mapping.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/tp_mapping.py", + "sha256": "2d43607f98701b2fad6cc0ac2767619a80b7fc2b3a3c2eb6ed0da4fb05dcd8f6" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/utils.py", + "sha256": "93de863fc8307a61d40b62f1b176b57ae93c363d34b9e9ddc8e666265b6d45dc" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/worker.py", + "sha256": "5134a36ac100ce7a64f5311029a37ac12c38d91093f63100f51f7fe53ea7c3ee" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/canonical_mapping.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/canonical_mapping.py", + "sha256": "e0b3c6f9806a650e0370c43c5068fc31c0fec94615089e15fdf270d7d96f2b64" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/common.py", + "sha256": "9b3f042c6fa1581d10e8f688d2d9bc927bb41b780a9ea01f514d57228e20c978" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/config.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/config.py", + "sha256": "aea82e60889e78dcad8564ec8285b65a6a372824a1545a98ea8e78b6f4fd418a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/events.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/events.py", + "sha256": "d7039b67be95fd444966628184040a94880873c0611c0e6e7525a22650ffdefb" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/metrics.py", + "sha256": "13d76df014e86691f58dc89a879f9808b124690c9267dd5fa3b2d4004d4c5fdf" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py", + "sha256": "2c5282f4a3165cd787fb355e215e3869f1bdd3f2c795b2155fc537c9d135191a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/worker.py", + "sha256": "acc2df53262441dfc6421a3af7f0cbd68cbfaedbd42bbc384d8e1da2d965d194" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading_connector.py", + "sha256": "cdc16ca7339a10e1993bd6220e6273f86a4e99779f58f25098a24ad31bb0dbd8" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/simple_cpu_offload_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/simple_cpu_offload_connector.py", + "sha256": "96238ca82ccf07a1eeb59b8f66de17b09034e3eb993ad9a0a836511d3f69706b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/ssm_conv_transfer_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/ssm_conv_transfer_utils.py", + "sha256": "59a949709482e65a007fbe5352fe9b4bb54c2dcc10ad2c1c41f754b6e13299f4" + }, + "vllm/distributed/kv_transfer/kv_transfer_state.py": { + "path": "/vllm/distributed/kv_transfer/kv_transfer_state.py", + "sha256": "2e5fe09438d6e2ee642f8a26cf7dcf632e870d955d30baf002b76a8bfe836d05" + }, + "vllm/distributed/nixl_utils.py": { + "path": "/vllm/distributed/nixl_utils.py", + "sha256": "0bffa3c052c9f67472b1c0bc3816114891b010c968bf4b8a292e7da4d687db53" + }, + "vllm/distributed/parallel_state.py": { + "path": "/vllm/distributed/parallel_state.py", + "sha256": "d9b10ad56833ebc08a753e1a050ef0989c30d4134021b7b7b00150b7bd01adc6" + }, + "vllm/distributed/stateless_coordinator.py": { + "path": "/vllm/distributed/stateless_coordinator.py", + "sha256": "f52848fbe985ed47b1f3e3ca555314736ca06436e8d738ab4390101f0672dcb0" + }, + "vllm/distributed/utils.py": { + "path": "/vllm/distributed/utils.py", + "sha256": "792146b357139e705064a68d3b66858de8a0baaca4dc7db1232fa217d45db231" + }, + "vllm/distributed/weight_transfer/__init__.py": { + "path": "/vllm/distributed/weight_transfer/__init__.py", + "sha256": "3fb9d4712b7c131d522f5e76e73cd8c333f3cc7af86e2d5ecf9b61b57b3b7f5a" + }, + "vllm/distributed/weight_transfer/base.py": { + "path": "/vllm/distributed/weight_transfer/base.py", + "sha256": "8ab06feb04f1379d0558fbdb77fde46bc84f179e0a26742cabab937e88caa38d" + }, + "vllm/distributed/weight_transfer/clients.py": { + "path": "/vllm/distributed/weight_transfer/clients.py", + "sha256": "ff85c79c350241e6d2749ca23c9d295a3289b4b62bfdf0257d32eb94a0151d36" + }, + "vllm/distributed/weight_transfer/factory.py": { + "path": "/vllm/distributed/weight_transfer/factory.py", + "sha256": "4e979eeac8c5bcdbffb10eb4765cfb30120fa7595c6c2561d3fa1a966ced61c8" + }, + "vllm/distributed/weight_transfer/ipc_engine.py": { + "path": "/vllm/distributed/weight_transfer/ipc_engine.py", + "sha256": "1af578293f387a19073c322b24143c3ae4716ce0c5d2bac2a4ef26fe20119330" + }, + "vllm/distributed/weight_transfer/nccl_common.py": { + "path": "/vllm/distributed/weight_transfer/nccl_common.py", + "sha256": "7b2ef7dc7481c3f478f17c49aa36c7bed54142ec5c93d36ed8426c8fdf09e500" + }, + "vllm/distributed/weight_transfer/nccl_engine.py": { + "path": "/vllm/distributed/weight_transfer/nccl_engine.py", + "sha256": "7fd020c919dc7b4723fb78e64da977b180d0fef0cd21df955a037b848dbaa008" + }, + "vllm/distributed/weight_transfer/packed_tensor.py": { + "path": "/vllm/distributed/weight_transfer/packed_tensor.py", + "sha256": "d0a27fb0be1dc029bd5a1d44fdb57a5e54aa4cd74308bedc339e86ac02c7494c" + }, + "vllm/distributed/weight_transfer/sharded_rdt_common.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_common.py", + "sha256": "be0b13801f24e7b62999b19d733c030510353603a2d5320d5dc98ee02daf22a2" + }, + "vllm/distributed/weight_transfer/sharded_rdt_engine.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_engine.py", + "sha256": "2f791970b4815511a7578ef6c957e7da97b071d26a39087a09a17475909791ee" + }, + "vllm/distributed/weight_transfer/sharded_rdt_fake.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_fake.py", + "sha256": "ee11164e17b5f2793252ce77741b8b94e0583046abf896a590131b2008d1fbb9" + }, + "vllm/distributed/weight_transfer/sharded_rdt_trainer.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_trainer.py", + "sha256": "dd413ff461d41826ccd3eb87d3df22f6cd7f24e09aac7644e3e5b40d7beec484" + }, + "vllm/distributed/weight_transfer/sparse_nccl_engine.py": { + "path": "/vllm/distributed/weight_transfer/sparse_nccl_engine.py", + "sha256": "e11b409454dda2b05ea34e8115ac19027c5e65cb2a5e9682c494f16a50e978f4" + }, + "vllm/model_executor/determinism/__init__.py": { + "path": "/vllm/model_executor/determinism/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/determinism/batch_invariant.py": { + "path": "/vllm/model_executor/determinism/batch_invariant.py", + "sha256": "af8f8d256a48fc214edf426fbe891fb15bd8b1d7ae98b811c736ff1eb0fae798" + }, + "vllm/model_executor/determinism/batch_invariant_configs.py": { + "path": "/vllm/model_executor/determinism/batch_invariant_configs.py", + "sha256": "72ea0d4df0ab5ae288abb7df5c203d2ad5f1709c7295d87ec72da775fddc1b7a" + }, + "vllm/model_executor/layers/fused_moe/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/__init__.py", + "sha256": "64a32665be6d5afcfbaf7a0915717267278b66b880b908b0263ea58f08e51b5e" + }, + "vllm/model_executor/layers/fused_moe/activation.py": { + "path": "/vllm/model_executor/layers/fused_moe/activation.py", + "sha256": "78dec0e85e0c040304515f64ccf8f2c6a7a2e5b9f1124a2138a97d9a02585541" + }, + "vllm/model_executor/layers/fused_moe/all2all_utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/all2all_utils.py", + "sha256": "dc4750a446f7de31d09a46034da5fdf479bc169af90f47aa9af8ae15e67b0828" + }, + "vllm/model_executor/layers/fused_moe/b12x.py": { + "path": "/vllm/model_executor/layers/fused_moe/b12x.py", + "sha256": "ee76cc6aa801e24be8ec78a9e8502061ad48667d5ff8711e43f68fba912425bd" + }, + "vllm/model_executor/layers/fused_moe/config.py": { + "path": "/vllm/model_executor/layers/fused_moe/config.py", + "sha256": "a3a87cebcc7ac85d73f471dcfafc2d899c6fc08f264777b74a0e919adac9e03f" + }, + "vllm/model_executor/layers/fused_moe/deep_gemm_utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/deep_gemm_utils.py", + "sha256": "8fdcd857eb333f9c68902105f157568d52067c94ba1e2df6dbfe0474ef1f4c02" + }, + "vllm/model_executor/layers/fused_moe/eep_reconfigure.py": { + "path": "/vllm/model_executor/layers/fused_moe/eep_reconfigure.py", + "sha256": "9d7580265e8563e1140c2bb4c3a81a35ddd54903f5ec0a2720ffc064681f02f9" + }, + "vllm/model_executor/layers/fused_moe/expert_map_manager.py": { + "path": "/vllm/model_executor/layers/fused_moe/expert_map_manager.py", + "sha256": "308c00f63fcb6f44518ec3a56d8f902c7bba75928c2e3aea30fbe1f3f473973b" + }, + "vllm/model_executor/layers/fused_moe/experts/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a16_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a16_moe.py", + "sha256": "53deea255175171971422d14082ad139b5ec7b62e21429a4c7cc0ebbefd29cdc" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a8_moe.py", + "sha256": "f3fc51b95ed89862381908a0134e326228827f44854248db9585a9c4899c34f4" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp8_moe.py", + "sha256": "af6db1760961a5a71234f8b1cdf42e9e30a236e13601b0826a75110b79724948" + }, + "vllm/model_executor/layers/fused_moe/experts/batched_deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/batched_deep_gemm_moe.py", + "sha256": "b0cd4ea706583518dc608fb56f832fc3595f24bd863b03ef1e8c22b36b873508" + }, + "vllm/model_executor/layers/fused_moe/experts/cpu_int4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cpu_int4_moe.py", + "sha256": "67170af3ba9dc4c4f71d78a72efc3fa4e366eac614936a79911dae5c75ac1864" + }, + "vllm/model_executor/layers/fused_moe/experts/cpu_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cpu_moe.py", + "sha256": "0754cd4ff1b28e6d3932a67609d335acefd28f95a841f0492923813356a6d81e" + }, + "vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py", + "sha256": "db901bdbcd3fdac23a1d74e39c51e67f14a82be787b2fd704ed1e787372ae868" + }, + "vllm/model_executor/layers/fused_moe/experts/deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/deep_gemm_moe.py", + "sha256": "16911a64a72eafc26a1bcb544a91f90144d85dc41e3ee57cf20e89925227bbb7" + }, + "vllm/model_executor/layers/fused_moe/experts/fallback.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fallback.py", + "sha256": "1bdd0a4f2ebaa40ec96a5aacc07aee61511af59e6324ce456aa65003b6e2991a" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_b12x_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_b12x_moe.py", + "sha256": "e613afe5da2742e42c717c1a0a56bd9e1c7e3e0452a828db0013d81063518954" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_batched_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_batched_moe.py", + "sha256": "295254dfeeec8df3eb8110e6f659a946cb9cded3de1565ecad4d741b3c3f3e00" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_moe.py", + "sha256": "08578bcd0cf72d6a470e40950175e73639efaa6d8d23c6da0869345312b229c9" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutlass_moe.py", + "sha256": "52887cec5fe628e0a4e7793deb546b40f6c29f7362b3b436c10ca36934ab9826" + }, + "vllm/model_executor/layers/fused_moe/experts/fused_batched_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fused_batched_moe.py", + "sha256": "2435587fc7f8fe8ea341ea0eb8f14c11f3f5b31fbbb9b29ce569ad3bace6e6a0" + }, + "vllm/model_executor/layers/fused_moe/experts/fused_humming_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fused_humming_moe.py", + "sha256": "a6830a76ff7f4cd3479b9c8372a30d03e8301604555cbdbcd9ac89a813b7431a" + }, + "vllm/model_executor/layers/fused_moe/experts/gpt_oss_triton_kernels_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/gpt_oss_triton_kernels_moe.py", + "sha256": "1613a7a6b256e8faee6fdcfae84f293492db6229d28ceb3e8a8d6093af480e36" + }, + "vllm/model_executor/layers/fused_moe/experts/int4_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/int4_emulation_moe.py", + "sha256": "f12857caf0671a341687ad3c5f48616b816ed51e1bcbdefa0a7edbecdb81a79d" + }, + "vllm/model_executor/layers/fused_moe/experts/lora_context.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/lora_context.py", + "sha256": "9b41eefaaa57c5dd0dc54217ef95978821b0c52e90ea4db8b0752e08452bd3e5" + }, + "vllm/model_executor/layers/fused_moe/experts/lora_experts_mixin.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/lora_experts_mixin.py", + "sha256": "b2bc55ed6be98b526c6a5698e2d98300650e78555f56b1820e58c04888e2a373" + }, + "vllm/model_executor/layers/fused_moe/experts/marlin_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/marlin_moe.py", + "sha256": "93916b721548e6194dc70cf6cec224b4b1456a0cc0980235e97beba7bf36541d" + }, + "vllm/model_executor/layers/fused_moe/experts/mxfp8_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/mxfp8_emulation_moe.py", + "sha256": "d09c62ad1398c51ff6f515f2a61014ee9e9a9798d0fe9762c47f446efc5edbef" + }, + "vllm/model_executor/layers/fused_moe/experts/mxfp8_native_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/mxfp8_native_moe.py", + "sha256": "01a42cebf18189e566034111b2145573c655319e8af1a56db60d53a319c40613" + }, + "vllm/model_executor/layers/fused_moe/experts/nvfp4_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/nvfp4_emulation_moe.py", + "sha256": "f24467762b60702f0df122ed64786be839a838a9b6cafaecbd04d35fbfedb189" + }, + "vllm/model_executor/layers/fused_moe/experts/ocp_mx_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/ocp_mx_emulation_moe.py", + "sha256": "dcaa60a9ebdb0bd8223b37af41f018ce7f95716ec7cd8526850f4433a579213b" + }, + "vllm/model_executor/layers/fused_moe/experts/rdna3_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/rdna3_moe.py", + "sha256": "e4abd802dc2f0ad9b338ebde397633c761d881c37813e2dc229902c526b597d8" + }, + "vllm/model_executor/layers/fused_moe/experts/rocm_aiter_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/rocm_aiter_moe.py", + "sha256": "bf09a7b783f5752d61cab76221b32b598d8846d801ee39dc9209d636c9659c6f" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_cutlass_moe.py", + "sha256": "ffce5ad627c540940d122d8df7981644b2eb35d07d480995c0f4f30517815fac" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_deep_gemm_moe.py", + "sha256": "c7209fa5e1ccb184a68b37a0706fc571a76696c2ae79802ddc7f889b1c29684d" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_moe.py", + "sha256": "806fbccfe30f5fbd578acf773add99bdf022b12d617958bd6281aef6de369701" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_bf16_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_bf16_moe.py", + "sha256": "76256de96fefece9c41ffb1108487919e24da364cf4412c6c3474498aba59137" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.py", + "sha256": "b54c7ceb45e5d07aa905f42ea44caccf85ca35ba9fb825d4c01947764510f68b" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_lora_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_lora_moe.py", + "sha256": "dd35a9e4242c0dc8d691168813e14bd5543e591f02ee529d0691e07651942c5a" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_mxfp4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_mxfp4_moe.py", + "sha256": "fe780f125a3dc3ba919659e9b85340bd32afcbfe47733a002bfdfb92eadf400c" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_mxint4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_mxint4_moe.py", + "sha256": "2106d67c2951aa690c4656ca58240d09c366cffe8cb4d9fd575df016c377cc30" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_nvfp4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_nvfp4_moe.py", + "sha256": "e938ac9f058f7c90b41c9610513239bec54a95304bfb5ff5f6897ebd54733d7e" + }, + "vllm/model_executor/layers/fused_moe/experts/xpu_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/xpu_moe.py", + "sha256": "2a11bac0cf9274d963315efd6eebdc62978b0b7aa02e8849ff2a562742f0b86d" + }, + "vllm/model_executor/layers/fused_moe/fused_flydsl_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_flydsl_moe.py", + "sha256": "0e74879ee5c72f616ae4064b9dff3b3a0b583b7fc70b8f92f1e8b730ecd5d39b" + }, + "vllm/model_executor/layers/fused_moe/fused_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe.py", + "sha256": "7072eb06237be9d33dcb0ef7101410f886a6363c98cbee70a014c68b70f639cb" + }, + "vllm/model_executor/layers/fused_moe/fused_moe_method_base.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe_method_base.py", + "sha256": "18dcfc469d3252749801bbf943857f58da85de1f2db8fdff5a9f4986a925dc68" + }, + "vllm/model_executor/layers/fused_moe/fused_moe_modular_method.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe_modular_method.py", + "sha256": "321c744eac1fcaffd6b1b2971204c8baa57dfec53e91e5d24140014d72d64f83" + }, + "vllm/model_executor/layers/fused_moe/hpc_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/hpc_moe.py", + "sha256": "2ca9c5d71b6fd91651027905e2b83103a8823845e053e7153e148cb8e0ee666d" + }, + "vllm/model_executor/layers/fused_moe/layer.py": { + "path": "/vllm/model_executor/layers/fused_moe/layer.py", + "sha256": "def0b4e13bcc1e4e21ee10644e647e2eda1acbf0cc01e76d6128abb59ea08224" + }, + "vllm/model_executor/layers/fused_moe/modular_kernel.py": { + "path": "/vllm/model_executor/layers/fused_moe/modular_kernel.py", + "sha256": "8dc4e0dbbf35b3aac8add63ca6f2a7bbfdadaabbd60826e24598b22c7d8e5c22" + }, + "vllm/model_executor/layers/fused_moe/moe_align_block_size.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_align_block_size.py", + "sha256": "c3f7fc2087836f0160a32ab99ceb1d8f6e87c793679da34dd672e225cb7fa31b" + }, + "vllm/model_executor/layers/fused_moe/moe_fused_mul_sum.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_fused_mul_sum.py", + "sha256": "112e72578002c3bff538418dac64b3b56d995994a2fc5e32b18d2cf3b8392a13" + }, + "vllm/model_executor/layers/fused_moe/moe_output.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_output.py", + "sha256": "6ea4cbd78f9efc7f842c5df246f553f08b991c3479b8b04b89902ed08aaf8e8f" + }, + "vllm/model_executor/layers/fused_moe/moe_permute_unpermute.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_permute_unpermute.py", + "sha256": "1adc592c6254d0c877d66be5406afbc822459c18a838f4bbd094a992e7609d06" + }, + "vllm/model_executor/layers/fused_moe/oracle/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/__init__.py", + "sha256": "4dcf941d50d48bb812de0f39e9194bf17a76b8035fe324889c6038f710fdc453" + }, + "vllm/model_executor/layers/fused_moe/oracle/base.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/base.py", + "sha256": "555bbcd18a3744e64eee4e953daabef3bd268a1bd4faf967d4cfd14d6074f685" + }, + "vllm/model_executor/layers/fused_moe/oracle/fp8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/fp8.py", + "sha256": "245bd36c285df1e6f7c51e52dcda31ad247894577a9f8d765613c2c2feae9aee" + }, + "vllm/model_executor/layers/fused_moe/oracle/int8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/int8.py", + "sha256": "c1b67886511bd966b162db5bca8930f04895fb37a969818a4a10f0726c59547f" + }, + "vllm/model_executor/layers/fused_moe/oracle/int_wna16.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/int_wna16.py", + "sha256": "cfffe8b8b290330be9d18ffa07aeecf296484395ff04df3147d99393e48b55c1" + }, + "vllm/model_executor/layers/fused_moe/oracle/mxfp4.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/mxfp4.py", + "sha256": "b7915e6779b5c88e7dcd2d227f003a8e45071d6d86877013067142d4feb64a8c" + }, + "vllm/model_executor/layers/fused_moe/oracle/mxfp8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/mxfp8.py", + "sha256": "9cfdc8102a04bb844dcd7ed88043bba96ec751794bc093da76c69aa8cf88cf48" + }, + "vllm/model_executor/layers/fused_moe/oracle/nvfp4.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/nvfp4.py", + "sha256": "735b4cdeb1258f11fb02320fc0c70cab5edaca468dd60b07b2d369389d2b0313" + }, + "vllm/model_executor/layers/fused_moe/oracle/unquantized.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/unquantized.py", + "sha256": "c8b8203bd0b73bb7f586f703607394d663f14c05711416ad42d45af564382223" + }, + "vllm/model_executor/layers/fused_moe/oracle/w4a8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/w4a8.py", + "sha256": "d7fa6e2982f20b34d5ce9c5ce28a61122762a3fcdd53d249479472a4f2316c6a" + }, + "vllm/model_executor/layers/fused_moe/oracle/w4a8_int8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/w4a8_int8.py", + "sha256": "6d6f9ca2e67b630002873de2f8d8a231d091c5c2f0f3354a9e8209449b481a4c" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/__init__.py", + "sha256": "2800113263a83c2632e522fb22790b29f63384da75d43de32f0ae2f95e8ae4c1" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/batched.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/batched.py", + "sha256": "d52425dd8c08e47cf8d9c3088daf3b1cc721c8667de4c738d04ba997f9a08ccb" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ht.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ht.py", + "sha256": "465cdf1d6cee91b2ee8c2e43abbea6e8408976e3048c10f44c089f34b415bc60" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ll.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ll.py", + "sha256": "f704922b1db680c4c212982a096e09d6b3eb97d89110313f86ed958a00df21b7" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_v2.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_v2.py", + "sha256": "8d690b016bbcfbc9eb599bcc36a6f798b2f1720c828f4347ea742e218c0cc60d" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_one_sided.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_one_sided.py", + "sha256": "acb57d8342af62bb5672036871cd4b27ecc7f37dfa7c894850bb860e6152a1f0" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_two_sided.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_two_sided.py", + "sha256": "cc5b00d6a157b6eca5afaaf7435165dbd1b4524d6d88bf75808cbe074a389f79" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/mori.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/mori.py", + "sha256": "8e9c3b5b1f0de13f467d95bf2f451cba0e4b0d9a1bdcf98da0988a3a9a79a045" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/naive_dp_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/naive_dp_ep.py", + "sha256": "db015e5b18750bbbf5b2bbaceca877dd6f3f3e74c2a94e8dc185f7413b387f91" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/nixl_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/nixl_ep.py", + "sha256": "1f71d70ac509bf5d3d67a8d95a8ee108a50af6bb5d4bde7181ca28e286f6ffce" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/no_dp_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/no_dp_ep.py", + "sha256": "adbbf529cd22059c95b5380952943a70cf11e05e321dcd707f296bebde61a6e7" + }, + "vllm/model_executor/layers/fused_moe/routed_experts.py": { + "path": "/vllm/model_executor/layers/fused_moe/routed_experts.py", + "sha256": "68c48e5df0ea4a7cc1f04436b7b9153eb53802ecd9bb55d38db8738508daac6d" + }, + "vllm/model_executor/layers/fused_moe/routed_experts_capturer.py": { + "path": "/vllm/model_executor/layers/fused_moe/routed_experts_capturer.py", + "sha256": "cd006bc1a1703418cca3b589fafb2abc4268a086fb3db044bbb64348aeac8b13" + }, + "vllm/model_executor/layers/fused_moe/router/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/layers/fused_moe/router/aiter_shared_routed_fused_moe_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/aiter_shared_routed_fused_moe_router.py", + "sha256": "f47046db1275601a2c67c9232afc7b866c9623a19639d5be867e4c7914a35069" + }, + "vllm/model_executor/layers/fused_moe/router/base_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/base_router.py", + "sha256": "47fa2324bcd9b6ebdc138d69ae6b6ecc0f2463d34bda8c5988bdb0a2a76d3fae" + }, + "vllm/model_executor/layers/fused_moe/router/bf16x3_router_gemm_cutedsl.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/bf16x3_router_gemm_cutedsl.py", + "sha256": "d0f1edd1ebc48d88e490bdb3c93db49bdc0a135ff83e7e0b57130e9f8255fc32" + }, + "vllm/model_executor/layers/fused_moe/router/cpu_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/cpu_router.py", + "sha256": "bff36b15818c87bfbb7ee3def7dc7f6396860abbe5893ff6148801fe941a4b92" + }, + "vllm/model_executor/layers/fused_moe/router/custom_routing_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/custom_routing_router.py", + "sha256": "1a40c7054e3c3a1b3ee2e98f6bc9efa9dfdc11f316a8edf7357dd91533487bfe" + }, + "vllm/model_executor/layers/fused_moe/router/dsv4_topk.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/dsv4_topk.py", + "sha256": "14f7c8487b9aef652dd61c91e0e3c3640b643bf9cd0d8a7184157d71f4beb63e" + }, + "vllm/model_executor/layers/fused_moe/router/fused_moe_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_moe_router.py", + "sha256": "0daa0dc05b931d66767feca444a4cd57ecf140f59b40ea0e8ad213eef6da2b36" + }, + "vllm/model_executor/layers/fused_moe/router/fused_topk_bias_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_topk_bias_router.py", + "sha256": "8fdc28cc248180ad4f11bb4bcda3df47926ec12665a0d84bb712fe83fc6b9376" + }, + "vllm/model_executor/layers/fused_moe/router/fused_topk_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_topk_router.py", + "sha256": "1c80f4af4d781fd66b12aa6a7a0fd30082bc521df40f1252987a8ac4c0bef51c" + }, + "vllm/model_executor/layers/fused_moe/router/gate_linear.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/gate_linear.py", + "sha256": "faa43362c2e7c568498a923c682ca18cae75e87f48d00882770821cb19c21198" + }, + "vllm/model_executor/layers/fused_moe/router/grouped_topk_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/grouped_topk_router.py", + "sha256": "048339e1799cdd42c9dae686a6cb891046577fb391b500f0d12eed73c8f61e52" + }, + "vllm/model_executor/layers/fused_moe/router/rocm_fp32_router_gemm.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/rocm_fp32_router_gemm.py", + "sha256": "9c331ef3d0bb2fb6954387d77ac62a99c5c76d2753c7438bfbb5115f68aae5ac" + }, + "vllm/model_executor/layers/fused_moe/router/router_factory.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/router_factory.py", + "sha256": "019bc8adaa7642abab82843efd53cd1a378f62c652521a1de2b781480eb88742" + }, + "vllm/model_executor/layers/fused_moe/router/routing_simulator_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/routing_simulator_router.py", + "sha256": "a7345df5add00cf3bd93024492d6fc1189fd3ecf2754a11cef1b03a295d791f7" + }, + "vllm/model_executor/layers/fused_moe/router/zero_expert_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/zero_expert_router.py", + "sha256": "dea306edd92e2b9c1b43f982ede8e1e10770d2c66220f5a106e0ed0165276e9c" + }, + "vllm/model_executor/layers/fused_moe/runner/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/layers/fused_moe/runner/moe_runner.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/moe_runner.py", + "sha256": "05893188402fe37229bf72d75088d66193c417d5d502daafd3a55e1bfedaa60c" + }, + "vllm/model_executor/layers/fused_moe/runner/moe_runner_interface.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/moe_runner_interface.py", + "sha256": "189cad01611124eb44594713cbf5918d16fc70196dc81a525ae0a7a97a5fcc51" + }, + "vllm/model_executor/layers/fused_moe/runner/shared_experts.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/shared_experts.py", + "sha256": "d89e4c79c46f6fe61262c51f3facf102e71ce1e4eb3db67f72b6bd8470937be9" + }, + "vllm/model_executor/layers/fused_moe/topk_weight_and_reduce.py": { + "path": "/vllm/model_executor/layers/fused_moe/topk_weight_and_reduce.py", + "sha256": "3dfede72d52bf99af40997994704e6c502ee3bab2bd39bfaa8a68d7dae440203" + }, + "vllm/model_executor/layers/fused_moe/unquantized_fused_moe_method.py": { + "path": "/vllm/model_executor/layers/fused_moe/unquantized_fused_moe_method.py", + "sha256": "182a5ec1874ece2091a24c5303f6ab9ea64a9a61adf325b863927f0cdd83e5d3" + }, + "vllm/model_executor/layers/fused_moe/utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/utils.py", + "sha256": "a93a0bded4008db19d8b38370526ae34fafb9c8278e5b4f60acb6acc8fdc1850" + }, + "vllm/model_executor/layers/mamba/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/abstract.py": { + "path": "/vllm/model_executor/layers/mamba/abstract.py", + "sha256": "dfdc8c836894f574e41d93d76ab989cacd3d7ecf59c97a929abfa48d9364e8ad" + }, + "vllm/model_executor/layers/mamba/gdn/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/gdn/base.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/base.py", + "sha256": "7fec748fc74131f5a45bcaf2644b3fa3a0598fd437d7347f8207ea3644a951c5" + }, + "vllm/model_executor/layers/mamba/gdn/kimi_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/kimi_gdn_linear_attn.py", + "sha256": "1cec4da5c9da73557e192bfb36cd540aae51d3e91283b554449c4a97f0f89bd9" + }, + "vllm/model_executor/layers/mamba/gdn/olmo_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/olmo_gdn_linear_attn.py", + "sha256": "60873ca3bb0c4d17c33bd259b62b658db4883cd23138f47dd4ead62cd2ff0605" + }, + "vllm/model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py", + "sha256": "b80f8e6f3fff442fb880aebb3209c52f814f66490009f4ac4003de603576d10a" + }, + "vllm/model_executor/layers/mamba/linear/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/linear/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/linear/bailing_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/linear/bailing_linear_attn.py", + "sha256": "3c480ddd6eba0766ed012a1074bbec5f241d868a87b020b0f6312222c32f93eb" + }, + "vllm/model_executor/layers/mamba/linear/base.py": { + "path": "/vllm/model_executor/layers/mamba/linear/base.py", + "sha256": "26125cd427225954e1846ca361cdaf43f2b56f11b1e217cf26e91a80ef0edb6a" + }, + "vllm/model_executor/layers/mamba/linear/minimax_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/linear/minimax_linear_attn.py", + "sha256": "4adc00f54893b5bc6c31c613deda152a19af3b1bba04153ab5924c3bf2a3aaae" + }, + "vllm/model_executor/layers/mamba/mamba_mixer.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_mixer.py", + "sha256": "a485e937ad9db14d3ad03fde5a9fe795cfa863649563e52fc7e6c52ef631164e" + }, + "vllm/model_executor/layers/mamba/mamba_mixer2.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_mixer2.py", + "sha256": "d58d93e90d9eb90bc5133b79f07c7c62d0032b35d6cf916e3fe34367b81c5cd5" + }, + "vllm/model_executor/layers/mamba/mamba_utils.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_utils.py", + "sha256": "ce9845b4a4ef4bc46577a33038ed69d59ceccb52f30e9c5bdaa36e48be3b2ca4" + }, + "vllm/model_executor/layers/mamba/ops/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/ops/causal_conv1d.py": { + "path": "/vllm/model_executor/layers/mamba/ops/causal_conv1d.py", + "sha256": "044d005cfe59fd0818ed421274e04f3e8dd679b8cdb64fca9f4422f2643484b2" + }, + "vllm/model_executor/layers/mamba/ops/cpu/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/ops/cpu/causal_conv1d.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/causal_conv1d.py", + "sha256": "64104672890ac2ef240c20c7f8059beeade707178574809dbca8721dff5ea6fa" + }, + "vllm/model_executor/layers/mamba/ops/cpu/gdn_attention.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/gdn_attention.py", + "sha256": "a50288945bf5b102ad3025ae536638dcc32d84cf7c22aaf3a85326b0c1c56c1f" + }, + "vllm/model_executor/layers/mamba/ops/cpu/mamba_ssm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/mamba_ssm.py", + "sha256": "5839e576172a3246337f5e4fb1bc19eb583b3e2b2f7e35dd060dc3041eb8372d" + }, + "vllm/model_executor/layers/mamba/ops/gather_initial_states.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gather_initial_states.py", + "sha256": "5198bb6de6d91c583a5f65d926412a76ee04a06fa72aaba76eaf156b27cd0523" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/__init__.py", + "sha256": "b88b52e71fcb21bd3fa215ea171dcd2ad2ff17c97788cfe64caa7ba45c7ecf97" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_h.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_h.py", + "sha256": "f50bbe5c0b6382323ec5dfc24a5e0c7971113d59727515e60c9fe3689734e5ba" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_kkt_inv_uw.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_kkt_inv_uw.py", + "sha256": "b4a65dd194907db08865e0596fe254f915e670a9e6b27ffa2933c1026dde9b1e" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_o.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_o.py", + "sha256": "629f7843a7e611efb9390f2ebb7a4b924b2c328d48a317fddfaa96af4d9bc60a" + }, + "vllm/model_executor/layers/mamba/ops/layernorm_gated.py": { + "path": "/vllm/model_executor/layers/mamba/ops/layernorm_gated.py", + "sha256": "3433f2e3b87c2b2ccf8e9794ce40762c86a6da38a94ecee001f439ea0d0373dd" + }, + "vllm/model_executor/layers/mamba/ops/mamba_ssm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/mamba_ssm.py", + "sha256": "a4515ec7895b40ed878cf380445034b25faa61fbaa799d96c49217bbdfd7e400" + }, + "vllm/model_executor/layers/mamba/ops/replayssm_config.py": { + "path": "/vllm/model_executor/layers/mamba/ops/replayssm_config.py", + "sha256": "5fe9d5d7aa2de6a65875b3796a919b22bc435fd76055ba054bbff43aa005bc44" + }, + "vllm/model_executor/layers/mamba/ops/scatter_states.py": { + "path": "/vllm/model_executor/layers/mamba/ops/scatter_states.py", + "sha256": "f3bb004c73edaba56337747893eb07faf29b270dc8bb9c893ee9b1044e4ead9a" + }, + "vllm/model_executor/layers/mamba/ops/selective_state_update_replayssm_output_only.py": { + "path": "/vllm/model_executor/layers/mamba/ops/selective_state_update_replayssm_output_only.py", + "sha256": "cea7fd3063ca9dcc4e33f180d01ea379195ec515cedc9d0b03b11dc67670d695" + }, + "vllm/model_executor/layers/mamba/ops/ssd_bmm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_bmm.py", + "sha256": "26983d97a7f5c5f9197a16a6bee7b1294839b9ae31a14c14aaee38b43523e630" + }, + "vllm/model_executor/layers/mamba/ops/ssd_chunk_scan.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_chunk_scan.py", + "sha256": "d5ef32e8cb47e2ce71984579df78ab69754895f891766394daf327867cfa4f8f" + }, + "vllm/model_executor/layers/mamba/ops/ssd_chunk_state.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_chunk_state.py", + "sha256": "177e3aa7fe72647133bbd86135533e8688a5802678d4d1564aa549410362316f" + }, + "vllm/model_executor/layers/mamba/ops/ssd_combined.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_combined.py", + "sha256": "1317bbb668d3c60dfe0658850f9968614f03fa5eb61196f8ce6ac17dbb31b480" + }, + "vllm/model_executor/layers/mamba/ops/ssd_state_passing.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_state_passing.py", + "sha256": "36b8c8edba437916a5b789717c61fc22077de01e77892cb96dbff3b00a57410e" + }, + "vllm/model_executor/layers/mamba/ops/ssu_dispatch.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssu_dispatch.py", + "sha256": "bbe0f0e61da87f3ddfead19a79ca376516b63f1ea868be3485333c63fa20ef41" + }, + "vllm/model_executor/layers/mamba/ops/triton_helpers.py": { + "path": "/vllm/model_executor/layers/mamba/ops/triton_helpers.py", + "sha256": "a8795532f22c37a93e82c9d8e3fadcb5f4da98673d7b321fe8481305eaafad30" + }, + "vllm/model_executor/layers/mamba/short_conv.py": { + "path": "/vllm/model_executor/layers/mamba/short_conv.py", + "sha256": "228494efab185ee17374f762874f4c8b9a26aac9decfa8c906ce38446e0de51a" + }, + "vllm/model_executor/models/qwen3_next.py": { + "path": "/vllm/model_executor/models/qwen3_next.py", + "sha256": "4fa5112ac2bf7886d41d9e1f6c3da8793620d1ec49c961b31e9609459a6a7f7a" + }, + "vllm/third_party/flash_linear_attention/__init__.py": { + "path": "/vllm/third_party/flash_linear_attention/__init__.py", + "sha256": "5dbbfa3fc286edb2e970e175ef33cee4f6181c89b0784f5a8986201b2312f54e" + }, + "vllm/third_party/flash_linear_attention/ops/__init__.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/__init__.py", + "sha256": "dd738dc1d08045e76455cdbe16052a5b769e0eb11d6e87ff28353994f880cd6c" + }, + "vllm/third_party/flash_linear_attention/ops/chunk.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk.py", + "sha256": "c105ead259e86aedc248c53e7c4cef07034d0ff12da608d80265d1dd0990803f" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_delta_h.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_delta_h.py", + "sha256": "1b3ad391f939d9443c6b7adb19e57fe381bd5dccea064e8417a4f85b0e713b26" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_o.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_o.py", + "sha256": "3b63b836a8cc561723c23db5a528a0b474d9cd78508d610f0b348c585a889a19" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_scaled_dot_kkt.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_scaled_dot_kkt.py", + "sha256": "7ae41df3755acc7e925a134d848f78bb5fc00b90069039d86403c5853323ea42" + }, + "vllm/third_party/flash_linear_attention/ops/cumsum.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/cumsum.py", + "sha256": "d818215669b451868823202ac0bcea77e7a9d75957254c7c1060a73a55dc39b6" + }, + "vllm/third_party/flash_linear_attention/ops/fused_gdn_prefill_post_conv.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_gdn_prefill_post_conv.py", + "sha256": "590717b2107abc90d72548de06b5d315229eb2775c94614f3f545df11cc2b5df" + }, + "vllm/third_party/flash_linear_attention/ops/fused_norm_gate.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_norm_gate.py", + "sha256": "e6eb90467f29d8a0a04f2a364d20a2c3191b6ab857841bfb82076b33a6022d1a" + }, + "vllm/third_party/flash_linear_attention/ops/fused_recurrent.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_recurrent.py", + "sha256": "fe6f1311014809040497aa0a623e7fa97f4b3457cdc7ee1f1f8aed21f326f755" + }, + "vllm/third_party/flash_linear_attention/ops/fused_sigmoid_gating.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_sigmoid_gating.py", + "sha256": "000ab8996af9788fdb8843a6a3b91833e7a14c8acc0e1ea073a536330f64cb6f" + }, + "vllm/third_party/flash_linear_attention/ops/index.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/index.py", + "sha256": "a4f8b2c052635cb519a80099e8a85411d1d5d6880b38f466788259bbe66b154d" + }, + "vllm/third_party/flash_linear_attention/ops/kda.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/kda.py", + "sha256": "e1f31aaa89b91f8e5db6d070b229e2c81c7206e8caec67de41db97d06be0c476" + }, + "vllm/third_party/flash_linear_attention/ops/l2norm.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/l2norm.py", + "sha256": "520f4513ef4fc97e6b88dc07877cca8e29da0d34e44673fe989e3af002d86381" + }, + "vllm/third_party/flash_linear_attention/ops/layernorm_guard.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/layernorm_guard.py", + "sha256": "42af29be26e8fc94a4658e053c095fcdab9ffdc1bc2446a01e787deda2a298c0" + }, + "vllm/third_party/flash_linear_attention/ops/op.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/op.py", + "sha256": "456da84fd12411cf53c96a90dd4f78f49afb454c3d51d2c524ea8e7106fe8ae5" + }, + "vllm/third_party/flash_linear_attention/ops/solve_tril.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/solve_tril.py", + "sha256": "d1a4ff27623a938825052500afa7e2aa24fadd2fa4c9be6376c9128824f86f82" + }, + "vllm/third_party/flash_linear_attention/ops/utils.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/utils.py", + "sha256": "d6c90d36505e02086954c23ca4dd2fea82a69416d68ff1d0501e16b3148b5b0c" + }, + "vllm/third_party/flash_linear_attention/ops/wy_fast.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/wy_fast.py", + "sha256": "c9fc8259db0a8746dc04f1d799cb73333457118cf89a0bdce8dde8a80a28cd96" + }, + "vllm/v1/attention/__init__.py": { + "path": "/vllm/v1/attention/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backend.py": { + "path": "/vllm/v1/attention/backend.py", + "sha256": "01ac364372afa75fdb22486aa3a9c7cf9aebb742e3471dfb9e0f9d9d36b734bc" + }, + "vllm/v1/attention/backends/__init__.py": { + "path": "/vllm/v1/attention/backends/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backends/b12x.py": { + "path": "/vllm/v1/attention/backends/b12x.py", + "sha256": "443f0a98738fdfefe5b9ab151d278bfd43a8ac807eb2b0b9b2a13d51922afbf9" + }, + "vllm/v1/attention/backends/composite.py": { + "path": "/vllm/v1/attention/backends/composite.py", + "sha256": "4cf3d66dca891562709eed4f50aa14b0ae6c8240d9ea86504a3304b2f356cce0" + }, + "vllm/v1/attention/backends/cpu_attn.py": { + "path": "/vllm/v1/attention/backends/cpu_attn.py", + "sha256": "76fb02a6bd725125565d84bf04f627cf16da5f7ff8f31f87c01ed6a1439398c7" + }, + "vllm/v1/attention/backends/fa_utils.py": { + "path": "/vllm/v1/attention/backends/fa_utils.py", + "sha256": "08fa6e231d3af3a71a6e59162dd12328aa8beb28548165ae58f130a92adb5a83" + }, + "vllm/v1/attention/backends/flash_attn.py": { + "path": "/vllm/v1/attention/backends/flash_attn.py", + "sha256": "b170a4789e18104c1bee35bea70df51abe6766693d8f4726a59f2e6f5c4282aa" + }, + "vllm/v1/attention/backends/flash_attn_diffkv.py": { + "path": "/vllm/v1/attention/backends/flash_attn_diffkv.py", + "sha256": "e4627c88c3ba8caee260540e994cc8137fd2ff7cd7813356b36387c6c88ce30a" + }, + "vllm/v1/attention/backends/flashinfer.py": { + "path": "/vllm/v1/attention/backends/flashinfer.py", + "sha256": "8ee541fde43ed92a417b3f01ea1e6fc64af8ab2eb54cbfc28308a49aaca4ed7f" + }, + "vllm/v1/attention/backends/flex_attention.py": { + "path": "/vllm/v1/attention/backends/flex_attention.py", + "sha256": "ad07f0ad73aeeadc3534b3a05c14f88a62cb3638874239ae9823c49b36276dc3" + }, + "vllm/v1/attention/backends/gdn_attn.py": { + "path": "/vllm/v1/attention/backends/gdn_attn.py", + "sha256": "3831019404a92200a38b43571c040cffeb6638bbdc71e4cb5e680dbc6c93d054" + }, + "vllm/v1/attention/backends/hpc_attn.py": { + "path": "/vllm/v1/attention/backends/hpc_attn.py", + "sha256": "af9e2aec1b498f0ee48a2dce3cf5646edf1976466980b2fd927c0e82b875427c" + }, + "vllm/v1/attention/backends/linear_attn.py": { + "path": "/vllm/v1/attention/backends/linear_attn.py", + "sha256": "bc42144fcd027434c6a10dc9f4c5f991db8899d387af5f6485402ce097eb0513" + }, + "vllm/v1/attention/backends/mamba1_attn.py": { + "path": "/vllm/v1/attention/backends/mamba1_attn.py", + "sha256": "32159dae11cab3c8c576b9514ad97d5108c8d1b4cac9fcfe345ec6a76223aee7" + }, + "vllm/v1/attention/backends/mamba2_attn.py": { + "path": "/vllm/v1/attention/backends/mamba2_attn.py", + "sha256": "a5bcdecb7b9547137023e1c77a386003358fa940eaf5f319ed142211dcdba139" + }, + "vllm/v1/attention/backends/mamba_attn.py": { + "path": "/vllm/v1/attention/backends/mamba_attn.py", + "sha256": "5e7b2c4058fc5e6096d001bff6c789b78368b025bbe4600f191aaca2ff59b59f" + }, + "vllm/v1/attention/backends/mla/__init__.py": { + "path": "/vllm/v1/attention/backends/mla/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backends/mla/aiter_triton_mla.py": { + "path": "/vllm/v1/attention/backends/mla/aiter_triton_mla.py", + "sha256": "ed0e285cdae06a019150c41cc958b3c0b5ceb0e4f299d5318d1c90e2c2395390" + }, + "vllm/v1/attention/backends/mla/amx_mla.py": { + "path": "/vllm/v1/attention/backends/mla/amx_mla.py", + "sha256": "7f5cddec30b2dfe22ccdbd3b9da673c879719bf6da4074317bd60add55f5d15f" + }, + "vllm/v1/attention/backends/mla/compressor_utils.py": { + "path": "/vllm/v1/attention/backends/mla/compressor_utils.py", + "sha256": "3589e94105368ea285c40b82db1a0332682ff5d071fe363627cf4c0d10f3facf" + }, + "vllm/v1/attention/backends/mla/cpu_mla.py": { + "path": "/vllm/v1/attention/backends/mla/cpu_mla.py", + "sha256": "ff2110b9f78e92adf6bab294465cbc294ae1ff71cb1780fed158179e134a4ca6" + }, + "vllm/v1/attention/backends/mla/cutlass_mla.py": { + "path": "/vllm/v1/attention/backends/mla/cutlass_mla.py", + "sha256": "211d298680f9bd793cc468281b316d6633c5f4eb6dcec71d3329b034a23ab9b5" + }, + "vllm/v1/attention/backends/mla/flashattn_mla.py": { + "path": "/vllm/v1/attention/backends/mla/flashattn_mla.py", + "sha256": "ac89e0ad75a37e92566d264bafe324735a80f9ab4709241a4454d17b3d38bb63" + }, + "vllm/v1/attention/backends/mla/flashattn_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashattn_mla_sparse.py", + "sha256": "67dd3ead2e8b9d8cda0825ecc93779cb7d670628bc741c759a7d3cd5d474030f" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla.py", + "sha256": "0c24ff016fb6b0bb41d9e7484b6f1af42f37bcc384ed613473fc3e01ad25f664" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse.py", + "sha256": "2116d965b2067134d8afa5878d4d16c0149b061258f50c4106d993aa13b073cc" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm120.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm120.py", + "sha256": "102ca08793d567f95598eefeb34c3f6ec50b3b9d704f162d1402b97b12b5777b" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm90.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm90.py", + "sha256": "df9fe4970aa3f53cf24784b8534b89e0101a2ca20a35a2ebbc9a12a4463d5993" + }, + "vllm/v1/attention/backends/mla/flashmla.py": { + "path": "/vllm/v1/attention/backends/mla/flashmla.py", + "sha256": "c9d8046a853ecbdeff9ebfc738f5bb34c4f272b278231a09a0fbf73708c7c188" + }, + "vllm/v1/attention/backends/mla/flashmla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashmla_sparse.py", + "sha256": "7a379c717adb9667ce94cbc16c0e3a1fb22a169713db6d7941c141fa84077b3f" + }, + "vllm/v1/attention/backends/mla/index_group.py": { + "path": "/vllm/v1/attention/backends/mla/index_group.py", + "sha256": "c24e028c3c160a9bb92e043da5b5b34c805e84745b7c4b8da6fb8702a0ddd641" + }, + "vllm/v1/attention/backends/mla/indexer.py": { + "path": "/vllm/v1/attention/backends/mla/indexer.py", + "sha256": "2acbc1c4fa57c3424ad95e6ecbe76eb7141747773c3e867ce704f4adccba892a" + }, + "vllm/v1/attention/backends/mla/prefill/__init__.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/__init__.py", + "sha256": "903630eb705dd175bf4ae4558a4bcaa07c110056b6a11eb830fdd2fb21b3c48a" + }, + "vllm/v1/attention/backends/mla/prefill/aiter_flash_attn.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/aiter_flash_attn.py", + "sha256": "571b8a9910c4ea3fefda60659026f3bf0d7b542c34553c8c9a4d43bb82077e61" + }, + "vllm/v1/attention/backends/mla/prefill/base.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/base.py", + "sha256": "138bf3ddaf5a94c3cdbc4e08ac676edcae84b32fc76625e546f3b47f7d8b82ec" + }, + "vllm/v1/attention/backends/mla/prefill/cpu_sdpa.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/cpu_sdpa.py", + "sha256": "1bb686395274a8ec0d9fd7327410a527655fe060cbbc263eab138fea988d96de" + }, + "vllm/v1/attention/backends/mla/prefill/flash_attn.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/flash_attn.py", + "sha256": "5e648c82c82e5f81fe11458eb82b9f90b50fc06df2ade3bf111ee6b7a2ee8481" + }, + "vllm/v1/attention/backends/mla/prefill/flashinfer.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/flashinfer.py", + "sha256": "63861219c35b8abc0ebe01e1f51543c5ed40bd46119ca261d927da7c6826b49b" + }, + "vllm/v1/attention/backends/mla/prefill/registry.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/registry.py", + "sha256": "c8c30b92213d594beaa3cab4d5003da26a85870dbb11d1ab73191962d0645b53" + }, + "vllm/v1/attention/backends/mla/prefill/selector.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/selector.py", + "sha256": "101d9fca7924b0c5d7891a17fe8942611bd6759e32b03a571dc87b14c1430f2f" + }, + "vllm/v1/attention/backends/mla/prefill/tokenspeed_mla.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/tokenspeed_mla.py", + "sha256": "047cf07bfcc83db3b11a6a54ffe189f6146e6ec9ad33ce2fa7d18860bf4210f0" + }, + "vllm/v1/attention/backends/mla/prefill/trtllm_ragged.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/trtllm_ragged.py", + "sha256": "9e13ea6f6a25accedd918c0de64bbb812ccb20ffb95350ab018a6e76d493789b" + }, + "vllm/v1/attention/backends/mla/rocm_aiter_mla.py": { + "path": "/vllm/v1/attention/backends/mla/rocm_aiter_mla.py", + "sha256": "b489f5830c655bfb6299801a70d69b9821513c69568ecab3689db5a7be867be5" + }, + "vllm/v1/attention/backends/mla/rocm_aiter_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/rocm_aiter_mla_sparse.py", + "sha256": "91b1d9b3d860a9720bc01b8ebe9bbe8649a7d6bca20d4b63939bc100309bca19" + }, + "vllm/v1/attention/backends/mla/sparse_swa.py": { + "path": "/vllm/v1/attention/backends/mla/sparse_swa.py", + "sha256": "a47853ad8a3fe40f24704592581ea323a18041b84610df010a5534da634e311e" + }, + "vllm/v1/attention/backends/mla/sparse_utils.py": { + "path": "/vllm/v1/attention/backends/mla/sparse_utils.py", + "sha256": "c3cdf060288c05542243a9fe8b5ad3a963ad75e9ce399009b5e45c1235a88ce4" + }, + "vllm/v1/attention/backends/mla/tokenspeed_mla.py": { + "path": "/vllm/v1/attention/backends/mla/tokenspeed_mla.py", + "sha256": "b9ba523c606430cecb99a88b28c53d98a99dcf5e76105a80664338110a20f1ad" + }, + "vllm/v1/attention/backends/mla/triton_mla.py": { + "path": "/vllm/v1/attention/backends/mla/triton_mla.py", + "sha256": "21b16b3b34470edcc33d0423e560837c1d37d4bab31c7b3b9cfd7faa47864b51" + }, + "vllm/v1/attention/backends/mla/xpu_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/xpu_mla_sparse.py", + "sha256": "559c6240fe466521a6b2df4c94aea02ddf3f5efa5ba6954fa180c5a51c0f12d2" + }, + "vllm/v1/attention/backends/recoverssm_metadata.py": { + "path": "/vllm/v1/attention/backends/recoverssm_metadata.py", + "sha256": "02896a667db0f0308371ceb50048b18e5866c0235d163c0357e9a05dcedb3394" + }, + "vllm/v1/attention/backends/registry.py": { + "path": "/vllm/v1/attention/backends/registry.py", + "sha256": "378e8ee78734bd8c8adbe287d4c0a4058dcbb553195a09fbcce00a3cc30adc29" + }, + "vllm/v1/attention/backends/rocm_aiter_fa.py": { + "path": "/vllm/v1/attention/backends/rocm_aiter_fa.py", + "sha256": "d1418af03bf58209c850f466b712d3ea22a14ebb758c42dd43e65738281841fd" + }, + "vllm/v1/attention/backends/rocm_aiter_unified_attn.py": { + "path": "/vllm/v1/attention/backends/rocm_aiter_unified_attn.py", + "sha256": "59d2645eb4c91dc0567754a7163d066f4f2faf48f1957b254fcdd5604e9d8c8c" + }, + "vllm/v1/attention/backends/rocm_attn.py": { + "path": "/vllm/v1/attention/backends/rocm_attn.py", + "sha256": "4a8f57067073fbceb784af6c3467487c450d00fa3957928fadb99a79f6036292" + }, + "vllm/v1/attention/backends/short_conv_attn.py": { + "path": "/vllm/v1/attention/backends/short_conv_attn.py", + "sha256": "84fc460ef2fbd09743b069bec0c14b39542af6c2254a403e37a048427e151121" + }, + "vllm/v1/attention/backends/triton_attn.py": { + "path": "/vllm/v1/attention/backends/triton_attn.py", + "sha256": "1057663d110e1d5229495a799027b27277c1eca325d5b6780fa2259afbf58a1a" + }, + "vllm/v1/attention/backends/triton_attn_diffkv.py": { + "path": "/vllm/v1/attention/backends/triton_attn_diffkv.py", + "sha256": "de0357eae005246642140f1ab8842ba5ed8bff5c84b18a6d3a7bbf409c578301" + }, + "vllm/v1/attention/backends/triton_flash_attn.py": { + "path": "/vllm/v1/attention/backends/triton_flash_attn.py", + "sha256": "176e45329aeb28a2008362bb607d1b8c89816eb665859ab908b0385a11acf1c2" + }, + "vllm/v1/attention/backends/triton_flashinfer.py": { + "path": "/vllm/v1/attention/backends/triton_flashinfer.py", + "sha256": "48d5f967e388d4e8d6bbec8d827b44d855346bc2fada28adf65768bf6623527b" + }, + "vllm/v1/attention/backends/turboquant_attn.py": { + "path": "/vllm/v1/attention/backends/turboquant_attn.py", + "sha256": "616d16d608d9d1fbf6c29548037e7e9cf330f4d36a01aa3ffabf42a731eb6e2b" + }, + "vllm/v1/attention/backends/utils.py": { + "path": "/vllm/v1/attention/backends/utils.py", + "sha256": "fbc221360d2d54cb21ef3f625dc8711500de345a355801548b4337bb9b8abee0" + }, + "vllm/v1/attention/ops/__init__.py": { + "path": "/vllm/v1/attention/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/ops/chunked_prefill_paged_decode.py": { + "path": "/vllm/v1/attention/ops/chunked_prefill_paged_decode.py", + "sha256": "973db848a790b2e8d99e728b2fc4f44b501bbe58c62747244ddff04cfcf11a85" + }, + "vllm/v1/attention/ops/common.py": { + "path": "/vllm/v1/attention/ops/common.py", + "sha256": "b4b67e7fc0cce471e337d742c097fba06da7563816e8799e27719714e31e1d5b" + }, + "vllm/v1/attention/ops/cp_common.py": { + "path": "/vllm/v1/attention/ops/cp_common.py", + "sha256": "2369181862e96db64b14ef20c5c2e249ed2ea5f3dea2467a2aa388372bb86d9d" + }, + "vllm/v1/attention/ops/dcp.py": { + "path": "/vllm/v1/attention/ops/dcp.py", + "sha256": "a478bdc781460f0582cfaf74d6431f1a826c201f02f39d882d12a96139bc3f28" + }, + "vllm/v1/attention/ops/flashmla.py": { + "path": "/vllm/v1/attention/ops/flashmla.py", + "sha256": "8a40d6e120e3ab25a95fcfeb32b0b5b4c1ea02b984633866628536dcd26ed2e8" + }, + "vllm/v1/attention/ops/flydsl_kernels/__init__.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/attention/ops/flydsl_kernels/tq_decode.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/tq_decode.py", + "sha256": "cc4b7f82897596e0974b3d3a710a1a8bc58c3d22b72cc7f461dd1c4acd2e451b" + }, + "vllm/v1/attention/ops/flydsl_kernels/tq_decode_gqa6.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/tq_decode_gqa6.py", + "sha256": "a983f6d375c325900955e11696dab1e2665770e83f84d51f93d3ed5e1d8880e0" + }, + "vllm/v1/attention/ops/flydsl_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/flydsl_turboquant_decode.py", + "sha256": "7b1dd0ef7c7fb28a6a8831759e00b939ab844d067657155cc11cf75532a22c63" + }, + "vllm/v1/attention/ops/int4_per_token_head.py": { + "path": "/vllm/v1/attention/ops/int4_per_token_head.py", + "sha256": "d91968f280cd8eaed7570ab255f0276b40e833e18a25066d371d9ca8149425f2" + }, + "vllm/v1/attention/ops/merge_attn_states.py": { + "path": "/vllm/v1/attention/ops/merge_attn_states.py", + "sha256": "ad08403d2843fc892f0b0b4b9f5fabb81884556f89f7170dca46ccef498a3539" + }, + "vllm/v1/attention/ops/metadata.py": { + "path": "/vllm/v1/attention/ops/metadata.py", + "sha256": "ca882b84c5aaefb1f77e4d8ea09a00103fbc53defa8671bba036c961c17fc760" + }, + "vllm/v1/attention/ops/paged_attn.py": { + "path": "/vllm/v1/attention/ops/paged_attn.py", + "sha256": "016a95f892ec751c86b37be1e12171bad9f0b4076bbf2219ff336f4e9c503653" + }, + "vllm/v1/attention/ops/pcp.py": { + "path": "/vllm/v1/attention/ops/pcp.py", + "sha256": "dadeff95fe2df2be8028baabeef01b0d2d628cd67de2176915e737ce096de3dd" + }, + "vllm/v1/attention/ops/prefix_prefill.py": { + "path": "/vllm/v1/attention/ops/prefix_prefill.py", + "sha256": "b08ad92db715fc03c11699de3de463d55e411f42f77548e06b41049a61de692f" + }, + "vllm/v1/attention/ops/rocm_aiter_mla_merge.py": { + "path": "/vllm/v1/attention/ops/rocm_aiter_mla_merge.py", + "sha256": "564c66e4877732e48a6f7d52405c43dc952eec0f0ae4353d34886bca056132b9" + }, + "vllm/v1/attention/ops/rocm_aiter_mla_sparse.py": { + "path": "/vllm/v1/attention/ops/rocm_aiter_mla_sparse.py", + "sha256": "feec664be5045fd1ba13b8f6ef83b52c96910ddc78baca0431bcf610c9e8f5cc" + }, + "vllm/v1/attention/ops/triton_attention_helpers.py": { + "path": "/vllm/v1/attention/ops/triton_attention_helpers.py", + "sha256": "35aa993d01345f535d2641cf9dcabb8b64c51b20a19707bc5987e616aaa87ddd" + }, + "vllm/v1/attention/ops/triton_decode_attention.py": { + "path": "/vllm/v1/attention/ops/triton_decode_attention.py", + "sha256": "b9823c65eba22d76abf64dad7d7d16a950f67471c86d6cb5b3e983aaf14381ac" + }, + "vllm/v1/attention/ops/triton_merge_attn_states.py": { + "path": "/vllm/v1/attention/ops/triton_merge_attn_states.py", + "sha256": "f63229162181ab93198550b73a115f1cc1034cfd60e6f58bc8ab3e22a6e8ce60" + }, + "vllm/v1/attention/ops/triton_prefill_attention.py": { + "path": "/vllm/v1/attention/ops/triton_prefill_attention.py", + "sha256": "352c1a4ac86146580040579fb217c2e288268830d6602b735713e154f36d74fe" + }, + "vllm/v1/attention/ops/triton_reshape_and_cache_flash.py": { + "path": "/vllm/v1/attention/ops/triton_reshape_and_cache_flash.py", + "sha256": "6cac51475b8c656992a21b2d150acd3a16a95a7ab7d49aab151a3ef13c24b80d" + }, + "vllm/v1/attention/ops/triton_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/triton_turboquant_decode.py", + "sha256": "8e52678136449e4bbca2195fbcbb87426c955a2b1b8422e7ab9511e45ee5f5c6" + }, + "vllm/v1/attention/ops/triton_turboquant_store.py": { + "path": "/vllm/v1/attention/ops/triton_turboquant_store.py", + "sha256": "6e6e2fe74a307d40f0be786ccbaea76d989e3c7b5985f3144a5218c61bf6d902" + }, + "vllm/v1/attention/ops/triton_unified_attention.py": { + "path": "/vllm/v1/attention/ops/triton_unified_attention.py", + "sha256": "65d0fbcf33d00789df8ca688c0a1c908e710cfaef53471178747ecae11f05829" + }, + "vllm/v1/attention/ops/triton_unified_attention_diffkv.py": { + "path": "/vllm/v1/attention/ops/triton_unified_attention_diffkv.py", + "sha256": "7fa36d7b7441f1c396e0348eac61d691d2e459e5c4c393c4aa262dfb670e68f7" + }, + "vllm/v1/attention/ops/turboquant_soa/__init__.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/__init__.py", + "sha256": "6b43b6fcb2a71c44ceff4ed1edd417a839f4901251ba15831b09ad979baa4984" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode.py", + "sha256": "bf00634191bba14cbf4a23c1d67dc3dcb244c2b8989f08362757b54435830986" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode_v2.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode_v2.py", + "sha256": "28e7ecc15c450d3591983a50c46a03aa6ca6fa99304c17c333940617d9916485" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_store.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_store.py", + "sha256": "dccf93b9fdd34f9b9eacd468e9de35b9d93378594487c335cf50642aaec681f2" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_unified_attention.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_unified_attention.py", + "sha256": "b4b2b5f3985b3a6126fd052e6ec1ed91c610da8a525a9ae7470ac829405bd85c" + }, + "vllm/v1/attention/ops/vit_attn_wrappers.py": { + "path": "/vllm/v1/attention/ops/vit_attn_wrappers.py", + "sha256": "a99d57b58269c7521fa5d7d47af06551f3bab2b5c7358ef78165a7f6e20a92a6" + }, + "vllm/v1/attention/ops/xpu_mla_sparse.py": { + "path": "/vllm/v1/attention/ops/xpu_mla_sparse.py", + "sha256": "d98d17110577c2b7b4d05e07bfdae15faf83321b6342a5daaaecce45b9503f38" + }, + "vllm/v1/attention/selector.py": { + "path": "/vllm/v1/attention/selector.py", + "sha256": "87f653ded7974875183c920e3e4589c28116bcbc99714d1da7cb51ae77c0b182" + }, + "vllm/v1/core/sched/__init__.py": { + "path": "/vllm/v1/core/sched/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/core/sched/async_scheduler.py": { + "path": "/vllm/v1/core/sched/async_scheduler.py", + "sha256": "e586a0ef3c6778be56a93e7f9bb712d4de9de6e7d7fe7e3e1d51dae83ecfc508" + }, + "vllm/v1/core/sched/interface.py": { + "path": "/vllm/v1/core/sched/interface.py", + "sha256": "be6c008664096c5660a8879de72b315bbe479bf1d688be9b25891063ec53a367" + }, + "vllm/v1/core/sched/output.py": { + "path": "/vllm/v1/core/sched/output.py", + "sha256": "3a66c8efaefe10c572f6f33cf1f8aa4610758c945130cad62eb9f7331005677c" + }, + "vllm/v1/core/sched/request_queue.py": { + "path": "/vllm/v1/core/sched/request_queue.py", + "sha256": "4b8d938e5fb8152fe61030b8aa991f983fcac9a405c37ed8908045e05e82ae5e" + }, + "vllm/v1/core/sched/scheduler.py": { + "path": "/vllm/v1/core/sched/scheduler.py", + "sha256": "c1db45f3bbad3a875dd8638331b8870c4380ac1ab4734265ba5c863833a82884" + }, + "vllm/v1/core/sched/utils.py": { + "path": "/vllm/v1/core/sched/utils.py", + "sha256": "1ed988044eb8028c77ede875bd1a5fd05ff6998b455d61e3997d6a3d7fc1c3a7" + }, + "vllm/v1/sample/__init__.py": { + "path": "/vllm/v1/sample/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/sample/logits_processor/__init__.py": { + "path": "/vllm/v1/sample/logits_processor/__init__.py", + "sha256": "1f9b02dae8cf6d44484638037123d3a2dec6b7b9a2bcc9afceef1a9bf3eaedec" + }, + "vllm/v1/sample/logits_processor/builtin.py": { + "path": "/vllm/v1/sample/logits_processor/builtin.py", + "sha256": "6105816ece77e5b1dbee0d07abc90ce039d650bac2ddb85c93280c48b00f2ebe" + }, + "vllm/v1/sample/logits_processor/interface.py": { + "path": "/vllm/v1/sample/logits_processor/interface.py", + "sha256": "171dfc6ef9b5b53128e8eaecc4bdf1de413a706d64bf5be686048f583c66eee1" + }, + "vllm/v1/sample/logits_processor/state.py": { + "path": "/vllm/v1/sample/logits_processor/state.py", + "sha256": "a96411f14362c45f839e181dcb3ac01d5b880812bccb3552fc17863b219f44ac" + }, + "vllm/v1/sample/metadata.py": { + "path": "/vllm/v1/sample/metadata.py", + "sha256": "6582cfe1a240c7ddb975f0ef6dd7dcd28dcf0fc7670394390250013977aa7ffd" + }, + "vllm/v1/sample/ops/__init__.py": { + "path": "/vllm/v1/sample/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/sample/ops/bad_words.py": { + "path": "/vllm/v1/sample/ops/bad_words.py", + "sha256": "0b1d0a9b13b92ddcae2c83393c07a34c0f107813725700dee794caa7fe7f3b12" + }, + "vllm/v1/sample/ops/logprobs.py": { + "path": "/vllm/v1/sample/ops/logprobs.py", + "sha256": "b286f69012a6758bfe9250038b0697294dbffe0d32c6906f284c39f75ee48be3" + }, + "vllm/v1/sample/ops/penalties.py": { + "path": "/vllm/v1/sample/ops/penalties.py", + "sha256": "4debfcf247b3887478d2b9ec98f108756bbed2805462777ef6b56f3bdf4ce682" + }, + "vllm/v1/sample/ops/topk_topp_sampler.py": { + "path": "/vllm/v1/sample/ops/topk_topp_sampler.py", + "sha256": "13ea4359832bc914492330958ec4f5ac140f408b8f410cc05c6eaf7ddcd70be4" + }, + "vllm/v1/sample/ops/topk_topp_triton.py": { + "path": "/vllm/v1/sample/ops/topk_topp_triton.py", + "sha256": "0b5fc337058e22bc28a8530ccec904d6ccd89b9548b02955c657ac429b1669d2" + }, + "vllm/v1/sample/rejection_sampler.py": { + "path": "/vllm/v1/sample/rejection_sampler.py", + "sha256": "0bb9d224887ccb1355e16199005cc23a4afc6fa75156eca419851b7247d99750" + }, + "vllm/v1/sample/sampler.py": { + "path": "/vllm/v1/sample/sampler.py", + "sha256": "f95805b2c6d06218c724826aa5f881a606e8d0a534a566aee7c85948520dd216" + }, + "vllm/v1/sample/thinking_budget_state.py": { + "path": "/vllm/v1/sample/thinking_budget_state.py", + "sha256": "962f8f55210eb0a431cb9c78b013e35f7a7dd58d06d6fb2e7fcff1b457356f8e" + }, + "vllm/v1/worker/__init__.py": { + "path": "/vllm/v1/worker/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/block_table.py": { + "path": "/vllm/v1/worker/block_table.py", + "sha256": "a09b8819e1417b7a186cf3472224e2138fc5d41a291c6692bb7df711b0c44259" + }, + "vllm/v1/worker/cp_utils.py": { + "path": "/vllm/v1/worker/cp_utils.py", + "sha256": "e32625d83a641b8dd8df82e92d1b6fb20af0cdf2e8fbd2fb131aa3c215415448" + }, + "vllm/v1/worker/cpu/__init__.py": { + "path": "/vllm/v1/worker/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/cpu/buffer_utils.py": { + "path": "/vllm/v1/worker/cpu/buffer_utils.py", + "sha256": "e7313fd8c2c76ebfb98d2fa53008bc9691d0f83a7d7c05e87602b5a29fb79e04" + }, + "vllm/v1/worker/cpu/model_runner.py": { + "path": "/vllm/v1/worker/cpu/model_runner.py", + "sha256": "24a1c916550051327dd5893243a6d4200f3824b91b3af8aa6f6c793fd7c68c3e" + }, + "vllm/v1/worker/cpu/shm.py": { + "path": "/vllm/v1/worker/cpu/shm.py", + "sha256": "08491af8ad341399d1375f2d21ad00414d4c89b0a5c03f55de8704914bbfcbd9" + }, + "vllm/v1/worker/cpu_model_runner.py": { + "path": "/vllm/v1/worker/cpu_model_runner.py", + "sha256": "92111aba92f00571f1a3c4c6e43cf1da6ccb4d2afac2f4d5abc018a4a6e7e8bd" + }, + "vllm/v1/worker/cpu_worker.py": { + "path": "/vllm/v1/worker/cpu_worker.py", + "sha256": "a8051b9e510ef0af9cc34004f2cbe5c0f902bd0cebc32c9464e744344dfdf849" + }, + "vllm/v1/worker/dp_utils.py": { + "path": "/vllm/v1/worker/dp_utils.py", + "sha256": "8cd19f1bfbc5c4f6ec60df89aea7c8a19b400ebc264f372b103014152e92158c" + }, + "vllm/v1/worker/ec_connector_model_runner_mixin.py": { + "path": "/vllm/v1/worker/ec_connector_model_runner_mixin.py", + "sha256": "fe9b11cebb8562f1bfe98b98a5647b2b081a6e424cb60d4ffe2412c91a99215e" + }, + "vllm/v1/worker/encoder_cudagraph.py": { + "path": "/vllm/v1/worker/encoder_cudagraph.py", + "sha256": "6a08d3779bca1b47dbf9daf6eafe2d3c70dbcb8aeb7d63ba7efacc68241ee3bc" + }, + "vllm/v1/worker/encoder_cudagraph_defs.py": { + "path": "/vllm/v1/worker/encoder_cudagraph_defs.py", + "sha256": "bb7be050fcaa8868e7816c84caec875da57050d65fe7eaf00f3d41473df25e3a" + }, + "vllm/v1/worker/gpu/__init__.py": { + "path": "/vllm/v1/worker/gpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/async_utils.py": { + "path": "/vllm/v1/worker/gpu/async_utils.py", + "sha256": "77e17a4570ead2be30ae9b00888cf077a3b873018c12ca0549b853bfda02c1ba" + }, + "vllm/v1/worker/gpu/attn_utils.py": { + "path": "/vllm/v1/worker/gpu/attn_utils.py", + "sha256": "b9b81e59dda2720b1f9c434471381f879228832443e52756e469b4ad4905888f" + }, + "vllm/v1/worker/gpu/block_table.py": { + "path": "/vllm/v1/worker/gpu/block_table.py", + "sha256": "61c004315d5af7e7eae4e2a9e6be92ea82c520327690a7f55a73bb9ce95f520a" + }, + "vllm/v1/worker/gpu/buffer_utils.py": { + "path": "/vllm/v1/worker/gpu/buffer_utils.py", + "sha256": "6597f701a30261bf250e9ad5a29737264624a1caa20527aeea0dad630325b093" + }, + "vllm/v1/worker/gpu/cp_utils.py": { + "path": "/vllm/v1/worker/gpu/cp_utils.py", + "sha256": "456c1bb7e262d99ff555522a4f134e5a9b42aee23290be25455eaef36ee8eaaf" + }, + "vllm/v1/worker/gpu/cudagraph_utils.py": { + "path": "/vllm/v1/worker/gpu/cudagraph_utils.py", + "sha256": "6e9c042890603535e300a40df8ee159dbed1058a64a83ae50ff0329e332e05ff" + }, + "vllm/v1/worker/gpu/dp_utils.py": { + "path": "/vllm/v1/worker/gpu/dp_utils.py", + "sha256": "e26867bc89e6bfc933cabc5ed13e5dc7b8d2d3030118ca1ca64c8785dabc0fc1" + }, + "vllm/v1/worker/gpu/ec_connector.py": { + "path": "/vllm/v1/worker/gpu/ec_connector.py", + "sha256": "2afe6e641f4ae3eb3b8da336c74eaa7479bf617b27cfb39a1fcbe487686f0a08" + }, + "vllm/v1/worker/gpu/eplb_utils.py": { + "path": "/vllm/v1/worker/gpu/eplb_utils.py", + "sha256": "1829fac11464aed4649179b302df198de51b95d0589f4e56bea305a876a63e26" + }, + "vllm/v1/worker/gpu/input_batch.py": { + "path": "/vllm/v1/worker/gpu/input_batch.py", + "sha256": "d5dd956eb319bd69dd9e762047833d81ad40b21fce619fcb2133759e73620694" + }, + "vllm/v1/worker/gpu/kv_connector.py": { + "path": "/vllm/v1/worker/gpu/kv_connector.py", + "sha256": "b89a4333f1e552d86e1815674b59e9f1335f0f49c0a7b46082439076f62c6a81" + }, + "vllm/v1/worker/gpu/lora_utils.py": { + "path": "/vllm/v1/worker/gpu/lora_utils.py", + "sha256": "1e90eddd9ddb4ca55e574bb28e87ae3a6f6750175a62d373102426543f4ccd66" + }, + "vllm/v1/worker/gpu/metrics/__init__.py": { + "path": "/vllm/v1/worker/gpu/metrics/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/metrics/logits.py": { + "path": "/vllm/v1/worker/gpu/metrics/logits.py", + "sha256": "ea058d7510a077a55f8ac7e4c3d596508346244e908cb372865d7159f62edc89" + }, + "vllm/v1/worker/gpu/mm/__init__.py": { + "path": "/vllm/v1/worker/gpu/mm/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/mm/encoder_cache.py": { + "path": "/vllm/v1/worker/gpu/mm/encoder_cache.py", + "sha256": "89c500338fddbeee7c4fca978a3a7c4c566a03e848e399d303fbee3c80631cd2" + }, + "vllm/v1/worker/gpu/mm/encoder_runner.py": { + "path": "/vllm/v1/worker/gpu/mm/encoder_runner.py", + "sha256": "0981e352d70301b7154a217a48665ffe35f215d053ec5740c2515a3e1e11b4e6" + }, + "vllm/v1/worker/gpu/mm/lora.py": { + "path": "/vllm/v1/worker/gpu/mm/lora.py", + "sha256": "a3eddfad6ad64de276964240c28dc080888df4a56dd5eac18f89428f2cbb7a01" + }, + "vllm/v1/worker/gpu/mm/rope.py": { + "path": "/vllm/v1/worker/gpu/mm/rope.py", + "sha256": "0924375bcb367267e783b57dd2ad9de1189d97025ce4313baaa54f2911eaaf1e" + }, + "vllm/v1/worker/gpu/model_runner.py": { + "path": "/vllm/v1/worker/gpu/model_runner.py", + "sha256": "174c93db921c23cf0396eee4764be25b2bd2d4b6a06e9fa41ce3598b884ce8ce" + }, + "vllm/v1/worker/gpu/model_states/__init__.py": { + "path": "/vllm/v1/worker/gpu/model_states/__init__.py", + "sha256": "07815d0b788fc88185772f581bbf892a675259f9288375571f29887622f8d93c" + }, + "vllm/v1/worker/gpu/model_states/default.py": { + "path": "/vllm/v1/worker/gpu/model_states/default.py", + "sha256": "bb614f814780f052e869f9acf31dfbfa68718ee7dc6252eefa901b5730ee8a2a" + }, + "vllm/v1/worker/gpu/model_states/encoder_decoder.py": { + "path": "/vllm/v1/worker/gpu/model_states/encoder_decoder.py", + "sha256": "a5868059d8af672548b41d0e623e884320e6ed61e6aaca2d2828ff5be0356f2f" + }, + "vllm/v1/worker/gpu/model_states/encoder_only.py": { + "path": "/vllm/v1/worker/gpu/model_states/encoder_only.py", + "sha256": "84e96b55a2639e2a73fa4a0308acc89c8d053dc715481180b237e0196dcef99f" + }, + "vllm/v1/worker/gpu/model_states/interface.py": { + "path": "/vllm/v1/worker/gpu/model_states/interface.py", + "sha256": "5675b6fedc7403a9ab410b1e5565974e78fac23c42ab4253ae1da52d6e09b594" + }, + "vllm/v1/worker/gpu/model_states/mamba_hybrid.py": { + "path": "/vllm/v1/worker/gpu/model_states/mamba_hybrid.py", + "sha256": "573e130ac5587d4822fabf97adad1ad0fda02ff83c5e70df879a5bb175ae845c" + }, + "vllm/v1/worker/gpu/model_states/mm_pruning.py": { + "path": "/vllm/v1/worker/gpu/model_states/mm_pruning.py", + "sha256": "b150940b12ae76048f050a8eeb54d532bbdc530a18ffbf320ddeeb0cfaa90f93" + }, + "vllm/v1/worker/gpu/model_states/prompt_embeds.py": { + "path": "/vllm/v1/worker/gpu/model_states/prompt_embeds.py", + "sha256": "11f9e270925c2df6a505557605ac2b859bb145cf3420b0111e7482a1c544f9b1" + }, + "vllm/v1/worker/gpu/model_states/recoverssm.py": { + "path": "/vllm/v1/worker/gpu/model_states/recoverssm.py", + "sha256": "b4b660e62eaf33f4fe8271f83ed1fb6de6bc08f800a8073b27803e42fb29a645" + }, + "vllm/v1/worker/gpu/pcp_manager.py": { + "path": "/vllm/v1/worker/gpu/pcp_manager.py", + "sha256": "2d80df0ed5b18a2069f9d0689cb59923ffe324ba200fcafe242da23da3a6ddaa" + }, + "vllm/v1/worker/gpu/pool/__init__.py": { + "path": "/vllm/v1/worker/gpu/pool/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/pool/pooling_runner.py": { + "path": "/vllm/v1/worker/gpu/pool/pooling_runner.py", + "sha256": "f8463f7648cce0f3f29418a4d9fee61634ead760957cf236d06d61cf8cd986e7" + }, + "vllm/v1/worker/gpu/pp_utils.py": { + "path": "/vllm/v1/worker/gpu/pp_utils.py", + "sha256": "dadeef0bebf61d0ad44a28d06372208ec4e6389224d6017f412683b026bdbb5c" + }, + "vllm/v1/worker/gpu/sample/__init__.py": { + "path": "/vllm/v1/worker/gpu/sample/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/sample/bad_words.py": { + "path": "/vllm/v1/worker/gpu/sample/bad_words.py", + "sha256": "8d3cbd5613398260314d94739d8ee0e1ac0c22abf2f960f541d3c0d4e39d360b" + }, + "vllm/v1/worker/gpu/sample/batch_shard.py": { + "path": "/vllm/v1/worker/gpu/sample/batch_shard.py", + "sha256": "c30274a3a04e6a03e89be9cd7c62de602b1aba4d412f64540ab6201036de3928" + }, + "vllm/v1/worker/gpu/sample/gumbel.py": { + "path": "/vllm/v1/worker/gpu/sample/gumbel.py", + "sha256": "3ec1df510bdad13e8b0a457b5b67c98affdf6e57369e56cb471246cc8f40dd34" + }, + "vllm/v1/worker/gpu/sample/logit_bias.py": { + "path": "/vllm/v1/worker/gpu/sample/logit_bias.py", + "sha256": "9e80a3fe6f3c7474723408cfff52183f4585fdeedd9c2312843ee98d0b12724c" + }, + "vllm/v1/worker/gpu/sample/logprob.py": { + "path": "/vllm/v1/worker/gpu/sample/logprob.py", + "sha256": "f47479a818192acb6b297c79fa67a3b2f9820e3492a394d5adda777e9b7c832e" + }, + "vllm/v1/worker/gpu/sample/min_p.py": { + "path": "/vllm/v1/worker/gpu/sample/min_p.py", + "sha256": "4cb5e2f45e1ced6f9685283a7a5c8cfd7204d9a249822e866cfff756c7f04f62" + }, + "vllm/v1/worker/gpu/sample/output.py": { + "path": "/vllm/v1/worker/gpu/sample/output.py", + "sha256": "d6e298c0f197d487a8faaf7200f500fa83df1d7a4bbf4339cadd6a18008f7f9c" + }, + "vllm/v1/worker/gpu/sample/penalties.py": { + "path": "/vllm/v1/worker/gpu/sample/penalties.py", + "sha256": "46c29434caf5f415129ef4a9bb2b8d4f62d2765596e3e07f73ad2b198c7def1b" + }, + "vllm/v1/worker/gpu/sample/prompt_logprob.py": { + "path": "/vllm/v1/worker/gpu/sample/prompt_logprob.py", + "sha256": "4cf22d390e7bf59e44c458cff7180268db63e95d06af2f1e14d720a2d77c9663" + }, + "vllm/v1/worker/gpu/sample/sampler.py": { + "path": "/vllm/v1/worker/gpu/sample/sampler.py", + "sha256": "832c9945d201a1e730ff9b4b52076aa83bd4a5064e1e4cfea952cf84d4a8d1f0" + }, + "vllm/v1/worker/gpu/sample/states.py": { + "path": "/vllm/v1/worker/gpu/sample/states.py", + "sha256": "4e3671f93695ba5a48fad7d2d13beb231ac8741034904ed5a15d9f7b9b86662e" + }, + "vllm/v1/worker/gpu/sample/thinking_budget.py": { + "path": "/vllm/v1/worker/gpu/sample/thinking_budget.py", + "sha256": "020513e1d3406f367de6ad995a95055008fd0c28f2873647e8283c9870e22404" + }, + "vllm/v1/worker/gpu/sample/trace_replay.py": { + "path": "/vllm/v1/worker/gpu/sample/trace_replay.py", + "sha256": "d2a7d3b3b55379efabe4740a4b7f14030126dc11be36f6ea974164ce42316a50" + }, + "vllm/v1/worker/gpu/sample/watermark.py": { + "path": "/vllm/v1/worker/gpu/sample/watermark.py", + "sha256": "a3581458169dab9153eb09fd67218e0ee5585406537a9de80ad528ae62b030c0" + }, + "vllm/v1/worker/gpu/shutdown.py": { + "path": "/vllm/v1/worker/gpu/shutdown.py", + "sha256": "bb470f14b17c7e52571ef8938b2a9527e7c2846852ae8a3a94b69cd1c30aa4b1" + }, + "vllm/v1/worker/gpu/spec_decode/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/__init__.py", + "sha256": "1f1f84bfe6f4f5af3a7e21a7a8716ecf7b9013da1d03327668a3ee36afc24c32" + }, + "vllm/v1/worker/gpu/spec_decode/acceptance_estimator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/acceptance_estimator.py", + "sha256": "505b843bdd75928b03793b395b47b8be914bd7fe2a3351c8ec04339baeebb1c2" + }, + "vllm/v1/worker/gpu/spec_decode/adaptive_verification.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/adaptive_verification.py", + "sha256": "276b2fec56758a94c71b717f6786b8a6f126db2e20cf964350202feee61a0a39" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py", + "sha256": "13392ef0a9ed59eb9c2b2bad43d7c61beb212a8805849e46b5130c230275d0a5" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/speculator.py", + "sha256": "5b97f54e20ddf65b98e939832d050745f67ef43cfa145786da300f1a8322e3c6" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/cudagraph.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/cudagraph.py", + "sha256": "beab567ae2df6a2ba2cd92fe7ee452c6b959b8a7037a4b5f493993a1824619bb" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/speculator.py", + "sha256": "f9c100f42f9326e48eb84e89281897e859ba761943f54d593523555ccd98dc63" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/utils.py", + "sha256": "53d2c3ad474d290d2c6df027446bbd80ac7447684e5242ab2c3c5337d2abd383" + }, + "vllm/v1/worker/gpu/spec_decode/dflash2/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash2/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/dflash2/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash2/speculator.py", + "sha256": "b70043550938a1df9aecc85d8c8224c38c929ca34f68834572f6e723854d2027" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/speculator.py", + "sha256": "dcf4abdedbd2bddd0d76be198ccf5b4e467c46f645038c35fcab821491a35b03" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/utils.py", + "sha256": "86af2bf30604a184312e8f076097b91ecfec704f409f9d68d634b03d6b318070" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/eagle3_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/eagle3_utils.py", + "sha256": "201ee875fcc3d076a8fc1f3876dcbf85736b221a368555243a8987ff26a1674e" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/speculator.py", + "sha256": "746e318a4f266d75522ff7f3731ea9b4527b7b4824f71364d1a62184ea1f7b3d" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/utils.py", + "sha256": "94de6f55a1761f24f4aa1388cbc3b3763d4ab3ee53260330056ad31ce0b78236" + }, + "vllm/v1/worker/gpu/spec_decode/extract_hidden_states.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/extract_hidden_states.py", + "sha256": "93c4233be7b2d2290b33902ea9b3bb5274c11701830851d03967a22144536e2d" + }, + "vllm/v1/worker/gpu/spec_decode/gemma4/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/gemma4/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/gemma4/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/gemma4/speculator.py", + "sha256": "9991210d7babd2caf2cd10797ca8688543dedeafbc3b86bc7c979c1a6ae9f949" + }, + "vllm/v1/worker/gpu/spec_decode/mtp/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/mtp/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/mtp/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/mtp/speculator.py", + "sha256": "926d6c9ffdb368c971647911a60493820d056ce236fcae9d94a42fa2e006255d" + }, + "vllm/v1/worker/gpu/spec_decode/multi_module_mtp/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/multi_module_mtp/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/multi_module_mtp/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/multi_module_mtp/speculator.py", + "sha256": "d9d4735b9b33829332b0e845b6d3073b2f0436045ed693b25c6434f351644127" + }, + "vllm/v1/worker/gpu/spec_decode/rejection_sampler.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/rejection_sampler.py", + "sha256": "030db5bfca162cc1f305112f299de5d6d61c59d3ed0807fee46575441ca4086d" + }, + "vllm/v1/worker/gpu/spec_decode/rejection_sampler_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/rejection_sampler_utils.py", + "sha256": "214b61fa0abe88573beb779872c035b3954e5651a85bd438d99ee5905d3a62ec" + }, + "vllm/v1/worker/gpu/spec_decode/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/speculator.py", + "sha256": "3a1ab15bf8b20918852eb835fe9755046e99dcbac6ba6ca3d414949fc8bc695a" + }, + "vllm/v1/worker/gpu/spec_decode/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/utils.py", + "sha256": "282f2929eddae9ca7312269f799be07472334b6df9fd91878b5e839ec05e418c" + }, + "vllm/v1/worker/gpu/states.py": { + "path": "/vllm/v1/worker/gpu/states.py", + "sha256": "99418f5df43ca612ded72609fee011620b065b2cab2f249ccb387096bf4ae71a" + }, + "vllm/v1/worker/gpu/structured_outputs.py": { + "path": "/vllm/v1/worker/gpu/structured_outputs.py", + "sha256": "18a10532db7e66b55e334acacd1fd989ad6361adf31dd0de9a9a65e23db25951" + }, + "vllm/v1/worker/gpu/ubatch_utils.py": { + "path": "/vllm/v1/worker/gpu/ubatch_utils.py", + "sha256": "5092e2e58af0561c8dc12e62847cfc6dda9ca20dfbd33e7f0cd77a83fe87f7c5" + }, + "vllm/v1/worker/gpu/warmup.py": { + "path": "/vllm/v1/worker/gpu/warmup.py", + "sha256": "423ac32d58fe008c228cfa223e4fcebfcf87e3463a9dbdf80a083c0578d73723" + }, + "vllm/v1/worker/gpu_input_batch.py": { + "path": "/vllm/v1/worker/gpu_input_batch.py", + "sha256": "18cf455c9d0eea61cc581c7932f2e6cd09786914e82dd35eef1c1430da359a0f" + }, + "vllm/v1/worker/gpu_model_runner.py": { + "path": "/vllm/v1/worker/gpu_model_runner.py", + "sha256": "87c29d08c0bbf66993d8b984811e7325e35e6436242a773feb55ec88f16b2c51" + }, + "vllm/v1/worker/gpu_ubatch_wrapper.py": { + "path": "/vllm/v1/worker/gpu_ubatch_wrapper.py", + "sha256": "4233cfbe8c9884b042c4363890108f616483b694ebe9a6e69578dcf89c6dac5c" + }, + "vllm/v1/worker/gpu_worker.py": { + "path": "/vllm/v1/worker/gpu_worker.py", + "sha256": "6994436e4547c0996ab555b3e814e8ccea26b650dfc1b378b97d640745309347" + }, + "vllm/v1/worker/kv_connector_model_runner_mixin.py": { + "path": "/vllm/v1/worker/kv_connector_model_runner_mixin.py", + "sha256": "e1cc76d065a7e60aacddb190ae795a480b65cd02ba71a1fc699a02a85c1a3de2" + }, + "vllm/v1/worker/lora_model_runner_mixin.py": { + "path": "/vllm/v1/worker/lora_model_runner_mixin.py", + "sha256": "fef6092a15d8d37f6fa22495e6106e2e5280180908d61ce43d9ff5bf4eef3f2f" + }, + "vllm/v1/worker/mamba_utils.py": { + "path": "/vllm/v1/worker/mamba_utils.py", + "sha256": "23fdaa4e8f63ee8f938eaa1a2b39f803cb04fa6ecd69789563254b1a0691413a" + }, + "vllm/v1/worker/mm_encoder_model_runner.py": { + "path": "/vllm/v1/worker/mm_encoder_model_runner.py", + "sha256": "780c41be84ad022205c21c1decb6bb8d5afb03bc7be120c1f7df03b710acc3d7" + }, + "vllm/v1/worker/sentinel/__init__.py": { + "path": "/vllm/v1/worker/sentinel/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/sentinel/gpu_worker_sentinel.py": { + "path": "/vllm/v1/worker/sentinel/gpu_worker_sentinel.py", + "sha256": "3959b8619d052c5dd247815074e03ec21ec9b43cc424ff2d296abc19b227b852" + }, + "vllm/v1/worker/startup_plan.py": { + "path": "/vllm/v1/worker/startup_plan.py", + "sha256": "84bcbb4f7a9fd7c8d10c9c895aadd9673d44c767b9132368d11eb5e017afe86b" + }, + "vllm/v1/worker/ubatch_utils.py": { + "path": "/vllm/v1/worker/ubatch_utils.py", + "sha256": "b34dce551b5195c414e6a3a997c75961cc7a17f24c7c980487fe3d3e2ba7a798" + }, + "vllm/v1/worker/ubatching.py": { + "path": "/vllm/v1/worker/ubatching.py", + "sha256": "40391241c564feb5f16c77898ae6ae152ed6e71a4682e2a406387785d8de02d7" + }, + "vllm/v1/worker/utils.py": { + "path": "/vllm/v1/worker/utils.py", + "sha256": "0ca3ec6bf4d20076145b7fe64e564962adebedc8f75a856b517ba0b2f2d77acf" + }, + "vllm/v1/worker/worker_base.py": { + "path": "/vllm/v1/worker/worker_base.py", + "sha256": "4a1a5266b912fe97991d8dc89d92b923990da9f6cb4b817d00d52e9c0d26dd7c" + }, + "vllm/v1/worker/workspace.py": { + "path": "/vllm/v1/worker/workspace.py", + "sha256": "d21c08167d1d0d1c0cddaa80453a53a0b4dec5d81b5a537c94a21324344976b3" + }, + "vllm/v1/worker/xpu_model_runner.py": { + "path": "/vllm/v1/worker/xpu_model_runner.py", + "sha256": "07fa0390d28f2b8c3c3c0019eb9c3b126e2397aea268ba47c889f06b423deb23" + }, + "vllm/v1/worker/xpu_worker.py": { + "path": "/vllm/v1/worker/xpu_worker.py", + "sha256": "711b56432506b58041cd86e71320c3960413f7bd61061990b66488421d81cfc3" + } + }, + "prefix": "", + "pth": { + "/__editable__.megatron_core-0.16.0rc0.pth": "d55c9b64480b34aae3d4d31e7706b93391c969dec6e0498e50963b03445a57b0", + "/__editable__.rl_kernel-0.1.0.pth": "1454c4987b35762a0d189d4e901c5d077fde62a1944fbaabecea230e57f3923a", + "/__editable__.vime-0.3.2.pth": "77eec5d06d628cb952e65edd813ca88d8db67ccc785083e1b7b29011b92bec4f", + "/distutils-precedence.pth": "2638ce9e2500e572a5e0de7faed6661eb569d1b696fcba07b0dd223da5f5d224", + "/qwen3_next_cuda_runtime.pth": "e0d3ab57dd3ff4f5d55fcf76e83c549cc00b3c813e6f717c540d5ded79fa2f49", + "/qwen3_next_megatron_source.pth": "8556ac057538e82856cb76cbbc954f58312a3f45373daec3eec826031cfd2709", + "/__editable__.rl_kernel-0.1.0.pth": "1454c4987b35762a0d189d4e901c5d077fde62a1944fbaabecea230e57f3923a", + "/distutils-precedence.pth": "2638ce9e2500e572a5e0de7faed6661eb569d1b696fcba07b0dd223da5f5d224", + "/nvidia_cutlass_dsl_packages.pth": "cc710b99ddb3d76361a70461461d274212a979d00c381d821fce5bb3ad9cf246" + }, + "pyvenv_cfg_sha256": "48579f2c6d35c3d535c2690d7d426587c4b8e92021463f0266b38d35dfbbb834", + "sources": { + "/Megatron-LM-training": { + "patch_sha256": "f66035f12501aa1d08e8884e0dea5a22d59825d717aeda73c3e83876e3efd79f", + "path": "/Megatron-LM-training", + "tree": "731fc44a368d6cac8c6171a29d5c687ff0d95bd1" + }, + "/vime": { + "patch_sha256": "66949839d4c18329444f4f9f6dcd702b53ce1b94e9aa15ed111f28743bfaa4b9", + "path": "/vime", + "tree": "f5174e67dbcdaef983eecd45f215fef2d8429dd0" + } + }, + "version": "3.12.14 | packaged by Anaconda, Inc. | (main, Aug 27 2026, 14:46:43) [GCC 14.3.0]" + }, + "sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca" + }, + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "cuda_identity": { + "home": "", + "nvcc_sha256": "b8e2347d9d7fcadf8812a27324d515de99d033d3e48611811ece7e66d7895f8a" + }, + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "operator_requirements": { + "suite": "all", + "case_ids": [ + "tests/check_qwen3_next_attention.py::test_d256_backward_with_cached_prefix_matches_float64_formula", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[1024]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[256]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[64]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[8]", + "tests/check_qwen3_next_attention.py::test_d256_input_device_guard_and_nondefault_stream", + "tests/check_qwen3_next_attention.py::test_native_backward_rejects_malformed_probability_and_gradient_buffers", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[0]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[2]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_target_inputs_do_not_depend_on_companions", + "tests/check_qwen3_next_batch_invariance.py::test_triton_chunked_prefill_is_batch_invariant", + "tests/check_qwen3_next_conv_bridge.py::test_chunked_and_reordered_sequences_match", + "tests/check_qwen3_next_conv_bridge.py::test_empty_sequence_preserves_cache_and_gradients", + "tests/check_qwen3_next_conv_bridge.py::test_response_gradient_reaches_prompt_and_convolution_weight", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths0]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths1]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths2]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-4]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[1]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[4]", + "tests/check_qwen3_next_core_matrix.py::test_variable_lengths_empty_and_mixed_step_match_independent_sequences", + "tests/check_qwen3_next_forward.py::test_combine_has_fixed_route_order_and_differentiable_weights", + "tests/check_qwen3_next_forward.py::test_full_vocabulary_logprob_entropy_modes_and_gradient", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_fail_closed_on_the_tensor_descriptor_path", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[128]", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[512]", + "tests/check_qwen3_next_forward.py::test_logprob_nan_rejected_before_comparison", + "tests/check_qwen3_next_forward.py::test_moe_vjp_matches_independent_double_formula", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[1024-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[128-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-16]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-256]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-3072]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-37984]", + "tests/check_qwen3_next_forward.py::test_qwen_moe_actual_tp4_shapes_and_independent_training_forward", + "tests/check_qwen3_next_forward.py::test_route_weights_are_batch_invariant", + "tests/check_qwen3_next_forward.py::test_shared_linear_vjp_and_empty_tokens", + "tests/check_qwen3_next_forward.py::test_stable_route_tie_boundary_and_router_gradient", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_backward_matches_recomputed_recurrence_vjp", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_forward_is_provider_exact_and_does_not_mutate_inputs", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_keeps_prompt_state_gradient_through_response", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[False]", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[True]", + "tests/check_qwen3_next_gdn_bridge.py::test_initial_state_vjp_matches_provider_directional_difference", + "tests/check_qwen3_next_gdn_sequence.py::test_1024_token_chunk_continuation_is_bitwise_exact", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad0]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad1]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad2]", + "tests/check_qwen3_next_gdn_sequence.py::test_chunk_boundary_retains_prompt_and_initial_state_gradients", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths0]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths1]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths2]", + "tests/check_qwen3_next_gdn_sequence.py::test_reserved_and_duplicate_slots_are_rejected", + "tests/check_qwen3_next_norm_providers.py::test_custom_op_has_distinct_native_and_cuda_paths", + "tests/check_qwen3_next_norm_providers.py::test_gdn_decode_provider_env_defaults_are_recorded", + "tests/check_qwen3_next_norm_providers.py::test_our_gated_op_is_batch_invariant", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_cuda]", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_native]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots0]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots2]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots3]", + "tests/check_qwen3_next_shared_core.py::test_independent_training_forward_matches_inference_and_retains_gradients", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[1024]", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[8]", + "tests/check_qwen3_next_shared_core.py::test_unimplemented_provider_profile_is_rejected", + "tests/test_qwen3_next_norm.py::test_bad_weight_shape_raises", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[16]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[1]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[2]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[32]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[48]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[64]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[8]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[128]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[2048]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_with_padding", + "tests/test_qwen3_next_norm.py::test_call_matches_forward", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[128]", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[2048]", + "tests/test_qwen3_next_norm.py::test_cuda_default_offset_preserves_plain_convention", + "tests/test_qwen3_next_norm.py::test_cuda_gated_backward_matches_autograd_golden", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_matches_golden_within_contract", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_bad_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_mismatched_gate", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_backward_uses_the_sigmoid_derivative", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_swish_is_an_alias_for_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_unit_weight_is_plain_norm_times_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_weight_offset_is_applied_in_fp32", + "tests/test_qwen3_next_norm.py::test_cuda_gated_wrapper_rejects_equal_numel_wrong_shape", + "tests/test_qwen3_next_norm.py::test_cuda_gated_zero_gate_zeroes_output", + "tests/test_qwen3_next_norm.py::test_cuda_offset_equals_explicit_fp32_weight", + "tests/test_qwen3_next_norm.py::test_cuda_offset_is_not_folded_through_bfloat16", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_backward_is_offset_aware", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_within_tolerance_of_golden", + "tests/test_qwen3_next_norm.py::test_deterministic_repeat", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype0]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype1]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype2]", + "tests/test_qwen3_next_norm.py::test_eps_inside_sqrt", + "tests/test_qwen3_next_norm.py::test_gated_batch_invariance_slice", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedHFOp]", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedOp]", + "tests/test_qwen3_next_norm.py::test_gated_conventions_diverge_in_low_precision", + "tests/test_qwen3_next_norm.py::test_gated_cuda_op_rejects_bad_activation_at_construction", + "tests/test_qwen3_next_norm.py::test_gated_extension_handles_empty_batch_and_nondefault_stream", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[dy_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[gate_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[rstd_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_shape]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_matches_hf_formula_fp32", + "tests/test_qwen3_next_norm.py::test_gated_shape_mismatch_raises", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_strict_matches_vllm_formula_fp32", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[128]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[2048]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_offset_applied_in_fp32_not_folded_into_bf16", + "tests/test_qwen3_next_norm.py::test_op_batch_invariance_on_device", + "tests/test_qwen3_next_norm.py::test_plain_reference_is_unchanged_by_the_offset_plumbing", + "tests/test_qwen3_next_norm.py::test_weight_offset_is_one", + "tests/test_qwen3_next_norm.py::test_zero_centred_cuda_constructor_rejects_missing_extension", + "tests/test_qwen3_next_norm.py::test_zero_centred_op_inherits_the_plain_reference", + "tests/test_qwen3_next_norm.py::test_zero_weight_is_identity_scaling" + ], + "case_ids_sha256": "694c931b65f9cfa5db963f2eca6d11bd309546c824a1df52f9da2ab128e83e0f", + "norm_gates": [ + "qwen3_next_rms_norm-forward.json", + "qwen3_next_rms_norm-gradient.json", + "rms_norm_gated-forward.json", + "rms_norm_gated-gradient.json" + ] + }, + "layer_requirements": { + "schema_version": 1, + "gates": { + "gdn": { + "script": "scripts/qwen3_next_tp_gdn_check.py", + "output_option": "--output", + "scope": "tp4_gdn_layer0", + "groups": { + "cases": [ + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "prompt-gradient", + "replicated-norm-gradient", + "hf-load-export" + ] + }, + "script_sha256": "cc4338893f90af004c51c20fc67d1a9a3f4bf8d26775277f72671c02983e4df5" + }, + "attention": { + "script": "scripts/qwen3_next_tp_attention_check.py", + "output_option": "--output", + "scope": "tp4_full_attention_layer3", + "groups": { + "attention.cases": [ + "hf-load-export", + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "batch4-varlen-reorder", + "sixteen-token-decode", + "prompt-gradient", + "kv-pair-gradient", + "qk-norm-gradient" + ] + }, + "script_sha256": "d27d43efb05415a8ef5892c3c2238a2b9744a4821f5466faf46c6510e6e01bec" + }, + "moe": { + "script": "scripts/qwen3_next_tp_moe_check.py", + "output_option": "--output", + "scope": "tp4_moe_block_layer0", + "groups": { + "moe.cases": [ + "hf-load-export-all512experts", + "routes-replicated-8", + "full-chunk-reorder-8", + "routes-replicated-64", + "full-chunk-reorder-64", + "routes-replicated-256", + "full-chunk-reorder-256", + "routes-replicated-1024", + "full-chunk-reorder-1024", + "training-forward", + "all-parameter-gradient", + "replicated-router-gradient" + ] + }, + "script_sha256": "d5c1bbbb82e408b65871b0cb1638d7a6cf8cfe07f0a3315a657b7dc232d544be" + }, + "adapters": { + "script": "scripts/qwen3_next_adapter_check.py", + "output_option": "--out", + "scope": "gdn_engine_adapter_component", + "groups": { + "cases": [ + "batch1-length8", + "batch1-length64", + "batch1-length256", + "batch1-length1024", + "batch4-length8", + "batch4-length64", + "batch4-length256", + "batch4-length1024", + "mixed-prefill-decode16-reorder" + ] + }, + "fields": { + "prompt_gradient": "passed", + "hf_conv_roundtrip": "passed", + "batch_invariance_capability_registered": false + }, + "script_sha256": "3ce45bb317237c1a06533116d65fb77c2a23b6f503ae46406ede543036eb0f20" + }, + "heads": { + "script": "scripts/qwen3_next_tp_head_check.py", + "output_option": "--output", + "scope": "tp4_embedding_lm_head_only", + "groups": { + "cases": [ + "hf-embedding-roundtrip", + "hf-lm-head-roundtrip", + "replicated-norm-gradient", + "nonzero-finite-embedding-head-gradient", + "embedding-repeat-100", + "batch-invariant-prompt8", + "batch-invariant-prompt64", + "batch-invariant-prompt256", + "batch-invariant-prompt1024", + "logprob-original-and-promoted-logits", + "entropy-interface" + ] + }, + "script_sha256": "0504185d21a75405c8e994bc57b016cf4ec357d8b16e7430772c11934f2af876" + } + }, + "scheduler_case_ids": [ + "p0008-b1-full", + "p0008-b1-chunked", + "p0008-b4-full", + "p0008-b4-chunked", + "p0064-b1-full", + "p0064-b1-chunked", + "p0064-b4-full", + "p0064-b4-chunked", + "p0256-b1-full", + "p0256-b1-chunked", + "p0256-b4-full", + "p0256-b4-chunked", + "p1024-b1-full", + "p1024-b1-chunked", + "p1024-b4-full", + "p1024-b4-chunked" + ], + "registry_sha256": "e3949a750cb27c1897a000f3b023f912629906612ae8949c1575d0acc36df5ec", + "case_ids_per_rank": [ + "adapters/cases/batch1-length1024", + "adapters/cases/batch1-length256", + "adapters/cases/batch1-length64", + "adapters/cases/batch1-length8", + "adapters/cases/batch4-length1024", + "adapters/cases/batch4-length256", + "adapters/cases/batch4-length64", + "adapters/cases/batch4-length8", + "adapters/cases/mixed-prefill-decode16-reorder", + "attention/attention.cases/batch4-varlen-reorder", + "attention/attention.cases/full-chunk-1024", + "attention/attention.cases/full-chunk-256", + "attention/attention.cases/full-chunk-64", + "attention/attention.cases/full-chunk-8", + "attention/attention.cases/hf-load-export", + "attention/attention.cases/kv-pair-gradient", + "attention/attention.cases/prompt-gradient", + "attention/attention.cases/qk-norm-gradient", + "attention/attention.cases/sixteen-token-decode", + "gdn/cases/full-chunk-1024", + "gdn/cases/full-chunk-256", + "gdn/cases/full-chunk-64", + "gdn/cases/full-chunk-8", + "gdn/cases/hf-load-export", + "gdn/cases/prompt-gradient", + "gdn/cases/replicated-norm-gradient", + "heads/cases/batch-invariant-prompt1024", + "heads/cases/batch-invariant-prompt256", + "heads/cases/batch-invariant-prompt64", + "heads/cases/batch-invariant-prompt8", + "heads/cases/embedding-repeat-100", + "heads/cases/entropy-interface", + "heads/cases/hf-embedding-roundtrip", + "heads/cases/hf-lm-head-roundtrip", + "heads/cases/logprob-original-and-promoted-logits", + "heads/cases/nonzero-finite-embedding-head-gradient", + "heads/cases/replicated-norm-gradient", + "moe/moe.cases/all-parameter-gradient", + "moe/moe.cases/full-chunk-reorder-1024", + "moe/moe.cases/full-chunk-reorder-256", + "moe/moe.cases/full-chunk-reorder-64", + "moe/moe.cases/full-chunk-reorder-8", + "moe/moe.cases/hf-load-export-all512experts", + "moe/moe.cases/replicated-router-gradient", + "moe/moe.cases/routes-replicated-1024", + "moe/moe.cases/routes-replicated-256", + "moe/moe.cases/routes-replicated-64", + "moe/moe.cases/routes-replicated-8", + "moe/moe.cases/training-forward" + ], + "case_ids_sha256": "be74417dfbd6031ba27978d06d04bb15daaab2aeb57d132c7e0d41176b28b46e" + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + } +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/preflight/tp4.json b/docs/usage/evidence/qwen3-next-chain-b200/preflight/tp4.json new file mode 100644 index 000000000..38447a87b --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/preflight/tp4.json @@ -0,0 +1,49 @@ +{ + "status": "passed", + "ranks": [ + { + "status": "passed", + "rank": 0, + "world_size": 4, + "device": "NVIDIA B200", + "nccl": [ + 2, + 29, + 7 + ] + }, + { + "status": "passed", + "rank": 1, + "world_size": 4, + "device": "NVIDIA B200", + "nccl": [ + 2, + 29, + 7 + ] + }, + { + "status": "passed", + "rank": 2, + "world_size": 4, + "device": "NVIDIA B200", + "nccl": [ + 2, + 29, + 7 + ] + }, + { + "status": "passed", + "rank": 3, + "world_size": 4, + "device": "NVIDIA B200", + "nccl": [ + 2, + 29, + 7 + ] + } + ] +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/redaction.json b/docs/usage/evidence/qwen3-next-chain-b200/redaction.json new file mode 100644 index 000000000..96d008b7e --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/redaction.json @@ -0,0 +1,15 @@ +{ + "placeholders": { + "": 9, + "": 35, + "": 18, + "": 7117, + "": 1, + "": 99, + "": 18, + "": 88, + "": 258, + "": 12, + "": 7161 + } +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/train/environment.json b/docs/usage/evidence/qwen3-next-chain-b200/train/environment.json new file mode 100644 index 000000000..074a21752 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/train/environment.json @@ -0,0 +1,4500 @@ +{ + "environment": { + "identity": { + "base_prefix": "/miniconda3/envs/rlkernel", + "binary": "/python3.12", + "binary_sha256": "6a1eb3ffc29f3a6b0ece607b016b4cfa5ca3ac57b34f17ed3266b404f78d2729", + "build_tools": { + "ninja": { + "path": "/miniconda3/envs/rlkernel/bin/ninja", + "sha256": "08639e194fffa7f08b259fc4abfa4803aff66b64de52549cee42ec527d55cea6" + } + }, + "distributions": [ + { + "direct_url": null, + "metadata_sha256": "6f1038270be40f9b8c0bcf391c627e7d7f41ccdd19aa192d6eac1dbfc3b19abc", + "name": "GitPython", + "version": "3.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "3f71971502087521f123c9daa26bc12d31d3466738b567390b8602acad3be22a", + "name": "Jinja2", + "version": "3.1.6" + }, + { + "direct_url": null, + "metadata_sha256": "818fb343b7b6b99a32771bf4813521ae6440b4c7579b3ae46e32dd02da0afeee", + "name": "Markdown", + "version": "3.11" + }, + { + "direct_url": null, + "metadata_sha256": "dc1ee42cf8ecfeee0ab60b15b21d291833e0732548efcb7bb5b3564dca3e5bf7", + "name": "MarkupSafe", + "version": "3.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "de7389b142450a0014234286b0876f328439b823c355c73d0aed41fd67ec208c", + "name": "PyJWT", + "version": "2.15.1" + }, + { + "direct_url": null, + "metadata_sha256": "ffcad4415cafb22b8b536a61595e9ee13438b51d31b0763c1b273ce3bc58e840", + "name": "PyYAML", + "version": "6.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "8562d701cc52d9cafbb418942b0e072fc087ed8ddcf35cd10224c1b2ed8bdd91", + "name": "Pygments", + "version": "2.21.0" + }, + { + "direct_url": null, + "metadata_sha256": "b6c25fcfdcc495edf248a10ca4ad28327ef2ed6047a6ec5c6346e121414c7f21", + "name": "Werkzeug", + "version": "3.1.9" + }, + { + "direct_url": null, + "metadata_sha256": "55c400d24c71b581d9c0992f71df6047cf6c878bebe61a7d45d6e02dc0e4c510", + "name": "absl-py", + "version": "2.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "13db521f90a6a882027b2388eaa2ebf252945f9c2adb7e7e371da18239da4df0", + "name": "accelerate", + "version": "1.15.0" + }, + { + "direct_url": null, + "metadata_sha256": "86fe44e38e67872dd895c729044942ba2c2f934ae439a899fb83a186206b7fd4", + "name": "agent-detector", + "version": "2.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "afe11fe9f5aa54e734cdd51659bed8c89dc6bcd5aef0ad96f2d20149c8de5456", + "name": "aiohappyeyeballs", + "version": "2.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "570b307bc0b53fbbd3ed2ce0b7eca6bbf2fa73bf75e24a480f1034d8c0b832bf", + "name": "aiohttp", + "version": "3.14.3" + }, + { + "direct_url": null, + "metadata_sha256": "44b7f8e14c4770793e747fad50c9e0a6ee7357651d878554f192d94768dc14a8", + "name": "aiohttp-cors", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "648813a44a9ae0ab2f20ee86d2404dcc38e3f9e80c63316cf6e536735df14e54", + "name": "aiosignal", + "version": "1.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "f6a3f6668bacef7f73a2c19ccb2be910b2363d1731c4725cb04364d99e24935a", + "name": "annotated-doc", + "version": "0.0.5" + }, + { + "direct_url": null, + "metadata_sha256": "fc6d752cde6a6a4bff03474386de750e130b75da3c7815ee909f45b51fea98c8", + "name": "annotated-types", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "4e89d670a4b20029da30e5a9e8ebcbc844deff9c44209552bafd5537249c8b9e", + "name": "anthropic", + "version": "1.9.0" + }, + { + "direct_url": null, + "metadata_sha256": "b5a6f00800956387fcddab1fe1b5aa8502c249b86cfb16d58ed700f282f60142", + "name": "antlr4-python3-runtime", + "version": "4.9.3" + }, + { + "direct_url": null, + "metadata_sha256": "a6008defa9492cd08250217b134782cad1db4580e1d7ddf69cc2a2a48cea24e0", + "name": "anyio", + "version": "4.15.1" + }, + { + "direct_url": null, + "metadata_sha256": "7877c64ce8957237363f2df313819bb07f50752df016d14c5a5a99bec10f5deb", + "name": "apache-tvm-ffi", + "version": "0.1.11" + }, + { + "direct_url": null, + "metadata_sha256": "3543ca8f0e072c00ab111b20eba99ce86dbf93ada28988775bc2677284b3c07a", + "name": "astor", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "d4b328c09c024fe1e4d788a9c7715ad726095131b815cd35fd933268226f6269", + "name": "attrs", + "version": "26.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "4850c4d696a5e2a2ecbb3dd792b060acc1de79e09800669b0b9fc3a22c055e6d", + "name": "av", + "version": "19.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "863ff92208d0a02dabfa008bfe91846a5c401ded301e5687dca7dc63c911865f", + "name": "babel", + "version": "2.18.0" + }, + { + "direct_url": null, + "metadata_sha256": "f32e6df3197f05202e586624d95c5e217003d80cee655c165d533102f628df21", + "name": "backrefs", + "version": "8.0" + }, + { + "direct_url": null, + "metadata_sha256": "905c362f655fbc6d37a24686efc2b3bfbd3123b8ee5a443a43f6750d87455e90", + "name": "blake3", + "version": "1.0.10" + }, + { + "direct_url": null, + "metadata_sha256": "07c85682b6aefd5c9b48890d306c1604311902295704892ede48e5a83219a8d3", + "name": "blobfile", + "version": "3.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "2d582941a7081625a35f35a0c4a2e80f7737312e29c38e5fdb6fc08f9c113077", + "name": "bracex", + "version": "3.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "3b60c55bae0d0340c3a3fd918635bbfa3087579da66e0fd7f6be7a3782c0da3d", + "name": "cachetools", + "version": "7.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "5d11a6878d5bc3f22290281a19ef7b36daa95c910780950608b95cd788c7e12e", + "name": "cbor2", + "version": "6.1.4" + }, + { + "direct_url": null, + "metadata_sha256": "362c9942c48051f168ed2b9f2146266b7792d3c05e164cd6afc3f3b65884fdc9", + "name": "certifi", + "version": "2026.7.22" + }, + { + "direct_url": null, + "metadata_sha256": "b4abf1bcf1c1d8e0272d8007fc974499ea59e5f2a5b98af3c78a5e67515a9d87", + "name": "cffi", + "version": "2.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "766120f13c177446f51929a4d201104bc935b6d5a2a176cd6716edce757d3d95", + "name": "cfgv", + "version": "3.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "610e9a9d03ce837ffe6e42be5e02e70087f73863f7350bf7bb7f0511edcc5ec0", + "name": "charset-normalizer", + "version": "3.5.2" + }, + { + "direct_url": null, + "metadata_sha256": "7ad836b3147c9702546d9c28b4fa5be23b24445439db5d0d2a58d17281c84daa", + "name": "click", + "version": "8.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "4c5f00599ebcbf11d337e48a72784d256ca3d704fa9e9f5daadd60065e6776b7", + "name": "cloudpickle", + "version": "3.1.2" + }, + { + "direct_url": null, + "metadata_sha256": "a0970189e3ab7a596d6902d5f61f93b414f138f03d3cf19029145657bfceb382", + "name": "cmake", + "version": "4.1.2" + }, + { + "direct_url": null, + "metadata_sha256": "94a6ebf9718e55f254a43ce0d2f04e0d6d44e7141b6f3144a84feb6519a77bfd", + "name": "colorama", + "version": "0.4.6" + }, + { + "direct_url": null, + "metadata_sha256": "ca8ec227f406d970a645ec482b20619128dd34b9cf71159cc24e27db461a2711", + "name": "colorful", + "version": "0.5.8" + }, + { + "direct_url": null, + "metadata_sha256": "bbaa51b7e4d8f142bd075d01257c0572c0c844796d51426e35c8096a13e8da76", + "name": "compressed-tensors", + "version": "0.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "6063d8ff7ebc458d63a4332853d7ababf4ee2b86336362c8d2b12be6e998eb6b", + "name": "connectrpc", + "version": "0.11.1" + }, + { + "direct_url": null, + "metadata_sha256": "ac5f4b5a5f68080bd9c3fe77399fe8a1bff2ee5923c49db1df544dd054cbf15b", + "name": "cryptography", + "version": "50.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "f41d2f6b4616accca2f5e1dd47aa9e8937c28076cde698226d93e727751f3099", + "name": "cuda-bindings", + "version": "13.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "e5ca6ed34c687c6f4a4d157ad0a2cf06ec0316fe8c4c0ddeb666ad76dd6f30f4", + "name": "cuda-core", + "version": "1.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "89baadd9da23dce9990481519544115615ba3cbd2d1a41e09feea7756fffb378", + "name": "cuda-pathfinder", + "version": "1.8.2" + }, + { + "direct_url": null, + "metadata_sha256": "1ab914b9a57ca601df2e3cfe9608427b15d8afb78029076ace5d1caf9fd45f08", + "name": "cuda-python", + "version": "13.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "73d97a5eb578223b4895ef4f234574d14219cef9999ff7d0e92a3d0dd057bd3f", + "name": "cuda-tile", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "ae6f957fe66ed63081d1d83ee6e8838f3a0af2c6fce1223629d0dd6264565ead", + "name": "cuda-toolkit", + "version": "13.0.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "1f8e0ae51ad5feea63f58ed2e24f3da6f23ed548043235a14f7623d961dd9b64", + "name": "datasets", + "version": "5.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "153f4a4d6ff03dbe5c8ad7fe54bc2e7b989a4947b70f7aa77fbf652b394f2a2e", + "name": "depyf", + "version": "0.20.0" + }, + { + "direct_url": null, + "metadata_sha256": "ee09fc752d7271aac93079cfd63409957dc6b536c1ffd9355a01bf7297e72aa6", + "name": "detect-installer", + "version": "0.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "a7feab2c4f69fd5f85e5a3cb495a7f1870a6bf8199dcee5339e8118f7acbdc09", + "name": "dill", + "version": "0.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "fef3fde661fe30ba7bd1d78841a797136b2b3461705bb4eb92dc54f8308bbaae", + "name": "distlib", + "version": "0.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "fef3fde661fe30ba7bd1d78841a797136b2b3461705bb4eb92dc54f8308bbaae", + "name": "distlib", + "version": "0.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "a3ca2e39abe76c4a33d5fe4a2a84375ec9f25cdfdb7e1d8ea406bd6f1603205c", + "name": "dnspython", + "version": "2.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "92a07daad5e6ff461199de14e845d9b376e309ef916ce5379f3c9cd4e3b1623f", + "name": "dockerfile-parse", + "version": "2.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "5b566b25f0cbe4955d0b16844a7cc6d2002caa3bde2dfda7f301fd8870cbaa56", + "name": "docstring_parser", + "version": "0.18.0" + }, + { + "direct_url": null, + "metadata_sha256": "5a1080b5768c6c591e1c4f9c9812cafa808781b9eeb198043bf185e22d4a1613", + "name": "e2b", + "version": "2.51.0" + }, + { + "direct_url": null, + "metadata_sha256": "0a63979e0b946e16238e4339e60d9c1eb5a7ce3ea93dae78b5da9c65a6190540", + "name": "einops", + "version": "0.8.2" + }, + { + "direct_url": null, + "metadata_sha256": "16cbe67a57558f1d4bfdbc22a454434ba301750c57a62b1d3f5361c9e5cddc00", + "name": "email-validator", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "0617ddb55b90b42ddc9398dc7e91d61fe928a2504939f76526dc15b22d238caa", + "name": "fastapi", + "version": "0.136.3" + }, + { + "direct_url": null, + "metadata_sha256": "ddd82b9666c21988e234d623e2575e1b89fd4133260eeab43fc9a7c074f7024a", + "name": "fastapi-cli", + "version": "0.0.32" + }, + { + "direct_url": null, + "metadata_sha256": "611602e834d42e10433155ff5f5581358d732fa6b6f6f7820a8f79e74b1ce1f9", + "name": "fastapi-cloud-cli", + "version": "0.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "794524e4a9659bda6043721d848d028ea49996085a33326094fbaaa3f6e6b895", + "name": "fastar", + "version": "0.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "711401d36e60e10e35beb4d0f1bb42bf0c4d86339ae52f32b9aa4a4d790530dd", + "name": "fastsafetensors", + "version": "0.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "efaea9742e348c4c4bdcc6f616a33cc5aa3ae926494a72a46690b7da2f08ed5c", + "name": "filelock", + "version": "4.0.7" + }, + { + "direct_url": null, + "metadata_sha256": "99bd6c3f10781d3d2d350f2c3c9fc4765b55f25de8a6d6dd1f71501802d1255e", + "name": "fla-core", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "0a6ef979b75295cee2b5293ad4942b0cf2682e9e38680203064e0b70249c1a96", + "name": "flash-linear-attention", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "76b70a11ca82ea4606b529e7a8658cb3fe71412afa46f2ed57101dd91ba27558", + "name": "flashinfer-python", + "version": "0.6.18.post1" + }, + { + "direct_url": null, + "metadata_sha256": "ba8ff415192b5cbb90efce046e2271a00c8184afc362d8b47fbbc84d5e558b05", + "name": "frozenlist", + "version": "1.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "e7712831c80eb13b08fb7f7cc33988a8f24654af9eba7c6f5f943b2636e4306a", + "name": "fsspec", + "version": "2026.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "025de85c794878d0caa737869307447595f514ebf9599eacb5b1a501bae479b6", + "name": "fsspec", + "version": "2026.9.0" + }, + { + "direct_url": null, + "metadata_sha256": "ca94883bdeaa3740b45b6994443b445fd67c6e4a8064ac3bf9d92d2a5221eee8", + "name": "ghp-import", + "version": "2.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "a7e90983562a035cf767baa63d8c32bc37e1de7cad71ac7b6b2bc70a95bba4eb", + "name": "gitdb", + "version": "4.0.12" + }, + { + "direct_url": null, + "metadata_sha256": "dd96143ec79178bef685c1f5c0a58a87a66d003b421e605de65697308321d518", + "name": "google-api-core", + "version": "2.40.0" + }, + { + "direct_url": null, + "metadata_sha256": "0735d57088a83df2355e16843107fb0112abe2178fc5bb8132947a7ad962aa41", + "name": "google-auth", + "version": "2.59.1" + }, + { + "direct_url": null, + "metadata_sha256": "2f3aa9d9500d329560440e6a5a152e420aad5f5bbb23701f45b740be721784a1", + "name": "googleapis-common-protos", + "version": "1.75.5" + }, + { + "direct_url": null, + "metadata_sha256": "06d74ab04fdc03fad368868907f0d10e7d9f397aab58d58965c0b78ffaec34cc", + "name": "griffelib", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "7ee1c179e2c68a62968308b2f96f4f3469176ee3ac8bdb494ac80188d4d41271", + "name": "grpcio", + "version": "1.84.0" + }, + { + "direct_url": null, + "metadata_sha256": "04cf3a4a91575850f386f4fcfdedd8e7fbfba08feff038fbc1296d1e854db2dd", + "name": "h11", + "version": "0.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "b954a6ba4739c0cc878bb8ea27ea7c7154a48bb4b7c06dba9e9cf880cf0ec930", + "name": "h2", + "version": "4.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "6f0d7bf86e75d0bda1ceccc82367c0145ad0ec522c4d4f51bb454f467faadcc9", + "name": "hf-xet", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "f991b847550cf8225f69562902b5ccb591b2ce9a08fe07ef6e6d701bdb4694a7", + "name": "hpack", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "314d194165c4700034c1c67cee847d549a6d7091374c71f2cef0186ec56a3eb9", + "name": "httpcore", + "version": "1.0.9" + }, + { + "direct_url": null, + "metadata_sha256": "aed9767360bed1bcbda71e3b1a3c996603f86558bc77a1693ee3d09973d20cad", + "name": "httpcore2", + "version": "2.13.1" + }, + { + "direct_url": null, + "metadata_sha256": "8fa3bf3510c35e2eea9f523a1cace7120079cf51d76c4acea97de95806aaa14a", + "name": "httptools", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "3bf4804c215d111b6a4702cf9000021ab39807d1ed3207dd011b14b2843b2d14", + "name": "httpx", + "version": "0.28.1" + }, + { + "direct_url": null, + "metadata_sha256": "d11dd50813b8914bd9455e8b2b591171cd2b1618883943153afadc8bb9224678", + "name": "httpx2", + "version": "2.13.1" + }, + { + "direct_url": null, + "metadata_sha256": "43b119c34ad2b2aacc032a1a6a8feb142fdb5ca407a3519325d74dd53d8904df", + "name": "huggingface_hub", + "version": "1.33.0" + }, + { + "direct_url": null, + "metadata_sha256": "9ce850d5a6b775e5ef4a335f907e579a878e058213121b6eec567781ea68c585", + "name": "humming-kernels", + "version": "0.1.12" + }, + { + "direct_url": null, + "metadata_sha256": "67aa4f6717d82446a51ce350e7c4769eba0c4a22d2f428255cddd9d24b11a914", + "name": "hyperframe", + "version": "6.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd9511ede42f63b995c3f71944f908cb8f014048b63ecc1c8d420525a3354b59", + "name": "identify", + "version": "2.6.20" + }, + { + "direct_url": null, + "metadata_sha256": "af3c3a62bb5d82d6a43454684e0b1dedde27a21ea90eacfb1bed9814619f06d0", + "name": "idna", + "version": "3.20" + }, + { + "direct_url": null, + "metadata_sha256": "cf71393f3d079ce2e859384573e65aaacd1709bef700701f629df32398b598f0", + "name": "ijson", + "version": "3.5.1" + }, + { + "direct_url": null, + "metadata_sha256": "9305763e93d03df0e36516b1125fa046a6ebe37d44589e200e0593cf4bdfd980", + "name": "importlib_metadata", + "version": "9.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "32860c3c19b2e91f6cb5bd83400b5870cda051bc74a5a08822c8c666af0990db", + "name": "iniconfig", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "560faabb3d45d779e445a74e7e806a786f95f2200fa06d979603b7f0ee1cfb39", + "name": "instanttensor", + "version": "0.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "f6fc1f0d389e4245fc2a1a0fdfee09422e56200cb6f94659668456997ff4f7a9", + "name": "interegular", + "version": "0.3.3" + }, + { + "direct_url": null, + "metadata_sha256": "d10f300731197a4829b77f0c883bb3cf8a37ae8c76a302e095fa95d6427706d0", + "name": "jiter", + "version": "0.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "5b0c8d4b4c535a2432fb206223d774509b6e20af374c6a4b6f98bf72a7de6702", + "name": "jmespath", + "version": "1.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "6c4032c2e74273452cd77399af2ee85198f49c22da897983f26d2ed6f787c4e8", + "name": "jsonschema", + "version": "4.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "aaa6cd66f423729e8da397c9d533b7d731f6b25f3d6371b9338c36bdb9be74a0", + "name": "jsonschema-specifications", + "version": "2025.9.1" + }, + { + "direct_url": null, + "metadata_sha256": "f7c0687c032593106a2e5a3c241cf8043e7e2c222bddb0022b4cb2bf5de67115", + "name": "lark", + "version": "1.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "4511c6b04efc57a5f5333edc1f5f48b9f5412c3923d4bc19b715bdf47977511c", + "name": "linkify-it-py", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "be929870f6ecae18a819c56118f1101f3076e25ac6a4843ca6f4707ebd1e87c6", + "name": "llguidance", + "version": "1.7.6" + }, + { + "direct_url": null, + "metadata_sha256": "cf2b87669bead3e76ec54207f3354c13f73b50c32fcd13c8d627084b3379139e", + "name": "llvmlite", + "version": "0.47.0" + }, + { + "direct_url": null, + "metadata_sha256": "0a416d79c5543d94d2b18807626293d4f47655d1d22724c7ae296e413078aaba", + "name": "lm-format-enforcer", + "version": "0.11.3" + }, + { + "direct_url": null, + "metadata_sha256": "16bc1f59e34fd2a6633bd395276052eacd2c777b2cf72781e76b203f013a8fac", + "name": "loguru", + "version": "0.7.3" + }, + { + "direct_url": null, + "metadata_sha256": "5216d5acfd039a7b581a826186309594b228d37d2c8d56864124ea666689fe4e", + "name": "lxml", + "version": "6.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "f59d772b35315a928672bfcccfb89d82c0aac672c5275c048f7a93b79015bcea", + "name": "markdown-it-py", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "b137367ef0056711cbf5e53015df9168cab80373104e7899b1c0263a21d9c99c", + "name": "mcp", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "38e0b9edaae09e58cd1461fc961ced22672038a697930bedef153a74befb3de1", + "name": "mcp-types", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "799f49685865fd9cc8915fdb92a33e102eeeffad562b03b4aeffb6f422b771c1", + "name": "mdit-py-plugins", + "version": "0.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "481f9cbe08596c6eaba6343e0efa1b13b2362c30dce0610f7c08523f1d98388d", + "name": "mdurl", + "version": "0.1.2" + }, + { + "direct_url": "{\"dir_info\": {\"editable\": true}, \"url\": \"file:///Megatron-LM-training\"}", + "metadata_sha256": "2876c0c760bbfc93bd7d737bf0db2866a937308a7c1707c3a2bb59d4795986ff", + "name": "megatron-core", + "version": "0.16.0rc0" + }, + { + "direct_url": null, + "metadata_sha256": "a6e34d488c879f57ce042bec38f8864ba3ea7d6ecf0ab757fc88fe8dc0a22f26", + "name": "memray", + "version": "1.20.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd26d80dc9676b1fb8c894355bd525fbe7f49a6a86a555c72e9ec6d927247c33", + "name": "mergedeep", + "version": "1.3.4" + }, + { + "direct_url": null, + "metadata_sha256": "dd1b3b89e88d1c65a26e6e72dd075eabbc220bfb138769ec8b64578ee911795c", + "name": "mistral_common", + "version": "1.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "4859847a9f6321daf8849cf7fd1542ff430db6563a2abf9ac0d62a5b21bd951d", + "name": "mkdocs", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "1729fc31479f2582486cdc85397417659dd3b2fb3f920553de66cfe59d5f0b3e", + "name": "mkdocs-awesome-nav", + "version": "3.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "88b4b7b7c0aba5547befdedaf515c8df4867361daf55ff60b72578464d72dcbe", + "name": "mkdocs-get-deps", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "ad33bb33fb16b1f69689c4682550e97232154e367e2c8c8aee9dad0f10d269ce", + "name": "mkdocs-git-revision-date-localized-plugin", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "ed69fbfb9ac00c10c5a383a12ff9d2b9919ae184e408554434199211643d6040", + "name": "mkdocs-material", + "version": "9.7.7" + }, + { + "direct_url": null, + "metadata_sha256": "d1c549b61701148b97f8246bc924b2840e504b37b0ce7a27e78ddf81261e5363", + "name": "mkdocs-material-extensions", + "version": "1.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "4ad6171f3bf6812e4de90670ff0089d445093d4fe1d05d55f17b96a4a192a816", + "name": "ml_dtypes", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "4ad6171f3bf6812e4de90670ff0089d445093d4fe1d05d55f17b96a4a192a816", + "name": "ml_dtypes", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "b0dbdfa30ab6b1ce637a794899c9e43019182b6d1ab2d07b90f647f7331eba6b", + "name": "model-hosting-container-standards", + "version": "0.1.16" + }, + { + "direct_url": null, + "metadata_sha256": "95424470e481cfa8d18b30963b6de3aafe16614b1ea0414e184a008571dde84f", + "name": "mpmath", + "version": "1.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "eb184d83489401903615ce8a78d98d5b933dec0f7246811d396a529915fe797c", + "name": "msgpack", + "version": "1.2.3" + }, + { + "direct_url": null, + "metadata_sha256": "520006303d6a0e859970b83f7d452196e2e8f6dab08f6dcf1ba5823c1230025f", + "name": "msgspec", + "version": "0.22.0" + }, + { + "direct_url": null, + "metadata_sha256": "010d2fe039006070a711a476b171b7b7da5c29ccad3c4eecd77ef3711b07c2d0", + "name": "multidict", + "version": "6.9.1" + }, + { + "direct_url": null, + "metadata_sha256": "235634cc7ebda45f8a84dfdb1b9b35ac1a77a1888b34650c3a616d23e4a7e93f", + "name": "multiprocess", + "version": "0.70.19" + }, + { + "direct_url": null, + "metadata_sha256": "7c545b4b3e5e83d3fde41352272c10cb9deeaba5b7138fbf24383e952af8822e", + "name": "natsort", + "version": "8.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "311ee8cdaeaf9f11acf51cda9c3b5b191f76ce9d98bc3418164c3189bbc37a08", + "name": "nccl4py", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "66360539217852c3b44b37f409eade7e1559baf018bb363bacb2aa3a9759b203", + "name": "networkx", + "version": "3.7" + }, + { + "direct_url": null, + "metadata_sha256": "e8b0b1746808b87816c47e4531780ded7f246bed9575a89e8b40200aa81e9a13", + "name": "ninja", + "version": "1.13.2" + }, + { + "direct_url": null, + "metadata_sha256": "77c1117f0dbc41560ddc6e6b37b542fb4e88afcd4ef82ec06593e5bbd5f37121", + "name": "nodeenv", + "version": "1.11.0" + }, + { + "direct_url": null, + "metadata_sha256": "9af629898406c9eaa69897fe09220dc483270cdba89f6b20bf0165cdf0e1668e", + "name": "numba", + "version": "0.65.0" + }, + { + "direct_url": null, + "metadata_sha256": "0c7281a81cf76e40b27c1385ffd8a215d7227adc219f177ce807ead9e91994a5", + "name": "numpy", + "version": "2.3.5" + }, + { + "direct_url": null, + "metadata_sha256": "0c7281a81cf76e40b27c1385ffd8a215d7227adc219f177ce807ead9e91994a5", + "name": "numpy", + "version": "2.3.5" + }, + { + "direct_url": null, + "metadata_sha256": "bab990ced4537ce74ef5961ca933c4c6fd604fd09a5827a4a428c55bcb0be35b", + "name": "nvdlfw_inspect", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "10f6595146332d35f7f15a000e08b5c81432528c5d026470c1d03f0c1399fb70", + "name": "nvidia-cublas", + "version": "13.1.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "58e933b4ac8e49f098b16ab7480d03bd792afc3d1db10d0aacbdcc2c62e48fa3", + "name": "nvidia-cuda-cccl", + "version": "13.3.4.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "baac937970681d41aa0c3708b3d55d73f8d29e70aceaac0e71fe6d1548e94a09", + "name": "nvidia-cuda-crt", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "8d51e5c76ef5707b0b80d5ec9a791c0f11a480ab721820cf100a3cc566017eef", + "name": "nvidia-cuda-cupti", + "version": "13.0.85" + }, + { + "direct_url": null, + "metadata_sha256": "724bf56e61ddef5d4c2482ff64103a973b911b110b668acaea5373f6c83c1c5c", + "name": "nvidia-cuda-nvcc", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "c54801dbd815d534519a761f1f328325aa0f1d1f1659aa969fa74e7a2c76eee9", + "name": "nvidia-cuda-nvdisasm", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "af51f248363020b9fdfd2743704e901bf3d19a1a1ce1fe44fb98ba148bfc0157", + "name": "nvidia-cuda-nvrtc", + "version": "13.0.88" + }, + { + "direct_url": null, + "metadata_sha256": "055f7fc69a5a2159de82cd0718da02c8852e81c8a71ebb117b8e799badd7167e", + "name": "nvidia-cuda-runtime", + "version": "13.0.96" + }, + { + "direct_url": null, + "metadata_sha256": "df18686dbdb3074ca375a1d6c623a04102fd348950c67a721397349c6d4f0477", + "name": "nvidia-cudnn-cu13", + "version": "9.20.0.48" + }, + { + "direct_url": null, + "metadata_sha256": "abd0ca3f67af19a4d383ff2a012ae0090d4731c6492fd47236615308a50b3981", + "name": "nvidia-cudnn-frontend", + "version": "1.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "4a78545d424d0c5038353f7046a8ae40ceaf312045d71399eac9511f5fc15434", + "name": "nvidia-cufft", + "version": "12.0.0.61" + }, + { + "direct_url": null, + "metadata_sha256": "e49b909195c03ddbe203729d9b31dd88e3f207368333d1909c67c6b130a0c696", + "name": "nvidia-cufile", + "version": "1.15.1.6" + }, + { + "direct_url": null, + "metadata_sha256": "bb15a754c6be32c23aaac13c1cfa7a8ce53d92bc26652ec3b609f7a5cce3e7d1", + "name": "nvidia-curand", + "version": "10.4.0.35" + }, + { + "direct_url": null, + "metadata_sha256": "0dd58f677811eac04901a793740932e5a2a8fff2f5453aa6351614eb18391bb6", + "name": "nvidia-cusolver", + "version": "12.0.4.66" + }, + { + "direct_url": null, + "metadata_sha256": "8aeb284782ef6883095a5d1c110e221cad023a99afcfd5cdb4969a25e146d562", + "name": "nvidia-cusparse", + "version": "12.6.3.3" + }, + { + "direct_url": null, + "metadata_sha256": "09555246122896eaca3b8313eecfca4b339fefd3b597874cb9fe3bf29dab38c9", + "name": "nvidia-cusparselt-cu13", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "ac77bac79fbfb0c52ac6e2e5abc936b1e127be2192f0cbc27b00be3125fa86ae", + "name": "nvidia-cutlass-dsl", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "1ec968ec7c4083f7fe4e1fb8384c7e9b853a81491fef9f4cb1cf755961aaedf6", + "name": "nvidia-cutlass-dsl-libs-base", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "cc6f3846cd820013eaa6e2665c493d70c607be6ce7349b939eb4742888470585", + "name": "nvidia-cutlass-dsl-libs-core", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "2357d0df2d0d17c0b16663b8a89df53f751b19721f66821fd88fa78112c08e55", + "name": "nvidia-cutlass-dsl-libs-cu12", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "244590c25662dcf777b1daae97a858afe1a1aec62e5e6678b217007a459ab552", + "name": "nvidia-cutlass-dsl-libs-cu13", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "c3a25ada01f57418c1b897406c3abab18834e6adc573ab7b060620c453afb6db", + "name": "nvidia-ml-py", + "version": "13.615.71" + }, + { + "direct_url": null, + "metadata_sha256": "56baad4e7f699902b03b17580933f7bd50b6ea97b7df9d7e807750973da7529c", + "name": "nvidia-nccl-cu13", + "version": "2.29.7" + }, + { + "direct_url": null, + "metadata_sha256": "98810ef0ab8badc369e6a46a038f8ee9f412c0c753fb5ad580544f23a0aa7962", + "name": "nvidia-nvjitlink", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "b0f54ee21909d19640a58e05da755c91763eb5725f544fd0d4b84b2f5f94deba", + "name": "nvidia-nvshmem-cu13", + "version": "3.4.5" + }, + { + "direct_url": null, + "metadata_sha256": "06dc1a593c7e8b8c3f29184228c83f8f7ef57787ad91f3e5bcae1d238dd3092a", + "name": "nvidia-nvtx", + "version": "13.0.85" + }, + { + "direct_url": null, + "metadata_sha256": "32ee63450a437b6a6ed227ff6549144aa596197a322993521ec7af826ebd413e", + "name": "nvidia-nvvm", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "32c2efdcd2c673b3b7f35ca9c2cccefaad36f1f0a920648a13cad85f6a5767b2", + "name": "nvtx", + "version": "0.2.15" + }, + { + "direct_url": null, + "metadata_sha256": "3419d80e114a2c19fa9bd3582939a3942f19673055707ba6ca2ca489d58b41e0", + "name": "omegaconf", + "version": "2.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "28971076ce9c279d4b889496b046d55a1e05b02fb9851ceb717e9a10df799572", + "name": "onnx", + "version": "1.23.1" + }, + { + "direct_url": null, + "metadata_sha256": "1246f5a4d8295907a42e809ed9173ede2510ec9d260d2168989d126564897fa5", + "name": "onnx-ir", + "version": "1.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "e14643636835759700dff286f949c5ec34e7eac7ac47f44096414f0e0f1c3101", + "name": "onnxscript", + "version": "0.7.2" + }, + { + "direct_url": null, + "metadata_sha256": "00f847e99939207bd70dfd806428f6b20a3d01074b59325e4c76149a2e19be26", + "name": "openai", + "version": "3.22.1" + }, + { + "direct_url": null, + "metadata_sha256": "598d3ad5a22a14a7c4f1d218b43e345f32b0ba094b753467bae8a3f708fd48cb", + "name": "openai-agents", + "version": "0.22.3" + }, + { + "direct_url": null, + "metadata_sha256": "5a0afcb1ce845e05da12beb1767f5d2749bbc9e9050718c6b9fa3c225713c9eb", + "name": "openai-harmony", + "version": "0.0.8" + }, + { + "direct_url": null, + "metadata_sha256": "e86a6b6fcbbe152805f782c57df321002892e163019574877e9829272e25eb4e", + "name": "opencensus", + "version": "0.11.4" + }, + { + "direct_url": null, + "metadata_sha256": "53d669c8bd3d32d3275153b454e515ca5cc6dec92fae3a98309b5a2b19fe6d2d", + "name": "opencensus-context", + "version": "0.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "19778b6d66b0e45bf73e11fa37a208949d5b393aef914627394d5601455546a6", + "name": "opencv-python-headless", + "version": "5.0.0.93" + }, + { + "direct_url": null, + "metadata_sha256": "19778b6d66b0e45bf73e11fa37a208949d5b393aef914627394d5601455546a6", + "name": "opencv-python-headless", + "version": "5.0.0.93" + }, + { + "direct_url": null, + "metadata_sha256": "a3f5434fa7c80f7f7abc82173da639c8e9c59d30b4027182645562bd3d2f4f97", + "name": "opentelemetry-api", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "8611977ea596e4827874582e86250618444e1c718229dddfc16e5ea437ce5fcb", + "name": "opentelemetry-exporter-http-transport", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "2cfd41e5ca33292d987ba71fa6186d11e16ed66888f3a26f8a3a99060c4b5e90", + "name": "opentelemetry-exporter-otlp", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "3bb4494220732d4bf10e1dba231ea7638cedaa5362e1f23a50d34a14f520fea8", + "name": "opentelemetry-exporter-otlp-common", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "27fb1c8aa5c2cd07776f9f3281fc618cd3feb96017757c33d2b3586fb7fec88b", + "name": "opentelemetry-exporter-otlp-proto-common", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "5cba6098cdd0bfb06853a6c704a2451c4f82c9dea376a30b59ecd279296648ad", + "name": "opentelemetry-exporter-otlp-proto-grpc", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "6f53ef1c172ebf87af69b9ef390aa908506d0cd14bc7811985fdd937a4058808", + "name": "opentelemetry-exporter-otlp-proto-http", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "1910f4e7ebd497e98b6d231e10275288fda2cd1885117575706c62f45e065889", + "name": "opentelemetry-exporter-prometheus", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "fab18b721e30be41448be252e1dca43b48e7f15d971e0bb552492c0ef4b07bee", + "name": "opentelemetry-proto", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "3644a79f55762a646799ff52b9d837e01c8192b7b28f735a383f55c90edb9bc2", + "name": "opentelemetry-sdk", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "add3db481f7f401f65cfbddb058fde3bb4c9dd7b61064a84f8598ad7efe0b11c", + "name": "opentelemetry-semantic-conventions", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "0dfff30e912520a226bcf7a547393484cfcd8c738439c7b48418f61c95109480", + "name": "opentelemetry-semantic-conventions-ai", + "version": "0.5.1" + }, + { + "direct_url": null, + "metadata_sha256": "210ce26bad0a245a72831b4fa029708c245d4d670a88c8d5a69b1446c24a95e4", + "name": "orjson", + "version": "3.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "35ff73511848f5f934ccc39d538014716ec4579e76d54e0e407ff51794a7939c", + "name": "outlines_core", + "version": "0.2.14" + }, + { + "direct_url": null, + "metadata_sha256": "8ee2f7138ade46b6e348a6d099612f5bd6caff13511f3b4144327f37ce50eacf", + "name": "packaging", + "version": "26.3" + }, + { + "direct_url": null, + "metadata_sha256": "a4ab87bf8083001f25ccdc46095f05b678b3569dd58edc2cf941e3e7f64d7c88", + "name": "paginate", + "version": "0.5.7" + }, + { + "direct_url": null, + "metadata_sha256": "1de96a6c28c2e5613c9c87cd4ad9484791001cf58df43cf2ba74d5c4f85f0ad2", + "name": "pandas", + "version": "3.0.6" + }, + { + "direct_url": null, + "metadata_sha256": "d05b8d05da9f78176b2eefaacdfaa5e96708ec4f488daea8bbc52e3ed1bc3954", + "name": "partial-json-parser", + "version": "0.2.1.1.post7" + }, + { + "direct_url": null, + "metadata_sha256": "c1d126edceac2685e29403a8ae3a27c47143dce1f0252fa3931771562f1e2b4f", + "name": "pathspec", + "version": "1.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "30325dc8ce17bc64f9dbc0a449232fd35841a019df22a6f481007c9c5a28c1cb", + "name": "pillow", + "version": "12.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "cbc0b7b6e63b50dcb7c17cf3526a9304f285d9a31353adf3b22acc2059ab23f5", + "name": "pip", + "version": "25.0.1" + }, + { + "direct_url": "{\"dir_info\": {}, \"url\": \"file:///work\"}", + "metadata_sha256": "6ba03b5bc457a2a3d92468729501b5892a0d38ebcc36766c58859449498c5743", + "name": "pip", + "version": "26.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "0421937c4410b61c5325233d5b7671ae933bae8de174f87586ac55aa804851ea", + "name": "platformdirs", + "version": "4.12.2" + }, + { + "direct_url": null, + "metadata_sha256": "2bcffab42626e1fb50d6329765619312d30fe7f4880e98dcee99c92ebd283bb4", + "name": "pluggy", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "7e7562ba7c032f8edd02641ae71b1ac2d8f388103a68d777a7e907d19e75bc17", + "name": "pre_commit", + "version": "4.6.2" + }, + { + "direct_url": null, + "metadata_sha256": "bbe0a7662602ddd23f929fe0ee98e9d04406e138aeee18ce4861af186ea6060d", + "name": "prometheus-fastapi-instrumentator", + "version": "8.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "ece4a61f3ffb92a083fd5e47e180e3e070342e60a3bd93876a879e79a643e821", + "name": "prometheus_client", + "version": "0.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "5feba21a58eaa126e7e7739e57e2572e5bb251fcbf56e439e508acc47d769314", + "name": "propcache", + "version": "0.5.4" + }, + { + "direct_url": null, + "metadata_sha256": "3f136dbf7239c987a7685acd33440cc5efd6c4107b4b11c425201b4de70ae36f", + "name": "proto-plus", + "version": "1.29.0" + }, + { + "direct_url": null, + "metadata_sha256": "118b5ad013120a7a6e24714595ad776bf264d7b0060389133310d18ea1480902", + "name": "protobuf", + "version": "7.36.2" + }, + { + "direct_url": null, + "metadata_sha256": "0849f5a519bf9bc23ef204443fdd8d6d10678863acac7ca9340fc11bfba5a856", + "name": "protobuf-py", + "version": "0.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "eab5f2f4fd98f67a710a8fb1975b64ffa880a4f977566f022c567e08e324ccd6", + "name": "protobuf-py-ext", + "version": "0.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "39009938840de3a8b2a37eb4668d2601aae8c74e4b74743f73e59996b5b7e6e1", + "name": "psutil", + "version": "7.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "df44b58e8a4cfe57f65773ec47f7bdf2a14c8f5f73a7abf331a6b6237d6d691a", + "name": "py-cpuinfo", + "version": "9.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "2fd4a9efc5e5c74ae4c2fcf1970193c524c62ab22af8d5e66ebf7df9e6e46e83", + "name": "py-spy", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "d2ccdeb15cddedc81637a83e40baa6397fe269023b738d0fc3cb2d90722e290b", + "name": "pyarrow", + "version": "25.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "47b9f28e971a56f5adf949e0bcf105b0bf6587946566ecf197a2819d8848cc01", + "name": "pyasn1", + "version": "0.6.4" + }, + { + "direct_url": null, + "metadata_sha256": "82ce4c01c6d36841b9801fcdabab9bfe61d0b5e4e440c275941d8a2d4a790730", + "name": "pyasn1_modules", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "45cb345e4c12f63bc843b8c88902cc44c4d624a55aaef8cd5ffbc0ad16356fbe", + "name": "pybase64", + "version": "1.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "d311ae661edeac8ff029ab2960d065a7e792ebf8f79af682daa53109fe81318b", + "name": "pybind11", + "version": "3.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "cce9c0d440d065d4cdfb0d00004b8ddd65cf363a740efc5b0920b29201a59cd9", + "name": "pycountry", + "version": "26.2.16" + }, + { + "direct_url": null, + "metadata_sha256": "a1e33542883c249bf6c263b0023b9ea8a6131a77d9cb2cbc88316968e5eada83", + "name": "pycparser", + "version": "3.0" + }, + { + "direct_url": null, + "metadata_sha256": "faffcc4d7d359cb1047a9f67f7c65096b838c6db6c62852ef20fb27d55649a95", + "name": "pycryptodomex", + "version": "3.23.0" + }, + { + "direct_url": null, + "metadata_sha256": "98929f4cb80451dc3c6c8cd541a3081dccf0dee94afe7d9fa5c214a18ff236ce", + "name": "pydantic", + "version": "2.13.5" + }, + { + "direct_url": null, + "metadata_sha256": "8eccadbe707db97c397fb79073fe791b7998ef3a85f04f817f8991f7697b190b", + "name": "pydantic-extra-types", + "version": "2.11.1" + }, + { + "direct_url": null, + "metadata_sha256": "8f00c91deb34399316a5386eb2e76fe09f14a08dc3045f2e7dce9bf8573796bd", + "name": "pydantic-settings", + "version": "2.15.0" + }, + { + "direct_url": null, + "metadata_sha256": "66c729edddc20bf2764bb18bd87d907b08690e50355f39b97acc737b26d1d164", + "name": "pydantic_core", + "version": "2.46.5" + }, + { + "direct_url": null, + "metadata_sha256": "394500d78a0c1a433ae8ca3693152c08f6a901121d4b069cf1540a19759e2950", + "name": "pylatexenc", + "version": "2.11" + }, + { + "direct_url": null, + "metadata_sha256": "df2e9e9847a2aea0ae6e20fd325aeb16cf3ce7f8913462db6c2398363cd0c0bf", + "name": "pymdown-extensions", + "version": "12.1" + }, + { + "direct_url": null, + "metadata_sha256": "82fcfe724db9f0b51348da89f4f5cdc0b08d08882b1bbc0ca4913d3a0a93bcb9", + "name": "pynvvideocodec", + "version": "2.0.4" + }, + { + "direct_url": null, + "metadata_sha256": "3722422cc1478b175879143dfb78f98b7a5f53f4f684d71b7054fe2e8acd3b89", + "name": "pyqwest", + "version": "0.10.0" + }, + { + "direct_url": null, + "metadata_sha256": "7d1d1c276b7c372d55d17ac7d30f0a4b80a746e147347b8510d1355eea7f80c8", + "name": "pytest", + "version": "9.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "89e7c1c932e52b74bdcaf504389d2d1a2d7ca559b02bf5a09fc80ebd58ad10f7", + "name": "python-dateutil", + "version": "2.9.0.post0" + }, + { + "direct_url": null, + "metadata_sha256": "54f30f811841b6d772f31715712c85bfe0041839cb071f78daf41c700a98642b", + "name": "python-discovery", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "54f30f811841b6d772f31715712c85bfe0041839cb071f78daf41c700a98642b", + "name": "python-discovery", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "0cc19efd76cfbf3bcb2cb0d3ab82191036855859455aa3812c5e9e591e3f34e8", + "name": "python-dotenv", + "version": "1.2.3" + }, + { + "direct_url": null, + "metadata_sha256": "1d866c6124631b9ce1797ad412fff298ab53fc2d95210281d7c8f20e920753fa", + "name": "python-json-logger", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "2d18a1e7286d92a656ead5ec6f83d5ae6dc858634624f6b264703ae88d24d718", + "name": "python-multipart", + "version": "0.0.32" + }, + { + "direct_url": null, + "metadata_sha256": "beaa0efe9ba4b34843f5a0fc7379a73f10e95adb8cc0c31f359ab6f3a42b4def", + "name": "pyyaml_env_tag", + "version": "1.1" + }, + { + "direct_url": null, + "metadata_sha256": "238dc769e22d4f5626750cdff36e920e4a8d69c10d88de6d79b40a59cc13d873", + "name": "pyzmq", + "version": "27.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "de0a5e855bb5bb78b7acdcd2ca60619c6a0c109814881589caf158ec07155662", + "name": "quack-kernels", + "version": "0.6.5" + }, + { + "direct_url": null, + "metadata_sha256": "961ffef199b876fb4d7b10903d78e79f359d703b1638834c61d70b9879932918", + "name": "qwen-vl-utils", + "version": "0.0.14" + }, + { + "direct_url": null, + "metadata_sha256": "faf6ab9027d12de992827a2d8a224996fe6747a8c5f7d31ae495983dc73eefe9", + "name": "ray", + "version": "2.54.0" + }, + { + "direct_url": null, + "metadata_sha256": "c50d8b3ff4d113925b60dc47d1d28e87248a3338024241b0a3a66c8794fbce0c", + "name": "referencing", + "version": "0.37.0" + }, + { + "direct_url": null, + "metadata_sha256": "02acdc52d6f21d5f4b172254daaa94edfaa44c9ebe14d1c00cc4c8fe99b0e1df", + "name": "regex", + "version": "2026.9.29" + }, + { + "direct_url": null, + "metadata_sha256": "ac08207697217d1ffde8a161b424d77d6e2af6b62630fa26d75d08f11076cdca", + "name": "requests", + "version": "2.34.2" + }, + { + "direct_url": null, + "metadata_sha256": "f1abd635c3dff607a4fd654c62a88d9d4c21843cfc9176116c156f4269ca21b5", + "name": "rich", + "version": "15.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "932ff7743a756d0efcc45528d64c275ac3cb40a8dd1787ea10cb303907f0ae4f", + "name": "rich-toolkit", + "version": "0.20.5" + }, + { + "direct_url": null, + "metadata_sha256": "294a1405c0fa34b5f735bcb46459050436849a1e584c643544de99c07c529fb7", + "name": "rignore", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "5e54dd00b4ad336c5161d47de2a5c2212090c44629c28b6538b156256e49282d", + "name": "rpds-py", + "version": "2026.6.3" + }, + { + "direct_url": null, + "metadata_sha256": "0d5895abd80bfc0027c02943abaea4547061b9004bd134950d640d619a697835", + "name": "safetensors", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "91d5de3f641f33a8fbb4b6e91772da68d50b68686971d7b66af2068f2e77b694", + "name": "scipy", + "version": "1.17.1" + }, + { + "direct_url": null, + "metadata_sha256": "297fb30f701a800489c12893a951da3e5bd1f80061a1f43f0d3e9f1d4c6bc6fd", + "name": "sentencepiece", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "4245e0388ddf2048a38ae2a24a3d2c583408b2454aadc680d3c3beede639db3f", + "name": "sentry-sdk", + "version": "2.71.0" + }, + { + "direct_url": null, + "metadata_sha256": "ae8a9e6feec1a76e954d65ea48ac57842c9a7bfb5ac6e5ea82400a5ba9f71a98", + "name": "setproctitle", + "version": "1.3.7" + }, + { + "direct_url": null, + "metadata_sha256": "341d00772017437d0f6e3c943ae353f243c39fedfba403aea47cced927a76516", + "name": "setuptools", + "version": "79.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "ff4bcfb192bd542ed8f1794fb32ffc9eabd932d6e03cb00a4ad5e35a2469af88", + "name": "setuptools", + "version": "80.10.2" + }, + { + "direct_url": null, + "metadata_sha256": "f1e5a532fb8cda0bbc370e3db6cb9cea72a065d12ddd6a14976ba3cf66264221", + "name": "shellingham", + "version": "1.5.4" + }, + { + "direct_url": null, + "metadata_sha256": "2aba2cfd9c2ad7625a5d374d141af317d8f92d3534997bf98d127e52848dfc81", + "name": "six", + "version": "1.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "69ae2dfe547624be97fae348e1cfa3793f8854eed32cc1603badedc7d48fb36e", + "name": "smart_open", + "version": "8.0.2" + }, + { + "direct_url": null, + "metadata_sha256": "d415e6c6de7dee117d254a342668c489931bc88eac7ec8678b452078e366da6e", + "name": "smmap", + "version": "5.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "093bc4f0740a6fc28692e616aa8fe68d7e1d76426cc5a5faf9ea722a8ee7aaae", + "name": "sniffio", + "version": "1.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "b3cef071eb1dbeaa76a1273fe2ca2cc8ef36e835165253952d93780962529ac1", + "name": "sse-starlette", + "version": "3.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "3c01ca830e213f0311fe37bc3b46b8ab230a5e7acb894bf0fc8785cb7ccfed48", + "name": "starlette", + "version": "1.7.0" + }, + { + "direct_url": null, + "metadata_sha256": "6017ca508a293cf47a88a78cb330e9cbd131d74ec3c7fbf89bd4300ed3129d30", + "name": "supervisor", + "version": "4.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "fd5eb4925b04f9bffbc6c4f92bf8aea7243b918b43cd359493fce48a7dd3b336", + "name": "sympy", + "version": "1.14.0" + }, + { + "direct_url": null, + "metadata_sha256": "f09f0e24282c5a86346bcd5b10ae5ff81869fa8ef69c3ba524bd0a817a87dda9", + "name": "tabulate", + "version": "0.10.0" + }, + { + "direct_url": null, + "metadata_sha256": "519fa19c146fd58a0a75ecf1461e4bd98f9c06d01800c37d4a80f5fef095f4e1", + "name": "tensorboard", + "version": "2.21.0" + }, + { + "direct_url": null, + "metadata_sha256": "1af7ad76e4073b01ab147eb3c1d8e38b95d38062c6c9bc63890150738642e8eb", + "name": "tensorboard-data-server", + "version": "0.7.2" + }, + { + "direct_url": null, + "metadata_sha256": "9e597f62fc07e3b931d5c8fb0e90706fb6d45465cfb5d01dbd27ba7fc135c02c", + "name": "tensorstore", + "version": "0.1.80" + }, + { + "direct_url": null, + "metadata_sha256": "0da993d16ef6326f471796fcb065622f309c5c1aae6c6295b488ea64bb5c880c", + "name": "textual", + "version": "8.2.8" + }, + { + "direct_url": null, + "metadata_sha256": "52ca6148d4fd1497254855fa610cfdde99191cd42bce7a452fd3a68855504ac0", + "name": "tiktoken", + "version": "0.14.0" + }, + { + "direct_url": null, + "metadata_sha256": "0df9eb495cfb477dcbdfbdcd8c04d952d3eb00d77831630760571e13545398e5", + "name": "tilelang", + "version": "0.1.12" + }, + { + "direct_url": null, + "metadata_sha256": "802b576e011dc61bd2681593e8d802714b6c4ce636a9cf87035026db32ce6262", + "name": "tokenizers", + "version": "0.23.2" + }, + { + "direct_url": null, + "metadata_sha256": "4e1631b2164a49ff9a848d86ce504fdcc15e3540dbb262df8f33a2681a8de513", + "name": "tokenspeed-mla", + "version": "0.1.8" + }, + { + "direct_url": null, + "metadata_sha256": "05086095a775c5dca70998dcf442a848c13f9c68b54a54c510c3542c5abb6563", + "name": "tokenspeed-triton", + "version": "3.8.10.post20260920" + }, + { + "direct_url": null, + "metadata_sha256": "71daba472d0c5ffc25c0231dc29688ab0cb13d5bc7e7d93f6c4cce4169c50048", + "name": "torch", + "version": "2.13.0" + }, + { + "direct_url": null, + "metadata_sha256": "cccd2f1c0e5866e63732f58798c8d642ee6d10cd560d6f691e7981b908c246c9", + "name": "torch_c_dlpack_ext", + "version": "0.1.5" + }, + { + "direct_url": "{\"dir_info\": {}, \"url\": \"file:///torch_memory_saver\"}", + "metadata_sha256": "6276cef17dedbb5ee0d6157bbf63b832e916026281328d995ad3d488c2539618", + "name": "torch_memory_saver", + "version": "0.0.9.post1+slime" + }, + { + "direct_url": null, + "metadata_sha256": "29809ca2c86dda5079654f1f70564a64435e9d08f1964a2412b6f514e1b5ff64", + "name": "torchaudio", + "version": "2.11.0" + }, + { + "direct_url": null, + "metadata_sha256": "7e9be0f3a290e3fd9370d8fe010c7ffd006d5d3d05ab8bdf7df8f92f0fca9c39", + "name": "torchcodec", + "version": "0.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "181fa5e6b399c378711eddcdacd756d3c51317916f8eb160ee36cae7fae9589f", + "name": "torchvision", + "version": "0.28.0" + }, + { + "direct_url": null, + "metadata_sha256": "43d1261aff90cf3d5b1b40cf1f94234d61409b14e59f3766f457c1eec7f7ac15", + "name": "tqdm", + "version": "4.70.1" + }, + { + "direct_url": "{\"archive_info\": {\"hash\": \"sha256=3e1d9f534781c8e608240da0b495b8246317a36382f7609017cbaa7fb1d53f7b\", \"hashes\": {\"sha256\": \"3e1d9f534781c8e608240da0b495b8246317a36382f7609017cbaa7fb1d53f7b\"}}, \"url\": \"file:///wheels/transformer_engine-2.16.1%2Bc9877beb-cp312-cp312-linux_x86_64.whl\"}", + "metadata_sha256": "d882f743161d9d9f35dee4e1a8cc9136fa495f7c660caace01ab8f5602d76aa7", + "name": "transformer_engine", + "version": "2.16.1+c9877beb" + }, + { + "direct_url": null, + "metadata_sha256": "465797a59706d83b45c93fde750b228c3b6e1addc44115de2c4c02ad66d9c5ea", + "name": "transformers", + "version": "5.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "a91982ca086667c592a951973434f7c5a9f27a8300bc97af78dfb496afe53e71", + "name": "triton", + "version": "3.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "d26fbb244532c4051e715f9047cd943e2cc4abb0ac6f2a517fa2986eb1ea726a", + "name": "truststore", + "version": "0.10.4" + }, + { + "direct_url": null, + "metadata_sha256": "c84af1a069084b1b440b3594068dec29200d52d4c1a9b652030448717f270158", + "name": "typer", + "version": "0.27.2" + }, + { + "direct_url": null, + "metadata_sha256": "0ad6653b7439f4bb6a596cb7b01ed1b716458467525c4dc40b75d62bdb943c98", + "name": "typing-inspection", + "version": "0.4.4" + }, + { + "direct_url": null, + "metadata_sha256": "d005280aa13b334ac942d20219102865e559f69ffd06c35c248b2f0d0da3b933", + "name": "typing_extensions", + "version": "4.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "fba2930e9030a18965d243f8d330748db2e67572a81b3b68710462fb5110332a", + "name": "urllib3", + "version": "2.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "bc5717bd6524a33838f285261868bcc8e311e8c29fdb19e41d56c38b04890e84", + "name": "uvicorn", + "version": "0.54.0" + }, + { + "direct_url": null, + "metadata_sha256": "741c006d8441f562aa853a5430df236fbb4af923445491f396bf09943bd30258", + "name": "uvloop", + "version": "0.22.1" + }, + { + "direct_url": "{\"dir_info\": {\"editable\": true}, \"url\": \"file:///vime\"}", + "metadata_sha256": "f85aa01dfdc868756a6583434bbff040f29eb511d47d5b25ada063a84353aac6", + "name": "vime", + "version": "0.3.2" + }, + { + "direct_url": null, + "metadata_sha256": "c25431aaf1950971fe96292f395a41a55b403127bfca0d0b8f7dc9cff5dab75d", + "name": "virtualenv", + "version": "21.14.1" + }, + { + "direct_url": null, + "metadata_sha256": "4e3ee0a31d85e56268640aae853bcee4794dfe8c0483c5c6370517e480c81ae0", + "name": "virtualenv", + "version": "21.14.5" + }, + { + "direct_url": null, + "metadata_sha256": "d4ed5c7551cddb8c1aeff2f9f27b3491f6ad2c9afda8e7bb9779c33fa12a536c", + "name": "vllm", + "version": "0.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "84b482e09bac949e992594757214a1920c667a5d898ee320e309250697f6d26e", + "name": "vllm-router", + "version": "0.1.15" + }, + { + "direct_url": null, + "metadata_sha256": "9b16c871eb1060a5218e9b9a9ad33288d94844cfaf43f08dbb6c32423bde8fe3", + "name": "wandb", + "version": "0.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "8e4f2be437dfe4eb3c6c959e517ac20b75d06525563f1ebcbf06f9ec648bd7c1", + "name": "watchdog", + "version": "6.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "15218afb42938907c2ca74c54e3d8e3a5406493c4761e29e38e82bfec0f84296", + "name": "watchfiles", + "version": "1.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "8863af96e88b7db9990da99aa6c46816eacc3d2f9ae1297b53381b033cd70119", + "name": "wcmatch", + "version": "11.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "f46e6bd6cfafb2b684c29587b017b7096fd9155b74eda25a22eca784b9803ab7", + "name": "websockets", + "version": "16.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "ce82db5ccfefa4bfbe4e25a36e1f91e8e7d51fcaeb31586c4d48e1c69f99168b", + "name": "websockets", + "version": "17.1" + }, + { + "direct_url": null, + "metadata_sha256": "0f142a2c09eac643c7d0bfe77f3f121184c0b17914afbd32af669ed19b2b02ef", + "name": "wheel", + "version": "0.47.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd58938e51a3c5cb363f6f22eaa2a8a7accc1ce373388de167a82f77d3e5783f", + "name": "wrapt", + "version": "2.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "b0b72c1941f04499ca7e1a3a6e479aee8df902c3d49979624b59dba8c3228d37", + "name": "xgrammar", + "version": "0.2.8" + }, + { + "direct_url": null, + "metadata_sha256": "ef8861f39e5c36255966a36032651f937d890d55f31f1c26304b488f1ba34332", + "name": "xxhash", + "version": "4.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "740c08057b6eb69c58402c87d652af0a471e46325d811f2c605632a18817152f", + "name": "yarl", + "version": "1.25.1" + }, + { + "direct_url": null, + "metadata_sha256": "7b060e4d24394b5431875e2f74fec8e6bffa79d2e6b4cb8c7e2a5187dd2d8d69", + "name": "z3-solver", + "version": "4.15.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "3d76d4fbc95f0851191147db12300938c67a6f8fb1df884886d9601272ccc4e8", + "name": "zipp", + "version": "4.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "d3de2651e4e908dbb7c9d80508e5179590217dfac4993dc8b04381c5b9718c4c", + "name": "zstandard", + "version": "0.25.0" + } + ], + "executable": "", + "installed_provider_sources": { + "vllm/compilation/__init__.py": { + "path": "/vllm/compilation/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/backends.py": { + "path": "/vllm/compilation/backends.py", + "sha256": "fa4bff8920b363efbbde9456f135fa9d2c004a5bde1898877f177418b2d8b008" + }, + "vllm/compilation/base_static_graph.py": { + "path": "/vllm/compilation/base_static_graph.py", + "sha256": "5cfe8e06db84aa42cd41cdd93ebe93af00b3a242c8011042057530e2922b523a" + }, + "vllm/compilation/breakable_cudagraph.py": { + "path": "/vllm/compilation/breakable_cudagraph.py", + "sha256": "3cc427612a08e2b9b3fee47548026400c1d0776e2d4747535e59ef5512bdf1e8" + }, + "vllm/compilation/caching.py": { + "path": "/vllm/compilation/caching.py", + "sha256": "71d212452dde742fbf28b8a01ed29d3c08a7457ff7f8da2a20ce9d17e902c2cf" + }, + "vllm/compilation/codegen.py": { + "path": "/vllm/compilation/codegen.py", + "sha256": "e04833bec88cf9d1a13aa7341e30e3233d1138bfe23424e0fd34d664b3fedb9f" + }, + "vllm/compilation/compiler_interface.py": { + "path": "/vllm/compilation/compiler_interface.py", + "sha256": "8d84e2864bf83f754bae9e9f77119e0287cca9f97f5fa5ec2535e07b5ad88944" + }, + "vllm/compilation/counter.py": { + "path": "/vllm/compilation/counter.py", + "sha256": "d8158c54dd36a357bf24f6f84dc22f572d3a27f4875f3d5779b12bc5d454ff76" + }, + "vllm/compilation/cuda_graph.py": { + "path": "/vllm/compilation/cuda_graph.py", + "sha256": "05c86392d7fae967ac73076dba7e01990a0e3ae619e4866450a0c1be56bd1192" + }, + "vllm/compilation/decorators.py": { + "path": "/vllm/compilation/decorators.py", + "sha256": "cab6962e8a1fead59c75f5ed8cb4732f9e5441ff972030c2f4b1c4ba0c58de3c" + }, + "vllm/compilation/monitor.py": { + "path": "/vllm/compilation/monitor.py", + "sha256": "43b24c5cb1bc4d32dc979f3222596905c7b3acc58415328a234402e6edc76abf" + }, + "vllm/compilation/partition_rules.py": { + "path": "/vllm/compilation/partition_rules.py", + "sha256": "857d2fb06dc871ea1d3717cd01fbd4e5205984100d98b7b72a2933d6ff1cfa4d" + }, + "vllm/compilation/passes/__init__.py": { + "path": "/vllm/compilation/passes/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/fusion/__init__.py": { + "path": "/vllm/compilation/passes/fusion/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/fusion/act_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/act_quant_fusion.py", + "sha256": "1fa9c3ca4fb424685b7053c3dda89dda16c98dc5645d85f0f28dca58429792b3" + }, + "vllm/compilation/passes/fusion/add_rms_fusion.py": { + "path": "/vllm/compilation/passes/fusion/add_rms_fusion.py", + "sha256": "e46998552628aa5cd5962fc39ea39ae824fd97e6aeba1d176e9cc7cade39837b" + }, + "vllm/compilation/passes/fusion/allreduce_rms_fusion.py": { + "path": "/vllm/compilation/passes/fusion/allreduce_rms_fusion.py", + "sha256": "0af193505880cec0f6ffa224c688bce3c9ddc318dccdf04a696b4e4b4506a963" + }, + "vllm/compilation/passes/fusion/attn_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/attn_quant_fusion.py", + "sha256": "ecc64e82be4481954c9cac6c23d7794846ab19486b570f2dda07ab5ad67c5a49" + }, + "vllm/compilation/passes/fusion/collective_fusion.py": { + "path": "/vllm/compilation/passes/fusion/collective_fusion.py", + "sha256": "1e2c8539d6960b45907fb3bf0482441ea7250e97c56ffdea1500514efa0b164d" + }, + "vllm/compilation/passes/fusion/matcher_utils.py": { + "path": "/vllm/compilation/passes/fusion/matcher_utils.py", + "sha256": "50ac5714ce1bb113520de769ea6234316acc470a8cdf2537a996ce9a9d54337d" + }, + "vllm/compilation/passes/fusion/mla_attn_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/mla_attn_quant_fusion.py", + "sha256": "a966fe7f58bf9228379f793f5fd851735a97f9639722766b2a20cb79a9e4baec" + }, + "vllm/compilation/passes/fusion/mla_rope_kvcache_cat_fusion.py": { + "path": "/vllm/compilation/passes/fusion/mla_rope_kvcache_cat_fusion.py", + "sha256": "1602cc28055ffa8d1123ddb1d256bf0bd12006fd06ea7e16a986c55746dbe0dc" + }, + "vllm/compilation/passes/fusion/qk_norm_rope_fusion.py": { + "path": "/vllm/compilation/passes/fusion/qk_norm_rope_fusion.py", + "sha256": "aebc7d1a5189b65ac665afcc169e7baebd53efe719c48e35e7c5babe85af0d39" + }, + "vllm/compilation/passes/fusion/qk_norm_rope_kvcache_fusion.py": { + "path": "/vllm/compilation/passes/fusion/qk_norm_rope_kvcache_fusion.py", + "sha256": "f0cfd0d83ec4acb09f9bf91d199b114e9d4995e3059c13eb23a6978ce7c07eb2" + }, + "vllm/compilation/passes/fusion/rms_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rms_quant_fusion.py", + "sha256": "4852aa44e0e2087043fdac271bda9b8d9bfe3201bb84ce3919b8ed454d8083c4" + }, + "vllm/compilation/passes/fusion/rocm_aiter_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rocm_aiter_fusion.py", + "sha256": "372e76c68c75209a085deec6dd22b3816be633613ca82f6f2925c1b3773d61a0" + }, + "vllm/compilation/passes/fusion/rope_kvcache_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rope_kvcache_fusion.py", + "sha256": "3a756e9049593537143b5a56ab9185a6bc83f57ed81d84226d7791a46a984b53" + }, + "vllm/compilation/passes/fusion/sequence_parallelism.py": { + "path": "/vllm/compilation/passes/fusion/sequence_parallelism.py", + "sha256": "3af7e420dcb35fff0bae0f8f599d0f1bda34445ebe194059892a434b2976d654" + }, + "vllm/compilation/passes/fx_utils.py": { + "path": "/vllm/compilation/passes/fx_utils.py", + "sha256": "730708213acf9d1b5f3176b433dfc197a5f3c81b5ce443f0923c526924833003" + }, + "vllm/compilation/passes/inductor_pass.py": { + "path": "/vllm/compilation/passes/inductor_pass.py", + "sha256": "1f380aacf7adabb8bf8b7d41c0a93473947f0716f7445bd910fd448f6c08e672" + }, + "vllm/compilation/passes/ir/__init__.py": { + "path": "/vllm/compilation/passes/ir/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/ir/clone_elimination.py": { + "path": "/vllm/compilation/passes/ir/clone_elimination.py", + "sha256": "5297078f5cddce081faba5215814275381d2083b32318fcfeb2bf9d69fedb7c7" + }, + "vllm/compilation/passes/ir/inplace_functionalization.py": { + "path": "/vllm/compilation/passes/ir/inplace_functionalization.py", + "sha256": "2dc4f22c6f05224828c2941479185b1452d4490f488b7f0bfd124334e7809fed" + }, + "vllm/compilation/passes/ir/lowering_pass.py": { + "path": "/vllm/compilation/passes/ir/lowering_pass.py", + "sha256": "d9c3d90f63138420f0e5489447b5996573fcfbbab939da2efccd00848492b172" + }, + "vllm/compilation/passes/ir/utils.py": { + "path": "/vllm/compilation/passes/ir/utils.py", + "sha256": "f59d33a6c7d0616cbeec1e9fb1d6c948881bf81fe124caeb906eac2e2197ea21" + }, + "vllm/compilation/passes/pass_manager.py": { + "path": "/vllm/compilation/passes/pass_manager.py", + "sha256": "486979a058aa2e20ebedcbb6e039f7a59f38d2efd2cda11219fae4067be0968d" + }, + "vllm/compilation/passes/utility/__init__.py": { + "path": "/vllm/compilation/passes/utility/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/utility/fix_functionalization.py": { + "path": "/vllm/compilation/passes/utility/fix_functionalization.py", + "sha256": "ad5b504a05ccee023869b0c8df70ec2fff9a4a80d25fd903e2b532f470e7203f" + }, + "vllm/compilation/passes/utility/noop_elimination.py": { + "path": "/vllm/compilation/passes/utility/noop_elimination.py", + "sha256": "8abf85d28c13f95059f2acbc0275b9b9ed2ad4990f7c5763bbe3067a4aa629ce" + }, + "vllm/compilation/passes/utility/post_cleanup.py": { + "path": "/vllm/compilation/passes/utility/post_cleanup.py", + "sha256": "1c38b14fc209165cbcf8ca763a17ac4e528b97f59b573e5d52df2cce7d758de3" + }, + "vllm/compilation/passes/utility/scatter_split_replace.py": { + "path": "/vllm/compilation/passes/utility/scatter_split_replace.py", + "sha256": "138402cc3097768a32e9e5b8d1a054b6176e494bddc8684e23ca2dc5fdc3fdda" + }, + "vllm/compilation/passes/utility/split_coalescing.py": { + "path": "/vllm/compilation/passes/utility/split_coalescing.py", + "sha256": "0b02acd9e1ad43d7b3e128b914e969b9580773f2818078846dfbf163a8bd0871" + }, + "vllm/compilation/passes/vllm_inductor_pass.py": { + "path": "/vllm/compilation/passes/vllm_inductor_pass.py", + "sha256": "4f83ffb67f834a214221d810c7843a8e41eb4e5930eb40adbd8cf054ff6fb9c6" + }, + "vllm/compilation/piecewise_backend.py": { + "path": "/vllm/compilation/piecewise_backend.py", + "sha256": "6525318ff3ca2e4978e24dd9232a7ae0a02e920e19604b83db6f6043d1f8a54d" + }, + "vllm/compilation/wrapper.py": { + "path": "/vllm/compilation/wrapper.py", + "sha256": "c1b1fca679ea16aa07a696831a810c0d531da2bb0ea32dd6f1a95cdaef36de07" + }, + "vllm/config/__init__.py": { + "path": "/vllm/config/__init__.py", + "sha256": "56fb0cb1598d297e4f95a97e5d86dc624145d1532f5faa432b7d2834d7155bd5" + }, + "vllm/config/attention.py": { + "path": "/vllm/config/attention.py", + "sha256": "c41f345b512d9b7df882328257eb3a6381f41088c11ae83b5ecd8a9e8265d1bc" + }, + "vllm/config/cache.py": { + "path": "/vllm/config/cache.py", + "sha256": "f1c226ba679c884930dbfcaf41a57248b137a9a20d3ed8e3d3b31752bb484c07" + }, + "vllm/config/compilation.py": { + "path": "/vllm/config/compilation.py", + "sha256": "c9cec5c7200e8e559810ec8c30113ad61dab6780f9f7fb3c116bd0d9b5a43065" + }, + "vllm/config/device.py": { + "path": "/vllm/config/device.py", + "sha256": "7b82eee02ceb5842337451a27a3d5729920c47e25e8f6bf3997f5146f9330a9c" + }, + "vllm/config/diffusion.py": { + "path": "/vllm/config/diffusion.py", + "sha256": "1fa9fd2478a866098a28a3586b55af2f9738656b7813a55d76539c10dd99fe8d" + }, + "vllm/config/ec_manager_config.py": { + "path": "/vllm/config/ec_manager_config.py", + "sha256": "418b387dbe7bdf67deddce331c205768a2d42aea37141f59fb02a8a1528e3552" + }, + "vllm/config/ec_transfer.py": { + "path": "/vllm/config/ec_transfer.py", + "sha256": "0eabb2c25194676d23c6acf59562672a1dd24415043ac5737d621ce0d681ec70" + }, + "vllm/config/engram.py": { + "path": "/vllm/config/engram.py", + "sha256": "34043a22385a041d4e9be8857f64174c990c2ca8308b97b6a952b5ab96c20ee5" + }, + "vllm/config/fault_tolerance.py": { + "path": "/vllm/config/fault_tolerance.py", + "sha256": "b166b24373d599fb15ddc575e3061cf0dcb42174d0369d8468008e7ffbb2a4e2" + }, + "vllm/config/kernel.py": { + "path": "/vllm/config/kernel.py", + "sha256": "27e23c584cf862f4091858db6dc85bbc2a01f4baf9dca3f232ae6f3bac02390e" + }, + "vllm/config/kv_events.py": { + "path": "/vllm/config/kv_events.py", + "sha256": "b1dbaee3e6830e381e9157fe3bab0d65c357da88ff7cdf8b1e4b3a4e75c82a87" + }, + "vllm/config/kv_transfer.py": { + "path": "/vllm/config/kv_transfer.py", + "sha256": "506fae7a9d7f32cb3646156cf9249a856f6317dff6c4c85db70efd34418c429b" + }, + "vllm/config/load.py": { + "path": "/vllm/config/load.py", + "sha256": "bd6431c22e078362d749a56a2c84145432ebf2605d8bcfa2ac679182d18ed630" + }, + "vllm/config/lora.py": { + "path": "/vllm/config/lora.py", + "sha256": "ed6cf6575f5950f079a62f904caeae93d1a4745dd8c21788b74367883bcd4b08" + }, + "vllm/config/mamba.py": { + "path": "/vllm/config/mamba.py", + "sha256": "2090f791201ca45dd4f1d72b8651268890eb07574b6084721194eb8fdf612c48" + }, + "vllm/config/model.py": { + "path": "/vllm/config/model.py", + "sha256": "f4168b67cc93ce72ff2a6d4c66974223e32fd0f1fab4c05e44bd68a275e18d69" + }, + "vllm/config/model_arch.py": { + "path": "/vllm/config/model_arch.py", + "sha256": "2babe28329d7b60b4e205f6d72c687f0f66e6535aa2f20411469e5ec362f6b5f" + }, + "vllm/config/multimodal.py": { + "path": "/vllm/config/multimodal.py", + "sha256": "271911aee151f17f092228cecee82af0713e9a47340ffdf66834ca7638a50d22" + }, + "vllm/config/observability.py": { + "path": "/vllm/config/observability.py", + "sha256": "d57c59ec776477ab0a20e9f2b945bc954d8ea3737c869259480e9aa10dfb9f6d" + }, + "vllm/config/offload.py": { + "path": "/vllm/config/offload.py", + "sha256": "6f2db3d9a2730588473d5155811690c6241b167a21dcb62fbbd9ebb6386de42c" + }, + "vllm/config/parallel.py": { + "path": "/vllm/config/parallel.py", + "sha256": "f012ace89e3fb730a467f729f602679bc145c49f0d10721811c9d818570e7b2b" + }, + "vllm/config/pooler.py": { + "path": "/vllm/config/pooler.py", + "sha256": "9f01913dcb7bccbf9b672b16643f18471ae202455992e8afaf0725a17f2b3d08" + }, + "vllm/config/profiler.py": { + "path": "/vllm/config/profiler.py", + "sha256": "04d24fa1dc7cfedca6b5c7d9115f7f7021722fc46a5b15234a1e3b3a506c93e5" + }, + "vllm/config/quantization.py": { + "path": "/vllm/config/quantization.py", + "sha256": "acffc52f525b39a88efd656f1ed705ce3a1b758298bb0684fac7694776bc10b4" + }, + "vllm/config/reasoning.py": { + "path": "/vllm/config/reasoning.py", + "sha256": "2c4f7bdee48a9fb3d93787c4c32361c2411417cce452cfde86808d8759977861" + }, + "vllm/config/scheduler.py": { + "path": "/vllm/config/scheduler.py", + "sha256": "822179da62be4bca0619c8590082ae09123f5c4415f9cc2037be673748239edb" + }, + "vllm/config/speculative.py": { + "path": "/vllm/config/speculative.py", + "sha256": "9c642a87264339c0dbc1d0b57330572149df0f9d5e16c6893b9895e50a619e19" + }, + "vllm/config/speech_to_text.py": { + "path": "/vllm/config/speech_to_text.py", + "sha256": "bf4a566fbde6a1cec1e209070b739650c3302c12696739c88049cb8f723a4c3f" + }, + "vllm/config/structured_outputs.py": { + "path": "/vllm/config/structured_outputs.py", + "sha256": "55649776594349b8b4aa3e08fc4c88068366732a486d6fb235079188044aa829" + }, + "vllm/config/utils.py": { + "path": "/vllm/config/utils.py", + "sha256": "d035e9e488ba92b6c47a96cf05d9b2a850d53eda8a05115b22ff9af8dbc2fc64" + }, + "vllm/config/vllm.py": { + "path": "/vllm/config/vllm.py", + "sha256": "956b812e5a719bcbfa3a3958801361b38b9c928c96b8c073311bbb96376dfb7a" + }, + "vllm/config/watermarking.py": { + "path": "/vllm/config/watermarking.py", + "sha256": "30e6620a3cd7529f0736ad55e38bc326a6a78dee4552f0722208400041c94a1f" + }, + "vllm/config/weight_transfer.py": { + "path": "/vllm/config/weight_transfer.py", + "sha256": "92edd9e5ea90c97a8f3c5f20abf1734a105ee1f3f89e306e7ba87e758f1f767e" + }, + "vllm/distributed/__init__.py": { + "path": "/vllm/distributed/__init__.py", + "sha256": "97f28c30b32662af8cab163939e4ee423037f11630752e13b55cbc25a7d0ab71" + }, + "vllm/distributed/communication_op.py": { + "path": "/vllm/distributed/communication_op.py", + "sha256": "3c3f8ac60db38ece891d39dc1e2f6f1947ad438685893d2e5777d072320bd1b8" + }, + "vllm/distributed/device_communicators/__init__.py": { + "path": "/vllm/distributed/device_communicators/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/device_communicators/aiter_custom_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/aiter_custom_all_reduce.py", + "sha256": "f8eb027ce7a85d94af6260960ceb7f36fc6f1406c9af9c9b6285fddb3f178009" + }, + "vllm/distributed/device_communicators/all2all.py": { + "path": "/vllm/distributed/device_communicators/all2all.py", + "sha256": "1f1b69236acd3cd7bd94520fd6d591bfd31b57c4bc7c9f9f4161ea8bbd0c5f26" + }, + "vllm/distributed/device_communicators/all_reduce_utils.py": { + "path": "/vllm/distributed/device_communicators/all_reduce_utils.py", + "sha256": "ed0ab4dd05b2519a6313892e68824c97b540034664d7f8c3d031b322e33e1bfc" + }, + "vllm/distributed/device_communicators/base_device_communicator.py": { + "path": "/vllm/distributed/device_communicators/base_device_communicator.py", + "sha256": "4a7670f12ed7c7621b25d476e2687c24ca01f3be183fff4a6a25337596fe506b" + }, + "vllm/distributed/device_communicators/cpu_communicator.py": { + "path": "/vllm/distributed/device_communicators/cpu_communicator.py", + "sha256": "e1856c8e91cfbbb4d9ce990c1236e258ba4021e226afcbab645653380b38d64b" + }, + "vllm/distributed/device_communicators/cuda_communicator.py": { + "path": "/vllm/distributed/device_communicators/cuda_communicator.py", + "sha256": "102d95c67ec798cf352b817ba92e8abc9da37f30d1bbdf3aab45d3927b627b93" + }, + "vllm/distributed/device_communicators/cuda_wrapper.py": { + "path": "/vllm/distributed/device_communicators/cuda_wrapper.py", + "sha256": "333b6d9ed173e7a18c7f2b6627a3c9c9ed88892ce52015f05e29d6d245e48ee3" + }, + "vllm/distributed/device_communicators/custom_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/custom_all_reduce.py", + "sha256": "a048c1327c23580805600c0c951831bec333b1ffc4eb26a0e3d34119c4f0c445" + }, + "vllm/distributed/device_communicators/flashinfer_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/flashinfer_all_reduce.py", + "sha256": "b4359760e9b55963676109a5c3a015fb82e190d4df1d021de9ee01e7814cbdda" + }, + "vllm/distributed/device_communicators/flashinfer_pcie_ipc_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/flashinfer_pcie_ipc_all_reduce.py", + "sha256": "8b67b0fc356a565095f56b475cc89c513e3a5eff051ab1c52e5beb0c1a79e9f2" + }, + "vllm/distributed/device_communicators/mnnvl_compat.py": { + "path": "/vllm/distributed/device_communicators/mnnvl_compat.py", + "sha256": "72ee1e6f9571b4c8ecbd9f60cd469d1b565cb79cab519a688a93f290906a2615" + }, + "vllm/distributed/device_communicators/pynccl.py": { + "path": "/vllm/distributed/device_communicators/pynccl.py", + "sha256": "882fb83c5a3c565a3f8fd664b79f5ceae566dca180019ecafd74bc8c11d9f8cf" + }, + "vllm/distributed/device_communicators/pynccl_allocator.py": { + "path": "/vllm/distributed/device_communicators/pynccl_allocator.py", + "sha256": "390e2576cbf4ae06341ca4dab24fc7e4d4f7c24dd444329ed05d828a9ce91460" + }, + "vllm/distributed/device_communicators/pynccl_wrapper.py": { + "path": "/vllm/distributed/device_communicators/pynccl_wrapper.py", + "sha256": "ce63c8da57bb88d4cf89956bd70bb63f0f44bfad468ddb37b765611551f6d99f" + }, + "vllm/distributed/device_communicators/quick_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/quick_all_reduce.py", + "sha256": "8aacb23e7c297b0ae2f80d99c5affd2e7517115d7874be51069d14a44db7b5f2" + }, + "vllm/distributed/device_communicators/ray_communicator.py": { + "path": "/vllm/distributed/device_communicators/ray_communicator.py", + "sha256": "332c37f65495b60564d61db59bc2d30ca0236adc33442d01464790bde9aec897" + }, + "vllm/distributed/device_communicators/shm_broadcast.py": { + "path": "/vllm/distributed/device_communicators/shm_broadcast.py", + "sha256": "f3e7a3f3ff713fccbd535e0d41650ee05bdf8677e83d4b90519910645022c30b" + }, + "vllm/distributed/device_communicators/shm_object_storage.py": { + "path": "/vllm/distributed/device_communicators/shm_object_storage.py", + "sha256": "e097bf7ac0141fe8db4131e8fd553ca2ad5b0600b22a56f3924af6b795e7207c" + }, + "vllm/distributed/device_communicators/symm_mem.py": { + "path": "/vllm/distributed/device_communicators/symm_mem.py", + "sha256": "b06e3ddb9ae880a30ec4a103ce32eb9794223bb0293832e89572af28adaaa544" + }, + "vllm/distributed/device_communicators/xpu_communicator.py": { + "path": "/vllm/distributed/device_communicators/xpu_communicator.py", + "sha256": "527cbfb250760abc62096ee7cd612307b821f21b72dee1687ad866620ec89b6d" + }, + "vllm/distributed/ec_transfer/__init__.py": { + "path": "/vllm/distributed/ec_transfer/__init__.py", + "sha256": "061405bb51df7409c9938b62e25caa8bd6ebf85da6d1700dbd4affe2a0825135" + }, + "vllm/distributed/ec_transfer/ec_connector/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/base.py", + "sha256": "22d4913375bb622473fbe1a77f9376b804949cd8a7e31e9518208f9561d161e2" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/common.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/common.py", + "sha256": "e2267abd8d00a6d2605e1a82ea5c73396a71b427452eab469fcca0134c334e7c" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/connector.py", + "sha256": "72cd35d9fd754a2992dd090a8af13c91e0789b4038ac29276750d823120235db" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/base.py", + "sha256": "19e8df88b0fa831997896355ecdd49e0d86cb074cd7ae28aed0b328b0bb3ab2e" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/zmq.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/zmq.py", + "sha256": "435641c0e37551ab4937855abd067be26905b91215e759cbd9d28a419a34ff9a" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/base.py", + "sha256": "3be698aeb67d32ee3741e76b2fb71806941c587578583acf8fbc42fbf22b46a5" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/nixl.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/nixl.py", + "sha256": "03af8f6549a6027b7262a482907af591e45f28b9b1c5a3408bbc6600e38797e5" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/ec_shared_region.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/ec_shared_region.py", + "sha256": "e40607952c9920024455eca2f419e8c3ef1de9a4d8b27c147a33bb941b8c08b1" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/protocol.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/protocol.py", + "sha256": "05878336884396bfbef77b96b0fa6359f6fa0aba912961f14a84f5a436f27038" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/__init__.py", + "sha256": "01c42385bf3a55cff09cc05ba956f6dd4b8b6b986bf4d6eca4e566cb045b48e0" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/embedding_cache.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/embedding_cache.py", + "sha256": "7359fb980af1fc30b3253681310ef636e2b4a19134e04a93270c9c45de2572d8" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/session.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/session.py", + "sha256": "5973548a919e13c866222b91d502686a6757a31e5a5664b879bf2887ed9fb212" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/utils.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/utils.py", + "sha256": "160ac665f20f2c75b343c1e784084f2b0b4d1cf8fdb28ee15deee4dc8ed0ce45" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/worker/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/worker/__init__.py", + "sha256": "f08d296d3560c42173ae8af961af4a768033ccf1e36e9c17c0cdd53013d0c52e" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/worker/descriptor_buffers.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/worker/descriptor_buffers.py", + "sha256": "be7c81be214e995da8499105ba485854d9c19d6f8e905f8f1b87b83694ca0864" + }, + "vllm/distributed/ec_transfer/ec_connector/example_connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/example_connector.py", + "sha256": "09022ce07a89114bb65d9befd2e60873453aed11bbac8c0a75c1e6084e785a5f" + }, + "vllm/distributed/ec_transfer/ec_connector/factory.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/factory.py", + "sha256": "d6cedca0a99c3dd2b03cd1c15d17472b983e3f7d8f5baf4a12eecaf6abedb817" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/__init__.py", + "sha256": "1cbfc2f95f8f4d48a9253056eb1fd4b562062884e3fd5cb6571583c352fc16f3" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/config.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/config.py", + "sha256": "98c60696f79d1de67d2364cd9e8a42a393b5c8e17ed9af2f971368e47891d7b3" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/control.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/control.py", + "sha256": "58e0d1a423fbe958bfa586ac26a17107e08d0b31d044b4c74ab4dde880e7ca9b" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/memory.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/memory.py", + "sha256": "d5e90b1348de670a70f110d58eedcbdbd053db72c21dd007c3f5275c53951149" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/metadata.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/metadata.py", + "sha256": "497a7e6dfffb7fce80a41d5989f96119b970c143df77bb9d0f9c91d7a46e8c42" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/producer.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/producer.py", + "sha256": "97fa4d0b19475574778eab02f55fad73db9642beb9156da890314fd53fa1a7ab" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/reservation.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/reservation.py", + "sha256": "4790bc65cde4db5f17733ca2c2910980ba594a8a9b79ee27c5b957dffd4c1113" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/scheduler.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/scheduler.py", + "sha256": "53004b62529a31fdd80dfb2e6026610b95041a77e91f731ae526fefd84e7968d" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/state.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/state.py", + "sha256": "92f375d6c5cc9c83dbe95a7977ad8eb0f1b5629ccee92968bcacdc94eee15d65" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/transfer.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/transfer.py", + "sha256": "ada2113a5402054f1149d3edc2537f4e5e1bd696c9b17291c9f2b4cbf6b59753" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/worker.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/worker.py", + "sha256": "89eb91bb64845b3b121d502972a6b04d448714253becd2ea662e5691cd5acdd7" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake_ec_connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake_ec_connector.py", + "sha256": "aaebab4711bc00dd0c622dfbfd8639fc41e7ed5d1658d7d68fe33e4d5fbef3ba" + }, + "vllm/distributed/ec_transfer/ec_connector/utils.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/utils.py", + "sha256": "11b9014b9c0697f8846deff1a55a22fa86a15dc2ac3e139442fb6d513ac03059" + }, + "vllm/distributed/ec_transfer/ec_transfer_state.py": { + "path": "/vllm/distributed/ec_transfer/ec_transfer_state.py", + "sha256": "9487a41f23fa1a4fa6dfca8b42b8e97a0ee19d8406ffd1dcf4bef66315180827" + }, + "vllm/distributed/elastic_ep/__init__.py": { + "path": "/vllm/distributed/elastic_ep/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/elastic_ep/elastic_execute.py": { + "path": "/vllm/distributed/elastic_ep/elastic_execute.py", + "sha256": "b8f60a4183c79ff6051095b5f95bb385bc7fea0cffe8cd9ebc9087ab0e9f01b5" + }, + "vllm/distributed/elastic_ep/elastic_state.py": { + "path": "/vllm/distributed/elastic_ep/elastic_state.py", + "sha256": "fbf049199841a086fdf2fc1ab8498ef017ad3bf319db65c3ae61acbb536d2e10" + }, + "vllm/distributed/elastic_ep/standby_state.py": { + "path": "/vllm/distributed/elastic_ep/standby_state.py", + "sha256": "15282597550ebd0e07b8492ff192aea1ec0dcec8f0ad34009123e1002cc140c1" + }, + "vllm/distributed/eplb/__init__.py": { + "path": "/vllm/distributed/eplb/__init__.py", + "sha256": "1b9c2ee22abb5888c354c5aa01f0944f253e5e24e135d019778398bbe495a628" + }, + "vllm/distributed/eplb/async_worker.py": { + "path": "/vllm/distributed/eplb/async_worker.py", + "sha256": "424328600ad1003286fc5dfffa1f9482007314c060947818b2f94a8b97811f5e" + }, + "vllm/distributed/eplb/eplb_communicator.py": { + "path": "/vllm/distributed/eplb/eplb_communicator.py", + "sha256": "ba30d9d40e7b81d3f42aa9041d2f328edca4073cfe2de920285eb68375501ed8" + }, + "vllm/distributed/eplb/eplb_state.py": { + "path": "/vllm/distributed/eplb/eplb_state.py", + "sha256": "2f06bc8c63f3fdf55edb5032ae55c0ffcac3e67720ce74ea312e3d141b12acf4" + }, + "vllm/distributed/eplb/eplb_utils.py": { + "path": "/vllm/distributed/eplb/eplb_utils.py", + "sha256": "058af6104faa6d4085c1dca80bbe60d92bf0a7ec9cd92c775a180546c9d8c9c3" + }, + "vllm/distributed/eplb/policy/__init__.py": { + "path": "/vllm/distributed/eplb/policy/__init__.py", + "sha256": "daeb266c88442832b1ab8c8c4cc064891b38b9e9ba00aea324f926c87dc6d37e" + }, + "vllm/distributed/eplb/policy/abstract.py": { + "path": "/vllm/distributed/eplb/policy/abstract.py", + "sha256": "b9fd34c28bbfdded03360d7f3f6f8fb978e82689190d7ae4501dfe520e958c62" + }, + "vllm/distributed/eplb/policy/default.py": { + "path": "/vllm/distributed/eplb/policy/default.py", + "sha256": "3b54229e6240d050480390f6b29d4744fd38437d23719f78a6decf7002296a29" + }, + "vllm/distributed/eplb/rebalance_execute.py": { + "path": "/vllm/distributed/eplb/rebalance_execute.py", + "sha256": "b387e228791149018536eee96cf955b33ba79d801cdc36849d1b47a580ec2597" + }, + "vllm/distributed/kv_events.py": { + "path": "/vllm/distributed/kv_events.py", + "sha256": "de08f01e8736881560256c350a3b6418999dd4aa30f9c6ec9159527f7ed6899a" + }, + "vllm/distributed/kv_transfer/__init__.py": { + "path": "/vllm/distributed/kv_transfer/__init__.py", + "sha256": "c1be4e58ec6923bae607a355ad22891c740f056a69ff7358b1e10ea3fd2680ea" + }, + "vllm/distributed/kv_transfer/kv_connector/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/base.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/base.py", + "sha256": "2ae2a2c48f5731f3533166a75440fe91e764332305b5d713df840edba970789d" + }, + "vllm/distributed/kv_transfer/kv_connector/factory.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/factory.py", + "sha256": "add99c93c587b0098b90b1f8fd6940bdd1f15c236c5c6f1a258411863cb902d3" + }, + "vllm/distributed/kv_transfer/kv_connector/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/utils.py", + "sha256": "317ed40dc837671ca6e666165222e641a0f9b3992aea63bbf54de7e13d40b3a4" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/__init__.py", + "sha256": "5beb6ccad12fdcfe1581982da6f18321caca50e73a6b3259ebf3c8dc8b3ffcca" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/base.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/base.py", + "sha256": "97af64220475c6c9e8273438d7b5138b105ebe6944beb783facb36a3bb76f31b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/decode_bench_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/decode_bench_connector.py", + "sha256": "b4151c88cdec28f1ff9259047abc17baf23b892f4b68769a93bf26e0442b9017" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/example_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/example_connector.py", + "sha256": "6226876ef52d10d0d284d29c337ab44698e8bac6abdb2e0ece53b5756c55d068" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/example_hidden_states_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/example_hidden_states_connector.py", + "sha256": "58c22534dcad0fb73599a2d70a2fb104d5b612a4723be5e777f56a56fe07892c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/flexkv_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/flexkv_connector.py", + "sha256": "de4f68c3bd565ed898e47e0b2980049b966ff31888f1957050d30995d4953762" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_client.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_client.py", + "sha256": "bea6ecff2be281c7e96c1551c7bf463cbb01f2964696067c0ebdb683844f9aab" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_connector.py", + "sha256": "e67ed58015090e5eea9d499883f2a9422673d07f8bdbe0ccff7db15d2460de13" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_metadata_server.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_metadata_server.py", + "sha256": "6800e5cf37809f8a8e28c469c14a434db288bc3bf83a8b62ee06910a20c2da19" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/common.py", + "sha256": "8f2c02c08227a9093e6aeb183961aba36b7812cfc29b8c047a2b2c9d82f79c15" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/gather_scatter_helper.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/gather_scatter_helper.py", + "sha256": "08c1b43de34fbeca77357d7576ac1d17cba974b59d695562f68bb713061e7b54" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/hf3fs_mock_client.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/hf3fs_mock_client.py", + "sha256": "bec61a9b0c4b9124b2292d7646d76411da44396389349b53cdcbc46353c8780e" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/connector.py", + "sha256": "8c61094ce0a3a702908f9576f69482e6bf314738a2cbe33a7d3b47258fa0ab43" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/stats.py", + "sha256": "d9383a6ad6ab6b8f812d29d90495407b770eeddb79b86e9d0e3216c0bd16e0ed" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/worker.py", + "sha256": "251c0d8e57e4739c03ce3e1c899a95ff5b1752eb27676c28ab88c4ebd62c4776" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_connector.py", + "sha256": "5991f9ff8832df32bd421eb67e48237270ea0a408180e523810bb43606acf8f3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/__init__.py", + "sha256": "c53be9796e76cde637514bfc40a525d8c09bb2784b406cb516790d8285dfe433" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/multi_process_adapter.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/multi_process_adapter.py", + "sha256": "6480d67b31ed603027a83edf327880a38aee45eaeee2da9a4efa93e95527c166" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/utils.py", + "sha256": "e204fa6a853ac9c122d7a4e9d146902230f81c48d4321ed5edfdbf979dd49ba2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/vllm_v1_adapter.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/vllm_v1_adapter.py", + "sha256": "e6fe55049c6b007248516d69640e2f3a4809f9d286091a1014ae0949987fa8f1" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py", + "sha256": "c712c386a7c57bf0355a1441ba574232c3aa5498fcb70713a2b3f5d18b64f9c1" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/metrics.py", + "sha256": "de1b1797d0448f74370919dbb0278767f390e8f59e00a0c0528abefb302babc2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_connector.py", + "sha256": "516be01320e64b0110e102eeb69a6ba766dd5ac8cb3036db6b97b7d54413323d" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_utils.py", + "sha256": "26877610463fa8e9d6b092772f2551bcc0c3ac794cbe63996df0414666a8ebba" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/rdma_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/rdma_utils.py", + "sha256": "716e5042edecaba36c7ca763474988f32fa09c2668b8260260149df610af8f83" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/stats.py", + "sha256": "f39b2f0b1db2e4f922e27e684a3f7bbf5bb279b82a0a8c3bb0c7ae69b6d14d24" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/connector.py", + "sha256": "17a350bdb89e17e415d6c52a48684dc15c35a804378daf03e1f3bee1b1b123a3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/coordinator.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/coordinator.py", + "sha256": "a8eb6c2157a96e8d25233b82347ac8409a41d6390b4f2c64242119c05911010c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/data.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/data.py", + "sha256": "d3cfefdb4165a24995749cba452641b318065baa95bb1bae62f922a2f8886e7b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/metrics.py", + "sha256": "f2b9ef8927632d142aad11a374d0725c6e619ea0bb7fea9eda3f3895eb7d277a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/protocol.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/protocol.py", + "sha256": "ccb1cf6a84a932a375215627d2aaac482c351a05df015d636d05373a6845b7c8" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/scheduler.py", + "sha256": "283849ff581ec206444cdf5621622377f1c925e8d7e05cb9294af2f3a5094e79" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/worker.py", + "sha256": "55f1682dfd1ed7af689166421337126a0e1d08afa4774a242e098d79e0c1e95b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_common.py", + "sha256": "549bb4fe22dca5095515b9c0712c31cc81a9d4923881e9f112317640fd8c04ab" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_connector.py", + "sha256": "c0f474bc34b579d889fae92eaf43eaca241be51a4697a187a942f0df4e6b6a98" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_engine.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_engine.py", + "sha256": "d842f3772fc6588d5a329a67572324cb74709aa3df4033e64c791a1e706c8e88" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_layout.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_layout.py", + "sha256": "2b4ec046a78897236b0626939bb828b6ec095355097d10bca39e5f3e1c992553" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/multi_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/multi_connector.py", + "sha256": "12d8387239f3194f2cb63ccbd64824648047210323572d66671e6a1eed349fc3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/__init__.py", + "sha256": "cc3145fe3b6d219a267bf40a0f7c0cc9430e4289f94acab2df761b99b671e7ba" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py", + "sha256": "7a1db8c54e4cd846bdac747344f2aea2c2fcf507817928796063225223b7e169" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_worker.py", + "sha256": "49a2e4faf99bef146b5a1d4d18d48f240b1e561c438252274494b359db96ef52" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/connector.py", + "sha256": "b6a0dc916d052f344be72ecfcb111509c13580102c11a860fa726cf0888949a9" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/metadata.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/metadata.py", + "sha256": "2b23a07c1ec5ac5490c3b818737c7192e344ea9f52cd5623f75939f741ab4e21" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_scheduler.py", + "sha256": "ac3daf8e2246581fec84ab28f2133569421b62c32a120be4923e2f4d0f2f9de9" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_worker.py", + "sha256": "e5060c9b6cf022de35ca3d1da7a369cd6a6a2dea26219af9f7633aaf78af8a76" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_scheduler.py", + "sha256": "2d9008e33937a4d6c5cf9cc2f96160f2bdbc8e987fe37f0798a7fd7eb84c9572" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_worker.py", + "sha256": "87de3ea383dd3aa95fb2c287ea26ded8a330859cc1295f9faa69047e80865c2c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/scheduler.py", + "sha256": "09f1bfe7075b926b26a94529480e33b62c3ac273ff826f6c502084f08b1b2a08" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/stats.py", + "sha256": "3e710654e0b68d1a8592f0c4735c81b22f4bf698fb1a2dfea126d35bf2dd1ef2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/tp_mapping.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/tp_mapping.py", + "sha256": "2d43607f98701b2fad6cc0ac2767619a80b7fc2b3a3c2eb6ed0da4fb05dcd8f6" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/utils.py", + "sha256": "93de863fc8307a61d40b62f1b176b57ae93c363d34b9e9ddc8e666265b6d45dc" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/worker.py", + "sha256": "5134a36ac100ce7a64f5311029a37ac12c38d91093f63100f51f7fe53ea7c3ee" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/canonical_mapping.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/canonical_mapping.py", + "sha256": "e0b3c6f9806a650e0370c43c5068fc31c0fec94615089e15fdf270d7d96f2b64" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/common.py", + "sha256": "9b3f042c6fa1581d10e8f688d2d9bc927bb41b780a9ea01f514d57228e20c978" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/config.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/config.py", + "sha256": "aea82e60889e78dcad8564ec8285b65a6a372824a1545a98ea8e78b6f4fd418a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/events.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/events.py", + "sha256": "d7039b67be95fd444966628184040a94880873c0611c0e6e7525a22650ffdefb" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/metrics.py", + "sha256": "13d76df014e86691f58dc89a879f9808b124690c9267dd5fa3b2d4004d4c5fdf" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py", + "sha256": "2c5282f4a3165cd787fb355e215e3869f1bdd3f2c795b2155fc537c9d135191a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/worker.py", + "sha256": "acc2df53262441dfc6421a3af7f0cbd68cbfaedbd42bbc384d8e1da2d965d194" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading_connector.py", + "sha256": "cdc16ca7339a10e1993bd6220e6273f86a4e99779f58f25098a24ad31bb0dbd8" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/simple_cpu_offload_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/simple_cpu_offload_connector.py", + "sha256": "96238ca82ccf07a1eeb59b8f66de17b09034e3eb993ad9a0a836511d3f69706b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/ssm_conv_transfer_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/ssm_conv_transfer_utils.py", + "sha256": "59a949709482e65a007fbe5352fe9b4bb54c2dcc10ad2c1c41f754b6e13299f4" + }, + "vllm/distributed/kv_transfer/kv_transfer_state.py": { + "path": "/vllm/distributed/kv_transfer/kv_transfer_state.py", + "sha256": "2e5fe09438d6e2ee642f8a26cf7dcf632e870d955d30baf002b76a8bfe836d05" + }, + "vllm/distributed/nixl_utils.py": { + "path": "/vllm/distributed/nixl_utils.py", + "sha256": "0bffa3c052c9f67472b1c0bc3816114891b010c968bf4b8a292e7da4d687db53" + }, + "vllm/distributed/parallel_state.py": { + "path": "/vllm/distributed/parallel_state.py", + "sha256": "d9b10ad56833ebc08a753e1a050ef0989c30d4134021b7b7b00150b7bd01adc6" + }, + "vllm/distributed/stateless_coordinator.py": { + "path": "/vllm/distributed/stateless_coordinator.py", + "sha256": "f52848fbe985ed47b1f3e3ca555314736ca06436e8d738ab4390101f0672dcb0" + }, + "vllm/distributed/utils.py": { + "path": "/vllm/distributed/utils.py", + "sha256": "792146b357139e705064a68d3b66858de8a0baaca4dc7db1232fa217d45db231" + }, + "vllm/distributed/weight_transfer/__init__.py": { + "path": "/vllm/distributed/weight_transfer/__init__.py", + "sha256": "3fb9d4712b7c131d522f5e76e73cd8c333f3cc7af86e2d5ecf9b61b57b3b7f5a" + }, + "vllm/distributed/weight_transfer/base.py": { + "path": "/vllm/distributed/weight_transfer/base.py", + "sha256": "8ab06feb04f1379d0558fbdb77fde46bc84f179e0a26742cabab937e88caa38d" + }, + "vllm/distributed/weight_transfer/clients.py": { + "path": "/vllm/distributed/weight_transfer/clients.py", + "sha256": "ff85c79c350241e6d2749ca23c9d295a3289b4b62bfdf0257d32eb94a0151d36" + }, + "vllm/distributed/weight_transfer/factory.py": { + "path": "/vllm/distributed/weight_transfer/factory.py", + "sha256": "4e979eeac8c5bcdbffb10eb4765cfb30120fa7595c6c2561d3fa1a966ced61c8" + }, + "vllm/distributed/weight_transfer/ipc_engine.py": { + "path": "/vllm/distributed/weight_transfer/ipc_engine.py", + "sha256": "1af578293f387a19073c322b24143c3ae4716ce0c5d2bac2a4ef26fe20119330" + }, + "vllm/distributed/weight_transfer/nccl_common.py": { + "path": "/vllm/distributed/weight_transfer/nccl_common.py", + "sha256": "7b2ef7dc7481c3f478f17c49aa36c7bed54142ec5c93d36ed8426c8fdf09e500" + }, + "vllm/distributed/weight_transfer/nccl_engine.py": { + "path": "/vllm/distributed/weight_transfer/nccl_engine.py", + "sha256": "7fd020c919dc7b4723fb78e64da977b180d0fef0cd21df955a037b848dbaa008" + }, + "vllm/distributed/weight_transfer/packed_tensor.py": { + "path": "/vllm/distributed/weight_transfer/packed_tensor.py", + "sha256": "d0a27fb0be1dc029bd5a1d44fdb57a5e54aa4cd74308bedc339e86ac02c7494c" + }, + "vllm/distributed/weight_transfer/sharded_rdt_common.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_common.py", + "sha256": "be0b13801f24e7b62999b19d733c030510353603a2d5320d5dc98ee02daf22a2" + }, + "vllm/distributed/weight_transfer/sharded_rdt_engine.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_engine.py", + "sha256": "2f791970b4815511a7578ef6c957e7da97b071d26a39087a09a17475909791ee" + }, + "vllm/distributed/weight_transfer/sharded_rdt_fake.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_fake.py", + "sha256": "ee11164e17b5f2793252ce77741b8b94e0583046abf896a590131b2008d1fbb9" + }, + "vllm/distributed/weight_transfer/sharded_rdt_trainer.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_trainer.py", + "sha256": "dd413ff461d41826ccd3eb87d3df22f6cd7f24e09aac7644e3e5b40d7beec484" + }, + "vllm/distributed/weight_transfer/sparse_nccl_engine.py": { + "path": "/vllm/distributed/weight_transfer/sparse_nccl_engine.py", + "sha256": "e11b409454dda2b05ea34e8115ac19027c5e65cb2a5e9682c494f16a50e978f4" + }, + "vllm/model_executor/determinism/__init__.py": { + "path": "/vllm/model_executor/determinism/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/determinism/batch_invariant.py": { + "path": "/vllm/model_executor/determinism/batch_invariant.py", + "sha256": "af8f8d256a48fc214edf426fbe891fb15bd8b1d7ae98b811c736ff1eb0fae798" + }, + "vllm/model_executor/determinism/batch_invariant_configs.py": { + "path": "/vllm/model_executor/determinism/batch_invariant_configs.py", + "sha256": "72ea0d4df0ab5ae288abb7df5c203d2ad5f1709c7295d87ec72da775fddc1b7a" + }, + "vllm/model_executor/layers/fused_moe/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/__init__.py", + "sha256": "64a32665be6d5afcfbaf7a0915717267278b66b880b908b0263ea58f08e51b5e" + }, + "vllm/model_executor/layers/fused_moe/activation.py": { + "path": "/vllm/model_executor/layers/fused_moe/activation.py", + "sha256": "78dec0e85e0c040304515f64ccf8f2c6a7a2e5b9f1124a2138a97d9a02585541" + }, + "vllm/model_executor/layers/fused_moe/all2all_utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/all2all_utils.py", + "sha256": "dc4750a446f7de31d09a46034da5fdf479bc169af90f47aa9af8ae15e67b0828" + }, + "vllm/model_executor/layers/fused_moe/b12x.py": { + "path": "/vllm/model_executor/layers/fused_moe/b12x.py", + "sha256": "ee76cc6aa801e24be8ec78a9e8502061ad48667d5ff8711e43f68fba912425bd" + }, + "vllm/model_executor/layers/fused_moe/config.py": { + "path": "/vllm/model_executor/layers/fused_moe/config.py", + "sha256": "a3a87cebcc7ac85d73f471dcfafc2d899c6fc08f264777b74a0e919adac9e03f" + }, + "vllm/model_executor/layers/fused_moe/deep_gemm_utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/deep_gemm_utils.py", + "sha256": "8fdcd857eb333f9c68902105f157568d52067c94ba1e2df6dbfe0474ef1f4c02" + }, + "vllm/model_executor/layers/fused_moe/eep_reconfigure.py": { + "path": "/vllm/model_executor/layers/fused_moe/eep_reconfigure.py", + "sha256": "9d7580265e8563e1140c2bb4c3a81a35ddd54903f5ec0a2720ffc064681f02f9" + }, + "vllm/model_executor/layers/fused_moe/expert_map_manager.py": { + "path": "/vllm/model_executor/layers/fused_moe/expert_map_manager.py", + "sha256": "308c00f63fcb6f44518ec3a56d8f902c7bba75928c2e3aea30fbe1f3f473973b" + }, + "vllm/model_executor/layers/fused_moe/experts/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a16_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a16_moe.py", + "sha256": "53deea255175171971422d14082ad139b5ec7b62e21429a4c7cc0ebbefd29cdc" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a8_moe.py", + "sha256": "f3fc51b95ed89862381908a0134e326228827f44854248db9585a9c4899c34f4" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp8_moe.py", + "sha256": "af6db1760961a5a71234f8b1cdf42e9e30a236e13601b0826a75110b79724948" + }, + "vllm/model_executor/layers/fused_moe/experts/batched_deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/batched_deep_gemm_moe.py", + "sha256": "b0cd4ea706583518dc608fb56f832fc3595f24bd863b03ef1e8c22b36b873508" + }, + "vllm/model_executor/layers/fused_moe/experts/cpu_int4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cpu_int4_moe.py", + "sha256": "67170af3ba9dc4c4f71d78a72efc3fa4e366eac614936a79911dae5c75ac1864" + }, + "vllm/model_executor/layers/fused_moe/experts/cpu_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cpu_moe.py", + "sha256": "0754cd4ff1b28e6d3932a67609d335acefd28f95a841f0492923813356a6d81e" + }, + "vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py", + "sha256": "db901bdbcd3fdac23a1d74e39c51e67f14a82be787b2fd704ed1e787372ae868" + }, + "vllm/model_executor/layers/fused_moe/experts/deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/deep_gemm_moe.py", + "sha256": "16911a64a72eafc26a1bcb544a91f90144d85dc41e3ee57cf20e89925227bbb7" + }, + "vllm/model_executor/layers/fused_moe/experts/fallback.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fallback.py", + "sha256": "1bdd0a4f2ebaa40ec96a5aacc07aee61511af59e6324ce456aa65003b6e2991a" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_b12x_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_b12x_moe.py", + "sha256": "e613afe5da2742e42c717c1a0a56bd9e1c7e3e0452a828db0013d81063518954" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_batched_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_batched_moe.py", + "sha256": "295254dfeeec8df3eb8110e6f659a946cb9cded3de1565ecad4d741b3c3f3e00" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_moe.py", + "sha256": "08578bcd0cf72d6a470e40950175e73639efaa6d8d23c6da0869345312b229c9" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutlass_moe.py", + "sha256": "52887cec5fe628e0a4e7793deb546b40f6c29f7362b3b436c10ca36934ab9826" + }, + "vllm/model_executor/layers/fused_moe/experts/fused_batched_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fused_batched_moe.py", + "sha256": "2435587fc7f8fe8ea341ea0eb8f14c11f3f5b31fbbb9b29ce569ad3bace6e6a0" + }, + "vllm/model_executor/layers/fused_moe/experts/fused_humming_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fused_humming_moe.py", + "sha256": "a6830a76ff7f4cd3479b9c8372a30d03e8301604555cbdbcd9ac89a813b7431a" + }, + "vllm/model_executor/layers/fused_moe/experts/gpt_oss_triton_kernels_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/gpt_oss_triton_kernels_moe.py", + "sha256": "1613a7a6b256e8faee6fdcfae84f293492db6229d28ceb3e8a8d6093af480e36" + }, + "vllm/model_executor/layers/fused_moe/experts/int4_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/int4_emulation_moe.py", + "sha256": "f12857caf0671a341687ad3c5f48616b816ed51e1bcbdefa0a7edbecdb81a79d" + }, + "vllm/model_executor/layers/fused_moe/experts/lora_context.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/lora_context.py", + "sha256": "9b41eefaaa57c5dd0dc54217ef95978821b0c52e90ea4db8b0752e08452bd3e5" + }, + "vllm/model_executor/layers/fused_moe/experts/lora_experts_mixin.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/lora_experts_mixin.py", + "sha256": "b2bc55ed6be98b526c6a5698e2d98300650e78555f56b1820e58c04888e2a373" + }, + "vllm/model_executor/layers/fused_moe/experts/marlin_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/marlin_moe.py", + "sha256": "93916b721548e6194dc70cf6cec224b4b1456a0cc0980235e97beba7bf36541d" + }, + "vllm/model_executor/layers/fused_moe/experts/mxfp8_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/mxfp8_emulation_moe.py", + "sha256": "d09c62ad1398c51ff6f515f2a61014ee9e9a9798d0fe9762c47f446efc5edbef" + }, + "vllm/model_executor/layers/fused_moe/experts/mxfp8_native_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/mxfp8_native_moe.py", + "sha256": "01a42cebf18189e566034111b2145573c655319e8af1a56db60d53a319c40613" + }, + "vllm/model_executor/layers/fused_moe/experts/nvfp4_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/nvfp4_emulation_moe.py", + "sha256": "f24467762b60702f0df122ed64786be839a838a9b6cafaecbd04d35fbfedb189" + }, + "vllm/model_executor/layers/fused_moe/experts/ocp_mx_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/ocp_mx_emulation_moe.py", + "sha256": "dcaa60a9ebdb0bd8223b37af41f018ce7f95716ec7cd8526850f4433a579213b" + }, + "vllm/model_executor/layers/fused_moe/experts/rdna3_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/rdna3_moe.py", + "sha256": "e4abd802dc2f0ad9b338ebde397633c761d881c37813e2dc229902c526b597d8" + }, + "vllm/model_executor/layers/fused_moe/experts/rocm_aiter_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/rocm_aiter_moe.py", + "sha256": "bf09a7b783f5752d61cab76221b32b598d8846d801ee39dc9209d636c9659c6f" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_cutlass_moe.py", + "sha256": "ffce5ad627c540940d122d8df7981644b2eb35d07d480995c0f4f30517815fac" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_deep_gemm_moe.py", + "sha256": "c7209fa5e1ccb184a68b37a0706fc571a76696c2ae79802ddc7f889b1c29684d" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_moe.py", + "sha256": "806fbccfe30f5fbd578acf773add99bdf022b12d617958bd6281aef6de369701" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_bf16_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_bf16_moe.py", + "sha256": "76256de96fefece9c41ffb1108487919e24da364cf4412c6c3474498aba59137" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.py", + "sha256": "b54c7ceb45e5d07aa905f42ea44caccf85ca35ba9fb825d4c01947764510f68b" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_lora_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_lora_moe.py", + "sha256": "dd35a9e4242c0dc8d691168813e14bd5543e591f02ee529d0691e07651942c5a" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_mxfp4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_mxfp4_moe.py", + "sha256": "fe780f125a3dc3ba919659e9b85340bd32afcbfe47733a002bfdfb92eadf400c" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_mxint4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_mxint4_moe.py", + "sha256": "2106d67c2951aa690c4656ca58240d09c366cffe8cb4d9fd575df016c377cc30" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_nvfp4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_nvfp4_moe.py", + "sha256": "e938ac9f058f7c90b41c9610513239bec54a95304bfb5ff5f6897ebd54733d7e" + }, + "vllm/model_executor/layers/fused_moe/experts/xpu_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/xpu_moe.py", + "sha256": "2a11bac0cf9274d963315efd6eebdc62978b0b7aa02e8849ff2a562742f0b86d" + }, + "vllm/model_executor/layers/fused_moe/fused_flydsl_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_flydsl_moe.py", + "sha256": "0e74879ee5c72f616ae4064b9dff3b3a0b583b7fc70b8f92f1e8b730ecd5d39b" + }, + "vllm/model_executor/layers/fused_moe/fused_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe.py", + "sha256": "7072eb06237be9d33dcb0ef7101410f886a6363c98cbee70a014c68b70f639cb" + }, + "vllm/model_executor/layers/fused_moe/fused_moe_method_base.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe_method_base.py", + "sha256": "18dcfc469d3252749801bbf943857f58da85de1f2db8fdff5a9f4986a925dc68" + }, + "vllm/model_executor/layers/fused_moe/fused_moe_modular_method.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe_modular_method.py", + "sha256": "321c744eac1fcaffd6b1b2971204c8baa57dfec53e91e5d24140014d72d64f83" + }, + "vllm/model_executor/layers/fused_moe/hpc_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/hpc_moe.py", + "sha256": "2ca9c5d71b6fd91651027905e2b83103a8823845e053e7153e148cb8e0ee666d" + }, + "vllm/model_executor/layers/fused_moe/layer.py": { + "path": "/vllm/model_executor/layers/fused_moe/layer.py", + "sha256": "def0b4e13bcc1e4e21ee10644e647e2eda1acbf0cc01e76d6128abb59ea08224" + }, + "vllm/model_executor/layers/fused_moe/modular_kernel.py": { + "path": "/vllm/model_executor/layers/fused_moe/modular_kernel.py", + "sha256": "8dc4e0dbbf35b3aac8add63ca6f2a7bbfdadaabbd60826e24598b22c7d8e5c22" + }, + "vllm/model_executor/layers/fused_moe/moe_align_block_size.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_align_block_size.py", + "sha256": "c3f7fc2087836f0160a32ab99ceb1d8f6e87c793679da34dd672e225cb7fa31b" + }, + "vllm/model_executor/layers/fused_moe/moe_fused_mul_sum.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_fused_mul_sum.py", + "sha256": "112e72578002c3bff538418dac64b3b56d995994a2fc5e32b18d2cf3b8392a13" + }, + "vllm/model_executor/layers/fused_moe/moe_output.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_output.py", + "sha256": "6ea4cbd78f9efc7f842c5df246f553f08b991c3479b8b04b89902ed08aaf8e8f" + }, + "vllm/model_executor/layers/fused_moe/moe_permute_unpermute.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_permute_unpermute.py", + "sha256": "1adc592c6254d0c877d66be5406afbc822459c18a838f4bbd094a992e7609d06" + }, + "vllm/model_executor/layers/fused_moe/oracle/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/__init__.py", + "sha256": "4dcf941d50d48bb812de0f39e9194bf17a76b8035fe324889c6038f710fdc453" + }, + "vllm/model_executor/layers/fused_moe/oracle/base.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/base.py", + "sha256": "555bbcd18a3744e64eee4e953daabef3bd268a1bd4faf967d4cfd14d6074f685" + }, + "vllm/model_executor/layers/fused_moe/oracle/fp8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/fp8.py", + "sha256": "245bd36c285df1e6f7c51e52dcda31ad247894577a9f8d765613c2c2feae9aee" + }, + "vllm/model_executor/layers/fused_moe/oracle/int8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/int8.py", + "sha256": "c1b67886511bd966b162db5bca8930f04895fb37a969818a4a10f0726c59547f" + }, + "vllm/model_executor/layers/fused_moe/oracle/int_wna16.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/int_wna16.py", + "sha256": "cfffe8b8b290330be9d18ffa07aeecf296484395ff04df3147d99393e48b55c1" + }, + "vllm/model_executor/layers/fused_moe/oracle/mxfp4.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/mxfp4.py", + "sha256": "b7915e6779b5c88e7dcd2d227f003a8e45071d6d86877013067142d4feb64a8c" + }, + "vllm/model_executor/layers/fused_moe/oracle/mxfp8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/mxfp8.py", + "sha256": "9cfdc8102a04bb844dcd7ed88043bba96ec751794bc093da76c69aa8cf88cf48" + }, + "vllm/model_executor/layers/fused_moe/oracle/nvfp4.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/nvfp4.py", + "sha256": "735b4cdeb1258f11fb02320fc0c70cab5edaca468dd60b07b2d369389d2b0313" + }, + "vllm/model_executor/layers/fused_moe/oracle/unquantized.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/unquantized.py", + "sha256": "c8b8203bd0b73bb7f586f703607394d663f14c05711416ad42d45af564382223" + }, + "vllm/model_executor/layers/fused_moe/oracle/w4a8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/w4a8.py", + "sha256": "d7fa6e2982f20b34d5ce9c5ce28a61122762a3fcdd53d249479472a4f2316c6a" + }, + "vllm/model_executor/layers/fused_moe/oracle/w4a8_int8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/w4a8_int8.py", + "sha256": "6d6f9ca2e67b630002873de2f8d8a231d091c5c2f0f3354a9e8209449b481a4c" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/__init__.py", + "sha256": "2800113263a83c2632e522fb22790b29f63384da75d43de32f0ae2f95e8ae4c1" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/batched.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/batched.py", + "sha256": "d52425dd8c08e47cf8d9c3088daf3b1cc721c8667de4c738d04ba997f9a08ccb" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ht.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ht.py", + "sha256": "465cdf1d6cee91b2ee8c2e43abbea6e8408976e3048c10f44c089f34b415bc60" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ll.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ll.py", + "sha256": "f704922b1db680c4c212982a096e09d6b3eb97d89110313f86ed958a00df21b7" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_v2.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_v2.py", + "sha256": "8d690b016bbcfbc9eb599bcc36a6f798b2f1720c828f4347ea742e218c0cc60d" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_one_sided.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_one_sided.py", + "sha256": "acb57d8342af62bb5672036871cd4b27ecc7f37dfa7c894850bb860e6152a1f0" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_two_sided.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_two_sided.py", + "sha256": "cc5b00d6a157b6eca5afaaf7435165dbd1b4524d6d88bf75808cbe074a389f79" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/mori.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/mori.py", + "sha256": "8e9c3b5b1f0de13f467d95bf2f451cba0e4b0d9a1bdcf98da0988a3a9a79a045" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/naive_dp_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/naive_dp_ep.py", + "sha256": "db015e5b18750bbbf5b2bbaceca877dd6f3f3e74c2a94e8dc185f7413b387f91" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/nixl_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/nixl_ep.py", + "sha256": "1f71d70ac509bf5d3d67a8d95a8ee108a50af6bb5d4bde7181ca28e286f6ffce" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/no_dp_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/no_dp_ep.py", + "sha256": "adbbf529cd22059c95b5380952943a70cf11e05e321dcd707f296bebde61a6e7" + }, + "vllm/model_executor/layers/fused_moe/routed_experts.py": { + "path": "/vllm/model_executor/layers/fused_moe/routed_experts.py", + "sha256": "68c48e5df0ea4a7cc1f04436b7b9153eb53802ecd9bb55d38db8738508daac6d" + }, + "vllm/model_executor/layers/fused_moe/routed_experts_capturer.py": { + "path": "/vllm/model_executor/layers/fused_moe/routed_experts_capturer.py", + "sha256": "cd006bc1a1703418cca3b589fafb2abc4268a086fb3db044bbb64348aeac8b13" + }, + "vllm/model_executor/layers/fused_moe/router/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/layers/fused_moe/router/aiter_shared_routed_fused_moe_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/aiter_shared_routed_fused_moe_router.py", + "sha256": "f47046db1275601a2c67c9232afc7b866c9623a19639d5be867e4c7914a35069" + }, + "vllm/model_executor/layers/fused_moe/router/base_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/base_router.py", + "sha256": "47fa2324bcd9b6ebdc138d69ae6b6ecc0f2463d34bda8c5988bdb0a2a76d3fae" + }, + "vllm/model_executor/layers/fused_moe/router/bf16x3_router_gemm_cutedsl.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/bf16x3_router_gemm_cutedsl.py", + "sha256": "d0f1edd1ebc48d88e490bdb3c93db49bdc0a135ff83e7e0b57130e9f8255fc32" + }, + "vllm/model_executor/layers/fused_moe/router/cpu_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/cpu_router.py", + "sha256": "bff36b15818c87bfbb7ee3def7dc7f6396860abbe5893ff6148801fe941a4b92" + }, + "vllm/model_executor/layers/fused_moe/router/custom_routing_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/custom_routing_router.py", + "sha256": "1a40c7054e3c3a1b3ee2e98f6bc9efa9dfdc11f316a8edf7357dd91533487bfe" + }, + "vllm/model_executor/layers/fused_moe/router/dsv4_topk.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/dsv4_topk.py", + "sha256": "14f7c8487b9aef652dd61c91e0e3c3640b643bf9cd0d8a7184157d71f4beb63e" + }, + "vllm/model_executor/layers/fused_moe/router/fused_moe_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_moe_router.py", + "sha256": "0daa0dc05b931d66767feca444a4cd57ecf140f59b40ea0e8ad213eef6da2b36" + }, + "vllm/model_executor/layers/fused_moe/router/fused_topk_bias_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_topk_bias_router.py", + "sha256": "8fdc28cc248180ad4f11bb4bcda3df47926ec12665a0d84bb712fe83fc6b9376" + }, + "vllm/model_executor/layers/fused_moe/router/fused_topk_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_topk_router.py", + "sha256": "1c80f4af4d781fd66b12aa6a7a0fd30082bc521df40f1252987a8ac4c0bef51c" + }, + "vllm/model_executor/layers/fused_moe/router/gate_linear.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/gate_linear.py", + "sha256": "faa43362c2e7c568498a923c682ca18cae75e87f48d00882770821cb19c21198" + }, + "vllm/model_executor/layers/fused_moe/router/grouped_topk_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/grouped_topk_router.py", + "sha256": "048339e1799cdd42c9dae686a6cb891046577fb391b500f0d12eed73c8f61e52" + }, + "vllm/model_executor/layers/fused_moe/router/rocm_fp32_router_gemm.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/rocm_fp32_router_gemm.py", + "sha256": "9c331ef3d0bb2fb6954387d77ac62a99c5c76d2753c7438bfbb5115f68aae5ac" + }, + "vllm/model_executor/layers/fused_moe/router/router_factory.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/router_factory.py", + "sha256": "019bc8adaa7642abab82843efd53cd1a378f62c652521a1de2b781480eb88742" + }, + "vllm/model_executor/layers/fused_moe/router/routing_simulator_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/routing_simulator_router.py", + "sha256": "a7345df5add00cf3bd93024492d6fc1189fd3ecf2754a11cef1b03a295d791f7" + }, + "vllm/model_executor/layers/fused_moe/router/zero_expert_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/zero_expert_router.py", + "sha256": "dea306edd92e2b9c1b43f982ede8e1e10770d2c66220f5a106e0ed0165276e9c" + }, + "vllm/model_executor/layers/fused_moe/runner/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/layers/fused_moe/runner/moe_runner.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/moe_runner.py", + "sha256": "05893188402fe37229bf72d75088d66193c417d5d502daafd3a55e1bfedaa60c" + }, + "vllm/model_executor/layers/fused_moe/runner/moe_runner_interface.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/moe_runner_interface.py", + "sha256": "189cad01611124eb44594713cbf5918d16fc70196dc81a525ae0a7a97a5fcc51" + }, + "vllm/model_executor/layers/fused_moe/runner/shared_experts.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/shared_experts.py", + "sha256": "d89e4c79c46f6fe61262c51f3facf102e71ce1e4eb3db67f72b6bd8470937be9" + }, + "vllm/model_executor/layers/fused_moe/topk_weight_and_reduce.py": { + "path": "/vllm/model_executor/layers/fused_moe/topk_weight_and_reduce.py", + "sha256": "3dfede72d52bf99af40997994704e6c502ee3bab2bd39bfaa8a68d7dae440203" + }, + "vllm/model_executor/layers/fused_moe/unquantized_fused_moe_method.py": { + "path": "/vllm/model_executor/layers/fused_moe/unquantized_fused_moe_method.py", + "sha256": "182a5ec1874ece2091a24c5303f6ab9ea64a9a61adf325b863927f0cdd83e5d3" + }, + "vllm/model_executor/layers/fused_moe/utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/utils.py", + "sha256": "a93a0bded4008db19d8b38370526ae34fafb9c8278e5b4f60acb6acc8fdc1850" + }, + "vllm/model_executor/layers/mamba/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/abstract.py": { + "path": "/vllm/model_executor/layers/mamba/abstract.py", + "sha256": "dfdc8c836894f574e41d93d76ab989cacd3d7ecf59c97a929abfa48d9364e8ad" + }, + "vllm/model_executor/layers/mamba/gdn/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/gdn/base.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/base.py", + "sha256": "7fec748fc74131f5a45bcaf2644b3fa3a0598fd437d7347f8207ea3644a951c5" + }, + "vllm/model_executor/layers/mamba/gdn/kimi_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/kimi_gdn_linear_attn.py", + "sha256": "1cec4da5c9da73557e192bfb36cd540aae51d3e91283b554449c4a97f0f89bd9" + }, + "vllm/model_executor/layers/mamba/gdn/olmo_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/olmo_gdn_linear_attn.py", + "sha256": "60873ca3bb0c4d17c33bd259b62b658db4883cd23138f47dd4ead62cd2ff0605" + }, + "vllm/model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py", + "sha256": "b80f8e6f3fff442fb880aebb3209c52f814f66490009f4ac4003de603576d10a" + }, + "vllm/model_executor/layers/mamba/linear/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/linear/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/linear/bailing_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/linear/bailing_linear_attn.py", + "sha256": "3c480ddd6eba0766ed012a1074bbec5f241d868a87b020b0f6312222c32f93eb" + }, + "vllm/model_executor/layers/mamba/linear/base.py": { + "path": "/vllm/model_executor/layers/mamba/linear/base.py", + "sha256": "26125cd427225954e1846ca361cdaf43f2b56f11b1e217cf26e91a80ef0edb6a" + }, + "vllm/model_executor/layers/mamba/linear/minimax_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/linear/minimax_linear_attn.py", + "sha256": "4adc00f54893b5bc6c31c613deda152a19af3b1bba04153ab5924c3bf2a3aaae" + }, + "vllm/model_executor/layers/mamba/mamba_mixer.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_mixer.py", + "sha256": "a485e937ad9db14d3ad03fde5a9fe795cfa863649563e52fc7e6c52ef631164e" + }, + "vllm/model_executor/layers/mamba/mamba_mixer2.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_mixer2.py", + "sha256": "d58d93e90d9eb90bc5133b79f07c7c62d0032b35d6cf916e3fe34367b81c5cd5" + }, + "vllm/model_executor/layers/mamba/mamba_utils.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_utils.py", + "sha256": "ce9845b4a4ef4bc46577a33038ed69d59ceccb52f30e9c5bdaa36e48be3b2ca4" + }, + "vllm/model_executor/layers/mamba/ops/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/ops/causal_conv1d.py": { + "path": "/vllm/model_executor/layers/mamba/ops/causal_conv1d.py", + "sha256": "044d005cfe59fd0818ed421274e04f3e8dd679b8cdb64fca9f4422f2643484b2" + }, + "vllm/model_executor/layers/mamba/ops/cpu/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/ops/cpu/causal_conv1d.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/causal_conv1d.py", + "sha256": "64104672890ac2ef240c20c7f8059beeade707178574809dbca8721dff5ea6fa" + }, + "vllm/model_executor/layers/mamba/ops/cpu/gdn_attention.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/gdn_attention.py", + "sha256": "a50288945bf5b102ad3025ae536638dcc32d84cf7c22aaf3a85326b0c1c56c1f" + }, + "vllm/model_executor/layers/mamba/ops/cpu/mamba_ssm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/mamba_ssm.py", + "sha256": "5839e576172a3246337f5e4fb1bc19eb583b3e2b2f7e35dd060dc3041eb8372d" + }, + "vllm/model_executor/layers/mamba/ops/gather_initial_states.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gather_initial_states.py", + "sha256": "5198bb6de6d91c583a5f65d926412a76ee04a06fa72aaba76eaf156b27cd0523" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/__init__.py", + "sha256": "b88b52e71fcb21bd3fa215ea171dcd2ad2ff17c97788cfe64caa7ba45c7ecf97" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_h.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_h.py", + "sha256": "f50bbe5c0b6382323ec5dfc24a5e0c7971113d59727515e60c9fe3689734e5ba" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_kkt_inv_uw.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_kkt_inv_uw.py", + "sha256": "b4a65dd194907db08865e0596fe254f915e670a9e6b27ffa2933c1026dde9b1e" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_o.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_o.py", + "sha256": "629f7843a7e611efb9390f2ebb7a4b924b2c328d48a317fddfaa96af4d9bc60a" + }, + "vllm/model_executor/layers/mamba/ops/layernorm_gated.py": { + "path": "/vllm/model_executor/layers/mamba/ops/layernorm_gated.py", + "sha256": "3433f2e3b87c2b2ccf8e9794ce40762c86a6da38a94ecee001f439ea0d0373dd" + }, + "vllm/model_executor/layers/mamba/ops/mamba_ssm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/mamba_ssm.py", + "sha256": "a4515ec7895b40ed878cf380445034b25faa61fbaa799d96c49217bbdfd7e400" + }, + "vllm/model_executor/layers/mamba/ops/replayssm_config.py": { + "path": "/vllm/model_executor/layers/mamba/ops/replayssm_config.py", + "sha256": "5fe9d5d7aa2de6a65875b3796a919b22bc435fd76055ba054bbff43aa005bc44" + }, + "vllm/model_executor/layers/mamba/ops/scatter_states.py": { + "path": "/vllm/model_executor/layers/mamba/ops/scatter_states.py", + "sha256": "f3bb004c73edaba56337747893eb07faf29b270dc8bb9c893ee9b1044e4ead9a" + }, + "vllm/model_executor/layers/mamba/ops/selective_state_update_replayssm_output_only.py": { + "path": "/vllm/model_executor/layers/mamba/ops/selective_state_update_replayssm_output_only.py", + "sha256": "cea7fd3063ca9dcc4e33f180d01ea379195ec515cedc9d0b03b11dc67670d695" + }, + "vllm/model_executor/layers/mamba/ops/ssd_bmm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_bmm.py", + "sha256": "26983d97a7f5c5f9197a16a6bee7b1294839b9ae31a14c14aaee38b43523e630" + }, + "vllm/model_executor/layers/mamba/ops/ssd_chunk_scan.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_chunk_scan.py", + "sha256": "d5ef32e8cb47e2ce71984579df78ab69754895f891766394daf327867cfa4f8f" + }, + "vllm/model_executor/layers/mamba/ops/ssd_chunk_state.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_chunk_state.py", + "sha256": "177e3aa7fe72647133bbd86135533e8688a5802678d4d1564aa549410362316f" + }, + "vllm/model_executor/layers/mamba/ops/ssd_combined.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_combined.py", + "sha256": "1317bbb668d3c60dfe0658850f9968614f03fa5eb61196f8ce6ac17dbb31b480" + }, + "vllm/model_executor/layers/mamba/ops/ssd_state_passing.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_state_passing.py", + "sha256": "36b8c8edba437916a5b789717c61fc22077de01e77892cb96dbff3b00a57410e" + }, + "vllm/model_executor/layers/mamba/ops/ssu_dispatch.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssu_dispatch.py", + "sha256": "bbe0f0e61da87f3ddfead19a79ca376516b63f1ea868be3485333c63fa20ef41" + }, + "vllm/model_executor/layers/mamba/ops/triton_helpers.py": { + "path": "/vllm/model_executor/layers/mamba/ops/triton_helpers.py", + "sha256": "a8795532f22c37a93e82c9d8e3fadcb5f4da98673d7b321fe8481305eaafad30" + }, + "vllm/model_executor/layers/mamba/short_conv.py": { + "path": "/vllm/model_executor/layers/mamba/short_conv.py", + "sha256": "228494efab185ee17374f762874f4c8b9a26aac9decfa8c906ce38446e0de51a" + }, + "vllm/model_executor/models/qwen3_next.py": { + "path": "/vllm/model_executor/models/qwen3_next.py", + "sha256": "4fa5112ac2bf7886d41d9e1f6c3da8793620d1ec49c961b31e9609459a6a7f7a" + }, + "vllm/third_party/flash_linear_attention/__init__.py": { + "path": "/vllm/third_party/flash_linear_attention/__init__.py", + "sha256": "5dbbfa3fc286edb2e970e175ef33cee4f6181c89b0784f5a8986201b2312f54e" + }, + "vllm/third_party/flash_linear_attention/ops/__init__.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/__init__.py", + "sha256": "dd738dc1d08045e76455cdbe16052a5b769e0eb11d6e87ff28353994f880cd6c" + }, + "vllm/third_party/flash_linear_attention/ops/chunk.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk.py", + "sha256": "c105ead259e86aedc248c53e7c4cef07034d0ff12da608d80265d1dd0990803f" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_delta_h.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_delta_h.py", + "sha256": "1b3ad391f939d9443c6b7adb19e57fe381bd5dccea064e8417a4f85b0e713b26" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_o.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_o.py", + "sha256": "3b63b836a8cc561723c23db5a528a0b474d9cd78508d610f0b348c585a889a19" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_scaled_dot_kkt.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_scaled_dot_kkt.py", + "sha256": "7ae41df3755acc7e925a134d848f78bb5fc00b90069039d86403c5853323ea42" + }, + "vllm/third_party/flash_linear_attention/ops/cumsum.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/cumsum.py", + "sha256": "d818215669b451868823202ac0bcea77e7a9d75957254c7c1060a73a55dc39b6" + }, + "vllm/third_party/flash_linear_attention/ops/fused_gdn_prefill_post_conv.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_gdn_prefill_post_conv.py", + "sha256": "590717b2107abc90d72548de06b5d315229eb2775c94614f3f545df11cc2b5df" + }, + "vllm/third_party/flash_linear_attention/ops/fused_norm_gate.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_norm_gate.py", + "sha256": "e6eb90467f29d8a0a04f2a364d20a2c3191b6ab857841bfb82076b33a6022d1a" + }, + "vllm/third_party/flash_linear_attention/ops/fused_recurrent.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_recurrent.py", + "sha256": "fe6f1311014809040497aa0a623e7fa97f4b3457cdc7ee1f1f8aed21f326f755" + }, + "vllm/third_party/flash_linear_attention/ops/fused_sigmoid_gating.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_sigmoid_gating.py", + "sha256": "000ab8996af9788fdb8843a6a3b91833e7a14c8acc0e1ea073a536330f64cb6f" + }, + "vllm/third_party/flash_linear_attention/ops/index.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/index.py", + "sha256": "a4f8b2c052635cb519a80099e8a85411d1d5d6880b38f466788259bbe66b154d" + }, + "vllm/third_party/flash_linear_attention/ops/kda.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/kda.py", + "sha256": "e1f31aaa89b91f8e5db6d070b229e2c81c7206e8caec67de41db97d06be0c476" + }, + "vllm/third_party/flash_linear_attention/ops/l2norm.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/l2norm.py", + "sha256": "520f4513ef4fc97e6b88dc07877cca8e29da0d34e44673fe989e3af002d86381" + }, + "vllm/third_party/flash_linear_attention/ops/layernorm_guard.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/layernorm_guard.py", + "sha256": "42af29be26e8fc94a4658e053c095fcdab9ffdc1bc2446a01e787deda2a298c0" + }, + "vllm/third_party/flash_linear_attention/ops/op.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/op.py", + "sha256": "456da84fd12411cf53c96a90dd4f78f49afb454c3d51d2c524ea8e7106fe8ae5" + }, + "vllm/third_party/flash_linear_attention/ops/solve_tril.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/solve_tril.py", + "sha256": "d1a4ff27623a938825052500afa7e2aa24fadd2fa4c9be6376c9128824f86f82" + }, + "vllm/third_party/flash_linear_attention/ops/utils.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/utils.py", + "sha256": "d6c90d36505e02086954c23ca4dd2fea82a69416d68ff1d0501e16b3148b5b0c" + }, + "vllm/third_party/flash_linear_attention/ops/wy_fast.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/wy_fast.py", + "sha256": "c9fc8259db0a8746dc04f1d799cb73333457118cf89a0bdce8dde8a80a28cd96" + }, + "vllm/v1/attention/__init__.py": { + "path": "/vllm/v1/attention/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backend.py": { + "path": "/vllm/v1/attention/backend.py", + "sha256": "01ac364372afa75fdb22486aa3a9c7cf9aebb742e3471dfb9e0f9d9d36b734bc" + }, + "vllm/v1/attention/backends/__init__.py": { + "path": "/vllm/v1/attention/backends/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backends/b12x.py": { + "path": "/vllm/v1/attention/backends/b12x.py", + "sha256": "443f0a98738fdfefe5b9ab151d278bfd43a8ac807eb2b0b9b2a13d51922afbf9" + }, + "vllm/v1/attention/backends/composite.py": { + "path": "/vllm/v1/attention/backends/composite.py", + "sha256": "4cf3d66dca891562709eed4f50aa14b0ae6c8240d9ea86504a3304b2f356cce0" + }, + "vllm/v1/attention/backends/cpu_attn.py": { + "path": "/vllm/v1/attention/backends/cpu_attn.py", + "sha256": "76fb02a6bd725125565d84bf04f627cf16da5f7ff8f31f87c01ed6a1439398c7" + }, + "vllm/v1/attention/backends/fa_utils.py": { + "path": "/vllm/v1/attention/backends/fa_utils.py", + "sha256": "08fa6e231d3af3a71a6e59162dd12328aa8beb28548165ae58f130a92adb5a83" + }, + "vllm/v1/attention/backends/flash_attn.py": { + "path": "/vllm/v1/attention/backends/flash_attn.py", + "sha256": "b170a4789e18104c1bee35bea70df51abe6766693d8f4726a59f2e6f5c4282aa" + }, + "vllm/v1/attention/backends/flash_attn_diffkv.py": { + "path": "/vllm/v1/attention/backends/flash_attn_diffkv.py", + "sha256": "e4627c88c3ba8caee260540e994cc8137fd2ff7cd7813356b36387c6c88ce30a" + }, + "vllm/v1/attention/backends/flashinfer.py": { + "path": "/vllm/v1/attention/backends/flashinfer.py", + "sha256": "8ee541fde43ed92a417b3f01ea1e6fc64af8ab2eb54cbfc28308a49aaca4ed7f" + }, + "vllm/v1/attention/backends/flex_attention.py": { + "path": "/vllm/v1/attention/backends/flex_attention.py", + "sha256": "ad07f0ad73aeeadc3534b3a05c14f88a62cb3638874239ae9823c49b36276dc3" + }, + "vllm/v1/attention/backends/gdn_attn.py": { + "path": "/vllm/v1/attention/backends/gdn_attn.py", + "sha256": "3831019404a92200a38b43571c040cffeb6638bbdc71e4cb5e680dbc6c93d054" + }, + "vllm/v1/attention/backends/hpc_attn.py": { + "path": "/vllm/v1/attention/backends/hpc_attn.py", + "sha256": "af9e2aec1b498f0ee48a2dce3cf5646edf1976466980b2fd927c0e82b875427c" + }, + "vllm/v1/attention/backends/linear_attn.py": { + "path": "/vllm/v1/attention/backends/linear_attn.py", + "sha256": "bc42144fcd027434c6a10dc9f4c5f991db8899d387af5f6485402ce097eb0513" + }, + "vllm/v1/attention/backends/mamba1_attn.py": { + "path": "/vllm/v1/attention/backends/mamba1_attn.py", + "sha256": "32159dae11cab3c8c576b9514ad97d5108c8d1b4cac9fcfe345ec6a76223aee7" + }, + "vllm/v1/attention/backends/mamba2_attn.py": { + "path": "/vllm/v1/attention/backends/mamba2_attn.py", + "sha256": "a5bcdecb7b9547137023e1c77a386003358fa940eaf5f319ed142211dcdba139" + }, + "vllm/v1/attention/backends/mamba_attn.py": { + "path": "/vllm/v1/attention/backends/mamba_attn.py", + "sha256": "5e7b2c4058fc5e6096d001bff6c789b78368b025bbe4600f191aaca2ff59b59f" + }, + "vllm/v1/attention/backends/mla/__init__.py": { + "path": "/vllm/v1/attention/backends/mla/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backends/mla/aiter_triton_mla.py": { + "path": "/vllm/v1/attention/backends/mla/aiter_triton_mla.py", + "sha256": "ed0e285cdae06a019150c41cc958b3c0b5ceb0e4f299d5318d1c90e2c2395390" + }, + "vllm/v1/attention/backends/mla/amx_mla.py": { + "path": "/vllm/v1/attention/backends/mla/amx_mla.py", + "sha256": "7f5cddec30b2dfe22ccdbd3b9da673c879719bf6da4074317bd60add55f5d15f" + }, + "vllm/v1/attention/backends/mla/compressor_utils.py": { + "path": "/vllm/v1/attention/backends/mla/compressor_utils.py", + "sha256": "3589e94105368ea285c40b82db1a0332682ff5d071fe363627cf4c0d10f3facf" + }, + "vllm/v1/attention/backends/mla/cpu_mla.py": { + "path": "/vllm/v1/attention/backends/mla/cpu_mla.py", + "sha256": "ff2110b9f78e92adf6bab294465cbc294ae1ff71cb1780fed158179e134a4ca6" + }, + "vllm/v1/attention/backends/mla/cutlass_mla.py": { + "path": "/vllm/v1/attention/backends/mla/cutlass_mla.py", + "sha256": "211d298680f9bd793cc468281b316d6633c5f4eb6dcec71d3329b034a23ab9b5" + }, + "vllm/v1/attention/backends/mla/flashattn_mla.py": { + "path": "/vllm/v1/attention/backends/mla/flashattn_mla.py", + "sha256": "ac89e0ad75a37e92566d264bafe324735a80f9ab4709241a4454d17b3d38bb63" + }, + "vllm/v1/attention/backends/mla/flashattn_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashattn_mla_sparse.py", + "sha256": "67dd3ead2e8b9d8cda0825ecc93779cb7d670628bc741c759a7d3cd5d474030f" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla.py", + "sha256": "0c24ff016fb6b0bb41d9e7484b6f1af42f37bcc384ed613473fc3e01ad25f664" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse.py", + "sha256": "2116d965b2067134d8afa5878d4d16c0149b061258f50c4106d993aa13b073cc" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm120.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm120.py", + "sha256": "102ca08793d567f95598eefeb34c3f6ec50b3b9d704f162d1402b97b12b5777b" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm90.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm90.py", + "sha256": "df9fe4970aa3f53cf24784b8534b89e0101a2ca20a35a2ebbc9a12a4463d5993" + }, + "vllm/v1/attention/backends/mla/flashmla.py": { + "path": "/vllm/v1/attention/backends/mla/flashmla.py", + "sha256": "c9d8046a853ecbdeff9ebfc738f5bb34c4f272b278231a09a0fbf73708c7c188" + }, + "vllm/v1/attention/backends/mla/flashmla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashmla_sparse.py", + "sha256": "7a379c717adb9667ce94cbc16c0e3a1fb22a169713db6d7941c141fa84077b3f" + }, + "vllm/v1/attention/backends/mla/index_group.py": { + "path": "/vllm/v1/attention/backends/mla/index_group.py", + "sha256": "c24e028c3c160a9bb92e043da5b5b34c805e84745b7c4b8da6fb8702a0ddd641" + }, + "vllm/v1/attention/backends/mla/indexer.py": { + "path": "/vllm/v1/attention/backends/mla/indexer.py", + "sha256": "2acbc1c4fa57c3424ad95e6ecbe76eb7141747773c3e867ce704f4adccba892a" + }, + "vllm/v1/attention/backends/mla/prefill/__init__.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/__init__.py", + "sha256": "903630eb705dd175bf4ae4558a4bcaa07c110056b6a11eb830fdd2fb21b3c48a" + }, + "vllm/v1/attention/backends/mla/prefill/aiter_flash_attn.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/aiter_flash_attn.py", + "sha256": "571b8a9910c4ea3fefda60659026f3bf0d7b542c34553c8c9a4d43bb82077e61" + }, + "vllm/v1/attention/backends/mla/prefill/base.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/base.py", + "sha256": "138bf3ddaf5a94c3cdbc4e08ac676edcae84b32fc76625e546f3b47f7d8b82ec" + }, + "vllm/v1/attention/backends/mla/prefill/cpu_sdpa.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/cpu_sdpa.py", + "sha256": "1bb686395274a8ec0d9fd7327410a527655fe060cbbc263eab138fea988d96de" + }, + "vllm/v1/attention/backends/mla/prefill/flash_attn.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/flash_attn.py", + "sha256": "5e648c82c82e5f81fe11458eb82b9f90b50fc06df2ade3bf111ee6b7a2ee8481" + }, + "vllm/v1/attention/backends/mla/prefill/flashinfer.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/flashinfer.py", + "sha256": "63861219c35b8abc0ebe01e1f51543c5ed40bd46119ca261d927da7c6826b49b" + }, + "vllm/v1/attention/backends/mla/prefill/registry.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/registry.py", + "sha256": "c8c30b92213d594beaa3cab4d5003da26a85870dbb11d1ab73191962d0645b53" + }, + "vllm/v1/attention/backends/mla/prefill/selector.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/selector.py", + "sha256": "101d9fca7924b0c5d7891a17fe8942611bd6759e32b03a571dc87b14c1430f2f" + }, + "vllm/v1/attention/backends/mla/prefill/tokenspeed_mla.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/tokenspeed_mla.py", + "sha256": "047cf07bfcc83db3b11a6a54ffe189f6146e6ec9ad33ce2fa7d18860bf4210f0" + }, + "vllm/v1/attention/backends/mla/prefill/trtllm_ragged.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/trtllm_ragged.py", + "sha256": "9e13ea6f6a25accedd918c0de64bbb812ccb20ffb95350ab018a6e76d493789b" + }, + "vllm/v1/attention/backends/mla/rocm_aiter_mla.py": { + "path": "/vllm/v1/attention/backends/mla/rocm_aiter_mla.py", + "sha256": "b489f5830c655bfb6299801a70d69b9821513c69568ecab3689db5a7be867be5" + }, + "vllm/v1/attention/backends/mla/rocm_aiter_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/rocm_aiter_mla_sparse.py", + "sha256": "91b1d9b3d860a9720bc01b8ebe9bbe8649a7d6bca20d4b63939bc100309bca19" + }, + "vllm/v1/attention/backends/mla/sparse_swa.py": { + "path": "/vllm/v1/attention/backends/mla/sparse_swa.py", + "sha256": "a47853ad8a3fe40f24704592581ea323a18041b84610df010a5534da634e311e" + }, + "vllm/v1/attention/backends/mla/sparse_utils.py": { + "path": "/vllm/v1/attention/backends/mla/sparse_utils.py", + "sha256": "c3cdf060288c05542243a9fe8b5ad3a963ad75e9ce399009b5e45c1235a88ce4" + }, + "vllm/v1/attention/backends/mla/tokenspeed_mla.py": { + "path": "/vllm/v1/attention/backends/mla/tokenspeed_mla.py", + "sha256": "b9ba523c606430cecb99a88b28c53d98a99dcf5e76105a80664338110a20f1ad" + }, + "vllm/v1/attention/backends/mla/triton_mla.py": { + "path": "/vllm/v1/attention/backends/mla/triton_mla.py", + "sha256": "21b16b3b34470edcc33d0423e560837c1d37d4bab31c7b3b9cfd7faa47864b51" + }, + "vllm/v1/attention/backends/mla/xpu_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/xpu_mla_sparse.py", + "sha256": "559c6240fe466521a6b2df4c94aea02ddf3f5efa5ba6954fa180c5a51c0f12d2" + }, + "vllm/v1/attention/backends/recoverssm_metadata.py": { + "path": "/vllm/v1/attention/backends/recoverssm_metadata.py", + "sha256": "02896a667db0f0308371ceb50048b18e5866c0235d163c0357e9a05dcedb3394" + }, + "vllm/v1/attention/backends/registry.py": { + "path": "/vllm/v1/attention/backends/registry.py", + "sha256": "378e8ee78734bd8c8adbe287d4c0a4058dcbb553195a09fbcce00a3cc30adc29" + }, + "vllm/v1/attention/backends/rocm_aiter_fa.py": { + "path": "/vllm/v1/attention/backends/rocm_aiter_fa.py", + "sha256": "d1418af03bf58209c850f466b712d3ea22a14ebb758c42dd43e65738281841fd" + }, + "vllm/v1/attention/backends/rocm_aiter_unified_attn.py": { + "path": "/vllm/v1/attention/backends/rocm_aiter_unified_attn.py", + "sha256": "59d2645eb4c91dc0567754a7163d066f4f2faf48f1957b254fcdd5604e9d8c8c" + }, + "vllm/v1/attention/backends/rocm_attn.py": { + "path": "/vllm/v1/attention/backends/rocm_attn.py", + "sha256": "4a8f57067073fbceb784af6c3467487c450d00fa3957928fadb99a79f6036292" + }, + "vllm/v1/attention/backends/short_conv_attn.py": { + "path": "/vllm/v1/attention/backends/short_conv_attn.py", + "sha256": "84fc460ef2fbd09743b069bec0c14b39542af6c2254a403e37a048427e151121" + }, + "vllm/v1/attention/backends/triton_attn.py": { + "path": "/vllm/v1/attention/backends/triton_attn.py", + "sha256": "1057663d110e1d5229495a799027b27277c1eca325d5b6780fa2259afbf58a1a" + }, + "vllm/v1/attention/backends/triton_attn_diffkv.py": { + "path": "/vllm/v1/attention/backends/triton_attn_diffkv.py", + "sha256": "de0357eae005246642140f1ab8842ba5ed8bff5c84b18a6d3a7bbf409c578301" + }, + "vllm/v1/attention/backends/triton_flash_attn.py": { + "path": "/vllm/v1/attention/backends/triton_flash_attn.py", + "sha256": "176e45329aeb28a2008362bb607d1b8c89816eb665859ab908b0385a11acf1c2" + }, + "vllm/v1/attention/backends/triton_flashinfer.py": { + "path": "/vllm/v1/attention/backends/triton_flashinfer.py", + "sha256": "48d5f967e388d4e8d6bbec8d827b44d855346bc2fada28adf65768bf6623527b" + }, + "vllm/v1/attention/backends/turboquant_attn.py": { + "path": "/vllm/v1/attention/backends/turboquant_attn.py", + "sha256": "616d16d608d9d1fbf6c29548037e7e9cf330f4d36a01aa3ffabf42a731eb6e2b" + }, + "vllm/v1/attention/backends/utils.py": { + "path": "/vllm/v1/attention/backends/utils.py", + "sha256": "fbc221360d2d54cb21ef3f625dc8711500de345a355801548b4337bb9b8abee0" + }, + "vllm/v1/attention/ops/__init__.py": { + "path": "/vllm/v1/attention/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/ops/chunked_prefill_paged_decode.py": { + "path": "/vllm/v1/attention/ops/chunked_prefill_paged_decode.py", + "sha256": "973db848a790b2e8d99e728b2fc4f44b501bbe58c62747244ddff04cfcf11a85" + }, + "vllm/v1/attention/ops/common.py": { + "path": "/vllm/v1/attention/ops/common.py", + "sha256": "b4b67e7fc0cce471e337d742c097fba06da7563816e8799e27719714e31e1d5b" + }, + "vllm/v1/attention/ops/cp_common.py": { + "path": "/vllm/v1/attention/ops/cp_common.py", + "sha256": "2369181862e96db64b14ef20c5c2e249ed2ea5f3dea2467a2aa388372bb86d9d" + }, + "vllm/v1/attention/ops/dcp.py": { + "path": "/vllm/v1/attention/ops/dcp.py", + "sha256": "a478bdc781460f0582cfaf74d6431f1a826c201f02f39d882d12a96139bc3f28" + }, + "vllm/v1/attention/ops/flashmla.py": { + "path": "/vllm/v1/attention/ops/flashmla.py", + "sha256": "8a40d6e120e3ab25a95fcfeb32b0b5b4c1ea02b984633866628536dcd26ed2e8" + }, + "vllm/v1/attention/ops/flydsl_kernels/__init__.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/attention/ops/flydsl_kernels/tq_decode.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/tq_decode.py", + "sha256": "cc4b7f82897596e0974b3d3a710a1a8bc58c3d22b72cc7f461dd1c4acd2e451b" + }, + "vllm/v1/attention/ops/flydsl_kernels/tq_decode_gqa6.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/tq_decode_gqa6.py", + "sha256": "a983f6d375c325900955e11696dab1e2665770e83f84d51f93d3ed5e1d8880e0" + }, + "vllm/v1/attention/ops/flydsl_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/flydsl_turboquant_decode.py", + "sha256": "7b1dd0ef7c7fb28a6a8831759e00b939ab844d067657155cc11cf75532a22c63" + }, + "vllm/v1/attention/ops/int4_per_token_head.py": { + "path": "/vllm/v1/attention/ops/int4_per_token_head.py", + "sha256": "d91968f280cd8eaed7570ab255f0276b40e833e18a25066d371d9ca8149425f2" + }, + "vllm/v1/attention/ops/merge_attn_states.py": { + "path": "/vllm/v1/attention/ops/merge_attn_states.py", + "sha256": "ad08403d2843fc892f0b0b4b9f5fabb81884556f89f7170dca46ccef498a3539" + }, + "vllm/v1/attention/ops/metadata.py": { + "path": "/vllm/v1/attention/ops/metadata.py", + "sha256": "ca882b84c5aaefb1f77e4d8ea09a00103fbc53defa8671bba036c961c17fc760" + }, + "vllm/v1/attention/ops/paged_attn.py": { + "path": "/vllm/v1/attention/ops/paged_attn.py", + "sha256": "016a95f892ec751c86b37be1e12171bad9f0b4076bbf2219ff336f4e9c503653" + }, + "vllm/v1/attention/ops/pcp.py": { + "path": "/vllm/v1/attention/ops/pcp.py", + "sha256": "dadeff95fe2df2be8028baabeef01b0d2d628cd67de2176915e737ce096de3dd" + }, + "vllm/v1/attention/ops/prefix_prefill.py": { + "path": "/vllm/v1/attention/ops/prefix_prefill.py", + "sha256": "b08ad92db715fc03c11699de3de463d55e411f42f77548e06b41049a61de692f" + }, + "vllm/v1/attention/ops/rocm_aiter_mla_merge.py": { + "path": "/vllm/v1/attention/ops/rocm_aiter_mla_merge.py", + "sha256": "564c66e4877732e48a6f7d52405c43dc952eec0f0ae4353d34886bca056132b9" + }, + "vllm/v1/attention/ops/rocm_aiter_mla_sparse.py": { + "path": "/vllm/v1/attention/ops/rocm_aiter_mla_sparse.py", + "sha256": "feec664be5045fd1ba13b8f6ef83b52c96910ddc78baca0431bcf610c9e8f5cc" + }, + "vllm/v1/attention/ops/triton_attention_helpers.py": { + "path": "/vllm/v1/attention/ops/triton_attention_helpers.py", + "sha256": "35aa993d01345f535d2641cf9dcabb8b64c51b20a19707bc5987e616aaa87ddd" + }, + "vllm/v1/attention/ops/triton_decode_attention.py": { + "path": "/vllm/v1/attention/ops/triton_decode_attention.py", + "sha256": "b9823c65eba22d76abf64dad7d7d16a950f67471c86d6cb5b3e983aaf14381ac" + }, + "vllm/v1/attention/ops/triton_merge_attn_states.py": { + "path": "/vllm/v1/attention/ops/triton_merge_attn_states.py", + "sha256": "f63229162181ab93198550b73a115f1cc1034cfd60e6f58bc8ab3e22a6e8ce60" + }, + "vllm/v1/attention/ops/triton_prefill_attention.py": { + "path": "/vllm/v1/attention/ops/triton_prefill_attention.py", + "sha256": "352c1a4ac86146580040579fb217c2e288268830d6602b735713e154f36d74fe" + }, + "vllm/v1/attention/ops/triton_reshape_and_cache_flash.py": { + "path": "/vllm/v1/attention/ops/triton_reshape_and_cache_flash.py", + "sha256": "6cac51475b8c656992a21b2d150acd3a16a95a7ab7d49aab151a3ef13c24b80d" + }, + "vllm/v1/attention/ops/triton_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/triton_turboquant_decode.py", + "sha256": "8e52678136449e4bbca2195fbcbb87426c955a2b1b8422e7ab9511e45ee5f5c6" + }, + "vllm/v1/attention/ops/triton_turboquant_store.py": { + "path": "/vllm/v1/attention/ops/triton_turboquant_store.py", + "sha256": "6e6e2fe74a307d40f0be786ccbaea76d989e3c7b5985f3144a5218c61bf6d902" + }, + "vllm/v1/attention/ops/triton_unified_attention.py": { + "path": "/vllm/v1/attention/ops/triton_unified_attention.py", + "sha256": "65d0fbcf33d00789df8ca688c0a1c908e710cfaef53471178747ecae11f05829" + }, + "vllm/v1/attention/ops/triton_unified_attention_diffkv.py": { + "path": "/vllm/v1/attention/ops/triton_unified_attention_diffkv.py", + "sha256": "7fa36d7b7441f1c396e0348eac61d691d2e459e5c4c393c4aa262dfb670e68f7" + }, + "vllm/v1/attention/ops/turboquant_soa/__init__.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/__init__.py", + "sha256": "6b43b6fcb2a71c44ceff4ed1edd417a839f4901251ba15831b09ad979baa4984" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode.py", + "sha256": "bf00634191bba14cbf4a23c1d67dc3dcb244c2b8989f08362757b54435830986" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode_v2.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode_v2.py", + "sha256": "28e7ecc15c450d3591983a50c46a03aa6ca6fa99304c17c333940617d9916485" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_store.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_store.py", + "sha256": "dccf93b9fdd34f9b9eacd468e9de35b9d93378594487c335cf50642aaec681f2" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_unified_attention.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_unified_attention.py", + "sha256": "b4b2b5f3985b3a6126fd052e6ec1ed91c610da8a525a9ae7470ac829405bd85c" + }, + "vllm/v1/attention/ops/vit_attn_wrappers.py": { + "path": "/vllm/v1/attention/ops/vit_attn_wrappers.py", + "sha256": "a99d57b58269c7521fa5d7d47af06551f3bab2b5c7358ef78165a7f6e20a92a6" + }, + "vllm/v1/attention/ops/xpu_mla_sparse.py": { + "path": "/vllm/v1/attention/ops/xpu_mla_sparse.py", + "sha256": "d98d17110577c2b7b4d05e07bfdae15faf83321b6342a5daaaecce45b9503f38" + }, + "vllm/v1/attention/selector.py": { + "path": "/vllm/v1/attention/selector.py", + "sha256": "87f653ded7974875183c920e3e4589c28116bcbc99714d1da7cb51ae77c0b182" + }, + "vllm/v1/core/sched/__init__.py": { + "path": "/vllm/v1/core/sched/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/core/sched/async_scheduler.py": { + "path": "/vllm/v1/core/sched/async_scheduler.py", + "sha256": "e586a0ef3c6778be56a93e7f9bb712d4de9de6e7d7fe7e3e1d51dae83ecfc508" + }, + "vllm/v1/core/sched/interface.py": { + "path": "/vllm/v1/core/sched/interface.py", + "sha256": "be6c008664096c5660a8879de72b315bbe479bf1d688be9b25891063ec53a367" + }, + "vllm/v1/core/sched/output.py": { + "path": "/vllm/v1/core/sched/output.py", + "sha256": "3a66c8efaefe10c572f6f33cf1f8aa4610758c945130cad62eb9f7331005677c" + }, + "vllm/v1/core/sched/request_queue.py": { + "path": "/vllm/v1/core/sched/request_queue.py", + "sha256": "4b8d938e5fb8152fe61030b8aa991f983fcac9a405c37ed8908045e05e82ae5e" + }, + "vllm/v1/core/sched/scheduler.py": { + "path": "/vllm/v1/core/sched/scheduler.py", + "sha256": "c1db45f3bbad3a875dd8638331b8870c4380ac1ab4734265ba5c863833a82884" + }, + "vllm/v1/core/sched/utils.py": { + "path": "/vllm/v1/core/sched/utils.py", + "sha256": "1ed988044eb8028c77ede875bd1a5fd05ff6998b455d61e3997d6a3d7fc1c3a7" + }, + "vllm/v1/sample/__init__.py": { + "path": "/vllm/v1/sample/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/sample/logits_processor/__init__.py": { + "path": "/vllm/v1/sample/logits_processor/__init__.py", + "sha256": "1f9b02dae8cf6d44484638037123d3a2dec6b7b9a2bcc9afceef1a9bf3eaedec" + }, + "vllm/v1/sample/logits_processor/builtin.py": { + "path": "/vllm/v1/sample/logits_processor/builtin.py", + "sha256": "6105816ece77e5b1dbee0d07abc90ce039d650bac2ddb85c93280c48b00f2ebe" + }, + "vllm/v1/sample/logits_processor/interface.py": { + "path": "/vllm/v1/sample/logits_processor/interface.py", + "sha256": "171dfc6ef9b5b53128e8eaecc4bdf1de413a706d64bf5be686048f583c66eee1" + }, + "vllm/v1/sample/logits_processor/state.py": { + "path": "/vllm/v1/sample/logits_processor/state.py", + "sha256": "a96411f14362c45f839e181dcb3ac01d5b880812bccb3552fc17863b219f44ac" + }, + "vllm/v1/sample/metadata.py": { + "path": "/vllm/v1/sample/metadata.py", + "sha256": "6582cfe1a240c7ddb975f0ef6dd7dcd28dcf0fc7670394390250013977aa7ffd" + }, + "vllm/v1/sample/ops/__init__.py": { + "path": "/vllm/v1/sample/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/sample/ops/bad_words.py": { + "path": "/vllm/v1/sample/ops/bad_words.py", + "sha256": "0b1d0a9b13b92ddcae2c83393c07a34c0f107813725700dee794caa7fe7f3b12" + }, + "vllm/v1/sample/ops/logprobs.py": { + "path": "/vllm/v1/sample/ops/logprobs.py", + "sha256": "b286f69012a6758bfe9250038b0697294dbffe0d32c6906f284c39f75ee48be3" + }, + "vllm/v1/sample/ops/penalties.py": { + "path": "/vllm/v1/sample/ops/penalties.py", + "sha256": "4debfcf247b3887478d2b9ec98f108756bbed2805462777ef6b56f3bdf4ce682" + }, + "vllm/v1/sample/ops/topk_topp_sampler.py": { + "path": "/vllm/v1/sample/ops/topk_topp_sampler.py", + "sha256": "13ea4359832bc914492330958ec4f5ac140f408b8f410cc05c6eaf7ddcd70be4" + }, + "vllm/v1/sample/ops/topk_topp_triton.py": { + "path": "/vllm/v1/sample/ops/topk_topp_triton.py", + "sha256": "0b5fc337058e22bc28a8530ccec904d6ccd89b9548b02955c657ac429b1669d2" + }, + "vllm/v1/sample/rejection_sampler.py": { + "path": "/vllm/v1/sample/rejection_sampler.py", + "sha256": "0bb9d224887ccb1355e16199005cc23a4afc6fa75156eca419851b7247d99750" + }, + "vllm/v1/sample/sampler.py": { + "path": "/vllm/v1/sample/sampler.py", + "sha256": "f95805b2c6d06218c724826aa5f881a606e8d0a534a566aee7c85948520dd216" + }, + "vllm/v1/sample/thinking_budget_state.py": { + "path": "/vllm/v1/sample/thinking_budget_state.py", + "sha256": "962f8f55210eb0a431cb9c78b013e35f7a7dd58d06d6fb2e7fcff1b457356f8e" + }, + "vllm/v1/worker/__init__.py": { + "path": "/vllm/v1/worker/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/block_table.py": { + "path": "/vllm/v1/worker/block_table.py", + "sha256": "a09b8819e1417b7a186cf3472224e2138fc5d41a291c6692bb7df711b0c44259" + }, + "vllm/v1/worker/cp_utils.py": { + "path": "/vllm/v1/worker/cp_utils.py", + "sha256": "e32625d83a641b8dd8df82e92d1b6fb20af0cdf2e8fbd2fb131aa3c215415448" + }, + "vllm/v1/worker/cpu/__init__.py": { + "path": "/vllm/v1/worker/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/cpu/buffer_utils.py": { + "path": "/vllm/v1/worker/cpu/buffer_utils.py", + "sha256": "e7313fd8c2c76ebfb98d2fa53008bc9691d0f83a7d7c05e87602b5a29fb79e04" + }, + "vllm/v1/worker/cpu/model_runner.py": { + "path": "/vllm/v1/worker/cpu/model_runner.py", + "sha256": "24a1c916550051327dd5893243a6d4200f3824b91b3af8aa6f6c793fd7c68c3e" + }, + "vllm/v1/worker/cpu/shm.py": { + "path": "/vllm/v1/worker/cpu/shm.py", + "sha256": "08491af8ad341399d1375f2d21ad00414d4c89b0a5c03f55de8704914bbfcbd9" + }, + "vllm/v1/worker/cpu_model_runner.py": { + "path": "/vllm/v1/worker/cpu_model_runner.py", + "sha256": "92111aba92f00571f1a3c4c6e43cf1da6ccb4d2afac2f4d5abc018a4a6e7e8bd" + }, + "vllm/v1/worker/cpu_worker.py": { + "path": "/vllm/v1/worker/cpu_worker.py", + "sha256": "a8051b9e510ef0af9cc34004f2cbe5c0f902bd0cebc32c9464e744344dfdf849" + }, + "vllm/v1/worker/dp_utils.py": { + "path": "/vllm/v1/worker/dp_utils.py", + "sha256": "8cd19f1bfbc5c4f6ec60df89aea7c8a19b400ebc264f372b103014152e92158c" + }, + "vllm/v1/worker/ec_connector_model_runner_mixin.py": { + "path": "/vllm/v1/worker/ec_connector_model_runner_mixin.py", + "sha256": "fe9b11cebb8562f1bfe98b98a5647b2b081a6e424cb60d4ffe2412c91a99215e" + }, + "vllm/v1/worker/encoder_cudagraph.py": { + "path": "/vllm/v1/worker/encoder_cudagraph.py", + "sha256": "6a08d3779bca1b47dbf9daf6eafe2d3c70dbcb8aeb7d63ba7efacc68241ee3bc" + }, + "vllm/v1/worker/encoder_cudagraph_defs.py": { + "path": "/vllm/v1/worker/encoder_cudagraph_defs.py", + "sha256": "bb7be050fcaa8868e7816c84caec875da57050d65fe7eaf00f3d41473df25e3a" + }, + "vllm/v1/worker/gpu/__init__.py": { + "path": "/vllm/v1/worker/gpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/async_utils.py": { + "path": "/vllm/v1/worker/gpu/async_utils.py", + "sha256": "77e17a4570ead2be30ae9b00888cf077a3b873018c12ca0549b853bfda02c1ba" + }, + "vllm/v1/worker/gpu/attn_utils.py": { + "path": "/vllm/v1/worker/gpu/attn_utils.py", + "sha256": "b9b81e59dda2720b1f9c434471381f879228832443e52756e469b4ad4905888f" + }, + "vllm/v1/worker/gpu/block_table.py": { + "path": "/vllm/v1/worker/gpu/block_table.py", + "sha256": "61c004315d5af7e7eae4e2a9e6be92ea82c520327690a7f55a73bb9ce95f520a" + }, + "vllm/v1/worker/gpu/buffer_utils.py": { + "path": "/vllm/v1/worker/gpu/buffer_utils.py", + "sha256": "6597f701a30261bf250e9ad5a29737264624a1caa20527aeea0dad630325b093" + }, + "vllm/v1/worker/gpu/cp_utils.py": { + "path": "/vllm/v1/worker/gpu/cp_utils.py", + "sha256": "456c1bb7e262d99ff555522a4f134e5a9b42aee23290be25455eaef36ee8eaaf" + }, + "vllm/v1/worker/gpu/cudagraph_utils.py": { + "path": "/vllm/v1/worker/gpu/cudagraph_utils.py", + "sha256": "6e9c042890603535e300a40df8ee159dbed1058a64a83ae50ff0329e332e05ff" + }, + "vllm/v1/worker/gpu/dp_utils.py": { + "path": "/vllm/v1/worker/gpu/dp_utils.py", + "sha256": "e26867bc89e6bfc933cabc5ed13e5dc7b8d2d3030118ca1ca64c8785dabc0fc1" + }, + "vllm/v1/worker/gpu/ec_connector.py": { + "path": "/vllm/v1/worker/gpu/ec_connector.py", + "sha256": "2afe6e641f4ae3eb3b8da336c74eaa7479bf617b27cfb39a1fcbe487686f0a08" + }, + "vllm/v1/worker/gpu/eplb_utils.py": { + "path": "/vllm/v1/worker/gpu/eplb_utils.py", + "sha256": "1829fac11464aed4649179b302df198de51b95d0589f4e56bea305a876a63e26" + }, + "vllm/v1/worker/gpu/input_batch.py": { + "path": "/vllm/v1/worker/gpu/input_batch.py", + "sha256": "d5dd956eb319bd69dd9e762047833d81ad40b21fce619fcb2133759e73620694" + }, + "vllm/v1/worker/gpu/kv_connector.py": { + "path": "/vllm/v1/worker/gpu/kv_connector.py", + "sha256": "b89a4333f1e552d86e1815674b59e9f1335f0f49c0a7b46082439076f62c6a81" + }, + "vllm/v1/worker/gpu/lora_utils.py": { + "path": "/vllm/v1/worker/gpu/lora_utils.py", + "sha256": "1e90eddd9ddb4ca55e574bb28e87ae3a6f6750175a62d373102426543f4ccd66" + }, + "vllm/v1/worker/gpu/metrics/__init__.py": { + "path": "/vllm/v1/worker/gpu/metrics/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/metrics/logits.py": { + "path": "/vllm/v1/worker/gpu/metrics/logits.py", + "sha256": "ea058d7510a077a55f8ac7e4c3d596508346244e908cb372865d7159f62edc89" + }, + "vllm/v1/worker/gpu/mm/__init__.py": { + "path": "/vllm/v1/worker/gpu/mm/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/mm/encoder_cache.py": { + "path": "/vllm/v1/worker/gpu/mm/encoder_cache.py", + "sha256": "89c500338fddbeee7c4fca978a3a7c4c566a03e848e399d303fbee3c80631cd2" + }, + "vllm/v1/worker/gpu/mm/encoder_runner.py": { + "path": "/vllm/v1/worker/gpu/mm/encoder_runner.py", + "sha256": "0981e352d70301b7154a217a48665ffe35f215d053ec5740c2515a3e1e11b4e6" + }, + "vllm/v1/worker/gpu/mm/lora.py": { + "path": "/vllm/v1/worker/gpu/mm/lora.py", + "sha256": "a3eddfad6ad64de276964240c28dc080888df4a56dd5eac18f89428f2cbb7a01" + }, + "vllm/v1/worker/gpu/mm/rope.py": { + "path": "/vllm/v1/worker/gpu/mm/rope.py", + "sha256": "0924375bcb367267e783b57dd2ad9de1189d97025ce4313baaa54f2911eaaf1e" + }, + "vllm/v1/worker/gpu/model_runner.py": { + "path": "/vllm/v1/worker/gpu/model_runner.py", + "sha256": "174c93db921c23cf0396eee4764be25b2bd2d4b6a06e9fa41ce3598b884ce8ce" + }, + "vllm/v1/worker/gpu/model_states/__init__.py": { + "path": "/vllm/v1/worker/gpu/model_states/__init__.py", + "sha256": "07815d0b788fc88185772f581bbf892a675259f9288375571f29887622f8d93c" + }, + "vllm/v1/worker/gpu/model_states/default.py": { + "path": "/vllm/v1/worker/gpu/model_states/default.py", + "sha256": "bb614f814780f052e869f9acf31dfbfa68718ee7dc6252eefa901b5730ee8a2a" + }, + "vllm/v1/worker/gpu/model_states/encoder_decoder.py": { + "path": "/vllm/v1/worker/gpu/model_states/encoder_decoder.py", + "sha256": "a5868059d8af672548b41d0e623e884320e6ed61e6aaca2d2828ff5be0356f2f" + }, + "vllm/v1/worker/gpu/model_states/encoder_only.py": { + "path": "/vllm/v1/worker/gpu/model_states/encoder_only.py", + "sha256": "84e96b55a2639e2a73fa4a0308acc89c8d053dc715481180b237e0196dcef99f" + }, + "vllm/v1/worker/gpu/model_states/interface.py": { + "path": "/vllm/v1/worker/gpu/model_states/interface.py", + "sha256": "5675b6fedc7403a9ab410b1e5565974e78fac23c42ab4253ae1da52d6e09b594" + }, + "vllm/v1/worker/gpu/model_states/mamba_hybrid.py": { + "path": "/vllm/v1/worker/gpu/model_states/mamba_hybrid.py", + "sha256": "573e130ac5587d4822fabf97adad1ad0fda02ff83c5e70df879a5bb175ae845c" + }, + "vllm/v1/worker/gpu/model_states/mm_pruning.py": { + "path": "/vllm/v1/worker/gpu/model_states/mm_pruning.py", + "sha256": "b150940b12ae76048f050a8eeb54d532bbdc530a18ffbf320ddeeb0cfaa90f93" + }, + "vllm/v1/worker/gpu/model_states/prompt_embeds.py": { + "path": "/vllm/v1/worker/gpu/model_states/prompt_embeds.py", + "sha256": "11f9e270925c2df6a505557605ac2b859bb145cf3420b0111e7482a1c544f9b1" + }, + "vllm/v1/worker/gpu/model_states/recoverssm.py": { + "path": "/vllm/v1/worker/gpu/model_states/recoverssm.py", + "sha256": "b4b660e62eaf33f4fe8271f83ed1fb6de6bc08f800a8073b27803e42fb29a645" + }, + "vllm/v1/worker/gpu/pcp_manager.py": { + "path": "/vllm/v1/worker/gpu/pcp_manager.py", + "sha256": "2d80df0ed5b18a2069f9d0689cb59923ffe324ba200fcafe242da23da3a6ddaa" + }, + "vllm/v1/worker/gpu/pool/__init__.py": { + "path": "/vllm/v1/worker/gpu/pool/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/pool/pooling_runner.py": { + "path": "/vllm/v1/worker/gpu/pool/pooling_runner.py", + "sha256": "f8463f7648cce0f3f29418a4d9fee61634ead760957cf236d06d61cf8cd986e7" + }, + "vllm/v1/worker/gpu/pp_utils.py": { + "path": "/vllm/v1/worker/gpu/pp_utils.py", + "sha256": "dadeef0bebf61d0ad44a28d06372208ec4e6389224d6017f412683b026bdbb5c" + }, + "vllm/v1/worker/gpu/sample/__init__.py": { + "path": "/vllm/v1/worker/gpu/sample/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/sample/bad_words.py": { + "path": "/vllm/v1/worker/gpu/sample/bad_words.py", + "sha256": "8d3cbd5613398260314d94739d8ee0e1ac0c22abf2f960f541d3c0d4e39d360b" + }, + "vllm/v1/worker/gpu/sample/batch_shard.py": { + "path": "/vllm/v1/worker/gpu/sample/batch_shard.py", + "sha256": "c30274a3a04e6a03e89be9cd7c62de602b1aba4d412f64540ab6201036de3928" + }, + "vllm/v1/worker/gpu/sample/gumbel.py": { + "path": "/vllm/v1/worker/gpu/sample/gumbel.py", + "sha256": "3ec1df510bdad13e8b0a457b5b67c98affdf6e57369e56cb471246cc8f40dd34" + }, + "vllm/v1/worker/gpu/sample/logit_bias.py": { + "path": "/vllm/v1/worker/gpu/sample/logit_bias.py", + "sha256": "9e80a3fe6f3c7474723408cfff52183f4585fdeedd9c2312843ee98d0b12724c" + }, + "vllm/v1/worker/gpu/sample/logprob.py": { + "path": "/vllm/v1/worker/gpu/sample/logprob.py", + "sha256": "f47479a818192acb6b297c79fa67a3b2f9820e3492a394d5adda777e9b7c832e" + }, + "vllm/v1/worker/gpu/sample/min_p.py": { + "path": "/vllm/v1/worker/gpu/sample/min_p.py", + "sha256": "4cb5e2f45e1ced6f9685283a7a5c8cfd7204d9a249822e866cfff756c7f04f62" + }, + "vllm/v1/worker/gpu/sample/output.py": { + "path": "/vllm/v1/worker/gpu/sample/output.py", + "sha256": "d6e298c0f197d487a8faaf7200f500fa83df1d7a4bbf4339cadd6a18008f7f9c" + }, + "vllm/v1/worker/gpu/sample/penalties.py": { + "path": "/vllm/v1/worker/gpu/sample/penalties.py", + "sha256": "46c29434caf5f415129ef4a9bb2b8d4f62d2765596e3e07f73ad2b198c7def1b" + }, + "vllm/v1/worker/gpu/sample/prompt_logprob.py": { + "path": "/vllm/v1/worker/gpu/sample/prompt_logprob.py", + "sha256": "4cf22d390e7bf59e44c458cff7180268db63e95d06af2f1e14d720a2d77c9663" + }, + "vllm/v1/worker/gpu/sample/sampler.py": { + "path": "/vllm/v1/worker/gpu/sample/sampler.py", + "sha256": "832c9945d201a1e730ff9b4b52076aa83bd4a5064e1e4cfea952cf84d4a8d1f0" + }, + "vllm/v1/worker/gpu/sample/states.py": { + "path": "/vllm/v1/worker/gpu/sample/states.py", + "sha256": "4e3671f93695ba5a48fad7d2d13beb231ac8741034904ed5a15d9f7b9b86662e" + }, + "vllm/v1/worker/gpu/sample/thinking_budget.py": { + "path": "/vllm/v1/worker/gpu/sample/thinking_budget.py", + "sha256": "020513e1d3406f367de6ad995a95055008fd0c28f2873647e8283c9870e22404" + }, + "vllm/v1/worker/gpu/sample/trace_replay.py": { + "path": "/vllm/v1/worker/gpu/sample/trace_replay.py", + "sha256": "d2a7d3b3b55379efabe4740a4b7f14030126dc11be36f6ea974164ce42316a50" + }, + "vllm/v1/worker/gpu/sample/watermark.py": { + "path": "/vllm/v1/worker/gpu/sample/watermark.py", + "sha256": "a3581458169dab9153eb09fd67218e0ee5585406537a9de80ad528ae62b030c0" + }, + "vllm/v1/worker/gpu/shutdown.py": { + "path": "/vllm/v1/worker/gpu/shutdown.py", + "sha256": "bb470f14b17c7e52571ef8938b2a9527e7c2846852ae8a3a94b69cd1c30aa4b1" + }, + "vllm/v1/worker/gpu/spec_decode/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/__init__.py", + "sha256": "1f1f84bfe6f4f5af3a7e21a7a8716ecf7b9013da1d03327668a3ee36afc24c32" + }, + "vllm/v1/worker/gpu/spec_decode/acceptance_estimator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/acceptance_estimator.py", + "sha256": "505b843bdd75928b03793b395b47b8be914bd7fe2a3351c8ec04339baeebb1c2" + }, + "vllm/v1/worker/gpu/spec_decode/adaptive_verification.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/adaptive_verification.py", + "sha256": "276b2fec56758a94c71b717f6786b8a6f126db2e20cf964350202feee61a0a39" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py", + "sha256": "13392ef0a9ed59eb9c2b2bad43d7c61beb212a8805849e46b5130c230275d0a5" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/speculator.py", + "sha256": "5b97f54e20ddf65b98e939832d050745f67ef43cfa145786da300f1a8322e3c6" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/cudagraph.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/cudagraph.py", + "sha256": "beab567ae2df6a2ba2cd92fe7ee452c6b959b8a7037a4b5f493993a1824619bb" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/speculator.py", + "sha256": "f9c100f42f9326e48eb84e89281897e859ba761943f54d593523555ccd98dc63" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/utils.py", + "sha256": "53d2c3ad474d290d2c6df027446bbd80ac7447684e5242ab2c3c5337d2abd383" + }, + "vllm/v1/worker/gpu/spec_decode/dflash2/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash2/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/dflash2/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash2/speculator.py", + "sha256": "b70043550938a1df9aecc85d8c8224c38c929ca34f68834572f6e723854d2027" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/speculator.py", + "sha256": "dcf4abdedbd2bddd0d76be198ccf5b4e467c46f645038c35fcab821491a35b03" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/utils.py", + "sha256": "86af2bf30604a184312e8f076097b91ecfec704f409f9d68d634b03d6b318070" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/eagle3_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/eagle3_utils.py", + "sha256": "201ee875fcc3d076a8fc1f3876dcbf85736b221a368555243a8987ff26a1674e" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/speculator.py", + "sha256": "746e318a4f266d75522ff7f3731ea9b4527b7b4824f71364d1a62184ea1f7b3d" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/utils.py", + "sha256": "94de6f55a1761f24f4aa1388cbc3b3763d4ab3ee53260330056ad31ce0b78236" + }, + "vllm/v1/worker/gpu/spec_decode/extract_hidden_states.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/extract_hidden_states.py", + "sha256": "93c4233be7b2d2290b33902ea9b3bb5274c11701830851d03967a22144536e2d" + }, + "vllm/v1/worker/gpu/spec_decode/gemma4/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/gemma4/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/gemma4/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/gemma4/speculator.py", + "sha256": "9991210d7babd2caf2cd10797ca8688543dedeafbc3b86bc7c979c1a6ae9f949" + }, + "vllm/v1/worker/gpu/spec_decode/mtp/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/mtp/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/mtp/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/mtp/speculator.py", + "sha256": "926d6c9ffdb368c971647911a60493820d056ce236fcae9d94a42fa2e006255d" + }, + "vllm/v1/worker/gpu/spec_decode/multi_module_mtp/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/multi_module_mtp/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/multi_module_mtp/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/multi_module_mtp/speculator.py", + "sha256": "d9d4735b9b33829332b0e845b6d3073b2f0436045ed693b25c6434f351644127" + }, + "vllm/v1/worker/gpu/spec_decode/rejection_sampler.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/rejection_sampler.py", + "sha256": "030db5bfca162cc1f305112f299de5d6d61c59d3ed0807fee46575441ca4086d" + }, + "vllm/v1/worker/gpu/spec_decode/rejection_sampler_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/rejection_sampler_utils.py", + "sha256": "214b61fa0abe88573beb779872c035b3954e5651a85bd438d99ee5905d3a62ec" + }, + "vllm/v1/worker/gpu/spec_decode/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/speculator.py", + "sha256": "3a1ab15bf8b20918852eb835fe9755046e99dcbac6ba6ca3d414949fc8bc695a" + }, + "vllm/v1/worker/gpu/spec_decode/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/utils.py", + "sha256": "282f2929eddae9ca7312269f799be07472334b6df9fd91878b5e839ec05e418c" + }, + "vllm/v1/worker/gpu/states.py": { + "path": "/vllm/v1/worker/gpu/states.py", + "sha256": "99418f5df43ca612ded72609fee011620b065b2cab2f249ccb387096bf4ae71a" + }, + "vllm/v1/worker/gpu/structured_outputs.py": { + "path": "/vllm/v1/worker/gpu/structured_outputs.py", + "sha256": "18a10532db7e66b55e334acacd1fd989ad6361adf31dd0de9a9a65e23db25951" + }, + "vllm/v1/worker/gpu/ubatch_utils.py": { + "path": "/vllm/v1/worker/gpu/ubatch_utils.py", + "sha256": "5092e2e58af0561c8dc12e62847cfc6dda9ca20dfbd33e7f0cd77a83fe87f7c5" + }, + "vllm/v1/worker/gpu/warmup.py": { + "path": "/vllm/v1/worker/gpu/warmup.py", + "sha256": "423ac32d58fe008c228cfa223e4fcebfcf87e3463a9dbdf80a083c0578d73723" + }, + "vllm/v1/worker/gpu_input_batch.py": { + "path": "/vllm/v1/worker/gpu_input_batch.py", + "sha256": "18cf455c9d0eea61cc581c7932f2e6cd09786914e82dd35eef1c1430da359a0f" + }, + "vllm/v1/worker/gpu_model_runner.py": { + "path": "/vllm/v1/worker/gpu_model_runner.py", + "sha256": "87c29d08c0bbf66993d8b984811e7325e35e6436242a773feb55ec88f16b2c51" + }, + "vllm/v1/worker/gpu_ubatch_wrapper.py": { + "path": "/vllm/v1/worker/gpu_ubatch_wrapper.py", + "sha256": "4233cfbe8c9884b042c4363890108f616483b694ebe9a6e69578dcf89c6dac5c" + }, + "vllm/v1/worker/gpu_worker.py": { + "path": "/vllm/v1/worker/gpu_worker.py", + "sha256": "6994436e4547c0996ab555b3e814e8ccea26b650dfc1b378b97d640745309347" + }, + "vllm/v1/worker/kv_connector_model_runner_mixin.py": { + "path": "/vllm/v1/worker/kv_connector_model_runner_mixin.py", + "sha256": "e1cc76d065a7e60aacddb190ae795a480b65cd02ba71a1fc699a02a85c1a3de2" + }, + "vllm/v1/worker/lora_model_runner_mixin.py": { + "path": "/vllm/v1/worker/lora_model_runner_mixin.py", + "sha256": "fef6092a15d8d37f6fa22495e6106e2e5280180908d61ce43d9ff5bf4eef3f2f" + }, + "vllm/v1/worker/mamba_utils.py": { + "path": "/vllm/v1/worker/mamba_utils.py", + "sha256": "23fdaa4e8f63ee8f938eaa1a2b39f803cb04fa6ecd69789563254b1a0691413a" + }, + "vllm/v1/worker/mm_encoder_model_runner.py": { + "path": "/vllm/v1/worker/mm_encoder_model_runner.py", + "sha256": "780c41be84ad022205c21c1decb6bb8d5afb03bc7be120c1f7df03b710acc3d7" + }, + "vllm/v1/worker/sentinel/__init__.py": { + "path": "/vllm/v1/worker/sentinel/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/sentinel/gpu_worker_sentinel.py": { + "path": "/vllm/v1/worker/sentinel/gpu_worker_sentinel.py", + "sha256": "3959b8619d052c5dd247815074e03ec21ec9b43cc424ff2d296abc19b227b852" + }, + "vllm/v1/worker/startup_plan.py": { + "path": "/vllm/v1/worker/startup_plan.py", + "sha256": "84bcbb4f7a9fd7c8d10c9c895aadd9673d44c767b9132368d11eb5e017afe86b" + }, + "vllm/v1/worker/ubatch_utils.py": { + "path": "/vllm/v1/worker/ubatch_utils.py", + "sha256": "b34dce551b5195c414e6a3a997c75961cc7a17f24c7c980487fe3d3e2ba7a798" + }, + "vllm/v1/worker/ubatching.py": { + "path": "/vllm/v1/worker/ubatching.py", + "sha256": "40391241c564feb5f16c77898ae6ae152ed6e71a4682e2a406387785d8de02d7" + }, + "vllm/v1/worker/utils.py": { + "path": "/vllm/v1/worker/utils.py", + "sha256": "0ca3ec6bf4d20076145b7fe64e564962adebedc8f75a856b517ba0b2f2d77acf" + }, + "vllm/v1/worker/worker_base.py": { + "path": "/vllm/v1/worker/worker_base.py", + "sha256": "4a1a5266b912fe97991d8dc89d92b923990da9f6cb4b817d00d52e9c0d26dd7c" + }, + "vllm/v1/worker/workspace.py": { + "path": "/vllm/v1/worker/workspace.py", + "sha256": "d21c08167d1d0d1c0cddaa80453a53a0b4dec5d81b5a537c94a21324344976b3" + }, + "vllm/v1/worker/xpu_model_runner.py": { + "path": "/vllm/v1/worker/xpu_model_runner.py", + "sha256": "07fa0390d28f2b8c3c3c0019eb9c3b126e2397aea268ba47c889f06b423deb23" + }, + "vllm/v1/worker/xpu_worker.py": { + "path": "/vllm/v1/worker/xpu_worker.py", + "sha256": "711b56432506b58041cd86e71320c3960413f7bd61061990b66488421d81cfc3" + } + }, + "prefix": "", + "pth": { + "/__editable__.megatron_core-0.16.0rc0.pth": "d55c9b64480b34aae3d4d31e7706b93391c969dec6e0498e50963b03445a57b0", + "/__editable__.rl_kernel-0.1.0.pth": "1454c4987b35762a0d189d4e901c5d077fde62a1944fbaabecea230e57f3923a", + "/__editable__.vime-0.3.2.pth": "77eec5d06d628cb952e65edd813ca88d8db67ccc785083e1b7b29011b92bec4f", + "/distutils-precedence.pth": "2638ce9e2500e572a5e0de7faed6661eb569d1b696fcba07b0dd223da5f5d224", + "/qwen3_next_cuda_runtime.pth": "e0d3ab57dd3ff4f5d55fcf76e83c549cc00b3c813e6f717c540d5ded79fa2f49", + "/qwen3_next_megatron_source.pth": "8556ac057538e82856cb76cbbc954f58312a3f45373daec3eec826031cfd2709", + "/__editable__.rl_kernel-0.1.0.pth": "1454c4987b35762a0d189d4e901c5d077fde62a1944fbaabecea230e57f3923a", + "/distutils-precedence.pth": "2638ce9e2500e572a5e0de7faed6661eb569d1b696fcba07b0dd223da5f5d224", + "/nvidia_cutlass_dsl_packages.pth": "cc710b99ddb3d76361a70461461d274212a979d00c381d821fce5bb3ad9cf246" + }, + "pyvenv_cfg_sha256": "48579f2c6d35c3d535c2690d7d426587c4b8e92021463f0266b38d35dfbbb834", + "sources": { + "/Megatron-LM-training": { + "patch_sha256": "f66035f12501aa1d08e8884e0dea5a22d59825d717aeda73c3e83876e3efd79f", + "path": "/Megatron-LM-training", + "tree": "731fc44a368d6cac8c6171a29d5c687ff0d95bd1" + }, + "/vime": { + "patch_sha256": "66949839d4c18329444f4f9f6dcd702b53ce1b94e9aa15ed111f28743bfaa4b9", + "path": "/vime", + "tree": "f5174e67dbcdaef983eecd45f215fef2d8429dd0" + } + }, + "version": "3.12.14 | packaged by Anaconda, Inc. | (main, Aug 27 2026, 14:46:43) [GCC 14.3.0]" + }, + "sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca" + }, + "gpu_uuids": [ + "070ad148-15f4-87b0-4080-42a9dbee2cc5", + "b30571e8-c246-b368-75b0-463b50081063", + "cafee071-2025-fa04-3a2e-8528731a8dc8", + "a51af203-cc18-3838-08ac-127ddf03c97c" + ], + "execution_gpus": 4 +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/train/l2_matrix.json b/docs/usage/evidence/qwen3-next-chain-b200/train/l2_matrix.json new file mode 100644 index 000000000..879ebe919 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/train/l2_matrix.json @@ -0,0 +1,2236 @@ +{ + "schema_version": 1, + "status": "passed", + "scope": "qwen3_next_full_model_l2", + "identity": { + "scheduler_profile_certificate": { + "path": "/result.json", + "sha256": "bf3a74423b3636145cad903d5cf9d70f2c3c777b019a24d125c2ca79f8b1e8d9" + }, + "source_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "checkpoint": "/training-state/exports/reload-2-78a99b209f9b484d845c662b325edbd3", + "weight_version": "reload-2", + "checkpoint_identity": { + "schema_version": 1, + "kind": "qwen3_next_native_hf_export", + "status": "complete", + "weight_version": "reload-2", + "step": 2, + "export_id": "reload-2-78a99b209f9b484d845c662b325edbd3", + "base_checkpoint": "", + "base_checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "training_identity": { + "scheduler_profile_certificate": { + "path": "/result.json", + "sha256": "bf3a74423b3636145cad903d5cf9d70f2c3c777b019a24d125c2ca79f8b1e8d9" + }, + "source_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "checkpoint": "", + "weight_version": "baseline", + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "architecture_layers": 48, + "weights_dtype": "bfloat16", + "recurrent_state_dtype": "float32", + "run_id": "20261009T041838Z-train1-c67ec144-39e7db9f", + "execution_id": "39e7db9f488142f4b52872e05728c390", + "fixture_sha256": "7c98e4e17cc24bd0c5f65f6515d58a9dfc947afcdb6d4956bd3fa05f24bb28b6" + }, + "architecture_layers": 48, + "weights_dtype": "bfloat16", + "model_rank_sha256": [ + "3ddc69fe7e5d977eab4514fa425840b8d398dbec82995091af644724ed19955a", + "e5d5c59ad91481f00b6e76ed8df3e937ec4178a7abc3a40e0d48c1ae6635e388", + "85886f4d00ebf1bf986f6091273d3fa5d6476f7a82866a95c1263abe541f7293", + "f2b03aad2e898c1ee33d8b1e3a146f98a9bf13253a42efd36adc38ba30e35f19" + ], + "model_identity_method": "native_parameter_hashes_after", + "base_passthrough": { + "prefixes": [ + "mtp." + ], + "tensor_count": 1553, + "shards": { + "model-base-passthrough-00001-of-00001.safetensors": { + "source": "model-00041-of-00041.safetensors", + "tensor_count": 1553 + } + }, + "names_sha256": "622080f1d1b3060957aab28c98f5a728d0c1e9b44d624474a752d0dc9a90566d" + }, + "files": { + "STAGING.json": { + "size": 27893, + "sha256": "384ee1dc762332c837c62f93cdf270e888f722e85ce16ea64875b51d30d67354" + }, + "config.json": { + "size": 1154, + "sha256": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303" + }, + "generation_config.json": { + "size": 221, + "sha256": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217" + }, + "merges.txt": { + "size": 1671839, + "sha256": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3" + }, + "model-00001-of-00147.safetensors": { + "size": 4216, + "sha256": "f297513e1c5e05a652b167b82a9e2c48ab5eab9ccc489d9b0db6da892675adbe" + }, + "model-00002-of-00147.safetensors": { + "size": 1073804696, + "sha256": "56881cb4b2774e84ed201d596f5ee3d0e515976cc183ae2e4b0dab1f309bf980" + }, + "model-00003-of-00147.safetensors": { + "size": 2147609384, + "sha256": "3805458f753d090f874a9fb2f128e88b06eb9dc76f89720d340417d707baef4e" + }, + "model-00004-of-00147.safetensors": { + "size": 75839416, + "sha256": "535bc45077380c0bc5e64d3ee680579260f01800e632a159446fde56be2a24bb" + }, + "model-00005-of-00147.safetensors": { + "size": 1073804696, + "sha256": "7a0a70e0683b2b2ae9c9e1b1f6530d71d903f72c5d0e728fde0349a677d4388d" + }, + "model-00006-of-00147.safetensors": { + "size": 2147609384, + "sha256": "11627fc124219e2e2041820dd8c8fab475fb95e1a19095ec052d547395bc8459" + }, + "model-00007-of-00147.safetensors": { + "size": 75839416, + "sha256": "85d06e89815967e1c6081416e1da1523240d09f10b361274b94f8bee365e4a02" + }, + "model-00008-of-00147.safetensors": { + "size": 1073805208, + "sha256": "f7b904408310cfa22313136dafc90a1ecb17c01f1557e06085110df8e49b9a32" + }, + "model-00009-of-00147.safetensors": { + "size": 2147610408, + "sha256": "b22eac5700f7355e6729edc22a939c4eb3786967ec4ab2bd7fb89b5c4bdff01f" + }, + "model-00010-of-00147.safetensors": { + "size": 75839432, + "sha256": "d0db6c52125b5e88bd8aa7034376b27e07a2e591fa76d19229cfe9edaf526c84" + }, + "model-00011-of-00147.safetensors": { + "size": 1073805208, + "sha256": "a69e00b276ce389a78cc587f34a80256ef5712fc532884d034be582255172597" + }, + "model-00012-of-00147.safetensors": { + "size": 2147610408, + "sha256": "6643fdcf4755fef08cab5dfae1d01c108f11b8fc9b921c3014ccb3444f967105" + }, + "model-00013-of-00147.safetensors": { + "size": 62929376, + "sha256": "01827703e357b4ea1426be9f2f268eff5fa2384a94dc4c04126f675d35f1a3fe" + }, + "model-00014-of-00147.safetensors": { + "size": 1073805208, + "sha256": "98f07959e99fafbd601d1df580206a9c8e9672712952a4035e249fbc5a48633c" + }, + "model-00015-of-00147.safetensors": { + "size": 2147610408, + "sha256": "9f35e066490cf90c50d292c2ebaef51de2aba88624af697146150fe8b4b91c58" + }, + "model-00016-of-00147.safetensors": { + "size": 75839432, + "sha256": "99a93a96a4fb7652205192801d5216b5d53354277291ac3cf3044606d078b182" + }, + "model-00017-of-00147.safetensors": { + "size": 1073805208, + "sha256": "216473c456f94f0879da9a8efeff8171fa6a77811c6a494673432f9b37c012cf" + }, + "model-00018-of-00147.safetensors": { + "size": 2147610408, + "sha256": "088aa59119e7f515a4d6a07a262b1140a9635f72133653c0b856974702462515" + }, + "model-00019-of-00147.safetensors": { + "size": 75839432, + "sha256": "2d19a7adf6c05b9469fe1aa08187ec546a2a8e0eca975af7da2e11aabd7f649e" + }, + "model-00020-of-00147.safetensors": { + "size": 1073805208, + "sha256": "c644ae04c5bec2dcfcf09464070df79653c589ed48f8ee78f702cd1bf70474c7" + }, + "model-00021-of-00147.safetensors": { + "size": 2147610408, + "sha256": "db106e82b8c8a145ba3d9d6bae5e318ae860f6ea860e63dfd2027fb316364525" + }, + "model-00022-of-00147.safetensors": { + "size": 75839432, + "sha256": "c64486f83d99c17d6c6a331db6ddfa4331bc4813632ddef6b2ae59a4e680d85a" + }, + "model-00023-of-00147.safetensors": { + "size": 1073805208, + "sha256": "aad4a11beb3623a55b265333cae9a4395b14e0e656e7486e150f17fa8f5239a2" + }, + "model-00024-of-00147.safetensors": { + "size": 2147610408, + "sha256": "a04b9e322dd70e5d164817abc04965862f6b349ea462fece6824b0ea85712e5f" + }, + "model-00025-of-00147.safetensors": { + "size": 62929376, + "sha256": "f17df1ae7ecdcb115bcf455b194aa6aec5d2c2972c85df40602bec6def10d53b" + }, + "model-00026-of-00147.safetensors": { + "size": 1073805208, + "sha256": "9891b4cb4bd0bd1d7613a00c944b1bdfa6b0d5151f4c167de81c30a81fabc246" + }, + "model-00027-of-00147.safetensors": { + "size": 2147610408, + "sha256": "894627b6268e9f8e11e9c6e2c9ded846de49bc43647711d4a94973e0ed14592e" + }, + "model-00028-of-00147.safetensors": { + "size": 75839432, + "sha256": "8a10198a44c6ca8ae0c2da8fd8483fa330fd26f97f895a3ddf7c5bc067d1b8f2" + }, + "model-00029-of-00147.safetensors": { + "size": 1073805208, + "sha256": "8830d3312aeefd6185dea0d3b183da38752253e74da566f4a584aabe1c4cde8a" + }, + "model-00030-of-00147.safetensors": { + "size": 2147610408, + "sha256": "09de4461ab691e78fbcd12b0a26a3e0265453d7cc4d8cfcf9570d9384ffde628" + }, + "model-00031-of-00147.safetensors": { + "size": 75839432, + "sha256": "5e884110ce4902dde296ce50b8948df4eaf3b29d77867ad18e51ea0c78f12ff0" + }, + "model-00032-of-00147.safetensors": { + "size": 1073805208, + "sha256": "47687781ad775d52c445e37a652c48f49a713e07c83f4e55d55384c0a430f0bd" + }, + "model-00033-of-00147.safetensors": { + "size": 2147610408, + "sha256": "81c5d8f4a625703491a13bf41b74eec774e497ae6ee0ef6d5fa49da36a176b66" + }, + "model-00034-of-00147.safetensors": { + "size": 75839432, + "sha256": "1df86f533833ecc51fa637f972f646f91f98308a2b60f0b405a3ee9a228369f4" + }, + "model-00035-of-00147.safetensors": { + "size": 1073805208, + "sha256": "26004a40c3457943df9cbb956196f9157a0521eabe0f9aa196e09f4844ac5f58" + }, + "model-00036-of-00147.safetensors": { + "size": 2147610408, + "sha256": "50c843cc950c3e826d703b325d2a8ec52b3eb79f232e24a95512b3054dfe985d" + }, + "model-00037-of-00147.safetensors": { + "size": 62929376, + "sha256": "a1bd257fe63bad0b11031eb2dc2cf9b2070f2dcecfbaf92768b956aac49f0693" + }, + "model-00038-of-00147.safetensors": { + "size": 1073804696, + "sha256": "ff122722e465d4524182f07fa95588f037aa5bbfa8296ecabce06bffd1a87aa8" + }, + "model-00039-of-00147.safetensors": { + "size": 2147609384, + "sha256": "3f705b190a003935be1d474d7fb4a39464f70a4cc1f0f126d44230bd73f23074" + }, + "model-00040-of-00147.safetensors": { + "size": 75839416, + "sha256": "9483528c5e1f807a19a84b4a5feed4504e362490839dc42378220d86281c5342" + }, + "model-00041-of-00147.safetensors": { + "size": 1073805208, + "sha256": "d44259c0e7fed809da9cf5a02648a8d0130984883ad8ca3a399aaf886aba0a52" + }, + "model-00042-of-00147.safetensors": { + "size": 2147610408, + "sha256": "c25f45e246e5ff464ffbaa70cd4a19feaf7fd1242224d9654e8bc488d746a284" + }, + "model-00043-of-00147.safetensors": { + "size": 75839432, + "sha256": "8bb12d6b340c195e447bc5035c1f74383dd8b0058c579c3b3678037dc3825c88" + }, + "model-00044-of-00147.safetensors": { + "size": 1073805208, + "sha256": "b97d4ff50b85c7ef0510dd801647c93a31b24047c674ab301f525a548afbd5f3" + }, + "model-00045-of-00147.safetensors": { + "size": 2147610408, + "sha256": "89966461fda186e0a059165fa059fc5838ea7a039776edd0c8c2d0f8cf5e2d11" + }, + "model-00046-of-00147.safetensors": { + "size": 75839432, + "sha256": "03a2a3ebb73479c76aa6201db8e26824cf71cc8f2a061e99b11595f59f294e27" + }, + "model-00047-of-00147.safetensors": { + "size": 1073805208, + "sha256": "021ce840d030045a041f36bfb4ba5d77517de923798532726e30e765cc822386" + }, + "model-00048-of-00147.safetensors": { + "size": 2147610408, + "sha256": "50ed385d8799e9aeb8dc58fe8c77a0c70a6b466b6193be85bf953bd80e956ee4" + }, + "model-00049-of-00147.safetensors": { + "size": 75839432, + "sha256": "953d3bf23e3ce26cf8ee377c77b39a1e1e9dc96c383d50886e37b6eda32ca7d9" + }, + "model-00050-of-00147.safetensors": { + "size": 1073805208, + "sha256": "872868c1f4fe074bd7c42e482371c90f474fea0bdcc7a4b6dce9beaafc80c211" + }, + "model-00051-of-00147.safetensors": { + "size": 2147610408, + "sha256": "97f2f15656b20fe6b5f65b42fbf5a2fd18c02bbeec6be98ef9cd044a8e526b1a" + }, + "model-00052-of-00147.safetensors": { + "size": 62929376, + "sha256": "02ff26a993fc1b42d292bca75dfcb4aa453dba596be9752100908bb3509b5121" + }, + "model-00053-of-00147.safetensors": { + "size": 1073805208, + "sha256": "e63cc29a1e3f5f4a5d6177a7f5d955488eace98e55ffc7500de8dfac8147254c" + }, + "model-00054-of-00147.safetensors": { + "size": 2147610408, + "sha256": "8a3fd7b47f9c8e1fb068f58c2b17800e87cd739eb8ea5b47b46681ee823c0bb8" + }, + "model-00055-of-00147.safetensors": { + "size": 75839432, + "sha256": "df0f64fcf66c85d8c3c34b5e67852a32e75ff7b5e48b8a41291fa9fbc1fec397" + }, + "model-00056-of-00147.safetensors": { + "size": 1073805208, + "sha256": "cdefac69a06a5ffecc88fe1866dbb531780bc49fb9fade70e763f16e155ccafe" + }, + "model-00057-of-00147.safetensors": { + "size": 2147610408, + "sha256": "d4bf2b27d828387ec2c95ac8f4b104833b35f6c6e9b7d28a06988c3d9a2ba51e" + }, + "model-00058-of-00147.safetensors": { + "size": 75839432, + "sha256": "392fbe091c5f119ca697d90da73d482291a04685a62149873f49ff7cebfa8796" + }, + "model-00059-of-00147.safetensors": { + "size": 1073805208, + "sha256": "bc682c3d69a69a6259f9ad49e54f3f71e6e717ebbb0df52443ce2ced974af8be" + }, + "model-00060-of-00147.safetensors": { + "size": 2147610408, + "sha256": "4d84ffb6af885eedf2e9ff37c9d0a96537a29c801dcf42d4c1b40d5d77e99464" + }, + "model-00061-of-00147.safetensors": { + "size": 75839432, + "sha256": "23bc528d11c85388fb232c08e376960569798a500e4e81632708a60b9f0248a7" + }, + "model-00062-of-00147.safetensors": { + "size": 1073805208, + "sha256": "aa15b425d646da3f9cfa6c2876f0e1d3574b7f0ea284152d45a043f82a5f7d57" + }, + "model-00063-of-00147.safetensors": { + "size": 2147610408, + "sha256": "18effaab66190034674f71e31f1654ce2897bd22b8e45a12688524c05986c924" + }, + "model-00064-of-00147.safetensors": { + "size": 62929376, + "sha256": "9502c8f8f0accced237be3b397d9e23761080232f7a71d041da0f232179dd607" + }, + "model-00065-of-00147.safetensors": { + "size": 1073805208, + "sha256": "d723746600e84ae5ea8c064bdcbb3923cca64027f5f1d2ceb83ff3fafa3da4a6" + }, + "model-00066-of-00147.safetensors": { + "size": 2147610408, + "sha256": "b73771ae80dbb4265e0bdacfba7e9bce0c2554842b7334982c052b99e07a7aa6" + }, + "model-00067-of-00147.safetensors": { + "size": 75839432, + "sha256": "25e6f603127ba5786697e12628e6ab24db4fcf987e941a19e43be66d38c64d0b" + }, + "model-00068-of-00147.safetensors": { + "size": 1073805208, + "sha256": "785746042bec39462abc260e78968f167e13e4f6739fe6d86b0f995f5d9c76c4" + }, + "model-00069-of-00147.safetensors": { + "size": 2147610408, + "sha256": "f0fc1ba7762a54a62454e78023b167e4c4067ee89d0a6a528a7c814c08ebe6b3" + }, + "model-00070-of-00147.safetensors": { + "size": 75839432, + "sha256": "efc4e36db6185a142ee7b40e517580ae1b8f8e7bb035941a2fb3bff72284a5e6" + }, + "model-00071-of-00147.safetensors": { + "size": 1073804696, + "sha256": "33ce05c567cc4a0bce1fa06e826a39010fdbbc4a4b7b28996a713fe8d7e6defc" + }, + "model-00072-of-00147.safetensors": { + "size": 2147609384, + "sha256": "7a636dc20b5d69453fa4971a2dda321d7927d1de3c47dd0321a8629647bc6c68" + }, + "model-00073-of-00147.safetensors": { + "size": 62929360, + "sha256": "09813f9151c294d521c007dab5980d6bda78b5482f77b91befcdec5923681423" + }, + "model-00074-of-00147.safetensors": { + "size": 1073805208, + "sha256": "572a99f9012e204e21a9bbd46afcc6cd787e099edf65842434ef7e31d0dfdeee" + }, + "model-00075-of-00147.safetensors": { + "size": 2147610408, + "sha256": "ddce5418736fb559a9f498c33b1bc41f142ba34f748cbea7f8198c789f97bcb9" + }, + "model-00076-of-00147.safetensors": { + "size": 75839432, + "sha256": "eb1634ecee78247811b1f8a72eb3d81f8a0b228fb693ba034d9849d59824b452" + }, + "model-00077-of-00147.safetensors": { + "size": 1073805208, + "sha256": "17e147dadf2cc0da2d6ef90cce282304df91a2f1445b8583ddfc776120dd8a73" + }, + "model-00078-of-00147.safetensors": { + "size": 2147610408, + "sha256": "148611aa0fa6e194b13f3de18430ac19a6d2451f5ae8e34938d5d37b419889c3" + }, + "model-00079-of-00147.safetensors": { + "size": 62929376, + "sha256": "ab527b1965121f75e1fa1a5861ce012ce553014176b41ae027074e432cbe88bf" + }, + "model-00080-of-00147.safetensors": { + "size": 1073805208, + "sha256": "2482e15ffe51e77fef00be5f19c874a01b8b6285566ee242685e76f5aa348d97" + }, + "model-00081-of-00147.safetensors": { + "size": 2147610408, + "sha256": "e4efe93a896f3641e117893d145cb63f3cc399a45c25c0357cffadb66421765c" + }, + "model-00082-of-00147.safetensors": { + "size": 75839432, + "sha256": "0c61eb6411df279aff23928f22adccb6bfaa80aec01dbc018942480e059146b7" + }, + "model-00083-of-00147.safetensors": { + "size": 1073805208, + "sha256": "c28e48ff12af6c5b573ddcdc58f77075d2c0fd673e4b1f06582a277ce09cb983" + }, + "model-00084-of-00147.safetensors": { + "size": 2147610408, + "sha256": "718d34a56fc917b71e447f82c4341dae49ed30438f9cf47611b1969d6582bca6" + }, + "model-00085-of-00147.safetensors": { + "size": 75839432, + "sha256": "f36e2b0ca5fd4bc49b7750d23a1c8c5513cafca9e2033ce0ed17ff4e4e9a8a33" + }, + "model-00086-of-00147.safetensors": { + "size": 1073805208, + "sha256": "51057f373efef2130d78079a23c1de9bca838c8b0ae0e13ad0f2c00af908392a" + }, + "model-00087-of-00147.safetensors": { + "size": 2147610408, + "sha256": "dbf26ad3ee227eeab019d64a37d2663b958ef75a443a855ca73b06cb17232737" + }, + "model-00088-of-00147.safetensors": { + "size": 75839432, + "sha256": "e1da79a6406b6d424be747d5cc4361e3a6d7fefbd62d94c6782cbe1a10bc7df4" + }, + "model-00089-of-00147.safetensors": { + "size": 1073805208, + "sha256": "3abbc5d28bf28181f7deb0a0f79d465137b56cf7b40b09aed8fbebb1721f81f8" + }, + "model-00090-of-00147.safetensors": { + "size": 2147610408, + "sha256": "6416617a8cff14af8fa3e6791375883cd2e3c809ef8cfe478e2869e725e5a89a" + }, + "model-00091-of-00147.safetensors": { + "size": 62929376, + "sha256": "4b0e6a5d07831e7e37e73533e677ddb0de9a705778fe5020962d492815a319b6" + }, + "model-00092-of-00147.safetensors": { + "size": 1073805208, + "sha256": "4c5539f8d1194a4b3d957b7f61e6587666c02215765521db933163a367a18391" + }, + "model-00093-of-00147.safetensors": { + "size": 2147610408, + "sha256": "0551ef70a150027e6e123d6e333ba7b45686353c5a7a3be34a9398e01d3e9b5e" + }, + "model-00094-of-00147.safetensors": { + "size": 75839432, + "sha256": "11d96bb282a8015844aee7b3d3d554bc7f7460b22a1a7515215bf86e157047f6" + }, + "model-00095-of-00147.safetensors": { + "size": 1073805208, + "sha256": "ca97e1b71f188cc965ec3ed85d63731819673b22ba903084668791df15a6a1f5" + }, + "model-00096-of-00147.safetensors": { + "size": 2147610408, + "sha256": "d57bdf698cc01b981fa0abddd2a44810543ecfe06890122ee45206dae8467fa0" + }, + "model-00097-of-00147.safetensors": { + "size": 75839432, + "sha256": "8c8fb90ae052525e0a6a529c4fa5ed3b5966b154c4cb6cc2204c7ac460a37ff0" + }, + "model-00098-of-00147.safetensors": { + "size": 1073805208, + "sha256": "45dec9b8a286c801bb21a29e31f9cdd31e7228d6c88558930108b4fa556962e7" + }, + "model-00099-of-00147.safetensors": { + "size": 2147610408, + "sha256": "b7ab1cb4ff2ee1fed08c9d0ed649ae5a886ae46fef694ae86caff933ebdd29cc" + }, + "model-00100-of-00147.safetensors": { + "size": 75839432, + "sha256": "4bb412842e727a1af4aae5ae628f1ce84f013c0fcf43cc9f2d0990f251c33073" + }, + "model-00101-of-00147.safetensors": { + "size": 1073805208, + "sha256": "cda8d307f76761533db21535e863b8fed7989acd728b8f24fbcffc075215d443" + }, + "model-00102-of-00147.safetensors": { + "size": 2147610408, + "sha256": "9143dc00c62f94f4774d895dcd9cba4372acfdda985172ac26a987aaf2fa3c1b" + }, + "model-00103-of-00147.safetensors": { + "size": 62929376, + "sha256": "bb2d588029386f6ca471b45ae726f9e85115732205797b024d033b4560f5b6f6" + }, + "model-00104-of-00147.safetensors": { + "size": 1073804696, + "sha256": "f73356ee3f2c07d21d9bf15ed0e59a106fb223bd6b5d65cbf8ff59d3cb87543a" + }, + "model-00105-of-00147.safetensors": { + "size": 2147609384, + "sha256": "20248a45cc956fde36e4c2d48c391eb4b6d24b272e7ae517d30f1cc759d2b0b6" + }, + "model-00106-of-00147.safetensors": { + "size": 75839416, + "sha256": "908a1d845a7b100a41b9ca9d66fb3d6af7583b75533ae5404bc536ffc7588cea" + }, + "model-00107-of-00147.safetensors": { + "size": 1073805208, + "sha256": "abd0f481fc628a5f6b8749d98cae5a94917bb7113f77b44312a87b788a1ab870" + }, + "model-00108-of-00147.safetensors": { + "size": 2147610408, + "sha256": "abbb9012f71cca747aaf1e0ea6798a2217485ed7095d93d3c2b2fbace45f327b" + }, + "model-00109-of-00147.safetensors": { + "size": 75839432, + "sha256": "5a1dbfa37fdf522c34cb8dd3428d7e6099288be38b6e0d3cf722a5af230bca48" + }, + "model-00110-of-00147.safetensors": { + "size": 1073805208, + "sha256": "ac1334476058a5513aacae4e3a81a6cc752a62d33542bfb0869ca5d3ec06a4fb" + }, + "model-00111-of-00147.safetensors": { + "size": 2147610408, + "sha256": "5e96ed4391dd06b7a146b8e2c02cf9ca37f0ccbd874f8c6926546c8f09e8be8e" + }, + "model-00112-of-00147.safetensors": { + "size": 75839432, + "sha256": "415862be771ff036cb90e963bcb1158d8c0130259c0e32e42a0d5057ca084b18" + }, + "model-00113-of-00147.safetensors": { + "size": 1073805208, + "sha256": "5309f7425fd4d426d4a4c8391436ba135c14ef54f7d78bf4673591967773647c" + }, + "model-00114-of-00147.safetensors": { + "size": 2147610408, + "sha256": "64598a8fceb64b3c05d322691507a35d40284de3c3a79211f6701369fb00535a" + }, + "model-00115-of-00147.safetensors": { + "size": 75839432, + "sha256": "018fcfa76c565623d1ef0e70d83e95e2bfda7b562855403675276756c1c9f925" + }, + "model-00116-of-00147.safetensors": { + "size": 1073805208, + "sha256": "1e33b897d362a2176c1db65b180dc6896e272763aa3299988c1a2a98500b5c16" + }, + "model-00117-of-00147.safetensors": { + "size": 2147610408, + "sha256": "a5d5945eca3855b43e530eee2cf6520135cd4a81902d0e65b57b399c8b411892" + }, + "model-00118-of-00147.safetensors": { + "size": 62929376, + "sha256": "82d22ba211128a60b00e7d3ac8e50f6cb5a0c6bdd38464c76a63921deda4acf3" + }, + "model-00119-of-00147.safetensors": { + "size": 1073805208, + "sha256": "811677ccea68be57c43f443e479eeac1dc40403089104867d7cdca0910fabf17" + }, + "model-00120-of-00147.safetensors": { + "size": 2147610408, + "sha256": "ee2e3cf412bfaad9f3135b6bce6d2b62f8538a6a27ce6bbcf9e6ef9cc72fadb6" + }, + "model-00121-of-00147.safetensors": { + "size": 75839432, + "sha256": "3f609b8675962061c8e77f887e08ca1ee521603f13a6a4b48443f4f63b38b3d6" + }, + "model-00122-of-00147.safetensors": { + "size": 1073805208, + "sha256": "ff803e36f9e4091ad01e6f9349289237e03783071b79dcfa00d91bbe0a382f2a" + }, + "model-00123-of-00147.safetensors": { + "size": 2147610408, + "sha256": "823b463ed443427b61fbdb37cac12afb29360660d9824428f752439cacbac743" + }, + "model-00124-of-00147.safetensors": { + "size": 75839432, + "sha256": "725b2c23ca2d3bee691afa2da4fff278780b9fd92f6c455b1cc7f2e7a972d1bc" + }, + "model-00125-of-00147.safetensors": { + "size": 1073805208, + "sha256": "37d53a1c01af0909ef4b5f54936a3decce53c326bdf306e1d29bfe0bc7a14ea6" + }, + "model-00126-of-00147.safetensors": { + "size": 2147610408, + "sha256": "9daeab452813435db248f768a0dc46bea96bce2389f92ebb4eb493464182ae69" + }, + "model-00127-of-00147.safetensors": { + "size": 75839432, + "sha256": "c3c9d3a05923a5cbb31df6e600e7bb7a3c06e3d023581c8d2c75d440e1ee7701" + }, + "model-00128-of-00147.safetensors": { + "size": 1073805208, + "sha256": "056e682db0ab6ae584f48ab553a2f2568cf73c5a2accf41a6909ebb20ced765d" + }, + "model-00129-of-00147.safetensors": { + "size": 2147610408, + "sha256": "262a2fd8dcd88ebc84c548a77b807c41dc314ebbca71888e25576792033e767b" + }, + "model-00130-of-00147.safetensors": { + "size": 62929376, + "sha256": "e34e22a2b0130e060487ad6224efd7d25567d73412b2a02ee3f615a6b98fef68" + }, + "model-00131-of-00147.safetensors": { + "size": 1073804696, + "sha256": "ec834d03238c9fd9b610de95c4dfe082ed9199a5c7c2edb772c81f9b91d3f4f6" + }, + "model-00132-of-00147.safetensors": { + "size": 2147609384, + "sha256": "535b686df09b832b039cd37c57d177e24e06e8c3b98564cf94a434c0b197d6bc" + }, + "model-00133-of-00147.safetensors": { + "size": 75839416, + "sha256": "e63a4efbb4c25edadfe0223c65314f1ffb611d5dd596e4ae1a678ee4a43bfff3" + }, + "model-00134-of-00147.safetensors": { + "size": 1073804696, + "sha256": "cf651ad3cecdcf8808ef041aff5eb622ed480007b936c801570008467b29610d" + }, + "model-00135-of-00147.safetensors": { + "size": 2147609384, + "sha256": "dcbe086aa112a81494dea3e41e9074c87559739bda76ca08710be82d60620fc1" + }, + "model-00136-of-00147.safetensors": { + "size": 75839416, + "sha256": "89e8fa27220b6c155d9b2020891c60eab1188eb4a0d980ccbf24c48b05c36bdf" + }, + "model-00137-of-00147.safetensors": { + "size": 1073804696, + "sha256": "b1d8f68c8214a510e2d8453dbfb155468ea1eb9459b765556779d69017d7491f" + }, + "model-00138-of-00147.safetensors": { + "size": 2147609384, + "sha256": "e933c180865b8b17b730984169a2587e9ac415e322525f23b8142e1e9da08525" + }, + "model-00139-of-00147.safetensors": { + "size": 62929360, + "sha256": "e1aeeefbaa6bbc9761c9beb88365972a56c6e871e359dca6a89c6d0a04c9169d" + }, + "model-00140-of-00147.safetensors": { + "size": 1073804696, + "sha256": "158bc9a21d875b145ff7eae574e016aa55602a866ec33521ab0d66faf284c3a9" + }, + "model-00141-of-00147.safetensors": { + "size": 2147609384, + "sha256": "03e1383a9a707cb3192341815b320b1d404b3398da473a16b91545c53c3a09be" + }, + "model-00142-of-00147.safetensors": { + "size": 75839416, + "sha256": "0bf27292f331dde74acdac6c3cbbd793d613f981b7356b45431018b4c5f35a74" + }, + "model-00143-of-00147.safetensors": { + "size": 1073804696, + "sha256": "94ee318952036a9d05849c115b392a513f3f970d00e0801200081a2006661e12" + }, + "model-00144-of-00147.safetensors": { + "size": 2147609384, + "sha256": "07226c34b635325a941df32196cc623fdea90ab4d34d96b19f18dca973ab4526" + }, + "model-00145-of-00147.safetensors": { + "size": 75839416, + "sha256": "118d57769561149f012aa99bb24e0615643eb3067a7baea436896eaf51347ff4" + }, + "model-00146-of-00147.safetensors": { + "size": 622329992, + "sha256": "2e4b51e71f585ae837f03c4236d911241a24c665be7a86f8368f36b5ccfe3c39" + }, + "model-00147-of-00147.safetensors": { + "size": 622329984, + "sha256": "5beb2069dff6c8e4bb8963b8e956b8e6db4f822c4e186ffeaf898ba0d2681cd2" + }, + "model-base-passthrough-00001-of-00001.safetensors": { + "size": 3301131328, + "sha256": "65190abf2f9cc7597a3e72c464f1f184d5e11820582a40b7ebd6977ae5273d2f" + }, + "model.safetensors.index.json": { + "size": 6922711, + "sha256": "f7a1d9a95b13a01cd482df0d992abb643b1ca4e3218acf22bd4795dc5a9d8661" + }, + "tokenizer.json": { + "size": 11422654, + "sha256": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4" + }, + "tokenizer_config.json": { + "size": 9377, + "sha256": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3" + }, + "vocab.json": { + "size": 2776833, + "sha256": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + } + }, + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "f7a1d9a95b13a01cd482df0d992abb643b1ca4e3218acf22bd4795dc5a9d8661", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "weight_schema_sha256": "babe9f7e7cf398ad6a8607ee03bb6549139b26fcdd919bb65e9d22b059536361", + "tensor_count": 75944, + "weights_content_sha256": "fd988d83f4741a74b43f642fb6f2f21a984b998694b20bf05964422a260b68db" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "architecture_layers": 48, + "weights_dtype": "bfloat16", + "recurrent_state_dtype": "float32", + "base_checkpoint": "", + "base_checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + } + }, + "fixture": { + "path": "/inputs/frozen.pt", + "sha256": "a8fc79cea6c76e5989743429b76811b3a93b6b85e1eb7f03164c9850c50f1ca8", + "content_sha256": "b59298acf5ecbe64abb4639e7596e052f1993ee5e3c7289b63738f1b04463d01" + }, + "case_ids": [ + "p0008-b1-full", + "p0008-b1-chunked", + "p0008-b4-full", + "p0008-b4-chunked", + "p0064-b1-full", + "p0064-b1-chunked", + "p0064-b4-full", + "p0064-b4-chunked", + "p0256-b1-full", + "p0256-b1-chunked", + "p0256-b4-full", + "p0256-b4-chunked", + "p1024-b1-full", + "p1024-b1-chunked", + "p1024-b4-full", + "p1024-b4-chunked" + ], + "cases": { + "p0008-b1-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/rollout/p0008-b1-full.pt", + "sha256": "60312bd94bc50a7dc19384b9e34f774fdd870e79ad5f694315a44183180aeb36" + }, + "recompute": { + "path": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/recompute/p0008-b1-full.pt", + "sha256": "1dd9569d9fc50c295f3d9c5dcb977a13130c5560e75e8e9de4d366179725f347" + } + } + }, + "p0008-b1-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/rollout/p0008-b1-chunked.pt", + "sha256": "1af6f1d16f7df076a603e3c0bc36d9c7d4204b80e9a59bb5f9562e1c8bdc1057" + }, + "recompute": { + "path": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/recompute/p0008-b1-chunked.pt", + "sha256": "9d3b05b66a61e96f6e611a10892fe5650af74128e3db550c8d0340002e894245" + } + } + }, + "p0008-b4-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/rollout/p0008-b4-full.pt", + "sha256": "f77ff0f5fbcb9ee61a27445ae8c1cbee9708c8c3ae1477d44acc19af6e8f2547" + }, + "recompute": { + "path": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/recompute/p0008-b4-full.pt", + "sha256": "88cd0993a547670bf152a3e157e0f05660ea6ec0b85504810a41a4eb024966ea" + } + } + }, + "p0008-b4-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/rollout/p0008-b4-chunked.pt", + "sha256": "ca07158712b22c75ae1f5a28e53f460fa588edcd319b8df9af5ee37529a11079" + }, + "recompute": { + "path": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/recompute/p0008-b4-chunked.pt", + "sha256": "631000615012b9152687e0e2081f9065ba9951677cf34bb095e6f964a84dd3b8" + } + } + }, + "p0064-b1-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/rollout/p0064-b1-full.pt", + "sha256": "17eb457a24b6c18793e8638f4d1ab413a61f1bffd2b230ed9ca3efea44e4946e" + }, + "recompute": { + "path": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/recompute/p0064-b1-full.pt", + "sha256": "0a1855ffbb676285ec28148412dd7e1109f9f3a90510ffc282807797035a0d77" + } + } + }, + "p0064-b1-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/rollout/p0064-b1-chunked.pt", + "sha256": "fa86df15c73037b1874708b4d3409d80c7c4b9acad273858d1c4e65887356dc3" + }, + "recompute": { + "path": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/recompute/p0064-b1-chunked.pt", + "sha256": "6b2ada463357dfdc2110459b18f10bbc846780d980cf9b3f0a32939f4688bbab" + } + } + }, + "p0064-b4-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/rollout/p0064-b4-full.pt", + "sha256": "9ed6636d71b9b70aa9ff076c23fa544fb356e75391993745814a183844b68197" + }, + "recompute": { + "path": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/recompute/p0064-b4-full.pt", + "sha256": "723a543d610521b8537866da2362ff232e88e7e81311551fe1e855c96298191a" + } + } + }, + "p0064-b4-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/rollout/p0064-b4-chunked.pt", + "sha256": "2cb6a0d2384af07b5200c81e60d9432e00d28e07f2c517bfea967fe9dfa25fe2" + }, + "recompute": { + "path": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/recompute/p0064-b4-chunked.pt", + "sha256": "cd66899e0aad07ba379b03bbd3fbb83ec67c8300ebcfed463567d21eb0f7cbe5" + } + } + }, + "p0256-b1-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/rollout/p0256-b1-full.pt", + "sha256": "a69e96c2d941b3d09e60d3b8ba2d5c10953b2099653c46e4e5fc80a6bbef525d" + }, + "recompute": { + "path": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/recompute/p0256-b1-full.pt", + "sha256": "5951ee4ce6760ee6f8c6686f0c0365ada21049fa712386381e732fef654a9944" + } + } + }, + "p0256-b1-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/rollout/p0256-b1-chunked.pt", + "sha256": "316405eee52a661eecf65d557d4af8abf66f2d85afc97e320a80e33a0373fe90" + }, + "recompute": { + "path": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/recompute/p0256-b1-chunked.pt", + "sha256": "d39142d681d773f8ac300f72dfd6e470cb1edc6eeda8e1b52184f15a8496730f" + } + } + }, + "p0256-b4-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/rollout/p0256-b4-full.pt", + "sha256": "f716d89e9461687b7da3249c4913d6291764b85fa479aeb830fe36c6f3b9b625" + }, + "recompute": { + "path": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/recompute/p0256-b4-full.pt", + "sha256": "a2e83c3ef3b92bb1e01e4e79bcb00c324764d3516cee38cd91776ee4cd0ea284" + } + } + }, + "p0256-b4-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/rollout/p0256-b4-chunked.pt", + "sha256": "5d1d4e0b2e83fd96f62341f71b49f04dd801773231028bbf5325b7526377ce72" + }, + "recompute": { + "path": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/recompute/p0256-b4-chunked.pt", + "sha256": "a124e4560b84cd16427f3d817c71976773b1c2ea667d6cdc835c591612cd6bb8" + } + } + }, + "p1024-b1-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/rollout/p1024-b1-full.pt", + "sha256": "a0d73a287b43b834afb617f39a59f8abd0d1bd5978a0bdb300a152f0c76381bb" + }, + "recompute": { + "path": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/recompute/p1024-b1-full.pt", + "sha256": "8a3ad53281e27fb377cd6da45a501ad0024a4e4ad78dfaba215914bff4b81d2d" + } + } + }, + "p1024-b1-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/rollout/p1024-b1-chunked.pt", + "sha256": "0ce643de41d46c652fad5494e4db7bf79056908832e0b0e79ab9b5a34cd7bdba" + }, + "recompute": { + "path": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/recompute/p1024-b1-chunked.pt", + "sha256": "70d5a7ccec42b4898ed08979452474b59dcc1040ad9b9ab65b101ffeb017ba4c" + } + } + }, + "p1024-b4-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/rollout/p1024-b4-full.pt", + "sha256": "657a0666eb80f227179b34b636c16c5a00baeb5ee08c20e94b65f3f66b8b3a2c" + }, + "recompute": { + "path": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/recompute/p1024-b4-full.pt", + "sha256": "a3a5f20a5ebff97ed5b0e8f5c9ae08b8683573d93cbe3c2740a3dc1549e3b6c3" + } + } + }, + "p1024-b4-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/rollout/p1024-b4-chunked.pt", + "sha256": "d684975102c6c3789bee6911c5c33c86ec94d2d6095d1b16f47258c0ed7db10a" + }, + "recompute": { + "path": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/recompute/p1024-b4-chunked.pt", + "sha256": "d9f7ab15056d3d534fd85fca13c47b805b64d2dd9f3c57019f2f0e73a21218c8" + } + } + } + }, + "processes": { + "rollout": { + "pid": 1455011, + "exit_code": 0, + "log": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/rollout.log", + "gpu_release_verified": true + }, + "recompute": { + "pid": 1477736, + "exit_code": 0, + "log": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/recompute.log", + "gpu_release_verified": true + } + }, + "worker_results": { + "rollout": { + "path": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/rollout/worker-result.json", + "sha256": "2d26fa53d71c22a501e0a1c26002be9aa540224ef2f089eb39d6fa57afcda90e" + }, + "recompute": { + "path": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/recompute/worker-result.json", + "sha256": "dca8819a512f5415be59fab2ff6a75dfcfdb174ac4286377412ab87275b2e4b1" + } + }, + "raw_bit_comparison": true, + "logits_dtype": "bfloat16", + "logprobs_dtype": "float32", + "response_length": 16, + "vocab_size": 151936, + "provider_binary": { + "path": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/provider-binary.json", + "sha256": "195661be4da36f46f3a07a7149242374ba302250b4ee9ce4aa678d705dfcfe2e" + } +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/train/operators.json b/docs/usage/evidence/qwen3-next-chain-b200/train/operators.json new file mode 100644 index 000000000..500251cce --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/train/operators.json @@ -0,0 +1,304 @@ +{ + "scope": "qwen3_next_operators_only", + "status": "passed", + "suite": "all", + "diagnostic_only": false, + "full_model_l2": "not_evaluated", + "git_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "git_dirty": false, + "versions": { + "torch": "2.13.0", + "vllm": "0.30.0", + "transformers": "5.17.0", + "triton": "3.7.1" + }, + "mandatory_case_ids": [ + "tests/check_qwen3_next_attention.py::test_d256_backward_with_cached_prefix_matches_float64_formula", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[1024]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[256]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[64]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[8]", + "tests/check_qwen3_next_attention.py::test_d256_input_device_guard_and_nondefault_stream", + "tests/check_qwen3_next_attention.py::test_native_backward_rejects_malformed_probability_and_gradient_buffers", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[0]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[2]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_target_inputs_do_not_depend_on_companions", + "tests/check_qwen3_next_batch_invariance.py::test_triton_chunked_prefill_is_batch_invariant", + "tests/check_qwen3_next_conv_bridge.py::test_chunked_and_reordered_sequences_match", + "tests/check_qwen3_next_conv_bridge.py::test_empty_sequence_preserves_cache_and_gradients", + "tests/check_qwen3_next_conv_bridge.py::test_response_gradient_reaches_prompt_and_convolution_weight", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths0]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths1]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths2]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-4]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[1]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[4]", + "tests/check_qwen3_next_core_matrix.py::test_variable_lengths_empty_and_mixed_step_match_independent_sequences", + "tests/check_qwen3_next_forward.py::test_combine_has_fixed_route_order_and_differentiable_weights", + "tests/check_qwen3_next_forward.py::test_full_vocabulary_logprob_entropy_modes_and_gradient", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_fail_closed_on_the_tensor_descriptor_path", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[128]", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[512]", + "tests/check_qwen3_next_forward.py::test_logprob_nan_rejected_before_comparison", + "tests/check_qwen3_next_forward.py::test_moe_vjp_matches_independent_double_formula", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[1024-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[128-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-16]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-256]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-3072]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-37984]", + "tests/check_qwen3_next_forward.py::test_qwen_moe_actual_tp4_shapes_and_independent_training_forward", + "tests/check_qwen3_next_forward.py::test_route_weights_are_batch_invariant", + "tests/check_qwen3_next_forward.py::test_shared_linear_vjp_and_empty_tokens", + "tests/check_qwen3_next_forward.py::test_stable_route_tie_boundary_and_router_gradient", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_backward_matches_recomputed_recurrence_vjp", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_forward_is_provider_exact_and_does_not_mutate_inputs", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_keeps_prompt_state_gradient_through_response", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[False]", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[True]", + "tests/check_qwen3_next_gdn_bridge.py::test_initial_state_vjp_matches_provider_directional_difference", + "tests/check_qwen3_next_gdn_sequence.py::test_1024_token_chunk_continuation_is_bitwise_exact", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad0]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad1]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad2]", + "tests/check_qwen3_next_gdn_sequence.py::test_chunk_boundary_retains_prompt_and_initial_state_gradients", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths0]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths1]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths2]", + "tests/check_qwen3_next_gdn_sequence.py::test_reserved_and_duplicate_slots_are_rejected", + "tests/check_qwen3_next_norm_providers.py::test_custom_op_has_distinct_native_and_cuda_paths", + "tests/check_qwen3_next_norm_providers.py::test_gdn_decode_provider_env_defaults_are_recorded", + "tests/check_qwen3_next_norm_providers.py::test_our_gated_op_is_batch_invariant", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_cuda]", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_native]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots0]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots2]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots3]", + "tests/check_qwen3_next_shared_core.py::test_independent_training_forward_matches_inference_and_retains_gradients", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[1024]", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[8]", + "tests/check_qwen3_next_shared_core.py::test_unimplemented_provider_profile_is_rejected", + "tests/test_qwen3_next_norm.py::test_bad_weight_shape_raises", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[16]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[1]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[2]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[32]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[48]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[64]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[8]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[128]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[2048]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_with_padding", + "tests/test_qwen3_next_norm.py::test_call_matches_forward", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[128]", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[2048]", + "tests/test_qwen3_next_norm.py::test_cuda_default_offset_preserves_plain_convention", + "tests/test_qwen3_next_norm.py::test_cuda_gated_backward_matches_autograd_golden", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_matches_golden_within_contract", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_bad_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_mismatched_gate", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_backward_uses_the_sigmoid_derivative", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_swish_is_an_alias_for_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_unit_weight_is_plain_norm_times_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_weight_offset_is_applied_in_fp32", + "tests/test_qwen3_next_norm.py::test_cuda_gated_wrapper_rejects_equal_numel_wrong_shape", + "tests/test_qwen3_next_norm.py::test_cuda_gated_zero_gate_zeroes_output", + "tests/test_qwen3_next_norm.py::test_cuda_offset_equals_explicit_fp32_weight", + "tests/test_qwen3_next_norm.py::test_cuda_offset_is_not_folded_through_bfloat16", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_backward_is_offset_aware", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_within_tolerance_of_golden", + "tests/test_qwen3_next_norm.py::test_deterministic_repeat", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype0]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype1]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype2]", + "tests/test_qwen3_next_norm.py::test_eps_inside_sqrt", + "tests/test_qwen3_next_norm.py::test_gated_batch_invariance_slice", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedHFOp]", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedOp]", + "tests/test_qwen3_next_norm.py::test_gated_conventions_diverge_in_low_precision", + "tests/test_qwen3_next_norm.py::test_gated_cuda_op_rejects_bad_activation_at_construction", + "tests/test_qwen3_next_norm.py::test_gated_extension_handles_empty_batch_and_nondefault_stream", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[dy_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[gate_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[rstd_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_shape]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_matches_hf_formula_fp32", + "tests/test_qwen3_next_norm.py::test_gated_shape_mismatch_raises", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_strict_matches_vllm_formula_fp32", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[128]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[2048]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_offset_applied_in_fp32_not_folded_into_bf16", + "tests/test_qwen3_next_norm.py::test_op_batch_invariance_on_device", + "tests/test_qwen3_next_norm.py::test_plain_reference_is_unchanged_by_the_offset_plumbing", + "tests/test_qwen3_next_norm.py::test_weight_offset_is_one", + "tests/test_qwen3_next_norm.py::test_zero_centred_cuda_constructor_rejects_missing_extension", + "tests/test_qwen3_next_norm.py::test_zero_centred_op_inherits_the_plain_reference", + "tests/test_qwen3_next_norm.py::test_zero_weight_is_identity_scaling" + ], + "case_ids_sha256": "694c931b65f9cfa5db963f2eca6d11bd309546c824a1df52f9da2ab128e83e0f", + "pytest_exit_code": 0, + "provider_tests": { + "tests": 233, + "failures": 0, + "errors": 0, + "skipped": 0 + }, + "norm_gates": { + "qwen3_next_rms_norm-forward.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + }, + "qwen3_next_rms_norm-gradient.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + }, + "rms_norm_gated-forward.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + }, + "rms_norm_gated-gradient.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + } + } +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/train/reload.json b/docs/usage/evidence/qwen3-next-chain-b200/train/reload.json new file mode 100644 index 000000000..a4863e79b --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/train/reload.json @@ -0,0 +1,2021 @@ +{ + "schema_version": 1, + "status": "passed", + "scope": "qwen3_next_training_and_reload", + "identity": { + "scheduler_profile_certificate": { + "path": "/result.json", + "sha256": "bf3a74423b3636145cad903d5cf9d70f2c3c777b019a24d125c2ca79f8b1e8d9" + }, + "source_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "checkpoint": "", + "weight_version": "baseline", + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "architecture_layers": 48, + "weights_dtype": "bfloat16", + "recurrent_state_dtype": "float32" + }, + "training_identity": { + "scheduler_profile_certificate": { + "path": "/result.json", + "sha256": "bf3a74423b3636145cad903d5cf9d70f2c3c777b019a24d125c2ca79f8b1e8d9" + }, + "source_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "checkpoint": "", + "weight_version": "baseline", + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "architecture_layers": 48, + "weights_dtype": "bfloat16", + "recurrent_state_dtype": "float32", + "run_id": "20261009T041838Z-train1-c67ec144-39e7db9f", + "execution_id": "39e7db9f488142f4b52872e05728c390", + "fixture_sha256": "7c98e4e17cc24bd0c5f65f6515d58a9dfc947afcdb6d4956bd3fa05f24bb28b6" + }, + "required_sections": [ + "baseline", + "update1", + "update2", + "reload", + "continuous_step3", + "resumed_step3", + "checkpoint", + "fault_injection" + ], + "l2_fixture_sha256": "b59298acf5ecbe64abb4639e7596e052f1993ee5e3c7289b63738f1b04463d01", + "l2_reports": { + "baseline": { + "path": "/attempts/0/l2-matrix.json", + "sha256": "bf9da6060e882fb3707df9093e63a4c6e6664e8a75f25e9809020c4f687bf953" + }, + "update1": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/l2-matrix.json", + "sha256": "ad78b78687d2ef725a24b42de908033b36383f69db41d2c754f87acb07cd9870" + }, + "update2": { + "path": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/l2-matrix.json", + "sha256": "e8b9ee250133e40cf2f28134bb4b77f6ec18bb970c37a9702590284e2c570893" + }, + "reload": { + "path": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/l2-matrix.json", + "sha256": "93f6e8ca16a9286945b73fd46888b72db923454be730edde5232a3ffb041b414" + } + }, + "workers": { + "update1": { + "path": "/attempts/0/update1-2c4f847affb0420d9622f1b699393898/worker.json", + "sha256": "b2c74ebcb2b5e538bbaf5e50439615722f26876df3cd34610ded097ee6102436" + }, + "update2": { + "path": "/attempts/0/update2-57420c4714024856bad2f2d1fa960e15/worker.json", + "sha256": "b30f31ad229c12f2c710a5267f9c8eea37ff9da08a2681158279633e2777cf47" + }, + "reload": { + "path": "/attempts/0/reload-562bd948210c4256a10db68a19bdd77e/worker.json", + "sha256": "447b8ac6d7cb5db7e5996f6a8ea7b1a496e51354fce80a38540297af524d6271" + }, + "continuous": { + "path": "/attempts/0/continuous-77caf14fe2b842108f863c8cd8d7f67c/worker.json", + "sha256": "d7a2a3feb4fda03e2f7c0badf8a352c6519eec63114e60373b33d71212f051b9" + }, + "resumed": { + "path": "/attempts/0/resumed-4b438816c03647029cdfeebe981bb0ed/worker.json", + "sha256": "8cb5be8b9ec2c49425af9e2725ca3bc972456f6f66454f9820d066e25f34e02a" + } + }, + "events": [ + "l2:baseline", + "worker:update1", + "l2:update1", + "worker:update2", + "l2:update2", + "worker:reload", + "l2:reload", + "worker:continuous", + "worker:resumed" + ], + "recovery": [ + { + "schema_version": 1, + "scope": "qwen3_next_retirement", + "identity": { + "scheduler_profile_certificate": { + "path": "/result.json", + "sha256": "bf3a74423b3636145cad903d5cf9d70f2c3c777b019a24d125c2ca79f8b1e8d9" + }, + "source_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "checkpoint": "", + "weight_version": "baseline", + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "architecture_layers": 48, + "weights_dtype": "bfloat16", + "recurrent_state_dtype": "float32", + "run_id": "20261009T041838Z-train1-c67ec144-39e7db9f", + "execution_id": "39e7db9f488142f4b52872e05728c390", + "fixture_sha256": "7c98e4e17cc24bd0c5f65f6515d58a9dfc947afcdb6d4956bd3fa05f24bb28b6" + }, + "target": "step-00000002-8e604f14d0b04929abfbfb8e584b39bf.partial", + "tombstone": ".step-00000002-8e604f14d0b04929abfbfb8e584b39bf.partial.deleting", + "status": "retired", + "proof": { + "schema_version": 1, + "scope": "qwen3_next_staging_intent", + "identity": { + "scheduler_profile_certificate": { + "path": "/result.json", + "sha256": "bf3a74423b3636145cad903d5cf9d70f2c3c777b019a24d125c2ca79f8b1e8d9" + }, + "source_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "checkpoint": "", + "weight_version": "baseline", + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "architecture_layers": 48, + "weights_dtype": "bfloat16", + "recurrent_state_dtype": "float32", + "run_id": "20261009T041838Z-train1-c67ec144-39e7db9f", + "execution_id": "39e7db9f488142f4b52872e05728c390", + "fixture_sha256": "7c98e4e17cc24bd0c5f65f6515d58a9dfc947afcdb6d4956bd3fa05f24bb28b6" + }, + "staging": "step-00000002-8e604f14d0b04929abfbfb8e584b39bf.partial", + "published": "step-00000002-8e604f14d0b04929abfbfb8e584b39bf", + "metadata": { + "schema_version": 1, + "scope": "native_vime_training_checkpoint", + "status": "staging", + "identity": { + "scheduler_profile_certificate": { + "path": "/result.json", + "sha256": "bf3a74423b3636145cad903d5cf9d70f2c3c777b019a24d125c2ca79f8b1e8d9" + }, + "source_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "checkpoint": "", + "weight_version": "baseline", + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "architecture_layers": 48, + "weights_dtype": "bfloat16", + "recurrent_state_dtype": "float32", + "run_id": "20261009T041838Z-train1-c67ec144-39e7db9f", + "execution_id": "39e7db9f488142f4b52872e05728c390", + "fixture_sha256": "7c98e4e17cc24bd0c5f65f6515d58a9dfc947afcdb6d4956bd3fa05f24bb28b6" + }, + "step": 2, + "sample_position": 8 + } + } + }, + { + "reason": "repeat_final_reload_and_controls_in_fresh_train_run", + "from_attempt": "0", + "to_attempt": "retired-for-fresh-train-run", + "events": [ + "worker:reload", + "l2:reload", + "worker:continuous", + "worker:resumed" + ], + "workers": { + "reload": { + "path": "/20261009T215349Z-train-c67ec144-779ba23f/attempts/0/reload-359caafa0c484faba4a052c355c59259/worker.json", + "sha256": "1d3707e09137bc856206dd4630575be64ed5c891928195682f189803bc550a39" + }, + "continuous": { + "path": "/20261009T215349Z-train-c67ec144-779ba23f/attempts/0/continuous-b9d0eedd6f804e8da5d51bc6a6763497/worker.json", + "sha256": "f00a92b1d4fde215aef304f5d22d6dad40c86d3ec2a34102a7c65d0b3b8616b1" + }, + "resumed": { + "path": "/20261010T112219Z-train-c67ec144-40996158/attempts/0/resumed-4c0c9f145a3b4a3c882d778bc4817e0b/worker.json", + "sha256": "3b137d58e33af3056265c08abcb9964bdf0f6313dff439f6fce367fea14cb767" + } + }, + "l2_report": { + "path": "/20261009T215349Z-train-c67ec144-779ba23f/attempts/0/reload-l2-877b875589944f6691279aa5d21d6076/l2-matrix.json", + "sha256": "e2857dc09998840674af4f12ced018439b5fffc42f74530860d6bf22cbc8e4b1" + } + }, + { + "reason": "repeat_final_reload_and_controls_in_fresh_train_run", + "from_attempt": "0", + "to_attempt": "retired-for-fresh-train-run", + "events": [ + "worker:reload", + "l2:reload" + ], + "workers": { + "reload": { + "path": "/20261010T131621Z-train-c67ec144-219cc1ac/attempts/0/reload-ef19c6c64157400a84f8a0ed0e579996/worker.json", + "sha256": "85cd41ecb5f52ed55febf74a62150c399299f63800117775f7047f381cd606c3" + } + }, + "l2_report": { + "path": "/20261010T131621Z-train-c67ec144-219cc1ac/attempts/0/reload-l2-fc6185ab0eb740d58ff153cb0c40c44a/l2-matrix.json", + "sha256": "1076eb467b5fb0b97982b8a31ff3b03aec5858cb43ea5f50eee5e5120ae34356" + } + } + ], + "reload_matches_update2": { + "status": "passed", + "raw_bit_comparison": true, + "case_ids": [ + "p0008-b1-full", + "p0008-b1-chunked", + "p0008-b4-full", + "p0008-b4-chunked", + "p0064-b1-full", + "p0064-b1-chunked", + "p0064-b4-full", + "p0064-b4-chunked", + "p0256-b1-full", + "p0256-b1-chunked", + "p0256-b4-full", + "p0256-b4-chunked", + "p1024-b1-full", + "p1024-b1-chunked", + "p1024-b4-full", + "p1024-b4-chunked" + ], + "cases": { + "p0008-b1-full": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "p0008-b1-chunked": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "p0008-b4-full": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "p0008-b4-chunked": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "p0064-b1-full": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "p0064-b1-chunked": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "p0064-b4-full": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "p0064-b4-chunked": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "p0256-b1-full": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "p0256-b1-chunked": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "p0256-b4-full": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "p0256-b4-chunked": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "p1024-b1-full": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "p1024-b1-chunked": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "p1024-b4-full": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "p1024-b4-chunked": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + } + } + }, + "checkpoint": { + "path": "/training-state/checkpoints/step-00000002-3bce5b5d91b045a1bbdb4f8ef235d1b6", + "sha256": "8906eaf4e2bee9d1aec783a6086e1a09b89b7da1a37525c6464aa922fec0e691" + }, + "fault_injection": { + "path": "/attempts/0/checkpoint-faults/faults.json", + "sha256": "7db734f99dc3d6d9b23569aced1062b09cd22ae9ac4531a8eee03939a8bfcd52" + }, + "attempt": "0" +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/train/result.json b/docs/usage/evidence/qwen3-next-chain-b200/train/result.json new file mode 100644 index 000000000..5eada5e19 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/train/result.json @@ -0,0 +1,776 @@ +{ + "contract_version": 4, + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "cuda_identity": { + "home": "", + "nvcc_sha256": "b8e2347d9d7fcadf8812a27324d515de99d033d3e48611811ece7e66d7895f8a" + }, + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "operator_requirements": { + "suite": "all", + "case_ids": [ + "tests/check_qwen3_next_attention.py::test_d256_backward_with_cached_prefix_matches_float64_formula", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[1024]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[256]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[64]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[8]", + "tests/check_qwen3_next_attention.py::test_d256_input_device_guard_and_nondefault_stream", + "tests/check_qwen3_next_attention.py::test_native_backward_rejects_malformed_probability_and_gradient_buffers", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[0]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[2]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_target_inputs_do_not_depend_on_companions", + "tests/check_qwen3_next_batch_invariance.py::test_triton_chunked_prefill_is_batch_invariant", + "tests/check_qwen3_next_conv_bridge.py::test_chunked_and_reordered_sequences_match", + "tests/check_qwen3_next_conv_bridge.py::test_empty_sequence_preserves_cache_and_gradients", + "tests/check_qwen3_next_conv_bridge.py::test_response_gradient_reaches_prompt_and_convolution_weight", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths0]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths1]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths2]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-4]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[1]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[4]", + "tests/check_qwen3_next_core_matrix.py::test_variable_lengths_empty_and_mixed_step_match_independent_sequences", + "tests/check_qwen3_next_forward.py::test_combine_has_fixed_route_order_and_differentiable_weights", + "tests/check_qwen3_next_forward.py::test_full_vocabulary_logprob_entropy_modes_and_gradient", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_fail_closed_on_the_tensor_descriptor_path", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[128]", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[512]", + "tests/check_qwen3_next_forward.py::test_logprob_nan_rejected_before_comparison", + "tests/check_qwen3_next_forward.py::test_moe_vjp_matches_independent_double_formula", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[1024-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[128-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-16]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-256]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-3072]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-37984]", + "tests/check_qwen3_next_forward.py::test_qwen_moe_actual_tp4_shapes_and_independent_training_forward", + "tests/check_qwen3_next_forward.py::test_route_weights_are_batch_invariant", + "tests/check_qwen3_next_forward.py::test_shared_linear_vjp_and_empty_tokens", + "tests/check_qwen3_next_forward.py::test_stable_route_tie_boundary_and_router_gradient", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_backward_matches_recomputed_recurrence_vjp", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_forward_is_provider_exact_and_does_not_mutate_inputs", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_keeps_prompt_state_gradient_through_response", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[False]", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[True]", + "tests/check_qwen3_next_gdn_bridge.py::test_initial_state_vjp_matches_provider_directional_difference", + "tests/check_qwen3_next_gdn_sequence.py::test_1024_token_chunk_continuation_is_bitwise_exact", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad0]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad1]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad2]", + "tests/check_qwen3_next_gdn_sequence.py::test_chunk_boundary_retains_prompt_and_initial_state_gradients", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths0]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths1]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths2]", + "tests/check_qwen3_next_gdn_sequence.py::test_reserved_and_duplicate_slots_are_rejected", + "tests/check_qwen3_next_norm_providers.py::test_custom_op_has_distinct_native_and_cuda_paths", + "tests/check_qwen3_next_norm_providers.py::test_gdn_decode_provider_env_defaults_are_recorded", + "tests/check_qwen3_next_norm_providers.py::test_our_gated_op_is_batch_invariant", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_cuda]", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_native]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots0]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots2]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots3]", + "tests/check_qwen3_next_shared_core.py::test_independent_training_forward_matches_inference_and_retains_gradients", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[1024]", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[8]", + "tests/check_qwen3_next_shared_core.py::test_unimplemented_provider_profile_is_rejected", + "tests/test_qwen3_next_norm.py::test_bad_weight_shape_raises", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[16]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[1]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[2]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[32]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[48]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[64]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[8]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[128]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[2048]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_with_padding", + "tests/test_qwen3_next_norm.py::test_call_matches_forward", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[128]", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[2048]", + "tests/test_qwen3_next_norm.py::test_cuda_default_offset_preserves_plain_convention", + "tests/test_qwen3_next_norm.py::test_cuda_gated_backward_matches_autograd_golden", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_matches_golden_within_contract", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_bad_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_mismatched_gate", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_backward_uses_the_sigmoid_derivative", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_swish_is_an_alias_for_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_unit_weight_is_plain_norm_times_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_weight_offset_is_applied_in_fp32", + "tests/test_qwen3_next_norm.py::test_cuda_gated_wrapper_rejects_equal_numel_wrong_shape", + "tests/test_qwen3_next_norm.py::test_cuda_gated_zero_gate_zeroes_output", + "tests/test_qwen3_next_norm.py::test_cuda_offset_equals_explicit_fp32_weight", + "tests/test_qwen3_next_norm.py::test_cuda_offset_is_not_folded_through_bfloat16", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_backward_is_offset_aware", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_within_tolerance_of_golden", + "tests/test_qwen3_next_norm.py::test_deterministic_repeat", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype0]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype1]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype2]", + "tests/test_qwen3_next_norm.py::test_eps_inside_sqrt", + "tests/test_qwen3_next_norm.py::test_gated_batch_invariance_slice", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedHFOp]", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedOp]", + "tests/test_qwen3_next_norm.py::test_gated_conventions_diverge_in_low_precision", + "tests/test_qwen3_next_norm.py::test_gated_cuda_op_rejects_bad_activation_at_construction", + "tests/test_qwen3_next_norm.py::test_gated_extension_handles_empty_batch_and_nondefault_stream", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[dy_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[gate_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[rstd_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_shape]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_matches_hf_formula_fp32", + "tests/test_qwen3_next_norm.py::test_gated_shape_mismatch_raises", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_strict_matches_vllm_formula_fp32", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[128]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[2048]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_offset_applied_in_fp32_not_folded_into_bf16", + "tests/test_qwen3_next_norm.py::test_op_batch_invariance_on_device", + "tests/test_qwen3_next_norm.py::test_plain_reference_is_unchanged_by_the_offset_plumbing", + "tests/test_qwen3_next_norm.py::test_weight_offset_is_one", + "tests/test_qwen3_next_norm.py::test_zero_centred_cuda_constructor_rejects_missing_extension", + "tests/test_qwen3_next_norm.py::test_zero_centred_op_inherits_the_plain_reference", + "tests/test_qwen3_next_norm.py::test_zero_weight_is_identity_scaling" + ], + "case_ids_sha256": "694c931b65f9cfa5db963f2eca6d11bd309546c824a1df52f9da2ab128e83e0f", + "norm_gates": [ + "qwen3_next_rms_norm-forward.json", + "qwen3_next_rms_norm-gradient.json", + "rms_norm_gated-forward.json", + "rms_norm_gated-gradient.json" + ] + }, + "layer_requirements": { + "schema_version": 1, + "gates": { + "gdn": { + "script": "scripts/qwen3_next_tp_gdn_check.py", + "output_option": "--output", + "scope": "tp4_gdn_layer0", + "groups": { + "cases": [ + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "prompt-gradient", + "replicated-norm-gradient", + "hf-load-export" + ] + }, + "script_sha256": "cc4338893f90af004c51c20fc67d1a9a3f4bf8d26775277f72671c02983e4df5" + }, + "attention": { + "script": "scripts/qwen3_next_tp_attention_check.py", + "output_option": "--output", + "scope": "tp4_full_attention_layer3", + "groups": { + "attention.cases": [ + "hf-load-export", + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "batch4-varlen-reorder", + "sixteen-token-decode", + "prompt-gradient", + "kv-pair-gradient", + "qk-norm-gradient" + ] + }, + "script_sha256": "d27d43efb05415a8ef5892c3c2238a2b9744a4821f5466faf46c6510e6e01bec" + }, + "moe": { + "script": "scripts/qwen3_next_tp_moe_check.py", + "output_option": "--output", + "scope": "tp4_moe_block_layer0", + "groups": { + "moe.cases": [ + "hf-load-export-all512experts", + "routes-replicated-8", + "full-chunk-reorder-8", + "routes-replicated-64", + "full-chunk-reorder-64", + "routes-replicated-256", + "full-chunk-reorder-256", + "routes-replicated-1024", + "full-chunk-reorder-1024", + "training-forward", + "all-parameter-gradient", + "replicated-router-gradient" + ] + }, + "script_sha256": "d5c1bbbb82e408b65871b0cb1638d7a6cf8cfe07f0a3315a657b7dc232d544be" + }, + "adapters": { + "script": "scripts/qwen3_next_adapter_check.py", + "output_option": "--out", + "scope": "gdn_engine_adapter_component", + "groups": { + "cases": [ + "batch1-length8", + "batch1-length64", + "batch1-length256", + "batch1-length1024", + "batch4-length8", + "batch4-length64", + "batch4-length256", + "batch4-length1024", + "mixed-prefill-decode16-reorder" + ] + }, + "fields": { + "prompt_gradient": "passed", + "hf_conv_roundtrip": "passed", + "batch_invariance_capability_registered": false + }, + "script_sha256": "3ce45bb317237c1a06533116d65fb77c2a23b6f503ae46406ede543036eb0f20" + }, + "heads": { + "script": "scripts/qwen3_next_tp_head_check.py", + "output_option": "--output", + "scope": "tp4_embedding_lm_head_only", + "groups": { + "cases": [ + "hf-embedding-roundtrip", + "hf-lm-head-roundtrip", + "replicated-norm-gradient", + "nonzero-finite-embedding-head-gradient", + "embedding-repeat-100", + "batch-invariant-prompt8", + "batch-invariant-prompt64", + "batch-invariant-prompt256", + "batch-invariant-prompt1024", + "logprob-original-and-promoted-logits", + "entropy-interface" + ] + }, + "script_sha256": "0504185d21a75405c8e994bc57b016cf4ec357d8b16e7430772c11934f2af876" + } + }, + "scheduler_case_ids": [ + "p0008-b1-full", + "p0008-b1-chunked", + "p0008-b4-full", + "p0008-b4-chunked", + "p0064-b1-full", + "p0064-b1-chunked", + "p0064-b4-full", + "p0064-b4-chunked", + "p0256-b1-full", + "p0256-b1-chunked", + "p0256-b4-full", + "p0256-b4-chunked", + "p1024-b1-full", + "p1024-b1-chunked", + "p1024-b4-full", + "p1024-b4-chunked" + ], + "registry_sha256": "e3949a750cb27c1897a000f3b023f912629906612ae8949c1575d0acc36df5ec", + "case_ids_per_rank": [ + "adapters/cases/batch1-length1024", + "adapters/cases/batch1-length256", + "adapters/cases/batch1-length64", + "adapters/cases/batch1-length8", + "adapters/cases/batch4-length1024", + "adapters/cases/batch4-length256", + "adapters/cases/batch4-length64", + "adapters/cases/batch4-length8", + "adapters/cases/mixed-prefill-decode16-reorder", + "attention/attention.cases/batch4-varlen-reorder", + "attention/attention.cases/full-chunk-1024", + "attention/attention.cases/full-chunk-256", + "attention/attention.cases/full-chunk-64", + "attention/attention.cases/full-chunk-8", + "attention/attention.cases/hf-load-export", + "attention/attention.cases/kv-pair-gradient", + "attention/attention.cases/prompt-gradient", + "attention/attention.cases/qk-norm-gradient", + "attention/attention.cases/sixteen-token-decode", + "gdn/cases/full-chunk-1024", + "gdn/cases/full-chunk-256", + "gdn/cases/full-chunk-64", + "gdn/cases/full-chunk-8", + "gdn/cases/hf-load-export", + "gdn/cases/prompt-gradient", + "gdn/cases/replicated-norm-gradient", + "heads/cases/batch-invariant-prompt1024", + "heads/cases/batch-invariant-prompt256", + "heads/cases/batch-invariant-prompt64", + "heads/cases/batch-invariant-prompt8", + "heads/cases/embedding-repeat-100", + "heads/cases/entropy-interface", + "heads/cases/hf-embedding-roundtrip", + "heads/cases/hf-lm-head-roundtrip", + "heads/cases/logprob-original-and-promoted-logits", + "heads/cases/nonzero-finite-embedding-head-gradient", + "heads/cases/replicated-norm-gradient", + "moe/moe.cases/all-parameter-gradient", + "moe/moe.cases/full-chunk-reorder-1024", + "moe/moe.cases/full-chunk-reorder-256", + "moe/moe.cases/full-chunk-reorder-64", + "moe/moe.cases/full-chunk-reorder-8", + "moe/moe.cases/hf-load-export-all512experts", + "moe/moe.cases/replicated-router-gradient", + "moe/moe.cases/routes-replicated-1024", + "moe/moe.cases/routes-replicated-256", + "moe/moe.cases/routes-replicated-64", + "moe/moe.cases/routes-replicated-8", + "moe/moe.cases/training-forward" + ], + "case_ids_sha256": "be74417dfbd6031ba27978d06d04bb15daaab2aeb57d132c7e0d41176b28b46e" + }, + "source_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "run_id": "20261010T214117Z-train-c67ec144-7e890f95", + "stage": "train", + "suite": "all", + "execution_id": "7e890f95d1a44db88c4d6cdc87d35b7c", + "attempt": "0", + "status": "passed", + "phase": "complete", + "scope": "qwen3_next_training_and_reload", + "full_model_l2": "passed", + "evidence": { + "updates": { + "path": "attempts/0/training-report.json", + "sha256": "421060251897952c49847746b5368ceb0d604a39acbe27464debe071e48c8d85" + }, + "reload": { + "path": "attempts/0/reload.json", + "sha256": "421060251897952c49847746b5368ceb0d604a39acbe27464debe071e48c8d85" + }, + "l2_matrix": { + "path": "attempts/0/l2-matrix.json", + "sha256": "93f6e8ca16a9286945b73fd46888b72db923454be730edde5232a3ffb041b414" + }, + "operators": { + "path": "attempts/0/operators.json", + "sha256": "dedb24b6ac2a01d37eb795a001376ca0b200a03e417f8131688aac67c19c2ebd" + }, + "environment": { + "path": "attempts/0/environment.json", + "sha256": "8995c18e760260c0e715fe899574c7812b05fa302aee449837b42f0302a9efe6" + } + }, + "training_and_reload": "passed" +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/train/run.json b/docs/usage/evidence/qwen3-next-chain-b200/train/run.json new file mode 100644 index 000000000..7c5e5250e --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/train/run.json @@ -0,0 +1,5252 @@ +{ + "run_id": "20261010T214117Z-train-c67ec144-7e890f95", + "execution_id": "7e890f95d1a44db88c4d6cdc87d35b7c", + "contract_version": 4, + "suite": "all", + "execution_gpus": 4, + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "stage": "train", + "source_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "source": "/source", + "python": "", + "cuda_home": "", + "checkpoint": "", + "memory": "1280G", + "previous": "", + "status": "prepared", + "full_model_l2": "not_evaluated", + "environment": { + "identity": { + "base_prefix": "/miniconda3/envs/rlkernel", + "binary": "/python3.12", + "binary_sha256": "6a1eb3ffc29f3a6b0ece607b016b4cfa5ca3ac57b34f17ed3266b404f78d2729", + "build_tools": { + "ninja": { + "path": "/miniconda3/envs/rlkernel/bin/ninja", + "sha256": "08639e194fffa7f08b259fc4abfa4803aff66b64de52549cee42ec527d55cea6" + } + }, + "distributions": [ + { + "direct_url": null, + "metadata_sha256": "6f1038270be40f9b8c0bcf391c627e7d7f41ccdd19aa192d6eac1dbfc3b19abc", + "name": "GitPython", + "version": "3.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "3f71971502087521f123c9daa26bc12d31d3466738b567390b8602acad3be22a", + "name": "Jinja2", + "version": "3.1.6" + }, + { + "direct_url": null, + "metadata_sha256": "818fb343b7b6b99a32771bf4813521ae6440b4c7579b3ae46e32dd02da0afeee", + "name": "Markdown", + "version": "3.11" + }, + { + "direct_url": null, + "metadata_sha256": "dc1ee42cf8ecfeee0ab60b15b21d291833e0732548efcb7bb5b3564dca3e5bf7", + "name": "MarkupSafe", + "version": "3.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "de7389b142450a0014234286b0876f328439b823c355c73d0aed41fd67ec208c", + "name": "PyJWT", + "version": "2.15.1" + }, + { + "direct_url": null, + "metadata_sha256": "ffcad4415cafb22b8b536a61595e9ee13438b51d31b0763c1b273ce3bc58e840", + "name": "PyYAML", + "version": "6.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "8562d701cc52d9cafbb418942b0e072fc087ed8ddcf35cd10224c1b2ed8bdd91", + "name": "Pygments", + "version": "2.21.0" + }, + { + "direct_url": null, + "metadata_sha256": "b6c25fcfdcc495edf248a10ca4ad28327ef2ed6047a6ec5c6346e121414c7f21", + "name": "Werkzeug", + "version": "3.1.9" + }, + { + "direct_url": null, + "metadata_sha256": "55c400d24c71b581d9c0992f71df6047cf6c878bebe61a7d45d6e02dc0e4c510", + "name": "absl-py", + "version": "2.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "13db521f90a6a882027b2388eaa2ebf252945f9c2adb7e7e371da18239da4df0", + "name": "accelerate", + "version": "1.15.0" + }, + { + "direct_url": null, + "metadata_sha256": "86fe44e38e67872dd895c729044942ba2c2f934ae439a899fb83a186206b7fd4", + "name": "agent-detector", + "version": "2.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "afe11fe9f5aa54e734cdd51659bed8c89dc6bcd5aef0ad96f2d20149c8de5456", + "name": "aiohappyeyeballs", + "version": "2.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "570b307bc0b53fbbd3ed2ce0b7eca6bbf2fa73bf75e24a480f1034d8c0b832bf", + "name": "aiohttp", + "version": "3.14.3" + }, + { + "direct_url": null, + "metadata_sha256": "44b7f8e14c4770793e747fad50c9e0a6ee7357651d878554f192d94768dc14a8", + "name": "aiohttp-cors", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "648813a44a9ae0ab2f20ee86d2404dcc38e3f9e80c63316cf6e536735df14e54", + "name": "aiosignal", + "version": "1.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "f6a3f6668bacef7f73a2c19ccb2be910b2363d1731c4725cb04364d99e24935a", + "name": "annotated-doc", + "version": "0.0.5" + }, + { + "direct_url": null, + "metadata_sha256": "fc6d752cde6a6a4bff03474386de750e130b75da3c7815ee909f45b51fea98c8", + "name": "annotated-types", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "4e89d670a4b20029da30e5a9e8ebcbc844deff9c44209552bafd5537249c8b9e", + "name": "anthropic", + "version": "1.9.0" + }, + { + "direct_url": null, + "metadata_sha256": "b5a6f00800956387fcddab1fe1b5aa8502c249b86cfb16d58ed700f282f60142", + "name": "antlr4-python3-runtime", + "version": "4.9.3" + }, + { + "direct_url": null, + "metadata_sha256": "a6008defa9492cd08250217b134782cad1db4580e1d7ddf69cc2a2a48cea24e0", + "name": "anyio", + "version": "4.15.1" + }, + { + "direct_url": null, + "metadata_sha256": "7877c64ce8957237363f2df313819bb07f50752df016d14c5a5a99bec10f5deb", + "name": "apache-tvm-ffi", + "version": "0.1.11" + }, + { + "direct_url": null, + "metadata_sha256": "3543ca8f0e072c00ab111b20eba99ce86dbf93ada28988775bc2677284b3c07a", + "name": "astor", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "d4b328c09c024fe1e4d788a9c7715ad726095131b815cd35fd933268226f6269", + "name": "attrs", + "version": "26.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "4850c4d696a5e2a2ecbb3dd792b060acc1de79e09800669b0b9fc3a22c055e6d", + "name": "av", + "version": "19.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "863ff92208d0a02dabfa008bfe91846a5c401ded301e5687dca7dc63c911865f", + "name": "babel", + "version": "2.18.0" + }, + { + "direct_url": null, + "metadata_sha256": "f32e6df3197f05202e586624d95c5e217003d80cee655c165d533102f628df21", + "name": "backrefs", + "version": "8.0" + }, + { + "direct_url": null, + "metadata_sha256": "905c362f655fbc6d37a24686efc2b3bfbd3123b8ee5a443a43f6750d87455e90", + "name": "blake3", + "version": "1.0.10" + }, + { + "direct_url": null, + "metadata_sha256": "07c85682b6aefd5c9b48890d306c1604311902295704892ede48e5a83219a8d3", + "name": "blobfile", + "version": "3.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "2d582941a7081625a35f35a0c4a2e80f7737312e29c38e5fdb6fc08f9c113077", + "name": "bracex", + "version": "3.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "3b60c55bae0d0340c3a3fd918635bbfa3087579da66e0fd7f6be7a3782c0da3d", + "name": "cachetools", + "version": "7.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "5d11a6878d5bc3f22290281a19ef7b36daa95c910780950608b95cd788c7e12e", + "name": "cbor2", + "version": "6.1.4" + }, + { + "direct_url": null, + "metadata_sha256": "362c9942c48051f168ed2b9f2146266b7792d3c05e164cd6afc3f3b65884fdc9", + "name": "certifi", + "version": "2026.7.22" + }, + { + "direct_url": null, + "metadata_sha256": "b4abf1bcf1c1d8e0272d8007fc974499ea59e5f2a5b98af3c78a5e67515a9d87", + "name": "cffi", + "version": "2.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "766120f13c177446f51929a4d201104bc935b6d5a2a176cd6716edce757d3d95", + "name": "cfgv", + "version": "3.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "610e9a9d03ce837ffe6e42be5e02e70087f73863f7350bf7bb7f0511edcc5ec0", + "name": "charset-normalizer", + "version": "3.5.2" + }, + { + "direct_url": null, + "metadata_sha256": "7ad836b3147c9702546d9c28b4fa5be23b24445439db5d0d2a58d17281c84daa", + "name": "click", + "version": "8.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "4c5f00599ebcbf11d337e48a72784d256ca3d704fa9e9f5daadd60065e6776b7", + "name": "cloudpickle", + "version": "3.1.2" + }, + { + "direct_url": null, + "metadata_sha256": "a0970189e3ab7a596d6902d5f61f93b414f138f03d3cf19029145657bfceb382", + "name": "cmake", + "version": "4.1.2" + }, + { + "direct_url": null, + "metadata_sha256": "94a6ebf9718e55f254a43ce0d2f04e0d6d44e7141b6f3144a84feb6519a77bfd", + "name": "colorama", + "version": "0.4.6" + }, + { + "direct_url": null, + "metadata_sha256": "ca8ec227f406d970a645ec482b20619128dd34b9cf71159cc24e27db461a2711", + "name": "colorful", + "version": "0.5.8" + }, + { + "direct_url": null, + "metadata_sha256": "bbaa51b7e4d8f142bd075d01257c0572c0c844796d51426e35c8096a13e8da76", + "name": "compressed-tensors", + "version": "0.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "6063d8ff7ebc458d63a4332853d7ababf4ee2b86336362c8d2b12be6e998eb6b", + "name": "connectrpc", + "version": "0.11.1" + }, + { + "direct_url": null, + "metadata_sha256": "ac5f4b5a5f68080bd9c3fe77399fe8a1bff2ee5923c49db1df544dd054cbf15b", + "name": "cryptography", + "version": "50.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "f41d2f6b4616accca2f5e1dd47aa9e8937c28076cde698226d93e727751f3099", + "name": "cuda-bindings", + "version": "13.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "e5ca6ed34c687c6f4a4d157ad0a2cf06ec0316fe8c4c0ddeb666ad76dd6f30f4", + "name": "cuda-core", + "version": "1.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "89baadd9da23dce9990481519544115615ba3cbd2d1a41e09feea7756fffb378", + "name": "cuda-pathfinder", + "version": "1.8.2" + }, + { + "direct_url": null, + "metadata_sha256": "1ab914b9a57ca601df2e3cfe9608427b15d8afb78029076ace5d1caf9fd45f08", + "name": "cuda-python", + "version": "13.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "73d97a5eb578223b4895ef4f234574d14219cef9999ff7d0e92a3d0dd057bd3f", + "name": "cuda-tile", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "ae6f957fe66ed63081d1d83ee6e8838f3a0af2c6fce1223629d0dd6264565ead", + "name": "cuda-toolkit", + "version": "13.0.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "1f8e0ae51ad5feea63f58ed2e24f3da6f23ed548043235a14f7623d961dd9b64", + "name": "datasets", + "version": "5.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "153f4a4d6ff03dbe5c8ad7fe54bc2e7b989a4947b70f7aa77fbf652b394f2a2e", + "name": "depyf", + "version": "0.20.0" + }, + { + "direct_url": null, + "metadata_sha256": "ee09fc752d7271aac93079cfd63409957dc6b536c1ffd9355a01bf7297e72aa6", + "name": "detect-installer", + "version": "0.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "a7feab2c4f69fd5f85e5a3cb495a7f1870a6bf8199dcee5339e8118f7acbdc09", + "name": "dill", + "version": "0.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "fef3fde661fe30ba7bd1d78841a797136b2b3461705bb4eb92dc54f8308bbaae", + "name": "distlib", + "version": "0.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "fef3fde661fe30ba7bd1d78841a797136b2b3461705bb4eb92dc54f8308bbaae", + "name": "distlib", + "version": "0.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "a3ca2e39abe76c4a33d5fe4a2a84375ec9f25cdfdb7e1d8ea406bd6f1603205c", + "name": "dnspython", + "version": "2.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "92a07daad5e6ff461199de14e845d9b376e309ef916ce5379f3c9cd4e3b1623f", + "name": "dockerfile-parse", + "version": "2.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "5b566b25f0cbe4955d0b16844a7cc6d2002caa3bde2dfda7f301fd8870cbaa56", + "name": "docstring_parser", + "version": "0.18.0" + }, + { + "direct_url": null, + "metadata_sha256": "5a1080b5768c6c591e1c4f9c9812cafa808781b9eeb198043bf185e22d4a1613", + "name": "e2b", + "version": "2.51.0" + }, + { + "direct_url": null, + "metadata_sha256": "0a63979e0b946e16238e4339e60d9c1eb5a7ce3ea93dae78b5da9c65a6190540", + "name": "einops", + "version": "0.8.2" + }, + { + "direct_url": null, + "metadata_sha256": "16cbe67a57558f1d4bfdbc22a454434ba301750c57a62b1d3f5361c9e5cddc00", + "name": "email-validator", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "0617ddb55b90b42ddc9398dc7e91d61fe928a2504939f76526dc15b22d238caa", + "name": "fastapi", + "version": "0.136.3" + }, + { + "direct_url": null, + "metadata_sha256": "ddd82b9666c21988e234d623e2575e1b89fd4133260eeab43fc9a7c074f7024a", + "name": "fastapi-cli", + "version": "0.0.32" + }, + { + "direct_url": null, + "metadata_sha256": "611602e834d42e10433155ff5f5581358d732fa6b6f6f7820a8f79e74b1ce1f9", + "name": "fastapi-cloud-cli", + "version": "0.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "794524e4a9659bda6043721d848d028ea49996085a33326094fbaaa3f6e6b895", + "name": "fastar", + "version": "0.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "711401d36e60e10e35beb4d0f1bb42bf0c4d86339ae52f32b9aa4a4d790530dd", + "name": "fastsafetensors", + "version": "0.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "efaea9742e348c4c4bdcc6f616a33cc5aa3ae926494a72a46690b7da2f08ed5c", + "name": "filelock", + "version": "4.0.7" + }, + { + "direct_url": null, + "metadata_sha256": "99bd6c3f10781d3d2d350f2c3c9fc4765b55f25de8a6d6dd1f71501802d1255e", + "name": "fla-core", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "0a6ef979b75295cee2b5293ad4942b0cf2682e9e38680203064e0b70249c1a96", + "name": "flash-linear-attention", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "76b70a11ca82ea4606b529e7a8658cb3fe71412afa46f2ed57101dd91ba27558", + "name": "flashinfer-python", + "version": "0.6.18.post1" + }, + { + "direct_url": null, + "metadata_sha256": "ba8ff415192b5cbb90efce046e2271a00c8184afc362d8b47fbbc84d5e558b05", + "name": "frozenlist", + "version": "1.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "e7712831c80eb13b08fb7f7cc33988a8f24654af9eba7c6f5f943b2636e4306a", + "name": "fsspec", + "version": "2026.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "025de85c794878d0caa737869307447595f514ebf9599eacb5b1a501bae479b6", + "name": "fsspec", + "version": "2026.9.0" + }, + { + "direct_url": null, + "metadata_sha256": "ca94883bdeaa3740b45b6994443b445fd67c6e4a8064ac3bf9d92d2a5221eee8", + "name": "ghp-import", + "version": "2.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "a7e90983562a035cf767baa63d8c32bc37e1de7cad71ac7b6b2bc70a95bba4eb", + "name": "gitdb", + "version": "4.0.12" + }, + { + "direct_url": null, + "metadata_sha256": "dd96143ec79178bef685c1f5c0a58a87a66d003b421e605de65697308321d518", + "name": "google-api-core", + "version": "2.40.0" + }, + { + "direct_url": null, + "metadata_sha256": "0735d57088a83df2355e16843107fb0112abe2178fc5bb8132947a7ad962aa41", + "name": "google-auth", + "version": "2.59.1" + }, + { + "direct_url": null, + "metadata_sha256": "2f3aa9d9500d329560440e6a5a152e420aad5f5bbb23701f45b740be721784a1", + "name": "googleapis-common-protos", + "version": "1.75.5" + }, + { + "direct_url": null, + "metadata_sha256": "06d74ab04fdc03fad368868907f0d10e7d9f397aab58d58965c0b78ffaec34cc", + "name": "griffelib", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "7ee1c179e2c68a62968308b2f96f4f3469176ee3ac8bdb494ac80188d4d41271", + "name": "grpcio", + "version": "1.84.0" + }, + { + "direct_url": null, + "metadata_sha256": "04cf3a4a91575850f386f4fcfdedd8e7fbfba08feff038fbc1296d1e854db2dd", + "name": "h11", + "version": "0.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "b954a6ba4739c0cc878bb8ea27ea7c7154a48bb4b7c06dba9e9cf880cf0ec930", + "name": "h2", + "version": "4.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "6f0d7bf86e75d0bda1ceccc82367c0145ad0ec522c4d4f51bb454f467faadcc9", + "name": "hf-xet", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "f991b847550cf8225f69562902b5ccb591b2ce9a08fe07ef6e6d701bdb4694a7", + "name": "hpack", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "314d194165c4700034c1c67cee847d549a6d7091374c71f2cef0186ec56a3eb9", + "name": "httpcore", + "version": "1.0.9" + }, + { + "direct_url": null, + "metadata_sha256": "aed9767360bed1bcbda71e3b1a3c996603f86558bc77a1693ee3d09973d20cad", + "name": "httpcore2", + "version": "2.13.1" + }, + { + "direct_url": null, + "metadata_sha256": "8fa3bf3510c35e2eea9f523a1cace7120079cf51d76c4acea97de95806aaa14a", + "name": "httptools", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "3bf4804c215d111b6a4702cf9000021ab39807d1ed3207dd011b14b2843b2d14", + "name": "httpx", + "version": "0.28.1" + }, + { + "direct_url": null, + "metadata_sha256": "d11dd50813b8914bd9455e8b2b591171cd2b1618883943153afadc8bb9224678", + "name": "httpx2", + "version": "2.13.1" + }, + { + "direct_url": null, + "metadata_sha256": "43b119c34ad2b2aacc032a1a6a8feb142fdb5ca407a3519325d74dd53d8904df", + "name": "huggingface_hub", + "version": "1.33.0" + }, + { + "direct_url": null, + "metadata_sha256": "9ce850d5a6b775e5ef4a335f907e579a878e058213121b6eec567781ea68c585", + "name": "humming-kernels", + "version": "0.1.12" + }, + { + "direct_url": null, + "metadata_sha256": "67aa4f6717d82446a51ce350e7c4769eba0c4a22d2f428255cddd9d24b11a914", + "name": "hyperframe", + "version": "6.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd9511ede42f63b995c3f71944f908cb8f014048b63ecc1c8d420525a3354b59", + "name": "identify", + "version": "2.6.20" + }, + { + "direct_url": null, + "metadata_sha256": "af3c3a62bb5d82d6a43454684e0b1dedde27a21ea90eacfb1bed9814619f06d0", + "name": "idna", + "version": "3.20" + }, + { + "direct_url": null, + "metadata_sha256": "cf71393f3d079ce2e859384573e65aaacd1709bef700701f629df32398b598f0", + "name": "ijson", + "version": "3.5.1" + }, + { + "direct_url": null, + "metadata_sha256": "9305763e93d03df0e36516b1125fa046a6ebe37d44589e200e0593cf4bdfd980", + "name": "importlib_metadata", + "version": "9.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "32860c3c19b2e91f6cb5bd83400b5870cda051bc74a5a08822c8c666af0990db", + "name": "iniconfig", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "560faabb3d45d779e445a74e7e806a786f95f2200fa06d979603b7f0ee1cfb39", + "name": "instanttensor", + "version": "0.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "f6fc1f0d389e4245fc2a1a0fdfee09422e56200cb6f94659668456997ff4f7a9", + "name": "interegular", + "version": "0.3.3" + }, + { + "direct_url": null, + "metadata_sha256": "d10f300731197a4829b77f0c883bb3cf8a37ae8c76a302e095fa95d6427706d0", + "name": "jiter", + "version": "0.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "5b0c8d4b4c535a2432fb206223d774509b6e20af374c6a4b6f98bf72a7de6702", + "name": "jmespath", + "version": "1.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "6c4032c2e74273452cd77399af2ee85198f49c22da897983f26d2ed6f787c4e8", + "name": "jsonschema", + "version": "4.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "aaa6cd66f423729e8da397c9d533b7d731f6b25f3d6371b9338c36bdb9be74a0", + "name": "jsonschema-specifications", + "version": "2025.9.1" + }, + { + "direct_url": null, + "metadata_sha256": "f7c0687c032593106a2e5a3c241cf8043e7e2c222bddb0022b4cb2bf5de67115", + "name": "lark", + "version": "1.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "4511c6b04efc57a5f5333edc1f5f48b9f5412c3923d4bc19b715bdf47977511c", + "name": "linkify-it-py", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "be929870f6ecae18a819c56118f1101f3076e25ac6a4843ca6f4707ebd1e87c6", + "name": "llguidance", + "version": "1.7.6" + }, + { + "direct_url": null, + "metadata_sha256": "cf2b87669bead3e76ec54207f3354c13f73b50c32fcd13c8d627084b3379139e", + "name": "llvmlite", + "version": "0.47.0" + }, + { + "direct_url": null, + "metadata_sha256": "0a416d79c5543d94d2b18807626293d4f47655d1d22724c7ae296e413078aaba", + "name": "lm-format-enforcer", + "version": "0.11.3" + }, + { + "direct_url": null, + "metadata_sha256": "16bc1f59e34fd2a6633bd395276052eacd2c777b2cf72781e76b203f013a8fac", + "name": "loguru", + "version": "0.7.3" + }, + { + "direct_url": null, + "metadata_sha256": "5216d5acfd039a7b581a826186309594b228d37d2c8d56864124ea666689fe4e", + "name": "lxml", + "version": "6.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "f59d772b35315a928672bfcccfb89d82c0aac672c5275c048f7a93b79015bcea", + "name": "markdown-it-py", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "b137367ef0056711cbf5e53015df9168cab80373104e7899b1c0263a21d9c99c", + "name": "mcp", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "38e0b9edaae09e58cd1461fc961ced22672038a697930bedef153a74befb3de1", + "name": "mcp-types", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "799f49685865fd9cc8915fdb92a33e102eeeffad562b03b4aeffb6f422b771c1", + "name": "mdit-py-plugins", + "version": "0.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "481f9cbe08596c6eaba6343e0efa1b13b2362c30dce0610f7c08523f1d98388d", + "name": "mdurl", + "version": "0.1.2" + }, + { + "direct_url": "{\"dir_info\": {\"editable\": true}, \"url\": \"file:///Megatron-LM-training\"}", + "metadata_sha256": "2876c0c760bbfc93bd7d737bf0db2866a937308a7c1707c3a2bb59d4795986ff", + "name": "megatron-core", + "version": "0.16.0rc0" + }, + { + "direct_url": null, + "metadata_sha256": "a6e34d488c879f57ce042bec38f8864ba3ea7d6ecf0ab757fc88fe8dc0a22f26", + "name": "memray", + "version": "1.20.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd26d80dc9676b1fb8c894355bd525fbe7f49a6a86a555c72e9ec6d927247c33", + "name": "mergedeep", + "version": "1.3.4" + }, + { + "direct_url": null, + "metadata_sha256": "dd1b3b89e88d1c65a26e6e72dd075eabbc220bfb138769ec8b64578ee911795c", + "name": "mistral_common", + "version": "1.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "4859847a9f6321daf8849cf7fd1542ff430db6563a2abf9ac0d62a5b21bd951d", + "name": "mkdocs", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "1729fc31479f2582486cdc85397417659dd3b2fb3f920553de66cfe59d5f0b3e", + "name": "mkdocs-awesome-nav", + "version": "3.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "88b4b7b7c0aba5547befdedaf515c8df4867361daf55ff60b72578464d72dcbe", + "name": "mkdocs-get-deps", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "ad33bb33fb16b1f69689c4682550e97232154e367e2c8c8aee9dad0f10d269ce", + "name": "mkdocs-git-revision-date-localized-plugin", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "ed69fbfb9ac00c10c5a383a12ff9d2b9919ae184e408554434199211643d6040", + "name": "mkdocs-material", + "version": "9.7.7" + }, + { + "direct_url": null, + "metadata_sha256": "d1c549b61701148b97f8246bc924b2840e504b37b0ce7a27e78ddf81261e5363", + "name": "mkdocs-material-extensions", + "version": "1.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "4ad6171f3bf6812e4de90670ff0089d445093d4fe1d05d55f17b96a4a192a816", + "name": "ml_dtypes", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "4ad6171f3bf6812e4de90670ff0089d445093d4fe1d05d55f17b96a4a192a816", + "name": "ml_dtypes", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "b0dbdfa30ab6b1ce637a794899c9e43019182b6d1ab2d07b90f647f7331eba6b", + "name": "model-hosting-container-standards", + "version": "0.1.16" + }, + { + "direct_url": null, + "metadata_sha256": "95424470e481cfa8d18b30963b6de3aafe16614b1ea0414e184a008571dde84f", + "name": "mpmath", + "version": "1.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "eb184d83489401903615ce8a78d98d5b933dec0f7246811d396a529915fe797c", + "name": "msgpack", + "version": "1.2.3" + }, + { + "direct_url": null, + "metadata_sha256": "520006303d6a0e859970b83f7d452196e2e8f6dab08f6dcf1ba5823c1230025f", + "name": "msgspec", + "version": "0.22.0" + }, + { + "direct_url": null, + "metadata_sha256": "010d2fe039006070a711a476b171b7b7da5c29ccad3c4eecd77ef3711b07c2d0", + "name": "multidict", + "version": "6.9.1" + }, + { + "direct_url": null, + "metadata_sha256": "235634cc7ebda45f8a84dfdb1b9b35ac1a77a1888b34650c3a616d23e4a7e93f", + "name": "multiprocess", + "version": "0.70.19" + }, + { + "direct_url": null, + "metadata_sha256": "7c545b4b3e5e83d3fde41352272c10cb9deeaba5b7138fbf24383e952af8822e", + "name": "natsort", + "version": "8.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "311ee8cdaeaf9f11acf51cda9c3b5b191f76ce9d98bc3418164c3189bbc37a08", + "name": "nccl4py", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "66360539217852c3b44b37f409eade7e1559baf018bb363bacb2aa3a9759b203", + "name": "networkx", + "version": "3.7" + }, + { + "direct_url": null, + "metadata_sha256": "e8b0b1746808b87816c47e4531780ded7f246bed9575a89e8b40200aa81e9a13", + "name": "ninja", + "version": "1.13.2" + }, + { + "direct_url": null, + "metadata_sha256": "77c1117f0dbc41560ddc6e6b37b542fb4e88afcd4ef82ec06593e5bbd5f37121", + "name": "nodeenv", + "version": "1.11.0" + }, + { + "direct_url": null, + "metadata_sha256": "9af629898406c9eaa69897fe09220dc483270cdba89f6b20bf0165cdf0e1668e", + "name": "numba", + "version": "0.65.0" + }, + { + "direct_url": null, + "metadata_sha256": "0c7281a81cf76e40b27c1385ffd8a215d7227adc219f177ce807ead9e91994a5", + "name": "numpy", + "version": "2.3.5" + }, + { + "direct_url": null, + "metadata_sha256": "0c7281a81cf76e40b27c1385ffd8a215d7227adc219f177ce807ead9e91994a5", + "name": "numpy", + "version": "2.3.5" + }, + { + "direct_url": null, + "metadata_sha256": "bab990ced4537ce74ef5961ca933c4c6fd604fd09a5827a4a428c55bcb0be35b", + "name": "nvdlfw_inspect", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "10f6595146332d35f7f15a000e08b5c81432528c5d026470c1d03f0c1399fb70", + "name": "nvidia-cublas", + "version": "13.1.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "58e933b4ac8e49f098b16ab7480d03bd792afc3d1db10d0aacbdcc2c62e48fa3", + "name": "nvidia-cuda-cccl", + "version": "13.3.4.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "baac937970681d41aa0c3708b3d55d73f8d29e70aceaac0e71fe6d1548e94a09", + "name": "nvidia-cuda-crt", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "8d51e5c76ef5707b0b80d5ec9a791c0f11a480ab721820cf100a3cc566017eef", + "name": "nvidia-cuda-cupti", + "version": "13.0.85" + }, + { + "direct_url": null, + "metadata_sha256": "724bf56e61ddef5d4c2482ff64103a973b911b110b668acaea5373f6c83c1c5c", + "name": "nvidia-cuda-nvcc", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "c54801dbd815d534519a761f1f328325aa0f1d1f1659aa969fa74e7a2c76eee9", + "name": "nvidia-cuda-nvdisasm", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "af51f248363020b9fdfd2743704e901bf3d19a1a1ce1fe44fb98ba148bfc0157", + "name": "nvidia-cuda-nvrtc", + "version": "13.0.88" + }, + { + "direct_url": null, + "metadata_sha256": "055f7fc69a5a2159de82cd0718da02c8852e81c8a71ebb117b8e799badd7167e", + "name": "nvidia-cuda-runtime", + "version": "13.0.96" + }, + { + "direct_url": null, + "metadata_sha256": "df18686dbdb3074ca375a1d6c623a04102fd348950c67a721397349c6d4f0477", + "name": "nvidia-cudnn-cu13", + "version": "9.20.0.48" + }, + { + "direct_url": null, + "metadata_sha256": "abd0ca3f67af19a4d383ff2a012ae0090d4731c6492fd47236615308a50b3981", + "name": "nvidia-cudnn-frontend", + "version": "1.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "4a78545d424d0c5038353f7046a8ae40ceaf312045d71399eac9511f5fc15434", + "name": "nvidia-cufft", + "version": "12.0.0.61" + }, + { + "direct_url": null, + "metadata_sha256": "e49b909195c03ddbe203729d9b31dd88e3f207368333d1909c67c6b130a0c696", + "name": "nvidia-cufile", + "version": "1.15.1.6" + }, + { + "direct_url": null, + "metadata_sha256": "bb15a754c6be32c23aaac13c1cfa7a8ce53d92bc26652ec3b609f7a5cce3e7d1", + "name": "nvidia-curand", + "version": "10.4.0.35" + }, + { + "direct_url": null, + "metadata_sha256": "0dd58f677811eac04901a793740932e5a2a8fff2f5453aa6351614eb18391bb6", + "name": "nvidia-cusolver", + "version": "12.0.4.66" + }, + { + "direct_url": null, + "metadata_sha256": "8aeb284782ef6883095a5d1c110e221cad023a99afcfd5cdb4969a25e146d562", + "name": "nvidia-cusparse", + "version": "12.6.3.3" + }, + { + "direct_url": null, + "metadata_sha256": "09555246122896eaca3b8313eecfca4b339fefd3b597874cb9fe3bf29dab38c9", + "name": "nvidia-cusparselt-cu13", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "ac77bac79fbfb0c52ac6e2e5abc936b1e127be2192f0cbc27b00be3125fa86ae", + "name": "nvidia-cutlass-dsl", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "1ec968ec7c4083f7fe4e1fb8384c7e9b853a81491fef9f4cb1cf755961aaedf6", + "name": "nvidia-cutlass-dsl-libs-base", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "cc6f3846cd820013eaa6e2665c493d70c607be6ce7349b939eb4742888470585", + "name": "nvidia-cutlass-dsl-libs-core", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "2357d0df2d0d17c0b16663b8a89df53f751b19721f66821fd88fa78112c08e55", + "name": "nvidia-cutlass-dsl-libs-cu12", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "244590c25662dcf777b1daae97a858afe1a1aec62e5e6678b217007a459ab552", + "name": "nvidia-cutlass-dsl-libs-cu13", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "c3a25ada01f57418c1b897406c3abab18834e6adc573ab7b060620c453afb6db", + "name": "nvidia-ml-py", + "version": "13.615.71" + }, + { + "direct_url": null, + "metadata_sha256": "56baad4e7f699902b03b17580933f7bd50b6ea97b7df9d7e807750973da7529c", + "name": "nvidia-nccl-cu13", + "version": "2.29.7" + }, + { + "direct_url": null, + "metadata_sha256": "98810ef0ab8badc369e6a46a038f8ee9f412c0c753fb5ad580544f23a0aa7962", + "name": "nvidia-nvjitlink", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "b0f54ee21909d19640a58e05da755c91763eb5725f544fd0d4b84b2f5f94deba", + "name": "nvidia-nvshmem-cu13", + "version": "3.4.5" + }, + { + "direct_url": null, + "metadata_sha256": "06dc1a593c7e8b8c3f29184228c83f8f7ef57787ad91f3e5bcae1d238dd3092a", + "name": "nvidia-nvtx", + "version": "13.0.85" + }, + { + "direct_url": null, + "metadata_sha256": "32ee63450a437b6a6ed227ff6549144aa596197a322993521ec7af826ebd413e", + "name": "nvidia-nvvm", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "32c2efdcd2c673b3b7f35ca9c2cccefaad36f1f0a920648a13cad85f6a5767b2", + "name": "nvtx", + "version": "0.2.15" + }, + { + "direct_url": null, + "metadata_sha256": "3419d80e114a2c19fa9bd3582939a3942f19673055707ba6ca2ca489d58b41e0", + "name": "omegaconf", + "version": "2.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "28971076ce9c279d4b889496b046d55a1e05b02fb9851ceb717e9a10df799572", + "name": "onnx", + "version": "1.23.1" + }, + { + "direct_url": null, + "metadata_sha256": "1246f5a4d8295907a42e809ed9173ede2510ec9d260d2168989d126564897fa5", + "name": "onnx-ir", + "version": "1.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "e14643636835759700dff286f949c5ec34e7eac7ac47f44096414f0e0f1c3101", + "name": "onnxscript", + "version": "0.7.2" + }, + { + "direct_url": null, + "metadata_sha256": "00f847e99939207bd70dfd806428f6b20a3d01074b59325e4c76149a2e19be26", + "name": "openai", + "version": "3.22.1" + }, + { + "direct_url": null, + "metadata_sha256": "598d3ad5a22a14a7c4f1d218b43e345f32b0ba094b753467bae8a3f708fd48cb", + "name": "openai-agents", + "version": "0.22.3" + }, + { + "direct_url": null, + "metadata_sha256": "5a0afcb1ce845e05da12beb1767f5d2749bbc9e9050718c6b9fa3c225713c9eb", + "name": "openai-harmony", + "version": "0.0.8" + }, + { + "direct_url": null, + "metadata_sha256": "e86a6b6fcbbe152805f782c57df321002892e163019574877e9829272e25eb4e", + "name": "opencensus", + "version": "0.11.4" + }, + { + "direct_url": null, + "metadata_sha256": "53d669c8bd3d32d3275153b454e515ca5cc6dec92fae3a98309b5a2b19fe6d2d", + "name": "opencensus-context", + "version": "0.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "19778b6d66b0e45bf73e11fa37a208949d5b393aef914627394d5601455546a6", + "name": "opencv-python-headless", + "version": "5.0.0.93" + }, + { + "direct_url": null, + "metadata_sha256": "19778b6d66b0e45bf73e11fa37a208949d5b393aef914627394d5601455546a6", + "name": "opencv-python-headless", + "version": "5.0.0.93" + }, + { + "direct_url": null, + "metadata_sha256": "a3f5434fa7c80f7f7abc82173da639c8e9c59d30b4027182645562bd3d2f4f97", + "name": "opentelemetry-api", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "8611977ea596e4827874582e86250618444e1c718229dddfc16e5ea437ce5fcb", + "name": "opentelemetry-exporter-http-transport", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "2cfd41e5ca33292d987ba71fa6186d11e16ed66888f3a26f8a3a99060c4b5e90", + "name": "opentelemetry-exporter-otlp", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "3bb4494220732d4bf10e1dba231ea7638cedaa5362e1f23a50d34a14f520fea8", + "name": "opentelemetry-exporter-otlp-common", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "27fb1c8aa5c2cd07776f9f3281fc618cd3feb96017757c33d2b3586fb7fec88b", + "name": "opentelemetry-exporter-otlp-proto-common", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "5cba6098cdd0bfb06853a6c704a2451c4f82c9dea376a30b59ecd279296648ad", + "name": "opentelemetry-exporter-otlp-proto-grpc", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "6f53ef1c172ebf87af69b9ef390aa908506d0cd14bc7811985fdd937a4058808", + "name": "opentelemetry-exporter-otlp-proto-http", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "1910f4e7ebd497e98b6d231e10275288fda2cd1885117575706c62f45e065889", + "name": "opentelemetry-exporter-prometheus", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "fab18b721e30be41448be252e1dca43b48e7f15d971e0bb552492c0ef4b07bee", + "name": "opentelemetry-proto", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "3644a79f55762a646799ff52b9d837e01c8192b7b28f735a383f55c90edb9bc2", + "name": "opentelemetry-sdk", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "add3db481f7f401f65cfbddb058fde3bb4c9dd7b61064a84f8598ad7efe0b11c", + "name": "opentelemetry-semantic-conventions", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "0dfff30e912520a226bcf7a547393484cfcd8c738439c7b48418f61c95109480", + "name": "opentelemetry-semantic-conventions-ai", + "version": "0.5.1" + }, + { + "direct_url": null, + "metadata_sha256": "210ce26bad0a245a72831b4fa029708c245d4d670a88c8d5a69b1446c24a95e4", + "name": "orjson", + "version": "3.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "35ff73511848f5f934ccc39d538014716ec4579e76d54e0e407ff51794a7939c", + "name": "outlines_core", + "version": "0.2.14" + }, + { + "direct_url": null, + "metadata_sha256": "8ee2f7138ade46b6e348a6d099612f5bd6caff13511f3b4144327f37ce50eacf", + "name": "packaging", + "version": "26.3" + }, + { + "direct_url": null, + "metadata_sha256": "a4ab87bf8083001f25ccdc46095f05b678b3569dd58edc2cf941e3e7f64d7c88", + "name": "paginate", + "version": "0.5.7" + }, + { + "direct_url": null, + "metadata_sha256": "1de96a6c28c2e5613c9c87cd4ad9484791001cf58df43cf2ba74d5c4f85f0ad2", + "name": "pandas", + "version": "3.0.6" + }, + { + "direct_url": null, + "metadata_sha256": "d05b8d05da9f78176b2eefaacdfaa5e96708ec4f488daea8bbc52e3ed1bc3954", + "name": "partial-json-parser", + "version": "0.2.1.1.post7" + }, + { + "direct_url": null, + "metadata_sha256": "c1d126edceac2685e29403a8ae3a27c47143dce1f0252fa3931771562f1e2b4f", + "name": "pathspec", + "version": "1.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "30325dc8ce17bc64f9dbc0a449232fd35841a019df22a6f481007c9c5a28c1cb", + "name": "pillow", + "version": "12.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "cbc0b7b6e63b50dcb7c17cf3526a9304f285d9a31353adf3b22acc2059ab23f5", + "name": "pip", + "version": "25.0.1" + }, + { + "direct_url": "{\"dir_info\": {}, \"url\": \"file:///work\"}", + "metadata_sha256": "6ba03b5bc457a2a3d92468729501b5892a0d38ebcc36766c58859449498c5743", + "name": "pip", + "version": "26.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "0421937c4410b61c5325233d5b7671ae933bae8de174f87586ac55aa804851ea", + "name": "platformdirs", + "version": "4.12.2" + }, + { + "direct_url": null, + "metadata_sha256": "2bcffab42626e1fb50d6329765619312d30fe7f4880e98dcee99c92ebd283bb4", + "name": "pluggy", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "7e7562ba7c032f8edd02641ae71b1ac2d8f388103a68d777a7e907d19e75bc17", + "name": "pre_commit", + "version": "4.6.2" + }, + { + "direct_url": null, + "metadata_sha256": "bbe0a7662602ddd23f929fe0ee98e9d04406e138aeee18ce4861af186ea6060d", + "name": "prometheus-fastapi-instrumentator", + "version": "8.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "ece4a61f3ffb92a083fd5e47e180e3e070342e60a3bd93876a879e79a643e821", + "name": "prometheus_client", + "version": "0.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "5feba21a58eaa126e7e7739e57e2572e5bb251fcbf56e439e508acc47d769314", + "name": "propcache", + "version": "0.5.4" + }, + { + "direct_url": null, + "metadata_sha256": "3f136dbf7239c987a7685acd33440cc5efd6c4107b4b11c425201b4de70ae36f", + "name": "proto-plus", + "version": "1.29.0" + }, + { + "direct_url": null, + "metadata_sha256": "118b5ad013120a7a6e24714595ad776bf264d7b0060389133310d18ea1480902", + "name": "protobuf", + "version": "7.36.2" + }, + { + "direct_url": null, + "metadata_sha256": "0849f5a519bf9bc23ef204443fdd8d6d10678863acac7ca9340fc11bfba5a856", + "name": "protobuf-py", + "version": "0.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "eab5f2f4fd98f67a710a8fb1975b64ffa880a4f977566f022c567e08e324ccd6", + "name": "protobuf-py-ext", + "version": "0.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "39009938840de3a8b2a37eb4668d2601aae8c74e4b74743f73e59996b5b7e6e1", + "name": "psutil", + "version": "7.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "df44b58e8a4cfe57f65773ec47f7bdf2a14c8f5f73a7abf331a6b6237d6d691a", + "name": "py-cpuinfo", + "version": "9.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "2fd4a9efc5e5c74ae4c2fcf1970193c524c62ab22af8d5e66ebf7df9e6e46e83", + "name": "py-spy", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "d2ccdeb15cddedc81637a83e40baa6397fe269023b738d0fc3cb2d90722e290b", + "name": "pyarrow", + "version": "25.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "47b9f28e971a56f5adf949e0bcf105b0bf6587946566ecf197a2819d8848cc01", + "name": "pyasn1", + "version": "0.6.4" + }, + { + "direct_url": null, + "metadata_sha256": "82ce4c01c6d36841b9801fcdabab9bfe61d0b5e4e440c275941d8a2d4a790730", + "name": "pyasn1_modules", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "45cb345e4c12f63bc843b8c88902cc44c4d624a55aaef8cd5ffbc0ad16356fbe", + "name": "pybase64", + "version": "1.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "d311ae661edeac8ff029ab2960d065a7e792ebf8f79af682daa53109fe81318b", + "name": "pybind11", + "version": "3.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "cce9c0d440d065d4cdfb0d00004b8ddd65cf363a740efc5b0920b29201a59cd9", + "name": "pycountry", + "version": "26.2.16" + }, + { + "direct_url": null, + "metadata_sha256": "a1e33542883c249bf6c263b0023b9ea8a6131a77d9cb2cbc88316968e5eada83", + "name": "pycparser", + "version": "3.0" + }, + { + "direct_url": null, + "metadata_sha256": "faffcc4d7d359cb1047a9f67f7c65096b838c6db6c62852ef20fb27d55649a95", + "name": "pycryptodomex", + "version": "3.23.0" + }, + { + "direct_url": null, + "metadata_sha256": "98929f4cb80451dc3c6c8cd541a3081dccf0dee94afe7d9fa5c214a18ff236ce", + "name": "pydantic", + "version": "2.13.5" + }, + { + "direct_url": null, + "metadata_sha256": "8eccadbe707db97c397fb79073fe791b7998ef3a85f04f817f8991f7697b190b", + "name": "pydantic-extra-types", + "version": "2.11.1" + }, + { + "direct_url": null, + "metadata_sha256": "8f00c91deb34399316a5386eb2e76fe09f14a08dc3045f2e7dce9bf8573796bd", + "name": "pydantic-settings", + "version": "2.15.0" + }, + { + "direct_url": null, + "metadata_sha256": "66c729edddc20bf2764bb18bd87d907b08690e50355f39b97acc737b26d1d164", + "name": "pydantic_core", + "version": "2.46.5" + }, + { + "direct_url": null, + "metadata_sha256": "394500d78a0c1a433ae8ca3693152c08f6a901121d4b069cf1540a19759e2950", + "name": "pylatexenc", + "version": "2.11" + }, + { + "direct_url": null, + "metadata_sha256": "df2e9e9847a2aea0ae6e20fd325aeb16cf3ce7f8913462db6c2398363cd0c0bf", + "name": "pymdown-extensions", + "version": "12.1" + }, + { + "direct_url": null, + "metadata_sha256": "82fcfe724db9f0b51348da89f4f5cdc0b08d08882b1bbc0ca4913d3a0a93bcb9", + "name": "pynvvideocodec", + "version": "2.0.4" + }, + { + "direct_url": null, + "metadata_sha256": "3722422cc1478b175879143dfb78f98b7a5f53f4f684d71b7054fe2e8acd3b89", + "name": "pyqwest", + "version": "0.10.0" + }, + { + "direct_url": null, + "metadata_sha256": "7d1d1c276b7c372d55d17ac7d30f0a4b80a746e147347b8510d1355eea7f80c8", + "name": "pytest", + "version": "9.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "89e7c1c932e52b74bdcaf504389d2d1a2d7ca559b02bf5a09fc80ebd58ad10f7", + "name": "python-dateutil", + "version": "2.9.0.post0" + }, + { + "direct_url": null, + "metadata_sha256": "54f30f811841b6d772f31715712c85bfe0041839cb071f78daf41c700a98642b", + "name": "python-discovery", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "54f30f811841b6d772f31715712c85bfe0041839cb071f78daf41c700a98642b", + "name": "python-discovery", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "0cc19efd76cfbf3bcb2cb0d3ab82191036855859455aa3812c5e9e591e3f34e8", + "name": "python-dotenv", + "version": "1.2.3" + }, + { + "direct_url": null, + "metadata_sha256": "1d866c6124631b9ce1797ad412fff298ab53fc2d95210281d7c8f20e920753fa", + "name": "python-json-logger", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "2d18a1e7286d92a656ead5ec6f83d5ae6dc858634624f6b264703ae88d24d718", + "name": "python-multipart", + "version": "0.0.32" + }, + { + "direct_url": null, + "metadata_sha256": "beaa0efe9ba4b34843f5a0fc7379a73f10e95adb8cc0c31f359ab6f3a42b4def", + "name": "pyyaml_env_tag", + "version": "1.1" + }, + { + "direct_url": null, + "metadata_sha256": "238dc769e22d4f5626750cdff36e920e4a8d69c10d88de6d79b40a59cc13d873", + "name": "pyzmq", + "version": "27.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "de0a5e855bb5bb78b7acdcd2ca60619c6a0c109814881589caf158ec07155662", + "name": "quack-kernels", + "version": "0.6.5" + }, + { + "direct_url": null, + "metadata_sha256": "961ffef199b876fb4d7b10903d78e79f359d703b1638834c61d70b9879932918", + "name": "qwen-vl-utils", + "version": "0.0.14" + }, + { + "direct_url": null, + "metadata_sha256": "faf6ab9027d12de992827a2d8a224996fe6747a8c5f7d31ae495983dc73eefe9", + "name": "ray", + "version": "2.54.0" + }, + { + "direct_url": null, + "metadata_sha256": "c50d8b3ff4d113925b60dc47d1d28e87248a3338024241b0a3a66c8794fbce0c", + "name": "referencing", + "version": "0.37.0" + }, + { + "direct_url": null, + "metadata_sha256": "02acdc52d6f21d5f4b172254daaa94edfaa44c9ebe14d1c00cc4c8fe99b0e1df", + "name": "regex", + "version": "2026.9.29" + }, + { + "direct_url": null, + "metadata_sha256": "ac08207697217d1ffde8a161b424d77d6e2af6b62630fa26d75d08f11076cdca", + "name": "requests", + "version": "2.34.2" + }, + { + "direct_url": null, + "metadata_sha256": "f1abd635c3dff607a4fd654c62a88d9d4c21843cfc9176116c156f4269ca21b5", + "name": "rich", + "version": "15.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "932ff7743a756d0efcc45528d64c275ac3cb40a8dd1787ea10cb303907f0ae4f", + "name": "rich-toolkit", + "version": "0.20.5" + }, + { + "direct_url": null, + "metadata_sha256": "294a1405c0fa34b5f735bcb46459050436849a1e584c643544de99c07c529fb7", + "name": "rignore", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "5e54dd00b4ad336c5161d47de2a5c2212090c44629c28b6538b156256e49282d", + "name": "rpds-py", + "version": "2026.6.3" + }, + { + "direct_url": null, + "metadata_sha256": "0d5895abd80bfc0027c02943abaea4547061b9004bd134950d640d619a697835", + "name": "safetensors", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "91d5de3f641f33a8fbb4b6e91772da68d50b68686971d7b66af2068f2e77b694", + "name": "scipy", + "version": "1.17.1" + }, + { + "direct_url": null, + "metadata_sha256": "297fb30f701a800489c12893a951da3e5bd1f80061a1f43f0d3e9f1d4c6bc6fd", + "name": "sentencepiece", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "4245e0388ddf2048a38ae2a24a3d2c583408b2454aadc680d3c3beede639db3f", + "name": "sentry-sdk", + "version": "2.71.0" + }, + { + "direct_url": null, + "metadata_sha256": "ae8a9e6feec1a76e954d65ea48ac57842c9a7bfb5ac6e5ea82400a5ba9f71a98", + "name": "setproctitle", + "version": "1.3.7" + }, + { + "direct_url": null, + "metadata_sha256": "341d00772017437d0f6e3c943ae353f243c39fedfba403aea47cced927a76516", + "name": "setuptools", + "version": "79.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "ff4bcfb192bd542ed8f1794fb32ffc9eabd932d6e03cb00a4ad5e35a2469af88", + "name": "setuptools", + "version": "80.10.2" + }, + { + "direct_url": null, + "metadata_sha256": "f1e5a532fb8cda0bbc370e3db6cb9cea72a065d12ddd6a14976ba3cf66264221", + "name": "shellingham", + "version": "1.5.4" + }, + { + "direct_url": null, + "metadata_sha256": "2aba2cfd9c2ad7625a5d374d141af317d8f92d3534997bf98d127e52848dfc81", + "name": "six", + "version": "1.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "69ae2dfe547624be97fae348e1cfa3793f8854eed32cc1603badedc7d48fb36e", + "name": "smart_open", + "version": "8.0.2" + }, + { + "direct_url": null, + "metadata_sha256": "d415e6c6de7dee117d254a342668c489931bc88eac7ec8678b452078e366da6e", + "name": "smmap", + "version": "5.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "093bc4f0740a6fc28692e616aa8fe68d7e1d76426cc5a5faf9ea722a8ee7aaae", + "name": "sniffio", + "version": "1.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "b3cef071eb1dbeaa76a1273fe2ca2cc8ef36e835165253952d93780962529ac1", + "name": "sse-starlette", + "version": "3.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "3c01ca830e213f0311fe37bc3b46b8ab230a5e7acb894bf0fc8785cb7ccfed48", + "name": "starlette", + "version": "1.7.0" + }, + { + "direct_url": null, + "metadata_sha256": "6017ca508a293cf47a88a78cb330e9cbd131d74ec3c7fbf89bd4300ed3129d30", + "name": "supervisor", + "version": "4.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "fd5eb4925b04f9bffbc6c4f92bf8aea7243b918b43cd359493fce48a7dd3b336", + "name": "sympy", + "version": "1.14.0" + }, + { + "direct_url": null, + "metadata_sha256": "f09f0e24282c5a86346bcd5b10ae5ff81869fa8ef69c3ba524bd0a817a87dda9", + "name": "tabulate", + "version": "0.10.0" + }, + { + "direct_url": null, + "metadata_sha256": "519fa19c146fd58a0a75ecf1461e4bd98f9c06d01800c37d4a80f5fef095f4e1", + "name": "tensorboard", + "version": "2.21.0" + }, + { + "direct_url": null, + "metadata_sha256": "1af7ad76e4073b01ab147eb3c1d8e38b95d38062c6c9bc63890150738642e8eb", + "name": "tensorboard-data-server", + "version": "0.7.2" + }, + { + "direct_url": null, + "metadata_sha256": "9e597f62fc07e3b931d5c8fb0e90706fb6d45465cfb5d01dbd27ba7fc135c02c", + "name": "tensorstore", + "version": "0.1.80" + }, + { + "direct_url": null, + "metadata_sha256": "0da993d16ef6326f471796fcb065622f309c5c1aae6c6295b488ea64bb5c880c", + "name": "textual", + "version": "8.2.8" + }, + { + "direct_url": null, + "metadata_sha256": "52ca6148d4fd1497254855fa610cfdde99191cd42bce7a452fd3a68855504ac0", + "name": "tiktoken", + "version": "0.14.0" + }, + { + "direct_url": null, + "metadata_sha256": "0df9eb495cfb477dcbdfbdcd8c04d952d3eb00d77831630760571e13545398e5", + "name": "tilelang", + "version": "0.1.12" + }, + { + "direct_url": null, + "metadata_sha256": "802b576e011dc61bd2681593e8d802714b6c4ce636a9cf87035026db32ce6262", + "name": "tokenizers", + "version": "0.23.2" + }, + { + "direct_url": null, + "metadata_sha256": "4e1631b2164a49ff9a848d86ce504fdcc15e3540dbb262df8f33a2681a8de513", + "name": "tokenspeed-mla", + "version": "0.1.8" + }, + { + "direct_url": null, + "metadata_sha256": "05086095a775c5dca70998dcf442a848c13f9c68b54a54c510c3542c5abb6563", + "name": "tokenspeed-triton", + "version": "3.8.10.post20260920" + }, + { + "direct_url": null, + "metadata_sha256": "71daba472d0c5ffc25c0231dc29688ab0cb13d5bc7e7d93f6c4cce4169c50048", + "name": "torch", + "version": "2.13.0" + }, + { + "direct_url": null, + "metadata_sha256": "cccd2f1c0e5866e63732f58798c8d642ee6d10cd560d6f691e7981b908c246c9", + "name": "torch_c_dlpack_ext", + "version": "0.1.5" + }, + { + "direct_url": "{\"dir_info\": {}, \"url\": \"file:///torch_memory_saver\"}", + "metadata_sha256": "6276cef17dedbb5ee0d6157bbf63b832e916026281328d995ad3d488c2539618", + "name": "torch_memory_saver", + "version": "0.0.9.post1+slime" + }, + { + "direct_url": null, + "metadata_sha256": "29809ca2c86dda5079654f1f70564a64435e9d08f1964a2412b6f514e1b5ff64", + "name": "torchaudio", + "version": "2.11.0" + }, + { + "direct_url": null, + "metadata_sha256": "7e9be0f3a290e3fd9370d8fe010c7ffd006d5d3d05ab8bdf7df8f92f0fca9c39", + "name": "torchcodec", + "version": "0.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "181fa5e6b399c378711eddcdacd756d3c51317916f8eb160ee36cae7fae9589f", + "name": "torchvision", + "version": "0.28.0" + }, + { + "direct_url": null, + "metadata_sha256": "43d1261aff90cf3d5b1b40cf1f94234d61409b14e59f3766f457c1eec7f7ac15", + "name": "tqdm", + "version": "4.70.1" + }, + { + "direct_url": "{\"archive_info\": {\"hash\": \"sha256=3e1d9f534781c8e608240da0b495b8246317a36382f7609017cbaa7fb1d53f7b\", \"hashes\": {\"sha256\": \"3e1d9f534781c8e608240da0b495b8246317a36382f7609017cbaa7fb1d53f7b\"}}, \"url\": \"file:///wheels/transformer_engine-2.16.1%2Bc9877beb-cp312-cp312-linux_x86_64.whl\"}", + "metadata_sha256": "d882f743161d9d9f35dee4e1a8cc9136fa495f7c660caace01ab8f5602d76aa7", + "name": "transformer_engine", + "version": "2.16.1+c9877beb" + }, + { + "direct_url": null, + "metadata_sha256": "465797a59706d83b45c93fde750b228c3b6e1addc44115de2c4c02ad66d9c5ea", + "name": "transformers", + "version": "5.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "a91982ca086667c592a951973434f7c5a9f27a8300bc97af78dfb496afe53e71", + "name": "triton", + "version": "3.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "d26fbb244532c4051e715f9047cd943e2cc4abb0ac6f2a517fa2986eb1ea726a", + "name": "truststore", + "version": "0.10.4" + }, + { + "direct_url": null, + "metadata_sha256": "c84af1a069084b1b440b3594068dec29200d52d4c1a9b652030448717f270158", + "name": "typer", + "version": "0.27.2" + }, + { + "direct_url": null, + "metadata_sha256": "0ad6653b7439f4bb6a596cb7b01ed1b716458467525c4dc40b75d62bdb943c98", + "name": "typing-inspection", + "version": "0.4.4" + }, + { + "direct_url": null, + "metadata_sha256": "d005280aa13b334ac942d20219102865e559f69ffd06c35c248b2f0d0da3b933", + "name": "typing_extensions", + "version": "4.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "fba2930e9030a18965d243f8d330748db2e67572a81b3b68710462fb5110332a", + "name": "urllib3", + "version": "2.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "bc5717bd6524a33838f285261868bcc8e311e8c29fdb19e41d56c38b04890e84", + "name": "uvicorn", + "version": "0.54.0" + }, + { + "direct_url": null, + "metadata_sha256": "741c006d8441f562aa853a5430df236fbb4af923445491f396bf09943bd30258", + "name": "uvloop", + "version": "0.22.1" + }, + { + "direct_url": "{\"dir_info\": {\"editable\": true}, \"url\": \"file:///vime\"}", + "metadata_sha256": "f85aa01dfdc868756a6583434bbff040f29eb511d47d5b25ada063a84353aac6", + "name": "vime", + "version": "0.3.2" + }, + { + "direct_url": null, + "metadata_sha256": "c25431aaf1950971fe96292f395a41a55b403127bfca0d0b8f7dc9cff5dab75d", + "name": "virtualenv", + "version": "21.14.1" + }, + { + "direct_url": null, + "metadata_sha256": "4e3ee0a31d85e56268640aae853bcee4794dfe8c0483c5c6370517e480c81ae0", + "name": "virtualenv", + "version": "21.14.5" + }, + { + "direct_url": null, + "metadata_sha256": "d4ed5c7551cddb8c1aeff2f9f27b3491f6ad2c9afda8e7bb9779c33fa12a536c", + "name": "vllm", + "version": "0.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "84b482e09bac949e992594757214a1920c667a5d898ee320e309250697f6d26e", + "name": "vllm-router", + "version": "0.1.15" + }, + { + "direct_url": null, + "metadata_sha256": "9b16c871eb1060a5218e9b9a9ad33288d94844cfaf43f08dbb6c32423bde8fe3", + "name": "wandb", + "version": "0.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "8e4f2be437dfe4eb3c6c959e517ac20b75d06525563f1ebcbf06f9ec648bd7c1", + "name": "watchdog", + "version": "6.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "15218afb42938907c2ca74c54e3d8e3a5406493c4761e29e38e82bfec0f84296", + "name": "watchfiles", + "version": "1.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "8863af96e88b7db9990da99aa6c46816eacc3d2f9ae1297b53381b033cd70119", + "name": "wcmatch", + "version": "11.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "f46e6bd6cfafb2b684c29587b017b7096fd9155b74eda25a22eca784b9803ab7", + "name": "websockets", + "version": "16.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "ce82db5ccfefa4bfbe4e25a36e1f91e8e7d51fcaeb31586c4d48e1c69f99168b", + "name": "websockets", + "version": "17.1" + }, + { + "direct_url": null, + "metadata_sha256": "0f142a2c09eac643c7d0bfe77f3f121184c0b17914afbd32af669ed19b2b02ef", + "name": "wheel", + "version": "0.47.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd58938e51a3c5cb363f6f22eaa2a8a7accc1ce373388de167a82f77d3e5783f", + "name": "wrapt", + "version": "2.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "b0b72c1941f04499ca7e1a3a6e479aee8df902c3d49979624b59dba8c3228d37", + "name": "xgrammar", + "version": "0.2.8" + }, + { + "direct_url": null, + "metadata_sha256": "ef8861f39e5c36255966a36032651f937d890d55f31f1c26304b488f1ba34332", + "name": "xxhash", + "version": "4.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "740c08057b6eb69c58402c87d652af0a471e46325d811f2c605632a18817152f", + "name": "yarl", + "version": "1.25.1" + }, + { + "direct_url": null, + "metadata_sha256": "7b060e4d24394b5431875e2f74fec8e6bffa79d2e6b4cb8c7e2a5187dd2d8d69", + "name": "z3-solver", + "version": "4.15.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "3d76d4fbc95f0851191147db12300938c67a6f8fb1df884886d9601272ccc4e8", + "name": "zipp", + "version": "4.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "d3de2651e4e908dbb7c9d80508e5179590217dfac4993dc8b04381c5b9718c4c", + "name": "zstandard", + "version": "0.25.0" + } + ], + "executable": "", + "installed_provider_sources": { + "vllm/compilation/__init__.py": { + "path": "/vllm/compilation/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/backends.py": { + "path": "/vllm/compilation/backends.py", + "sha256": "fa4bff8920b363efbbde9456f135fa9d2c004a5bde1898877f177418b2d8b008" + }, + "vllm/compilation/base_static_graph.py": { + "path": "/vllm/compilation/base_static_graph.py", + "sha256": "5cfe8e06db84aa42cd41cdd93ebe93af00b3a242c8011042057530e2922b523a" + }, + "vllm/compilation/breakable_cudagraph.py": { + "path": "/vllm/compilation/breakable_cudagraph.py", + "sha256": "3cc427612a08e2b9b3fee47548026400c1d0776e2d4747535e59ef5512bdf1e8" + }, + "vllm/compilation/caching.py": { + "path": "/vllm/compilation/caching.py", + "sha256": "71d212452dde742fbf28b8a01ed29d3c08a7457ff7f8da2a20ce9d17e902c2cf" + }, + "vllm/compilation/codegen.py": { + "path": "/vllm/compilation/codegen.py", + "sha256": "e04833bec88cf9d1a13aa7341e30e3233d1138bfe23424e0fd34d664b3fedb9f" + }, + "vllm/compilation/compiler_interface.py": { + "path": "/vllm/compilation/compiler_interface.py", + "sha256": "8d84e2864bf83f754bae9e9f77119e0287cca9f97f5fa5ec2535e07b5ad88944" + }, + "vllm/compilation/counter.py": { + "path": "/vllm/compilation/counter.py", + "sha256": "d8158c54dd36a357bf24f6f84dc22f572d3a27f4875f3d5779b12bc5d454ff76" + }, + "vllm/compilation/cuda_graph.py": { + "path": "/vllm/compilation/cuda_graph.py", + "sha256": "05c86392d7fae967ac73076dba7e01990a0e3ae619e4866450a0c1be56bd1192" + }, + "vllm/compilation/decorators.py": { + "path": "/vllm/compilation/decorators.py", + "sha256": "cab6962e8a1fead59c75f5ed8cb4732f9e5441ff972030c2f4b1c4ba0c58de3c" + }, + "vllm/compilation/monitor.py": { + "path": "/vllm/compilation/monitor.py", + "sha256": "43b24c5cb1bc4d32dc979f3222596905c7b3acc58415328a234402e6edc76abf" + }, + "vllm/compilation/partition_rules.py": { + "path": "/vllm/compilation/partition_rules.py", + "sha256": "857d2fb06dc871ea1d3717cd01fbd4e5205984100d98b7b72a2933d6ff1cfa4d" + }, + "vllm/compilation/passes/__init__.py": { + "path": "/vllm/compilation/passes/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/fusion/__init__.py": { + "path": "/vllm/compilation/passes/fusion/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/fusion/act_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/act_quant_fusion.py", + "sha256": "1fa9c3ca4fb424685b7053c3dda89dda16c98dc5645d85f0f28dca58429792b3" + }, + "vllm/compilation/passes/fusion/add_rms_fusion.py": { + "path": "/vllm/compilation/passes/fusion/add_rms_fusion.py", + "sha256": "e46998552628aa5cd5962fc39ea39ae824fd97e6aeba1d176e9cc7cade39837b" + }, + "vllm/compilation/passes/fusion/allreduce_rms_fusion.py": { + "path": "/vllm/compilation/passes/fusion/allreduce_rms_fusion.py", + "sha256": "0af193505880cec0f6ffa224c688bce3c9ddc318dccdf04a696b4e4b4506a963" + }, + "vllm/compilation/passes/fusion/attn_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/attn_quant_fusion.py", + "sha256": "ecc64e82be4481954c9cac6c23d7794846ab19486b570f2dda07ab5ad67c5a49" + }, + "vllm/compilation/passes/fusion/collective_fusion.py": { + "path": "/vllm/compilation/passes/fusion/collective_fusion.py", + "sha256": "1e2c8539d6960b45907fb3bf0482441ea7250e97c56ffdea1500514efa0b164d" + }, + "vllm/compilation/passes/fusion/matcher_utils.py": { + "path": "/vllm/compilation/passes/fusion/matcher_utils.py", + "sha256": "50ac5714ce1bb113520de769ea6234316acc470a8cdf2537a996ce9a9d54337d" + }, + "vllm/compilation/passes/fusion/mla_attn_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/mla_attn_quant_fusion.py", + "sha256": "a966fe7f58bf9228379f793f5fd851735a97f9639722766b2a20cb79a9e4baec" + }, + "vllm/compilation/passes/fusion/mla_rope_kvcache_cat_fusion.py": { + "path": "/vllm/compilation/passes/fusion/mla_rope_kvcache_cat_fusion.py", + "sha256": "1602cc28055ffa8d1123ddb1d256bf0bd12006fd06ea7e16a986c55746dbe0dc" + }, + "vllm/compilation/passes/fusion/qk_norm_rope_fusion.py": { + "path": "/vllm/compilation/passes/fusion/qk_norm_rope_fusion.py", + "sha256": "aebc7d1a5189b65ac665afcc169e7baebd53efe719c48e35e7c5babe85af0d39" + }, + "vllm/compilation/passes/fusion/qk_norm_rope_kvcache_fusion.py": { + "path": "/vllm/compilation/passes/fusion/qk_norm_rope_kvcache_fusion.py", + "sha256": "f0cfd0d83ec4acb09f9bf91d199b114e9d4995e3059c13eb23a6978ce7c07eb2" + }, + "vllm/compilation/passes/fusion/rms_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rms_quant_fusion.py", + "sha256": "4852aa44e0e2087043fdac271bda9b8d9bfe3201bb84ce3919b8ed454d8083c4" + }, + "vllm/compilation/passes/fusion/rocm_aiter_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rocm_aiter_fusion.py", + "sha256": "372e76c68c75209a085deec6dd22b3816be633613ca82f6f2925c1b3773d61a0" + }, + "vllm/compilation/passes/fusion/rope_kvcache_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rope_kvcache_fusion.py", + "sha256": "3a756e9049593537143b5a56ab9185a6bc83f57ed81d84226d7791a46a984b53" + }, + "vllm/compilation/passes/fusion/sequence_parallelism.py": { + "path": "/vllm/compilation/passes/fusion/sequence_parallelism.py", + "sha256": "3af7e420dcb35fff0bae0f8f599d0f1bda34445ebe194059892a434b2976d654" + }, + "vllm/compilation/passes/fx_utils.py": { + "path": "/vllm/compilation/passes/fx_utils.py", + "sha256": "730708213acf9d1b5f3176b433dfc197a5f3c81b5ce443f0923c526924833003" + }, + "vllm/compilation/passes/inductor_pass.py": { + "path": "/vllm/compilation/passes/inductor_pass.py", + "sha256": "1f380aacf7adabb8bf8b7d41c0a93473947f0716f7445bd910fd448f6c08e672" + }, + "vllm/compilation/passes/ir/__init__.py": { + "path": "/vllm/compilation/passes/ir/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/ir/clone_elimination.py": { + "path": "/vllm/compilation/passes/ir/clone_elimination.py", + "sha256": "5297078f5cddce081faba5215814275381d2083b32318fcfeb2bf9d69fedb7c7" + }, + "vllm/compilation/passes/ir/inplace_functionalization.py": { + "path": "/vllm/compilation/passes/ir/inplace_functionalization.py", + "sha256": "2dc4f22c6f05224828c2941479185b1452d4490f488b7f0bfd124334e7809fed" + }, + "vllm/compilation/passes/ir/lowering_pass.py": { + "path": "/vllm/compilation/passes/ir/lowering_pass.py", + "sha256": "d9c3d90f63138420f0e5489447b5996573fcfbbab939da2efccd00848492b172" + }, + "vllm/compilation/passes/ir/utils.py": { + "path": "/vllm/compilation/passes/ir/utils.py", + "sha256": "f59d33a6c7d0616cbeec1e9fb1d6c948881bf81fe124caeb906eac2e2197ea21" + }, + "vllm/compilation/passes/pass_manager.py": { + "path": "/vllm/compilation/passes/pass_manager.py", + "sha256": "486979a058aa2e20ebedcbb6e039f7a59f38d2efd2cda11219fae4067be0968d" + }, + "vllm/compilation/passes/utility/__init__.py": { + "path": "/vllm/compilation/passes/utility/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/utility/fix_functionalization.py": { + "path": "/vllm/compilation/passes/utility/fix_functionalization.py", + "sha256": "ad5b504a05ccee023869b0c8df70ec2fff9a4a80d25fd903e2b532f470e7203f" + }, + "vllm/compilation/passes/utility/noop_elimination.py": { + "path": "/vllm/compilation/passes/utility/noop_elimination.py", + "sha256": "8abf85d28c13f95059f2acbc0275b9b9ed2ad4990f7c5763bbe3067a4aa629ce" + }, + "vllm/compilation/passes/utility/post_cleanup.py": { + "path": "/vllm/compilation/passes/utility/post_cleanup.py", + "sha256": "1c38b14fc209165cbcf8ca763a17ac4e528b97f59b573e5d52df2cce7d758de3" + }, + "vllm/compilation/passes/utility/scatter_split_replace.py": { + "path": "/vllm/compilation/passes/utility/scatter_split_replace.py", + "sha256": "138402cc3097768a32e9e5b8d1a054b6176e494bddc8684e23ca2dc5fdc3fdda" + }, + "vllm/compilation/passes/utility/split_coalescing.py": { + "path": "/vllm/compilation/passes/utility/split_coalescing.py", + "sha256": "0b02acd9e1ad43d7b3e128b914e969b9580773f2818078846dfbf163a8bd0871" + }, + "vllm/compilation/passes/vllm_inductor_pass.py": { + "path": "/vllm/compilation/passes/vllm_inductor_pass.py", + "sha256": "4f83ffb67f834a214221d810c7843a8e41eb4e5930eb40adbd8cf054ff6fb9c6" + }, + "vllm/compilation/piecewise_backend.py": { + "path": "/vllm/compilation/piecewise_backend.py", + "sha256": "6525318ff3ca2e4978e24dd9232a7ae0a02e920e19604b83db6f6043d1f8a54d" + }, + "vllm/compilation/wrapper.py": { + "path": "/vllm/compilation/wrapper.py", + "sha256": "c1b1fca679ea16aa07a696831a810c0d531da2bb0ea32dd6f1a95cdaef36de07" + }, + "vllm/config/__init__.py": { + "path": "/vllm/config/__init__.py", + "sha256": "56fb0cb1598d297e4f95a97e5d86dc624145d1532f5faa432b7d2834d7155bd5" + }, + "vllm/config/attention.py": { + "path": "/vllm/config/attention.py", + "sha256": "c41f345b512d9b7df882328257eb3a6381f41088c11ae83b5ecd8a9e8265d1bc" + }, + "vllm/config/cache.py": { + "path": "/vllm/config/cache.py", + "sha256": "f1c226ba679c884930dbfcaf41a57248b137a9a20d3ed8e3d3b31752bb484c07" + }, + "vllm/config/compilation.py": { + "path": "/vllm/config/compilation.py", + "sha256": "c9cec5c7200e8e559810ec8c30113ad61dab6780f9f7fb3c116bd0d9b5a43065" + }, + "vllm/config/device.py": { + "path": "/vllm/config/device.py", + "sha256": "7b82eee02ceb5842337451a27a3d5729920c47e25e8f6bf3997f5146f9330a9c" + }, + "vllm/config/diffusion.py": { + "path": "/vllm/config/diffusion.py", + "sha256": "1fa9fd2478a866098a28a3586b55af2f9738656b7813a55d76539c10dd99fe8d" + }, + "vllm/config/ec_manager_config.py": { + "path": "/vllm/config/ec_manager_config.py", + "sha256": "418b387dbe7bdf67deddce331c205768a2d42aea37141f59fb02a8a1528e3552" + }, + "vllm/config/ec_transfer.py": { + "path": "/vllm/config/ec_transfer.py", + "sha256": "0eabb2c25194676d23c6acf59562672a1dd24415043ac5737d621ce0d681ec70" + }, + "vllm/config/engram.py": { + "path": "/vllm/config/engram.py", + "sha256": "34043a22385a041d4e9be8857f64174c990c2ca8308b97b6a952b5ab96c20ee5" + }, + "vllm/config/fault_tolerance.py": { + "path": "/vllm/config/fault_tolerance.py", + "sha256": "b166b24373d599fb15ddc575e3061cf0dcb42174d0369d8468008e7ffbb2a4e2" + }, + "vllm/config/kernel.py": { + "path": "/vllm/config/kernel.py", + "sha256": "27e23c584cf862f4091858db6dc85bbc2a01f4baf9dca3f232ae6f3bac02390e" + }, + "vllm/config/kv_events.py": { + "path": "/vllm/config/kv_events.py", + "sha256": "b1dbaee3e6830e381e9157fe3bab0d65c357da88ff7cdf8b1e4b3a4e75c82a87" + }, + "vllm/config/kv_transfer.py": { + "path": "/vllm/config/kv_transfer.py", + "sha256": "506fae7a9d7f32cb3646156cf9249a856f6317dff6c4c85db70efd34418c429b" + }, + "vllm/config/load.py": { + "path": "/vllm/config/load.py", + "sha256": "bd6431c22e078362d749a56a2c84145432ebf2605d8bcfa2ac679182d18ed630" + }, + "vllm/config/lora.py": { + "path": "/vllm/config/lora.py", + "sha256": "ed6cf6575f5950f079a62f904caeae93d1a4745dd8c21788b74367883bcd4b08" + }, + "vllm/config/mamba.py": { + "path": "/vllm/config/mamba.py", + "sha256": "2090f791201ca45dd4f1d72b8651268890eb07574b6084721194eb8fdf612c48" + }, + "vllm/config/model.py": { + "path": "/vllm/config/model.py", + "sha256": "f4168b67cc93ce72ff2a6d4c66974223e32fd0f1fab4c05e44bd68a275e18d69" + }, + "vllm/config/model_arch.py": { + "path": "/vllm/config/model_arch.py", + "sha256": "2babe28329d7b60b4e205f6d72c687f0f66e6535aa2f20411469e5ec362f6b5f" + }, + "vllm/config/multimodal.py": { + "path": "/vllm/config/multimodal.py", + "sha256": "271911aee151f17f092228cecee82af0713e9a47340ffdf66834ca7638a50d22" + }, + "vllm/config/observability.py": { + "path": "/vllm/config/observability.py", + "sha256": "d57c59ec776477ab0a20e9f2b945bc954d8ea3737c869259480e9aa10dfb9f6d" + }, + "vllm/config/offload.py": { + "path": "/vllm/config/offload.py", + "sha256": "6f2db3d9a2730588473d5155811690c6241b167a21dcb62fbbd9ebb6386de42c" + }, + "vllm/config/parallel.py": { + "path": "/vllm/config/parallel.py", + "sha256": "f012ace89e3fb730a467f729f602679bc145c49f0d10721811c9d818570e7b2b" + }, + "vllm/config/pooler.py": { + "path": "/vllm/config/pooler.py", + "sha256": "9f01913dcb7bccbf9b672b16643f18471ae202455992e8afaf0725a17f2b3d08" + }, + "vllm/config/profiler.py": { + "path": "/vllm/config/profiler.py", + "sha256": "04d24fa1dc7cfedca6b5c7d9115f7f7021722fc46a5b15234a1e3b3a506c93e5" + }, + "vllm/config/quantization.py": { + "path": "/vllm/config/quantization.py", + "sha256": "acffc52f525b39a88efd656f1ed705ce3a1b758298bb0684fac7694776bc10b4" + }, + "vllm/config/reasoning.py": { + "path": "/vllm/config/reasoning.py", + "sha256": "2c4f7bdee48a9fb3d93787c4c32361c2411417cce452cfde86808d8759977861" + }, + "vllm/config/scheduler.py": { + "path": "/vllm/config/scheduler.py", + "sha256": "822179da62be4bca0619c8590082ae09123f5c4415f9cc2037be673748239edb" + }, + "vllm/config/speculative.py": { + "path": "/vllm/config/speculative.py", + "sha256": "9c642a87264339c0dbc1d0b57330572149df0f9d5e16c6893b9895e50a619e19" + }, + "vllm/config/speech_to_text.py": { + "path": "/vllm/config/speech_to_text.py", + "sha256": "bf4a566fbde6a1cec1e209070b739650c3302c12696739c88049cb8f723a4c3f" + }, + "vllm/config/structured_outputs.py": { + "path": "/vllm/config/structured_outputs.py", + "sha256": "55649776594349b8b4aa3e08fc4c88068366732a486d6fb235079188044aa829" + }, + "vllm/config/utils.py": { + "path": "/vllm/config/utils.py", + "sha256": "d035e9e488ba92b6c47a96cf05d9b2a850d53eda8a05115b22ff9af8dbc2fc64" + }, + "vllm/config/vllm.py": { + "path": "/vllm/config/vllm.py", + "sha256": "956b812e5a719bcbfa3a3958801361b38b9c928c96b8c073311bbb96376dfb7a" + }, + "vllm/config/watermarking.py": { + "path": "/vllm/config/watermarking.py", + "sha256": "30e6620a3cd7529f0736ad55e38bc326a6a78dee4552f0722208400041c94a1f" + }, + "vllm/config/weight_transfer.py": { + "path": "/vllm/config/weight_transfer.py", + "sha256": "92edd9e5ea90c97a8f3c5f20abf1734a105ee1f3f89e306e7ba87e758f1f767e" + }, + "vllm/distributed/__init__.py": { + "path": "/vllm/distributed/__init__.py", + "sha256": "97f28c30b32662af8cab163939e4ee423037f11630752e13b55cbc25a7d0ab71" + }, + "vllm/distributed/communication_op.py": { + "path": "/vllm/distributed/communication_op.py", + "sha256": "3c3f8ac60db38ece891d39dc1e2f6f1947ad438685893d2e5777d072320bd1b8" + }, + "vllm/distributed/device_communicators/__init__.py": { + "path": "/vllm/distributed/device_communicators/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/device_communicators/aiter_custom_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/aiter_custom_all_reduce.py", + "sha256": "f8eb027ce7a85d94af6260960ceb7f36fc6f1406c9af9c9b6285fddb3f178009" + }, + "vllm/distributed/device_communicators/all2all.py": { + "path": "/vllm/distributed/device_communicators/all2all.py", + "sha256": "1f1b69236acd3cd7bd94520fd6d591bfd31b57c4bc7c9f9f4161ea8bbd0c5f26" + }, + "vllm/distributed/device_communicators/all_reduce_utils.py": { + "path": "/vllm/distributed/device_communicators/all_reduce_utils.py", + "sha256": "ed0ab4dd05b2519a6313892e68824c97b540034664d7f8c3d031b322e33e1bfc" + }, + "vllm/distributed/device_communicators/base_device_communicator.py": { + "path": "/vllm/distributed/device_communicators/base_device_communicator.py", + "sha256": "4a7670f12ed7c7621b25d476e2687c24ca01f3be183fff4a6a25337596fe506b" + }, + "vllm/distributed/device_communicators/cpu_communicator.py": { + "path": "/vllm/distributed/device_communicators/cpu_communicator.py", + "sha256": "e1856c8e91cfbbb4d9ce990c1236e258ba4021e226afcbab645653380b38d64b" + }, + "vllm/distributed/device_communicators/cuda_communicator.py": { + "path": "/vllm/distributed/device_communicators/cuda_communicator.py", + "sha256": "102d95c67ec798cf352b817ba92e8abc9da37f30d1bbdf3aab45d3927b627b93" + }, + "vllm/distributed/device_communicators/cuda_wrapper.py": { + "path": "/vllm/distributed/device_communicators/cuda_wrapper.py", + "sha256": "333b6d9ed173e7a18c7f2b6627a3c9c9ed88892ce52015f05e29d6d245e48ee3" + }, + "vllm/distributed/device_communicators/custom_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/custom_all_reduce.py", + "sha256": "a048c1327c23580805600c0c951831bec333b1ffc4eb26a0e3d34119c4f0c445" + }, + "vllm/distributed/device_communicators/flashinfer_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/flashinfer_all_reduce.py", + "sha256": "b4359760e9b55963676109a5c3a015fb82e190d4df1d021de9ee01e7814cbdda" + }, + "vllm/distributed/device_communicators/flashinfer_pcie_ipc_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/flashinfer_pcie_ipc_all_reduce.py", + "sha256": "8b67b0fc356a565095f56b475cc89c513e3a5eff051ab1c52e5beb0c1a79e9f2" + }, + "vllm/distributed/device_communicators/mnnvl_compat.py": { + "path": "/vllm/distributed/device_communicators/mnnvl_compat.py", + "sha256": "72ee1e6f9571b4c8ecbd9f60cd469d1b565cb79cab519a688a93f290906a2615" + }, + "vllm/distributed/device_communicators/pynccl.py": { + "path": "/vllm/distributed/device_communicators/pynccl.py", + "sha256": "882fb83c5a3c565a3f8fd664b79f5ceae566dca180019ecafd74bc8c11d9f8cf" + }, + "vllm/distributed/device_communicators/pynccl_allocator.py": { + "path": "/vllm/distributed/device_communicators/pynccl_allocator.py", + "sha256": "390e2576cbf4ae06341ca4dab24fc7e4d4f7c24dd444329ed05d828a9ce91460" + }, + "vllm/distributed/device_communicators/pynccl_wrapper.py": { + "path": "/vllm/distributed/device_communicators/pynccl_wrapper.py", + "sha256": "ce63c8da57bb88d4cf89956bd70bb63f0f44bfad468ddb37b765611551f6d99f" + }, + "vllm/distributed/device_communicators/quick_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/quick_all_reduce.py", + "sha256": "8aacb23e7c297b0ae2f80d99c5affd2e7517115d7874be51069d14a44db7b5f2" + }, + "vllm/distributed/device_communicators/ray_communicator.py": { + "path": "/vllm/distributed/device_communicators/ray_communicator.py", + "sha256": "332c37f65495b60564d61db59bc2d30ca0236adc33442d01464790bde9aec897" + }, + "vllm/distributed/device_communicators/shm_broadcast.py": { + "path": "/vllm/distributed/device_communicators/shm_broadcast.py", + "sha256": "f3e7a3f3ff713fccbd535e0d41650ee05bdf8677e83d4b90519910645022c30b" + }, + "vllm/distributed/device_communicators/shm_object_storage.py": { + "path": "/vllm/distributed/device_communicators/shm_object_storage.py", + "sha256": "e097bf7ac0141fe8db4131e8fd553ca2ad5b0600b22a56f3924af6b795e7207c" + }, + "vllm/distributed/device_communicators/symm_mem.py": { + "path": "/vllm/distributed/device_communicators/symm_mem.py", + "sha256": "b06e3ddb9ae880a30ec4a103ce32eb9794223bb0293832e89572af28adaaa544" + }, + "vllm/distributed/device_communicators/xpu_communicator.py": { + "path": "/vllm/distributed/device_communicators/xpu_communicator.py", + "sha256": "527cbfb250760abc62096ee7cd612307b821f21b72dee1687ad866620ec89b6d" + }, + "vllm/distributed/ec_transfer/__init__.py": { + "path": "/vllm/distributed/ec_transfer/__init__.py", + "sha256": "061405bb51df7409c9938b62e25caa8bd6ebf85da6d1700dbd4affe2a0825135" + }, + "vllm/distributed/ec_transfer/ec_connector/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/base.py", + "sha256": "22d4913375bb622473fbe1a77f9376b804949cd8a7e31e9518208f9561d161e2" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/common.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/common.py", + "sha256": "e2267abd8d00a6d2605e1a82ea5c73396a71b427452eab469fcca0134c334e7c" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/connector.py", + "sha256": "72cd35d9fd754a2992dd090a8af13c91e0789b4038ac29276750d823120235db" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/base.py", + "sha256": "19e8df88b0fa831997896355ecdd49e0d86cb074cd7ae28aed0b328b0bb3ab2e" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/zmq.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/zmq.py", + "sha256": "435641c0e37551ab4937855abd067be26905b91215e759cbd9d28a419a34ff9a" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/base.py", + "sha256": "3be698aeb67d32ee3741e76b2fb71806941c587578583acf8fbc42fbf22b46a5" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/nixl.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/nixl.py", + "sha256": "03af8f6549a6027b7262a482907af591e45f28b9b1c5a3408bbc6600e38797e5" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/ec_shared_region.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/ec_shared_region.py", + "sha256": "e40607952c9920024455eca2f419e8c3ef1de9a4d8b27c147a33bb941b8c08b1" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/protocol.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/protocol.py", + "sha256": "05878336884396bfbef77b96b0fa6359f6fa0aba912961f14a84f5a436f27038" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/__init__.py", + "sha256": "01c42385bf3a55cff09cc05ba956f6dd4b8b6b986bf4d6eca4e566cb045b48e0" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/embedding_cache.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/embedding_cache.py", + "sha256": "7359fb980af1fc30b3253681310ef636e2b4a19134e04a93270c9c45de2572d8" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/session.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/session.py", + "sha256": "5973548a919e13c866222b91d502686a6757a31e5a5664b879bf2887ed9fb212" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/utils.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/utils.py", + "sha256": "160ac665f20f2c75b343c1e784084f2b0b4d1cf8fdb28ee15deee4dc8ed0ce45" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/worker/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/worker/__init__.py", + "sha256": "f08d296d3560c42173ae8af961af4a768033ccf1e36e9c17c0cdd53013d0c52e" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/worker/descriptor_buffers.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/worker/descriptor_buffers.py", + "sha256": "be7c81be214e995da8499105ba485854d9c19d6f8e905f8f1b87b83694ca0864" + }, + "vllm/distributed/ec_transfer/ec_connector/example_connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/example_connector.py", + "sha256": "09022ce07a89114bb65d9befd2e60873453aed11bbac8c0a75c1e6084e785a5f" + }, + "vllm/distributed/ec_transfer/ec_connector/factory.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/factory.py", + "sha256": "d6cedca0a99c3dd2b03cd1c15d17472b983e3f7d8f5baf4a12eecaf6abedb817" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/__init__.py", + "sha256": "1cbfc2f95f8f4d48a9253056eb1fd4b562062884e3fd5cb6571583c352fc16f3" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/config.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/config.py", + "sha256": "98c60696f79d1de67d2364cd9e8a42a393b5c8e17ed9af2f971368e47891d7b3" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/control.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/control.py", + "sha256": "58e0d1a423fbe958bfa586ac26a17107e08d0b31d044b4c74ab4dde880e7ca9b" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/memory.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/memory.py", + "sha256": "d5e90b1348de670a70f110d58eedcbdbd053db72c21dd007c3f5275c53951149" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/metadata.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/metadata.py", + "sha256": "497a7e6dfffb7fce80a41d5989f96119b970c143df77bb9d0f9c91d7a46e8c42" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/producer.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/producer.py", + "sha256": "97fa4d0b19475574778eab02f55fad73db9642beb9156da890314fd53fa1a7ab" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/reservation.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/reservation.py", + "sha256": "4790bc65cde4db5f17733ca2c2910980ba594a8a9b79ee27c5b957dffd4c1113" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/scheduler.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/scheduler.py", + "sha256": "53004b62529a31fdd80dfb2e6026610b95041a77e91f731ae526fefd84e7968d" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/state.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/state.py", + "sha256": "92f375d6c5cc9c83dbe95a7977ad8eb0f1b5629ccee92968bcacdc94eee15d65" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/transfer.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/transfer.py", + "sha256": "ada2113a5402054f1149d3edc2537f4e5e1bd696c9b17291c9f2b4cbf6b59753" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/worker.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/worker.py", + "sha256": "89eb91bb64845b3b121d502972a6b04d448714253becd2ea662e5691cd5acdd7" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake_ec_connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake_ec_connector.py", + "sha256": "aaebab4711bc00dd0c622dfbfd8639fc41e7ed5d1658d7d68fe33e4d5fbef3ba" + }, + "vllm/distributed/ec_transfer/ec_connector/utils.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/utils.py", + "sha256": "11b9014b9c0697f8846deff1a55a22fa86a15dc2ac3e139442fb6d513ac03059" + }, + "vllm/distributed/ec_transfer/ec_transfer_state.py": { + "path": "/vllm/distributed/ec_transfer/ec_transfer_state.py", + "sha256": "9487a41f23fa1a4fa6dfca8b42b8e97a0ee19d8406ffd1dcf4bef66315180827" + }, + "vllm/distributed/elastic_ep/__init__.py": { + "path": "/vllm/distributed/elastic_ep/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/elastic_ep/elastic_execute.py": { + "path": "/vllm/distributed/elastic_ep/elastic_execute.py", + "sha256": "b8f60a4183c79ff6051095b5f95bb385bc7fea0cffe8cd9ebc9087ab0e9f01b5" + }, + "vllm/distributed/elastic_ep/elastic_state.py": { + "path": "/vllm/distributed/elastic_ep/elastic_state.py", + "sha256": "fbf049199841a086fdf2fc1ab8498ef017ad3bf319db65c3ae61acbb536d2e10" + }, + "vllm/distributed/elastic_ep/standby_state.py": { + "path": "/vllm/distributed/elastic_ep/standby_state.py", + "sha256": "15282597550ebd0e07b8492ff192aea1ec0dcec8f0ad34009123e1002cc140c1" + }, + "vllm/distributed/eplb/__init__.py": { + "path": "/vllm/distributed/eplb/__init__.py", + "sha256": "1b9c2ee22abb5888c354c5aa01f0944f253e5e24e135d019778398bbe495a628" + }, + "vllm/distributed/eplb/async_worker.py": { + "path": "/vllm/distributed/eplb/async_worker.py", + "sha256": "424328600ad1003286fc5dfffa1f9482007314c060947818b2f94a8b97811f5e" + }, + "vllm/distributed/eplb/eplb_communicator.py": { + "path": "/vllm/distributed/eplb/eplb_communicator.py", + "sha256": "ba30d9d40e7b81d3f42aa9041d2f328edca4073cfe2de920285eb68375501ed8" + }, + "vllm/distributed/eplb/eplb_state.py": { + "path": "/vllm/distributed/eplb/eplb_state.py", + "sha256": "2f06bc8c63f3fdf55edb5032ae55c0ffcac3e67720ce74ea312e3d141b12acf4" + }, + "vllm/distributed/eplb/eplb_utils.py": { + "path": "/vllm/distributed/eplb/eplb_utils.py", + "sha256": "058af6104faa6d4085c1dca80bbe60d92bf0a7ec9cd92c775a180546c9d8c9c3" + }, + "vllm/distributed/eplb/policy/__init__.py": { + "path": "/vllm/distributed/eplb/policy/__init__.py", + "sha256": "daeb266c88442832b1ab8c8c4cc064891b38b9e9ba00aea324f926c87dc6d37e" + }, + "vllm/distributed/eplb/policy/abstract.py": { + "path": "/vllm/distributed/eplb/policy/abstract.py", + "sha256": "b9fd34c28bbfdded03360d7f3f6f8fb978e82689190d7ae4501dfe520e958c62" + }, + "vllm/distributed/eplb/policy/default.py": { + "path": "/vllm/distributed/eplb/policy/default.py", + "sha256": "3b54229e6240d050480390f6b29d4744fd38437d23719f78a6decf7002296a29" + }, + "vllm/distributed/eplb/rebalance_execute.py": { + "path": "/vllm/distributed/eplb/rebalance_execute.py", + "sha256": "b387e228791149018536eee96cf955b33ba79d801cdc36849d1b47a580ec2597" + }, + "vllm/distributed/kv_events.py": { + "path": "/vllm/distributed/kv_events.py", + "sha256": "de08f01e8736881560256c350a3b6418999dd4aa30f9c6ec9159527f7ed6899a" + }, + "vllm/distributed/kv_transfer/__init__.py": { + "path": "/vllm/distributed/kv_transfer/__init__.py", + "sha256": "c1be4e58ec6923bae607a355ad22891c740f056a69ff7358b1e10ea3fd2680ea" + }, + "vllm/distributed/kv_transfer/kv_connector/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/base.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/base.py", + "sha256": "2ae2a2c48f5731f3533166a75440fe91e764332305b5d713df840edba970789d" + }, + "vllm/distributed/kv_transfer/kv_connector/factory.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/factory.py", + "sha256": "add99c93c587b0098b90b1f8fd6940bdd1f15c236c5c6f1a258411863cb902d3" + }, + "vllm/distributed/kv_transfer/kv_connector/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/utils.py", + "sha256": "317ed40dc837671ca6e666165222e641a0f9b3992aea63bbf54de7e13d40b3a4" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/__init__.py", + "sha256": "5beb6ccad12fdcfe1581982da6f18321caca50e73a6b3259ebf3c8dc8b3ffcca" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/base.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/base.py", + "sha256": "97af64220475c6c9e8273438d7b5138b105ebe6944beb783facb36a3bb76f31b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/decode_bench_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/decode_bench_connector.py", + "sha256": "b4151c88cdec28f1ff9259047abc17baf23b892f4b68769a93bf26e0442b9017" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/example_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/example_connector.py", + "sha256": "6226876ef52d10d0d284d29c337ab44698e8bac6abdb2e0ece53b5756c55d068" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/example_hidden_states_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/example_hidden_states_connector.py", + "sha256": "58c22534dcad0fb73599a2d70a2fb104d5b612a4723be5e777f56a56fe07892c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/flexkv_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/flexkv_connector.py", + "sha256": "de4f68c3bd565ed898e47e0b2980049b966ff31888f1957050d30995d4953762" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_client.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_client.py", + "sha256": "bea6ecff2be281c7e96c1551c7bf463cbb01f2964696067c0ebdb683844f9aab" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_connector.py", + "sha256": "e67ed58015090e5eea9d499883f2a9422673d07f8bdbe0ccff7db15d2460de13" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_metadata_server.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_metadata_server.py", + "sha256": "6800e5cf37809f8a8e28c469c14a434db288bc3bf83a8b62ee06910a20c2da19" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/common.py", + "sha256": "8f2c02c08227a9093e6aeb183961aba36b7812cfc29b8c047a2b2c9d82f79c15" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/gather_scatter_helper.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/gather_scatter_helper.py", + "sha256": "08c1b43de34fbeca77357d7576ac1d17cba974b59d695562f68bb713061e7b54" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/hf3fs_mock_client.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/hf3fs_mock_client.py", + "sha256": "bec61a9b0c4b9124b2292d7646d76411da44396389349b53cdcbc46353c8780e" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/connector.py", + "sha256": "8c61094ce0a3a702908f9576f69482e6bf314738a2cbe33a7d3b47258fa0ab43" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/stats.py", + "sha256": "d9383a6ad6ab6b8f812d29d90495407b770eeddb79b86e9d0e3216c0bd16e0ed" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/worker.py", + "sha256": "251c0d8e57e4739c03ce3e1c899a95ff5b1752eb27676c28ab88c4ebd62c4776" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_connector.py", + "sha256": "5991f9ff8832df32bd421eb67e48237270ea0a408180e523810bb43606acf8f3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/__init__.py", + "sha256": "c53be9796e76cde637514bfc40a525d8c09bb2784b406cb516790d8285dfe433" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/multi_process_adapter.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/multi_process_adapter.py", + "sha256": "6480d67b31ed603027a83edf327880a38aee45eaeee2da9a4efa93e95527c166" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/utils.py", + "sha256": "e204fa6a853ac9c122d7a4e9d146902230f81c48d4321ed5edfdbf979dd49ba2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/vllm_v1_adapter.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/vllm_v1_adapter.py", + "sha256": "e6fe55049c6b007248516d69640e2f3a4809f9d286091a1014ae0949987fa8f1" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py", + "sha256": "c712c386a7c57bf0355a1441ba574232c3aa5498fcb70713a2b3f5d18b64f9c1" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/metrics.py", + "sha256": "de1b1797d0448f74370919dbb0278767f390e8f59e00a0c0528abefb302babc2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_connector.py", + "sha256": "516be01320e64b0110e102eeb69a6ba766dd5ac8cb3036db6b97b7d54413323d" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_utils.py", + "sha256": "26877610463fa8e9d6b092772f2551bcc0c3ac794cbe63996df0414666a8ebba" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/rdma_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/rdma_utils.py", + "sha256": "716e5042edecaba36c7ca763474988f32fa09c2668b8260260149df610af8f83" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/stats.py", + "sha256": "f39b2f0b1db2e4f922e27e684a3f7bbf5bb279b82a0a8c3bb0c7ae69b6d14d24" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/connector.py", + "sha256": "17a350bdb89e17e415d6c52a48684dc15c35a804378daf03e1f3bee1b1b123a3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/coordinator.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/coordinator.py", + "sha256": "a8eb6c2157a96e8d25233b82347ac8409a41d6390b4f2c64242119c05911010c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/data.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/data.py", + "sha256": "d3cfefdb4165a24995749cba452641b318065baa95bb1bae62f922a2f8886e7b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/metrics.py", + "sha256": "f2b9ef8927632d142aad11a374d0725c6e619ea0bb7fea9eda3f3895eb7d277a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/protocol.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/protocol.py", + "sha256": "ccb1cf6a84a932a375215627d2aaac482c351a05df015d636d05373a6845b7c8" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/scheduler.py", + "sha256": "283849ff581ec206444cdf5621622377f1c925e8d7e05cb9294af2f3a5094e79" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/worker.py", + "sha256": "55f1682dfd1ed7af689166421337126a0e1d08afa4774a242e098d79e0c1e95b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_common.py", + "sha256": "549bb4fe22dca5095515b9c0712c31cc81a9d4923881e9f112317640fd8c04ab" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_connector.py", + "sha256": "c0f474bc34b579d889fae92eaf43eaca241be51a4697a187a942f0df4e6b6a98" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_engine.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_engine.py", + "sha256": "d842f3772fc6588d5a329a67572324cb74709aa3df4033e64c791a1e706c8e88" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_layout.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_layout.py", + "sha256": "2b4ec046a78897236b0626939bb828b6ec095355097d10bca39e5f3e1c992553" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/multi_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/multi_connector.py", + "sha256": "12d8387239f3194f2cb63ccbd64824648047210323572d66671e6a1eed349fc3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/__init__.py", + "sha256": "cc3145fe3b6d219a267bf40a0f7c0cc9430e4289f94acab2df761b99b671e7ba" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py", + "sha256": "7a1db8c54e4cd846bdac747344f2aea2c2fcf507817928796063225223b7e169" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_worker.py", + "sha256": "49a2e4faf99bef146b5a1d4d18d48f240b1e561c438252274494b359db96ef52" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/connector.py", + "sha256": "b6a0dc916d052f344be72ecfcb111509c13580102c11a860fa726cf0888949a9" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/metadata.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/metadata.py", + "sha256": "2b23a07c1ec5ac5490c3b818737c7192e344ea9f52cd5623f75939f741ab4e21" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_scheduler.py", + "sha256": "ac3daf8e2246581fec84ab28f2133569421b62c32a120be4923e2f4d0f2f9de9" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_worker.py", + "sha256": "e5060c9b6cf022de35ca3d1da7a369cd6a6a2dea26219af9f7633aaf78af8a76" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_scheduler.py", + "sha256": "2d9008e33937a4d6c5cf9cc2f96160f2bdbc8e987fe37f0798a7fd7eb84c9572" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_worker.py", + "sha256": "87de3ea383dd3aa95fb2c287ea26ded8a330859cc1295f9faa69047e80865c2c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/scheduler.py", + "sha256": "09f1bfe7075b926b26a94529480e33b62c3ac273ff826f6c502084f08b1b2a08" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/stats.py", + "sha256": "3e710654e0b68d1a8592f0c4735c81b22f4bf698fb1a2dfea126d35bf2dd1ef2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/tp_mapping.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/tp_mapping.py", + "sha256": "2d43607f98701b2fad6cc0ac2767619a80b7fc2b3a3c2eb6ed0da4fb05dcd8f6" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/utils.py", + "sha256": "93de863fc8307a61d40b62f1b176b57ae93c363d34b9e9ddc8e666265b6d45dc" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/worker.py", + "sha256": "5134a36ac100ce7a64f5311029a37ac12c38d91093f63100f51f7fe53ea7c3ee" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/canonical_mapping.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/canonical_mapping.py", + "sha256": "e0b3c6f9806a650e0370c43c5068fc31c0fec94615089e15fdf270d7d96f2b64" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/common.py", + "sha256": "9b3f042c6fa1581d10e8f688d2d9bc927bb41b780a9ea01f514d57228e20c978" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/config.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/config.py", + "sha256": "aea82e60889e78dcad8564ec8285b65a6a372824a1545a98ea8e78b6f4fd418a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/events.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/events.py", + "sha256": "d7039b67be95fd444966628184040a94880873c0611c0e6e7525a22650ffdefb" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/metrics.py", + "sha256": "13d76df014e86691f58dc89a879f9808b124690c9267dd5fa3b2d4004d4c5fdf" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py", + "sha256": "2c5282f4a3165cd787fb355e215e3869f1bdd3f2c795b2155fc537c9d135191a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/worker.py", + "sha256": "acc2df53262441dfc6421a3af7f0cbd68cbfaedbd42bbc384d8e1da2d965d194" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading_connector.py", + "sha256": "cdc16ca7339a10e1993bd6220e6273f86a4e99779f58f25098a24ad31bb0dbd8" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/simple_cpu_offload_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/simple_cpu_offload_connector.py", + "sha256": "96238ca82ccf07a1eeb59b8f66de17b09034e3eb993ad9a0a836511d3f69706b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/ssm_conv_transfer_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/ssm_conv_transfer_utils.py", + "sha256": "59a949709482e65a007fbe5352fe9b4bb54c2dcc10ad2c1c41f754b6e13299f4" + }, + "vllm/distributed/kv_transfer/kv_transfer_state.py": { + "path": "/vllm/distributed/kv_transfer/kv_transfer_state.py", + "sha256": "2e5fe09438d6e2ee642f8a26cf7dcf632e870d955d30baf002b76a8bfe836d05" + }, + "vllm/distributed/nixl_utils.py": { + "path": "/vllm/distributed/nixl_utils.py", + "sha256": "0bffa3c052c9f67472b1c0bc3816114891b010c968bf4b8a292e7da4d687db53" + }, + "vllm/distributed/parallel_state.py": { + "path": "/vllm/distributed/parallel_state.py", + "sha256": "d9b10ad56833ebc08a753e1a050ef0989c30d4134021b7b7b00150b7bd01adc6" + }, + "vllm/distributed/stateless_coordinator.py": { + "path": "/vllm/distributed/stateless_coordinator.py", + "sha256": "f52848fbe985ed47b1f3e3ca555314736ca06436e8d738ab4390101f0672dcb0" + }, + "vllm/distributed/utils.py": { + "path": "/vllm/distributed/utils.py", + "sha256": "792146b357139e705064a68d3b66858de8a0baaca4dc7db1232fa217d45db231" + }, + "vllm/distributed/weight_transfer/__init__.py": { + "path": "/vllm/distributed/weight_transfer/__init__.py", + "sha256": "3fb9d4712b7c131d522f5e76e73cd8c333f3cc7af86e2d5ecf9b61b57b3b7f5a" + }, + "vllm/distributed/weight_transfer/base.py": { + "path": "/vllm/distributed/weight_transfer/base.py", + "sha256": "8ab06feb04f1379d0558fbdb77fde46bc84f179e0a26742cabab937e88caa38d" + }, + "vllm/distributed/weight_transfer/clients.py": { + "path": "/vllm/distributed/weight_transfer/clients.py", + "sha256": "ff85c79c350241e6d2749ca23c9d295a3289b4b62bfdf0257d32eb94a0151d36" + }, + "vllm/distributed/weight_transfer/factory.py": { + "path": "/vllm/distributed/weight_transfer/factory.py", + "sha256": "4e979eeac8c5bcdbffb10eb4765cfb30120fa7595c6c2561d3fa1a966ced61c8" + }, + "vllm/distributed/weight_transfer/ipc_engine.py": { + "path": "/vllm/distributed/weight_transfer/ipc_engine.py", + "sha256": "1af578293f387a19073c322b24143c3ae4716ce0c5d2bac2a4ef26fe20119330" + }, + "vllm/distributed/weight_transfer/nccl_common.py": { + "path": "/vllm/distributed/weight_transfer/nccl_common.py", + "sha256": "7b2ef7dc7481c3f478f17c49aa36c7bed54142ec5c93d36ed8426c8fdf09e500" + }, + "vllm/distributed/weight_transfer/nccl_engine.py": { + "path": "/vllm/distributed/weight_transfer/nccl_engine.py", + "sha256": "7fd020c919dc7b4723fb78e64da977b180d0fef0cd21df955a037b848dbaa008" + }, + "vllm/distributed/weight_transfer/packed_tensor.py": { + "path": "/vllm/distributed/weight_transfer/packed_tensor.py", + "sha256": "d0a27fb0be1dc029bd5a1d44fdb57a5e54aa4cd74308bedc339e86ac02c7494c" + }, + "vllm/distributed/weight_transfer/sharded_rdt_common.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_common.py", + "sha256": "be0b13801f24e7b62999b19d733c030510353603a2d5320d5dc98ee02daf22a2" + }, + "vllm/distributed/weight_transfer/sharded_rdt_engine.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_engine.py", + "sha256": "2f791970b4815511a7578ef6c957e7da97b071d26a39087a09a17475909791ee" + }, + "vllm/distributed/weight_transfer/sharded_rdt_fake.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_fake.py", + "sha256": "ee11164e17b5f2793252ce77741b8b94e0583046abf896a590131b2008d1fbb9" + }, + "vllm/distributed/weight_transfer/sharded_rdt_trainer.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_trainer.py", + "sha256": "dd413ff461d41826ccd3eb87d3df22f6cd7f24e09aac7644e3e5b40d7beec484" + }, + "vllm/distributed/weight_transfer/sparse_nccl_engine.py": { + "path": "/vllm/distributed/weight_transfer/sparse_nccl_engine.py", + "sha256": "e11b409454dda2b05ea34e8115ac19027c5e65cb2a5e9682c494f16a50e978f4" + }, + "vllm/model_executor/determinism/__init__.py": { + "path": "/vllm/model_executor/determinism/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/determinism/batch_invariant.py": { + "path": "/vllm/model_executor/determinism/batch_invariant.py", + "sha256": "af8f8d256a48fc214edf426fbe891fb15bd8b1d7ae98b811c736ff1eb0fae798" + }, + "vllm/model_executor/determinism/batch_invariant_configs.py": { + "path": "/vllm/model_executor/determinism/batch_invariant_configs.py", + "sha256": "72ea0d4df0ab5ae288abb7df5c203d2ad5f1709c7295d87ec72da775fddc1b7a" + }, + "vllm/model_executor/layers/fused_moe/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/__init__.py", + "sha256": "64a32665be6d5afcfbaf7a0915717267278b66b880b908b0263ea58f08e51b5e" + }, + "vllm/model_executor/layers/fused_moe/activation.py": { + "path": "/vllm/model_executor/layers/fused_moe/activation.py", + "sha256": "78dec0e85e0c040304515f64ccf8f2c6a7a2e5b9f1124a2138a97d9a02585541" + }, + "vllm/model_executor/layers/fused_moe/all2all_utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/all2all_utils.py", + "sha256": "dc4750a446f7de31d09a46034da5fdf479bc169af90f47aa9af8ae15e67b0828" + }, + "vllm/model_executor/layers/fused_moe/b12x.py": { + "path": "/vllm/model_executor/layers/fused_moe/b12x.py", + "sha256": "ee76cc6aa801e24be8ec78a9e8502061ad48667d5ff8711e43f68fba912425bd" + }, + "vllm/model_executor/layers/fused_moe/config.py": { + "path": "/vllm/model_executor/layers/fused_moe/config.py", + "sha256": "a3a87cebcc7ac85d73f471dcfafc2d899c6fc08f264777b74a0e919adac9e03f" + }, + "vllm/model_executor/layers/fused_moe/deep_gemm_utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/deep_gemm_utils.py", + "sha256": "8fdcd857eb333f9c68902105f157568d52067c94ba1e2df6dbfe0474ef1f4c02" + }, + "vllm/model_executor/layers/fused_moe/eep_reconfigure.py": { + "path": "/vllm/model_executor/layers/fused_moe/eep_reconfigure.py", + "sha256": "9d7580265e8563e1140c2bb4c3a81a35ddd54903f5ec0a2720ffc064681f02f9" + }, + "vllm/model_executor/layers/fused_moe/expert_map_manager.py": { + "path": "/vllm/model_executor/layers/fused_moe/expert_map_manager.py", + "sha256": "308c00f63fcb6f44518ec3a56d8f902c7bba75928c2e3aea30fbe1f3f473973b" + }, + "vllm/model_executor/layers/fused_moe/experts/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a16_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a16_moe.py", + "sha256": "53deea255175171971422d14082ad139b5ec7b62e21429a4c7cc0ebbefd29cdc" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a8_moe.py", + "sha256": "f3fc51b95ed89862381908a0134e326228827f44854248db9585a9c4899c34f4" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp8_moe.py", + "sha256": "af6db1760961a5a71234f8b1cdf42e9e30a236e13601b0826a75110b79724948" + }, + "vllm/model_executor/layers/fused_moe/experts/batched_deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/batched_deep_gemm_moe.py", + "sha256": "b0cd4ea706583518dc608fb56f832fc3595f24bd863b03ef1e8c22b36b873508" + }, + "vllm/model_executor/layers/fused_moe/experts/cpu_int4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cpu_int4_moe.py", + "sha256": "67170af3ba9dc4c4f71d78a72efc3fa4e366eac614936a79911dae5c75ac1864" + }, + "vllm/model_executor/layers/fused_moe/experts/cpu_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cpu_moe.py", + "sha256": "0754cd4ff1b28e6d3932a67609d335acefd28f95a841f0492923813356a6d81e" + }, + "vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py", + "sha256": "db901bdbcd3fdac23a1d74e39c51e67f14a82be787b2fd704ed1e787372ae868" + }, + "vllm/model_executor/layers/fused_moe/experts/deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/deep_gemm_moe.py", + "sha256": "16911a64a72eafc26a1bcb544a91f90144d85dc41e3ee57cf20e89925227bbb7" + }, + "vllm/model_executor/layers/fused_moe/experts/fallback.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fallback.py", + "sha256": "1bdd0a4f2ebaa40ec96a5aacc07aee61511af59e6324ce456aa65003b6e2991a" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_b12x_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_b12x_moe.py", + "sha256": "e613afe5da2742e42c717c1a0a56bd9e1c7e3e0452a828db0013d81063518954" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_batched_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_batched_moe.py", + "sha256": "295254dfeeec8df3eb8110e6f659a946cb9cded3de1565ecad4d741b3c3f3e00" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_moe.py", + "sha256": "08578bcd0cf72d6a470e40950175e73639efaa6d8d23c6da0869345312b229c9" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutlass_moe.py", + "sha256": "52887cec5fe628e0a4e7793deb546b40f6c29f7362b3b436c10ca36934ab9826" + }, + "vllm/model_executor/layers/fused_moe/experts/fused_batched_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fused_batched_moe.py", + "sha256": "2435587fc7f8fe8ea341ea0eb8f14c11f3f5b31fbbb9b29ce569ad3bace6e6a0" + }, + "vllm/model_executor/layers/fused_moe/experts/fused_humming_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fused_humming_moe.py", + "sha256": "a6830a76ff7f4cd3479b9c8372a30d03e8301604555cbdbcd9ac89a813b7431a" + }, + "vllm/model_executor/layers/fused_moe/experts/gpt_oss_triton_kernels_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/gpt_oss_triton_kernels_moe.py", + "sha256": "1613a7a6b256e8faee6fdcfae84f293492db6229d28ceb3e8a8d6093af480e36" + }, + "vllm/model_executor/layers/fused_moe/experts/int4_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/int4_emulation_moe.py", + "sha256": "f12857caf0671a341687ad3c5f48616b816ed51e1bcbdefa0a7edbecdb81a79d" + }, + "vllm/model_executor/layers/fused_moe/experts/lora_context.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/lora_context.py", + "sha256": "9b41eefaaa57c5dd0dc54217ef95978821b0c52e90ea4db8b0752e08452bd3e5" + }, + "vllm/model_executor/layers/fused_moe/experts/lora_experts_mixin.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/lora_experts_mixin.py", + "sha256": "b2bc55ed6be98b526c6a5698e2d98300650e78555f56b1820e58c04888e2a373" + }, + "vllm/model_executor/layers/fused_moe/experts/marlin_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/marlin_moe.py", + "sha256": "93916b721548e6194dc70cf6cec224b4b1456a0cc0980235e97beba7bf36541d" + }, + "vllm/model_executor/layers/fused_moe/experts/mxfp8_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/mxfp8_emulation_moe.py", + "sha256": "d09c62ad1398c51ff6f515f2a61014ee9e9a9798d0fe9762c47f446efc5edbef" + }, + "vllm/model_executor/layers/fused_moe/experts/mxfp8_native_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/mxfp8_native_moe.py", + "sha256": "01a42cebf18189e566034111b2145573c655319e8af1a56db60d53a319c40613" + }, + "vllm/model_executor/layers/fused_moe/experts/nvfp4_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/nvfp4_emulation_moe.py", + "sha256": "f24467762b60702f0df122ed64786be839a838a9b6cafaecbd04d35fbfedb189" + }, + "vllm/model_executor/layers/fused_moe/experts/ocp_mx_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/ocp_mx_emulation_moe.py", + "sha256": "dcaa60a9ebdb0bd8223b37af41f018ce7f95716ec7cd8526850f4433a579213b" + }, + "vllm/model_executor/layers/fused_moe/experts/rdna3_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/rdna3_moe.py", + "sha256": "e4abd802dc2f0ad9b338ebde397633c761d881c37813e2dc229902c526b597d8" + }, + "vllm/model_executor/layers/fused_moe/experts/rocm_aiter_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/rocm_aiter_moe.py", + "sha256": "bf09a7b783f5752d61cab76221b32b598d8846d801ee39dc9209d636c9659c6f" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_cutlass_moe.py", + "sha256": "ffce5ad627c540940d122d8df7981644b2eb35d07d480995c0f4f30517815fac" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_deep_gemm_moe.py", + "sha256": "c7209fa5e1ccb184a68b37a0706fc571a76696c2ae79802ddc7f889b1c29684d" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_moe.py", + "sha256": "806fbccfe30f5fbd578acf773add99bdf022b12d617958bd6281aef6de369701" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_bf16_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_bf16_moe.py", + "sha256": "76256de96fefece9c41ffb1108487919e24da364cf4412c6c3474498aba59137" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.py", + "sha256": "b54c7ceb45e5d07aa905f42ea44caccf85ca35ba9fb825d4c01947764510f68b" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_lora_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_lora_moe.py", + "sha256": "dd35a9e4242c0dc8d691168813e14bd5543e591f02ee529d0691e07651942c5a" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_mxfp4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_mxfp4_moe.py", + "sha256": "fe780f125a3dc3ba919659e9b85340bd32afcbfe47733a002bfdfb92eadf400c" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_mxint4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_mxint4_moe.py", + "sha256": "2106d67c2951aa690c4656ca58240d09c366cffe8cb4d9fd575df016c377cc30" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_nvfp4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_nvfp4_moe.py", + "sha256": "e938ac9f058f7c90b41c9610513239bec54a95304bfb5ff5f6897ebd54733d7e" + }, + "vllm/model_executor/layers/fused_moe/experts/xpu_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/xpu_moe.py", + "sha256": "2a11bac0cf9274d963315efd6eebdc62978b0b7aa02e8849ff2a562742f0b86d" + }, + "vllm/model_executor/layers/fused_moe/fused_flydsl_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_flydsl_moe.py", + "sha256": "0e74879ee5c72f616ae4064b9dff3b3a0b583b7fc70b8f92f1e8b730ecd5d39b" + }, + "vllm/model_executor/layers/fused_moe/fused_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe.py", + "sha256": "7072eb06237be9d33dcb0ef7101410f886a6363c98cbee70a014c68b70f639cb" + }, + "vllm/model_executor/layers/fused_moe/fused_moe_method_base.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe_method_base.py", + "sha256": "18dcfc469d3252749801bbf943857f58da85de1f2db8fdff5a9f4986a925dc68" + }, + "vllm/model_executor/layers/fused_moe/fused_moe_modular_method.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe_modular_method.py", + "sha256": "321c744eac1fcaffd6b1b2971204c8baa57dfec53e91e5d24140014d72d64f83" + }, + "vllm/model_executor/layers/fused_moe/hpc_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/hpc_moe.py", + "sha256": "2ca9c5d71b6fd91651027905e2b83103a8823845e053e7153e148cb8e0ee666d" + }, + "vllm/model_executor/layers/fused_moe/layer.py": { + "path": "/vllm/model_executor/layers/fused_moe/layer.py", + "sha256": "def0b4e13bcc1e4e21ee10644e647e2eda1acbf0cc01e76d6128abb59ea08224" + }, + "vllm/model_executor/layers/fused_moe/modular_kernel.py": { + "path": "/vllm/model_executor/layers/fused_moe/modular_kernel.py", + "sha256": "8dc4e0dbbf35b3aac8add63ca6f2a7bbfdadaabbd60826e24598b22c7d8e5c22" + }, + "vllm/model_executor/layers/fused_moe/moe_align_block_size.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_align_block_size.py", + "sha256": "c3f7fc2087836f0160a32ab99ceb1d8f6e87c793679da34dd672e225cb7fa31b" + }, + "vllm/model_executor/layers/fused_moe/moe_fused_mul_sum.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_fused_mul_sum.py", + "sha256": "112e72578002c3bff538418dac64b3b56d995994a2fc5e32b18d2cf3b8392a13" + }, + "vllm/model_executor/layers/fused_moe/moe_output.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_output.py", + "sha256": "6ea4cbd78f9efc7f842c5df246f553f08b991c3479b8b04b89902ed08aaf8e8f" + }, + "vllm/model_executor/layers/fused_moe/moe_permute_unpermute.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_permute_unpermute.py", + "sha256": "1adc592c6254d0c877d66be5406afbc822459c18a838f4bbd094a992e7609d06" + }, + "vllm/model_executor/layers/fused_moe/oracle/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/__init__.py", + "sha256": "4dcf941d50d48bb812de0f39e9194bf17a76b8035fe324889c6038f710fdc453" + }, + "vllm/model_executor/layers/fused_moe/oracle/base.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/base.py", + "sha256": "555bbcd18a3744e64eee4e953daabef3bd268a1bd4faf967d4cfd14d6074f685" + }, + "vllm/model_executor/layers/fused_moe/oracle/fp8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/fp8.py", + "sha256": "245bd36c285df1e6f7c51e52dcda31ad247894577a9f8d765613c2c2feae9aee" + }, + "vllm/model_executor/layers/fused_moe/oracle/int8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/int8.py", + "sha256": "c1b67886511bd966b162db5bca8930f04895fb37a969818a4a10f0726c59547f" + }, + "vllm/model_executor/layers/fused_moe/oracle/int_wna16.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/int_wna16.py", + "sha256": "cfffe8b8b290330be9d18ffa07aeecf296484395ff04df3147d99393e48b55c1" + }, + "vllm/model_executor/layers/fused_moe/oracle/mxfp4.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/mxfp4.py", + "sha256": "b7915e6779b5c88e7dcd2d227f003a8e45071d6d86877013067142d4feb64a8c" + }, + "vllm/model_executor/layers/fused_moe/oracle/mxfp8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/mxfp8.py", + "sha256": "9cfdc8102a04bb844dcd7ed88043bba96ec751794bc093da76c69aa8cf88cf48" + }, + "vllm/model_executor/layers/fused_moe/oracle/nvfp4.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/nvfp4.py", + "sha256": "735b4cdeb1258f11fb02320fc0c70cab5edaca468dd60b07b2d369389d2b0313" + }, + "vllm/model_executor/layers/fused_moe/oracle/unquantized.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/unquantized.py", + "sha256": "c8b8203bd0b73bb7f586f703607394d663f14c05711416ad42d45af564382223" + }, + "vllm/model_executor/layers/fused_moe/oracle/w4a8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/w4a8.py", + "sha256": "d7fa6e2982f20b34d5ce9c5ce28a61122762a3fcdd53d249479472a4f2316c6a" + }, + "vllm/model_executor/layers/fused_moe/oracle/w4a8_int8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/w4a8_int8.py", + "sha256": "6d6f9ca2e67b630002873de2f8d8a231d091c5c2f0f3354a9e8209449b481a4c" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/__init__.py", + "sha256": "2800113263a83c2632e522fb22790b29f63384da75d43de32f0ae2f95e8ae4c1" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/batched.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/batched.py", + "sha256": "d52425dd8c08e47cf8d9c3088daf3b1cc721c8667de4c738d04ba997f9a08ccb" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ht.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ht.py", + "sha256": "465cdf1d6cee91b2ee8c2e43abbea6e8408976e3048c10f44c089f34b415bc60" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ll.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ll.py", + "sha256": "f704922b1db680c4c212982a096e09d6b3eb97d89110313f86ed958a00df21b7" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_v2.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_v2.py", + "sha256": "8d690b016bbcfbc9eb599bcc36a6f798b2f1720c828f4347ea742e218c0cc60d" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_one_sided.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_one_sided.py", + "sha256": "acb57d8342af62bb5672036871cd4b27ecc7f37dfa7c894850bb860e6152a1f0" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_two_sided.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_two_sided.py", + "sha256": "cc5b00d6a157b6eca5afaaf7435165dbd1b4524d6d88bf75808cbe074a389f79" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/mori.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/mori.py", + "sha256": "8e9c3b5b1f0de13f467d95bf2f451cba0e4b0d9a1bdcf98da0988a3a9a79a045" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/naive_dp_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/naive_dp_ep.py", + "sha256": "db015e5b18750bbbf5b2bbaceca877dd6f3f3e74c2a94e8dc185f7413b387f91" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/nixl_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/nixl_ep.py", + "sha256": "1f71d70ac509bf5d3d67a8d95a8ee108a50af6bb5d4bde7181ca28e286f6ffce" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/no_dp_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/no_dp_ep.py", + "sha256": "adbbf529cd22059c95b5380952943a70cf11e05e321dcd707f296bebde61a6e7" + }, + "vllm/model_executor/layers/fused_moe/routed_experts.py": { + "path": "/vllm/model_executor/layers/fused_moe/routed_experts.py", + "sha256": "68c48e5df0ea4a7cc1f04436b7b9153eb53802ecd9bb55d38db8738508daac6d" + }, + "vllm/model_executor/layers/fused_moe/routed_experts_capturer.py": { + "path": "/vllm/model_executor/layers/fused_moe/routed_experts_capturer.py", + "sha256": "cd006bc1a1703418cca3b589fafb2abc4268a086fb3db044bbb64348aeac8b13" + }, + "vllm/model_executor/layers/fused_moe/router/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/layers/fused_moe/router/aiter_shared_routed_fused_moe_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/aiter_shared_routed_fused_moe_router.py", + "sha256": "f47046db1275601a2c67c9232afc7b866c9623a19639d5be867e4c7914a35069" + }, + "vllm/model_executor/layers/fused_moe/router/base_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/base_router.py", + "sha256": "47fa2324bcd9b6ebdc138d69ae6b6ecc0f2463d34bda8c5988bdb0a2a76d3fae" + }, + "vllm/model_executor/layers/fused_moe/router/bf16x3_router_gemm_cutedsl.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/bf16x3_router_gemm_cutedsl.py", + "sha256": "d0f1edd1ebc48d88e490bdb3c93db49bdc0a135ff83e7e0b57130e9f8255fc32" + }, + "vllm/model_executor/layers/fused_moe/router/cpu_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/cpu_router.py", + "sha256": "bff36b15818c87bfbb7ee3def7dc7f6396860abbe5893ff6148801fe941a4b92" + }, + "vllm/model_executor/layers/fused_moe/router/custom_routing_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/custom_routing_router.py", + "sha256": "1a40c7054e3c3a1b3ee2e98f6bc9efa9dfdc11f316a8edf7357dd91533487bfe" + }, + "vllm/model_executor/layers/fused_moe/router/dsv4_topk.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/dsv4_topk.py", + "sha256": "14f7c8487b9aef652dd61c91e0e3c3640b643bf9cd0d8a7184157d71f4beb63e" + }, + "vllm/model_executor/layers/fused_moe/router/fused_moe_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_moe_router.py", + "sha256": "0daa0dc05b931d66767feca444a4cd57ecf140f59b40ea0e8ad213eef6da2b36" + }, + "vllm/model_executor/layers/fused_moe/router/fused_topk_bias_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_topk_bias_router.py", + "sha256": "8fdc28cc248180ad4f11bb4bcda3df47926ec12665a0d84bb712fe83fc6b9376" + }, + "vllm/model_executor/layers/fused_moe/router/fused_topk_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_topk_router.py", + "sha256": "1c80f4af4d781fd66b12aa6a7a0fd30082bc521df40f1252987a8ac4c0bef51c" + }, + "vllm/model_executor/layers/fused_moe/router/gate_linear.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/gate_linear.py", + "sha256": "faa43362c2e7c568498a923c682ca18cae75e87f48d00882770821cb19c21198" + }, + "vllm/model_executor/layers/fused_moe/router/grouped_topk_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/grouped_topk_router.py", + "sha256": "048339e1799cdd42c9dae686a6cb891046577fb391b500f0d12eed73c8f61e52" + }, + "vllm/model_executor/layers/fused_moe/router/rocm_fp32_router_gemm.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/rocm_fp32_router_gemm.py", + "sha256": "9c331ef3d0bb2fb6954387d77ac62a99c5c76d2753c7438bfbb5115f68aae5ac" + }, + "vllm/model_executor/layers/fused_moe/router/router_factory.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/router_factory.py", + "sha256": "019bc8adaa7642abab82843efd53cd1a378f62c652521a1de2b781480eb88742" + }, + "vllm/model_executor/layers/fused_moe/router/routing_simulator_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/routing_simulator_router.py", + "sha256": "a7345df5add00cf3bd93024492d6fc1189fd3ecf2754a11cef1b03a295d791f7" + }, + "vllm/model_executor/layers/fused_moe/router/zero_expert_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/zero_expert_router.py", + "sha256": "dea306edd92e2b9c1b43f982ede8e1e10770d2c66220f5a106e0ed0165276e9c" + }, + "vllm/model_executor/layers/fused_moe/runner/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/layers/fused_moe/runner/moe_runner.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/moe_runner.py", + "sha256": "05893188402fe37229bf72d75088d66193c417d5d502daafd3a55e1bfedaa60c" + }, + "vllm/model_executor/layers/fused_moe/runner/moe_runner_interface.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/moe_runner_interface.py", + "sha256": "189cad01611124eb44594713cbf5918d16fc70196dc81a525ae0a7a97a5fcc51" + }, + "vllm/model_executor/layers/fused_moe/runner/shared_experts.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/shared_experts.py", + "sha256": "d89e4c79c46f6fe61262c51f3facf102e71ce1e4eb3db67f72b6bd8470937be9" + }, + "vllm/model_executor/layers/fused_moe/topk_weight_and_reduce.py": { + "path": "/vllm/model_executor/layers/fused_moe/topk_weight_and_reduce.py", + "sha256": "3dfede72d52bf99af40997994704e6c502ee3bab2bd39bfaa8a68d7dae440203" + }, + "vllm/model_executor/layers/fused_moe/unquantized_fused_moe_method.py": { + "path": "/vllm/model_executor/layers/fused_moe/unquantized_fused_moe_method.py", + "sha256": "182a5ec1874ece2091a24c5303f6ab9ea64a9a61adf325b863927f0cdd83e5d3" + }, + "vllm/model_executor/layers/fused_moe/utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/utils.py", + "sha256": "a93a0bded4008db19d8b38370526ae34fafb9c8278e5b4f60acb6acc8fdc1850" + }, + "vllm/model_executor/layers/mamba/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/abstract.py": { + "path": "/vllm/model_executor/layers/mamba/abstract.py", + "sha256": "dfdc8c836894f574e41d93d76ab989cacd3d7ecf59c97a929abfa48d9364e8ad" + }, + "vllm/model_executor/layers/mamba/gdn/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/gdn/base.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/base.py", + "sha256": "7fec748fc74131f5a45bcaf2644b3fa3a0598fd437d7347f8207ea3644a951c5" + }, + "vllm/model_executor/layers/mamba/gdn/kimi_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/kimi_gdn_linear_attn.py", + "sha256": "1cec4da5c9da73557e192bfb36cd540aae51d3e91283b554449c4a97f0f89bd9" + }, + "vllm/model_executor/layers/mamba/gdn/olmo_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/olmo_gdn_linear_attn.py", + "sha256": "60873ca3bb0c4d17c33bd259b62b658db4883cd23138f47dd4ead62cd2ff0605" + }, + "vllm/model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py", + "sha256": "b80f8e6f3fff442fb880aebb3209c52f814f66490009f4ac4003de603576d10a" + }, + "vllm/model_executor/layers/mamba/linear/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/linear/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/linear/bailing_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/linear/bailing_linear_attn.py", + "sha256": "3c480ddd6eba0766ed012a1074bbec5f241d868a87b020b0f6312222c32f93eb" + }, + "vllm/model_executor/layers/mamba/linear/base.py": { + "path": "/vllm/model_executor/layers/mamba/linear/base.py", + "sha256": "26125cd427225954e1846ca361cdaf43f2b56f11b1e217cf26e91a80ef0edb6a" + }, + "vllm/model_executor/layers/mamba/linear/minimax_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/linear/minimax_linear_attn.py", + "sha256": "4adc00f54893b5bc6c31c613deda152a19af3b1bba04153ab5924c3bf2a3aaae" + }, + "vllm/model_executor/layers/mamba/mamba_mixer.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_mixer.py", + "sha256": "a485e937ad9db14d3ad03fde5a9fe795cfa863649563e52fc7e6c52ef631164e" + }, + "vllm/model_executor/layers/mamba/mamba_mixer2.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_mixer2.py", + "sha256": "d58d93e90d9eb90bc5133b79f07c7c62d0032b35d6cf916e3fe34367b81c5cd5" + }, + "vllm/model_executor/layers/mamba/mamba_utils.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_utils.py", + "sha256": "ce9845b4a4ef4bc46577a33038ed69d59ceccb52f30e9c5bdaa36e48be3b2ca4" + }, + "vllm/model_executor/layers/mamba/ops/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/ops/causal_conv1d.py": { + "path": "/vllm/model_executor/layers/mamba/ops/causal_conv1d.py", + "sha256": "044d005cfe59fd0818ed421274e04f3e8dd679b8cdb64fca9f4422f2643484b2" + }, + "vllm/model_executor/layers/mamba/ops/cpu/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/ops/cpu/causal_conv1d.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/causal_conv1d.py", + "sha256": "64104672890ac2ef240c20c7f8059beeade707178574809dbca8721dff5ea6fa" + }, + "vllm/model_executor/layers/mamba/ops/cpu/gdn_attention.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/gdn_attention.py", + "sha256": "a50288945bf5b102ad3025ae536638dcc32d84cf7c22aaf3a85326b0c1c56c1f" + }, + "vllm/model_executor/layers/mamba/ops/cpu/mamba_ssm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/mamba_ssm.py", + "sha256": "5839e576172a3246337f5e4fb1bc19eb583b3e2b2f7e35dd060dc3041eb8372d" + }, + "vllm/model_executor/layers/mamba/ops/gather_initial_states.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gather_initial_states.py", + "sha256": "5198bb6de6d91c583a5f65d926412a76ee04a06fa72aaba76eaf156b27cd0523" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/__init__.py", + "sha256": "b88b52e71fcb21bd3fa215ea171dcd2ad2ff17c97788cfe64caa7ba45c7ecf97" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_h.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_h.py", + "sha256": "f50bbe5c0b6382323ec5dfc24a5e0c7971113d59727515e60c9fe3689734e5ba" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_kkt_inv_uw.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_kkt_inv_uw.py", + "sha256": "b4a65dd194907db08865e0596fe254f915e670a9e6b27ffa2933c1026dde9b1e" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_o.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_o.py", + "sha256": "629f7843a7e611efb9390f2ebb7a4b924b2c328d48a317fddfaa96af4d9bc60a" + }, + "vllm/model_executor/layers/mamba/ops/layernorm_gated.py": { + "path": "/vllm/model_executor/layers/mamba/ops/layernorm_gated.py", + "sha256": "3433f2e3b87c2b2ccf8e9794ce40762c86a6da38a94ecee001f439ea0d0373dd" + }, + "vllm/model_executor/layers/mamba/ops/mamba_ssm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/mamba_ssm.py", + "sha256": "a4515ec7895b40ed878cf380445034b25faa61fbaa799d96c49217bbdfd7e400" + }, + "vllm/model_executor/layers/mamba/ops/replayssm_config.py": { + "path": "/vllm/model_executor/layers/mamba/ops/replayssm_config.py", + "sha256": "5fe9d5d7aa2de6a65875b3796a919b22bc435fd76055ba054bbff43aa005bc44" + }, + "vllm/model_executor/layers/mamba/ops/scatter_states.py": { + "path": "/vllm/model_executor/layers/mamba/ops/scatter_states.py", + "sha256": "f3bb004c73edaba56337747893eb07faf29b270dc8bb9c893ee9b1044e4ead9a" + }, + "vllm/model_executor/layers/mamba/ops/selective_state_update_replayssm_output_only.py": { + "path": "/vllm/model_executor/layers/mamba/ops/selective_state_update_replayssm_output_only.py", + "sha256": "cea7fd3063ca9dcc4e33f180d01ea379195ec515cedc9d0b03b11dc67670d695" + }, + "vllm/model_executor/layers/mamba/ops/ssd_bmm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_bmm.py", + "sha256": "26983d97a7f5c5f9197a16a6bee7b1294839b9ae31a14c14aaee38b43523e630" + }, + "vllm/model_executor/layers/mamba/ops/ssd_chunk_scan.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_chunk_scan.py", + "sha256": "d5ef32e8cb47e2ce71984579df78ab69754895f891766394daf327867cfa4f8f" + }, + "vllm/model_executor/layers/mamba/ops/ssd_chunk_state.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_chunk_state.py", + "sha256": "177e3aa7fe72647133bbd86135533e8688a5802678d4d1564aa549410362316f" + }, + "vllm/model_executor/layers/mamba/ops/ssd_combined.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_combined.py", + "sha256": "1317bbb668d3c60dfe0658850f9968614f03fa5eb61196f8ce6ac17dbb31b480" + }, + "vllm/model_executor/layers/mamba/ops/ssd_state_passing.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_state_passing.py", + "sha256": "36b8c8edba437916a5b789717c61fc22077de01e77892cb96dbff3b00a57410e" + }, + "vllm/model_executor/layers/mamba/ops/ssu_dispatch.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssu_dispatch.py", + "sha256": "bbe0f0e61da87f3ddfead19a79ca376516b63f1ea868be3485333c63fa20ef41" + }, + "vllm/model_executor/layers/mamba/ops/triton_helpers.py": { + "path": "/vllm/model_executor/layers/mamba/ops/triton_helpers.py", + "sha256": "a8795532f22c37a93e82c9d8e3fadcb5f4da98673d7b321fe8481305eaafad30" + }, + "vllm/model_executor/layers/mamba/short_conv.py": { + "path": "/vllm/model_executor/layers/mamba/short_conv.py", + "sha256": "228494efab185ee17374f762874f4c8b9a26aac9decfa8c906ce38446e0de51a" + }, + "vllm/model_executor/models/qwen3_next.py": { + "path": "/vllm/model_executor/models/qwen3_next.py", + "sha256": "4fa5112ac2bf7886d41d9e1f6c3da8793620d1ec49c961b31e9609459a6a7f7a" + }, + "vllm/third_party/flash_linear_attention/__init__.py": { + "path": "/vllm/third_party/flash_linear_attention/__init__.py", + "sha256": "5dbbfa3fc286edb2e970e175ef33cee4f6181c89b0784f5a8986201b2312f54e" + }, + "vllm/third_party/flash_linear_attention/ops/__init__.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/__init__.py", + "sha256": "dd738dc1d08045e76455cdbe16052a5b769e0eb11d6e87ff28353994f880cd6c" + }, + "vllm/third_party/flash_linear_attention/ops/chunk.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk.py", + "sha256": "c105ead259e86aedc248c53e7c4cef07034d0ff12da608d80265d1dd0990803f" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_delta_h.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_delta_h.py", + "sha256": "1b3ad391f939d9443c6b7adb19e57fe381bd5dccea064e8417a4f85b0e713b26" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_o.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_o.py", + "sha256": "3b63b836a8cc561723c23db5a528a0b474d9cd78508d610f0b348c585a889a19" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_scaled_dot_kkt.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_scaled_dot_kkt.py", + "sha256": "7ae41df3755acc7e925a134d848f78bb5fc00b90069039d86403c5853323ea42" + }, + "vllm/third_party/flash_linear_attention/ops/cumsum.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/cumsum.py", + "sha256": "d818215669b451868823202ac0bcea77e7a9d75957254c7c1060a73a55dc39b6" + }, + "vllm/third_party/flash_linear_attention/ops/fused_gdn_prefill_post_conv.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_gdn_prefill_post_conv.py", + "sha256": "590717b2107abc90d72548de06b5d315229eb2775c94614f3f545df11cc2b5df" + }, + "vllm/third_party/flash_linear_attention/ops/fused_norm_gate.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_norm_gate.py", + "sha256": "e6eb90467f29d8a0a04f2a364d20a2c3191b6ab857841bfb82076b33a6022d1a" + }, + "vllm/third_party/flash_linear_attention/ops/fused_recurrent.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_recurrent.py", + "sha256": "fe6f1311014809040497aa0a623e7fa97f4b3457cdc7ee1f1f8aed21f326f755" + }, + "vllm/third_party/flash_linear_attention/ops/fused_sigmoid_gating.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_sigmoid_gating.py", + "sha256": "000ab8996af9788fdb8843a6a3b91833e7a14c8acc0e1ea073a536330f64cb6f" + }, + "vllm/third_party/flash_linear_attention/ops/index.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/index.py", + "sha256": "a4f8b2c052635cb519a80099e8a85411d1d5d6880b38f466788259bbe66b154d" + }, + "vllm/third_party/flash_linear_attention/ops/kda.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/kda.py", + "sha256": "e1f31aaa89b91f8e5db6d070b229e2c81c7206e8caec67de41db97d06be0c476" + }, + "vllm/third_party/flash_linear_attention/ops/l2norm.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/l2norm.py", + "sha256": "520f4513ef4fc97e6b88dc07877cca8e29da0d34e44673fe989e3af002d86381" + }, + "vllm/third_party/flash_linear_attention/ops/layernorm_guard.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/layernorm_guard.py", + "sha256": "42af29be26e8fc94a4658e053c095fcdab9ffdc1bc2446a01e787deda2a298c0" + }, + "vllm/third_party/flash_linear_attention/ops/op.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/op.py", + "sha256": "456da84fd12411cf53c96a90dd4f78f49afb454c3d51d2c524ea8e7106fe8ae5" + }, + "vllm/third_party/flash_linear_attention/ops/solve_tril.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/solve_tril.py", + "sha256": "d1a4ff27623a938825052500afa7e2aa24fadd2fa4c9be6376c9128824f86f82" + }, + "vllm/third_party/flash_linear_attention/ops/utils.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/utils.py", + "sha256": "d6c90d36505e02086954c23ca4dd2fea82a69416d68ff1d0501e16b3148b5b0c" + }, + "vllm/third_party/flash_linear_attention/ops/wy_fast.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/wy_fast.py", + "sha256": "c9fc8259db0a8746dc04f1d799cb73333457118cf89a0bdce8dde8a80a28cd96" + }, + "vllm/v1/attention/__init__.py": { + "path": "/vllm/v1/attention/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backend.py": { + "path": "/vllm/v1/attention/backend.py", + "sha256": "01ac364372afa75fdb22486aa3a9c7cf9aebb742e3471dfb9e0f9d9d36b734bc" + }, + "vllm/v1/attention/backends/__init__.py": { + "path": "/vllm/v1/attention/backends/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backends/b12x.py": { + "path": "/vllm/v1/attention/backends/b12x.py", + "sha256": "443f0a98738fdfefe5b9ab151d278bfd43a8ac807eb2b0b9b2a13d51922afbf9" + }, + "vllm/v1/attention/backends/composite.py": { + "path": "/vllm/v1/attention/backends/composite.py", + "sha256": "4cf3d66dca891562709eed4f50aa14b0ae6c8240d9ea86504a3304b2f356cce0" + }, + "vllm/v1/attention/backends/cpu_attn.py": { + "path": "/vllm/v1/attention/backends/cpu_attn.py", + "sha256": "76fb02a6bd725125565d84bf04f627cf16da5f7ff8f31f87c01ed6a1439398c7" + }, + "vllm/v1/attention/backends/fa_utils.py": { + "path": "/vllm/v1/attention/backends/fa_utils.py", + "sha256": "08fa6e231d3af3a71a6e59162dd12328aa8beb28548165ae58f130a92adb5a83" + }, + "vllm/v1/attention/backends/flash_attn.py": { + "path": "/vllm/v1/attention/backends/flash_attn.py", + "sha256": "b170a4789e18104c1bee35bea70df51abe6766693d8f4726a59f2e6f5c4282aa" + }, + "vllm/v1/attention/backends/flash_attn_diffkv.py": { + "path": "/vllm/v1/attention/backends/flash_attn_diffkv.py", + "sha256": "e4627c88c3ba8caee260540e994cc8137fd2ff7cd7813356b36387c6c88ce30a" + }, + "vllm/v1/attention/backends/flashinfer.py": { + "path": "/vllm/v1/attention/backends/flashinfer.py", + "sha256": "8ee541fde43ed92a417b3f01ea1e6fc64af8ab2eb54cbfc28308a49aaca4ed7f" + }, + "vllm/v1/attention/backends/flex_attention.py": { + "path": "/vllm/v1/attention/backends/flex_attention.py", + "sha256": "ad07f0ad73aeeadc3534b3a05c14f88a62cb3638874239ae9823c49b36276dc3" + }, + "vllm/v1/attention/backends/gdn_attn.py": { + "path": "/vllm/v1/attention/backends/gdn_attn.py", + "sha256": "3831019404a92200a38b43571c040cffeb6638bbdc71e4cb5e680dbc6c93d054" + }, + "vllm/v1/attention/backends/hpc_attn.py": { + "path": "/vllm/v1/attention/backends/hpc_attn.py", + "sha256": "af9e2aec1b498f0ee48a2dce3cf5646edf1976466980b2fd927c0e82b875427c" + }, + "vllm/v1/attention/backends/linear_attn.py": { + "path": "/vllm/v1/attention/backends/linear_attn.py", + "sha256": "bc42144fcd027434c6a10dc9f4c5f991db8899d387af5f6485402ce097eb0513" + }, + "vllm/v1/attention/backends/mamba1_attn.py": { + "path": "/vllm/v1/attention/backends/mamba1_attn.py", + "sha256": "32159dae11cab3c8c576b9514ad97d5108c8d1b4cac9fcfe345ec6a76223aee7" + }, + "vllm/v1/attention/backends/mamba2_attn.py": { + "path": "/vllm/v1/attention/backends/mamba2_attn.py", + "sha256": "a5bcdecb7b9547137023e1c77a386003358fa940eaf5f319ed142211dcdba139" + }, + "vllm/v1/attention/backends/mamba_attn.py": { + "path": "/vllm/v1/attention/backends/mamba_attn.py", + "sha256": "5e7b2c4058fc5e6096d001bff6c789b78368b025bbe4600f191aaca2ff59b59f" + }, + "vllm/v1/attention/backends/mla/__init__.py": { + "path": "/vllm/v1/attention/backends/mla/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backends/mla/aiter_triton_mla.py": { + "path": "/vllm/v1/attention/backends/mla/aiter_triton_mla.py", + "sha256": "ed0e285cdae06a019150c41cc958b3c0b5ceb0e4f299d5318d1c90e2c2395390" + }, + "vllm/v1/attention/backends/mla/amx_mla.py": { + "path": "/vllm/v1/attention/backends/mla/amx_mla.py", + "sha256": "7f5cddec30b2dfe22ccdbd3b9da673c879719bf6da4074317bd60add55f5d15f" + }, + "vllm/v1/attention/backends/mla/compressor_utils.py": { + "path": "/vllm/v1/attention/backends/mla/compressor_utils.py", + "sha256": "3589e94105368ea285c40b82db1a0332682ff5d071fe363627cf4c0d10f3facf" + }, + "vllm/v1/attention/backends/mla/cpu_mla.py": { + "path": "/vllm/v1/attention/backends/mla/cpu_mla.py", + "sha256": "ff2110b9f78e92adf6bab294465cbc294ae1ff71cb1780fed158179e134a4ca6" + }, + "vllm/v1/attention/backends/mla/cutlass_mla.py": { + "path": "/vllm/v1/attention/backends/mla/cutlass_mla.py", + "sha256": "211d298680f9bd793cc468281b316d6633c5f4eb6dcec71d3329b034a23ab9b5" + }, + "vllm/v1/attention/backends/mla/flashattn_mla.py": { + "path": "/vllm/v1/attention/backends/mla/flashattn_mla.py", + "sha256": "ac89e0ad75a37e92566d264bafe324735a80f9ab4709241a4454d17b3d38bb63" + }, + "vllm/v1/attention/backends/mla/flashattn_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashattn_mla_sparse.py", + "sha256": "67dd3ead2e8b9d8cda0825ecc93779cb7d670628bc741c759a7d3cd5d474030f" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla.py", + "sha256": "0c24ff016fb6b0bb41d9e7484b6f1af42f37bcc384ed613473fc3e01ad25f664" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse.py", + "sha256": "2116d965b2067134d8afa5878d4d16c0149b061258f50c4106d993aa13b073cc" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm120.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm120.py", + "sha256": "102ca08793d567f95598eefeb34c3f6ec50b3b9d704f162d1402b97b12b5777b" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm90.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm90.py", + "sha256": "df9fe4970aa3f53cf24784b8534b89e0101a2ca20a35a2ebbc9a12a4463d5993" + }, + "vllm/v1/attention/backends/mla/flashmla.py": { + "path": "/vllm/v1/attention/backends/mla/flashmla.py", + "sha256": "c9d8046a853ecbdeff9ebfc738f5bb34c4f272b278231a09a0fbf73708c7c188" + }, + "vllm/v1/attention/backends/mla/flashmla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashmla_sparse.py", + "sha256": "7a379c717adb9667ce94cbc16c0e3a1fb22a169713db6d7941c141fa84077b3f" + }, + "vllm/v1/attention/backends/mla/index_group.py": { + "path": "/vllm/v1/attention/backends/mla/index_group.py", + "sha256": "c24e028c3c160a9bb92e043da5b5b34c805e84745b7c4b8da6fb8702a0ddd641" + }, + "vllm/v1/attention/backends/mla/indexer.py": { + "path": "/vllm/v1/attention/backends/mla/indexer.py", + "sha256": "2acbc1c4fa57c3424ad95e6ecbe76eb7141747773c3e867ce704f4adccba892a" + }, + "vllm/v1/attention/backends/mla/prefill/__init__.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/__init__.py", + "sha256": "903630eb705dd175bf4ae4558a4bcaa07c110056b6a11eb830fdd2fb21b3c48a" + }, + "vllm/v1/attention/backends/mla/prefill/aiter_flash_attn.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/aiter_flash_attn.py", + "sha256": "571b8a9910c4ea3fefda60659026f3bf0d7b542c34553c8c9a4d43bb82077e61" + }, + "vllm/v1/attention/backends/mla/prefill/base.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/base.py", + "sha256": "138bf3ddaf5a94c3cdbc4e08ac676edcae84b32fc76625e546f3b47f7d8b82ec" + }, + "vllm/v1/attention/backends/mla/prefill/cpu_sdpa.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/cpu_sdpa.py", + "sha256": "1bb686395274a8ec0d9fd7327410a527655fe060cbbc263eab138fea988d96de" + }, + "vllm/v1/attention/backends/mla/prefill/flash_attn.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/flash_attn.py", + "sha256": "5e648c82c82e5f81fe11458eb82b9f90b50fc06df2ade3bf111ee6b7a2ee8481" + }, + "vllm/v1/attention/backends/mla/prefill/flashinfer.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/flashinfer.py", + "sha256": "63861219c35b8abc0ebe01e1f51543c5ed40bd46119ca261d927da7c6826b49b" + }, + "vllm/v1/attention/backends/mla/prefill/registry.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/registry.py", + "sha256": "c8c30b92213d594beaa3cab4d5003da26a85870dbb11d1ab73191962d0645b53" + }, + "vllm/v1/attention/backends/mla/prefill/selector.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/selector.py", + "sha256": "101d9fca7924b0c5d7891a17fe8942611bd6759e32b03a571dc87b14c1430f2f" + }, + "vllm/v1/attention/backends/mla/prefill/tokenspeed_mla.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/tokenspeed_mla.py", + "sha256": "047cf07bfcc83db3b11a6a54ffe189f6146e6ec9ad33ce2fa7d18860bf4210f0" + }, + "vllm/v1/attention/backends/mla/prefill/trtllm_ragged.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/trtllm_ragged.py", + "sha256": "9e13ea6f6a25accedd918c0de64bbb812ccb20ffb95350ab018a6e76d493789b" + }, + "vllm/v1/attention/backends/mla/rocm_aiter_mla.py": { + "path": "/vllm/v1/attention/backends/mla/rocm_aiter_mla.py", + "sha256": "b489f5830c655bfb6299801a70d69b9821513c69568ecab3689db5a7be867be5" + }, + "vllm/v1/attention/backends/mla/rocm_aiter_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/rocm_aiter_mla_sparse.py", + "sha256": "91b1d9b3d860a9720bc01b8ebe9bbe8649a7d6bca20d4b63939bc100309bca19" + }, + "vllm/v1/attention/backends/mla/sparse_swa.py": { + "path": "/vllm/v1/attention/backends/mla/sparse_swa.py", + "sha256": "a47853ad8a3fe40f24704592581ea323a18041b84610df010a5534da634e311e" + }, + "vllm/v1/attention/backends/mla/sparse_utils.py": { + "path": "/vllm/v1/attention/backends/mla/sparse_utils.py", + "sha256": "c3cdf060288c05542243a9fe8b5ad3a963ad75e9ce399009b5e45c1235a88ce4" + }, + "vllm/v1/attention/backends/mla/tokenspeed_mla.py": { + "path": "/vllm/v1/attention/backends/mla/tokenspeed_mla.py", + "sha256": "b9ba523c606430cecb99a88b28c53d98a99dcf5e76105a80664338110a20f1ad" + }, + "vllm/v1/attention/backends/mla/triton_mla.py": { + "path": "/vllm/v1/attention/backends/mla/triton_mla.py", + "sha256": "21b16b3b34470edcc33d0423e560837c1d37d4bab31c7b3b9cfd7faa47864b51" + }, + "vllm/v1/attention/backends/mla/xpu_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/xpu_mla_sparse.py", + "sha256": "559c6240fe466521a6b2df4c94aea02ddf3f5efa5ba6954fa180c5a51c0f12d2" + }, + "vllm/v1/attention/backends/recoverssm_metadata.py": { + "path": "/vllm/v1/attention/backends/recoverssm_metadata.py", + "sha256": "02896a667db0f0308371ceb50048b18e5866c0235d163c0357e9a05dcedb3394" + }, + "vllm/v1/attention/backends/registry.py": { + "path": "/vllm/v1/attention/backends/registry.py", + "sha256": "378e8ee78734bd8c8adbe287d4c0a4058dcbb553195a09fbcce00a3cc30adc29" + }, + "vllm/v1/attention/backends/rocm_aiter_fa.py": { + "path": "/vllm/v1/attention/backends/rocm_aiter_fa.py", + "sha256": "d1418af03bf58209c850f466b712d3ea22a14ebb758c42dd43e65738281841fd" + }, + "vllm/v1/attention/backends/rocm_aiter_unified_attn.py": { + "path": "/vllm/v1/attention/backends/rocm_aiter_unified_attn.py", + "sha256": "59d2645eb4c91dc0567754a7163d066f4f2faf48f1957b254fcdd5604e9d8c8c" + }, + "vllm/v1/attention/backends/rocm_attn.py": { + "path": "/vllm/v1/attention/backends/rocm_attn.py", + "sha256": "4a8f57067073fbceb784af6c3467487c450d00fa3957928fadb99a79f6036292" + }, + "vllm/v1/attention/backends/short_conv_attn.py": { + "path": "/vllm/v1/attention/backends/short_conv_attn.py", + "sha256": "84fc460ef2fbd09743b069bec0c14b39542af6c2254a403e37a048427e151121" + }, + "vllm/v1/attention/backends/triton_attn.py": { + "path": "/vllm/v1/attention/backends/triton_attn.py", + "sha256": "1057663d110e1d5229495a799027b27277c1eca325d5b6780fa2259afbf58a1a" + }, + "vllm/v1/attention/backends/triton_attn_diffkv.py": { + "path": "/vllm/v1/attention/backends/triton_attn_diffkv.py", + "sha256": "de0357eae005246642140f1ab8842ba5ed8bff5c84b18a6d3a7bbf409c578301" + }, + "vllm/v1/attention/backends/triton_flash_attn.py": { + "path": "/vllm/v1/attention/backends/triton_flash_attn.py", + "sha256": "176e45329aeb28a2008362bb607d1b8c89816eb665859ab908b0385a11acf1c2" + }, + "vllm/v1/attention/backends/triton_flashinfer.py": { + "path": "/vllm/v1/attention/backends/triton_flashinfer.py", + "sha256": "48d5f967e388d4e8d6bbec8d827b44d855346bc2fada28adf65768bf6623527b" + }, + "vllm/v1/attention/backends/turboquant_attn.py": { + "path": "/vllm/v1/attention/backends/turboquant_attn.py", + "sha256": "616d16d608d9d1fbf6c29548037e7e9cf330f4d36a01aa3ffabf42a731eb6e2b" + }, + "vllm/v1/attention/backends/utils.py": { + "path": "/vllm/v1/attention/backends/utils.py", + "sha256": "fbc221360d2d54cb21ef3f625dc8711500de345a355801548b4337bb9b8abee0" + }, + "vllm/v1/attention/ops/__init__.py": { + "path": "/vllm/v1/attention/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/ops/chunked_prefill_paged_decode.py": { + "path": "/vllm/v1/attention/ops/chunked_prefill_paged_decode.py", + "sha256": "973db848a790b2e8d99e728b2fc4f44b501bbe58c62747244ddff04cfcf11a85" + }, + "vllm/v1/attention/ops/common.py": { + "path": "/vllm/v1/attention/ops/common.py", + "sha256": "b4b67e7fc0cce471e337d742c097fba06da7563816e8799e27719714e31e1d5b" + }, + "vllm/v1/attention/ops/cp_common.py": { + "path": "/vllm/v1/attention/ops/cp_common.py", + "sha256": "2369181862e96db64b14ef20c5c2e249ed2ea5f3dea2467a2aa388372bb86d9d" + }, + "vllm/v1/attention/ops/dcp.py": { + "path": "/vllm/v1/attention/ops/dcp.py", + "sha256": "a478bdc781460f0582cfaf74d6431f1a826c201f02f39d882d12a96139bc3f28" + }, + "vllm/v1/attention/ops/flashmla.py": { + "path": "/vllm/v1/attention/ops/flashmla.py", + "sha256": "8a40d6e120e3ab25a95fcfeb32b0b5b4c1ea02b984633866628536dcd26ed2e8" + }, + "vllm/v1/attention/ops/flydsl_kernels/__init__.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/attention/ops/flydsl_kernels/tq_decode.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/tq_decode.py", + "sha256": "cc4b7f82897596e0974b3d3a710a1a8bc58c3d22b72cc7f461dd1c4acd2e451b" + }, + "vllm/v1/attention/ops/flydsl_kernels/tq_decode_gqa6.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/tq_decode_gqa6.py", + "sha256": "a983f6d375c325900955e11696dab1e2665770e83f84d51f93d3ed5e1d8880e0" + }, + "vllm/v1/attention/ops/flydsl_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/flydsl_turboquant_decode.py", + "sha256": "7b1dd0ef7c7fb28a6a8831759e00b939ab844d067657155cc11cf75532a22c63" + }, + "vllm/v1/attention/ops/int4_per_token_head.py": { + "path": "/vllm/v1/attention/ops/int4_per_token_head.py", + "sha256": "d91968f280cd8eaed7570ab255f0276b40e833e18a25066d371d9ca8149425f2" + }, + "vllm/v1/attention/ops/merge_attn_states.py": { + "path": "/vllm/v1/attention/ops/merge_attn_states.py", + "sha256": "ad08403d2843fc892f0b0b4b9f5fabb81884556f89f7170dca46ccef498a3539" + }, + "vllm/v1/attention/ops/metadata.py": { + "path": "/vllm/v1/attention/ops/metadata.py", + "sha256": "ca882b84c5aaefb1f77e4d8ea09a00103fbc53defa8671bba036c961c17fc760" + }, + "vllm/v1/attention/ops/paged_attn.py": { + "path": "/vllm/v1/attention/ops/paged_attn.py", + "sha256": "016a95f892ec751c86b37be1e12171bad9f0b4076bbf2219ff336f4e9c503653" + }, + "vllm/v1/attention/ops/pcp.py": { + "path": "/vllm/v1/attention/ops/pcp.py", + "sha256": "dadeff95fe2df2be8028baabeef01b0d2d628cd67de2176915e737ce096de3dd" + }, + "vllm/v1/attention/ops/prefix_prefill.py": { + "path": "/vllm/v1/attention/ops/prefix_prefill.py", + "sha256": "b08ad92db715fc03c11699de3de463d55e411f42f77548e06b41049a61de692f" + }, + "vllm/v1/attention/ops/rocm_aiter_mla_merge.py": { + "path": "/vllm/v1/attention/ops/rocm_aiter_mla_merge.py", + "sha256": "564c66e4877732e48a6f7d52405c43dc952eec0f0ae4353d34886bca056132b9" + }, + "vllm/v1/attention/ops/rocm_aiter_mla_sparse.py": { + "path": "/vllm/v1/attention/ops/rocm_aiter_mla_sparse.py", + "sha256": "feec664be5045fd1ba13b8f6ef83b52c96910ddc78baca0431bcf610c9e8f5cc" + }, + "vllm/v1/attention/ops/triton_attention_helpers.py": { + "path": "/vllm/v1/attention/ops/triton_attention_helpers.py", + "sha256": "35aa993d01345f535d2641cf9dcabb8b64c51b20a19707bc5987e616aaa87ddd" + }, + "vllm/v1/attention/ops/triton_decode_attention.py": { + "path": "/vllm/v1/attention/ops/triton_decode_attention.py", + "sha256": "b9823c65eba22d76abf64dad7d7d16a950f67471c86d6cb5b3e983aaf14381ac" + }, + "vllm/v1/attention/ops/triton_merge_attn_states.py": { + "path": "/vllm/v1/attention/ops/triton_merge_attn_states.py", + "sha256": "f63229162181ab93198550b73a115f1cc1034cfd60e6f58bc8ab3e22a6e8ce60" + }, + "vllm/v1/attention/ops/triton_prefill_attention.py": { + "path": "/vllm/v1/attention/ops/triton_prefill_attention.py", + "sha256": "352c1a4ac86146580040579fb217c2e288268830d6602b735713e154f36d74fe" + }, + "vllm/v1/attention/ops/triton_reshape_and_cache_flash.py": { + "path": "/vllm/v1/attention/ops/triton_reshape_and_cache_flash.py", + "sha256": "6cac51475b8c656992a21b2d150acd3a16a95a7ab7d49aab151a3ef13c24b80d" + }, + "vllm/v1/attention/ops/triton_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/triton_turboquant_decode.py", + "sha256": "8e52678136449e4bbca2195fbcbb87426c955a2b1b8422e7ab9511e45ee5f5c6" + }, + "vllm/v1/attention/ops/triton_turboquant_store.py": { + "path": "/vllm/v1/attention/ops/triton_turboquant_store.py", + "sha256": "6e6e2fe74a307d40f0be786ccbaea76d989e3c7b5985f3144a5218c61bf6d902" + }, + "vllm/v1/attention/ops/triton_unified_attention.py": { + "path": "/vllm/v1/attention/ops/triton_unified_attention.py", + "sha256": "65d0fbcf33d00789df8ca688c0a1c908e710cfaef53471178747ecae11f05829" + }, + "vllm/v1/attention/ops/triton_unified_attention_diffkv.py": { + "path": "/vllm/v1/attention/ops/triton_unified_attention_diffkv.py", + "sha256": "7fa36d7b7441f1c396e0348eac61d691d2e459e5c4c393c4aa262dfb670e68f7" + }, + "vllm/v1/attention/ops/turboquant_soa/__init__.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/__init__.py", + "sha256": "6b43b6fcb2a71c44ceff4ed1edd417a839f4901251ba15831b09ad979baa4984" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode.py", + "sha256": "bf00634191bba14cbf4a23c1d67dc3dcb244c2b8989f08362757b54435830986" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode_v2.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode_v2.py", + "sha256": "28e7ecc15c450d3591983a50c46a03aa6ca6fa99304c17c333940617d9916485" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_store.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_store.py", + "sha256": "dccf93b9fdd34f9b9eacd468e9de35b9d93378594487c335cf50642aaec681f2" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_unified_attention.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_unified_attention.py", + "sha256": "b4b2b5f3985b3a6126fd052e6ec1ed91c610da8a525a9ae7470ac829405bd85c" + }, + "vllm/v1/attention/ops/vit_attn_wrappers.py": { + "path": "/vllm/v1/attention/ops/vit_attn_wrappers.py", + "sha256": "a99d57b58269c7521fa5d7d47af06551f3bab2b5c7358ef78165a7f6e20a92a6" + }, + "vllm/v1/attention/ops/xpu_mla_sparse.py": { + "path": "/vllm/v1/attention/ops/xpu_mla_sparse.py", + "sha256": "d98d17110577c2b7b4d05e07bfdae15faf83321b6342a5daaaecce45b9503f38" + }, + "vllm/v1/attention/selector.py": { + "path": "/vllm/v1/attention/selector.py", + "sha256": "87f653ded7974875183c920e3e4589c28116bcbc99714d1da7cb51ae77c0b182" + }, + "vllm/v1/core/sched/__init__.py": { + "path": "/vllm/v1/core/sched/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/core/sched/async_scheduler.py": { + "path": "/vllm/v1/core/sched/async_scheduler.py", + "sha256": "e586a0ef3c6778be56a93e7f9bb712d4de9de6e7d7fe7e3e1d51dae83ecfc508" + }, + "vllm/v1/core/sched/interface.py": { + "path": "/vllm/v1/core/sched/interface.py", + "sha256": "be6c008664096c5660a8879de72b315bbe479bf1d688be9b25891063ec53a367" + }, + "vllm/v1/core/sched/output.py": { + "path": "/vllm/v1/core/sched/output.py", + "sha256": "3a66c8efaefe10c572f6f33cf1f8aa4610758c945130cad62eb9f7331005677c" + }, + "vllm/v1/core/sched/request_queue.py": { + "path": "/vllm/v1/core/sched/request_queue.py", + "sha256": "4b8d938e5fb8152fe61030b8aa991f983fcac9a405c37ed8908045e05e82ae5e" + }, + "vllm/v1/core/sched/scheduler.py": { + "path": "/vllm/v1/core/sched/scheduler.py", + "sha256": "c1db45f3bbad3a875dd8638331b8870c4380ac1ab4734265ba5c863833a82884" + }, + "vllm/v1/core/sched/utils.py": { + "path": "/vllm/v1/core/sched/utils.py", + "sha256": "1ed988044eb8028c77ede875bd1a5fd05ff6998b455d61e3997d6a3d7fc1c3a7" + }, + "vllm/v1/sample/__init__.py": { + "path": "/vllm/v1/sample/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/sample/logits_processor/__init__.py": { + "path": "/vllm/v1/sample/logits_processor/__init__.py", + "sha256": "1f9b02dae8cf6d44484638037123d3a2dec6b7b9a2bcc9afceef1a9bf3eaedec" + }, + "vllm/v1/sample/logits_processor/builtin.py": { + "path": "/vllm/v1/sample/logits_processor/builtin.py", + "sha256": "6105816ece77e5b1dbee0d07abc90ce039d650bac2ddb85c93280c48b00f2ebe" + }, + "vllm/v1/sample/logits_processor/interface.py": { + "path": "/vllm/v1/sample/logits_processor/interface.py", + "sha256": "171dfc6ef9b5b53128e8eaecc4bdf1de413a706d64bf5be686048f583c66eee1" + }, + "vllm/v1/sample/logits_processor/state.py": { + "path": "/vllm/v1/sample/logits_processor/state.py", + "sha256": "a96411f14362c45f839e181dcb3ac01d5b880812bccb3552fc17863b219f44ac" + }, + "vllm/v1/sample/metadata.py": { + "path": "/vllm/v1/sample/metadata.py", + "sha256": "6582cfe1a240c7ddb975f0ef6dd7dcd28dcf0fc7670394390250013977aa7ffd" + }, + "vllm/v1/sample/ops/__init__.py": { + "path": "/vllm/v1/sample/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/sample/ops/bad_words.py": { + "path": "/vllm/v1/sample/ops/bad_words.py", + "sha256": "0b1d0a9b13b92ddcae2c83393c07a34c0f107813725700dee794caa7fe7f3b12" + }, + "vllm/v1/sample/ops/logprobs.py": { + "path": "/vllm/v1/sample/ops/logprobs.py", + "sha256": "b286f69012a6758bfe9250038b0697294dbffe0d32c6906f284c39f75ee48be3" + }, + "vllm/v1/sample/ops/penalties.py": { + "path": "/vllm/v1/sample/ops/penalties.py", + "sha256": "4debfcf247b3887478d2b9ec98f108756bbed2805462777ef6b56f3bdf4ce682" + }, + "vllm/v1/sample/ops/topk_topp_sampler.py": { + "path": "/vllm/v1/sample/ops/topk_topp_sampler.py", + "sha256": "13ea4359832bc914492330958ec4f5ac140f408b8f410cc05c6eaf7ddcd70be4" + }, + "vllm/v1/sample/ops/topk_topp_triton.py": { + "path": "/vllm/v1/sample/ops/topk_topp_triton.py", + "sha256": "0b5fc337058e22bc28a8530ccec904d6ccd89b9548b02955c657ac429b1669d2" + }, + "vllm/v1/sample/rejection_sampler.py": { + "path": "/vllm/v1/sample/rejection_sampler.py", + "sha256": "0bb9d224887ccb1355e16199005cc23a4afc6fa75156eca419851b7247d99750" + }, + "vllm/v1/sample/sampler.py": { + "path": "/vllm/v1/sample/sampler.py", + "sha256": "f95805b2c6d06218c724826aa5f881a606e8d0a534a566aee7c85948520dd216" + }, + "vllm/v1/sample/thinking_budget_state.py": { + "path": "/vllm/v1/sample/thinking_budget_state.py", + "sha256": "962f8f55210eb0a431cb9c78b013e35f7a7dd58d06d6fb2e7fcff1b457356f8e" + }, + "vllm/v1/worker/__init__.py": { + "path": "/vllm/v1/worker/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/block_table.py": { + "path": "/vllm/v1/worker/block_table.py", + "sha256": "a09b8819e1417b7a186cf3472224e2138fc5d41a291c6692bb7df711b0c44259" + }, + "vllm/v1/worker/cp_utils.py": { + "path": "/vllm/v1/worker/cp_utils.py", + "sha256": "e32625d83a641b8dd8df82e92d1b6fb20af0cdf2e8fbd2fb131aa3c215415448" + }, + "vllm/v1/worker/cpu/__init__.py": { + "path": "/vllm/v1/worker/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/cpu/buffer_utils.py": { + "path": "/vllm/v1/worker/cpu/buffer_utils.py", + "sha256": "e7313fd8c2c76ebfb98d2fa53008bc9691d0f83a7d7c05e87602b5a29fb79e04" + }, + "vllm/v1/worker/cpu/model_runner.py": { + "path": "/vllm/v1/worker/cpu/model_runner.py", + "sha256": "24a1c916550051327dd5893243a6d4200f3824b91b3af8aa6f6c793fd7c68c3e" + }, + "vllm/v1/worker/cpu/shm.py": { + "path": "/vllm/v1/worker/cpu/shm.py", + "sha256": "08491af8ad341399d1375f2d21ad00414d4c89b0a5c03f55de8704914bbfcbd9" + }, + "vllm/v1/worker/cpu_model_runner.py": { + "path": "/vllm/v1/worker/cpu_model_runner.py", + "sha256": "92111aba92f00571f1a3c4c6e43cf1da6ccb4d2afac2f4d5abc018a4a6e7e8bd" + }, + "vllm/v1/worker/cpu_worker.py": { + "path": "/vllm/v1/worker/cpu_worker.py", + "sha256": "a8051b9e510ef0af9cc34004f2cbe5c0f902bd0cebc32c9464e744344dfdf849" + }, + "vllm/v1/worker/dp_utils.py": { + "path": "/vllm/v1/worker/dp_utils.py", + "sha256": "8cd19f1bfbc5c4f6ec60df89aea7c8a19b400ebc264f372b103014152e92158c" + }, + "vllm/v1/worker/ec_connector_model_runner_mixin.py": { + "path": "/vllm/v1/worker/ec_connector_model_runner_mixin.py", + "sha256": "fe9b11cebb8562f1bfe98b98a5647b2b081a6e424cb60d4ffe2412c91a99215e" + }, + "vllm/v1/worker/encoder_cudagraph.py": { + "path": "/vllm/v1/worker/encoder_cudagraph.py", + "sha256": "6a08d3779bca1b47dbf9daf6eafe2d3c70dbcb8aeb7d63ba7efacc68241ee3bc" + }, + "vllm/v1/worker/encoder_cudagraph_defs.py": { + "path": "/vllm/v1/worker/encoder_cudagraph_defs.py", + "sha256": "bb7be050fcaa8868e7816c84caec875da57050d65fe7eaf00f3d41473df25e3a" + }, + "vllm/v1/worker/gpu/__init__.py": { + "path": "/vllm/v1/worker/gpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/async_utils.py": { + "path": "/vllm/v1/worker/gpu/async_utils.py", + "sha256": "77e17a4570ead2be30ae9b00888cf077a3b873018c12ca0549b853bfda02c1ba" + }, + "vllm/v1/worker/gpu/attn_utils.py": { + "path": "/vllm/v1/worker/gpu/attn_utils.py", + "sha256": "b9b81e59dda2720b1f9c434471381f879228832443e52756e469b4ad4905888f" + }, + "vllm/v1/worker/gpu/block_table.py": { + "path": "/vllm/v1/worker/gpu/block_table.py", + "sha256": "61c004315d5af7e7eae4e2a9e6be92ea82c520327690a7f55a73bb9ce95f520a" + }, + "vllm/v1/worker/gpu/buffer_utils.py": { + "path": "/vllm/v1/worker/gpu/buffer_utils.py", + "sha256": "6597f701a30261bf250e9ad5a29737264624a1caa20527aeea0dad630325b093" + }, + "vllm/v1/worker/gpu/cp_utils.py": { + "path": "/vllm/v1/worker/gpu/cp_utils.py", + "sha256": "456c1bb7e262d99ff555522a4f134e5a9b42aee23290be25455eaef36ee8eaaf" + }, + "vllm/v1/worker/gpu/cudagraph_utils.py": { + "path": "/vllm/v1/worker/gpu/cudagraph_utils.py", + "sha256": "6e9c042890603535e300a40df8ee159dbed1058a64a83ae50ff0329e332e05ff" + }, + "vllm/v1/worker/gpu/dp_utils.py": { + "path": "/vllm/v1/worker/gpu/dp_utils.py", + "sha256": "e26867bc89e6bfc933cabc5ed13e5dc7b8d2d3030118ca1ca64c8785dabc0fc1" + }, + "vllm/v1/worker/gpu/ec_connector.py": { + "path": "/vllm/v1/worker/gpu/ec_connector.py", + "sha256": "2afe6e641f4ae3eb3b8da336c74eaa7479bf617b27cfb39a1fcbe487686f0a08" + }, + "vllm/v1/worker/gpu/eplb_utils.py": { + "path": "/vllm/v1/worker/gpu/eplb_utils.py", + "sha256": "1829fac11464aed4649179b302df198de51b95d0589f4e56bea305a876a63e26" + }, + "vllm/v1/worker/gpu/input_batch.py": { + "path": "/vllm/v1/worker/gpu/input_batch.py", + "sha256": "d5dd956eb319bd69dd9e762047833d81ad40b21fce619fcb2133759e73620694" + }, + "vllm/v1/worker/gpu/kv_connector.py": { + "path": "/vllm/v1/worker/gpu/kv_connector.py", + "sha256": "b89a4333f1e552d86e1815674b59e9f1335f0f49c0a7b46082439076f62c6a81" + }, + "vllm/v1/worker/gpu/lora_utils.py": { + "path": "/vllm/v1/worker/gpu/lora_utils.py", + "sha256": "1e90eddd9ddb4ca55e574bb28e87ae3a6f6750175a62d373102426543f4ccd66" + }, + "vllm/v1/worker/gpu/metrics/__init__.py": { + "path": "/vllm/v1/worker/gpu/metrics/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/metrics/logits.py": { + "path": "/vllm/v1/worker/gpu/metrics/logits.py", + "sha256": "ea058d7510a077a55f8ac7e4c3d596508346244e908cb372865d7159f62edc89" + }, + "vllm/v1/worker/gpu/mm/__init__.py": { + "path": "/vllm/v1/worker/gpu/mm/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/mm/encoder_cache.py": { + "path": "/vllm/v1/worker/gpu/mm/encoder_cache.py", + "sha256": "89c500338fddbeee7c4fca978a3a7c4c566a03e848e399d303fbee3c80631cd2" + }, + "vllm/v1/worker/gpu/mm/encoder_runner.py": { + "path": "/vllm/v1/worker/gpu/mm/encoder_runner.py", + "sha256": "0981e352d70301b7154a217a48665ffe35f215d053ec5740c2515a3e1e11b4e6" + }, + "vllm/v1/worker/gpu/mm/lora.py": { + "path": "/vllm/v1/worker/gpu/mm/lora.py", + "sha256": "a3eddfad6ad64de276964240c28dc080888df4a56dd5eac18f89428f2cbb7a01" + }, + "vllm/v1/worker/gpu/mm/rope.py": { + "path": "/vllm/v1/worker/gpu/mm/rope.py", + "sha256": "0924375bcb367267e783b57dd2ad9de1189d97025ce4313baaa54f2911eaaf1e" + }, + "vllm/v1/worker/gpu/model_runner.py": { + "path": "/vllm/v1/worker/gpu/model_runner.py", + "sha256": "174c93db921c23cf0396eee4764be25b2bd2d4b6a06e9fa41ce3598b884ce8ce" + }, + "vllm/v1/worker/gpu/model_states/__init__.py": { + "path": "/vllm/v1/worker/gpu/model_states/__init__.py", + "sha256": "07815d0b788fc88185772f581bbf892a675259f9288375571f29887622f8d93c" + }, + "vllm/v1/worker/gpu/model_states/default.py": { + "path": "/vllm/v1/worker/gpu/model_states/default.py", + "sha256": "bb614f814780f052e869f9acf31dfbfa68718ee7dc6252eefa901b5730ee8a2a" + }, + "vllm/v1/worker/gpu/model_states/encoder_decoder.py": { + "path": "/vllm/v1/worker/gpu/model_states/encoder_decoder.py", + "sha256": "a5868059d8af672548b41d0e623e884320e6ed61e6aaca2d2828ff5be0356f2f" + }, + "vllm/v1/worker/gpu/model_states/encoder_only.py": { + "path": "/vllm/v1/worker/gpu/model_states/encoder_only.py", + "sha256": "84e96b55a2639e2a73fa4a0308acc89c8d053dc715481180b237e0196dcef99f" + }, + "vllm/v1/worker/gpu/model_states/interface.py": { + "path": "/vllm/v1/worker/gpu/model_states/interface.py", + "sha256": "5675b6fedc7403a9ab410b1e5565974e78fac23c42ab4253ae1da52d6e09b594" + }, + "vllm/v1/worker/gpu/model_states/mamba_hybrid.py": { + "path": "/vllm/v1/worker/gpu/model_states/mamba_hybrid.py", + "sha256": "573e130ac5587d4822fabf97adad1ad0fda02ff83c5e70df879a5bb175ae845c" + }, + "vllm/v1/worker/gpu/model_states/mm_pruning.py": { + "path": "/vllm/v1/worker/gpu/model_states/mm_pruning.py", + "sha256": "b150940b12ae76048f050a8eeb54d532bbdc530a18ffbf320ddeeb0cfaa90f93" + }, + "vllm/v1/worker/gpu/model_states/prompt_embeds.py": { + "path": "/vllm/v1/worker/gpu/model_states/prompt_embeds.py", + "sha256": "11f9e270925c2df6a505557605ac2b859bb145cf3420b0111e7482a1c544f9b1" + }, + "vllm/v1/worker/gpu/model_states/recoverssm.py": { + "path": "/vllm/v1/worker/gpu/model_states/recoverssm.py", + "sha256": "b4b660e62eaf33f4fe8271f83ed1fb6de6bc08f800a8073b27803e42fb29a645" + }, + "vllm/v1/worker/gpu/pcp_manager.py": { + "path": "/vllm/v1/worker/gpu/pcp_manager.py", + "sha256": "2d80df0ed5b18a2069f9d0689cb59923ffe324ba200fcafe242da23da3a6ddaa" + }, + "vllm/v1/worker/gpu/pool/__init__.py": { + "path": "/vllm/v1/worker/gpu/pool/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/pool/pooling_runner.py": { + "path": "/vllm/v1/worker/gpu/pool/pooling_runner.py", + "sha256": "f8463f7648cce0f3f29418a4d9fee61634ead760957cf236d06d61cf8cd986e7" + }, + "vllm/v1/worker/gpu/pp_utils.py": { + "path": "/vllm/v1/worker/gpu/pp_utils.py", + "sha256": "dadeef0bebf61d0ad44a28d06372208ec4e6389224d6017f412683b026bdbb5c" + }, + "vllm/v1/worker/gpu/sample/__init__.py": { + "path": "/vllm/v1/worker/gpu/sample/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/sample/bad_words.py": { + "path": "/vllm/v1/worker/gpu/sample/bad_words.py", + "sha256": "8d3cbd5613398260314d94739d8ee0e1ac0c22abf2f960f541d3c0d4e39d360b" + }, + "vllm/v1/worker/gpu/sample/batch_shard.py": { + "path": "/vllm/v1/worker/gpu/sample/batch_shard.py", + "sha256": "c30274a3a04e6a03e89be9cd7c62de602b1aba4d412f64540ab6201036de3928" + }, + "vllm/v1/worker/gpu/sample/gumbel.py": { + "path": "/vllm/v1/worker/gpu/sample/gumbel.py", + "sha256": "3ec1df510bdad13e8b0a457b5b67c98affdf6e57369e56cb471246cc8f40dd34" + }, + "vllm/v1/worker/gpu/sample/logit_bias.py": { + "path": "/vllm/v1/worker/gpu/sample/logit_bias.py", + "sha256": "9e80a3fe6f3c7474723408cfff52183f4585fdeedd9c2312843ee98d0b12724c" + }, + "vllm/v1/worker/gpu/sample/logprob.py": { + "path": "/vllm/v1/worker/gpu/sample/logprob.py", + "sha256": "f47479a818192acb6b297c79fa67a3b2f9820e3492a394d5adda777e9b7c832e" + }, + "vllm/v1/worker/gpu/sample/min_p.py": { + "path": "/vllm/v1/worker/gpu/sample/min_p.py", + "sha256": "4cb5e2f45e1ced6f9685283a7a5c8cfd7204d9a249822e866cfff756c7f04f62" + }, + "vllm/v1/worker/gpu/sample/output.py": { + "path": "/vllm/v1/worker/gpu/sample/output.py", + "sha256": "d6e298c0f197d487a8faaf7200f500fa83df1d7a4bbf4339cadd6a18008f7f9c" + }, + "vllm/v1/worker/gpu/sample/penalties.py": { + "path": "/vllm/v1/worker/gpu/sample/penalties.py", + "sha256": "46c29434caf5f415129ef4a9bb2b8d4f62d2765596e3e07f73ad2b198c7def1b" + }, + "vllm/v1/worker/gpu/sample/prompt_logprob.py": { + "path": "/vllm/v1/worker/gpu/sample/prompt_logprob.py", + "sha256": "4cf22d390e7bf59e44c458cff7180268db63e95d06af2f1e14d720a2d77c9663" + }, + "vllm/v1/worker/gpu/sample/sampler.py": { + "path": "/vllm/v1/worker/gpu/sample/sampler.py", + "sha256": "832c9945d201a1e730ff9b4b52076aa83bd4a5064e1e4cfea952cf84d4a8d1f0" + }, + "vllm/v1/worker/gpu/sample/states.py": { + "path": "/vllm/v1/worker/gpu/sample/states.py", + "sha256": "4e3671f93695ba5a48fad7d2d13beb231ac8741034904ed5a15d9f7b9b86662e" + }, + "vllm/v1/worker/gpu/sample/thinking_budget.py": { + "path": "/vllm/v1/worker/gpu/sample/thinking_budget.py", + "sha256": "020513e1d3406f367de6ad995a95055008fd0c28f2873647e8283c9870e22404" + }, + "vllm/v1/worker/gpu/sample/trace_replay.py": { + "path": "/vllm/v1/worker/gpu/sample/trace_replay.py", + "sha256": "d2a7d3b3b55379efabe4740a4b7f14030126dc11be36f6ea974164ce42316a50" + }, + "vllm/v1/worker/gpu/sample/watermark.py": { + "path": "/vllm/v1/worker/gpu/sample/watermark.py", + "sha256": "a3581458169dab9153eb09fd67218e0ee5585406537a9de80ad528ae62b030c0" + }, + "vllm/v1/worker/gpu/shutdown.py": { + "path": "/vllm/v1/worker/gpu/shutdown.py", + "sha256": "bb470f14b17c7e52571ef8938b2a9527e7c2846852ae8a3a94b69cd1c30aa4b1" + }, + "vllm/v1/worker/gpu/spec_decode/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/__init__.py", + "sha256": "1f1f84bfe6f4f5af3a7e21a7a8716ecf7b9013da1d03327668a3ee36afc24c32" + }, + "vllm/v1/worker/gpu/spec_decode/acceptance_estimator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/acceptance_estimator.py", + "sha256": "505b843bdd75928b03793b395b47b8be914bd7fe2a3351c8ec04339baeebb1c2" + }, + "vllm/v1/worker/gpu/spec_decode/adaptive_verification.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/adaptive_verification.py", + "sha256": "276b2fec56758a94c71b717f6786b8a6f126db2e20cf964350202feee61a0a39" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py", + "sha256": "13392ef0a9ed59eb9c2b2bad43d7c61beb212a8805849e46b5130c230275d0a5" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/speculator.py", + "sha256": "5b97f54e20ddf65b98e939832d050745f67ef43cfa145786da300f1a8322e3c6" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/cudagraph.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/cudagraph.py", + "sha256": "beab567ae2df6a2ba2cd92fe7ee452c6b959b8a7037a4b5f493993a1824619bb" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/speculator.py", + "sha256": "f9c100f42f9326e48eb84e89281897e859ba761943f54d593523555ccd98dc63" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/utils.py", + "sha256": "53d2c3ad474d290d2c6df027446bbd80ac7447684e5242ab2c3c5337d2abd383" + }, + "vllm/v1/worker/gpu/spec_decode/dflash2/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash2/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/dflash2/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash2/speculator.py", + "sha256": "b70043550938a1df9aecc85d8c8224c38c929ca34f68834572f6e723854d2027" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/speculator.py", + "sha256": "dcf4abdedbd2bddd0d76be198ccf5b4e467c46f645038c35fcab821491a35b03" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/utils.py", + "sha256": "86af2bf30604a184312e8f076097b91ecfec704f409f9d68d634b03d6b318070" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/eagle3_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/eagle3_utils.py", + "sha256": "201ee875fcc3d076a8fc1f3876dcbf85736b221a368555243a8987ff26a1674e" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/speculator.py", + "sha256": "746e318a4f266d75522ff7f3731ea9b4527b7b4824f71364d1a62184ea1f7b3d" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/utils.py", + "sha256": "94de6f55a1761f24f4aa1388cbc3b3763d4ab3ee53260330056ad31ce0b78236" + }, + "vllm/v1/worker/gpu/spec_decode/extract_hidden_states.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/extract_hidden_states.py", + "sha256": "93c4233be7b2d2290b33902ea9b3bb5274c11701830851d03967a22144536e2d" + }, + "vllm/v1/worker/gpu/spec_decode/gemma4/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/gemma4/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/gemma4/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/gemma4/speculator.py", + "sha256": "9991210d7babd2caf2cd10797ca8688543dedeafbc3b86bc7c979c1a6ae9f949" + }, + "vllm/v1/worker/gpu/spec_decode/mtp/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/mtp/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/mtp/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/mtp/speculator.py", + "sha256": "926d6c9ffdb368c971647911a60493820d056ce236fcae9d94a42fa2e006255d" + }, + "vllm/v1/worker/gpu/spec_decode/multi_module_mtp/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/multi_module_mtp/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/multi_module_mtp/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/multi_module_mtp/speculator.py", + "sha256": "d9d4735b9b33829332b0e845b6d3073b2f0436045ed693b25c6434f351644127" + }, + "vllm/v1/worker/gpu/spec_decode/rejection_sampler.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/rejection_sampler.py", + "sha256": "030db5bfca162cc1f305112f299de5d6d61c59d3ed0807fee46575441ca4086d" + }, + "vllm/v1/worker/gpu/spec_decode/rejection_sampler_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/rejection_sampler_utils.py", + "sha256": "214b61fa0abe88573beb779872c035b3954e5651a85bd438d99ee5905d3a62ec" + }, + "vllm/v1/worker/gpu/spec_decode/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/speculator.py", + "sha256": "3a1ab15bf8b20918852eb835fe9755046e99dcbac6ba6ca3d414949fc8bc695a" + }, + "vllm/v1/worker/gpu/spec_decode/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/utils.py", + "sha256": "282f2929eddae9ca7312269f799be07472334b6df9fd91878b5e839ec05e418c" + }, + "vllm/v1/worker/gpu/states.py": { + "path": "/vllm/v1/worker/gpu/states.py", + "sha256": "99418f5df43ca612ded72609fee011620b065b2cab2f249ccb387096bf4ae71a" + }, + "vllm/v1/worker/gpu/structured_outputs.py": { + "path": "/vllm/v1/worker/gpu/structured_outputs.py", + "sha256": "18a10532db7e66b55e334acacd1fd989ad6361adf31dd0de9a9a65e23db25951" + }, + "vllm/v1/worker/gpu/ubatch_utils.py": { + "path": "/vllm/v1/worker/gpu/ubatch_utils.py", + "sha256": "5092e2e58af0561c8dc12e62847cfc6dda9ca20dfbd33e7f0cd77a83fe87f7c5" + }, + "vllm/v1/worker/gpu/warmup.py": { + "path": "/vllm/v1/worker/gpu/warmup.py", + "sha256": "423ac32d58fe008c228cfa223e4fcebfcf87e3463a9dbdf80a083c0578d73723" + }, + "vllm/v1/worker/gpu_input_batch.py": { + "path": "/vllm/v1/worker/gpu_input_batch.py", + "sha256": "18cf455c9d0eea61cc581c7932f2e6cd09786914e82dd35eef1c1430da359a0f" + }, + "vllm/v1/worker/gpu_model_runner.py": { + "path": "/vllm/v1/worker/gpu_model_runner.py", + "sha256": "87c29d08c0bbf66993d8b984811e7325e35e6436242a773feb55ec88f16b2c51" + }, + "vllm/v1/worker/gpu_ubatch_wrapper.py": { + "path": "/vllm/v1/worker/gpu_ubatch_wrapper.py", + "sha256": "4233cfbe8c9884b042c4363890108f616483b694ebe9a6e69578dcf89c6dac5c" + }, + "vllm/v1/worker/gpu_worker.py": { + "path": "/vllm/v1/worker/gpu_worker.py", + "sha256": "6994436e4547c0996ab555b3e814e8ccea26b650dfc1b378b97d640745309347" + }, + "vllm/v1/worker/kv_connector_model_runner_mixin.py": { + "path": "/vllm/v1/worker/kv_connector_model_runner_mixin.py", + "sha256": "e1cc76d065a7e60aacddb190ae795a480b65cd02ba71a1fc699a02a85c1a3de2" + }, + "vllm/v1/worker/lora_model_runner_mixin.py": { + "path": "/vllm/v1/worker/lora_model_runner_mixin.py", + "sha256": "fef6092a15d8d37f6fa22495e6106e2e5280180908d61ce43d9ff5bf4eef3f2f" + }, + "vllm/v1/worker/mamba_utils.py": { + "path": "/vllm/v1/worker/mamba_utils.py", + "sha256": "23fdaa4e8f63ee8f938eaa1a2b39f803cb04fa6ecd69789563254b1a0691413a" + }, + "vllm/v1/worker/mm_encoder_model_runner.py": { + "path": "/vllm/v1/worker/mm_encoder_model_runner.py", + "sha256": "780c41be84ad022205c21c1decb6bb8d5afb03bc7be120c1f7df03b710acc3d7" + }, + "vllm/v1/worker/sentinel/__init__.py": { + "path": "/vllm/v1/worker/sentinel/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/sentinel/gpu_worker_sentinel.py": { + "path": "/vllm/v1/worker/sentinel/gpu_worker_sentinel.py", + "sha256": "3959b8619d052c5dd247815074e03ec21ec9b43cc424ff2d296abc19b227b852" + }, + "vllm/v1/worker/startup_plan.py": { + "path": "/vllm/v1/worker/startup_plan.py", + "sha256": "84bcbb4f7a9fd7c8d10c9c895aadd9673d44c767b9132368d11eb5e017afe86b" + }, + "vllm/v1/worker/ubatch_utils.py": { + "path": "/vllm/v1/worker/ubatch_utils.py", + "sha256": "b34dce551b5195c414e6a3a997c75961cc7a17f24c7c980487fe3d3e2ba7a798" + }, + "vllm/v1/worker/ubatching.py": { + "path": "/vllm/v1/worker/ubatching.py", + "sha256": "40391241c564feb5f16c77898ae6ae152ed6e71a4682e2a406387785d8de02d7" + }, + "vllm/v1/worker/utils.py": { + "path": "/vllm/v1/worker/utils.py", + "sha256": "0ca3ec6bf4d20076145b7fe64e564962adebedc8f75a856b517ba0b2f2d77acf" + }, + "vllm/v1/worker/worker_base.py": { + "path": "/vllm/v1/worker/worker_base.py", + "sha256": "4a1a5266b912fe97991d8dc89d92b923990da9f6cb4b817d00d52e9c0d26dd7c" + }, + "vllm/v1/worker/workspace.py": { + "path": "/vllm/v1/worker/workspace.py", + "sha256": "d21c08167d1d0d1c0cddaa80453a53a0b4dec5d81b5a537c94a21324344976b3" + }, + "vllm/v1/worker/xpu_model_runner.py": { + "path": "/vllm/v1/worker/xpu_model_runner.py", + "sha256": "07fa0390d28f2b8c3c3c0019eb9c3b126e2397aea268ba47c889f06b423deb23" + }, + "vllm/v1/worker/xpu_worker.py": { + "path": "/vllm/v1/worker/xpu_worker.py", + "sha256": "711b56432506b58041cd86e71320c3960413f7bd61061990b66488421d81cfc3" + } + }, + "prefix": "", + "pth": { + "/__editable__.megatron_core-0.16.0rc0.pth": "d55c9b64480b34aae3d4d31e7706b93391c969dec6e0498e50963b03445a57b0", + "/__editable__.rl_kernel-0.1.0.pth": "1454c4987b35762a0d189d4e901c5d077fde62a1944fbaabecea230e57f3923a", + "/__editable__.vime-0.3.2.pth": "77eec5d06d628cb952e65edd813ca88d8db67ccc785083e1b7b29011b92bec4f", + "/distutils-precedence.pth": "2638ce9e2500e572a5e0de7faed6661eb569d1b696fcba07b0dd223da5f5d224", + "/qwen3_next_cuda_runtime.pth": "e0d3ab57dd3ff4f5d55fcf76e83c549cc00b3c813e6f717c540d5ded79fa2f49", + "/qwen3_next_megatron_source.pth": "8556ac057538e82856cb76cbbc954f58312a3f45373daec3eec826031cfd2709", + "/__editable__.rl_kernel-0.1.0.pth": "1454c4987b35762a0d189d4e901c5d077fde62a1944fbaabecea230e57f3923a", + "/distutils-precedence.pth": "2638ce9e2500e572a5e0de7faed6661eb569d1b696fcba07b0dd223da5f5d224", + "/nvidia_cutlass_dsl_packages.pth": "cc710b99ddb3d76361a70461461d274212a979d00c381d821fce5bb3ad9cf246" + }, + "pyvenv_cfg_sha256": "48579f2c6d35c3d535c2690d7d426587c4b8e92021463f0266b38d35dfbbb834", + "sources": { + "/Megatron-LM-training": { + "patch_sha256": "f66035f12501aa1d08e8884e0dea5a22d59825d717aeda73c3e83876e3efd79f", + "path": "/Megatron-LM-training", + "tree": "731fc44a368d6cac8c6171a29d5c687ff0d95bd1" + }, + "/vime": { + "patch_sha256": "66949839d4c18329444f4f9f6dcd702b53ce1b94e9aa15ed111f28743bfaa4b9", + "path": "/vime", + "tree": "f5174e67dbcdaef983eecd45f215fef2d8429dd0" + } + }, + "version": "3.12.14 | packaged by Anaconda, Inc. | (main, Aug 27 2026, 14:46:43) [GCC 14.3.0]" + }, + "sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca" + }, + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "cuda_identity": { + "home": "", + "nvcc_sha256": "b8e2347d9d7fcadf8812a27324d515de99d033d3e48611811ece7e66d7895f8a" + }, + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "operator_requirements": { + "suite": "all", + "case_ids": [ + "tests/check_qwen3_next_attention.py::test_d256_backward_with_cached_prefix_matches_float64_formula", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[1024]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[256]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[64]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[8]", + "tests/check_qwen3_next_attention.py::test_d256_input_device_guard_and_nondefault_stream", + "tests/check_qwen3_next_attention.py::test_native_backward_rejects_malformed_probability_and_gradient_buffers", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[0]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[2]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_target_inputs_do_not_depend_on_companions", + "tests/check_qwen3_next_batch_invariance.py::test_triton_chunked_prefill_is_batch_invariant", + "tests/check_qwen3_next_conv_bridge.py::test_chunked_and_reordered_sequences_match", + "tests/check_qwen3_next_conv_bridge.py::test_empty_sequence_preserves_cache_and_gradients", + "tests/check_qwen3_next_conv_bridge.py::test_response_gradient_reaches_prompt_and_convolution_weight", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths0]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths1]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths2]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-4]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[1]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[4]", + "tests/check_qwen3_next_core_matrix.py::test_variable_lengths_empty_and_mixed_step_match_independent_sequences", + "tests/check_qwen3_next_forward.py::test_combine_has_fixed_route_order_and_differentiable_weights", + "tests/check_qwen3_next_forward.py::test_full_vocabulary_logprob_entropy_modes_and_gradient", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_fail_closed_on_the_tensor_descriptor_path", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[128]", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[512]", + "tests/check_qwen3_next_forward.py::test_logprob_nan_rejected_before_comparison", + "tests/check_qwen3_next_forward.py::test_moe_vjp_matches_independent_double_formula", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[1024-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[128-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-16]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-256]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-3072]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-37984]", + "tests/check_qwen3_next_forward.py::test_qwen_moe_actual_tp4_shapes_and_independent_training_forward", + "tests/check_qwen3_next_forward.py::test_route_weights_are_batch_invariant", + "tests/check_qwen3_next_forward.py::test_shared_linear_vjp_and_empty_tokens", + "tests/check_qwen3_next_forward.py::test_stable_route_tie_boundary_and_router_gradient", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_backward_matches_recomputed_recurrence_vjp", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_forward_is_provider_exact_and_does_not_mutate_inputs", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_keeps_prompt_state_gradient_through_response", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[False]", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[True]", + "tests/check_qwen3_next_gdn_bridge.py::test_initial_state_vjp_matches_provider_directional_difference", + "tests/check_qwen3_next_gdn_sequence.py::test_1024_token_chunk_continuation_is_bitwise_exact", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad0]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad1]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad2]", + "tests/check_qwen3_next_gdn_sequence.py::test_chunk_boundary_retains_prompt_and_initial_state_gradients", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths0]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths1]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths2]", + "tests/check_qwen3_next_gdn_sequence.py::test_reserved_and_duplicate_slots_are_rejected", + "tests/check_qwen3_next_norm_providers.py::test_custom_op_has_distinct_native_and_cuda_paths", + "tests/check_qwen3_next_norm_providers.py::test_gdn_decode_provider_env_defaults_are_recorded", + "tests/check_qwen3_next_norm_providers.py::test_our_gated_op_is_batch_invariant", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_cuda]", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_native]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots0]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots2]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots3]", + "tests/check_qwen3_next_shared_core.py::test_independent_training_forward_matches_inference_and_retains_gradients", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[1024]", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[8]", + "tests/check_qwen3_next_shared_core.py::test_unimplemented_provider_profile_is_rejected", + "tests/test_qwen3_next_norm.py::test_bad_weight_shape_raises", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[16]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[1]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[2]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[32]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[48]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[64]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[8]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[128]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[2048]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_with_padding", + "tests/test_qwen3_next_norm.py::test_call_matches_forward", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[128]", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[2048]", + "tests/test_qwen3_next_norm.py::test_cuda_default_offset_preserves_plain_convention", + "tests/test_qwen3_next_norm.py::test_cuda_gated_backward_matches_autograd_golden", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_matches_golden_within_contract", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_bad_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_mismatched_gate", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_backward_uses_the_sigmoid_derivative", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_swish_is_an_alias_for_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_unit_weight_is_plain_norm_times_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_weight_offset_is_applied_in_fp32", + "tests/test_qwen3_next_norm.py::test_cuda_gated_wrapper_rejects_equal_numel_wrong_shape", + "tests/test_qwen3_next_norm.py::test_cuda_gated_zero_gate_zeroes_output", + "tests/test_qwen3_next_norm.py::test_cuda_offset_equals_explicit_fp32_weight", + "tests/test_qwen3_next_norm.py::test_cuda_offset_is_not_folded_through_bfloat16", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_backward_is_offset_aware", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_within_tolerance_of_golden", + "tests/test_qwen3_next_norm.py::test_deterministic_repeat", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype0]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype1]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype2]", + "tests/test_qwen3_next_norm.py::test_eps_inside_sqrt", + "tests/test_qwen3_next_norm.py::test_gated_batch_invariance_slice", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedHFOp]", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedOp]", + "tests/test_qwen3_next_norm.py::test_gated_conventions_diverge_in_low_precision", + "tests/test_qwen3_next_norm.py::test_gated_cuda_op_rejects_bad_activation_at_construction", + "tests/test_qwen3_next_norm.py::test_gated_extension_handles_empty_batch_and_nondefault_stream", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[dy_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[gate_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[rstd_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_shape]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_matches_hf_formula_fp32", + "tests/test_qwen3_next_norm.py::test_gated_shape_mismatch_raises", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_strict_matches_vllm_formula_fp32", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[128]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[2048]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_offset_applied_in_fp32_not_folded_into_bf16", + "tests/test_qwen3_next_norm.py::test_op_batch_invariance_on_device", + "tests/test_qwen3_next_norm.py::test_plain_reference_is_unchanged_by_the_offset_plumbing", + "tests/test_qwen3_next_norm.py::test_weight_offset_is_one", + "tests/test_qwen3_next_norm.py::test_zero_centred_cuda_constructor_rejects_missing_extension", + "tests/test_qwen3_next_norm.py::test_zero_centred_op_inherits_the_plain_reference", + "tests/test_qwen3_next_norm.py::test_zero_weight_is_identity_scaling" + ], + "case_ids_sha256": "694c931b65f9cfa5db963f2eca6d11bd309546c824a1df52f9da2ab128e83e0f", + "norm_gates": [ + "qwen3_next_rms_norm-forward.json", + "qwen3_next_rms_norm-gradient.json", + "rms_norm_gated-forward.json", + "rms_norm_gated-gradient.json" + ] + }, + "layer_requirements": { + "schema_version": 1, + "gates": { + "gdn": { + "script": "scripts/qwen3_next_tp_gdn_check.py", + "output_option": "--output", + "scope": "tp4_gdn_layer0", + "groups": { + "cases": [ + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "prompt-gradient", + "replicated-norm-gradient", + "hf-load-export" + ] + }, + "script_sha256": "cc4338893f90af004c51c20fc67d1a9a3f4bf8d26775277f72671c02983e4df5" + }, + "attention": { + "script": "scripts/qwen3_next_tp_attention_check.py", + "output_option": "--output", + "scope": "tp4_full_attention_layer3", + "groups": { + "attention.cases": [ + "hf-load-export", + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "batch4-varlen-reorder", + "sixteen-token-decode", + "prompt-gradient", + "kv-pair-gradient", + "qk-norm-gradient" + ] + }, + "script_sha256": "d27d43efb05415a8ef5892c3c2238a2b9744a4821f5466faf46c6510e6e01bec" + }, + "moe": { + "script": "scripts/qwen3_next_tp_moe_check.py", + "output_option": "--output", + "scope": "tp4_moe_block_layer0", + "groups": { + "moe.cases": [ + "hf-load-export-all512experts", + "routes-replicated-8", + "full-chunk-reorder-8", + "routes-replicated-64", + "full-chunk-reorder-64", + "routes-replicated-256", + "full-chunk-reorder-256", + "routes-replicated-1024", + "full-chunk-reorder-1024", + "training-forward", + "all-parameter-gradient", + "replicated-router-gradient" + ] + }, + "script_sha256": "d5c1bbbb82e408b65871b0cb1638d7a6cf8cfe07f0a3315a657b7dc232d544be" + }, + "adapters": { + "script": "scripts/qwen3_next_adapter_check.py", + "output_option": "--out", + "scope": "gdn_engine_adapter_component", + "groups": { + "cases": [ + "batch1-length8", + "batch1-length64", + "batch1-length256", + "batch1-length1024", + "batch4-length8", + "batch4-length64", + "batch4-length256", + "batch4-length1024", + "mixed-prefill-decode16-reorder" + ] + }, + "fields": { + "prompt_gradient": "passed", + "hf_conv_roundtrip": "passed", + "batch_invariance_capability_registered": false + }, + "script_sha256": "3ce45bb317237c1a06533116d65fb77c2a23b6f503ae46406ede543036eb0f20" + }, + "heads": { + "script": "scripts/qwen3_next_tp_head_check.py", + "output_option": "--output", + "scope": "tp4_embedding_lm_head_only", + "groups": { + "cases": [ + "hf-embedding-roundtrip", + "hf-lm-head-roundtrip", + "replicated-norm-gradient", + "nonzero-finite-embedding-head-gradient", + "embedding-repeat-100", + "batch-invariant-prompt8", + "batch-invariant-prompt64", + "batch-invariant-prompt256", + "batch-invariant-prompt1024", + "logprob-original-and-promoted-logits", + "entropy-interface" + ] + }, + "script_sha256": "0504185d21a75405c8e994bc57b016cf4ec357d8b16e7430772c11934f2af876" + } + }, + "scheduler_case_ids": [ + "p0008-b1-full", + "p0008-b1-chunked", + "p0008-b4-full", + "p0008-b4-chunked", + "p0064-b1-full", + "p0064-b1-chunked", + "p0064-b4-full", + "p0064-b4-chunked", + "p0256-b1-full", + "p0256-b1-chunked", + "p0256-b4-full", + "p0256-b4-chunked", + "p1024-b1-full", + "p1024-b1-chunked", + "p1024-b4-full", + "p1024-b4-chunked" + ], + "registry_sha256": "e3949a750cb27c1897a000f3b023f912629906612ae8949c1575d0acc36df5ec", + "case_ids_per_rank": [ + "adapters/cases/batch1-length1024", + "adapters/cases/batch1-length256", + "adapters/cases/batch1-length64", + "adapters/cases/batch1-length8", + "adapters/cases/batch4-length1024", + "adapters/cases/batch4-length256", + "adapters/cases/batch4-length64", + "adapters/cases/batch4-length8", + "adapters/cases/mixed-prefill-decode16-reorder", + "attention/attention.cases/batch4-varlen-reorder", + "attention/attention.cases/full-chunk-1024", + "attention/attention.cases/full-chunk-256", + "attention/attention.cases/full-chunk-64", + "attention/attention.cases/full-chunk-8", + "attention/attention.cases/hf-load-export", + "attention/attention.cases/kv-pair-gradient", + "attention/attention.cases/prompt-gradient", + "attention/attention.cases/qk-norm-gradient", + "attention/attention.cases/sixteen-token-decode", + "gdn/cases/full-chunk-1024", + "gdn/cases/full-chunk-256", + "gdn/cases/full-chunk-64", + "gdn/cases/full-chunk-8", + "gdn/cases/hf-load-export", + "gdn/cases/prompt-gradient", + "gdn/cases/replicated-norm-gradient", + "heads/cases/batch-invariant-prompt1024", + "heads/cases/batch-invariant-prompt256", + "heads/cases/batch-invariant-prompt64", + "heads/cases/batch-invariant-prompt8", + "heads/cases/embedding-repeat-100", + "heads/cases/entropy-interface", + "heads/cases/hf-embedding-roundtrip", + "heads/cases/hf-lm-head-roundtrip", + "heads/cases/logprob-original-and-promoted-logits", + "heads/cases/nonzero-finite-embedding-head-gradient", + "heads/cases/replicated-norm-gradient", + "moe/moe.cases/all-parameter-gradient", + "moe/moe.cases/full-chunk-reorder-1024", + "moe/moe.cases/full-chunk-reorder-256", + "moe/moe.cases/full-chunk-reorder-64", + "moe/moe.cases/full-chunk-reorder-8", + "moe/moe.cases/hf-load-export-all512experts", + "moe/moe.cases/replicated-router-gradient", + "moe/moe.cases/routes-replicated-1024", + "moe/moe.cases/routes-replicated-256", + "moe/moe.cases/routes-replicated-64", + "moe/moe.cases/routes-replicated-8", + "moe/moe.cases/training-forward" + ], + "case_ids_sha256": "be74417dfbd6031ba27978d06d04bb15daaab2aeb57d132c7e0d41176b28b46e" + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "scheduler_profile_certificate": { + "path": "/result.json", + "sha256": "bf3a74423b3636145cad903d5cf9d70f2c3c777b019a24d125c2ca79f8b1e8d9" + } +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/train/updates.json b/docs/usage/evidence/qwen3-next-chain-b200/train/updates.json new file mode 100644 index 000000000..a4863e79b --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/train/updates.json @@ -0,0 +1,2021 @@ +{ + "schema_version": 1, + "status": "passed", + "scope": "qwen3_next_training_and_reload", + "identity": { + "scheduler_profile_certificate": { + "path": "/result.json", + "sha256": "bf3a74423b3636145cad903d5cf9d70f2c3c777b019a24d125c2ca79f8b1e8d9" + }, + "source_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "checkpoint": "", + "weight_version": "baseline", + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "architecture_layers": 48, + "weights_dtype": "bfloat16", + "recurrent_state_dtype": "float32" + }, + "training_identity": { + "scheduler_profile_certificate": { + "path": "/result.json", + "sha256": "bf3a74423b3636145cad903d5cf9d70f2c3c777b019a24d125c2ca79f8b1e8d9" + }, + "source_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "checkpoint": "", + "weight_version": "baseline", + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "architecture_layers": 48, + "weights_dtype": "bfloat16", + "recurrent_state_dtype": "float32", + "run_id": "20261009T041838Z-train1-c67ec144-39e7db9f", + "execution_id": "39e7db9f488142f4b52872e05728c390", + "fixture_sha256": "7c98e4e17cc24bd0c5f65f6515d58a9dfc947afcdb6d4956bd3fa05f24bb28b6" + }, + "required_sections": [ + "baseline", + "update1", + "update2", + "reload", + "continuous_step3", + "resumed_step3", + "checkpoint", + "fault_injection" + ], + "l2_fixture_sha256": "b59298acf5ecbe64abb4639e7596e052f1993ee5e3c7289b63738f1b04463d01", + "l2_reports": { + "baseline": { + "path": "/attempts/0/l2-matrix.json", + "sha256": "bf9da6060e882fb3707df9093e63a4c6e6664e8a75f25e9809020c4f687bf953" + }, + "update1": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/l2-matrix.json", + "sha256": "ad78b78687d2ef725a24b42de908033b36383f69db41d2c754f87acb07cd9870" + }, + "update2": { + "path": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/l2-matrix.json", + "sha256": "e8b9ee250133e40cf2f28134bb4b77f6ec18bb970c37a9702590284e2c570893" + }, + "reload": { + "path": "/attempts/0/reload-l2-a872a7908f624c60b1b1814b1037c8b3/l2-matrix.json", + "sha256": "93f6e8ca16a9286945b73fd46888b72db923454be730edde5232a3ffb041b414" + } + }, + "workers": { + "update1": { + "path": "/attempts/0/update1-2c4f847affb0420d9622f1b699393898/worker.json", + "sha256": "b2c74ebcb2b5e538bbaf5e50439615722f26876df3cd34610ded097ee6102436" + }, + "update2": { + "path": "/attempts/0/update2-57420c4714024856bad2f2d1fa960e15/worker.json", + "sha256": "b30f31ad229c12f2c710a5267f9c8eea37ff9da08a2681158279633e2777cf47" + }, + "reload": { + "path": "/attempts/0/reload-562bd948210c4256a10db68a19bdd77e/worker.json", + "sha256": "447b8ac6d7cb5db7e5996f6a8ea7b1a496e51354fce80a38540297af524d6271" + }, + "continuous": { + "path": "/attempts/0/continuous-77caf14fe2b842108f863c8cd8d7f67c/worker.json", + "sha256": "d7a2a3feb4fda03e2f7c0badf8a352c6519eec63114e60373b33d71212f051b9" + }, + "resumed": { + "path": "/attempts/0/resumed-4b438816c03647029cdfeebe981bb0ed/worker.json", + "sha256": "8cb5be8b9ec2c49425af9e2725ca3bc972456f6f66454f9820d066e25f34e02a" + } + }, + "events": [ + "l2:baseline", + "worker:update1", + "l2:update1", + "worker:update2", + "l2:update2", + "worker:reload", + "l2:reload", + "worker:continuous", + "worker:resumed" + ], + "recovery": [ + { + "schema_version": 1, + "scope": "qwen3_next_retirement", + "identity": { + "scheduler_profile_certificate": { + "path": "/result.json", + "sha256": "bf3a74423b3636145cad903d5cf9d70f2c3c777b019a24d125c2ca79f8b1e8d9" + }, + "source_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "checkpoint": "", + "weight_version": "baseline", + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "architecture_layers": 48, + "weights_dtype": "bfloat16", + "recurrent_state_dtype": "float32", + "run_id": "20261009T041838Z-train1-c67ec144-39e7db9f", + "execution_id": "39e7db9f488142f4b52872e05728c390", + "fixture_sha256": "7c98e4e17cc24bd0c5f65f6515d58a9dfc947afcdb6d4956bd3fa05f24bb28b6" + }, + "target": "step-00000002-8e604f14d0b04929abfbfb8e584b39bf.partial", + "tombstone": ".step-00000002-8e604f14d0b04929abfbfb8e584b39bf.partial.deleting", + "status": "retired", + "proof": { + "schema_version": 1, + "scope": "qwen3_next_staging_intent", + "identity": { + "scheduler_profile_certificate": { + "path": "/result.json", + "sha256": "bf3a74423b3636145cad903d5cf9d70f2c3c777b019a24d125c2ca79f8b1e8d9" + }, + "source_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "checkpoint": "", + "weight_version": "baseline", + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "architecture_layers": 48, + "weights_dtype": "bfloat16", + "recurrent_state_dtype": "float32", + "run_id": "20261009T041838Z-train1-c67ec144-39e7db9f", + "execution_id": "39e7db9f488142f4b52872e05728c390", + "fixture_sha256": "7c98e4e17cc24bd0c5f65f6515d58a9dfc947afcdb6d4956bd3fa05f24bb28b6" + }, + "staging": "step-00000002-8e604f14d0b04929abfbfb8e584b39bf.partial", + "published": "step-00000002-8e604f14d0b04929abfbfb8e584b39bf", + "metadata": { + "schema_version": 1, + "scope": "native_vime_training_checkpoint", + "status": "staging", + "identity": { + "scheduler_profile_certificate": { + "path": "/result.json", + "sha256": "bf3a74423b3636145cad903d5cf9d70f2c3c777b019a24d125c2ca79f8b1e8d9" + }, + "source_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "checkpoint": "", + "weight_version": "baseline", + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "architecture_layers": 48, + "weights_dtype": "bfloat16", + "recurrent_state_dtype": "float32", + "run_id": "20261009T041838Z-train1-c67ec144-39e7db9f", + "execution_id": "39e7db9f488142f4b52872e05728c390", + "fixture_sha256": "7c98e4e17cc24bd0c5f65f6515d58a9dfc947afcdb6d4956bd3fa05f24bb28b6" + }, + "step": 2, + "sample_position": 8 + } + } + }, + { + "reason": "repeat_final_reload_and_controls_in_fresh_train_run", + "from_attempt": "0", + "to_attempt": "retired-for-fresh-train-run", + "events": [ + "worker:reload", + "l2:reload", + "worker:continuous", + "worker:resumed" + ], + "workers": { + "reload": { + "path": "/20261009T215349Z-train-c67ec144-779ba23f/attempts/0/reload-359caafa0c484faba4a052c355c59259/worker.json", + "sha256": "1d3707e09137bc856206dd4630575be64ed5c891928195682f189803bc550a39" + }, + "continuous": { + "path": "/20261009T215349Z-train-c67ec144-779ba23f/attempts/0/continuous-b9d0eedd6f804e8da5d51bc6a6763497/worker.json", + "sha256": "f00a92b1d4fde215aef304f5d22d6dad40c86d3ec2a34102a7c65d0b3b8616b1" + }, + "resumed": { + "path": "/20261010T112219Z-train-c67ec144-40996158/attempts/0/resumed-4c0c9f145a3b4a3c882d778bc4817e0b/worker.json", + "sha256": "3b137d58e33af3056265c08abcb9964bdf0f6313dff439f6fce367fea14cb767" + } + }, + "l2_report": { + "path": "/20261009T215349Z-train-c67ec144-779ba23f/attempts/0/reload-l2-877b875589944f6691279aa5d21d6076/l2-matrix.json", + "sha256": "e2857dc09998840674af4f12ced018439b5fffc42f74530860d6bf22cbc8e4b1" + } + }, + { + "reason": "repeat_final_reload_and_controls_in_fresh_train_run", + "from_attempt": "0", + "to_attempt": "retired-for-fresh-train-run", + "events": [ + "worker:reload", + "l2:reload" + ], + "workers": { + "reload": { + "path": "/20261010T131621Z-train-c67ec144-219cc1ac/attempts/0/reload-ef19c6c64157400a84f8a0ed0e579996/worker.json", + "sha256": "85cd41ecb5f52ed55febf74a62150c399299f63800117775f7047f381cd606c3" + } + }, + "l2_report": { + "path": "/20261010T131621Z-train-c67ec144-219cc1ac/attempts/0/reload-l2-fc6185ab0eb740d58ff153cb0c40c44a/l2-matrix.json", + "sha256": "1076eb467b5fb0b97982b8a31ff3b03aec5858cb43ea5f50eee5e5120ae34356" + } + } + ], + "reload_matches_update2": { + "status": "passed", + "raw_bit_comparison": true, + "case_ids": [ + "p0008-b1-full", + "p0008-b1-chunked", + "p0008-b4-full", + "p0008-b4-chunked", + "p0064-b1-full", + "p0064-b1-chunked", + "p0064-b4-full", + "p0064-b4-chunked", + "p0256-b1-full", + "p0256-b1-chunked", + "p0256-b4-full", + "p0256-b4-chunked", + "p1024-b1-full", + "p1024-b1-chunked", + "p1024-b4-full", + "p1024-b4-chunked" + ], + "cases": { + "p0008-b1-full": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "p0008-b1-chunked": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "p0008-b4-full": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "p0008-b4-chunked": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "p0064-b1-full": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "p0064-b1-chunked": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "p0064-b4-full": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "p0064-b4-chunked": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "p0256-b1-full": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "p0256-b1-chunked": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "p0256-b4-full": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "p0256-b4-chunked": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "p1024-b1-full": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "p1024-b1-chunked": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "p1024-b4-full": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "p1024-b4-chunked": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + } + } + }, + "checkpoint": { + "path": "/training-state/checkpoints/step-00000002-3bce5b5d91b045a1bbdb4f8ef235d1b6", + "sha256": "8906eaf4e2bee9d1aec783a6086e1a09b89b7da1a37525c6464aa922fec0e691" + }, + "fault_injection": { + "path": "/attempts/0/checkpoint-faults/faults.json", + "sha256": "7db734f99dc3d6d9b23569aced1062b09cd22ae9ac4531a8eee03939a8bfcd52" + }, + "attempt": "0" +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/train1/environment.json b/docs/usage/evidence/qwen3-next-chain-b200/train1/environment.json new file mode 100644 index 000000000..eceac4890 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/train1/environment.json @@ -0,0 +1,4500 @@ +{ + "environment": { + "identity": { + "base_prefix": "/miniconda3/envs/rlkernel", + "binary": "/python3.12", + "binary_sha256": "6a1eb3ffc29f3a6b0ece607b016b4cfa5ca3ac57b34f17ed3266b404f78d2729", + "build_tools": { + "ninja": { + "path": "/miniconda3/envs/rlkernel/bin/ninja", + "sha256": "08639e194fffa7f08b259fc4abfa4803aff66b64de52549cee42ec527d55cea6" + } + }, + "distributions": [ + { + "direct_url": null, + "metadata_sha256": "6f1038270be40f9b8c0bcf391c627e7d7f41ccdd19aa192d6eac1dbfc3b19abc", + "name": "GitPython", + "version": "3.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "3f71971502087521f123c9daa26bc12d31d3466738b567390b8602acad3be22a", + "name": "Jinja2", + "version": "3.1.6" + }, + { + "direct_url": null, + "metadata_sha256": "818fb343b7b6b99a32771bf4813521ae6440b4c7579b3ae46e32dd02da0afeee", + "name": "Markdown", + "version": "3.11" + }, + { + "direct_url": null, + "metadata_sha256": "dc1ee42cf8ecfeee0ab60b15b21d291833e0732548efcb7bb5b3564dca3e5bf7", + "name": "MarkupSafe", + "version": "3.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "de7389b142450a0014234286b0876f328439b823c355c73d0aed41fd67ec208c", + "name": "PyJWT", + "version": "2.15.1" + }, + { + "direct_url": null, + "metadata_sha256": "ffcad4415cafb22b8b536a61595e9ee13438b51d31b0763c1b273ce3bc58e840", + "name": "PyYAML", + "version": "6.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "8562d701cc52d9cafbb418942b0e072fc087ed8ddcf35cd10224c1b2ed8bdd91", + "name": "Pygments", + "version": "2.21.0" + }, + { + "direct_url": null, + "metadata_sha256": "b6c25fcfdcc495edf248a10ca4ad28327ef2ed6047a6ec5c6346e121414c7f21", + "name": "Werkzeug", + "version": "3.1.9" + }, + { + "direct_url": null, + "metadata_sha256": "55c400d24c71b581d9c0992f71df6047cf6c878bebe61a7d45d6e02dc0e4c510", + "name": "absl-py", + "version": "2.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "13db521f90a6a882027b2388eaa2ebf252945f9c2adb7e7e371da18239da4df0", + "name": "accelerate", + "version": "1.15.0" + }, + { + "direct_url": null, + "metadata_sha256": "86fe44e38e67872dd895c729044942ba2c2f934ae439a899fb83a186206b7fd4", + "name": "agent-detector", + "version": "2.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "afe11fe9f5aa54e734cdd51659bed8c89dc6bcd5aef0ad96f2d20149c8de5456", + "name": "aiohappyeyeballs", + "version": "2.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "570b307bc0b53fbbd3ed2ce0b7eca6bbf2fa73bf75e24a480f1034d8c0b832bf", + "name": "aiohttp", + "version": "3.14.3" + }, + { + "direct_url": null, + "metadata_sha256": "44b7f8e14c4770793e747fad50c9e0a6ee7357651d878554f192d94768dc14a8", + "name": "aiohttp-cors", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "648813a44a9ae0ab2f20ee86d2404dcc38e3f9e80c63316cf6e536735df14e54", + "name": "aiosignal", + "version": "1.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "f6a3f6668bacef7f73a2c19ccb2be910b2363d1731c4725cb04364d99e24935a", + "name": "annotated-doc", + "version": "0.0.5" + }, + { + "direct_url": null, + "metadata_sha256": "fc6d752cde6a6a4bff03474386de750e130b75da3c7815ee909f45b51fea98c8", + "name": "annotated-types", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "4e89d670a4b20029da30e5a9e8ebcbc844deff9c44209552bafd5537249c8b9e", + "name": "anthropic", + "version": "1.9.0" + }, + { + "direct_url": null, + "metadata_sha256": "b5a6f00800956387fcddab1fe1b5aa8502c249b86cfb16d58ed700f282f60142", + "name": "antlr4-python3-runtime", + "version": "4.9.3" + }, + { + "direct_url": null, + "metadata_sha256": "a6008defa9492cd08250217b134782cad1db4580e1d7ddf69cc2a2a48cea24e0", + "name": "anyio", + "version": "4.15.1" + }, + { + "direct_url": null, + "metadata_sha256": "7877c64ce8957237363f2df313819bb07f50752df016d14c5a5a99bec10f5deb", + "name": "apache-tvm-ffi", + "version": "0.1.11" + }, + { + "direct_url": null, + "metadata_sha256": "3543ca8f0e072c00ab111b20eba99ce86dbf93ada28988775bc2677284b3c07a", + "name": "astor", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "d4b328c09c024fe1e4d788a9c7715ad726095131b815cd35fd933268226f6269", + "name": "attrs", + "version": "26.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "4850c4d696a5e2a2ecbb3dd792b060acc1de79e09800669b0b9fc3a22c055e6d", + "name": "av", + "version": "19.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "863ff92208d0a02dabfa008bfe91846a5c401ded301e5687dca7dc63c911865f", + "name": "babel", + "version": "2.18.0" + }, + { + "direct_url": null, + "metadata_sha256": "f32e6df3197f05202e586624d95c5e217003d80cee655c165d533102f628df21", + "name": "backrefs", + "version": "8.0" + }, + { + "direct_url": null, + "metadata_sha256": "905c362f655fbc6d37a24686efc2b3bfbd3123b8ee5a443a43f6750d87455e90", + "name": "blake3", + "version": "1.0.10" + }, + { + "direct_url": null, + "metadata_sha256": "07c85682b6aefd5c9b48890d306c1604311902295704892ede48e5a83219a8d3", + "name": "blobfile", + "version": "3.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "2d582941a7081625a35f35a0c4a2e80f7737312e29c38e5fdb6fc08f9c113077", + "name": "bracex", + "version": "3.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "3b60c55bae0d0340c3a3fd918635bbfa3087579da66e0fd7f6be7a3782c0da3d", + "name": "cachetools", + "version": "7.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "5d11a6878d5bc3f22290281a19ef7b36daa95c910780950608b95cd788c7e12e", + "name": "cbor2", + "version": "6.1.4" + }, + { + "direct_url": null, + "metadata_sha256": "362c9942c48051f168ed2b9f2146266b7792d3c05e164cd6afc3f3b65884fdc9", + "name": "certifi", + "version": "2026.7.22" + }, + { + "direct_url": null, + "metadata_sha256": "b4abf1bcf1c1d8e0272d8007fc974499ea59e5f2a5b98af3c78a5e67515a9d87", + "name": "cffi", + "version": "2.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "766120f13c177446f51929a4d201104bc935b6d5a2a176cd6716edce757d3d95", + "name": "cfgv", + "version": "3.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "610e9a9d03ce837ffe6e42be5e02e70087f73863f7350bf7bb7f0511edcc5ec0", + "name": "charset-normalizer", + "version": "3.5.2" + }, + { + "direct_url": null, + "metadata_sha256": "7ad836b3147c9702546d9c28b4fa5be23b24445439db5d0d2a58d17281c84daa", + "name": "click", + "version": "8.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "4c5f00599ebcbf11d337e48a72784d256ca3d704fa9e9f5daadd60065e6776b7", + "name": "cloudpickle", + "version": "3.1.2" + }, + { + "direct_url": null, + "metadata_sha256": "a0970189e3ab7a596d6902d5f61f93b414f138f03d3cf19029145657bfceb382", + "name": "cmake", + "version": "4.1.2" + }, + { + "direct_url": null, + "metadata_sha256": "94a6ebf9718e55f254a43ce0d2f04e0d6d44e7141b6f3144a84feb6519a77bfd", + "name": "colorama", + "version": "0.4.6" + }, + { + "direct_url": null, + "metadata_sha256": "ca8ec227f406d970a645ec482b20619128dd34b9cf71159cc24e27db461a2711", + "name": "colorful", + "version": "0.5.8" + }, + { + "direct_url": null, + "metadata_sha256": "bbaa51b7e4d8f142bd075d01257c0572c0c844796d51426e35c8096a13e8da76", + "name": "compressed-tensors", + "version": "0.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "6063d8ff7ebc458d63a4332853d7ababf4ee2b86336362c8d2b12be6e998eb6b", + "name": "connectrpc", + "version": "0.11.1" + }, + { + "direct_url": null, + "metadata_sha256": "ac5f4b5a5f68080bd9c3fe77399fe8a1bff2ee5923c49db1df544dd054cbf15b", + "name": "cryptography", + "version": "50.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "f41d2f6b4616accca2f5e1dd47aa9e8937c28076cde698226d93e727751f3099", + "name": "cuda-bindings", + "version": "13.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "e5ca6ed34c687c6f4a4d157ad0a2cf06ec0316fe8c4c0ddeb666ad76dd6f30f4", + "name": "cuda-core", + "version": "1.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "89baadd9da23dce9990481519544115615ba3cbd2d1a41e09feea7756fffb378", + "name": "cuda-pathfinder", + "version": "1.8.2" + }, + { + "direct_url": null, + "metadata_sha256": "1ab914b9a57ca601df2e3cfe9608427b15d8afb78029076ace5d1caf9fd45f08", + "name": "cuda-python", + "version": "13.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "73d97a5eb578223b4895ef4f234574d14219cef9999ff7d0e92a3d0dd057bd3f", + "name": "cuda-tile", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "ae6f957fe66ed63081d1d83ee6e8838f3a0af2c6fce1223629d0dd6264565ead", + "name": "cuda-toolkit", + "version": "13.0.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "1f8e0ae51ad5feea63f58ed2e24f3da6f23ed548043235a14f7623d961dd9b64", + "name": "datasets", + "version": "5.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "153f4a4d6ff03dbe5c8ad7fe54bc2e7b989a4947b70f7aa77fbf652b394f2a2e", + "name": "depyf", + "version": "0.20.0" + }, + { + "direct_url": null, + "metadata_sha256": "ee09fc752d7271aac93079cfd63409957dc6b536c1ffd9355a01bf7297e72aa6", + "name": "detect-installer", + "version": "0.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "a7feab2c4f69fd5f85e5a3cb495a7f1870a6bf8199dcee5339e8118f7acbdc09", + "name": "dill", + "version": "0.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "fef3fde661fe30ba7bd1d78841a797136b2b3461705bb4eb92dc54f8308bbaae", + "name": "distlib", + "version": "0.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "fef3fde661fe30ba7bd1d78841a797136b2b3461705bb4eb92dc54f8308bbaae", + "name": "distlib", + "version": "0.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "a3ca2e39abe76c4a33d5fe4a2a84375ec9f25cdfdb7e1d8ea406bd6f1603205c", + "name": "dnspython", + "version": "2.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "92a07daad5e6ff461199de14e845d9b376e309ef916ce5379f3c9cd4e3b1623f", + "name": "dockerfile-parse", + "version": "2.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "5b566b25f0cbe4955d0b16844a7cc6d2002caa3bde2dfda7f301fd8870cbaa56", + "name": "docstring_parser", + "version": "0.18.0" + }, + { + "direct_url": null, + "metadata_sha256": "5a1080b5768c6c591e1c4f9c9812cafa808781b9eeb198043bf185e22d4a1613", + "name": "e2b", + "version": "2.51.0" + }, + { + "direct_url": null, + "metadata_sha256": "0a63979e0b946e16238e4339e60d9c1eb5a7ce3ea93dae78b5da9c65a6190540", + "name": "einops", + "version": "0.8.2" + }, + { + "direct_url": null, + "metadata_sha256": "16cbe67a57558f1d4bfdbc22a454434ba301750c57a62b1d3f5361c9e5cddc00", + "name": "email-validator", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "0617ddb55b90b42ddc9398dc7e91d61fe928a2504939f76526dc15b22d238caa", + "name": "fastapi", + "version": "0.136.3" + }, + { + "direct_url": null, + "metadata_sha256": "ddd82b9666c21988e234d623e2575e1b89fd4133260eeab43fc9a7c074f7024a", + "name": "fastapi-cli", + "version": "0.0.32" + }, + { + "direct_url": null, + "metadata_sha256": "611602e834d42e10433155ff5f5581358d732fa6b6f6f7820a8f79e74b1ce1f9", + "name": "fastapi-cloud-cli", + "version": "0.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "794524e4a9659bda6043721d848d028ea49996085a33326094fbaaa3f6e6b895", + "name": "fastar", + "version": "0.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "711401d36e60e10e35beb4d0f1bb42bf0c4d86339ae52f32b9aa4a4d790530dd", + "name": "fastsafetensors", + "version": "0.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "efaea9742e348c4c4bdcc6f616a33cc5aa3ae926494a72a46690b7da2f08ed5c", + "name": "filelock", + "version": "4.0.7" + }, + { + "direct_url": null, + "metadata_sha256": "99bd6c3f10781d3d2d350f2c3c9fc4765b55f25de8a6d6dd1f71501802d1255e", + "name": "fla-core", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "0a6ef979b75295cee2b5293ad4942b0cf2682e9e38680203064e0b70249c1a96", + "name": "flash-linear-attention", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "76b70a11ca82ea4606b529e7a8658cb3fe71412afa46f2ed57101dd91ba27558", + "name": "flashinfer-python", + "version": "0.6.18.post1" + }, + { + "direct_url": null, + "metadata_sha256": "ba8ff415192b5cbb90efce046e2271a00c8184afc362d8b47fbbc84d5e558b05", + "name": "frozenlist", + "version": "1.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "e7712831c80eb13b08fb7f7cc33988a8f24654af9eba7c6f5f943b2636e4306a", + "name": "fsspec", + "version": "2026.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "025de85c794878d0caa737869307447595f514ebf9599eacb5b1a501bae479b6", + "name": "fsspec", + "version": "2026.9.0" + }, + { + "direct_url": null, + "metadata_sha256": "ca94883bdeaa3740b45b6994443b445fd67c6e4a8064ac3bf9d92d2a5221eee8", + "name": "ghp-import", + "version": "2.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "a7e90983562a035cf767baa63d8c32bc37e1de7cad71ac7b6b2bc70a95bba4eb", + "name": "gitdb", + "version": "4.0.12" + }, + { + "direct_url": null, + "metadata_sha256": "dd96143ec79178bef685c1f5c0a58a87a66d003b421e605de65697308321d518", + "name": "google-api-core", + "version": "2.40.0" + }, + { + "direct_url": null, + "metadata_sha256": "0735d57088a83df2355e16843107fb0112abe2178fc5bb8132947a7ad962aa41", + "name": "google-auth", + "version": "2.59.1" + }, + { + "direct_url": null, + "metadata_sha256": "2f3aa9d9500d329560440e6a5a152e420aad5f5bbb23701f45b740be721784a1", + "name": "googleapis-common-protos", + "version": "1.75.5" + }, + { + "direct_url": null, + "metadata_sha256": "06d74ab04fdc03fad368868907f0d10e7d9f397aab58d58965c0b78ffaec34cc", + "name": "griffelib", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "7ee1c179e2c68a62968308b2f96f4f3469176ee3ac8bdb494ac80188d4d41271", + "name": "grpcio", + "version": "1.84.0" + }, + { + "direct_url": null, + "metadata_sha256": "04cf3a4a91575850f386f4fcfdedd8e7fbfba08feff038fbc1296d1e854db2dd", + "name": "h11", + "version": "0.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "b954a6ba4739c0cc878bb8ea27ea7c7154a48bb4b7c06dba9e9cf880cf0ec930", + "name": "h2", + "version": "4.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "6f0d7bf86e75d0bda1ceccc82367c0145ad0ec522c4d4f51bb454f467faadcc9", + "name": "hf-xet", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "f991b847550cf8225f69562902b5ccb591b2ce9a08fe07ef6e6d701bdb4694a7", + "name": "hpack", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "314d194165c4700034c1c67cee847d549a6d7091374c71f2cef0186ec56a3eb9", + "name": "httpcore", + "version": "1.0.9" + }, + { + "direct_url": null, + "metadata_sha256": "aed9767360bed1bcbda71e3b1a3c996603f86558bc77a1693ee3d09973d20cad", + "name": "httpcore2", + "version": "2.13.1" + }, + { + "direct_url": null, + "metadata_sha256": "8fa3bf3510c35e2eea9f523a1cace7120079cf51d76c4acea97de95806aaa14a", + "name": "httptools", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "3bf4804c215d111b6a4702cf9000021ab39807d1ed3207dd011b14b2843b2d14", + "name": "httpx", + "version": "0.28.1" + }, + { + "direct_url": null, + "metadata_sha256": "d11dd50813b8914bd9455e8b2b591171cd2b1618883943153afadc8bb9224678", + "name": "httpx2", + "version": "2.13.1" + }, + { + "direct_url": null, + "metadata_sha256": "43b119c34ad2b2aacc032a1a6a8feb142fdb5ca407a3519325d74dd53d8904df", + "name": "huggingface_hub", + "version": "1.33.0" + }, + { + "direct_url": null, + "metadata_sha256": "9ce850d5a6b775e5ef4a335f907e579a878e058213121b6eec567781ea68c585", + "name": "humming-kernels", + "version": "0.1.12" + }, + { + "direct_url": null, + "metadata_sha256": "67aa4f6717d82446a51ce350e7c4769eba0c4a22d2f428255cddd9d24b11a914", + "name": "hyperframe", + "version": "6.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd9511ede42f63b995c3f71944f908cb8f014048b63ecc1c8d420525a3354b59", + "name": "identify", + "version": "2.6.20" + }, + { + "direct_url": null, + "metadata_sha256": "af3c3a62bb5d82d6a43454684e0b1dedde27a21ea90eacfb1bed9814619f06d0", + "name": "idna", + "version": "3.20" + }, + { + "direct_url": null, + "metadata_sha256": "cf71393f3d079ce2e859384573e65aaacd1709bef700701f629df32398b598f0", + "name": "ijson", + "version": "3.5.1" + }, + { + "direct_url": null, + "metadata_sha256": "9305763e93d03df0e36516b1125fa046a6ebe37d44589e200e0593cf4bdfd980", + "name": "importlib_metadata", + "version": "9.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "32860c3c19b2e91f6cb5bd83400b5870cda051bc74a5a08822c8c666af0990db", + "name": "iniconfig", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "560faabb3d45d779e445a74e7e806a786f95f2200fa06d979603b7f0ee1cfb39", + "name": "instanttensor", + "version": "0.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "f6fc1f0d389e4245fc2a1a0fdfee09422e56200cb6f94659668456997ff4f7a9", + "name": "interegular", + "version": "0.3.3" + }, + { + "direct_url": null, + "metadata_sha256": "d10f300731197a4829b77f0c883bb3cf8a37ae8c76a302e095fa95d6427706d0", + "name": "jiter", + "version": "0.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "5b0c8d4b4c535a2432fb206223d774509b6e20af374c6a4b6f98bf72a7de6702", + "name": "jmespath", + "version": "1.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "6c4032c2e74273452cd77399af2ee85198f49c22da897983f26d2ed6f787c4e8", + "name": "jsonschema", + "version": "4.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "aaa6cd66f423729e8da397c9d533b7d731f6b25f3d6371b9338c36bdb9be74a0", + "name": "jsonschema-specifications", + "version": "2025.9.1" + }, + { + "direct_url": null, + "metadata_sha256": "f7c0687c032593106a2e5a3c241cf8043e7e2c222bddb0022b4cb2bf5de67115", + "name": "lark", + "version": "1.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "4511c6b04efc57a5f5333edc1f5f48b9f5412c3923d4bc19b715bdf47977511c", + "name": "linkify-it-py", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "be929870f6ecae18a819c56118f1101f3076e25ac6a4843ca6f4707ebd1e87c6", + "name": "llguidance", + "version": "1.7.6" + }, + { + "direct_url": null, + "metadata_sha256": "cf2b87669bead3e76ec54207f3354c13f73b50c32fcd13c8d627084b3379139e", + "name": "llvmlite", + "version": "0.47.0" + }, + { + "direct_url": null, + "metadata_sha256": "0a416d79c5543d94d2b18807626293d4f47655d1d22724c7ae296e413078aaba", + "name": "lm-format-enforcer", + "version": "0.11.3" + }, + { + "direct_url": null, + "metadata_sha256": "16bc1f59e34fd2a6633bd395276052eacd2c777b2cf72781e76b203f013a8fac", + "name": "loguru", + "version": "0.7.3" + }, + { + "direct_url": null, + "metadata_sha256": "5216d5acfd039a7b581a826186309594b228d37d2c8d56864124ea666689fe4e", + "name": "lxml", + "version": "6.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "f59d772b35315a928672bfcccfb89d82c0aac672c5275c048f7a93b79015bcea", + "name": "markdown-it-py", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "b137367ef0056711cbf5e53015df9168cab80373104e7899b1c0263a21d9c99c", + "name": "mcp", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "38e0b9edaae09e58cd1461fc961ced22672038a697930bedef153a74befb3de1", + "name": "mcp-types", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "799f49685865fd9cc8915fdb92a33e102eeeffad562b03b4aeffb6f422b771c1", + "name": "mdit-py-plugins", + "version": "0.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "481f9cbe08596c6eaba6343e0efa1b13b2362c30dce0610f7c08523f1d98388d", + "name": "mdurl", + "version": "0.1.2" + }, + { + "direct_url": "{\"dir_info\": {\"editable\": true}, \"url\": \"file:///Megatron-LM-training\"}", + "metadata_sha256": "2876c0c760bbfc93bd7d737bf0db2866a937308a7c1707c3a2bb59d4795986ff", + "name": "megatron-core", + "version": "0.16.0rc0" + }, + { + "direct_url": null, + "metadata_sha256": "a6e34d488c879f57ce042bec38f8864ba3ea7d6ecf0ab757fc88fe8dc0a22f26", + "name": "memray", + "version": "1.20.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd26d80dc9676b1fb8c894355bd525fbe7f49a6a86a555c72e9ec6d927247c33", + "name": "mergedeep", + "version": "1.3.4" + }, + { + "direct_url": null, + "metadata_sha256": "dd1b3b89e88d1c65a26e6e72dd075eabbc220bfb138769ec8b64578ee911795c", + "name": "mistral_common", + "version": "1.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "4859847a9f6321daf8849cf7fd1542ff430db6563a2abf9ac0d62a5b21bd951d", + "name": "mkdocs", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "1729fc31479f2582486cdc85397417659dd3b2fb3f920553de66cfe59d5f0b3e", + "name": "mkdocs-awesome-nav", + "version": "3.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "88b4b7b7c0aba5547befdedaf515c8df4867361daf55ff60b72578464d72dcbe", + "name": "mkdocs-get-deps", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "ad33bb33fb16b1f69689c4682550e97232154e367e2c8c8aee9dad0f10d269ce", + "name": "mkdocs-git-revision-date-localized-plugin", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "ed69fbfb9ac00c10c5a383a12ff9d2b9919ae184e408554434199211643d6040", + "name": "mkdocs-material", + "version": "9.7.7" + }, + { + "direct_url": null, + "metadata_sha256": "d1c549b61701148b97f8246bc924b2840e504b37b0ce7a27e78ddf81261e5363", + "name": "mkdocs-material-extensions", + "version": "1.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "4ad6171f3bf6812e4de90670ff0089d445093d4fe1d05d55f17b96a4a192a816", + "name": "ml_dtypes", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "4ad6171f3bf6812e4de90670ff0089d445093d4fe1d05d55f17b96a4a192a816", + "name": "ml_dtypes", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "b0dbdfa30ab6b1ce637a794899c9e43019182b6d1ab2d07b90f647f7331eba6b", + "name": "model-hosting-container-standards", + "version": "0.1.16" + }, + { + "direct_url": null, + "metadata_sha256": "95424470e481cfa8d18b30963b6de3aafe16614b1ea0414e184a008571dde84f", + "name": "mpmath", + "version": "1.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "eb184d83489401903615ce8a78d98d5b933dec0f7246811d396a529915fe797c", + "name": "msgpack", + "version": "1.2.3" + }, + { + "direct_url": null, + "metadata_sha256": "520006303d6a0e859970b83f7d452196e2e8f6dab08f6dcf1ba5823c1230025f", + "name": "msgspec", + "version": "0.22.0" + }, + { + "direct_url": null, + "metadata_sha256": "010d2fe039006070a711a476b171b7b7da5c29ccad3c4eecd77ef3711b07c2d0", + "name": "multidict", + "version": "6.9.1" + }, + { + "direct_url": null, + "metadata_sha256": "235634cc7ebda45f8a84dfdb1b9b35ac1a77a1888b34650c3a616d23e4a7e93f", + "name": "multiprocess", + "version": "0.70.19" + }, + { + "direct_url": null, + "metadata_sha256": "7c545b4b3e5e83d3fde41352272c10cb9deeaba5b7138fbf24383e952af8822e", + "name": "natsort", + "version": "8.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "311ee8cdaeaf9f11acf51cda9c3b5b191f76ce9d98bc3418164c3189bbc37a08", + "name": "nccl4py", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "66360539217852c3b44b37f409eade7e1559baf018bb363bacb2aa3a9759b203", + "name": "networkx", + "version": "3.7" + }, + { + "direct_url": null, + "metadata_sha256": "e8b0b1746808b87816c47e4531780ded7f246bed9575a89e8b40200aa81e9a13", + "name": "ninja", + "version": "1.13.2" + }, + { + "direct_url": null, + "metadata_sha256": "77c1117f0dbc41560ddc6e6b37b542fb4e88afcd4ef82ec06593e5bbd5f37121", + "name": "nodeenv", + "version": "1.11.0" + }, + { + "direct_url": null, + "metadata_sha256": "9af629898406c9eaa69897fe09220dc483270cdba89f6b20bf0165cdf0e1668e", + "name": "numba", + "version": "0.65.0" + }, + { + "direct_url": null, + "metadata_sha256": "0c7281a81cf76e40b27c1385ffd8a215d7227adc219f177ce807ead9e91994a5", + "name": "numpy", + "version": "2.3.5" + }, + { + "direct_url": null, + "metadata_sha256": "0c7281a81cf76e40b27c1385ffd8a215d7227adc219f177ce807ead9e91994a5", + "name": "numpy", + "version": "2.3.5" + }, + { + "direct_url": null, + "metadata_sha256": "bab990ced4537ce74ef5961ca933c4c6fd604fd09a5827a4a428c55bcb0be35b", + "name": "nvdlfw_inspect", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "10f6595146332d35f7f15a000e08b5c81432528c5d026470c1d03f0c1399fb70", + "name": "nvidia-cublas", + "version": "13.1.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "58e933b4ac8e49f098b16ab7480d03bd792afc3d1db10d0aacbdcc2c62e48fa3", + "name": "nvidia-cuda-cccl", + "version": "13.3.4.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "baac937970681d41aa0c3708b3d55d73f8d29e70aceaac0e71fe6d1548e94a09", + "name": "nvidia-cuda-crt", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "8d51e5c76ef5707b0b80d5ec9a791c0f11a480ab721820cf100a3cc566017eef", + "name": "nvidia-cuda-cupti", + "version": "13.0.85" + }, + { + "direct_url": null, + "metadata_sha256": "724bf56e61ddef5d4c2482ff64103a973b911b110b668acaea5373f6c83c1c5c", + "name": "nvidia-cuda-nvcc", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "c54801dbd815d534519a761f1f328325aa0f1d1f1659aa969fa74e7a2c76eee9", + "name": "nvidia-cuda-nvdisasm", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "af51f248363020b9fdfd2743704e901bf3d19a1a1ce1fe44fb98ba148bfc0157", + "name": "nvidia-cuda-nvrtc", + "version": "13.0.88" + }, + { + "direct_url": null, + "metadata_sha256": "055f7fc69a5a2159de82cd0718da02c8852e81c8a71ebb117b8e799badd7167e", + "name": "nvidia-cuda-runtime", + "version": "13.0.96" + }, + { + "direct_url": null, + "metadata_sha256": "df18686dbdb3074ca375a1d6c623a04102fd348950c67a721397349c6d4f0477", + "name": "nvidia-cudnn-cu13", + "version": "9.20.0.48" + }, + { + "direct_url": null, + "metadata_sha256": "abd0ca3f67af19a4d383ff2a012ae0090d4731c6492fd47236615308a50b3981", + "name": "nvidia-cudnn-frontend", + "version": "1.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "4a78545d424d0c5038353f7046a8ae40ceaf312045d71399eac9511f5fc15434", + "name": "nvidia-cufft", + "version": "12.0.0.61" + }, + { + "direct_url": null, + "metadata_sha256": "e49b909195c03ddbe203729d9b31dd88e3f207368333d1909c67c6b130a0c696", + "name": "nvidia-cufile", + "version": "1.15.1.6" + }, + { + "direct_url": null, + "metadata_sha256": "bb15a754c6be32c23aaac13c1cfa7a8ce53d92bc26652ec3b609f7a5cce3e7d1", + "name": "nvidia-curand", + "version": "10.4.0.35" + }, + { + "direct_url": null, + "metadata_sha256": "0dd58f677811eac04901a793740932e5a2a8fff2f5453aa6351614eb18391bb6", + "name": "nvidia-cusolver", + "version": "12.0.4.66" + }, + { + "direct_url": null, + "metadata_sha256": "8aeb284782ef6883095a5d1c110e221cad023a99afcfd5cdb4969a25e146d562", + "name": "nvidia-cusparse", + "version": "12.6.3.3" + }, + { + "direct_url": null, + "metadata_sha256": "09555246122896eaca3b8313eecfca4b339fefd3b597874cb9fe3bf29dab38c9", + "name": "nvidia-cusparselt-cu13", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "ac77bac79fbfb0c52ac6e2e5abc936b1e127be2192f0cbc27b00be3125fa86ae", + "name": "nvidia-cutlass-dsl", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "1ec968ec7c4083f7fe4e1fb8384c7e9b853a81491fef9f4cb1cf755961aaedf6", + "name": "nvidia-cutlass-dsl-libs-base", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "cc6f3846cd820013eaa6e2665c493d70c607be6ce7349b939eb4742888470585", + "name": "nvidia-cutlass-dsl-libs-core", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "2357d0df2d0d17c0b16663b8a89df53f751b19721f66821fd88fa78112c08e55", + "name": "nvidia-cutlass-dsl-libs-cu12", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "244590c25662dcf777b1daae97a858afe1a1aec62e5e6678b217007a459ab552", + "name": "nvidia-cutlass-dsl-libs-cu13", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "c3a25ada01f57418c1b897406c3abab18834e6adc573ab7b060620c453afb6db", + "name": "nvidia-ml-py", + "version": "13.615.71" + }, + { + "direct_url": null, + "metadata_sha256": "56baad4e7f699902b03b17580933f7bd50b6ea97b7df9d7e807750973da7529c", + "name": "nvidia-nccl-cu13", + "version": "2.29.7" + }, + { + "direct_url": null, + "metadata_sha256": "98810ef0ab8badc369e6a46a038f8ee9f412c0c753fb5ad580544f23a0aa7962", + "name": "nvidia-nvjitlink", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "b0f54ee21909d19640a58e05da755c91763eb5725f544fd0d4b84b2f5f94deba", + "name": "nvidia-nvshmem-cu13", + "version": "3.4.5" + }, + { + "direct_url": null, + "metadata_sha256": "06dc1a593c7e8b8c3f29184228c83f8f7ef57787ad91f3e5bcae1d238dd3092a", + "name": "nvidia-nvtx", + "version": "13.0.85" + }, + { + "direct_url": null, + "metadata_sha256": "32ee63450a437b6a6ed227ff6549144aa596197a322993521ec7af826ebd413e", + "name": "nvidia-nvvm", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "32c2efdcd2c673b3b7f35ca9c2cccefaad36f1f0a920648a13cad85f6a5767b2", + "name": "nvtx", + "version": "0.2.15" + }, + { + "direct_url": null, + "metadata_sha256": "3419d80e114a2c19fa9bd3582939a3942f19673055707ba6ca2ca489d58b41e0", + "name": "omegaconf", + "version": "2.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "28971076ce9c279d4b889496b046d55a1e05b02fb9851ceb717e9a10df799572", + "name": "onnx", + "version": "1.23.1" + }, + { + "direct_url": null, + "metadata_sha256": "1246f5a4d8295907a42e809ed9173ede2510ec9d260d2168989d126564897fa5", + "name": "onnx-ir", + "version": "1.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "e14643636835759700dff286f949c5ec34e7eac7ac47f44096414f0e0f1c3101", + "name": "onnxscript", + "version": "0.7.2" + }, + { + "direct_url": null, + "metadata_sha256": "00f847e99939207bd70dfd806428f6b20a3d01074b59325e4c76149a2e19be26", + "name": "openai", + "version": "3.22.1" + }, + { + "direct_url": null, + "metadata_sha256": "598d3ad5a22a14a7c4f1d218b43e345f32b0ba094b753467bae8a3f708fd48cb", + "name": "openai-agents", + "version": "0.22.3" + }, + { + "direct_url": null, + "metadata_sha256": "5a0afcb1ce845e05da12beb1767f5d2749bbc9e9050718c6b9fa3c225713c9eb", + "name": "openai-harmony", + "version": "0.0.8" + }, + { + "direct_url": null, + "metadata_sha256": "e86a6b6fcbbe152805f782c57df321002892e163019574877e9829272e25eb4e", + "name": "opencensus", + "version": "0.11.4" + }, + { + "direct_url": null, + "metadata_sha256": "53d669c8bd3d32d3275153b454e515ca5cc6dec92fae3a98309b5a2b19fe6d2d", + "name": "opencensus-context", + "version": "0.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "19778b6d66b0e45bf73e11fa37a208949d5b393aef914627394d5601455546a6", + "name": "opencv-python-headless", + "version": "5.0.0.93" + }, + { + "direct_url": null, + "metadata_sha256": "19778b6d66b0e45bf73e11fa37a208949d5b393aef914627394d5601455546a6", + "name": "opencv-python-headless", + "version": "5.0.0.93" + }, + { + "direct_url": null, + "metadata_sha256": "a3f5434fa7c80f7f7abc82173da639c8e9c59d30b4027182645562bd3d2f4f97", + "name": "opentelemetry-api", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "8611977ea596e4827874582e86250618444e1c718229dddfc16e5ea437ce5fcb", + "name": "opentelemetry-exporter-http-transport", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "2cfd41e5ca33292d987ba71fa6186d11e16ed66888f3a26f8a3a99060c4b5e90", + "name": "opentelemetry-exporter-otlp", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "3bb4494220732d4bf10e1dba231ea7638cedaa5362e1f23a50d34a14f520fea8", + "name": "opentelemetry-exporter-otlp-common", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "27fb1c8aa5c2cd07776f9f3281fc618cd3feb96017757c33d2b3586fb7fec88b", + "name": "opentelemetry-exporter-otlp-proto-common", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "5cba6098cdd0bfb06853a6c704a2451c4f82c9dea376a30b59ecd279296648ad", + "name": "opentelemetry-exporter-otlp-proto-grpc", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "6f53ef1c172ebf87af69b9ef390aa908506d0cd14bc7811985fdd937a4058808", + "name": "opentelemetry-exporter-otlp-proto-http", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "1910f4e7ebd497e98b6d231e10275288fda2cd1885117575706c62f45e065889", + "name": "opentelemetry-exporter-prometheus", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "fab18b721e30be41448be252e1dca43b48e7f15d971e0bb552492c0ef4b07bee", + "name": "opentelemetry-proto", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "3644a79f55762a646799ff52b9d837e01c8192b7b28f735a383f55c90edb9bc2", + "name": "opentelemetry-sdk", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "add3db481f7f401f65cfbddb058fde3bb4c9dd7b61064a84f8598ad7efe0b11c", + "name": "opentelemetry-semantic-conventions", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "0dfff30e912520a226bcf7a547393484cfcd8c738439c7b48418f61c95109480", + "name": "opentelemetry-semantic-conventions-ai", + "version": "0.5.1" + }, + { + "direct_url": null, + "metadata_sha256": "210ce26bad0a245a72831b4fa029708c245d4d670a88c8d5a69b1446c24a95e4", + "name": "orjson", + "version": "3.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "35ff73511848f5f934ccc39d538014716ec4579e76d54e0e407ff51794a7939c", + "name": "outlines_core", + "version": "0.2.14" + }, + { + "direct_url": null, + "metadata_sha256": "8ee2f7138ade46b6e348a6d099612f5bd6caff13511f3b4144327f37ce50eacf", + "name": "packaging", + "version": "26.3" + }, + { + "direct_url": null, + "metadata_sha256": "a4ab87bf8083001f25ccdc46095f05b678b3569dd58edc2cf941e3e7f64d7c88", + "name": "paginate", + "version": "0.5.7" + }, + { + "direct_url": null, + "metadata_sha256": "1de96a6c28c2e5613c9c87cd4ad9484791001cf58df43cf2ba74d5c4f85f0ad2", + "name": "pandas", + "version": "3.0.6" + }, + { + "direct_url": null, + "metadata_sha256": "d05b8d05da9f78176b2eefaacdfaa5e96708ec4f488daea8bbc52e3ed1bc3954", + "name": "partial-json-parser", + "version": "0.2.1.1.post7" + }, + { + "direct_url": null, + "metadata_sha256": "c1d126edceac2685e29403a8ae3a27c47143dce1f0252fa3931771562f1e2b4f", + "name": "pathspec", + "version": "1.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "30325dc8ce17bc64f9dbc0a449232fd35841a019df22a6f481007c9c5a28c1cb", + "name": "pillow", + "version": "12.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "cbc0b7b6e63b50dcb7c17cf3526a9304f285d9a31353adf3b22acc2059ab23f5", + "name": "pip", + "version": "25.0.1" + }, + { + "direct_url": "{\"dir_info\": {}, \"url\": \"file:///work\"}", + "metadata_sha256": "6ba03b5bc457a2a3d92468729501b5892a0d38ebcc36766c58859449498c5743", + "name": "pip", + "version": "26.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "0421937c4410b61c5325233d5b7671ae933bae8de174f87586ac55aa804851ea", + "name": "platformdirs", + "version": "4.12.2" + }, + { + "direct_url": null, + "metadata_sha256": "2bcffab42626e1fb50d6329765619312d30fe7f4880e98dcee99c92ebd283bb4", + "name": "pluggy", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "7e7562ba7c032f8edd02641ae71b1ac2d8f388103a68d777a7e907d19e75bc17", + "name": "pre_commit", + "version": "4.6.2" + }, + { + "direct_url": null, + "metadata_sha256": "bbe0a7662602ddd23f929fe0ee98e9d04406e138aeee18ce4861af186ea6060d", + "name": "prometheus-fastapi-instrumentator", + "version": "8.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "ece4a61f3ffb92a083fd5e47e180e3e070342e60a3bd93876a879e79a643e821", + "name": "prometheus_client", + "version": "0.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "5feba21a58eaa126e7e7739e57e2572e5bb251fcbf56e439e508acc47d769314", + "name": "propcache", + "version": "0.5.4" + }, + { + "direct_url": null, + "metadata_sha256": "3f136dbf7239c987a7685acd33440cc5efd6c4107b4b11c425201b4de70ae36f", + "name": "proto-plus", + "version": "1.29.0" + }, + { + "direct_url": null, + "metadata_sha256": "118b5ad013120a7a6e24714595ad776bf264d7b0060389133310d18ea1480902", + "name": "protobuf", + "version": "7.36.2" + }, + { + "direct_url": null, + "metadata_sha256": "0849f5a519bf9bc23ef204443fdd8d6d10678863acac7ca9340fc11bfba5a856", + "name": "protobuf-py", + "version": "0.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "eab5f2f4fd98f67a710a8fb1975b64ffa880a4f977566f022c567e08e324ccd6", + "name": "protobuf-py-ext", + "version": "0.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "39009938840de3a8b2a37eb4668d2601aae8c74e4b74743f73e59996b5b7e6e1", + "name": "psutil", + "version": "7.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "df44b58e8a4cfe57f65773ec47f7bdf2a14c8f5f73a7abf331a6b6237d6d691a", + "name": "py-cpuinfo", + "version": "9.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "2fd4a9efc5e5c74ae4c2fcf1970193c524c62ab22af8d5e66ebf7df9e6e46e83", + "name": "py-spy", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "d2ccdeb15cddedc81637a83e40baa6397fe269023b738d0fc3cb2d90722e290b", + "name": "pyarrow", + "version": "25.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "47b9f28e971a56f5adf949e0bcf105b0bf6587946566ecf197a2819d8848cc01", + "name": "pyasn1", + "version": "0.6.4" + }, + { + "direct_url": null, + "metadata_sha256": "82ce4c01c6d36841b9801fcdabab9bfe61d0b5e4e440c275941d8a2d4a790730", + "name": "pyasn1_modules", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "45cb345e4c12f63bc843b8c88902cc44c4d624a55aaef8cd5ffbc0ad16356fbe", + "name": "pybase64", + "version": "1.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "d311ae661edeac8ff029ab2960d065a7e792ebf8f79af682daa53109fe81318b", + "name": "pybind11", + "version": "3.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "cce9c0d440d065d4cdfb0d00004b8ddd65cf363a740efc5b0920b29201a59cd9", + "name": "pycountry", + "version": "26.2.16" + }, + { + "direct_url": null, + "metadata_sha256": "a1e33542883c249bf6c263b0023b9ea8a6131a77d9cb2cbc88316968e5eada83", + "name": "pycparser", + "version": "3.0" + }, + { + "direct_url": null, + "metadata_sha256": "faffcc4d7d359cb1047a9f67f7c65096b838c6db6c62852ef20fb27d55649a95", + "name": "pycryptodomex", + "version": "3.23.0" + }, + { + "direct_url": null, + "metadata_sha256": "98929f4cb80451dc3c6c8cd541a3081dccf0dee94afe7d9fa5c214a18ff236ce", + "name": "pydantic", + "version": "2.13.5" + }, + { + "direct_url": null, + "metadata_sha256": "8eccadbe707db97c397fb79073fe791b7998ef3a85f04f817f8991f7697b190b", + "name": "pydantic-extra-types", + "version": "2.11.1" + }, + { + "direct_url": null, + "metadata_sha256": "8f00c91deb34399316a5386eb2e76fe09f14a08dc3045f2e7dce9bf8573796bd", + "name": "pydantic-settings", + "version": "2.15.0" + }, + { + "direct_url": null, + "metadata_sha256": "66c729edddc20bf2764bb18bd87d907b08690e50355f39b97acc737b26d1d164", + "name": "pydantic_core", + "version": "2.46.5" + }, + { + "direct_url": null, + "metadata_sha256": "394500d78a0c1a433ae8ca3693152c08f6a901121d4b069cf1540a19759e2950", + "name": "pylatexenc", + "version": "2.11" + }, + { + "direct_url": null, + "metadata_sha256": "df2e9e9847a2aea0ae6e20fd325aeb16cf3ce7f8913462db6c2398363cd0c0bf", + "name": "pymdown-extensions", + "version": "12.1" + }, + { + "direct_url": null, + "metadata_sha256": "82fcfe724db9f0b51348da89f4f5cdc0b08d08882b1bbc0ca4913d3a0a93bcb9", + "name": "pynvvideocodec", + "version": "2.0.4" + }, + { + "direct_url": null, + "metadata_sha256": "3722422cc1478b175879143dfb78f98b7a5f53f4f684d71b7054fe2e8acd3b89", + "name": "pyqwest", + "version": "0.10.0" + }, + { + "direct_url": null, + "metadata_sha256": "7d1d1c276b7c372d55d17ac7d30f0a4b80a746e147347b8510d1355eea7f80c8", + "name": "pytest", + "version": "9.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "89e7c1c932e52b74bdcaf504389d2d1a2d7ca559b02bf5a09fc80ebd58ad10f7", + "name": "python-dateutil", + "version": "2.9.0.post0" + }, + { + "direct_url": null, + "metadata_sha256": "54f30f811841b6d772f31715712c85bfe0041839cb071f78daf41c700a98642b", + "name": "python-discovery", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "54f30f811841b6d772f31715712c85bfe0041839cb071f78daf41c700a98642b", + "name": "python-discovery", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "0cc19efd76cfbf3bcb2cb0d3ab82191036855859455aa3812c5e9e591e3f34e8", + "name": "python-dotenv", + "version": "1.2.3" + }, + { + "direct_url": null, + "metadata_sha256": "1d866c6124631b9ce1797ad412fff298ab53fc2d95210281d7c8f20e920753fa", + "name": "python-json-logger", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "2d18a1e7286d92a656ead5ec6f83d5ae6dc858634624f6b264703ae88d24d718", + "name": "python-multipart", + "version": "0.0.32" + }, + { + "direct_url": null, + "metadata_sha256": "beaa0efe9ba4b34843f5a0fc7379a73f10e95adb8cc0c31f359ab6f3a42b4def", + "name": "pyyaml_env_tag", + "version": "1.1" + }, + { + "direct_url": null, + "metadata_sha256": "238dc769e22d4f5626750cdff36e920e4a8d69c10d88de6d79b40a59cc13d873", + "name": "pyzmq", + "version": "27.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "de0a5e855bb5bb78b7acdcd2ca60619c6a0c109814881589caf158ec07155662", + "name": "quack-kernels", + "version": "0.6.5" + }, + { + "direct_url": null, + "metadata_sha256": "961ffef199b876fb4d7b10903d78e79f359d703b1638834c61d70b9879932918", + "name": "qwen-vl-utils", + "version": "0.0.14" + }, + { + "direct_url": null, + "metadata_sha256": "faf6ab9027d12de992827a2d8a224996fe6747a8c5f7d31ae495983dc73eefe9", + "name": "ray", + "version": "2.54.0" + }, + { + "direct_url": null, + "metadata_sha256": "c50d8b3ff4d113925b60dc47d1d28e87248a3338024241b0a3a66c8794fbce0c", + "name": "referencing", + "version": "0.37.0" + }, + { + "direct_url": null, + "metadata_sha256": "02acdc52d6f21d5f4b172254daaa94edfaa44c9ebe14d1c00cc4c8fe99b0e1df", + "name": "regex", + "version": "2026.9.29" + }, + { + "direct_url": null, + "metadata_sha256": "ac08207697217d1ffde8a161b424d77d6e2af6b62630fa26d75d08f11076cdca", + "name": "requests", + "version": "2.34.2" + }, + { + "direct_url": null, + "metadata_sha256": "f1abd635c3dff607a4fd654c62a88d9d4c21843cfc9176116c156f4269ca21b5", + "name": "rich", + "version": "15.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "932ff7743a756d0efcc45528d64c275ac3cb40a8dd1787ea10cb303907f0ae4f", + "name": "rich-toolkit", + "version": "0.20.5" + }, + { + "direct_url": null, + "metadata_sha256": "294a1405c0fa34b5f735bcb46459050436849a1e584c643544de99c07c529fb7", + "name": "rignore", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "5e54dd00b4ad336c5161d47de2a5c2212090c44629c28b6538b156256e49282d", + "name": "rpds-py", + "version": "2026.6.3" + }, + { + "direct_url": null, + "metadata_sha256": "0d5895abd80bfc0027c02943abaea4547061b9004bd134950d640d619a697835", + "name": "safetensors", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "91d5de3f641f33a8fbb4b6e91772da68d50b68686971d7b66af2068f2e77b694", + "name": "scipy", + "version": "1.17.1" + }, + { + "direct_url": null, + "metadata_sha256": "297fb30f701a800489c12893a951da3e5bd1f80061a1f43f0d3e9f1d4c6bc6fd", + "name": "sentencepiece", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "4245e0388ddf2048a38ae2a24a3d2c583408b2454aadc680d3c3beede639db3f", + "name": "sentry-sdk", + "version": "2.71.0" + }, + { + "direct_url": null, + "metadata_sha256": "ae8a9e6feec1a76e954d65ea48ac57842c9a7bfb5ac6e5ea82400a5ba9f71a98", + "name": "setproctitle", + "version": "1.3.7" + }, + { + "direct_url": null, + "metadata_sha256": "341d00772017437d0f6e3c943ae353f243c39fedfba403aea47cced927a76516", + "name": "setuptools", + "version": "79.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "ff4bcfb192bd542ed8f1794fb32ffc9eabd932d6e03cb00a4ad5e35a2469af88", + "name": "setuptools", + "version": "80.10.2" + }, + { + "direct_url": null, + "metadata_sha256": "f1e5a532fb8cda0bbc370e3db6cb9cea72a065d12ddd6a14976ba3cf66264221", + "name": "shellingham", + "version": "1.5.4" + }, + { + "direct_url": null, + "metadata_sha256": "2aba2cfd9c2ad7625a5d374d141af317d8f92d3534997bf98d127e52848dfc81", + "name": "six", + "version": "1.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "69ae2dfe547624be97fae348e1cfa3793f8854eed32cc1603badedc7d48fb36e", + "name": "smart_open", + "version": "8.0.2" + }, + { + "direct_url": null, + "metadata_sha256": "d415e6c6de7dee117d254a342668c489931bc88eac7ec8678b452078e366da6e", + "name": "smmap", + "version": "5.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "093bc4f0740a6fc28692e616aa8fe68d7e1d76426cc5a5faf9ea722a8ee7aaae", + "name": "sniffio", + "version": "1.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "b3cef071eb1dbeaa76a1273fe2ca2cc8ef36e835165253952d93780962529ac1", + "name": "sse-starlette", + "version": "3.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "3c01ca830e213f0311fe37bc3b46b8ab230a5e7acb894bf0fc8785cb7ccfed48", + "name": "starlette", + "version": "1.7.0" + }, + { + "direct_url": null, + "metadata_sha256": "6017ca508a293cf47a88a78cb330e9cbd131d74ec3c7fbf89bd4300ed3129d30", + "name": "supervisor", + "version": "4.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "fd5eb4925b04f9bffbc6c4f92bf8aea7243b918b43cd359493fce48a7dd3b336", + "name": "sympy", + "version": "1.14.0" + }, + { + "direct_url": null, + "metadata_sha256": "f09f0e24282c5a86346bcd5b10ae5ff81869fa8ef69c3ba524bd0a817a87dda9", + "name": "tabulate", + "version": "0.10.0" + }, + { + "direct_url": null, + "metadata_sha256": "519fa19c146fd58a0a75ecf1461e4bd98f9c06d01800c37d4a80f5fef095f4e1", + "name": "tensorboard", + "version": "2.21.0" + }, + { + "direct_url": null, + "metadata_sha256": "1af7ad76e4073b01ab147eb3c1d8e38b95d38062c6c9bc63890150738642e8eb", + "name": "tensorboard-data-server", + "version": "0.7.2" + }, + { + "direct_url": null, + "metadata_sha256": "9e597f62fc07e3b931d5c8fb0e90706fb6d45465cfb5d01dbd27ba7fc135c02c", + "name": "tensorstore", + "version": "0.1.80" + }, + { + "direct_url": null, + "metadata_sha256": "0da993d16ef6326f471796fcb065622f309c5c1aae6c6295b488ea64bb5c880c", + "name": "textual", + "version": "8.2.8" + }, + { + "direct_url": null, + "metadata_sha256": "52ca6148d4fd1497254855fa610cfdde99191cd42bce7a452fd3a68855504ac0", + "name": "tiktoken", + "version": "0.14.0" + }, + { + "direct_url": null, + "metadata_sha256": "0df9eb495cfb477dcbdfbdcd8c04d952d3eb00d77831630760571e13545398e5", + "name": "tilelang", + "version": "0.1.12" + }, + { + "direct_url": null, + "metadata_sha256": "802b576e011dc61bd2681593e8d802714b6c4ce636a9cf87035026db32ce6262", + "name": "tokenizers", + "version": "0.23.2" + }, + { + "direct_url": null, + "metadata_sha256": "4e1631b2164a49ff9a848d86ce504fdcc15e3540dbb262df8f33a2681a8de513", + "name": "tokenspeed-mla", + "version": "0.1.8" + }, + { + "direct_url": null, + "metadata_sha256": "05086095a775c5dca70998dcf442a848c13f9c68b54a54c510c3542c5abb6563", + "name": "tokenspeed-triton", + "version": "3.8.10.post20260920" + }, + { + "direct_url": null, + "metadata_sha256": "71daba472d0c5ffc25c0231dc29688ab0cb13d5bc7e7d93f6c4cce4169c50048", + "name": "torch", + "version": "2.13.0" + }, + { + "direct_url": null, + "metadata_sha256": "cccd2f1c0e5866e63732f58798c8d642ee6d10cd560d6f691e7981b908c246c9", + "name": "torch_c_dlpack_ext", + "version": "0.1.5" + }, + { + "direct_url": "{\"dir_info\": {}, \"url\": \"file:///torch_memory_saver\"}", + "metadata_sha256": "6276cef17dedbb5ee0d6157bbf63b832e916026281328d995ad3d488c2539618", + "name": "torch_memory_saver", + "version": "0.0.9.post1+slime" + }, + { + "direct_url": null, + "metadata_sha256": "29809ca2c86dda5079654f1f70564a64435e9d08f1964a2412b6f514e1b5ff64", + "name": "torchaudio", + "version": "2.11.0" + }, + { + "direct_url": null, + "metadata_sha256": "7e9be0f3a290e3fd9370d8fe010c7ffd006d5d3d05ab8bdf7df8f92f0fca9c39", + "name": "torchcodec", + "version": "0.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "181fa5e6b399c378711eddcdacd756d3c51317916f8eb160ee36cae7fae9589f", + "name": "torchvision", + "version": "0.28.0" + }, + { + "direct_url": null, + "metadata_sha256": "43d1261aff90cf3d5b1b40cf1f94234d61409b14e59f3766f457c1eec7f7ac15", + "name": "tqdm", + "version": "4.70.1" + }, + { + "direct_url": "{\"archive_info\": {\"hash\": \"sha256=3e1d9f534781c8e608240da0b495b8246317a36382f7609017cbaa7fb1d53f7b\", \"hashes\": {\"sha256\": \"3e1d9f534781c8e608240da0b495b8246317a36382f7609017cbaa7fb1d53f7b\"}}, \"url\": \"file:///wheels/transformer_engine-2.16.1%2Bc9877beb-cp312-cp312-linux_x86_64.whl\"}", + "metadata_sha256": "d882f743161d9d9f35dee4e1a8cc9136fa495f7c660caace01ab8f5602d76aa7", + "name": "transformer_engine", + "version": "2.16.1+c9877beb" + }, + { + "direct_url": null, + "metadata_sha256": "465797a59706d83b45c93fde750b228c3b6e1addc44115de2c4c02ad66d9c5ea", + "name": "transformers", + "version": "5.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "a91982ca086667c592a951973434f7c5a9f27a8300bc97af78dfb496afe53e71", + "name": "triton", + "version": "3.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "d26fbb244532c4051e715f9047cd943e2cc4abb0ac6f2a517fa2986eb1ea726a", + "name": "truststore", + "version": "0.10.4" + }, + { + "direct_url": null, + "metadata_sha256": "c84af1a069084b1b440b3594068dec29200d52d4c1a9b652030448717f270158", + "name": "typer", + "version": "0.27.2" + }, + { + "direct_url": null, + "metadata_sha256": "0ad6653b7439f4bb6a596cb7b01ed1b716458467525c4dc40b75d62bdb943c98", + "name": "typing-inspection", + "version": "0.4.4" + }, + { + "direct_url": null, + "metadata_sha256": "d005280aa13b334ac942d20219102865e559f69ffd06c35c248b2f0d0da3b933", + "name": "typing_extensions", + "version": "4.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "fba2930e9030a18965d243f8d330748db2e67572a81b3b68710462fb5110332a", + "name": "urllib3", + "version": "2.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "bc5717bd6524a33838f285261868bcc8e311e8c29fdb19e41d56c38b04890e84", + "name": "uvicorn", + "version": "0.54.0" + }, + { + "direct_url": null, + "metadata_sha256": "741c006d8441f562aa853a5430df236fbb4af923445491f396bf09943bd30258", + "name": "uvloop", + "version": "0.22.1" + }, + { + "direct_url": "{\"dir_info\": {\"editable\": true}, \"url\": \"file:///vime\"}", + "metadata_sha256": "f85aa01dfdc868756a6583434bbff040f29eb511d47d5b25ada063a84353aac6", + "name": "vime", + "version": "0.3.2" + }, + { + "direct_url": null, + "metadata_sha256": "c25431aaf1950971fe96292f395a41a55b403127bfca0d0b8f7dc9cff5dab75d", + "name": "virtualenv", + "version": "21.14.1" + }, + { + "direct_url": null, + "metadata_sha256": "4e3ee0a31d85e56268640aae853bcee4794dfe8c0483c5c6370517e480c81ae0", + "name": "virtualenv", + "version": "21.14.5" + }, + { + "direct_url": null, + "metadata_sha256": "d4ed5c7551cddb8c1aeff2f9f27b3491f6ad2c9afda8e7bb9779c33fa12a536c", + "name": "vllm", + "version": "0.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "84b482e09bac949e992594757214a1920c667a5d898ee320e309250697f6d26e", + "name": "vllm-router", + "version": "0.1.15" + }, + { + "direct_url": null, + "metadata_sha256": "9b16c871eb1060a5218e9b9a9ad33288d94844cfaf43f08dbb6c32423bde8fe3", + "name": "wandb", + "version": "0.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "8e4f2be437dfe4eb3c6c959e517ac20b75d06525563f1ebcbf06f9ec648bd7c1", + "name": "watchdog", + "version": "6.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "15218afb42938907c2ca74c54e3d8e3a5406493c4761e29e38e82bfec0f84296", + "name": "watchfiles", + "version": "1.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "8863af96e88b7db9990da99aa6c46816eacc3d2f9ae1297b53381b033cd70119", + "name": "wcmatch", + "version": "11.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "f46e6bd6cfafb2b684c29587b017b7096fd9155b74eda25a22eca784b9803ab7", + "name": "websockets", + "version": "16.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "ce82db5ccfefa4bfbe4e25a36e1f91e8e7d51fcaeb31586c4d48e1c69f99168b", + "name": "websockets", + "version": "17.1" + }, + { + "direct_url": null, + "metadata_sha256": "0f142a2c09eac643c7d0bfe77f3f121184c0b17914afbd32af669ed19b2b02ef", + "name": "wheel", + "version": "0.47.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd58938e51a3c5cb363f6f22eaa2a8a7accc1ce373388de167a82f77d3e5783f", + "name": "wrapt", + "version": "2.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "b0b72c1941f04499ca7e1a3a6e479aee8df902c3d49979624b59dba8c3228d37", + "name": "xgrammar", + "version": "0.2.8" + }, + { + "direct_url": null, + "metadata_sha256": "ef8861f39e5c36255966a36032651f937d890d55f31f1c26304b488f1ba34332", + "name": "xxhash", + "version": "4.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "740c08057b6eb69c58402c87d652af0a471e46325d811f2c605632a18817152f", + "name": "yarl", + "version": "1.25.1" + }, + { + "direct_url": null, + "metadata_sha256": "7b060e4d24394b5431875e2f74fec8e6bffa79d2e6b4cb8c7e2a5187dd2d8d69", + "name": "z3-solver", + "version": "4.15.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "3d76d4fbc95f0851191147db12300938c67a6f8fb1df884886d9601272ccc4e8", + "name": "zipp", + "version": "4.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "d3de2651e4e908dbb7c9d80508e5179590217dfac4993dc8b04381c5b9718c4c", + "name": "zstandard", + "version": "0.25.0" + } + ], + "executable": "", + "installed_provider_sources": { + "vllm/compilation/__init__.py": { + "path": "/vllm/compilation/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/backends.py": { + "path": "/vllm/compilation/backends.py", + "sha256": "fa4bff8920b363efbbde9456f135fa9d2c004a5bde1898877f177418b2d8b008" + }, + "vllm/compilation/base_static_graph.py": { + "path": "/vllm/compilation/base_static_graph.py", + "sha256": "5cfe8e06db84aa42cd41cdd93ebe93af00b3a242c8011042057530e2922b523a" + }, + "vllm/compilation/breakable_cudagraph.py": { + "path": "/vllm/compilation/breakable_cudagraph.py", + "sha256": "3cc427612a08e2b9b3fee47548026400c1d0776e2d4747535e59ef5512bdf1e8" + }, + "vllm/compilation/caching.py": { + "path": "/vllm/compilation/caching.py", + "sha256": "71d212452dde742fbf28b8a01ed29d3c08a7457ff7f8da2a20ce9d17e902c2cf" + }, + "vllm/compilation/codegen.py": { + "path": "/vllm/compilation/codegen.py", + "sha256": "e04833bec88cf9d1a13aa7341e30e3233d1138bfe23424e0fd34d664b3fedb9f" + }, + "vllm/compilation/compiler_interface.py": { + "path": "/vllm/compilation/compiler_interface.py", + "sha256": "8d84e2864bf83f754bae9e9f77119e0287cca9f97f5fa5ec2535e07b5ad88944" + }, + "vllm/compilation/counter.py": { + "path": "/vllm/compilation/counter.py", + "sha256": "d8158c54dd36a357bf24f6f84dc22f572d3a27f4875f3d5779b12bc5d454ff76" + }, + "vllm/compilation/cuda_graph.py": { + "path": "/vllm/compilation/cuda_graph.py", + "sha256": "05c86392d7fae967ac73076dba7e01990a0e3ae619e4866450a0c1be56bd1192" + }, + "vllm/compilation/decorators.py": { + "path": "/vllm/compilation/decorators.py", + "sha256": "cab6962e8a1fead59c75f5ed8cb4732f9e5441ff972030c2f4b1c4ba0c58de3c" + }, + "vllm/compilation/monitor.py": { + "path": "/vllm/compilation/monitor.py", + "sha256": "43b24c5cb1bc4d32dc979f3222596905c7b3acc58415328a234402e6edc76abf" + }, + "vllm/compilation/partition_rules.py": { + "path": "/vllm/compilation/partition_rules.py", + "sha256": "857d2fb06dc871ea1d3717cd01fbd4e5205984100d98b7b72a2933d6ff1cfa4d" + }, + "vllm/compilation/passes/__init__.py": { + "path": "/vllm/compilation/passes/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/fusion/__init__.py": { + "path": "/vllm/compilation/passes/fusion/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/fusion/act_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/act_quant_fusion.py", + "sha256": "1fa9c3ca4fb424685b7053c3dda89dda16c98dc5645d85f0f28dca58429792b3" + }, + "vllm/compilation/passes/fusion/add_rms_fusion.py": { + "path": "/vllm/compilation/passes/fusion/add_rms_fusion.py", + "sha256": "e46998552628aa5cd5962fc39ea39ae824fd97e6aeba1d176e9cc7cade39837b" + }, + "vllm/compilation/passes/fusion/allreduce_rms_fusion.py": { + "path": "/vllm/compilation/passes/fusion/allreduce_rms_fusion.py", + "sha256": "0af193505880cec0f6ffa224c688bce3c9ddc318dccdf04a696b4e4b4506a963" + }, + "vllm/compilation/passes/fusion/attn_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/attn_quant_fusion.py", + "sha256": "ecc64e82be4481954c9cac6c23d7794846ab19486b570f2dda07ab5ad67c5a49" + }, + "vllm/compilation/passes/fusion/collective_fusion.py": { + "path": "/vllm/compilation/passes/fusion/collective_fusion.py", + "sha256": "1e2c8539d6960b45907fb3bf0482441ea7250e97c56ffdea1500514efa0b164d" + }, + "vllm/compilation/passes/fusion/matcher_utils.py": { + "path": "/vllm/compilation/passes/fusion/matcher_utils.py", + "sha256": "50ac5714ce1bb113520de769ea6234316acc470a8cdf2537a996ce9a9d54337d" + }, + "vllm/compilation/passes/fusion/mla_attn_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/mla_attn_quant_fusion.py", + "sha256": "a966fe7f58bf9228379f793f5fd851735a97f9639722766b2a20cb79a9e4baec" + }, + "vllm/compilation/passes/fusion/mla_rope_kvcache_cat_fusion.py": { + "path": "/vllm/compilation/passes/fusion/mla_rope_kvcache_cat_fusion.py", + "sha256": "1602cc28055ffa8d1123ddb1d256bf0bd12006fd06ea7e16a986c55746dbe0dc" + }, + "vllm/compilation/passes/fusion/qk_norm_rope_fusion.py": { + "path": "/vllm/compilation/passes/fusion/qk_norm_rope_fusion.py", + "sha256": "aebc7d1a5189b65ac665afcc169e7baebd53efe719c48e35e7c5babe85af0d39" + }, + "vllm/compilation/passes/fusion/qk_norm_rope_kvcache_fusion.py": { + "path": "/vllm/compilation/passes/fusion/qk_norm_rope_kvcache_fusion.py", + "sha256": "f0cfd0d83ec4acb09f9bf91d199b114e9d4995e3059c13eb23a6978ce7c07eb2" + }, + "vllm/compilation/passes/fusion/rms_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rms_quant_fusion.py", + "sha256": "4852aa44e0e2087043fdac271bda9b8d9bfe3201bb84ce3919b8ed454d8083c4" + }, + "vllm/compilation/passes/fusion/rocm_aiter_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rocm_aiter_fusion.py", + "sha256": "372e76c68c75209a085deec6dd22b3816be633613ca82f6f2925c1b3773d61a0" + }, + "vllm/compilation/passes/fusion/rope_kvcache_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rope_kvcache_fusion.py", + "sha256": "3a756e9049593537143b5a56ab9185a6bc83f57ed81d84226d7791a46a984b53" + }, + "vllm/compilation/passes/fusion/sequence_parallelism.py": { + "path": "/vllm/compilation/passes/fusion/sequence_parallelism.py", + "sha256": "3af7e420dcb35fff0bae0f8f599d0f1bda34445ebe194059892a434b2976d654" + }, + "vllm/compilation/passes/fx_utils.py": { + "path": "/vllm/compilation/passes/fx_utils.py", + "sha256": "730708213acf9d1b5f3176b433dfc197a5f3c81b5ce443f0923c526924833003" + }, + "vllm/compilation/passes/inductor_pass.py": { + "path": "/vllm/compilation/passes/inductor_pass.py", + "sha256": "1f380aacf7adabb8bf8b7d41c0a93473947f0716f7445bd910fd448f6c08e672" + }, + "vllm/compilation/passes/ir/__init__.py": { + "path": "/vllm/compilation/passes/ir/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/ir/clone_elimination.py": { + "path": "/vllm/compilation/passes/ir/clone_elimination.py", + "sha256": "5297078f5cddce081faba5215814275381d2083b32318fcfeb2bf9d69fedb7c7" + }, + "vllm/compilation/passes/ir/inplace_functionalization.py": { + "path": "/vllm/compilation/passes/ir/inplace_functionalization.py", + "sha256": "2dc4f22c6f05224828c2941479185b1452d4490f488b7f0bfd124334e7809fed" + }, + "vllm/compilation/passes/ir/lowering_pass.py": { + "path": "/vllm/compilation/passes/ir/lowering_pass.py", + "sha256": "d9c3d90f63138420f0e5489447b5996573fcfbbab939da2efccd00848492b172" + }, + "vllm/compilation/passes/ir/utils.py": { + "path": "/vllm/compilation/passes/ir/utils.py", + "sha256": "f59d33a6c7d0616cbeec1e9fb1d6c948881bf81fe124caeb906eac2e2197ea21" + }, + "vllm/compilation/passes/pass_manager.py": { + "path": "/vllm/compilation/passes/pass_manager.py", + "sha256": "486979a058aa2e20ebedcbb6e039f7a59f38d2efd2cda11219fae4067be0968d" + }, + "vllm/compilation/passes/utility/__init__.py": { + "path": "/vllm/compilation/passes/utility/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/utility/fix_functionalization.py": { + "path": "/vllm/compilation/passes/utility/fix_functionalization.py", + "sha256": "ad5b504a05ccee023869b0c8df70ec2fff9a4a80d25fd903e2b532f470e7203f" + }, + "vllm/compilation/passes/utility/noop_elimination.py": { + "path": "/vllm/compilation/passes/utility/noop_elimination.py", + "sha256": "8abf85d28c13f95059f2acbc0275b9b9ed2ad4990f7c5763bbe3067a4aa629ce" + }, + "vllm/compilation/passes/utility/post_cleanup.py": { + "path": "/vllm/compilation/passes/utility/post_cleanup.py", + "sha256": "1c38b14fc209165cbcf8ca763a17ac4e528b97f59b573e5d52df2cce7d758de3" + }, + "vllm/compilation/passes/utility/scatter_split_replace.py": { + "path": "/vllm/compilation/passes/utility/scatter_split_replace.py", + "sha256": "138402cc3097768a32e9e5b8d1a054b6176e494bddc8684e23ca2dc5fdc3fdda" + }, + "vllm/compilation/passes/utility/split_coalescing.py": { + "path": "/vllm/compilation/passes/utility/split_coalescing.py", + "sha256": "0b02acd9e1ad43d7b3e128b914e969b9580773f2818078846dfbf163a8bd0871" + }, + "vllm/compilation/passes/vllm_inductor_pass.py": { + "path": "/vllm/compilation/passes/vllm_inductor_pass.py", + "sha256": "4f83ffb67f834a214221d810c7843a8e41eb4e5930eb40adbd8cf054ff6fb9c6" + }, + "vllm/compilation/piecewise_backend.py": { + "path": "/vllm/compilation/piecewise_backend.py", + "sha256": "6525318ff3ca2e4978e24dd9232a7ae0a02e920e19604b83db6f6043d1f8a54d" + }, + "vllm/compilation/wrapper.py": { + "path": "/vllm/compilation/wrapper.py", + "sha256": "c1b1fca679ea16aa07a696831a810c0d531da2bb0ea32dd6f1a95cdaef36de07" + }, + "vllm/config/__init__.py": { + "path": "/vllm/config/__init__.py", + "sha256": "56fb0cb1598d297e4f95a97e5d86dc624145d1532f5faa432b7d2834d7155bd5" + }, + "vllm/config/attention.py": { + "path": "/vllm/config/attention.py", + "sha256": "c41f345b512d9b7df882328257eb3a6381f41088c11ae83b5ecd8a9e8265d1bc" + }, + "vllm/config/cache.py": { + "path": "/vllm/config/cache.py", + "sha256": "f1c226ba679c884930dbfcaf41a57248b137a9a20d3ed8e3d3b31752bb484c07" + }, + "vllm/config/compilation.py": { + "path": "/vllm/config/compilation.py", + "sha256": "c9cec5c7200e8e559810ec8c30113ad61dab6780f9f7fb3c116bd0d9b5a43065" + }, + "vllm/config/device.py": { + "path": "/vllm/config/device.py", + "sha256": "7b82eee02ceb5842337451a27a3d5729920c47e25e8f6bf3997f5146f9330a9c" + }, + "vllm/config/diffusion.py": { + "path": "/vllm/config/diffusion.py", + "sha256": "1fa9fd2478a866098a28a3586b55af2f9738656b7813a55d76539c10dd99fe8d" + }, + "vllm/config/ec_manager_config.py": { + "path": "/vllm/config/ec_manager_config.py", + "sha256": "418b387dbe7bdf67deddce331c205768a2d42aea37141f59fb02a8a1528e3552" + }, + "vllm/config/ec_transfer.py": { + "path": "/vllm/config/ec_transfer.py", + "sha256": "0eabb2c25194676d23c6acf59562672a1dd24415043ac5737d621ce0d681ec70" + }, + "vllm/config/engram.py": { + "path": "/vllm/config/engram.py", + "sha256": "34043a22385a041d4e9be8857f64174c990c2ca8308b97b6a952b5ab96c20ee5" + }, + "vllm/config/fault_tolerance.py": { + "path": "/vllm/config/fault_tolerance.py", + "sha256": "b166b24373d599fb15ddc575e3061cf0dcb42174d0369d8468008e7ffbb2a4e2" + }, + "vllm/config/kernel.py": { + "path": "/vllm/config/kernel.py", + "sha256": "27e23c584cf862f4091858db6dc85bbc2a01f4baf9dca3f232ae6f3bac02390e" + }, + "vllm/config/kv_events.py": { + "path": "/vllm/config/kv_events.py", + "sha256": "b1dbaee3e6830e381e9157fe3bab0d65c357da88ff7cdf8b1e4b3a4e75c82a87" + }, + "vllm/config/kv_transfer.py": { + "path": "/vllm/config/kv_transfer.py", + "sha256": "506fae7a9d7f32cb3646156cf9249a856f6317dff6c4c85db70efd34418c429b" + }, + "vllm/config/load.py": { + "path": "/vllm/config/load.py", + "sha256": "bd6431c22e078362d749a56a2c84145432ebf2605d8bcfa2ac679182d18ed630" + }, + "vllm/config/lora.py": { + "path": "/vllm/config/lora.py", + "sha256": "ed6cf6575f5950f079a62f904caeae93d1a4745dd8c21788b74367883bcd4b08" + }, + "vllm/config/mamba.py": { + "path": "/vllm/config/mamba.py", + "sha256": "2090f791201ca45dd4f1d72b8651268890eb07574b6084721194eb8fdf612c48" + }, + "vllm/config/model.py": { + "path": "/vllm/config/model.py", + "sha256": "f4168b67cc93ce72ff2a6d4c66974223e32fd0f1fab4c05e44bd68a275e18d69" + }, + "vllm/config/model_arch.py": { + "path": "/vllm/config/model_arch.py", + "sha256": "2babe28329d7b60b4e205f6d72c687f0f66e6535aa2f20411469e5ec362f6b5f" + }, + "vllm/config/multimodal.py": { + "path": "/vllm/config/multimodal.py", + "sha256": "271911aee151f17f092228cecee82af0713e9a47340ffdf66834ca7638a50d22" + }, + "vllm/config/observability.py": { + "path": "/vllm/config/observability.py", + "sha256": "d57c59ec776477ab0a20e9f2b945bc954d8ea3737c869259480e9aa10dfb9f6d" + }, + "vllm/config/offload.py": { + "path": "/vllm/config/offload.py", + "sha256": "6f2db3d9a2730588473d5155811690c6241b167a21dcb62fbbd9ebb6386de42c" + }, + "vllm/config/parallel.py": { + "path": "/vllm/config/parallel.py", + "sha256": "f012ace89e3fb730a467f729f602679bc145c49f0d10721811c9d818570e7b2b" + }, + "vllm/config/pooler.py": { + "path": "/vllm/config/pooler.py", + "sha256": "9f01913dcb7bccbf9b672b16643f18471ae202455992e8afaf0725a17f2b3d08" + }, + "vllm/config/profiler.py": { + "path": "/vllm/config/profiler.py", + "sha256": "04d24fa1dc7cfedca6b5c7d9115f7f7021722fc46a5b15234a1e3b3a506c93e5" + }, + "vllm/config/quantization.py": { + "path": "/vllm/config/quantization.py", + "sha256": "acffc52f525b39a88efd656f1ed705ce3a1b758298bb0684fac7694776bc10b4" + }, + "vllm/config/reasoning.py": { + "path": "/vllm/config/reasoning.py", + "sha256": "2c4f7bdee48a9fb3d93787c4c32361c2411417cce452cfde86808d8759977861" + }, + "vllm/config/scheduler.py": { + "path": "/vllm/config/scheduler.py", + "sha256": "822179da62be4bca0619c8590082ae09123f5c4415f9cc2037be673748239edb" + }, + "vllm/config/speculative.py": { + "path": "/vllm/config/speculative.py", + "sha256": "9c642a87264339c0dbc1d0b57330572149df0f9d5e16c6893b9895e50a619e19" + }, + "vllm/config/speech_to_text.py": { + "path": "/vllm/config/speech_to_text.py", + "sha256": "bf4a566fbde6a1cec1e209070b739650c3302c12696739c88049cb8f723a4c3f" + }, + "vllm/config/structured_outputs.py": { + "path": "/vllm/config/structured_outputs.py", + "sha256": "55649776594349b8b4aa3e08fc4c88068366732a486d6fb235079188044aa829" + }, + "vllm/config/utils.py": { + "path": "/vllm/config/utils.py", + "sha256": "d035e9e488ba92b6c47a96cf05d9b2a850d53eda8a05115b22ff9af8dbc2fc64" + }, + "vllm/config/vllm.py": { + "path": "/vllm/config/vllm.py", + "sha256": "956b812e5a719bcbfa3a3958801361b38b9c928c96b8c073311bbb96376dfb7a" + }, + "vllm/config/watermarking.py": { + "path": "/vllm/config/watermarking.py", + "sha256": "30e6620a3cd7529f0736ad55e38bc326a6a78dee4552f0722208400041c94a1f" + }, + "vllm/config/weight_transfer.py": { + "path": "/vllm/config/weight_transfer.py", + "sha256": "92edd9e5ea90c97a8f3c5f20abf1734a105ee1f3f89e306e7ba87e758f1f767e" + }, + "vllm/distributed/__init__.py": { + "path": "/vllm/distributed/__init__.py", + "sha256": "97f28c30b32662af8cab163939e4ee423037f11630752e13b55cbc25a7d0ab71" + }, + "vllm/distributed/communication_op.py": { + "path": "/vllm/distributed/communication_op.py", + "sha256": "3c3f8ac60db38ece891d39dc1e2f6f1947ad438685893d2e5777d072320bd1b8" + }, + "vllm/distributed/device_communicators/__init__.py": { + "path": "/vllm/distributed/device_communicators/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/device_communicators/aiter_custom_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/aiter_custom_all_reduce.py", + "sha256": "f8eb027ce7a85d94af6260960ceb7f36fc6f1406c9af9c9b6285fddb3f178009" + }, + "vllm/distributed/device_communicators/all2all.py": { + "path": "/vllm/distributed/device_communicators/all2all.py", + "sha256": "1f1b69236acd3cd7bd94520fd6d591bfd31b57c4bc7c9f9f4161ea8bbd0c5f26" + }, + "vllm/distributed/device_communicators/all_reduce_utils.py": { + "path": "/vllm/distributed/device_communicators/all_reduce_utils.py", + "sha256": "ed0ab4dd05b2519a6313892e68824c97b540034664d7f8c3d031b322e33e1bfc" + }, + "vllm/distributed/device_communicators/base_device_communicator.py": { + "path": "/vllm/distributed/device_communicators/base_device_communicator.py", + "sha256": "4a7670f12ed7c7621b25d476e2687c24ca01f3be183fff4a6a25337596fe506b" + }, + "vllm/distributed/device_communicators/cpu_communicator.py": { + "path": "/vllm/distributed/device_communicators/cpu_communicator.py", + "sha256": "e1856c8e91cfbbb4d9ce990c1236e258ba4021e226afcbab645653380b38d64b" + }, + "vllm/distributed/device_communicators/cuda_communicator.py": { + "path": "/vllm/distributed/device_communicators/cuda_communicator.py", + "sha256": "102d95c67ec798cf352b817ba92e8abc9da37f30d1bbdf3aab45d3927b627b93" + }, + "vllm/distributed/device_communicators/cuda_wrapper.py": { + "path": "/vllm/distributed/device_communicators/cuda_wrapper.py", + "sha256": "333b6d9ed173e7a18c7f2b6627a3c9c9ed88892ce52015f05e29d6d245e48ee3" + }, + "vllm/distributed/device_communicators/custom_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/custom_all_reduce.py", + "sha256": "a048c1327c23580805600c0c951831bec333b1ffc4eb26a0e3d34119c4f0c445" + }, + "vllm/distributed/device_communicators/flashinfer_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/flashinfer_all_reduce.py", + "sha256": "b4359760e9b55963676109a5c3a015fb82e190d4df1d021de9ee01e7814cbdda" + }, + "vllm/distributed/device_communicators/flashinfer_pcie_ipc_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/flashinfer_pcie_ipc_all_reduce.py", + "sha256": "8b67b0fc356a565095f56b475cc89c513e3a5eff051ab1c52e5beb0c1a79e9f2" + }, + "vllm/distributed/device_communicators/mnnvl_compat.py": { + "path": "/vllm/distributed/device_communicators/mnnvl_compat.py", + "sha256": "72ee1e6f9571b4c8ecbd9f60cd469d1b565cb79cab519a688a93f290906a2615" + }, + "vllm/distributed/device_communicators/pynccl.py": { + "path": "/vllm/distributed/device_communicators/pynccl.py", + "sha256": "882fb83c5a3c565a3f8fd664b79f5ceae566dca180019ecafd74bc8c11d9f8cf" + }, + "vllm/distributed/device_communicators/pynccl_allocator.py": { + "path": "/vllm/distributed/device_communicators/pynccl_allocator.py", + "sha256": "390e2576cbf4ae06341ca4dab24fc7e4d4f7c24dd444329ed05d828a9ce91460" + }, + "vllm/distributed/device_communicators/pynccl_wrapper.py": { + "path": "/vllm/distributed/device_communicators/pynccl_wrapper.py", + "sha256": "ce63c8da57bb88d4cf89956bd70bb63f0f44bfad468ddb37b765611551f6d99f" + }, + "vllm/distributed/device_communicators/quick_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/quick_all_reduce.py", + "sha256": "8aacb23e7c297b0ae2f80d99c5affd2e7517115d7874be51069d14a44db7b5f2" + }, + "vllm/distributed/device_communicators/ray_communicator.py": { + "path": "/vllm/distributed/device_communicators/ray_communicator.py", + "sha256": "332c37f65495b60564d61db59bc2d30ca0236adc33442d01464790bde9aec897" + }, + "vllm/distributed/device_communicators/shm_broadcast.py": { + "path": "/vllm/distributed/device_communicators/shm_broadcast.py", + "sha256": "f3e7a3f3ff713fccbd535e0d41650ee05bdf8677e83d4b90519910645022c30b" + }, + "vllm/distributed/device_communicators/shm_object_storage.py": { + "path": "/vllm/distributed/device_communicators/shm_object_storage.py", + "sha256": "e097bf7ac0141fe8db4131e8fd553ca2ad5b0600b22a56f3924af6b795e7207c" + }, + "vllm/distributed/device_communicators/symm_mem.py": { + "path": "/vllm/distributed/device_communicators/symm_mem.py", + "sha256": "b06e3ddb9ae880a30ec4a103ce32eb9794223bb0293832e89572af28adaaa544" + }, + "vllm/distributed/device_communicators/xpu_communicator.py": { + "path": "/vllm/distributed/device_communicators/xpu_communicator.py", + "sha256": "527cbfb250760abc62096ee7cd612307b821f21b72dee1687ad866620ec89b6d" + }, + "vllm/distributed/ec_transfer/__init__.py": { + "path": "/vllm/distributed/ec_transfer/__init__.py", + "sha256": "061405bb51df7409c9938b62e25caa8bd6ebf85da6d1700dbd4affe2a0825135" + }, + "vllm/distributed/ec_transfer/ec_connector/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/base.py", + "sha256": "22d4913375bb622473fbe1a77f9376b804949cd8a7e31e9518208f9561d161e2" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/common.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/common.py", + "sha256": "e2267abd8d00a6d2605e1a82ea5c73396a71b427452eab469fcca0134c334e7c" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/connector.py", + "sha256": "72cd35d9fd754a2992dd090a8af13c91e0789b4038ac29276750d823120235db" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/base.py", + "sha256": "19e8df88b0fa831997896355ecdd49e0d86cb074cd7ae28aed0b328b0bb3ab2e" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/zmq.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/zmq.py", + "sha256": "435641c0e37551ab4937855abd067be26905b91215e759cbd9d28a419a34ff9a" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/base.py", + "sha256": "3be698aeb67d32ee3741e76b2fb71806941c587578583acf8fbc42fbf22b46a5" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/nixl.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/nixl.py", + "sha256": "03af8f6549a6027b7262a482907af591e45f28b9b1c5a3408bbc6600e38797e5" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/ec_shared_region.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/ec_shared_region.py", + "sha256": "e40607952c9920024455eca2f419e8c3ef1de9a4d8b27c147a33bb941b8c08b1" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/protocol.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/protocol.py", + "sha256": "05878336884396bfbef77b96b0fa6359f6fa0aba912961f14a84f5a436f27038" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/__init__.py", + "sha256": "01c42385bf3a55cff09cc05ba956f6dd4b8b6b986bf4d6eca4e566cb045b48e0" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/embedding_cache.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/embedding_cache.py", + "sha256": "7359fb980af1fc30b3253681310ef636e2b4a19134e04a93270c9c45de2572d8" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/session.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/session.py", + "sha256": "5973548a919e13c866222b91d502686a6757a31e5a5664b879bf2887ed9fb212" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/utils.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/utils.py", + "sha256": "160ac665f20f2c75b343c1e784084f2b0b4d1cf8fdb28ee15deee4dc8ed0ce45" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/worker/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/worker/__init__.py", + "sha256": "f08d296d3560c42173ae8af961af4a768033ccf1e36e9c17c0cdd53013d0c52e" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/worker/descriptor_buffers.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/worker/descriptor_buffers.py", + "sha256": "be7c81be214e995da8499105ba485854d9c19d6f8e905f8f1b87b83694ca0864" + }, + "vllm/distributed/ec_transfer/ec_connector/example_connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/example_connector.py", + "sha256": "09022ce07a89114bb65d9befd2e60873453aed11bbac8c0a75c1e6084e785a5f" + }, + "vllm/distributed/ec_transfer/ec_connector/factory.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/factory.py", + "sha256": "d6cedca0a99c3dd2b03cd1c15d17472b983e3f7d8f5baf4a12eecaf6abedb817" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/__init__.py", + "sha256": "1cbfc2f95f8f4d48a9253056eb1fd4b562062884e3fd5cb6571583c352fc16f3" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/config.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/config.py", + "sha256": "98c60696f79d1de67d2364cd9e8a42a393b5c8e17ed9af2f971368e47891d7b3" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/control.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/control.py", + "sha256": "58e0d1a423fbe958bfa586ac26a17107e08d0b31d044b4c74ab4dde880e7ca9b" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/memory.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/memory.py", + "sha256": "d5e90b1348de670a70f110d58eedcbdbd053db72c21dd007c3f5275c53951149" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/metadata.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/metadata.py", + "sha256": "497a7e6dfffb7fce80a41d5989f96119b970c143df77bb9d0f9c91d7a46e8c42" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/producer.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/producer.py", + "sha256": "97fa4d0b19475574778eab02f55fad73db9642beb9156da890314fd53fa1a7ab" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/reservation.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/reservation.py", + "sha256": "4790bc65cde4db5f17733ca2c2910980ba594a8a9b79ee27c5b957dffd4c1113" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/scheduler.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/scheduler.py", + "sha256": "53004b62529a31fdd80dfb2e6026610b95041a77e91f731ae526fefd84e7968d" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/state.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/state.py", + "sha256": "92f375d6c5cc9c83dbe95a7977ad8eb0f1b5629ccee92968bcacdc94eee15d65" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/transfer.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/transfer.py", + "sha256": "ada2113a5402054f1149d3edc2537f4e5e1bd696c9b17291c9f2b4cbf6b59753" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/worker.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/worker.py", + "sha256": "89eb91bb64845b3b121d502972a6b04d448714253becd2ea662e5691cd5acdd7" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake_ec_connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake_ec_connector.py", + "sha256": "aaebab4711bc00dd0c622dfbfd8639fc41e7ed5d1658d7d68fe33e4d5fbef3ba" + }, + "vllm/distributed/ec_transfer/ec_connector/utils.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/utils.py", + "sha256": "11b9014b9c0697f8846deff1a55a22fa86a15dc2ac3e139442fb6d513ac03059" + }, + "vllm/distributed/ec_transfer/ec_transfer_state.py": { + "path": "/vllm/distributed/ec_transfer/ec_transfer_state.py", + "sha256": "9487a41f23fa1a4fa6dfca8b42b8e97a0ee19d8406ffd1dcf4bef66315180827" + }, + "vllm/distributed/elastic_ep/__init__.py": { + "path": "/vllm/distributed/elastic_ep/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/elastic_ep/elastic_execute.py": { + "path": "/vllm/distributed/elastic_ep/elastic_execute.py", + "sha256": "b8f60a4183c79ff6051095b5f95bb385bc7fea0cffe8cd9ebc9087ab0e9f01b5" + }, + "vllm/distributed/elastic_ep/elastic_state.py": { + "path": "/vllm/distributed/elastic_ep/elastic_state.py", + "sha256": "fbf049199841a086fdf2fc1ab8498ef017ad3bf319db65c3ae61acbb536d2e10" + }, + "vllm/distributed/elastic_ep/standby_state.py": { + "path": "/vllm/distributed/elastic_ep/standby_state.py", + "sha256": "15282597550ebd0e07b8492ff192aea1ec0dcec8f0ad34009123e1002cc140c1" + }, + "vllm/distributed/eplb/__init__.py": { + "path": "/vllm/distributed/eplb/__init__.py", + "sha256": "1b9c2ee22abb5888c354c5aa01f0944f253e5e24e135d019778398bbe495a628" + }, + "vllm/distributed/eplb/async_worker.py": { + "path": "/vllm/distributed/eplb/async_worker.py", + "sha256": "424328600ad1003286fc5dfffa1f9482007314c060947818b2f94a8b97811f5e" + }, + "vllm/distributed/eplb/eplb_communicator.py": { + "path": "/vllm/distributed/eplb/eplb_communicator.py", + "sha256": "ba30d9d40e7b81d3f42aa9041d2f328edca4073cfe2de920285eb68375501ed8" + }, + "vllm/distributed/eplb/eplb_state.py": { + "path": "/vllm/distributed/eplb/eplb_state.py", + "sha256": "2f06bc8c63f3fdf55edb5032ae55c0ffcac3e67720ce74ea312e3d141b12acf4" + }, + "vllm/distributed/eplb/eplb_utils.py": { + "path": "/vllm/distributed/eplb/eplb_utils.py", + "sha256": "058af6104faa6d4085c1dca80bbe60d92bf0a7ec9cd92c775a180546c9d8c9c3" + }, + "vllm/distributed/eplb/policy/__init__.py": { + "path": "/vllm/distributed/eplb/policy/__init__.py", + "sha256": "daeb266c88442832b1ab8c8c4cc064891b38b9e9ba00aea324f926c87dc6d37e" + }, + "vllm/distributed/eplb/policy/abstract.py": { + "path": "/vllm/distributed/eplb/policy/abstract.py", + "sha256": "b9fd34c28bbfdded03360d7f3f6f8fb978e82689190d7ae4501dfe520e958c62" + }, + "vllm/distributed/eplb/policy/default.py": { + "path": "/vllm/distributed/eplb/policy/default.py", + "sha256": "3b54229e6240d050480390f6b29d4744fd38437d23719f78a6decf7002296a29" + }, + "vllm/distributed/eplb/rebalance_execute.py": { + "path": "/vllm/distributed/eplb/rebalance_execute.py", + "sha256": "b387e228791149018536eee96cf955b33ba79d801cdc36849d1b47a580ec2597" + }, + "vllm/distributed/kv_events.py": { + "path": "/vllm/distributed/kv_events.py", + "sha256": "de08f01e8736881560256c350a3b6418999dd4aa30f9c6ec9159527f7ed6899a" + }, + "vllm/distributed/kv_transfer/__init__.py": { + "path": "/vllm/distributed/kv_transfer/__init__.py", + "sha256": "c1be4e58ec6923bae607a355ad22891c740f056a69ff7358b1e10ea3fd2680ea" + }, + "vllm/distributed/kv_transfer/kv_connector/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/base.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/base.py", + "sha256": "2ae2a2c48f5731f3533166a75440fe91e764332305b5d713df840edba970789d" + }, + "vllm/distributed/kv_transfer/kv_connector/factory.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/factory.py", + "sha256": "add99c93c587b0098b90b1f8fd6940bdd1f15c236c5c6f1a258411863cb902d3" + }, + "vllm/distributed/kv_transfer/kv_connector/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/utils.py", + "sha256": "317ed40dc837671ca6e666165222e641a0f9b3992aea63bbf54de7e13d40b3a4" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/__init__.py", + "sha256": "5beb6ccad12fdcfe1581982da6f18321caca50e73a6b3259ebf3c8dc8b3ffcca" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/base.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/base.py", + "sha256": "97af64220475c6c9e8273438d7b5138b105ebe6944beb783facb36a3bb76f31b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/decode_bench_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/decode_bench_connector.py", + "sha256": "b4151c88cdec28f1ff9259047abc17baf23b892f4b68769a93bf26e0442b9017" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/example_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/example_connector.py", + "sha256": "6226876ef52d10d0d284d29c337ab44698e8bac6abdb2e0ece53b5756c55d068" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/example_hidden_states_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/example_hidden_states_connector.py", + "sha256": "58c22534dcad0fb73599a2d70a2fb104d5b612a4723be5e777f56a56fe07892c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/flexkv_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/flexkv_connector.py", + "sha256": "de4f68c3bd565ed898e47e0b2980049b966ff31888f1957050d30995d4953762" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_client.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_client.py", + "sha256": "bea6ecff2be281c7e96c1551c7bf463cbb01f2964696067c0ebdb683844f9aab" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_connector.py", + "sha256": "e67ed58015090e5eea9d499883f2a9422673d07f8bdbe0ccff7db15d2460de13" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_metadata_server.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_metadata_server.py", + "sha256": "6800e5cf37809f8a8e28c469c14a434db288bc3bf83a8b62ee06910a20c2da19" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/common.py", + "sha256": "8f2c02c08227a9093e6aeb183961aba36b7812cfc29b8c047a2b2c9d82f79c15" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/gather_scatter_helper.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/gather_scatter_helper.py", + "sha256": "08c1b43de34fbeca77357d7576ac1d17cba974b59d695562f68bb713061e7b54" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/hf3fs_mock_client.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/hf3fs_mock_client.py", + "sha256": "bec61a9b0c4b9124b2292d7646d76411da44396389349b53cdcbc46353c8780e" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/connector.py", + "sha256": "8c61094ce0a3a702908f9576f69482e6bf314738a2cbe33a7d3b47258fa0ab43" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/stats.py", + "sha256": "d9383a6ad6ab6b8f812d29d90495407b770eeddb79b86e9d0e3216c0bd16e0ed" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/worker.py", + "sha256": "251c0d8e57e4739c03ce3e1c899a95ff5b1752eb27676c28ab88c4ebd62c4776" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_connector.py", + "sha256": "5991f9ff8832df32bd421eb67e48237270ea0a408180e523810bb43606acf8f3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/__init__.py", + "sha256": "c53be9796e76cde637514bfc40a525d8c09bb2784b406cb516790d8285dfe433" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/multi_process_adapter.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/multi_process_adapter.py", + "sha256": "6480d67b31ed603027a83edf327880a38aee45eaeee2da9a4efa93e95527c166" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/utils.py", + "sha256": "e204fa6a853ac9c122d7a4e9d146902230f81c48d4321ed5edfdbf979dd49ba2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/vllm_v1_adapter.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/vllm_v1_adapter.py", + "sha256": "e6fe55049c6b007248516d69640e2f3a4809f9d286091a1014ae0949987fa8f1" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py", + "sha256": "c712c386a7c57bf0355a1441ba574232c3aa5498fcb70713a2b3f5d18b64f9c1" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/metrics.py", + "sha256": "de1b1797d0448f74370919dbb0278767f390e8f59e00a0c0528abefb302babc2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_connector.py", + "sha256": "516be01320e64b0110e102eeb69a6ba766dd5ac8cb3036db6b97b7d54413323d" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_utils.py", + "sha256": "26877610463fa8e9d6b092772f2551bcc0c3ac794cbe63996df0414666a8ebba" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/rdma_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/rdma_utils.py", + "sha256": "716e5042edecaba36c7ca763474988f32fa09c2668b8260260149df610af8f83" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/stats.py", + "sha256": "f39b2f0b1db2e4f922e27e684a3f7bbf5bb279b82a0a8c3bb0c7ae69b6d14d24" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/connector.py", + "sha256": "17a350bdb89e17e415d6c52a48684dc15c35a804378daf03e1f3bee1b1b123a3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/coordinator.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/coordinator.py", + "sha256": "a8eb6c2157a96e8d25233b82347ac8409a41d6390b4f2c64242119c05911010c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/data.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/data.py", + "sha256": "d3cfefdb4165a24995749cba452641b318065baa95bb1bae62f922a2f8886e7b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/metrics.py", + "sha256": "f2b9ef8927632d142aad11a374d0725c6e619ea0bb7fea9eda3f3895eb7d277a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/protocol.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/protocol.py", + "sha256": "ccb1cf6a84a932a375215627d2aaac482c351a05df015d636d05373a6845b7c8" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/scheduler.py", + "sha256": "283849ff581ec206444cdf5621622377f1c925e8d7e05cb9294af2f3a5094e79" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/worker.py", + "sha256": "55f1682dfd1ed7af689166421337126a0e1d08afa4774a242e098d79e0c1e95b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_common.py", + "sha256": "549bb4fe22dca5095515b9c0712c31cc81a9d4923881e9f112317640fd8c04ab" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_connector.py", + "sha256": "c0f474bc34b579d889fae92eaf43eaca241be51a4697a187a942f0df4e6b6a98" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_engine.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_engine.py", + "sha256": "d842f3772fc6588d5a329a67572324cb74709aa3df4033e64c791a1e706c8e88" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_layout.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_layout.py", + "sha256": "2b4ec046a78897236b0626939bb828b6ec095355097d10bca39e5f3e1c992553" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/multi_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/multi_connector.py", + "sha256": "12d8387239f3194f2cb63ccbd64824648047210323572d66671e6a1eed349fc3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/__init__.py", + "sha256": "cc3145fe3b6d219a267bf40a0f7c0cc9430e4289f94acab2df761b99b671e7ba" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py", + "sha256": "7a1db8c54e4cd846bdac747344f2aea2c2fcf507817928796063225223b7e169" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_worker.py", + "sha256": "49a2e4faf99bef146b5a1d4d18d48f240b1e561c438252274494b359db96ef52" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/connector.py", + "sha256": "b6a0dc916d052f344be72ecfcb111509c13580102c11a860fa726cf0888949a9" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/metadata.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/metadata.py", + "sha256": "2b23a07c1ec5ac5490c3b818737c7192e344ea9f52cd5623f75939f741ab4e21" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_scheduler.py", + "sha256": "ac3daf8e2246581fec84ab28f2133569421b62c32a120be4923e2f4d0f2f9de9" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_worker.py", + "sha256": "e5060c9b6cf022de35ca3d1da7a369cd6a6a2dea26219af9f7633aaf78af8a76" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_scheduler.py", + "sha256": "2d9008e33937a4d6c5cf9cc2f96160f2bdbc8e987fe37f0798a7fd7eb84c9572" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_worker.py", + "sha256": "87de3ea383dd3aa95fb2c287ea26ded8a330859cc1295f9faa69047e80865c2c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/scheduler.py", + "sha256": "09f1bfe7075b926b26a94529480e33b62c3ac273ff826f6c502084f08b1b2a08" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/stats.py", + "sha256": "3e710654e0b68d1a8592f0c4735c81b22f4bf698fb1a2dfea126d35bf2dd1ef2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/tp_mapping.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/tp_mapping.py", + "sha256": "2d43607f98701b2fad6cc0ac2767619a80b7fc2b3a3c2eb6ed0da4fb05dcd8f6" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/utils.py", + "sha256": "93de863fc8307a61d40b62f1b176b57ae93c363d34b9e9ddc8e666265b6d45dc" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/worker.py", + "sha256": "5134a36ac100ce7a64f5311029a37ac12c38d91093f63100f51f7fe53ea7c3ee" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/canonical_mapping.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/canonical_mapping.py", + "sha256": "e0b3c6f9806a650e0370c43c5068fc31c0fec94615089e15fdf270d7d96f2b64" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/common.py", + "sha256": "9b3f042c6fa1581d10e8f688d2d9bc927bb41b780a9ea01f514d57228e20c978" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/config.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/config.py", + "sha256": "aea82e60889e78dcad8564ec8285b65a6a372824a1545a98ea8e78b6f4fd418a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/events.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/events.py", + "sha256": "d7039b67be95fd444966628184040a94880873c0611c0e6e7525a22650ffdefb" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/metrics.py", + "sha256": "13d76df014e86691f58dc89a879f9808b124690c9267dd5fa3b2d4004d4c5fdf" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py", + "sha256": "2c5282f4a3165cd787fb355e215e3869f1bdd3f2c795b2155fc537c9d135191a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/worker.py", + "sha256": "acc2df53262441dfc6421a3af7f0cbd68cbfaedbd42bbc384d8e1da2d965d194" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading_connector.py", + "sha256": "cdc16ca7339a10e1993bd6220e6273f86a4e99779f58f25098a24ad31bb0dbd8" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/simple_cpu_offload_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/simple_cpu_offload_connector.py", + "sha256": "96238ca82ccf07a1eeb59b8f66de17b09034e3eb993ad9a0a836511d3f69706b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/ssm_conv_transfer_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/ssm_conv_transfer_utils.py", + "sha256": "59a949709482e65a007fbe5352fe9b4bb54c2dcc10ad2c1c41f754b6e13299f4" + }, + "vllm/distributed/kv_transfer/kv_transfer_state.py": { + "path": "/vllm/distributed/kv_transfer/kv_transfer_state.py", + "sha256": "2e5fe09438d6e2ee642f8a26cf7dcf632e870d955d30baf002b76a8bfe836d05" + }, + "vllm/distributed/nixl_utils.py": { + "path": "/vllm/distributed/nixl_utils.py", + "sha256": "0bffa3c052c9f67472b1c0bc3816114891b010c968bf4b8a292e7da4d687db53" + }, + "vllm/distributed/parallel_state.py": { + "path": "/vllm/distributed/parallel_state.py", + "sha256": "d9b10ad56833ebc08a753e1a050ef0989c30d4134021b7b7b00150b7bd01adc6" + }, + "vllm/distributed/stateless_coordinator.py": { + "path": "/vllm/distributed/stateless_coordinator.py", + "sha256": "f52848fbe985ed47b1f3e3ca555314736ca06436e8d738ab4390101f0672dcb0" + }, + "vllm/distributed/utils.py": { + "path": "/vllm/distributed/utils.py", + "sha256": "792146b357139e705064a68d3b66858de8a0baaca4dc7db1232fa217d45db231" + }, + "vllm/distributed/weight_transfer/__init__.py": { + "path": "/vllm/distributed/weight_transfer/__init__.py", + "sha256": "3fb9d4712b7c131d522f5e76e73cd8c333f3cc7af86e2d5ecf9b61b57b3b7f5a" + }, + "vllm/distributed/weight_transfer/base.py": { + "path": "/vllm/distributed/weight_transfer/base.py", + "sha256": "8ab06feb04f1379d0558fbdb77fde46bc84f179e0a26742cabab937e88caa38d" + }, + "vllm/distributed/weight_transfer/clients.py": { + "path": "/vllm/distributed/weight_transfer/clients.py", + "sha256": "ff85c79c350241e6d2749ca23c9d295a3289b4b62bfdf0257d32eb94a0151d36" + }, + "vllm/distributed/weight_transfer/factory.py": { + "path": "/vllm/distributed/weight_transfer/factory.py", + "sha256": "4e979eeac8c5bcdbffb10eb4765cfb30120fa7595c6c2561d3fa1a966ced61c8" + }, + "vllm/distributed/weight_transfer/ipc_engine.py": { + "path": "/vllm/distributed/weight_transfer/ipc_engine.py", + "sha256": "1af578293f387a19073c322b24143c3ae4716ce0c5d2bac2a4ef26fe20119330" + }, + "vllm/distributed/weight_transfer/nccl_common.py": { + "path": "/vllm/distributed/weight_transfer/nccl_common.py", + "sha256": "7b2ef7dc7481c3f478f17c49aa36c7bed54142ec5c93d36ed8426c8fdf09e500" + }, + "vllm/distributed/weight_transfer/nccl_engine.py": { + "path": "/vllm/distributed/weight_transfer/nccl_engine.py", + "sha256": "7fd020c919dc7b4723fb78e64da977b180d0fef0cd21df955a037b848dbaa008" + }, + "vllm/distributed/weight_transfer/packed_tensor.py": { + "path": "/vllm/distributed/weight_transfer/packed_tensor.py", + "sha256": "d0a27fb0be1dc029bd5a1d44fdb57a5e54aa4cd74308bedc339e86ac02c7494c" + }, + "vllm/distributed/weight_transfer/sharded_rdt_common.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_common.py", + "sha256": "be0b13801f24e7b62999b19d733c030510353603a2d5320d5dc98ee02daf22a2" + }, + "vllm/distributed/weight_transfer/sharded_rdt_engine.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_engine.py", + "sha256": "2f791970b4815511a7578ef6c957e7da97b071d26a39087a09a17475909791ee" + }, + "vllm/distributed/weight_transfer/sharded_rdt_fake.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_fake.py", + "sha256": "ee11164e17b5f2793252ce77741b8b94e0583046abf896a590131b2008d1fbb9" + }, + "vllm/distributed/weight_transfer/sharded_rdt_trainer.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_trainer.py", + "sha256": "dd413ff461d41826ccd3eb87d3df22f6cd7f24e09aac7644e3e5b40d7beec484" + }, + "vllm/distributed/weight_transfer/sparse_nccl_engine.py": { + "path": "/vllm/distributed/weight_transfer/sparse_nccl_engine.py", + "sha256": "e11b409454dda2b05ea34e8115ac19027c5e65cb2a5e9682c494f16a50e978f4" + }, + "vllm/model_executor/determinism/__init__.py": { + "path": "/vllm/model_executor/determinism/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/determinism/batch_invariant.py": { + "path": "/vllm/model_executor/determinism/batch_invariant.py", + "sha256": "af8f8d256a48fc214edf426fbe891fb15bd8b1d7ae98b811c736ff1eb0fae798" + }, + "vllm/model_executor/determinism/batch_invariant_configs.py": { + "path": "/vllm/model_executor/determinism/batch_invariant_configs.py", + "sha256": "72ea0d4df0ab5ae288abb7df5c203d2ad5f1709c7295d87ec72da775fddc1b7a" + }, + "vllm/model_executor/layers/fused_moe/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/__init__.py", + "sha256": "64a32665be6d5afcfbaf7a0915717267278b66b880b908b0263ea58f08e51b5e" + }, + "vllm/model_executor/layers/fused_moe/activation.py": { + "path": "/vllm/model_executor/layers/fused_moe/activation.py", + "sha256": "78dec0e85e0c040304515f64ccf8f2c6a7a2e5b9f1124a2138a97d9a02585541" + }, + "vllm/model_executor/layers/fused_moe/all2all_utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/all2all_utils.py", + "sha256": "dc4750a446f7de31d09a46034da5fdf479bc169af90f47aa9af8ae15e67b0828" + }, + "vllm/model_executor/layers/fused_moe/b12x.py": { + "path": "/vllm/model_executor/layers/fused_moe/b12x.py", + "sha256": "ee76cc6aa801e24be8ec78a9e8502061ad48667d5ff8711e43f68fba912425bd" + }, + "vllm/model_executor/layers/fused_moe/config.py": { + "path": "/vllm/model_executor/layers/fused_moe/config.py", + "sha256": "a3a87cebcc7ac85d73f471dcfafc2d899c6fc08f264777b74a0e919adac9e03f" + }, + "vllm/model_executor/layers/fused_moe/deep_gemm_utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/deep_gemm_utils.py", + "sha256": "8fdcd857eb333f9c68902105f157568d52067c94ba1e2df6dbfe0474ef1f4c02" + }, + "vllm/model_executor/layers/fused_moe/eep_reconfigure.py": { + "path": "/vllm/model_executor/layers/fused_moe/eep_reconfigure.py", + "sha256": "9d7580265e8563e1140c2bb4c3a81a35ddd54903f5ec0a2720ffc064681f02f9" + }, + "vllm/model_executor/layers/fused_moe/expert_map_manager.py": { + "path": "/vllm/model_executor/layers/fused_moe/expert_map_manager.py", + "sha256": "308c00f63fcb6f44518ec3a56d8f902c7bba75928c2e3aea30fbe1f3f473973b" + }, + "vllm/model_executor/layers/fused_moe/experts/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a16_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a16_moe.py", + "sha256": "53deea255175171971422d14082ad139b5ec7b62e21429a4c7cc0ebbefd29cdc" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a8_moe.py", + "sha256": "f3fc51b95ed89862381908a0134e326228827f44854248db9585a9c4899c34f4" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp8_moe.py", + "sha256": "af6db1760961a5a71234f8b1cdf42e9e30a236e13601b0826a75110b79724948" + }, + "vllm/model_executor/layers/fused_moe/experts/batched_deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/batched_deep_gemm_moe.py", + "sha256": "b0cd4ea706583518dc608fb56f832fc3595f24bd863b03ef1e8c22b36b873508" + }, + "vllm/model_executor/layers/fused_moe/experts/cpu_int4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cpu_int4_moe.py", + "sha256": "67170af3ba9dc4c4f71d78a72efc3fa4e366eac614936a79911dae5c75ac1864" + }, + "vllm/model_executor/layers/fused_moe/experts/cpu_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cpu_moe.py", + "sha256": "0754cd4ff1b28e6d3932a67609d335acefd28f95a841f0492923813356a6d81e" + }, + "vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py", + "sha256": "db901bdbcd3fdac23a1d74e39c51e67f14a82be787b2fd704ed1e787372ae868" + }, + "vllm/model_executor/layers/fused_moe/experts/deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/deep_gemm_moe.py", + "sha256": "16911a64a72eafc26a1bcb544a91f90144d85dc41e3ee57cf20e89925227bbb7" + }, + "vllm/model_executor/layers/fused_moe/experts/fallback.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fallback.py", + "sha256": "1bdd0a4f2ebaa40ec96a5aacc07aee61511af59e6324ce456aa65003b6e2991a" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_b12x_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_b12x_moe.py", + "sha256": "e613afe5da2742e42c717c1a0a56bd9e1c7e3e0452a828db0013d81063518954" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_batched_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_batched_moe.py", + "sha256": "295254dfeeec8df3eb8110e6f659a946cb9cded3de1565ecad4d741b3c3f3e00" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_moe.py", + "sha256": "08578bcd0cf72d6a470e40950175e73639efaa6d8d23c6da0869345312b229c9" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutlass_moe.py", + "sha256": "52887cec5fe628e0a4e7793deb546b40f6c29f7362b3b436c10ca36934ab9826" + }, + "vllm/model_executor/layers/fused_moe/experts/fused_batched_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fused_batched_moe.py", + "sha256": "2435587fc7f8fe8ea341ea0eb8f14c11f3f5b31fbbb9b29ce569ad3bace6e6a0" + }, + "vllm/model_executor/layers/fused_moe/experts/fused_humming_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fused_humming_moe.py", + "sha256": "a6830a76ff7f4cd3479b9c8372a30d03e8301604555cbdbcd9ac89a813b7431a" + }, + "vllm/model_executor/layers/fused_moe/experts/gpt_oss_triton_kernels_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/gpt_oss_triton_kernels_moe.py", + "sha256": "1613a7a6b256e8faee6fdcfae84f293492db6229d28ceb3e8a8d6093af480e36" + }, + "vllm/model_executor/layers/fused_moe/experts/int4_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/int4_emulation_moe.py", + "sha256": "f12857caf0671a341687ad3c5f48616b816ed51e1bcbdefa0a7edbecdb81a79d" + }, + "vllm/model_executor/layers/fused_moe/experts/lora_context.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/lora_context.py", + "sha256": "9b41eefaaa57c5dd0dc54217ef95978821b0c52e90ea4db8b0752e08452bd3e5" + }, + "vllm/model_executor/layers/fused_moe/experts/lora_experts_mixin.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/lora_experts_mixin.py", + "sha256": "b2bc55ed6be98b526c6a5698e2d98300650e78555f56b1820e58c04888e2a373" + }, + "vllm/model_executor/layers/fused_moe/experts/marlin_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/marlin_moe.py", + "sha256": "93916b721548e6194dc70cf6cec224b4b1456a0cc0980235e97beba7bf36541d" + }, + "vllm/model_executor/layers/fused_moe/experts/mxfp8_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/mxfp8_emulation_moe.py", + "sha256": "d09c62ad1398c51ff6f515f2a61014ee9e9a9798d0fe9762c47f446efc5edbef" + }, + "vllm/model_executor/layers/fused_moe/experts/mxfp8_native_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/mxfp8_native_moe.py", + "sha256": "01a42cebf18189e566034111b2145573c655319e8af1a56db60d53a319c40613" + }, + "vllm/model_executor/layers/fused_moe/experts/nvfp4_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/nvfp4_emulation_moe.py", + "sha256": "f24467762b60702f0df122ed64786be839a838a9b6cafaecbd04d35fbfedb189" + }, + "vllm/model_executor/layers/fused_moe/experts/ocp_mx_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/ocp_mx_emulation_moe.py", + "sha256": "dcaa60a9ebdb0bd8223b37af41f018ce7f95716ec7cd8526850f4433a579213b" + }, + "vllm/model_executor/layers/fused_moe/experts/rdna3_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/rdna3_moe.py", + "sha256": "e4abd802dc2f0ad9b338ebde397633c761d881c37813e2dc229902c526b597d8" + }, + "vllm/model_executor/layers/fused_moe/experts/rocm_aiter_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/rocm_aiter_moe.py", + "sha256": "bf09a7b783f5752d61cab76221b32b598d8846d801ee39dc9209d636c9659c6f" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_cutlass_moe.py", + "sha256": "ffce5ad627c540940d122d8df7981644b2eb35d07d480995c0f4f30517815fac" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_deep_gemm_moe.py", + "sha256": "c7209fa5e1ccb184a68b37a0706fc571a76696c2ae79802ddc7f889b1c29684d" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_moe.py", + "sha256": "806fbccfe30f5fbd578acf773add99bdf022b12d617958bd6281aef6de369701" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_bf16_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_bf16_moe.py", + "sha256": "76256de96fefece9c41ffb1108487919e24da364cf4412c6c3474498aba59137" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.py", + "sha256": "b54c7ceb45e5d07aa905f42ea44caccf85ca35ba9fb825d4c01947764510f68b" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_lora_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_lora_moe.py", + "sha256": "dd35a9e4242c0dc8d691168813e14bd5543e591f02ee529d0691e07651942c5a" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_mxfp4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_mxfp4_moe.py", + "sha256": "fe780f125a3dc3ba919659e9b85340bd32afcbfe47733a002bfdfb92eadf400c" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_mxint4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_mxint4_moe.py", + "sha256": "2106d67c2951aa690c4656ca58240d09c366cffe8cb4d9fd575df016c377cc30" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_nvfp4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_nvfp4_moe.py", + "sha256": "e938ac9f058f7c90b41c9610513239bec54a95304bfb5ff5f6897ebd54733d7e" + }, + "vllm/model_executor/layers/fused_moe/experts/xpu_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/xpu_moe.py", + "sha256": "2a11bac0cf9274d963315efd6eebdc62978b0b7aa02e8849ff2a562742f0b86d" + }, + "vllm/model_executor/layers/fused_moe/fused_flydsl_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_flydsl_moe.py", + "sha256": "0e74879ee5c72f616ae4064b9dff3b3a0b583b7fc70b8f92f1e8b730ecd5d39b" + }, + "vllm/model_executor/layers/fused_moe/fused_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe.py", + "sha256": "7072eb06237be9d33dcb0ef7101410f886a6363c98cbee70a014c68b70f639cb" + }, + "vllm/model_executor/layers/fused_moe/fused_moe_method_base.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe_method_base.py", + "sha256": "18dcfc469d3252749801bbf943857f58da85de1f2db8fdff5a9f4986a925dc68" + }, + "vllm/model_executor/layers/fused_moe/fused_moe_modular_method.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe_modular_method.py", + "sha256": "321c744eac1fcaffd6b1b2971204c8baa57dfec53e91e5d24140014d72d64f83" + }, + "vllm/model_executor/layers/fused_moe/hpc_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/hpc_moe.py", + "sha256": "2ca9c5d71b6fd91651027905e2b83103a8823845e053e7153e148cb8e0ee666d" + }, + "vllm/model_executor/layers/fused_moe/layer.py": { + "path": "/vllm/model_executor/layers/fused_moe/layer.py", + "sha256": "def0b4e13bcc1e4e21ee10644e647e2eda1acbf0cc01e76d6128abb59ea08224" + }, + "vllm/model_executor/layers/fused_moe/modular_kernel.py": { + "path": "/vllm/model_executor/layers/fused_moe/modular_kernel.py", + "sha256": "8dc4e0dbbf35b3aac8add63ca6f2a7bbfdadaabbd60826e24598b22c7d8e5c22" + }, + "vllm/model_executor/layers/fused_moe/moe_align_block_size.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_align_block_size.py", + "sha256": "c3f7fc2087836f0160a32ab99ceb1d8f6e87c793679da34dd672e225cb7fa31b" + }, + "vllm/model_executor/layers/fused_moe/moe_fused_mul_sum.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_fused_mul_sum.py", + "sha256": "112e72578002c3bff538418dac64b3b56d995994a2fc5e32b18d2cf3b8392a13" + }, + "vllm/model_executor/layers/fused_moe/moe_output.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_output.py", + "sha256": "6ea4cbd78f9efc7f842c5df246f553f08b991c3479b8b04b89902ed08aaf8e8f" + }, + "vllm/model_executor/layers/fused_moe/moe_permute_unpermute.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_permute_unpermute.py", + "sha256": "1adc592c6254d0c877d66be5406afbc822459c18a838f4bbd094a992e7609d06" + }, + "vllm/model_executor/layers/fused_moe/oracle/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/__init__.py", + "sha256": "4dcf941d50d48bb812de0f39e9194bf17a76b8035fe324889c6038f710fdc453" + }, + "vllm/model_executor/layers/fused_moe/oracle/base.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/base.py", + "sha256": "555bbcd18a3744e64eee4e953daabef3bd268a1bd4faf967d4cfd14d6074f685" + }, + "vllm/model_executor/layers/fused_moe/oracle/fp8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/fp8.py", + "sha256": "245bd36c285df1e6f7c51e52dcda31ad247894577a9f8d765613c2c2feae9aee" + }, + "vllm/model_executor/layers/fused_moe/oracle/int8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/int8.py", + "sha256": "c1b67886511bd966b162db5bca8930f04895fb37a969818a4a10f0726c59547f" + }, + "vllm/model_executor/layers/fused_moe/oracle/int_wna16.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/int_wna16.py", + "sha256": "cfffe8b8b290330be9d18ffa07aeecf296484395ff04df3147d99393e48b55c1" + }, + "vllm/model_executor/layers/fused_moe/oracle/mxfp4.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/mxfp4.py", + "sha256": "b7915e6779b5c88e7dcd2d227f003a8e45071d6d86877013067142d4feb64a8c" + }, + "vllm/model_executor/layers/fused_moe/oracle/mxfp8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/mxfp8.py", + "sha256": "9cfdc8102a04bb844dcd7ed88043bba96ec751794bc093da76c69aa8cf88cf48" + }, + "vllm/model_executor/layers/fused_moe/oracle/nvfp4.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/nvfp4.py", + "sha256": "735b4cdeb1258f11fb02320fc0c70cab5edaca468dd60b07b2d369389d2b0313" + }, + "vllm/model_executor/layers/fused_moe/oracle/unquantized.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/unquantized.py", + "sha256": "c8b8203bd0b73bb7f586f703607394d663f14c05711416ad42d45af564382223" + }, + "vllm/model_executor/layers/fused_moe/oracle/w4a8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/w4a8.py", + "sha256": "d7fa6e2982f20b34d5ce9c5ce28a61122762a3fcdd53d249479472a4f2316c6a" + }, + "vllm/model_executor/layers/fused_moe/oracle/w4a8_int8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/w4a8_int8.py", + "sha256": "6d6f9ca2e67b630002873de2f8d8a231d091c5c2f0f3354a9e8209449b481a4c" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/__init__.py", + "sha256": "2800113263a83c2632e522fb22790b29f63384da75d43de32f0ae2f95e8ae4c1" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/batched.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/batched.py", + "sha256": "d52425dd8c08e47cf8d9c3088daf3b1cc721c8667de4c738d04ba997f9a08ccb" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ht.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ht.py", + "sha256": "465cdf1d6cee91b2ee8c2e43abbea6e8408976e3048c10f44c089f34b415bc60" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ll.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ll.py", + "sha256": "f704922b1db680c4c212982a096e09d6b3eb97d89110313f86ed958a00df21b7" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_v2.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_v2.py", + "sha256": "8d690b016bbcfbc9eb599bcc36a6f798b2f1720c828f4347ea742e218c0cc60d" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_one_sided.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_one_sided.py", + "sha256": "acb57d8342af62bb5672036871cd4b27ecc7f37dfa7c894850bb860e6152a1f0" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_two_sided.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_two_sided.py", + "sha256": "cc5b00d6a157b6eca5afaaf7435165dbd1b4524d6d88bf75808cbe074a389f79" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/mori.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/mori.py", + "sha256": "8e9c3b5b1f0de13f467d95bf2f451cba0e4b0d9a1bdcf98da0988a3a9a79a045" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/naive_dp_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/naive_dp_ep.py", + "sha256": "db015e5b18750bbbf5b2bbaceca877dd6f3f3e74c2a94e8dc185f7413b387f91" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/nixl_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/nixl_ep.py", + "sha256": "1f71d70ac509bf5d3d67a8d95a8ee108a50af6bb5d4bde7181ca28e286f6ffce" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/no_dp_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/no_dp_ep.py", + "sha256": "adbbf529cd22059c95b5380952943a70cf11e05e321dcd707f296bebde61a6e7" + }, + "vllm/model_executor/layers/fused_moe/routed_experts.py": { + "path": "/vllm/model_executor/layers/fused_moe/routed_experts.py", + "sha256": "68c48e5df0ea4a7cc1f04436b7b9153eb53802ecd9bb55d38db8738508daac6d" + }, + "vllm/model_executor/layers/fused_moe/routed_experts_capturer.py": { + "path": "/vllm/model_executor/layers/fused_moe/routed_experts_capturer.py", + "sha256": "cd006bc1a1703418cca3b589fafb2abc4268a086fb3db044bbb64348aeac8b13" + }, + "vllm/model_executor/layers/fused_moe/router/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/layers/fused_moe/router/aiter_shared_routed_fused_moe_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/aiter_shared_routed_fused_moe_router.py", + "sha256": "f47046db1275601a2c67c9232afc7b866c9623a19639d5be867e4c7914a35069" + }, + "vllm/model_executor/layers/fused_moe/router/base_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/base_router.py", + "sha256": "47fa2324bcd9b6ebdc138d69ae6b6ecc0f2463d34bda8c5988bdb0a2a76d3fae" + }, + "vllm/model_executor/layers/fused_moe/router/bf16x3_router_gemm_cutedsl.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/bf16x3_router_gemm_cutedsl.py", + "sha256": "d0f1edd1ebc48d88e490bdb3c93db49bdc0a135ff83e7e0b57130e9f8255fc32" + }, + "vllm/model_executor/layers/fused_moe/router/cpu_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/cpu_router.py", + "sha256": "bff36b15818c87bfbb7ee3def7dc7f6396860abbe5893ff6148801fe941a4b92" + }, + "vllm/model_executor/layers/fused_moe/router/custom_routing_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/custom_routing_router.py", + "sha256": "1a40c7054e3c3a1b3ee2e98f6bc9efa9dfdc11f316a8edf7357dd91533487bfe" + }, + "vllm/model_executor/layers/fused_moe/router/dsv4_topk.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/dsv4_topk.py", + "sha256": "14f7c8487b9aef652dd61c91e0e3c3640b643bf9cd0d8a7184157d71f4beb63e" + }, + "vllm/model_executor/layers/fused_moe/router/fused_moe_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_moe_router.py", + "sha256": "0daa0dc05b931d66767feca444a4cd57ecf140f59b40ea0e8ad213eef6da2b36" + }, + "vllm/model_executor/layers/fused_moe/router/fused_topk_bias_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_topk_bias_router.py", + "sha256": "8fdc28cc248180ad4f11bb4bcda3df47926ec12665a0d84bb712fe83fc6b9376" + }, + "vllm/model_executor/layers/fused_moe/router/fused_topk_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_topk_router.py", + "sha256": "1c80f4af4d781fd66b12aa6a7a0fd30082bc521df40f1252987a8ac4c0bef51c" + }, + "vllm/model_executor/layers/fused_moe/router/gate_linear.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/gate_linear.py", + "sha256": "faa43362c2e7c568498a923c682ca18cae75e87f48d00882770821cb19c21198" + }, + "vllm/model_executor/layers/fused_moe/router/grouped_topk_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/grouped_topk_router.py", + "sha256": "048339e1799cdd42c9dae686a6cb891046577fb391b500f0d12eed73c8f61e52" + }, + "vllm/model_executor/layers/fused_moe/router/rocm_fp32_router_gemm.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/rocm_fp32_router_gemm.py", + "sha256": "9c331ef3d0bb2fb6954387d77ac62a99c5c76d2753c7438bfbb5115f68aae5ac" + }, + "vllm/model_executor/layers/fused_moe/router/router_factory.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/router_factory.py", + "sha256": "019bc8adaa7642abab82843efd53cd1a378f62c652521a1de2b781480eb88742" + }, + "vllm/model_executor/layers/fused_moe/router/routing_simulator_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/routing_simulator_router.py", + "sha256": "a7345df5add00cf3bd93024492d6fc1189fd3ecf2754a11cef1b03a295d791f7" + }, + "vllm/model_executor/layers/fused_moe/router/zero_expert_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/zero_expert_router.py", + "sha256": "dea306edd92e2b9c1b43f982ede8e1e10770d2c66220f5a106e0ed0165276e9c" + }, + "vllm/model_executor/layers/fused_moe/runner/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/layers/fused_moe/runner/moe_runner.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/moe_runner.py", + "sha256": "05893188402fe37229bf72d75088d66193c417d5d502daafd3a55e1bfedaa60c" + }, + "vllm/model_executor/layers/fused_moe/runner/moe_runner_interface.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/moe_runner_interface.py", + "sha256": "189cad01611124eb44594713cbf5918d16fc70196dc81a525ae0a7a97a5fcc51" + }, + "vllm/model_executor/layers/fused_moe/runner/shared_experts.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/shared_experts.py", + "sha256": "d89e4c79c46f6fe61262c51f3facf102e71ce1e4eb3db67f72b6bd8470937be9" + }, + "vllm/model_executor/layers/fused_moe/topk_weight_and_reduce.py": { + "path": "/vllm/model_executor/layers/fused_moe/topk_weight_and_reduce.py", + "sha256": "3dfede72d52bf99af40997994704e6c502ee3bab2bd39bfaa8a68d7dae440203" + }, + "vllm/model_executor/layers/fused_moe/unquantized_fused_moe_method.py": { + "path": "/vllm/model_executor/layers/fused_moe/unquantized_fused_moe_method.py", + "sha256": "182a5ec1874ece2091a24c5303f6ab9ea64a9a61adf325b863927f0cdd83e5d3" + }, + "vllm/model_executor/layers/fused_moe/utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/utils.py", + "sha256": "a93a0bded4008db19d8b38370526ae34fafb9c8278e5b4f60acb6acc8fdc1850" + }, + "vllm/model_executor/layers/mamba/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/abstract.py": { + "path": "/vllm/model_executor/layers/mamba/abstract.py", + "sha256": "dfdc8c836894f574e41d93d76ab989cacd3d7ecf59c97a929abfa48d9364e8ad" + }, + "vllm/model_executor/layers/mamba/gdn/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/gdn/base.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/base.py", + "sha256": "7fec748fc74131f5a45bcaf2644b3fa3a0598fd437d7347f8207ea3644a951c5" + }, + "vllm/model_executor/layers/mamba/gdn/kimi_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/kimi_gdn_linear_attn.py", + "sha256": "1cec4da5c9da73557e192bfb36cd540aae51d3e91283b554449c4a97f0f89bd9" + }, + "vllm/model_executor/layers/mamba/gdn/olmo_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/olmo_gdn_linear_attn.py", + "sha256": "60873ca3bb0c4d17c33bd259b62b658db4883cd23138f47dd4ead62cd2ff0605" + }, + "vllm/model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py", + "sha256": "b80f8e6f3fff442fb880aebb3209c52f814f66490009f4ac4003de603576d10a" + }, + "vllm/model_executor/layers/mamba/linear/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/linear/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/linear/bailing_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/linear/bailing_linear_attn.py", + "sha256": "3c480ddd6eba0766ed012a1074bbec5f241d868a87b020b0f6312222c32f93eb" + }, + "vllm/model_executor/layers/mamba/linear/base.py": { + "path": "/vllm/model_executor/layers/mamba/linear/base.py", + "sha256": "26125cd427225954e1846ca361cdaf43f2b56f11b1e217cf26e91a80ef0edb6a" + }, + "vllm/model_executor/layers/mamba/linear/minimax_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/linear/minimax_linear_attn.py", + "sha256": "4adc00f54893b5bc6c31c613deda152a19af3b1bba04153ab5924c3bf2a3aaae" + }, + "vllm/model_executor/layers/mamba/mamba_mixer.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_mixer.py", + "sha256": "a485e937ad9db14d3ad03fde5a9fe795cfa863649563e52fc7e6c52ef631164e" + }, + "vllm/model_executor/layers/mamba/mamba_mixer2.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_mixer2.py", + "sha256": "d58d93e90d9eb90bc5133b79f07c7c62d0032b35d6cf916e3fe34367b81c5cd5" + }, + "vllm/model_executor/layers/mamba/mamba_utils.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_utils.py", + "sha256": "ce9845b4a4ef4bc46577a33038ed69d59ceccb52f30e9c5bdaa36e48be3b2ca4" + }, + "vllm/model_executor/layers/mamba/ops/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/ops/causal_conv1d.py": { + "path": "/vllm/model_executor/layers/mamba/ops/causal_conv1d.py", + "sha256": "044d005cfe59fd0818ed421274e04f3e8dd679b8cdb64fca9f4422f2643484b2" + }, + "vllm/model_executor/layers/mamba/ops/cpu/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/ops/cpu/causal_conv1d.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/causal_conv1d.py", + "sha256": "64104672890ac2ef240c20c7f8059beeade707178574809dbca8721dff5ea6fa" + }, + "vllm/model_executor/layers/mamba/ops/cpu/gdn_attention.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/gdn_attention.py", + "sha256": "a50288945bf5b102ad3025ae536638dcc32d84cf7c22aaf3a85326b0c1c56c1f" + }, + "vllm/model_executor/layers/mamba/ops/cpu/mamba_ssm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/mamba_ssm.py", + "sha256": "5839e576172a3246337f5e4fb1bc19eb583b3e2b2f7e35dd060dc3041eb8372d" + }, + "vllm/model_executor/layers/mamba/ops/gather_initial_states.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gather_initial_states.py", + "sha256": "5198bb6de6d91c583a5f65d926412a76ee04a06fa72aaba76eaf156b27cd0523" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/__init__.py", + "sha256": "b88b52e71fcb21bd3fa215ea171dcd2ad2ff17c97788cfe64caa7ba45c7ecf97" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_h.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_h.py", + "sha256": "f50bbe5c0b6382323ec5dfc24a5e0c7971113d59727515e60c9fe3689734e5ba" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_kkt_inv_uw.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_kkt_inv_uw.py", + "sha256": "b4a65dd194907db08865e0596fe254f915e670a9e6b27ffa2933c1026dde9b1e" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_o.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_o.py", + "sha256": "629f7843a7e611efb9390f2ebb7a4b924b2c328d48a317fddfaa96af4d9bc60a" + }, + "vllm/model_executor/layers/mamba/ops/layernorm_gated.py": { + "path": "/vllm/model_executor/layers/mamba/ops/layernorm_gated.py", + "sha256": "3433f2e3b87c2b2ccf8e9794ce40762c86a6da38a94ecee001f439ea0d0373dd" + }, + "vllm/model_executor/layers/mamba/ops/mamba_ssm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/mamba_ssm.py", + "sha256": "a4515ec7895b40ed878cf380445034b25faa61fbaa799d96c49217bbdfd7e400" + }, + "vllm/model_executor/layers/mamba/ops/replayssm_config.py": { + "path": "/vllm/model_executor/layers/mamba/ops/replayssm_config.py", + "sha256": "5fe9d5d7aa2de6a65875b3796a919b22bc435fd76055ba054bbff43aa005bc44" + }, + "vllm/model_executor/layers/mamba/ops/scatter_states.py": { + "path": "/vllm/model_executor/layers/mamba/ops/scatter_states.py", + "sha256": "f3bb004c73edaba56337747893eb07faf29b270dc8bb9c893ee9b1044e4ead9a" + }, + "vllm/model_executor/layers/mamba/ops/selective_state_update_replayssm_output_only.py": { + "path": "/vllm/model_executor/layers/mamba/ops/selective_state_update_replayssm_output_only.py", + "sha256": "cea7fd3063ca9dcc4e33f180d01ea379195ec515cedc9d0b03b11dc67670d695" + }, + "vllm/model_executor/layers/mamba/ops/ssd_bmm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_bmm.py", + "sha256": "26983d97a7f5c5f9197a16a6bee7b1294839b9ae31a14c14aaee38b43523e630" + }, + "vllm/model_executor/layers/mamba/ops/ssd_chunk_scan.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_chunk_scan.py", + "sha256": "d5ef32e8cb47e2ce71984579df78ab69754895f891766394daf327867cfa4f8f" + }, + "vllm/model_executor/layers/mamba/ops/ssd_chunk_state.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_chunk_state.py", + "sha256": "177e3aa7fe72647133bbd86135533e8688a5802678d4d1564aa549410362316f" + }, + "vllm/model_executor/layers/mamba/ops/ssd_combined.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_combined.py", + "sha256": "1317bbb668d3c60dfe0658850f9968614f03fa5eb61196f8ce6ac17dbb31b480" + }, + "vllm/model_executor/layers/mamba/ops/ssd_state_passing.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_state_passing.py", + "sha256": "36b8c8edba437916a5b789717c61fc22077de01e77892cb96dbff3b00a57410e" + }, + "vllm/model_executor/layers/mamba/ops/ssu_dispatch.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssu_dispatch.py", + "sha256": "bbe0f0e61da87f3ddfead19a79ca376516b63f1ea868be3485333c63fa20ef41" + }, + "vllm/model_executor/layers/mamba/ops/triton_helpers.py": { + "path": "/vllm/model_executor/layers/mamba/ops/triton_helpers.py", + "sha256": "a8795532f22c37a93e82c9d8e3fadcb5f4da98673d7b321fe8481305eaafad30" + }, + "vllm/model_executor/layers/mamba/short_conv.py": { + "path": "/vllm/model_executor/layers/mamba/short_conv.py", + "sha256": "228494efab185ee17374f762874f4c8b9a26aac9decfa8c906ce38446e0de51a" + }, + "vllm/model_executor/models/qwen3_next.py": { + "path": "/vllm/model_executor/models/qwen3_next.py", + "sha256": "4fa5112ac2bf7886d41d9e1f6c3da8793620d1ec49c961b31e9609459a6a7f7a" + }, + "vllm/third_party/flash_linear_attention/__init__.py": { + "path": "/vllm/third_party/flash_linear_attention/__init__.py", + "sha256": "5dbbfa3fc286edb2e970e175ef33cee4f6181c89b0784f5a8986201b2312f54e" + }, + "vllm/third_party/flash_linear_attention/ops/__init__.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/__init__.py", + "sha256": "dd738dc1d08045e76455cdbe16052a5b769e0eb11d6e87ff28353994f880cd6c" + }, + "vllm/third_party/flash_linear_attention/ops/chunk.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk.py", + "sha256": "c105ead259e86aedc248c53e7c4cef07034d0ff12da608d80265d1dd0990803f" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_delta_h.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_delta_h.py", + "sha256": "1b3ad391f939d9443c6b7adb19e57fe381bd5dccea064e8417a4f85b0e713b26" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_o.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_o.py", + "sha256": "3b63b836a8cc561723c23db5a528a0b474d9cd78508d610f0b348c585a889a19" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_scaled_dot_kkt.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_scaled_dot_kkt.py", + "sha256": "7ae41df3755acc7e925a134d848f78bb5fc00b90069039d86403c5853323ea42" + }, + "vllm/third_party/flash_linear_attention/ops/cumsum.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/cumsum.py", + "sha256": "d818215669b451868823202ac0bcea77e7a9d75957254c7c1060a73a55dc39b6" + }, + "vllm/third_party/flash_linear_attention/ops/fused_gdn_prefill_post_conv.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_gdn_prefill_post_conv.py", + "sha256": "590717b2107abc90d72548de06b5d315229eb2775c94614f3f545df11cc2b5df" + }, + "vllm/third_party/flash_linear_attention/ops/fused_norm_gate.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_norm_gate.py", + "sha256": "e6eb90467f29d8a0a04f2a364d20a2c3191b6ab857841bfb82076b33a6022d1a" + }, + "vllm/third_party/flash_linear_attention/ops/fused_recurrent.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_recurrent.py", + "sha256": "fe6f1311014809040497aa0a623e7fa97f4b3457cdc7ee1f1f8aed21f326f755" + }, + "vllm/third_party/flash_linear_attention/ops/fused_sigmoid_gating.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_sigmoid_gating.py", + "sha256": "000ab8996af9788fdb8843a6a3b91833e7a14c8acc0e1ea073a536330f64cb6f" + }, + "vllm/third_party/flash_linear_attention/ops/index.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/index.py", + "sha256": "a4f8b2c052635cb519a80099e8a85411d1d5d6880b38f466788259bbe66b154d" + }, + "vllm/third_party/flash_linear_attention/ops/kda.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/kda.py", + "sha256": "e1f31aaa89b91f8e5db6d070b229e2c81c7206e8caec67de41db97d06be0c476" + }, + "vllm/third_party/flash_linear_attention/ops/l2norm.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/l2norm.py", + "sha256": "520f4513ef4fc97e6b88dc07877cca8e29da0d34e44673fe989e3af002d86381" + }, + "vllm/third_party/flash_linear_attention/ops/layernorm_guard.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/layernorm_guard.py", + "sha256": "42af29be26e8fc94a4658e053c095fcdab9ffdc1bc2446a01e787deda2a298c0" + }, + "vllm/third_party/flash_linear_attention/ops/op.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/op.py", + "sha256": "456da84fd12411cf53c96a90dd4f78f49afb454c3d51d2c524ea8e7106fe8ae5" + }, + "vllm/third_party/flash_linear_attention/ops/solve_tril.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/solve_tril.py", + "sha256": "d1a4ff27623a938825052500afa7e2aa24fadd2fa4c9be6376c9128824f86f82" + }, + "vllm/third_party/flash_linear_attention/ops/utils.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/utils.py", + "sha256": "d6c90d36505e02086954c23ca4dd2fea82a69416d68ff1d0501e16b3148b5b0c" + }, + "vllm/third_party/flash_linear_attention/ops/wy_fast.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/wy_fast.py", + "sha256": "c9fc8259db0a8746dc04f1d799cb73333457118cf89a0bdce8dde8a80a28cd96" + }, + "vllm/v1/attention/__init__.py": { + "path": "/vllm/v1/attention/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backend.py": { + "path": "/vllm/v1/attention/backend.py", + "sha256": "01ac364372afa75fdb22486aa3a9c7cf9aebb742e3471dfb9e0f9d9d36b734bc" + }, + "vllm/v1/attention/backends/__init__.py": { + "path": "/vllm/v1/attention/backends/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backends/b12x.py": { + "path": "/vllm/v1/attention/backends/b12x.py", + "sha256": "443f0a98738fdfefe5b9ab151d278bfd43a8ac807eb2b0b9b2a13d51922afbf9" + }, + "vllm/v1/attention/backends/composite.py": { + "path": "/vllm/v1/attention/backends/composite.py", + "sha256": "4cf3d66dca891562709eed4f50aa14b0ae6c8240d9ea86504a3304b2f356cce0" + }, + "vllm/v1/attention/backends/cpu_attn.py": { + "path": "/vllm/v1/attention/backends/cpu_attn.py", + "sha256": "76fb02a6bd725125565d84bf04f627cf16da5f7ff8f31f87c01ed6a1439398c7" + }, + "vllm/v1/attention/backends/fa_utils.py": { + "path": "/vllm/v1/attention/backends/fa_utils.py", + "sha256": "08fa6e231d3af3a71a6e59162dd12328aa8beb28548165ae58f130a92adb5a83" + }, + "vllm/v1/attention/backends/flash_attn.py": { + "path": "/vllm/v1/attention/backends/flash_attn.py", + "sha256": "b170a4789e18104c1bee35bea70df51abe6766693d8f4726a59f2e6f5c4282aa" + }, + "vllm/v1/attention/backends/flash_attn_diffkv.py": { + "path": "/vllm/v1/attention/backends/flash_attn_diffkv.py", + "sha256": "e4627c88c3ba8caee260540e994cc8137fd2ff7cd7813356b36387c6c88ce30a" + }, + "vllm/v1/attention/backends/flashinfer.py": { + "path": "/vllm/v1/attention/backends/flashinfer.py", + "sha256": "8ee541fde43ed92a417b3f01ea1e6fc64af8ab2eb54cbfc28308a49aaca4ed7f" + }, + "vllm/v1/attention/backends/flex_attention.py": { + "path": "/vllm/v1/attention/backends/flex_attention.py", + "sha256": "ad07f0ad73aeeadc3534b3a05c14f88a62cb3638874239ae9823c49b36276dc3" + }, + "vllm/v1/attention/backends/gdn_attn.py": { + "path": "/vllm/v1/attention/backends/gdn_attn.py", + "sha256": "3831019404a92200a38b43571c040cffeb6638bbdc71e4cb5e680dbc6c93d054" + }, + "vllm/v1/attention/backends/hpc_attn.py": { + "path": "/vllm/v1/attention/backends/hpc_attn.py", + "sha256": "af9e2aec1b498f0ee48a2dce3cf5646edf1976466980b2fd927c0e82b875427c" + }, + "vllm/v1/attention/backends/linear_attn.py": { + "path": "/vllm/v1/attention/backends/linear_attn.py", + "sha256": "bc42144fcd027434c6a10dc9f4c5f991db8899d387af5f6485402ce097eb0513" + }, + "vllm/v1/attention/backends/mamba1_attn.py": { + "path": "/vllm/v1/attention/backends/mamba1_attn.py", + "sha256": "32159dae11cab3c8c576b9514ad97d5108c8d1b4cac9fcfe345ec6a76223aee7" + }, + "vllm/v1/attention/backends/mamba2_attn.py": { + "path": "/vllm/v1/attention/backends/mamba2_attn.py", + "sha256": "a5bcdecb7b9547137023e1c77a386003358fa940eaf5f319ed142211dcdba139" + }, + "vllm/v1/attention/backends/mamba_attn.py": { + "path": "/vllm/v1/attention/backends/mamba_attn.py", + "sha256": "5e7b2c4058fc5e6096d001bff6c789b78368b025bbe4600f191aaca2ff59b59f" + }, + "vllm/v1/attention/backends/mla/__init__.py": { + "path": "/vllm/v1/attention/backends/mla/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backends/mla/aiter_triton_mla.py": { + "path": "/vllm/v1/attention/backends/mla/aiter_triton_mla.py", + "sha256": "ed0e285cdae06a019150c41cc958b3c0b5ceb0e4f299d5318d1c90e2c2395390" + }, + "vllm/v1/attention/backends/mla/amx_mla.py": { + "path": "/vllm/v1/attention/backends/mla/amx_mla.py", + "sha256": "7f5cddec30b2dfe22ccdbd3b9da673c879719bf6da4074317bd60add55f5d15f" + }, + "vllm/v1/attention/backends/mla/compressor_utils.py": { + "path": "/vllm/v1/attention/backends/mla/compressor_utils.py", + "sha256": "3589e94105368ea285c40b82db1a0332682ff5d071fe363627cf4c0d10f3facf" + }, + "vllm/v1/attention/backends/mla/cpu_mla.py": { + "path": "/vllm/v1/attention/backends/mla/cpu_mla.py", + "sha256": "ff2110b9f78e92adf6bab294465cbc294ae1ff71cb1780fed158179e134a4ca6" + }, + "vllm/v1/attention/backends/mla/cutlass_mla.py": { + "path": "/vllm/v1/attention/backends/mla/cutlass_mla.py", + "sha256": "211d298680f9bd793cc468281b316d6633c5f4eb6dcec71d3329b034a23ab9b5" + }, + "vllm/v1/attention/backends/mla/flashattn_mla.py": { + "path": "/vllm/v1/attention/backends/mla/flashattn_mla.py", + "sha256": "ac89e0ad75a37e92566d264bafe324735a80f9ab4709241a4454d17b3d38bb63" + }, + "vllm/v1/attention/backends/mla/flashattn_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashattn_mla_sparse.py", + "sha256": "67dd3ead2e8b9d8cda0825ecc93779cb7d670628bc741c759a7d3cd5d474030f" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla.py", + "sha256": "0c24ff016fb6b0bb41d9e7484b6f1af42f37bcc384ed613473fc3e01ad25f664" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse.py", + "sha256": "2116d965b2067134d8afa5878d4d16c0149b061258f50c4106d993aa13b073cc" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm120.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm120.py", + "sha256": "102ca08793d567f95598eefeb34c3f6ec50b3b9d704f162d1402b97b12b5777b" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm90.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm90.py", + "sha256": "df9fe4970aa3f53cf24784b8534b89e0101a2ca20a35a2ebbc9a12a4463d5993" + }, + "vllm/v1/attention/backends/mla/flashmla.py": { + "path": "/vllm/v1/attention/backends/mla/flashmla.py", + "sha256": "c9d8046a853ecbdeff9ebfc738f5bb34c4f272b278231a09a0fbf73708c7c188" + }, + "vllm/v1/attention/backends/mla/flashmla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashmla_sparse.py", + "sha256": "7a379c717adb9667ce94cbc16c0e3a1fb22a169713db6d7941c141fa84077b3f" + }, + "vllm/v1/attention/backends/mla/index_group.py": { + "path": "/vllm/v1/attention/backends/mla/index_group.py", + "sha256": "c24e028c3c160a9bb92e043da5b5b34c805e84745b7c4b8da6fb8702a0ddd641" + }, + "vllm/v1/attention/backends/mla/indexer.py": { + "path": "/vllm/v1/attention/backends/mla/indexer.py", + "sha256": "2acbc1c4fa57c3424ad95e6ecbe76eb7141747773c3e867ce704f4adccba892a" + }, + "vllm/v1/attention/backends/mla/prefill/__init__.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/__init__.py", + "sha256": "903630eb705dd175bf4ae4558a4bcaa07c110056b6a11eb830fdd2fb21b3c48a" + }, + "vllm/v1/attention/backends/mla/prefill/aiter_flash_attn.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/aiter_flash_attn.py", + "sha256": "571b8a9910c4ea3fefda60659026f3bf0d7b542c34553c8c9a4d43bb82077e61" + }, + "vllm/v1/attention/backends/mla/prefill/base.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/base.py", + "sha256": "138bf3ddaf5a94c3cdbc4e08ac676edcae84b32fc76625e546f3b47f7d8b82ec" + }, + "vllm/v1/attention/backends/mla/prefill/cpu_sdpa.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/cpu_sdpa.py", + "sha256": "1bb686395274a8ec0d9fd7327410a527655fe060cbbc263eab138fea988d96de" + }, + "vllm/v1/attention/backends/mla/prefill/flash_attn.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/flash_attn.py", + "sha256": "5e648c82c82e5f81fe11458eb82b9f90b50fc06df2ade3bf111ee6b7a2ee8481" + }, + "vllm/v1/attention/backends/mla/prefill/flashinfer.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/flashinfer.py", + "sha256": "63861219c35b8abc0ebe01e1f51543c5ed40bd46119ca261d927da7c6826b49b" + }, + "vllm/v1/attention/backends/mla/prefill/registry.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/registry.py", + "sha256": "c8c30b92213d594beaa3cab4d5003da26a85870dbb11d1ab73191962d0645b53" + }, + "vllm/v1/attention/backends/mla/prefill/selector.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/selector.py", + "sha256": "101d9fca7924b0c5d7891a17fe8942611bd6759e32b03a571dc87b14c1430f2f" + }, + "vllm/v1/attention/backends/mla/prefill/tokenspeed_mla.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/tokenspeed_mla.py", + "sha256": "047cf07bfcc83db3b11a6a54ffe189f6146e6ec9ad33ce2fa7d18860bf4210f0" + }, + "vllm/v1/attention/backends/mla/prefill/trtllm_ragged.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/trtllm_ragged.py", + "sha256": "9e13ea6f6a25accedd918c0de64bbb812ccb20ffb95350ab018a6e76d493789b" + }, + "vllm/v1/attention/backends/mla/rocm_aiter_mla.py": { + "path": "/vllm/v1/attention/backends/mla/rocm_aiter_mla.py", + "sha256": "b489f5830c655bfb6299801a70d69b9821513c69568ecab3689db5a7be867be5" + }, + "vllm/v1/attention/backends/mla/rocm_aiter_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/rocm_aiter_mla_sparse.py", + "sha256": "91b1d9b3d860a9720bc01b8ebe9bbe8649a7d6bca20d4b63939bc100309bca19" + }, + "vllm/v1/attention/backends/mla/sparse_swa.py": { + "path": "/vllm/v1/attention/backends/mla/sparse_swa.py", + "sha256": "a47853ad8a3fe40f24704592581ea323a18041b84610df010a5534da634e311e" + }, + "vllm/v1/attention/backends/mla/sparse_utils.py": { + "path": "/vllm/v1/attention/backends/mla/sparse_utils.py", + "sha256": "c3cdf060288c05542243a9fe8b5ad3a963ad75e9ce399009b5e45c1235a88ce4" + }, + "vllm/v1/attention/backends/mla/tokenspeed_mla.py": { + "path": "/vllm/v1/attention/backends/mla/tokenspeed_mla.py", + "sha256": "b9ba523c606430cecb99a88b28c53d98a99dcf5e76105a80664338110a20f1ad" + }, + "vllm/v1/attention/backends/mla/triton_mla.py": { + "path": "/vllm/v1/attention/backends/mla/triton_mla.py", + "sha256": "21b16b3b34470edcc33d0423e560837c1d37d4bab31c7b3b9cfd7faa47864b51" + }, + "vllm/v1/attention/backends/mla/xpu_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/xpu_mla_sparse.py", + "sha256": "559c6240fe466521a6b2df4c94aea02ddf3f5efa5ba6954fa180c5a51c0f12d2" + }, + "vllm/v1/attention/backends/recoverssm_metadata.py": { + "path": "/vllm/v1/attention/backends/recoverssm_metadata.py", + "sha256": "02896a667db0f0308371ceb50048b18e5866c0235d163c0357e9a05dcedb3394" + }, + "vllm/v1/attention/backends/registry.py": { + "path": "/vllm/v1/attention/backends/registry.py", + "sha256": "378e8ee78734bd8c8adbe287d4c0a4058dcbb553195a09fbcce00a3cc30adc29" + }, + "vllm/v1/attention/backends/rocm_aiter_fa.py": { + "path": "/vllm/v1/attention/backends/rocm_aiter_fa.py", + "sha256": "d1418af03bf58209c850f466b712d3ea22a14ebb758c42dd43e65738281841fd" + }, + "vllm/v1/attention/backends/rocm_aiter_unified_attn.py": { + "path": "/vllm/v1/attention/backends/rocm_aiter_unified_attn.py", + "sha256": "59d2645eb4c91dc0567754a7163d066f4f2faf48f1957b254fcdd5604e9d8c8c" + }, + "vllm/v1/attention/backends/rocm_attn.py": { + "path": "/vllm/v1/attention/backends/rocm_attn.py", + "sha256": "4a8f57067073fbceb784af6c3467487c450d00fa3957928fadb99a79f6036292" + }, + "vllm/v1/attention/backends/short_conv_attn.py": { + "path": "/vllm/v1/attention/backends/short_conv_attn.py", + "sha256": "84fc460ef2fbd09743b069bec0c14b39542af6c2254a403e37a048427e151121" + }, + "vllm/v1/attention/backends/triton_attn.py": { + "path": "/vllm/v1/attention/backends/triton_attn.py", + "sha256": "1057663d110e1d5229495a799027b27277c1eca325d5b6780fa2259afbf58a1a" + }, + "vllm/v1/attention/backends/triton_attn_diffkv.py": { + "path": "/vllm/v1/attention/backends/triton_attn_diffkv.py", + "sha256": "de0357eae005246642140f1ab8842ba5ed8bff5c84b18a6d3a7bbf409c578301" + }, + "vllm/v1/attention/backends/triton_flash_attn.py": { + "path": "/vllm/v1/attention/backends/triton_flash_attn.py", + "sha256": "176e45329aeb28a2008362bb607d1b8c89816eb665859ab908b0385a11acf1c2" + }, + "vllm/v1/attention/backends/triton_flashinfer.py": { + "path": "/vllm/v1/attention/backends/triton_flashinfer.py", + "sha256": "48d5f967e388d4e8d6bbec8d827b44d855346bc2fada28adf65768bf6623527b" + }, + "vllm/v1/attention/backends/turboquant_attn.py": { + "path": "/vllm/v1/attention/backends/turboquant_attn.py", + "sha256": "616d16d608d9d1fbf6c29548037e7e9cf330f4d36a01aa3ffabf42a731eb6e2b" + }, + "vllm/v1/attention/backends/utils.py": { + "path": "/vllm/v1/attention/backends/utils.py", + "sha256": "fbc221360d2d54cb21ef3f625dc8711500de345a355801548b4337bb9b8abee0" + }, + "vllm/v1/attention/ops/__init__.py": { + "path": "/vllm/v1/attention/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/ops/chunked_prefill_paged_decode.py": { + "path": "/vllm/v1/attention/ops/chunked_prefill_paged_decode.py", + "sha256": "973db848a790b2e8d99e728b2fc4f44b501bbe58c62747244ddff04cfcf11a85" + }, + "vllm/v1/attention/ops/common.py": { + "path": "/vllm/v1/attention/ops/common.py", + "sha256": "b4b67e7fc0cce471e337d742c097fba06da7563816e8799e27719714e31e1d5b" + }, + "vllm/v1/attention/ops/cp_common.py": { + "path": "/vllm/v1/attention/ops/cp_common.py", + "sha256": "2369181862e96db64b14ef20c5c2e249ed2ea5f3dea2467a2aa388372bb86d9d" + }, + "vllm/v1/attention/ops/dcp.py": { + "path": "/vllm/v1/attention/ops/dcp.py", + "sha256": "a478bdc781460f0582cfaf74d6431f1a826c201f02f39d882d12a96139bc3f28" + }, + "vllm/v1/attention/ops/flashmla.py": { + "path": "/vllm/v1/attention/ops/flashmla.py", + "sha256": "8a40d6e120e3ab25a95fcfeb32b0b5b4c1ea02b984633866628536dcd26ed2e8" + }, + "vllm/v1/attention/ops/flydsl_kernels/__init__.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/attention/ops/flydsl_kernels/tq_decode.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/tq_decode.py", + "sha256": "cc4b7f82897596e0974b3d3a710a1a8bc58c3d22b72cc7f461dd1c4acd2e451b" + }, + "vllm/v1/attention/ops/flydsl_kernels/tq_decode_gqa6.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/tq_decode_gqa6.py", + "sha256": "a983f6d375c325900955e11696dab1e2665770e83f84d51f93d3ed5e1d8880e0" + }, + "vllm/v1/attention/ops/flydsl_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/flydsl_turboquant_decode.py", + "sha256": "7b1dd0ef7c7fb28a6a8831759e00b939ab844d067657155cc11cf75532a22c63" + }, + "vllm/v1/attention/ops/int4_per_token_head.py": { + "path": "/vllm/v1/attention/ops/int4_per_token_head.py", + "sha256": "d91968f280cd8eaed7570ab255f0276b40e833e18a25066d371d9ca8149425f2" + }, + "vllm/v1/attention/ops/merge_attn_states.py": { + "path": "/vllm/v1/attention/ops/merge_attn_states.py", + "sha256": "ad08403d2843fc892f0b0b4b9f5fabb81884556f89f7170dca46ccef498a3539" + }, + "vllm/v1/attention/ops/metadata.py": { + "path": "/vllm/v1/attention/ops/metadata.py", + "sha256": "ca882b84c5aaefb1f77e4d8ea09a00103fbc53defa8671bba036c961c17fc760" + }, + "vllm/v1/attention/ops/paged_attn.py": { + "path": "/vllm/v1/attention/ops/paged_attn.py", + "sha256": "016a95f892ec751c86b37be1e12171bad9f0b4076bbf2219ff336f4e9c503653" + }, + "vllm/v1/attention/ops/pcp.py": { + "path": "/vllm/v1/attention/ops/pcp.py", + "sha256": "dadeff95fe2df2be8028baabeef01b0d2d628cd67de2176915e737ce096de3dd" + }, + "vllm/v1/attention/ops/prefix_prefill.py": { + "path": "/vllm/v1/attention/ops/prefix_prefill.py", + "sha256": "b08ad92db715fc03c11699de3de463d55e411f42f77548e06b41049a61de692f" + }, + "vllm/v1/attention/ops/rocm_aiter_mla_merge.py": { + "path": "/vllm/v1/attention/ops/rocm_aiter_mla_merge.py", + "sha256": "564c66e4877732e48a6f7d52405c43dc952eec0f0ae4353d34886bca056132b9" + }, + "vllm/v1/attention/ops/rocm_aiter_mla_sparse.py": { + "path": "/vllm/v1/attention/ops/rocm_aiter_mla_sparse.py", + "sha256": "feec664be5045fd1ba13b8f6ef83b52c96910ddc78baca0431bcf610c9e8f5cc" + }, + "vllm/v1/attention/ops/triton_attention_helpers.py": { + "path": "/vllm/v1/attention/ops/triton_attention_helpers.py", + "sha256": "35aa993d01345f535d2641cf9dcabb8b64c51b20a19707bc5987e616aaa87ddd" + }, + "vllm/v1/attention/ops/triton_decode_attention.py": { + "path": "/vllm/v1/attention/ops/triton_decode_attention.py", + "sha256": "b9823c65eba22d76abf64dad7d7d16a950f67471c86d6cb5b3e983aaf14381ac" + }, + "vllm/v1/attention/ops/triton_merge_attn_states.py": { + "path": "/vllm/v1/attention/ops/triton_merge_attn_states.py", + "sha256": "f63229162181ab93198550b73a115f1cc1034cfd60e6f58bc8ab3e22a6e8ce60" + }, + "vllm/v1/attention/ops/triton_prefill_attention.py": { + "path": "/vllm/v1/attention/ops/triton_prefill_attention.py", + "sha256": "352c1a4ac86146580040579fb217c2e288268830d6602b735713e154f36d74fe" + }, + "vllm/v1/attention/ops/triton_reshape_and_cache_flash.py": { + "path": "/vllm/v1/attention/ops/triton_reshape_and_cache_flash.py", + "sha256": "6cac51475b8c656992a21b2d150acd3a16a95a7ab7d49aab151a3ef13c24b80d" + }, + "vllm/v1/attention/ops/triton_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/triton_turboquant_decode.py", + "sha256": "8e52678136449e4bbca2195fbcbb87426c955a2b1b8422e7ab9511e45ee5f5c6" + }, + "vllm/v1/attention/ops/triton_turboquant_store.py": { + "path": "/vllm/v1/attention/ops/triton_turboquant_store.py", + "sha256": "6e6e2fe74a307d40f0be786ccbaea76d989e3c7b5985f3144a5218c61bf6d902" + }, + "vllm/v1/attention/ops/triton_unified_attention.py": { + "path": "/vllm/v1/attention/ops/triton_unified_attention.py", + "sha256": "65d0fbcf33d00789df8ca688c0a1c908e710cfaef53471178747ecae11f05829" + }, + "vllm/v1/attention/ops/triton_unified_attention_diffkv.py": { + "path": "/vllm/v1/attention/ops/triton_unified_attention_diffkv.py", + "sha256": "7fa36d7b7441f1c396e0348eac61d691d2e459e5c4c393c4aa262dfb670e68f7" + }, + "vllm/v1/attention/ops/turboquant_soa/__init__.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/__init__.py", + "sha256": "6b43b6fcb2a71c44ceff4ed1edd417a839f4901251ba15831b09ad979baa4984" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode.py", + "sha256": "bf00634191bba14cbf4a23c1d67dc3dcb244c2b8989f08362757b54435830986" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode_v2.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode_v2.py", + "sha256": "28e7ecc15c450d3591983a50c46a03aa6ca6fa99304c17c333940617d9916485" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_store.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_store.py", + "sha256": "dccf93b9fdd34f9b9eacd468e9de35b9d93378594487c335cf50642aaec681f2" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_unified_attention.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_unified_attention.py", + "sha256": "b4b2b5f3985b3a6126fd052e6ec1ed91c610da8a525a9ae7470ac829405bd85c" + }, + "vllm/v1/attention/ops/vit_attn_wrappers.py": { + "path": "/vllm/v1/attention/ops/vit_attn_wrappers.py", + "sha256": "a99d57b58269c7521fa5d7d47af06551f3bab2b5c7358ef78165a7f6e20a92a6" + }, + "vllm/v1/attention/ops/xpu_mla_sparse.py": { + "path": "/vllm/v1/attention/ops/xpu_mla_sparse.py", + "sha256": "d98d17110577c2b7b4d05e07bfdae15faf83321b6342a5daaaecce45b9503f38" + }, + "vllm/v1/attention/selector.py": { + "path": "/vllm/v1/attention/selector.py", + "sha256": "87f653ded7974875183c920e3e4589c28116bcbc99714d1da7cb51ae77c0b182" + }, + "vllm/v1/core/sched/__init__.py": { + "path": "/vllm/v1/core/sched/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/core/sched/async_scheduler.py": { + "path": "/vllm/v1/core/sched/async_scheduler.py", + "sha256": "e586a0ef3c6778be56a93e7f9bb712d4de9de6e7d7fe7e3e1d51dae83ecfc508" + }, + "vllm/v1/core/sched/interface.py": { + "path": "/vllm/v1/core/sched/interface.py", + "sha256": "be6c008664096c5660a8879de72b315bbe479bf1d688be9b25891063ec53a367" + }, + "vllm/v1/core/sched/output.py": { + "path": "/vllm/v1/core/sched/output.py", + "sha256": "3a66c8efaefe10c572f6f33cf1f8aa4610758c945130cad62eb9f7331005677c" + }, + "vllm/v1/core/sched/request_queue.py": { + "path": "/vllm/v1/core/sched/request_queue.py", + "sha256": "4b8d938e5fb8152fe61030b8aa991f983fcac9a405c37ed8908045e05e82ae5e" + }, + "vllm/v1/core/sched/scheduler.py": { + "path": "/vllm/v1/core/sched/scheduler.py", + "sha256": "c1db45f3bbad3a875dd8638331b8870c4380ac1ab4734265ba5c863833a82884" + }, + "vllm/v1/core/sched/utils.py": { + "path": "/vllm/v1/core/sched/utils.py", + "sha256": "1ed988044eb8028c77ede875bd1a5fd05ff6998b455d61e3997d6a3d7fc1c3a7" + }, + "vllm/v1/sample/__init__.py": { + "path": "/vllm/v1/sample/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/sample/logits_processor/__init__.py": { + "path": "/vllm/v1/sample/logits_processor/__init__.py", + "sha256": "1f9b02dae8cf6d44484638037123d3a2dec6b7b9a2bcc9afceef1a9bf3eaedec" + }, + "vllm/v1/sample/logits_processor/builtin.py": { + "path": "/vllm/v1/sample/logits_processor/builtin.py", + "sha256": "6105816ece77e5b1dbee0d07abc90ce039d650bac2ddb85c93280c48b00f2ebe" + }, + "vllm/v1/sample/logits_processor/interface.py": { + "path": "/vllm/v1/sample/logits_processor/interface.py", + "sha256": "171dfc6ef9b5b53128e8eaecc4bdf1de413a706d64bf5be686048f583c66eee1" + }, + "vllm/v1/sample/logits_processor/state.py": { + "path": "/vllm/v1/sample/logits_processor/state.py", + "sha256": "a96411f14362c45f839e181dcb3ac01d5b880812bccb3552fc17863b219f44ac" + }, + "vllm/v1/sample/metadata.py": { + "path": "/vllm/v1/sample/metadata.py", + "sha256": "6582cfe1a240c7ddb975f0ef6dd7dcd28dcf0fc7670394390250013977aa7ffd" + }, + "vllm/v1/sample/ops/__init__.py": { + "path": "/vllm/v1/sample/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/sample/ops/bad_words.py": { + "path": "/vllm/v1/sample/ops/bad_words.py", + "sha256": "0b1d0a9b13b92ddcae2c83393c07a34c0f107813725700dee794caa7fe7f3b12" + }, + "vllm/v1/sample/ops/logprobs.py": { + "path": "/vllm/v1/sample/ops/logprobs.py", + "sha256": "b286f69012a6758bfe9250038b0697294dbffe0d32c6906f284c39f75ee48be3" + }, + "vllm/v1/sample/ops/penalties.py": { + "path": "/vllm/v1/sample/ops/penalties.py", + "sha256": "4debfcf247b3887478d2b9ec98f108756bbed2805462777ef6b56f3bdf4ce682" + }, + "vllm/v1/sample/ops/topk_topp_sampler.py": { + "path": "/vllm/v1/sample/ops/topk_topp_sampler.py", + "sha256": "13ea4359832bc914492330958ec4f5ac140f408b8f410cc05c6eaf7ddcd70be4" + }, + "vllm/v1/sample/ops/topk_topp_triton.py": { + "path": "/vllm/v1/sample/ops/topk_topp_triton.py", + "sha256": "0b5fc337058e22bc28a8530ccec904d6ccd89b9548b02955c657ac429b1669d2" + }, + "vllm/v1/sample/rejection_sampler.py": { + "path": "/vllm/v1/sample/rejection_sampler.py", + "sha256": "0bb9d224887ccb1355e16199005cc23a4afc6fa75156eca419851b7247d99750" + }, + "vllm/v1/sample/sampler.py": { + "path": "/vllm/v1/sample/sampler.py", + "sha256": "f95805b2c6d06218c724826aa5f881a606e8d0a534a566aee7c85948520dd216" + }, + "vllm/v1/sample/thinking_budget_state.py": { + "path": "/vllm/v1/sample/thinking_budget_state.py", + "sha256": "962f8f55210eb0a431cb9c78b013e35f7a7dd58d06d6fb2e7fcff1b457356f8e" + }, + "vllm/v1/worker/__init__.py": { + "path": "/vllm/v1/worker/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/block_table.py": { + "path": "/vllm/v1/worker/block_table.py", + "sha256": "a09b8819e1417b7a186cf3472224e2138fc5d41a291c6692bb7df711b0c44259" + }, + "vllm/v1/worker/cp_utils.py": { + "path": "/vllm/v1/worker/cp_utils.py", + "sha256": "e32625d83a641b8dd8df82e92d1b6fb20af0cdf2e8fbd2fb131aa3c215415448" + }, + "vllm/v1/worker/cpu/__init__.py": { + "path": "/vllm/v1/worker/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/cpu/buffer_utils.py": { + "path": "/vllm/v1/worker/cpu/buffer_utils.py", + "sha256": "e7313fd8c2c76ebfb98d2fa53008bc9691d0f83a7d7c05e87602b5a29fb79e04" + }, + "vllm/v1/worker/cpu/model_runner.py": { + "path": "/vllm/v1/worker/cpu/model_runner.py", + "sha256": "24a1c916550051327dd5893243a6d4200f3824b91b3af8aa6f6c793fd7c68c3e" + }, + "vllm/v1/worker/cpu/shm.py": { + "path": "/vllm/v1/worker/cpu/shm.py", + "sha256": "08491af8ad341399d1375f2d21ad00414d4c89b0a5c03f55de8704914bbfcbd9" + }, + "vllm/v1/worker/cpu_model_runner.py": { + "path": "/vllm/v1/worker/cpu_model_runner.py", + "sha256": "92111aba92f00571f1a3c4c6e43cf1da6ccb4d2afac2f4d5abc018a4a6e7e8bd" + }, + "vllm/v1/worker/cpu_worker.py": { + "path": "/vllm/v1/worker/cpu_worker.py", + "sha256": "a8051b9e510ef0af9cc34004f2cbe5c0f902bd0cebc32c9464e744344dfdf849" + }, + "vllm/v1/worker/dp_utils.py": { + "path": "/vllm/v1/worker/dp_utils.py", + "sha256": "8cd19f1bfbc5c4f6ec60df89aea7c8a19b400ebc264f372b103014152e92158c" + }, + "vllm/v1/worker/ec_connector_model_runner_mixin.py": { + "path": "/vllm/v1/worker/ec_connector_model_runner_mixin.py", + "sha256": "fe9b11cebb8562f1bfe98b98a5647b2b081a6e424cb60d4ffe2412c91a99215e" + }, + "vllm/v1/worker/encoder_cudagraph.py": { + "path": "/vllm/v1/worker/encoder_cudagraph.py", + "sha256": "6a08d3779bca1b47dbf9daf6eafe2d3c70dbcb8aeb7d63ba7efacc68241ee3bc" + }, + "vllm/v1/worker/encoder_cudagraph_defs.py": { + "path": "/vllm/v1/worker/encoder_cudagraph_defs.py", + "sha256": "bb7be050fcaa8868e7816c84caec875da57050d65fe7eaf00f3d41473df25e3a" + }, + "vllm/v1/worker/gpu/__init__.py": { + "path": "/vllm/v1/worker/gpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/async_utils.py": { + "path": "/vllm/v1/worker/gpu/async_utils.py", + "sha256": "77e17a4570ead2be30ae9b00888cf077a3b873018c12ca0549b853bfda02c1ba" + }, + "vllm/v1/worker/gpu/attn_utils.py": { + "path": "/vllm/v1/worker/gpu/attn_utils.py", + "sha256": "b9b81e59dda2720b1f9c434471381f879228832443e52756e469b4ad4905888f" + }, + "vllm/v1/worker/gpu/block_table.py": { + "path": "/vllm/v1/worker/gpu/block_table.py", + "sha256": "61c004315d5af7e7eae4e2a9e6be92ea82c520327690a7f55a73bb9ce95f520a" + }, + "vllm/v1/worker/gpu/buffer_utils.py": { + "path": "/vllm/v1/worker/gpu/buffer_utils.py", + "sha256": "6597f701a30261bf250e9ad5a29737264624a1caa20527aeea0dad630325b093" + }, + "vllm/v1/worker/gpu/cp_utils.py": { + "path": "/vllm/v1/worker/gpu/cp_utils.py", + "sha256": "456c1bb7e262d99ff555522a4f134e5a9b42aee23290be25455eaef36ee8eaaf" + }, + "vllm/v1/worker/gpu/cudagraph_utils.py": { + "path": "/vllm/v1/worker/gpu/cudagraph_utils.py", + "sha256": "6e9c042890603535e300a40df8ee159dbed1058a64a83ae50ff0329e332e05ff" + }, + "vllm/v1/worker/gpu/dp_utils.py": { + "path": "/vllm/v1/worker/gpu/dp_utils.py", + "sha256": "e26867bc89e6bfc933cabc5ed13e5dc7b8d2d3030118ca1ca64c8785dabc0fc1" + }, + "vllm/v1/worker/gpu/ec_connector.py": { + "path": "/vllm/v1/worker/gpu/ec_connector.py", + "sha256": "2afe6e641f4ae3eb3b8da336c74eaa7479bf617b27cfb39a1fcbe487686f0a08" + }, + "vllm/v1/worker/gpu/eplb_utils.py": { + "path": "/vllm/v1/worker/gpu/eplb_utils.py", + "sha256": "1829fac11464aed4649179b302df198de51b95d0589f4e56bea305a876a63e26" + }, + "vllm/v1/worker/gpu/input_batch.py": { + "path": "/vllm/v1/worker/gpu/input_batch.py", + "sha256": "d5dd956eb319bd69dd9e762047833d81ad40b21fce619fcb2133759e73620694" + }, + "vllm/v1/worker/gpu/kv_connector.py": { + "path": "/vllm/v1/worker/gpu/kv_connector.py", + "sha256": "b89a4333f1e552d86e1815674b59e9f1335f0f49c0a7b46082439076f62c6a81" + }, + "vllm/v1/worker/gpu/lora_utils.py": { + "path": "/vllm/v1/worker/gpu/lora_utils.py", + "sha256": "1e90eddd9ddb4ca55e574bb28e87ae3a6f6750175a62d373102426543f4ccd66" + }, + "vllm/v1/worker/gpu/metrics/__init__.py": { + "path": "/vllm/v1/worker/gpu/metrics/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/metrics/logits.py": { + "path": "/vllm/v1/worker/gpu/metrics/logits.py", + "sha256": "ea058d7510a077a55f8ac7e4c3d596508346244e908cb372865d7159f62edc89" + }, + "vllm/v1/worker/gpu/mm/__init__.py": { + "path": "/vllm/v1/worker/gpu/mm/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/mm/encoder_cache.py": { + "path": "/vllm/v1/worker/gpu/mm/encoder_cache.py", + "sha256": "89c500338fddbeee7c4fca978a3a7c4c566a03e848e399d303fbee3c80631cd2" + }, + "vllm/v1/worker/gpu/mm/encoder_runner.py": { + "path": "/vllm/v1/worker/gpu/mm/encoder_runner.py", + "sha256": "0981e352d70301b7154a217a48665ffe35f215d053ec5740c2515a3e1e11b4e6" + }, + "vllm/v1/worker/gpu/mm/lora.py": { + "path": "/vllm/v1/worker/gpu/mm/lora.py", + "sha256": "a3eddfad6ad64de276964240c28dc080888df4a56dd5eac18f89428f2cbb7a01" + }, + "vllm/v1/worker/gpu/mm/rope.py": { + "path": "/vllm/v1/worker/gpu/mm/rope.py", + "sha256": "0924375bcb367267e783b57dd2ad9de1189d97025ce4313baaa54f2911eaaf1e" + }, + "vllm/v1/worker/gpu/model_runner.py": { + "path": "/vllm/v1/worker/gpu/model_runner.py", + "sha256": "174c93db921c23cf0396eee4764be25b2bd2d4b6a06e9fa41ce3598b884ce8ce" + }, + "vllm/v1/worker/gpu/model_states/__init__.py": { + "path": "/vllm/v1/worker/gpu/model_states/__init__.py", + "sha256": "07815d0b788fc88185772f581bbf892a675259f9288375571f29887622f8d93c" + }, + "vllm/v1/worker/gpu/model_states/default.py": { + "path": "/vllm/v1/worker/gpu/model_states/default.py", + "sha256": "bb614f814780f052e869f9acf31dfbfa68718ee7dc6252eefa901b5730ee8a2a" + }, + "vllm/v1/worker/gpu/model_states/encoder_decoder.py": { + "path": "/vllm/v1/worker/gpu/model_states/encoder_decoder.py", + "sha256": "a5868059d8af672548b41d0e623e884320e6ed61e6aaca2d2828ff5be0356f2f" + }, + "vllm/v1/worker/gpu/model_states/encoder_only.py": { + "path": "/vllm/v1/worker/gpu/model_states/encoder_only.py", + "sha256": "84e96b55a2639e2a73fa4a0308acc89c8d053dc715481180b237e0196dcef99f" + }, + "vllm/v1/worker/gpu/model_states/interface.py": { + "path": "/vllm/v1/worker/gpu/model_states/interface.py", + "sha256": "5675b6fedc7403a9ab410b1e5565974e78fac23c42ab4253ae1da52d6e09b594" + }, + "vllm/v1/worker/gpu/model_states/mamba_hybrid.py": { + "path": "/vllm/v1/worker/gpu/model_states/mamba_hybrid.py", + "sha256": "573e130ac5587d4822fabf97adad1ad0fda02ff83c5e70df879a5bb175ae845c" + }, + "vllm/v1/worker/gpu/model_states/mm_pruning.py": { + "path": "/vllm/v1/worker/gpu/model_states/mm_pruning.py", + "sha256": "b150940b12ae76048f050a8eeb54d532bbdc530a18ffbf320ddeeb0cfaa90f93" + }, + "vllm/v1/worker/gpu/model_states/prompt_embeds.py": { + "path": "/vllm/v1/worker/gpu/model_states/prompt_embeds.py", + "sha256": "11f9e270925c2df6a505557605ac2b859bb145cf3420b0111e7482a1c544f9b1" + }, + "vllm/v1/worker/gpu/model_states/recoverssm.py": { + "path": "/vllm/v1/worker/gpu/model_states/recoverssm.py", + "sha256": "b4b660e62eaf33f4fe8271f83ed1fb6de6bc08f800a8073b27803e42fb29a645" + }, + "vllm/v1/worker/gpu/pcp_manager.py": { + "path": "/vllm/v1/worker/gpu/pcp_manager.py", + "sha256": "2d80df0ed5b18a2069f9d0689cb59923ffe324ba200fcafe242da23da3a6ddaa" + }, + "vllm/v1/worker/gpu/pool/__init__.py": { + "path": "/vllm/v1/worker/gpu/pool/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/pool/pooling_runner.py": { + "path": "/vllm/v1/worker/gpu/pool/pooling_runner.py", + "sha256": "f8463f7648cce0f3f29418a4d9fee61634ead760957cf236d06d61cf8cd986e7" + }, + "vllm/v1/worker/gpu/pp_utils.py": { + "path": "/vllm/v1/worker/gpu/pp_utils.py", + "sha256": "dadeef0bebf61d0ad44a28d06372208ec4e6389224d6017f412683b026bdbb5c" + }, + "vllm/v1/worker/gpu/sample/__init__.py": { + "path": "/vllm/v1/worker/gpu/sample/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/sample/bad_words.py": { + "path": "/vllm/v1/worker/gpu/sample/bad_words.py", + "sha256": "8d3cbd5613398260314d94739d8ee0e1ac0c22abf2f960f541d3c0d4e39d360b" + }, + "vllm/v1/worker/gpu/sample/batch_shard.py": { + "path": "/vllm/v1/worker/gpu/sample/batch_shard.py", + "sha256": "c30274a3a04e6a03e89be9cd7c62de602b1aba4d412f64540ab6201036de3928" + }, + "vllm/v1/worker/gpu/sample/gumbel.py": { + "path": "/vllm/v1/worker/gpu/sample/gumbel.py", + "sha256": "3ec1df510bdad13e8b0a457b5b67c98affdf6e57369e56cb471246cc8f40dd34" + }, + "vllm/v1/worker/gpu/sample/logit_bias.py": { + "path": "/vllm/v1/worker/gpu/sample/logit_bias.py", + "sha256": "9e80a3fe6f3c7474723408cfff52183f4585fdeedd9c2312843ee98d0b12724c" + }, + "vllm/v1/worker/gpu/sample/logprob.py": { + "path": "/vllm/v1/worker/gpu/sample/logprob.py", + "sha256": "f47479a818192acb6b297c79fa67a3b2f9820e3492a394d5adda777e9b7c832e" + }, + "vllm/v1/worker/gpu/sample/min_p.py": { + "path": "/vllm/v1/worker/gpu/sample/min_p.py", + "sha256": "4cb5e2f45e1ced6f9685283a7a5c8cfd7204d9a249822e866cfff756c7f04f62" + }, + "vllm/v1/worker/gpu/sample/output.py": { + "path": "/vllm/v1/worker/gpu/sample/output.py", + "sha256": "d6e298c0f197d487a8faaf7200f500fa83df1d7a4bbf4339cadd6a18008f7f9c" + }, + "vllm/v1/worker/gpu/sample/penalties.py": { + "path": "/vllm/v1/worker/gpu/sample/penalties.py", + "sha256": "46c29434caf5f415129ef4a9bb2b8d4f62d2765596e3e07f73ad2b198c7def1b" + }, + "vllm/v1/worker/gpu/sample/prompt_logprob.py": { + "path": "/vllm/v1/worker/gpu/sample/prompt_logprob.py", + "sha256": "4cf22d390e7bf59e44c458cff7180268db63e95d06af2f1e14d720a2d77c9663" + }, + "vllm/v1/worker/gpu/sample/sampler.py": { + "path": "/vllm/v1/worker/gpu/sample/sampler.py", + "sha256": "832c9945d201a1e730ff9b4b52076aa83bd4a5064e1e4cfea952cf84d4a8d1f0" + }, + "vllm/v1/worker/gpu/sample/states.py": { + "path": "/vllm/v1/worker/gpu/sample/states.py", + "sha256": "4e3671f93695ba5a48fad7d2d13beb231ac8741034904ed5a15d9f7b9b86662e" + }, + "vllm/v1/worker/gpu/sample/thinking_budget.py": { + "path": "/vllm/v1/worker/gpu/sample/thinking_budget.py", + "sha256": "020513e1d3406f367de6ad995a95055008fd0c28f2873647e8283c9870e22404" + }, + "vllm/v1/worker/gpu/sample/trace_replay.py": { + "path": "/vllm/v1/worker/gpu/sample/trace_replay.py", + "sha256": "d2a7d3b3b55379efabe4740a4b7f14030126dc11be36f6ea974164ce42316a50" + }, + "vllm/v1/worker/gpu/sample/watermark.py": { + "path": "/vllm/v1/worker/gpu/sample/watermark.py", + "sha256": "a3581458169dab9153eb09fd67218e0ee5585406537a9de80ad528ae62b030c0" + }, + "vllm/v1/worker/gpu/shutdown.py": { + "path": "/vllm/v1/worker/gpu/shutdown.py", + "sha256": "bb470f14b17c7e52571ef8938b2a9527e7c2846852ae8a3a94b69cd1c30aa4b1" + }, + "vllm/v1/worker/gpu/spec_decode/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/__init__.py", + "sha256": "1f1f84bfe6f4f5af3a7e21a7a8716ecf7b9013da1d03327668a3ee36afc24c32" + }, + "vllm/v1/worker/gpu/spec_decode/acceptance_estimator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/acceptance_estimator.py", + "sha256": "505b843bdd75928b03793b395b47b8be914bd7fe2a3351c8ec04339baeebb1c2" + }, + "vllm/v1/worker/gpu/spec_decode/adaptive_verification.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/adaptive_verification.py", + "sha256": "276b2fec56758a94c71b717f6786b8a6f126db2e20cf964350202feee61a0a39" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py", + "sha256": "13392ef0a9ed59eb9c2b2bad43d7c61beb212a8805849e46b5130c230275d0a5" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/speculator.py", + "sha256": "5b97f54e20ddf65b98e939832d050745f67ef43cfa145786da300f1a8322e3c6" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/cudagraph.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/cudagraph.py", + "sha256": "beab567ae2df6a2ba2cd92fe7ee452c6b959b8a7037a4b5f493993a1824619bb" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/speculator.py", + "sha256": "f9c100f42f9326e48eb84e89281897e859ba761943f54d593523555ccd98dc63" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/utils.py", + "sha256": "53d2c3ad474d290d2c6df027446bbd80ac7447684e5242ab2c3c5337d2abd383" + }, + "vllm/v1/worker/gpu/spec_decode/dflash2/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash2/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/dflash2/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash2/speculator.py", + "sha256": "b70043550938a1df9aecc85d8c8224c38c929ca34f68834572f6e723854d2027" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/speculator.py", + "sha256": "dcf4abdedbd2bddd0d76be198ccf5b4e467c46f645038c35fcab821491a35b03" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/utils.py", + "sha256": "86af2bf30604a184312e8f076097b91ecfec704f409f9d68d634b03d6b318070" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/eagle3_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/eagle3_utils.py", + "sha256": "201ee875fcc3d076a8fc1f3876dcbf85736b221a368555243a8987ff26a1674e" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/speculator.py", + "sha256": "746e318a4f266d75522ff7f3731ea9b4527b7b4824f71364d1a62184ea1f7b3d" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/utils.py", + "sha256": "94de6f55a1761f24f4aa1388cbc3b3763d4ab3ee53260330056ad31ce0b78236" + }, + "vllm/v1/worker/gpu/spec_decode/extract_hidden_states.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/extract_hidden_states.py", + "sha256": "93c4233be7b2d2290b33902ea9b3bb5274c11701830851d03967a22144536e2d" + }, + "vllm/v1/worker/gpu/spec_decode/gemma4/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/gemma4/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/gemma4/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/gemma4/speculator.py", + "sha256": "9991210d7babd2caf2cd10797ca8688543dedeafbc3b86bc7c979c1a6ae9f949" + }, + "vllm/v1/worker/gpu/spec_decode/mtp/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/mtp/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/mtp/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/mtp/speculator.py", + "sha256": "926d6c9ffdb368c971647911a60493820d056ce236fcae9d94a42fa2e006255d" + }, + "vllm/v1/worker/gpu/spec_decode/multi_module_mtp/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/multi_module_mtp/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/multi_module_mtp/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/multi_module_mtp/speculator.py", + "sha256": "d9d4735b9b33829332b0e845b6d3073b2f0436045ed693b25c6434f351644127" + }, + "vllm/v1/worker/gpu/spec_decode/rejection_sampler.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/rejection_sampler.py", + "sha256": "030db5bfca162cc1f305112f299de5d6d61c59d3ed0807fee46575441ca4086d" + }, + "vllm/v1/worker/gpu/spec_decode/rejection_sampler_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/rejection_sampler_utils.py", + "sha256": "214b61fa0abe88573beb779872c035b3954e5651a85bd438d99ee5905d3a62ec" + }, + "vllm/v1/worker/gpu/spec_decode/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/speculator.py", + "sha256": "3a1ab15bf8b20918852eb835fe9755046e99dcbac6ba6ca3d414949fc8bc695a" + }, + "vllm/v1/worker/gpu/spec_decode/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/utils.py", + "sha256": "282f2929eddae9ca7312269f799be07472334b6df9fd91878b5e839ec05e418c" + }, + "vllm/v1/worker/gpu/states.py": { + "path": "/vllm/v1/worker/gpu/states.py", + "sha256": "99418f5df43ca612ded72609fee011620b065b2cab2f249ccb387096bf4ae71a" + }, + "vllm/v1/worker/gpu/structured_outputs.py": { + "path": "/vllm/v1/worker/gpu/structured_outputs.py", + "sha256": "18a10532db7e66b55e334acacd1fd989ad6361adf31dd0de9a9a65e23db25951" + }, + "vllm/v1/worker/gpu/ubatch_utils.py": { + "path": "/vllm/v1/worker/gpu/ubatch_utils.py", + "sha256": "5092e2e58af0561c8dc12e62847cfc6dda9ca20dfbd33e7f0cd77a83fe87f7c5" + }, + "vllm/v1/worker/gpu/warmup.py": { + "path": "/vllm/v1/worker/gpu/warmup.py", + "sha256": "423ac32d58fe008c228cfa223e4fcebfcf87e3463a9dbdf80a083c0578d73723" + }, + "vllm/v1/worker/gpu_input_batch.py": { + "path": "/vllm/v1/worker/gpu_input_batch.py", + "sha256": "18cf455c9d0eea61cc581c7932f2e6cd09786914e82dd35eef1c1430da359a0f" + }, + "vllm/v1/worker/gpu_model_runner.py": { + "path": "/vllm/v1/worker/gpu_model_runner.py", + "sha256": "87c29d08c0bbf66993d8b984811e7325e35e6436242a773feb55ec88f16b2c51" + }, + "vllm/v1/worker/gpu_ubatch_wrapper.py": { + "path": "/vllm/v1/worker/gpu_ubatch_wrapper.py", + "sha256": "4233cfbe8c9884b042c4363890108f616483b694ebe9a6e69578dcf89c6dac5c" + }, + "vllm/v1/worker/gpu_worker.py": { + "path": "/vllm/v1/worker/gpu_worker.py", + "sha256": "6994436e4547c0996ab555b3e814e8ccea26b650dfc1b378b97d640745309347" + }, + "vllm/v1/worker/kv_connector_model_runner_mixin.py": { + "path": "/vllm/v1/worker/kv_connector_model_runner_mixin.py", + "sha256": "e1cc76d065a7e60aacddb190ae795a480b65cd02ba71a1fc699a02a85c1a3de2" + }, + "vllm/v1/worker/lora_model_runner_mixin.py": { + "path": "/vllm/v1/worker/lora_model_runner_mixin.py", + "sha256": "fef6092a15d8d37f6fa22495e6106e2e5280180908d61ce43d9ff5bf4eef3f2f" + }, + "vllm/v1/worker/mamba_utils.py": { + "path": "/vllm/v1/worker/mamba_utils.py", + "sha256": "23fdaa4e8f63ee8f938eaa1a2b39f803cb04fa6ecd69789563254b1a0691413a" + }, + "vllm/v1/worker/mm_encoder_model_runner.py": { + "path": "/vllm/v1/worker/mm_encoder_model_runner.py", + "sha256": "780c41be84ad022205c21c1decb6bb8d5afb03bc7be120c1f7df03b710acc3d7" + }, + "vllm/v1/worker/sentinel/__init__.py": { + "path": "/vllm/v1/worker/sentinel/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/sentinel/gpu_worker_sentinel.py": { + "path": "/vllm/v1/worker/sentinel/gpu_worker_sentinel.py", + "sha256": "3959b8619d052c5dd247815074e03ec21ec9b43cc424ff2d296abc19b227b852" + }, + "vllm/v1/worker/startup_plan.py": { + "path": "/vllm/v1/worker/startup_plan.py", + "sha256": "84bcbb4f7a9fd7c8d10c9c895aadd9673d44c767b9132368d11eb5e017afe86b" + }, + "vllm/v1/worker/ubatch_utils.py": { + "path": "/vllm/v1/worker/ubatch_utils.py", + "sha256": "b34dce551b5195c414e6a3a997c75961cc7a17f24c7c980487fe3d3e2ba7a798" + }, + "vllm/v1/worker/ubatching.py": { + "path": "/vllm/v1/worker/ubatching.py", + "sha256": "40391241c564feb5f16c77898ae6ae152ed6e71a4682e2a406387785d8de02d7" + }, + "vllm/v1/worker/utils.py": { + "path": "/vllm/v1/worker/utils.py", + "sha256": "0ca3ec6bf4d20076145b7fe64e564962adebedc8f75a856b517ba0b2f2d77acf" + }, + "vllm/v1/worker/worker_base.py": { + "path": "/vllm/v1/worker/worker_base.py", + "sha256": "4a1a5266b912fe97991d8dc89d92b923990da9f6cb4b817d00d52e9c0d26dd7c" + }, + "vllm/v1/worker/workspace.py": { + "path": "/vllm/v1/worker/workspace.py", + "sha256": "d21c08167d1d0d1c0cddaa80453a53a0b4dec5d81b5a537c94a21324344976b3" + }, + "vllm/v1/worker/xpu_model_runner.py": { + "path": "/vllm/v1/worker/xpu_model_runner.py", + "sha256": "07fa0390d28f2b8c3c3c0019eb9c3b126e2397aea268ba47c889f06b423deb23" + }, + "vllm/v1/worker/xpu_worker.py": { + "path": "/vllm/v1/worker/xpu_worker.py", + "sha256": "711b56432506b58041cd86e71320c3960413f7bd61061990b66488421d81cfc3" + } + }, + "prefix": "", + "pth": { + "/__editable__.megatron_core-0.16.0rc0.pth": "d55c9b64480b34aae3d4d31e7706b93391c969dec6e0498e50963b03445a57b0", + "/__editable__.rl_kernel-0.1.0.pth": "1454c4987b35762a0d189d4e901c5d077fde62a1944fbaabecea230e57f3923a", + "/__editable__.vime-0.3.2.pth": "77eec5d06d628cb952e65edd813ca88d8db67ccc785083e1b7b29011b92bec4f", + "/distutils-precedence.pth": "2638ce9e2500e572a5e0de7faed6661eb569d1b696fcba07b0dd223da5f5d224", + "/qwen3_next_cuda_runtime.pth": "e0d3ab57dd3ff4f5d55fcf76e83c549cc00b3c813e6f717c540d5ded79fa2f49", + "/qwen3_next_megatron_source.pth": "8556ac057538e82856cb76cbbc954f58312a3f45373daec3eec826031cfd2709", + "/__editable__.rl_kernel-0.1.0.pth": "1454c4987b35762a0d189d4e901c5d077fde62a1944fbaabecea230e57f3923a", + "/distutils-precedence.pth": "2638ce9e2500e572a5e0de7faed6661eb569d1b696fcba07b0dd223da5f5d224", + "/nvidia_cutlass_dsl_packages.pth": "cc710b99ddb3d76361a70461461d274212a979d00c381d821fce5bb3ad9cf246" + }, + "pyvenv_cfg_sha256": "48579f2c6d35c3d535c2690d7d426587c4b8e92021463f0266b38d35dfbbb834", + "sources": { + "/Megatron-LM-training": { + "patch_sha256": "f66035f12501aa1d08e8884e0dea5a22d59825d717aeda73c3e83876e3efd79f", + "path": "/Megatron-LM-training", + "tree": "731fc44a368d6cac8c6171a29d5c687ff0d95bd1" + }, + "/vime": { + "patch_sha256": "66949839d4c18329444f4f9f6dcd702b53ce1b94e9aa15ed111f28743bfaa4b9", + "path": "/vime", + "tree": "f5174e67dbcdaef983eecd45f215fef2d8429dd0" + } + }, + "version": "3.12.14 | packaged by Anaconda, Inc. | (main, Aug 27 2026, 14:46:43) [GCC 14.3.0]" + }, + "sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca" + }, + "gpu_uuids": [ + "f84b0ae3-604b-7194-e772-280f5d102d46", + "225c7841-f606-0248-cce4-31f3ae0b215d", + "46fa983d-5878-1d92-4a61-197f569e8b01", + "79936bd2-1377-8dcf-bdb1-e6e772d0e0f3" + ], + "execution_gpus": 4 +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/train1/l2_matrix.json b/docs/usage/evidence/qwen3-next-chain-b200/train1/l2_matrix.json new file mode 100644 index 000000000..0e16ea019 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/train1/l2_matrix.json @@ -0,0 +1,2236 @@ +{ + "schema_version": 1, + "status": "passed", + "scope": "qwen3_next_full_model_l2", + "identity": { + "scheduler_profile_certificate": { + "path": "/result.json", + "sha256": "bf3a74423b3636145cad903d5cf9d70f2c3c777b019a24d125c2ca79f8b1e8d9" + }, + "source_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "checkpoint": "/training-state/exports/update-1-f87a0894d7e3487ab846e9c14a93ebd7", + "weight_version": "update-1", + "checkpoint_identity": { + "schema_version": 1, + "kind": "qwen3_next_native_hf_export", + "status": "complete", + "weight_version": "update-1", + "step": 1, + "export_id": "update-1-f87a0894d7e3487ab846e9c14a93ebd7", + "base_checkpoint": "", + "base_checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "training_identity": { + "scheduler_profile_certificate": { + "path": "/result.json", + "sha256": "bf3a74423b3636145cad903d5cf9d70f2c3c777b019a24d125c2ca79f8b1e8d9" + }, + "source_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "checkpoint": "", + "weight_version": "baseline", + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "architecture_layers": 48, + "weights_dtype": "bfloat16", + "recurrent_state_dtype": "float32", + "run_id": "20261009T041838Z-train1-c67ec144-39e7db9f", + "execution_id": "39e7db9f488142f4b52872e05728c390", + "fixture_sha256": "7c98e4e17cc24bd0c5f65f6515d58a9dfc947afcdb6d4956bd3fa05f24bb28b6" + }, + "architecture_layers": 48, + "weights_dtype": "bfloat16", + "model_rank_sha256": [ + "b12ccd72c30d1e2b1f6b2d9dcea802b7f56fd9d1a3d2d12f9270a7e74477c239", + "fff3429154925b704ae6a0e32e201a6668010b1422f801719c4cb292e959270e", + "94de326423999244a6e2c1b8529de8fe99d541ae6be36333bd4fe685879b919a", + "bc93233b2211d6b646b7aeb0025f1ae8e03cec4c8467efb6ef64bbca5f0c6e2c" + ], + "model_identity_method": "native_parameter_hashes_after", + "base_passthrough": { + "prefixes": [ + "mtp." + ], + "tensor_count": 1553, + "shards": { + "model-base-passthrough-00001-of-00001.safetensors": { + "source": "model-00041-of-00041.safetensors", + "tensor_count": 1553 + } + }, + "names_sha256": "622080f1d1b3060957aab28c98f5a728d0c1e9b44d624474a752d0dc9a90566d" + }, + "files": { + "STAGING.json": { + "size": 27893, + "sha256": "4a6c84a103abb807fdf9266f4700fbd39fdb8e23bd27aa68c7bbc71cdd46a167" + }, + "config.json": { + "size": 1154, + "sha256": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303" + }, + "generation_config.json": { + "size": 221, + "sha256": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217" + }, + "merges.txt": { + "size": 1671839, + "sha256": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3" + }, + "model-00001-of-00147.safetensors": { + "size": 4216, + "sha256": "f297513e1c5e05a652b167b82a9e2c48ab5eab9ccc489d9b0db6da892675adbe" + }, + "model-00002-of-00147.safetensors": { + "size": 1073804696, + "sha256": "37d22679fabb76cdd0c8673d50e8b5dd58e7789be9572fb671cf90884280233b" + }, + "model-00003-of-00147.safetensors": { + "size": 2147609384, + "sha256": "3866e07b97f72f4333b55066a26b085b518ad23d4cb3a9a559c5d7442353170a" + }, + "model-00004-of-00147.safetensors": { + "size": 75839416, + "sha256": "e4657ed85147879ab2e2fc76bff5864274b59b5cd65a54d61505eafd3ab94b5d" + }, + "model-00005-of-00147.safetensors": { + "size": 1073804696, + "sha256": "7e788cd4fc6a29defad7add5219ef6c3a58b6e0b8818a93d91f7f1c12b19e7a7" + }, + "model-00006-of-00147.safetensors": { + "size": 2147609384, + "sha256": "826a2265753c06a5daa89c4cb6099498ef8cd3772f3e5d25466341d4339e5b8a" + }, + "model-00007-of-00147.safetensors": { + "size": 75839416, + "sha256": "af721b986d7a2a4d9e2c72544395216d6db56a781e246672aba9bfe95557b4dd" + }, + "model-00008-of-00147.safetensors": { + "size": 1073805208, + "sha256": "e83ff33619ee72d3de680abcb38b077308faf83d6bcacd5daa5465a7b987386c" + }, + "model-00009-of-00147.safetensors": { + "size": 2147610408, + "sha256": "93fe2ea6a8c0d68084fd2ff487e3cd34ea078ac17683351af90f0ae58d8a9dcc" + }, + "model-00010-of-00147.safetensors": { + "size": 75839432, + "sha256": "e64a44fcfc2b4587addc5347931ad654d2de9d1bcf8aa0893540dc3eccebb119" + }, + "model-00011-of-00147.safetensors": { + "size": 1073805208, + "sha256": "e506535b280c1ba9968ff24e01508056aa7cb989c471b5746015ec49275a0e69" + }, + "model-00012-of-00147.safetensors": { + "size": 2147610408, + "sha256": "2e14988c93bbfc4f822743150fda6b83a4a5b345ad83311d702694cd76304d24" + }, + "model-00013-of-00147.safetensors": { + "size": 62929376, + "sha256": "2b5ab3f712c4695cc9e5d27d80321d99132091542308f49212191d9fb7032b94" + }, + "model-00014-of-00147.safetensors": { + "size": 1073805208, + "sha256": "a0ea6b0b541d0efc410a7a582d20676c43093db396facabd857793b50c34fe60" + }, + "model-00015-of-00147.safetensors": { + "size": 2147610408, + "sha256": "07f3efc5832ea624800a0ff79746a2332b73182eca2f580cffacc11ae2e4fd66" + }, + "model-00016-of-00147.safetensors": { + "size": 75839432, + "sha256": "3fc3f6b7e893efcb32af42f24bfe6384cd72e97d1aea59cc45b5b103b9cdcd1a" + }, + "model-00017-of-00147.safetensors": { + "size": 1073805208, + "sha256": "3563f517ed39056cc58655e767a9da3e8ae2e9a4d8705bd23e8242e2f624ebef" + }, + "model-00018-of-00147.safetensors": { + "size": 2147610408, + "sha256": "254d9270c923eabad355541c2701c646654938ba9a873bf8dd287890c47ed723" + }, + "model-00019-of-00147.safetensors": { + "size": 75839432, + "sha256": "85c0b8b9bf8f12aa110c5360c7588fe95b3f3b02ebbc2e313afcb2c2fe0fd184" + }, + "model-00020-of-00147.safetensors": { + "size": 1073805208, + "sha256": "e57ee60dcd88c4d0678b8d59c4df86a98a4b87b1682691557a2c423a283f5a6a" + }, + "model-00021-of-00147.safetensors": { + "size": 2147610408, + "sha256": "b5db2b184974a08b48674dab1fa8abeaecb86a2554da5dd5f0d725af4ade6659" + }, + "model-00022-of-00147.safetensors": { + "size": 75839432, + "sha256": "cfa531071b643d8b48bfb7ce0d7817b98a4ab70a5e3e2417353880fd2b85818d" + }, + "model-00023-of-00147.safetensors": { + "size": 1073805208, + "sha256": "8c38af5fc89be3c444fa9eb308e86c547781f86b452b277e6ef047fc6cfb417a" + }, + "model-00024-of-00147.safetensors": { + "size": 2147610408, + "sha256": "c5bda9e186aece5ff7872f98e2f69a2a8d16122e1d4c7befa47bf0bbe3e5325d" + }, + "model-00025-of-00147.safetensors": { + "size": 62929376, + "sha256": "0dd46fd4f9af1704f9590579da6a065d90ffdcb97c7c83d36ef3a5658503647a" + }, + "model-00026-of-00147.safetensors": { + "size": 1073805208, + "sha256": "0f906e7916ffdea886e756ffb03f95d2cd714d9e2994529094029071d58822dd" + }, + "model-00027-of-00147.safetensors": { + "size": 2147610408, + "sha256": "e3bde1d0b2fb7b71ea3e2797e32411d62e697bf1b419548eb44e067dd5d2969f" + }, + "model-00028-of-00147.safetensors": { + "size": 75839432, + "sha256": "5128e0d384ce75e766a25d65f73aee3ea2ad433516b2a8b0232e075f96eaff82" + }, + "model-00029-of-00147.safetensors": { + "size": 1073805208, + "sha256": "7750255337e0095edb6e3ee2ab155ea6f2dd18f92ad0c1a883d0df4884a84f1a" + }, + "model-00030-of-00147.safetensors": { + "size": 2147610408, + "sha256": "cd18b7d0321edd1689791e97981d7b5e3bde22603c36daa46d9be732c7fcaeb6" + }, + "model-00031-of-00147.safetensors": { + "size": 75839432, + "sha256": "d8869991166009231e9c5f731876b3bda52fd9025d32c5876da2f8114fb4bec4" + }, + "model-00032-of-00147.safetensors": { + "size": 1073805208, + "sha256": "9658d7f8920d4933772944c9b4916670c0ad53fa74a51839d97551b479235b05" + }, + "model-00033-of-00147.safetensors": { + "size": 2147610408, + "sha256": "8c4169c3c8354445acfd504fc3fd1708f1552bf8a44009cbb1b51e3c079cf465" + }, + "model-00034-of-00147.safetensors": { + "size": 75839432, + "sha256": "b4511a01211d2a56cc8e9c8c50c4037da787068ef03ebd88856dc9a3c978b882" + }, + "model-00035-of-00147.safetensors": { + "size": 1073805208, + "sha256": "3865ed62c7e514d0f87a6cfd51f945583a5a5560471682f2e7a30b82479aa845" + }, + "model-00036-of-00147.safetensors": { + "size": 2147610408, + "sha256": "ec9666289339b043e61227b1955d29416bcf160d7f3a688905fdb2fc9387b58e" + }, + "model-00037-of-00147.safetensors": { + "size": 62929376, + "sha256": "1420b2f836c269f452c4a10badde98c0adad8abc20706a2333fc7757e4e1a4c3" + }, + "model-00038-of-00147.safetensors": { + "size": 1073804696, + "sha256": "4cee0f1802abeba49f6eb8588ae0c3357150abb0b481f4a47781df1dc9521251" + }, + "model-00039-of-00147.safetensors": { + "size": 2147609384, + "sha256": "9ea2d163167ec4f38cfb10d083e7b74647f7f2ff458f8001a1635d4b37b26c45" + }, + "model-00040-of-00147.safetensors": { + "size": 75839416, + "sha256": "10b8bef0f3ae1b8562269cb5d5745a1226cb78f5e7ddb22e2a0e8aca76cc5ea6" + }, + "model-00041-of-00147.safetensors": { + "size": 1073805208, + "sha256": "00029edc940e0f6099fcc39ad003127823e8633fef855dd7f92a1a09f4c10f3c" + }, + "model-00042-of-00147.safetensors": { + "size": 2147610408, + "sha256": "b0cac5623965ccdf5babd9f6b594afe9cc6c0e1aa58322d0c5d86ec42d24438f" + }, + "model-00043-of-00147.safetensors": { + "size": 75839432, + "sha256": "e0bed05f6ce6033b4390e32211a77a48757ecf405478fdbcf31ee0c7e7620ba8" + }, + "model-00044-of-00147.safetensors": { + "size": 1073805208, + "sha256": "e680b5b828fb40b92da7018b6811aa308e8b82c5b2482b86c0df165a8e980af1" + }, + "model-00045-of-00147.safetensors": { + "size": 2147610408, + "sha256": "2a4c276b0fc86c01ceeffefad0bb80537a148f09e5f57fac36859529d0a1a09b" + }, + "model-00046-of-00147.safetensors": { + "size": 75839432, + "sha256": "490795345d7b90a32ebc43852b413595ddcb264e98eb0d897ee5d9cc17944940" + }, + "model-00047-of-00147.safetensors": { + "size": 1073805208, + "sha256": "6d089780ee2c0d542b8d6ce1b53aca8b71cf172d93ba4d49d7f9dba94c12f443" + }, + "model-00048-of-00147.safetensors": { + "size": 2147610408, + "sha256": "78ee7c3dc8dcbce0c1a73b01b5c3d1d5e560b1ecf039a914b3df6dadaa6b58f3" + }, + "model-00049-of-00147.safetensors": { + "size": 75839432, + "sha256": "fb895ad13c8719efecbf0a88960c534f5ca9b60da0fc35937038dbce584d61e9" + }, + "model-00050-of-00147.safetensors": { + "size": 1073805208, + "sha256": "dd0992f6b082c4f321f7de7ef4427c4d7d3a25bac56802b7390b36e3b75fab2c" + }, + "model-00051-of-00147.safetensors": { + "size": 2147610408, + "sha256": "3ddb7ea0939c92b3ae7ea53d59ba4a47f81044c10a8c3445c6b1cb99322fa7a9" + }, + "model-00052-of-00147.safetensors": { + "size": 62929376, + "sha256": "878422c5f304bbb1958b7216428e7ce4a1f74d1fa5a79df3803415d44486283d" + }, + "model-00053-of-00147.safetensors": { + "size": 1073805208, + "sha256": "312dbf2bba2d5ce4da60750f0665f0b557a22caa0c9b9ae26cf0b92ecabd28c9" + }, + "model-00054-of-00147.safetensors": { + "size": 2147610408, + "sha256": "c853a2b6dfb28b42193717f5f1dbf1a26b00c33e40610fc5f7e5e39cc8d96963" + }, + "model-00055-of-00147.safetensors": { + "size": 75839432, + "sha256": "16506a91be7c1d0fce6c651135fe434c422d0efd1b5f33105c8b7adabfe43433" + }, + "model-00056-of-00147.safetensors": { + "size": 1073805208, + "sha256": "e10f30d3a0acbd2fc56a4e67d744e4f5b01e111b4eb834bdc9cc9a365e50de03" + }, + "model-00057-of-00147.safetensors": { + "size": 2147610408, + "sha256": "20034d21e88f0b4cb52558668c14094bfae1e5bd6c971d8720746df80a424728" + }, + "model-00058-of-00147.safetensors": { + "size": 75839432, + "sha256": "8a52ce18bebac5711b024080a7019fa330ce695d57c250ca83e5935be1a1dd15" + }, + "model-00059-of-00147.safetensors": { + "size": 1073805208, + "sha256": "1f86308969c4db4fa20fc75faedddd57bcce7feeb795507a48ed0eae32cae0b8" + }, + "model-00060-of-00147.safetensors": { + "size": 2147610408, + "sha256": "46884cf7ec1be0b1eeee96aced4d9cb736d027659a598aed95b195ef26317f93" + }, + "model-00061-of-00147.safetensors": { + "size": 75839432, + "sha256": "2161daed528b1873712e2a78d52cf767112e6c61b2f543e63a453fabec01a7c8" + }, + "model-00062-of-00147.safetensors": { + "size": 1073805208, + "sha256": "542ebcdc236f5d2e7eff3132a558b10c09864ab2820818fbfe706765bd2e77d6" + }, + "model-00063-of-00147.safetensors": { + "size": 2147610408, + "sha256": "cc8c02d7004742f59c6ffac1f65800ca859ad94e3ffb3ba92fb30725dd6fe39c" + }, + "model-00064-of-00147.safetensors": { + "size": 62929376, + "sha256": "7d9e109b73b041ca087ff89bb5adddc70e77ce84ed3a24c936cf70f779bb4433" + }, + "model-00065-of-00147.safetensors": { + "size": 1073805208, + "sha256": "20da5d1722d0ce7aea8e71d520a884b00e4452e9683299719220675e0fc99987" + }, + "model-00066-of-00147.safetensors": { + "size": 2147610408, + "sha256": "c57bfe5c8bcf636ff323d148148abf4f1e1e4ecc6a56744769995a1b740ce1f1" + }, + "model-00067-of-00147.safetensors": { + "size": 75839432, + "sha256": "c0c7dd10aad9592f4e0fa70540b1a95df3eec67e80613260ca852ab7614745b7" + }, + "model-00068-of-00147.safetensors": { + "size": 1073805208, + "sha256": "9a2bef044319d36f99306c8fe154a60331529ae7db430d24c4045889f1d13547" + }, + "model-00069-of-00147.safetensors": { + "size": 2147610408, + "sha256": "7e83c9a60fddb635dc4f225692d3da3df66ae8cb3fdbd177cb696622c95ba9d4" + }, + "model-00070-of-00147.safetensors": { + "size": 75839432, + "sha256": "52e8951bc153ac92cfe6f8ef18084f2b67283a757bad1ad7d63c9f02cf239b89" + }, + "model-00071-of-00147.safetensors": { + "size": 1073804696, + "sha256": "fadcdb5873dd99569a6355d552670298f5d06bf0f3f955848342dd44c9d07ec0" + }, + "model-00072-of-00147.safetensors": { + "size": 2147609384, + "sha256": "de4fca6470e2a699927042f3062173047aa074e36765d440e967a64fa398a5d4" + }, + "model-00073-of-00147.safetensors": { + "size": 62929360, + "sha256": "b629ff9ac933fbd15bfbbd676780106ed10cd85447eba0071ad529bdf2a87938" + }, + "model-00074-of-00147.safetensors": { + "size": 1073805208, + "sha256": "ce25350ac2a83d2ea573a77a85d2255409009b3c56d0dec48f837192c3e8fd58" + }, + "model-00075-of-00147.safetensors": { + "size": 2147610408, + "sha256": "904546ce75e5c39bac9c9de2e84a7d2c279ef0675b2886a8dc4038e5de25c0e5" + }, + "model-00076-of-00147.safetensors": { + "size": 75839432, + "sha256": "f58aceccf0f19ce4b87f491cb7a04a33043f5dda2fabeb45e8ecfa12f985186e" + }, + "model-00077-of-00147.safetensors": { + "size": 1073805208, + "sha256": "90a7869bc525762ce653d9958ade1d0fdf6ab2c0e7ab6e0b79e0326bd75dc940" + }, + "model-00078-of-00147.safetensors": { + "size": 2147610408, + "sha256": "3cde0f246fd2eca4469696ee140f3babdcd72b42397c126b7d0833835ab5d70a" + }, + "model-00079-of-00147.safetensors": { + "size": 62929376, + "sha256": "ed8d077e54a6d37b1ee5876d987e8bca65777558c6a3904a2c6c63fb30b1e861" + }, + "model-00080-of-00147.safetensors": { + "size": 1073805208, + "sha256": "b0b4d894c87d8925ffb909c8fef763f9362a1d7c9806c1cf8213190fb503af2f" + }, + "model-00081-of-00147.safetensors": { + "size": 2147610408, + "sha256": "6fd9d128821946b1215b54146b15895bb015db9201b4f11679b44e9d00023260" + }, + "model-00082-of-00147.safetensors": { + "size": 75839432, + "sha256": "c1068b926831e8cf8cde653a6dee743443e6fed2e13a02d484945d4d0659bf17" + }, + "model-00083-of-00147.safetensors": { + "size": 1073805208, + "sha256": "44c1619542adfee303a05dede8b013bd12ac939613eb9e349f898823d3944e2c" + }, + "model-00084-of-00147.safetensors": { + "size": 2147610408, + "sha256": "cdd76d40bfa5de22199508f56136764860795bf765f85c01b3f4affbd27f9fde" + }, + "model-00085-of-00147.safetensors": { + "size": 75839432, + "sha256": "d879276a082d9c209a216b7dc480d7d0abf66bd4a898acf88fb62109d1ffd05a" + }, + "model-00086-of-00147.safetensors": { + "size": 1073805208, + "sha256": "9405bc3f84b513b7605a900c3a27eb838b1d40d8357c6642868bc5f9e43c9836" + }, + "model-00087-of-00147.safetensors": { + "size": 2147610408, + "sha256": "c1846b63bf0f72ff3a528b0276c75ebd62149c5051cd201fdb8ef06820c014b3" + }, + "model-00088-of-00147.safetensors": { + "size": 75839432, + "sha256": "0c3438460603127617f18b3b917855aeddea2c31bb09b343c021a636f5def6a4" + }, + "model-00089-of-00147.safetensors": { + "size": 1073805208, + "sha256": "2db5fb63143dbf1e15479b3a7f5ecf57a84516801496126214c1e23b8a76f770" + }, + "model-00090-of-00147.safetensors": { + "size": 2147610408, + "sha256": "31305b8452a109733a77af58d26c9b01a0affb93962c3bc81dd5cb8d1526627a" + }, + "model-00091-of-00147.safetensors": { + "size": 62929376, + "sha256": "fe2cd09ba37d9b14e9316f685e62b8d50b07db18a16a22d35449b10cd1e6e6d3" + }, + "model-00092-of-00147.safetensors": { + "size": 1073805208, + "sha256": "b6457f55e8bcc7fa913ad704a4cd11a08503001562bc55b4380a31e0084a82df" + }, + "model-00093-of-00147.safetensors": { + "size": 2147610408, + "sha256": "9a257642031829fcc604783099755058e1009f2ff13ddf47825cffb33c9db643" + }, + "model-00094-of-00147.safetensors": { + "size": 75839432, + "sha256": "7d3ff49e9043c6bebace8ef7d6215efb8db9646d4b51dde44f2ef9d76c2bdb87" + }, + "model-00095-of-00147.safetensors": { + "size": 1073805208, + "sha256": "e3d3833208114e8c7599119f7d60b532a001606558e1a6edb0a0b20aee3ac40e" + }, + "model-00096-of-00147.safetensors": { + "size": 2147610408, + "sha256": "1c595a55970be3e3648c9bd6831b16c2df62140a2c4dbcdfe132f23d172db68d" + }, + "model-00097-of-00147.safetensors": { + "size": 75839432, + "sha256": "fb3bbfdb3a1b3bf34f68898993c2bb626f6d8f6407d08e6d4afddd99032027e4" + }, + "model-00098-of-00147.safetensors": { + "size": 1073805208, + "sha256": "ff5545d6b489eb85d6e998903ab6777ca6e6c31455fc508eab975f9301327bfc" + }, + "model-00099-of-00147.safetensors": { + "size": 2147610408, + "sha256": "2546d45366e44d4c2a8b872d2d339c1510fb6fb5c61d5e72ed3996a6f33e2cb4" + }, + "model-00100-of-00147.safetensors": { + "size": 75839432, + "sha256": "02c3a3429853d5389495fc160385108b35fca71c45e4269289dee82346271d8e" + }, + "model-00101-of-00147.safetensors": { + "size": 1073805208, + "sha256": "84065493cc758171490c3a59815a52b3fdedaf5a02d1b122e37cec8600a21950" + }, + "model-00102-of-00147.safetensors": { + "size": 2147610408, + "sha256": "917c7d79afc9613ac390c21d9dad886aaf17b2aabdee8800b52eba3ea0d63e77" + }, + "model-00103-of-00147.safetensors": { + "size": 62929376, + "sha256": "3baca23268650c11ac8142952222f441a5bdcdd003b9606fdaceedfe153bc2ae" + }, + "model-00104-of-00147.safetensors": { + "size": 1073804696, + "sha256": "462b221bf2d3f326bae5b3d5a76c884eeb480f85faf03cd1bf0f60cf29975128" + }, + "model-00105-of-00147.safetensors": { + "size": 2147609384, + "sha256": "f8f71a67242830715549b6e7b9606f151eabc549fecf7699b8fc93dd18184479" + }, + "model-00106-of-00147.safetensors": { + "size": 75839416, + "sha256": "573c7df27663d594e3deb2330e3cada8a8e106800f9f95c927de31b92b984309" + }, + "model-00107-of-00147.safetensors": { + "size": 1073805208, + "sha256": "ed8124547cb320910253b704180cd12b7b72e016016f564d5051281aa52aa6fa" + }, + "model-00108-of-00147.safetensors": { + "size": 2147610408, + "sha256": "857e2ba3c27281b2dcab979972964e9949b8b72be0172b0c95e0d663175e09d8" + }, + "model-00109-of-00147.safetensors": { + "size": 75839432, + "sha256": "2fa26ddaac71f2d15944efdf186247faf75bd0bd8ccd494d7fbc54747a1b0418" + }, + "model-00110-of-00147.safetensors": { + "size": 1073805208, + "sha256": "d51090ec5d0659024dd1ed84ac809b0003b4fdd53e9fdef780dcba8206f9380c" + }, + "model-00111-of-00147.safetensors": { + "size": 2147610408, + "sha256": "5852f2130f472d33be07dbbb44e6122539f9060f1623aa702d6b261100b25823" + }, + "model-00112-of-00147.safetensors": { + "size": 75839432, + "sha256": "aa505d525b65f7a9e28e65428e7371fa1717d16fc07c8aea35d750cd60fc9bbe" + }, + "model-00113-of-00147.safetensors": { + "size": 1073805208, + "sha256": "6780c353f589a4dcc61412f6b71c5afcd437f7c8ed88df9365db25735320014e" + }, + "model-00114-of-00147.safetensors": { + "size": 2147610408, + "sha256": "0fc7af390b5ef919ff56a3cefab2adbe51c4db6dce70d78c5110c8b053ee8e65" + }, + "model-00115-of-00147.safetensors": { + "size": 75839432, + "sha256": "0e87a7c3166effdaef9d7db1dcd940153240ddd8cda376ee694713380234971a" + }, + "model-00116-of-00147.safetensors": { + "size": 1073805208, + "sha256": "2d1c76f002e10d5df3880dc5d3c27ca41435e18f3440f8752bb4ef8fbe858375" + }, + "model-00117-of-00147.safetensors": { + "size": 2147610408, + "sha256": "23e1ae8fe51bbbe69ad7ca51fb39b6dfea680f934fc1a44d0c7583edd55f9baf" + }, + "model-00118-of-00147.safetensors": { + "size": 62929376, + "sha256": "77347a60b69024b9cf76172da2698e1da48ad6f0a319010af4094060cea31cc1" + }, + "model-00119-of-00147.safetensors": { + "size": 1073805208, + "sha256": "20aedccaeac54560249c43f9fdbd973dc0ec7eedd24ab411c061b34f0a0a2fc9" + }, + "model-00120-of-00147.safetensors": { + "size": 2147610408, + "sha256": "2f164e7b3f85afc2104bc3b8b29d70217815fc0fbfcf9a6a18f75e5747ae5f16" + }, + "model-00121-of-00147.safetensors": { + "size": 75839432, + "sha256": "45aaabc03ab1c408e4a25260211d1c8dc294966f26b5b37b0dbee7fd91d8a8e4" + }, + "model-00122-of-00147.safetensors": { + "size": 1073805208, + "sha256": "0a1af4dd2bbd15347ffd19815fe5b2f469a4fb73f3f43b0758a814aa6c5d2d98" + }, + "model-00123-of-00147.safetensors": { + "size": 2147610408, + "sha256": "121b70369d4b12b25da4f494d31682c072ce5e3c4535512eb37a32504132521e" + }, + "model-00124-of-00147.safetensors": { + "size": 75839432, + "sha256": "0ab0b7998e222443c61fa43d243ef74cfcb55869a5ebf25c965eb9b76556fa3d" + }, + "model-00125-of-00147.safetensors": { + "size": 1073805208, + "sha256": "990ce817c84153890307f28e03486d33dc1f7eb694942445c892751b870c1e41" + }, + "model-00126-of-00147.safetensors": { + "size": 2147610408, + "sha256": "f62f65a7368348d97f68a8728da9d276fa8cdfdaa85b9e9a4595a4c7afc21687" + }, + "model-00127-of-00147.safetensors": { + "size": 75839432, + "sha256": "c87b7104467bcb0f9816ac4174fd8842e3b8bd1a2769d1d8813920abda77ecee" + }, + "model-00128-of-00147.safetensors": { + "size": 1073805208, + "sha256": "76cef7608e8add78825b25fe60f6f7ece27a20566f92689fd6f0a2bb3fdfc367" + }, + "model-00129-of-00147.safetensors": { + "size": 2147610408, + "sha256": "3b143af9b72711b9cf7d7cb3708cb991867dde081932a910d041b0aa5462668e" + }, + "model-00130-of-00147.safetensors": { + "size": 62929376, + "sha256": "8ef82b28e645f797242556bb7eeee20387ee144ddc5b9020bbdbb030d6da99d5" + }, + "model-00131-of-00147.safetensors": { + "size": 1073804696, + "sha256": "1ef150b29f2fc0085a196ee4da902a654cd0e0648ead90a8f8131e68c86fc485" + }, + "model-00132-of-00147.safetensors": { + "size": 2147609384, + "sha256": "513169617456a33faa14440e7c75e7552f9207b6821c62b6bfa763eac562518d" + }, + "model-00133-of-00147.safetensors": { + "size": 75839416, + "sha256": "7d976f5f013229935be9c6e8db13c92c60f8a6459436a5259dc97214567c600c" + }, + "model-00134-of-00147.safetensors": { + "size": 1073804696, + "sha256": "7c48b3d9587c8dfb2ceb4f4d841a87b0ddd44a999a3e2e00d365b0c962d5c20d" + }, + "model-00135-of-00147.safetensors": { + "size": 2147609384, + "sha256": "6691a7734f93f25de18fe0cada73de957d4cb8ad2fda9b755a2ce03ff24e1631" + }, + "model-00136-of-00147.safetensors": { + "size": 75839416, + "sha256": "97ba545c17a1871296b025017555bc9a3598b8ca810148fb2a52001ea18c3fff" + }, + "model-00137-of-00147.safetensors": { + "size": 1073804696, + "sha256": "a415388777c5ff45cab095afab85e0edf8869daa58e9f3e29c9576a94854b177" + }, + "model-00138-of-00147.safetensors": { + "size": 2147609384, + "sha256": "279f60be8fa6204a01670bd5adc61ffb4a14b67bb4d638d73ff8945f4b43d715" + }, + "model-00139-of-00147.safetensors": { + "size": 62929360, + "sha256": "f91b884a968164628e4d3c205b3717bc834ccbb70ddc3172987f9ada7bd326d6" + }, + "model-00140-of-00147.safetensors": { + "size": 1073804696, + "sha256": "ef6771dceaf4156f6a51a2637fab78745e175e0d99e0c267a955ea824a553e40" + }, + "model-00141-of-00147.safetensors": { + "size": 2147609384, + "sha256": "4ef6a5da87c560e1e711c10d72af6d4cb0fc7898c9ce550e32639afcbf551343" + }, + "model-00142-of-00147.safetensors": { + "size": 75839416, + "sha256": "1e2671039c732e470d2ecd60648f36b695f2c12e943d5edee62bdf8f9b7ed370" + }, + "model-00143-of-00147.safetensors": { + "size": 1073804696, + "sha256": "a7fedf6cd1af0f57986de4bd8803df03abcee530a5a66f6323e43ceb0404f07f" + }, + "model-00144-of-00147.safetensors": { + "size": 2147609384, + "sha256": "6ad501b8470bcce388c5edf5d0b735193bc8be39d76af5635d60a34ca59c7a5b" + }, + "model-00145-of-00147.safetensors": { + "size": 75839416, + "sha256": "e48115fe3ae7e5e661558148f903a081838c3e6a7437560182401ab67296b5e2" + }, + "model-00146-of-00147.safetensors": { + "size": 622329992, + "sha256": "63a4cf81ed7c45f3949d006e39c5b5c98a4804f559f1e4f6412204819f14f2e9" + }, + "model-00147-of-00147.safetensors": { + "size": 622329984, + "sha256": "d9c5df3c81fa71ca4670c2c82c4e36ef31bb1fa8b017700dacd6a154a5f4d03e" + }, + "model-base-passthrough-00001-of-00001.safetensors": { + "size": 3301131328, + "sha256": "65190abf2f9cc7597a3e72c464f1f184d5e11820582a40b7ebd6977ae5273d2f" + }, + "model.safetensors.index.json": { + "size": 6922711, + "sha256": "f7a1d9a95b13a01cd482df0d992abb643b1ca4e3218acf22bd4795dc5a9d8661" + }, + "tokenizer.json": { + "size": 11422654, + "sha256": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4" + }, + "tokenizer_config.json": { + "size": 9377, + "sha256": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3" + }, + "vocab.json": { + "size": 2776833, + "sha256": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + } + }, + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "f7a1d9a95b13a01cd482df0d992abb643b1ca4e3218acf22bd4795dc5a9d8661", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "weight_schema_sha256": "babe9f7e7cf398ad6a8607ee03bb6549139b26fcdd919bb65e9d22b059536361", + "tensor_count": 75944, + "weights_content_sha256": "75c3900a0db26447c8584719c00259520f7a9a4029921b43e3c591a65a1bd0a9" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "architecture_layers": 48, + "weights_dtype": "bfloat16", + "recurrent_state_dtype": "float32", + "base_checkpoint": "", + "base_checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + } + }, + "fixture": { + "path": "/inputs/frozen.pt", + "sha256": "a8fc79cea6c76e5989743429b76811b3a93b6b85e1eb7f03164c9850c50f1ca8", + "content_sha256": "b59298acf5ecbe64abb4639e7596e052f1993ee5e3c7289b63738f1b04463d01" + }, + "case_ids": [ + "p0008-b1-full", + "p0008-b1-chunked", + "p0008-b4-full", + "p0008-b4-chunked", + "p0064-b1-full", + "p0064-b1-chunked", + "p0064-b4-full", + "p0064-b4-chunked", + "p0256-b1-full", + "p0256-b1-chunked", + "p0256-b4-full", + "p0256-b4-chunked", + "p1024-b1-full", + "p1024-b1-chunked", + "p1024-b4-full", + "p1024-b4-chunked" + ], + "cases": { + "p0008-b1-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/rollout/p0008-b1-full.pt", + "sha256": "0e7955081bc79273fc79771a353e494358bd6d416c0d2318797f1f857830fcc6" + }, + "recompute": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/recompute/p0008-b1-full.pt", + "sha256": "e10b546fcf11cc80881ee4c54bde8d618e63c7f1645b42ecca44feefedc5799a" + } + } + }, + "p0008-b1-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/rollout/p0008-b1-chunked.pt", + "sha256": "80bc88e6b1404fa7e3a8615e112442b3b8a53b30dface52e84fed66bfbd3839d" + }, + "recompute": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/recompute/p0008-b1-chunked.pt", + "sha256": "7bd609ecef1dd4e2dc674091bc2db4839785d3b5bfdb1abaa17523fd7d91f149" + } + } + }, + "p0008-b4-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/rollout/p0008-b4-full.pt", + "sha256": "45f0ebcf0c36c440516c3134e18f6eb511e8ba558b7808be15763fef1818ec97" + }, + "recompute": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/recompute/p0008-b4-full.pt", + "sha256": "ca675653498005196cea1b1e71f164baaefcc0e9a6c057432adb3dce0ee13d42" + } + } + }, + "p0008-b4-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/rollout/p0008-b4-chunked.pt", + "sha256": "818886d2505b2b26d53d5b2f05f497667cc063d5d0b59c282e3b92053d8a2862" + }, + "recompute": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/recompute/p0008-b4-chunked.pt", + "sha256": "25d250f8fc85ab133e3b299087d08fb93bd600d7f61a6102239a7798f545f2f4" + } + } + }, + "p0064-b1-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/rollout/p0064-b1-full.pt", + "sha256": "0231198c3dcc5f382870b31fc6cf78d9f25ebc1dcff88f8c114fc562b4729d57" + }, + "recompute": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/recompute/p0064-b1-full.pt", + "sha256": "ffe30a5a4e78b6ab2f67b11ea9445feb2ac3cf738979d1b88f1628f20ac8c743" + } + } + }, + "p0064-b1-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/rollout/p0064-b1-chunked.pt", + "sha256": "226199d62870ef8dbeab8ded5761e928e41ee03fc57a0a8bcd2a47adea004f3b" + }, + "recompute": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/recompute/p0064-b1-chunked.pt", + "sha256": "0a3a7f3e771287b0a6d0acd3132c22257462aae6a0eccccbc1a391a71b8216a7" + } + } + }, + "p0064-b4-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/rollout/p0064-b4-full.pt", + "sha256": "d001a3db9a8e43e7874299835f0d5b752de358f5334739e7c6955cd6c1294471" + }, + "recompute": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/recompute/p0064-b4-full.pt", + "sha256": "2f0381c28f0fe64bc7598d96404be5e0d70502689689e1d1c1e8c32cfcfe8867" + } + } + }, + "p0064-b4-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/rollout/p0064-b4-chunked.pt", + "sha256": "5271a230b070251d4508fb96c6c0c7d321b3cfd527e19bd96e9b6c897cefb042" + }, + "recompute": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/recompute/p0064-b4-chunked.pt", + "sha256": "6668e0110db3a8dedf214862f9803168f3d81acee3f3c6950dad09ce8969e711" + } + } + }, + "p0256-b1-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/rollout/p0256-b1-full.pt", + "sha256": "5c409c46d2d50789f2b92d6d8ee6fc7f645a65083a7dfb20a5b53d267c9a44be" + }, + "recompute": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/recompute/p0256-b1-full.pt", + "sha256": "1a4e95d988c26f961294ef706972c08b99908c449e075afc3c4fb180624d7390" + } + } + }, + "p0256-b1-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/rollout/p0256-b1-chunked.pt", + "sha256": "5459b0199693600e2802c4c2247a70d0c9b0942dd17221bca97653602478eefa" + }, + "recompute": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/recompute/p0256-b1-chunked.pt", + "sha256": "2eeb2b254ec28e8bf77641166a0501550ac116a275b099cdd2650ad0c2382fd2" + } + } + }, + "p0256-b4-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/rollout/p0256-b4-full.pt", + "sha256": "ca10cf57a0a0fad974676e5c392948b33853241ec48616dccdeec2becbd432a0" + }, + "recompute": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/recompute/p0256-b4-full.pt", + "sha256": "6d442e851f9a66640618af6dcc52245a962dbaf1ea7b6e87aac9c57f84584c9b" + } + } + }, + "p0256-b4-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/rollout/p0256-b4-chunked.pt", + "sha256": "20d0f60fdce5cfbf59dee63e93c5a4289557c2ae3a7544cb5a4292bc5c8a104e" + }, + "recompute": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/recompute/p0256-b4-chunked.pt", + "sha256": "fd5e3e72a35aecf22de02d7bacf2b94eda89541d6e66b72d0287ac6d02865761" + } + } + }, + "p1024-b1-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/rollout/p1024-b1-full.pt", + "sha256": "fc89220629e468e97add1f7503c6c20e02529b95ea3043fa5688d37bd5b4cee9" + }, + "recompute": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/recompute/p1024-b1-full.pt", + "sha256": "abaa7972cdd74c81befe1cc3c8a04ac5b61b9624e3581396203d693cf8bc1d18" + } + } + }, + "p1024-b1-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/rollout/p1024-b1-chunked.pt", + "sha256": "f963464cfd4c3eb9f7f4a49e1c28873e7addd7351b82861d462ff5bd67941860" + }, + "recompute": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/recompute/p1024-b1-chunked.pt", + "sha256": "e9a6fc57009d32bce3db7fa04cc8ca5971a7f055d041eb1d6233a0f04d53e845" + } + } + }, + "p1024-b4-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/rollout/p1024-b4-full.pt", + "sha256": "8ed3059da7d50640172e0785530d90735aa215702fe80dd752d357341f54f524" + }, + "recompute": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/recompute/p1024-b4-full.pt", + "sha256": "9f0beedf0bc1ee7c0abfc07ac79cfa4162ee2a7cf19df2530a56e3ad6c0af827" + } + } + }, + "p1024-b4-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/rollout/p1024-b4-chunked.pt", + "sha256": "29f11fcac15f41e8a556cab7db8595e7afd96f4ba9e4c5cba91573c9253b10e5" + }, + "recompute": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/recompute/p1024-b4-chunked.pt", + "sha256": "eb9da8b2c471abb361f13a34cf7bb41964acc3f2b0ca0d7dc048f65116d35ce6" + } + } + } + }, + "processes": { + "rollout": { + "pid": 485946, + "exit_code": 0, + "log": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/rollout.log", + "gpu_release_verified": true + }, + "recompute": { + "pid": 507417, + "exit_code": 0, + "log": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/recompute.log", + "gpu_release_verified": true + } + }, + "worker_results": { + "rollout": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/rollout/worker-result.json", + "sha256": "286818cc6fac183f876b1816b3ac7d72fd14c70ebae7196d87290ebbd78953cb" + }, + "recompute": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/recompute/worker-result.json", + "sha256": "75832a698847e1a10bb58e5ce20e183f7346f5242d68127efb0c23ac9bce4e2a" + } + }, + "raw_bit_comparison": true, + "logits_dtype": "bfloat16", + "logprobs_dtype": "float32", + "response_length": 16, + "vocab_size": 151936, + "provider_binary": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/provider-binary.json", + "sha256": "0859d31cb34abcfe4faa9fdf0813c3310275046d2bd91b43678280cbff3835c4" + } +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/train1/operators.json b/docs/usage/evidence/qwen3-next-chain-b200/train1/operators.json new file mode 100644 index 000000000..500251cce --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/train1/operators.json @@ -0,0 +1,304 @@ +{ + "scope": "qwen3_next_operators_only", + "status": "passed", + "suite": "all", + "diagnostic_only": false, + "full_model_l2": "not_evaluated", + "git_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "git_dirty": false, + "versions": { + "torch": "2.13.0", + "vllm": "0.30.0", + "transformers": "5.17.0", + "triton": "3.7.1" + }, + "mandatory_case_ids": [ + "tests/check_qwen3_next_attention.py::test_d256_backward_with_cached_prefix_matches_float64_formula", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[1024]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[256]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[64]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[8]", + "tests/check_qwen3_next_attention.py::test_d256_input_device_guard_and_nondefault_stream", + "tests/check_qwen3_next_attention.py::test_native_backward_rejects_malformed_probability_and_gradient_buffers", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[0]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[2]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_target_inputs_do_not_depend_on_companions", + "tests/check_qwen3_next_batch_invariance.py::test_triton_chunked_prefill_is_batch_invariant", + "tests/check_qwen3_next_conv_bridge.py::test_chunked_and_reordered_sequences_match", + "tests/check_qwen3_next_conv_bridge.py::test_empty_sequence_preserves_cache_and_gradients", + "tests/check_qwen3_next_conv_bridge.py::test_response_gradient_reaches_prompt_and_convolution_weight", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths0]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths1]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths2]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-4]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[1]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[4]", + "tests/check_qwen3_next_core_matrix.py::test_variable_lengths_empty_and_mixed_step_match_independent_sequences", + "tests/check_qwen3_next_forward.py::test_combine_has_fixed_route_order_and_differentiable_weights", + "tests/check_qwen3_next_forward.py::test_full_vocabulary_logprob_entropy_modes_and_gradient", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_fail_closed_on_the_tensor_descriptor_path", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[128]", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[512]", + "tests/check_qwen3_next_forward.py::test_logprob_nan_rejected_before_comparison", + "tests/check_qwen3_next_forward.py::test_moe_vjp_matches_independent_double_formula", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[1024-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[128-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-16]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-256]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-3072]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-37984]", + "tests/check_qwen3_next_forward.py::test_qwen_moe_actual_tp4_shapes_and_independent_training_forward", + "tests/check_qwen3_next_forward.py::test_route_weights_are_batch_invariant", + "tests/check_qwen3_next_forward.py::test_shared_linear_vjp_and_empty_tokens", + "tests/check_qwen3_next_forward.py::test_stable_route_tie_boundary_and_router_gradient", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_backward_matches_recomputed_recurrence_vjp", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_forward_is_provider_exact_and_does_not_mutate_inputs", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_keeps_prompt_state_gradient_through_response", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[False]", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[True]", + "tests/check_qwen3_next_gdn_bridge.py::test_initial_state_vjp_matches_provider_directional_difference", + "tests/check_qwen3_next_gdn_sequence.py::test_1024_token_chunk_continuation_is_bitwise_exact", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad0]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad1]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad2]", + "tests/check_qwen3_next_gdn_sequence.py::test_chunk_boundary_retains_prompt_and_initial_state_gradients", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths0]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths1]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths2]", + "tests/check_qwen3_next_gdn_sequence.py::test_reserved_and_duplicate_slots_are_rejected", + "tests/check_qwen3_next_norm_providers.py::test_custom_op_has_distinct_native_and_cuda_paths", + "tests/check_qwen3_next_norm_providers.py::test_gdn_decode_provider_env_defaults_are_recorded", + "tests/check_qwen3_next_norm_providers.py::test_our_gated_op_is_batch_invariant", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_cuda]", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_native]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots0]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots2]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots3]", + "tests/check_qwen3_next_shared_core.py::test_independent_training_forward_matches_inference_and_retains_gradients", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[1024]", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[8]", + "tests/check_qwen3_next_shared_core.py::test_unimplemented_provider_profile_is_rejected", + "tests/test_qwen3_next_norm.py::test_bad_weight_shape_raises", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[16]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[1]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[2]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[32]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[48]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[64]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[8]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[128]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[2048]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_with_padding", + "tests/test_qwen3_next_norm.py::test_call_matches_forward", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[128]", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[2048]", + "tests/test_qwen3_next_norm.py::test_cuda_default_offset_preserves_plain_convention", + "tests/test_qwen3_next_norm.py::test_cuda_gated_backward_matches_autograd_golden", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_matches_golden_within_contract", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_bad_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_mismatched_gate", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_backward_uses_the_sigmoid_derivative", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_swish_is_an_alias_for_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_unit_weight_is_plain_norm_times_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_weight_offset_is_applied_in_fp32", + "tests/test_qwen3_next_norm.py::test_cuda_gated_wrapper_rejects_equal_numel_wrong_shape", + "tests/test_qwen3_next_norm.py::test_cuda_gated_zero_gate_zeroes_output", + "tests/test_qwen3_next_norm.py::test_cuda_offset_equals_explicit_fp32_weight", + "tests/test_qwen3_next_norm.py::test_cuda_offset_is_not_folded_through_bfloat16", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_backward_is_offset_aware", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_within_tolerance_of_golden", + "tests/test_qwen3_next_norm.py::test_deterministic_repeat", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype0]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype1]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype2]", + "tests/test_qwen3_next_norm.py::test_eps_inside_sqrt", + "tests/test_qwen3_next_norm.py::test_gated_batch_invariance_slice", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedHFOp]", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedOp]", + "tests/test_qwen3_next_norm.py::test_gated_conventions_diverge_in_low_precision", + "tests/test_qwen3_next_norm.py::test_gated_cuda_op_rejects_bad_activation_at_construction", + "tests/test_qwen3_next_norm.py::test_gated_extension_handles_empty_batch_and_nondefault_stream", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[dy_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[gate_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[rstd_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_shape]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_matches_hf_formula_fp32", + "tests/test_qwen3_next_norm.py::test_gated_shape_mismatch_raises", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_strict_matches_vllm_formula_fp32", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[128]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[2048]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_offset_applied_in_fp32_not_folded_into_bf16", + "tests/test_qwen3_next_norm.py::test_op_batch_invariance_on_device", + "tests/test_qwen3_next_norm.py::test_plain_reference_is_unchanged_by_the_offset_plumbing", + "tests/test_qwen3_next_norm.py::test_weight_offset_is_one", + "tests/test_qwen3_next_norm.py::test_zero_centred_cuda_constructor_rejects_missing_extension", + "tests/test_qwen3_next_norm.py::test_zero_centred_op_inherits_the_plain_reference", + "tests/test_qwen3_next_norm.py::test_zero_weight_is_identity_scaling" + ], + "case_ids_sha256": "694c931b65f9cfa5db963f2eca6d11bd309546c824a1df52f9da2ab128e83e0f", + "pytest_exit_code": 0, + "provider_tests": { + "tests": 233, + "failures": 0, + "errors": 0, + "skipped": 0 + }, + "norm_gates": { + "qwen3_next_rms_norm-forward.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + }, + "qwen3_next_rms_norm-gradient.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + }, + "rms_norm_gated-forward.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + }, + "rms_norm_gated-gradient.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + } + } +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/train1/result.json b/docs/usage/evidence/qwen3-next-chain-b200/train1/result.json new file mode 100644 index 000000000..19f2cd549 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/train1/result.json @@ -0,0 +1,774 @@ +{ + "contract_version": 4, + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "cuda_identity": { + "home": "", + "nvcc_sha256": "b8e2347d9d7fcadf8812a27324d515de99d033d3e48611811ece7e66d7895f8a" + }, + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "operator_requirements": { + "suite": "all", + "case_ids": [ + "tests/check_qwen3_next_attention.py::test_d256_backward_with_cached_prefix_matches_float64_formula", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[1024]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[256]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[64]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[8]", + "tests/check_qwen3_next_attention.py::test_d256_input_device_guard_and_nondefault_stream", + "tests/check_qwen3_next_attention.py::test_native_backward_rejects_malformed_probability_and_gradient_buffers", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[0]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[2]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_target_inputs_do_not_depend_on_companions", + "tests/check_qwen3_next_batch_invariance.py::test_triton_chunked_prefill_is_batch_invariant", + "tests/check_qwen3_next_conv_bridge.py::test_chunked_and_reordered_sequences_match", + "tests/check_qwen3_next_conv_bridge.py::test_empty_sequence_preserves_cache_and_gradients", + "tests/check_qwen3_next_conv_bridge.py::test_response_gradient_reaches_prompt_and_convolution_weight", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths0]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths1]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths2]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-4]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[1]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[4]", + "tests/check_qwen3_next_core_matrix.py::test_variable_lengths_empty_and_mixed_step_match_independent_sequences", + "tests/check_qwen3_next_forward.py::test_combine_has_fixed_route_order_and_differentiable_weights", + "tests/check_qwen3_next_forward.py::test_full_vocabulary_logprob_entropy_modes_and_gradient", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_fail_closed_on_the_tensor_descriptor_path", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[128]", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[512]", + "tests/check_qwen3_next_forward.py::test_logprob_nan_rejected_before_comparison", + "tests/check_qwen3_next_forward.py::test_moe_vjp_matches_independent_double_formula", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[1024-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[128-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-16]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-256]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-3072]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-37984]", + "tests/check_qwen3_next_forward.py::test_qwen_moe_actual_tp4_shapes_and_independent_training_forward", + "tests/check_qwen3_next_forward.py::test_route_weights_are_batch_invariant", + "tests/check_qwen3_next_forward.py::test_shared_linear_vjp_and_empty_tokens", + "tests/check_qwen3_next_forward.py::test_stable_route_tie_boundary_and_router_gradient", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_backward_matches_recomputed_recurrence_vjp", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_forward_is_provider_exact_and_does_not_mutate_inputs", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_keeps_prompt_state_gradient_through_response", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[False]", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[True]", + "tests/check_qwen3_next_gdn_bridge.py::test_initial_state_vjp_matches_provider_directional_difference", + "tests/check_qwen3_next_gdn_sequence.py::test_1024_token_chunk_continuation_is_bitwise_exact", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad0]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad1]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad2]", + "tests/check_qwen3_next_gdn_sequence.py::test_chunk_boundary_retains_prompt_and_initial_state_gradients", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths0]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths1]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths2]", + "tests/check_qwen3_next_gdn_sequence.py::test_reserved_and_duplicate_slots_are_rejected", + "tests/check_qwen3_next_norm_providers.py::test_custom_op_has_distinct_native_and_cuda_paths", + "tests/check_qwen3_next_norm_providers.py::test_gdn_decode_provider_env_defaults_are_recorded", + "tests/check_qwen3_next_norm_providers.py::test_our_gated_op_is_batch_invariant", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_cuda]", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_native]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots0]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots2]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots3]", + "tests/check_qwen3_next_shared_core.py::test_independent_training_forward_matches_inference_and_retains_gradients", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[1024]", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[8]", + "tests/check_qwen3_next_shared_core.py::test_unimplemented_provider_profile_is_rejected", + "tests/test_qwen3_next_norm.py::test_bad_weight_shape_raises", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[16]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[1]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[2]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[32]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[48]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[64]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[8]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[128]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[2048]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_with_padding", + "tests/test_qwen3_next_norm.py::test_call_matches_forward", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[128]", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[2048]", + "tests/test_qwen3_next_norm.py::test_cuda_default_offset_preserves_plain_convention", + "tests/test_qwen3_next_norm.py::test_cuda_gated_backward_matches_autograd_golden", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_matches_golden_within_contract", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_bad_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_mismatched_gate", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_backward_uses_the_sigmoid_derivative", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_swish_is_an_alias_for_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_unit_weight_is_plain_norm_times_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_weight_offset_is_applied_in_fp32", + "tests/test_qwen3_next_norm.py::test_cuda_gated_wrapper_rejects_equal_numel_wrong_shape", + "tests/test_qwen3_next_norm.py::test_cuda_gated_zero_gate_zeroes_output", + "tests/test_qwen3_next_norm.py::test_cuda_offset_equals_explicit_fp32_weight", + "tests/test_qwen3_next_norm.py::test_cuda_offset_is_not_folded_through_bfloat16", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_backward_is_offset_aware", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_within_tolerance_of_golden", + "tests/test_qwen3_next_norm.py::test_deterministic_repeat", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype0]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype1]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype2]", + "tests/test_qwen3_next_norm.py::test_eps_inside_sqrt", + "tests/test_qwen3_next_norm.py::test_gated_batch_invariance_slice", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedHFOp]", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedOp]", + "tests/test_qwen3_next_norm.py::test_gated_conventions_diverge_in_low_precision", + "tests/test_qwen3_next_norm.py::test_gated_cuda_op_rejects_bad_activation_at_construction", + "tests/test_qwen3_next_norm.py::test_gated_extension_handles_empty_batch_and_nondefault_stream", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[dy_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[gate_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[rstd_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_shape]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_matches_hf_formula_fp32", + "tests/test_qwen3_next_norm.py::test_gated_shape_mismatch_raises", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_strict_matches_vllm_formula_fp32", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[128]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[2048]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_offset_applied_in_fp32_not_folded_into_bf16", + "tests/test_qwen3_next_norm.py::test_op_batch_invariance_on_device", + "tests/test_qwen3_next_norm.py::test_plain_reference_is_unchanged_by_the_offset_plumbing", + "tests/test_qwen3_next_norm.py::test_weight_offset_is_one", + "tests/test_qwen3_next_norm.py::test_zero_centred_cuda_constructor_rejects_missing_extension", + "tests/test_qwen3_next_norm.py::test_zero_centred_op_inherits_the_plain_reference", + "tests/test_qwen3_next_norm.py::test_zero_weight_is_identity_scaling" + ], + "case_ids_sha256": "694c931b65f9cfa5db963f2eca6d11bd309546c824a1df52f9da2ab128e83e0f", + "norm_gates": [ + "qwen3_next_rms_norm-forward.json", + "qwen3_next_rms_norm-gradient.json", + "rms_norm_gated-forward.json", + "rms_norm_gated-gradient.json" + ] + }, + "layer_requirements": { + "schema_version": 1, + "gates": { + "gdn": { + "script": "scripts/qwen3_next_tp_gdn_check.py", + "output_option": "--output", + "scope": "tp4_gdn_layer0", + "groups": { + "cases": [ + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "prompt-gradient", + "replicated-norm-gradient", + "hf-load-export" + ] + }, + "script_sha256": "cc4338893f90af004c51c20fc67d1a9a3f4bf8d26775277f72671c02983e4df5" + }, + "attention": { + "script": "scripts/qwen3_next_tp_attention_check.py", + "output_option": "--output", + "scope": "tp4_full_attention_layer3", + "groups": { + "attention.cases": [ + "hf-load-export", + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "batch4-varlen-reorder", + "sixteen-token-decode", + "prompt-gradient", + "kv-pair-gradient", + "qk-norm-gradient" + ] + }, + "script_sha256": "d27d43efb05415a8ef5892c3c2238a2b9744a4821f5466faf46c6510e6e01bec" + }, + "moe": { + "script": "scripts/qwen3_next_tp_moe_check.py", + "output_option": "--output", + "scope": "tp4_moe_block_layer0", + "groups": { + "moe.cases": [ + "hf-load-export-all512experts", + "routes-replicated-8", + "full-chunk-reorder-8", + "routes-replicated-64", + "full-chunk-reorder-64", + "routes-replicated-256", + "full-chunk-reorder-256", + "routes-replicated-1024", + "full-chunk-reorder-1024", + "training-forward", + "all-parameter-gradient", + "replicated-router-gradient" + ] + }, + "script_sha256": "d5c1bbbb82e408b65871b0cb1638d7a6cf8cfe07f0a3315a657b7dc232d544be" + }, + "adapters": { + "script": "scripts/qwen3_next_adapter_check.py", + "output_option": "--out", + "scope": "gdn_engine_adapter_component", + "groups": { + "cases": [ + "batch1-length8", + "batch1-length64", + "batch1-length256", + "batch1-length1024", + "batch4-length8", + "batch4-length64", + "batch4-length256", + "batch4-length1024", + "mixed-prefill-decode16-reorder" + ] + }, + "fields": { + "prompt_gradient": "passed", + "hf_conv_roundtrip": "passed", + "batch_invariance_capability_registered": false + }, + "script_sha256": "3ce45bb317237c1a06533116d65fb77c2a23b6f503ae46406ede543036eb0f20" + }, + "heads": { + "script": "scripts/qwen3_next_tp_head_check.py", + "output_option": "--output", + "scope": "tp4_embedding_lm_head_only", + "groups": { + "cases": [ + "hf-embedding-roundtrip", + "hf-lm-head-roundtrip", + "replicated-norm-gradient", + "nonzero-finite-embedding-head-gradient", + "embedding-repeat-100", + "batch-invariant-prompt8", + "batch-invariant-prompt64", + "batch-invariant-prompt256", + "batch-invariant-prompt1024", + "logprob-original-and-promoted-logits", + "entropy-interface" + ] + }, + "script_sha256": "0504185d21a75405c8e994bc57b016cf4ec357d8b16e7430772c11934f2af876" + } + }, + "scheduler_case_ids": [ + "p0008-b1-full", + "p0008-b1-chunked", + "p0008-b4-full", + "p0008-b4-chunked", + "p0064-b1-full", + "p0064-b1-chunked", + "p0064-b4-full", + "p0064-b4-chunked", + "p0256-b1-full", + "p0256-b1-chunked", + "p0256-b4-full", + "p0256-b4-chunked", + "p1024-b1-full", + "p1024-b1-chunked", + "p1024-b4-full", + "p1024-b4-chunked" + ], + "registry_sha256": "e3949a750cb27c1897a000f3b023f912629906612ae8949c1575d0acc36df5ec", + "case_ids_per_rank": [ + "adapters/cases/batch1-length1024", + "adapters/cases/batch1-length256", + "adapters/cases/batch1-length64", + "adapters/cases/batch1-length8", + "adapters/cases/batch4-length1024", + "adapters/cases/batch4-length256", + "adapters/cases/batch4-length64", + "adapters/cases/batch4-length8", + "adapters/cases/mixed-prefill-decode16-reorder", + "attention/attention.cases/batch4-varlen-reorder", + "attention/attention.cases/full-chunk-1024", + "attention/attention.cases/full-chunk-256", + "attention/attention.cases/full-chunk-64", + "attention/attention.cases/full-chunk-8", + "attention/attention.cases/hf-load-export", + "attention/attention.cases/kv-pair-gradient", + "attention/attention.cases/prompt-gradient", + "attention/attention.cases/qk-norm-gradient", + "attention/attention.cases/sixteen-token-decode", + "gdn/cases/full-chunk-1024", + "gdn/cases/full-chunk-256", + "gdn/cases/full-chunk-64", + "gdn/cases/full-chunk-8", + "gdn/cases/hf-load-export", + "gdn/cases/prompt-gradient", + "gdn/cases/replicated-norm-gradient", + "heads/cases/batch-invariant-prompt1024", + "heads/cases/batch-invariant-prompt256", + "heads/cases/batch-invariant-prompt64", + "heads/cases/batch-invariant-prompt8", + "heads/cases/embedding-repeat-100", + "heads/cases/entropy-interface", + "heads/cases/hf-embedding-roundtrip", + "heads/cases/hf-lm-head-roundtrip", + "heads/cases/logprob-original-and-promoted-logits", + "heads/cases/nonzero-finite-embedding-head-gradient", + "heads/cases/replicated-norm-gradient", + "moe/moe.cases/all-parameter-gradient", + "moe/moe.cases/full-chunk-reorder-1024", + "moe/moe.cases/full-chunk-reorder-256", + "moe/moe.cases/full-chunk-reorder-64", + "moe/moe.cases/full-chunk-reorder-8", + "moe/moe.cases/hf-load-export-all512experts", + "moe/moe.cases/replicated-router-gradient", + "moe/moe.cases/routes-replicated-1024", + "moe/moe.cases/routes-replicated-256", + "moe/moe.cases/routes-replicated-64", + "moe/moe.cases/routes-replicated-8", + "moe/moe.cases/training-forward" + ], + "case_ids_sha256": "be74417dfbd6031ba27978d06d04bb15daaab2aeb57d132c7e0d41176b28b46e" + }, + "source_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "run_id": "20261009T041838Z-train1-c67ec144-39e7db9f", + "stage": "train1", + "suite": "all", + "execution_id": "39e7db9f488142f4b52872e05728c390", + "attempt": "0", + "status": "passed", + "phase": "complete", + "scope": "qwen3_next_training_update1", + "full_model_l2": "passed", + "evidence": { + "updates": { + "path": "attempts/0/training-progress.json", + "sha256": "f21f30f70b7902aa0ec4482b3764995ab8185ca6641072ed216a52f667b22dee" + }, + "l2_matrix": { + "path": "attempts/0/l2-matrix.json", + "sha256": "ad78b78687d2ef725a24b42de908033b36383f69db41d2c754f87acb07cd9870" + }, + "operators": { + "path": "attempts/0/operators.json", + "sha256": "dedb24b6ac2a01d37eb795a001376ca0b200a03e417f8131688aac67c19c2ebd" + }, + "environment": { + "path": "attempts/0/environment.json", + "sha256": "4d4118b462346e2b02d4c56d0d496fec8a0505ffeaf3063dd9cc42be5e391b89" + } + }, + "training_phases": [ + "update1" + ] +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/train1/run.json b/docs/usage/evidence/qwen3-next-chain-b200/train1/run.json new file mode 100644 index 000000000..855a12002 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/train1/run.json @@ -0,0 +1,5252 @@ +{ + "run_id": "20261009T041838Z-train1-c67ec144-39e7db9f", + "execution_id": "39e7db9f488142f4b52872e05728c390", + "contract_version": 4, + "suite": "all", + "execution_gpus": 4, + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "stage": "train1", + "source_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "source": "/source", + "python": "", + "cuda_home": "", + "checkpoint": "", + "memory": "1280G", + "previous": "", + "status": "prepared", + "full_model_l2": "not_evaluated", + "environment": { + "identity": { + "base_prefix": "/miniconda3/envs/rlkernel", + "binary": "/python3.12", + "binary_sha256": "6a1eb3ffc29f3a6b0ece607b016b4cfa5ca3ac57b34f17ed3266b404f78d2729", + "build_tools": { + "ninja": { + "path": "/miniconda3/envs/rlkernel/bin/ninja", + "sha256": "08639e194fffa7f08b259fc4abfa4803aff66b64de52549cee42ec527d55cea6" + } + }, + "distributions": [ + { + "direct_url": null, + "metadata_sha256": "6f1038270be40f9b8c0bcf391c627e7d7f41ccdd19aa192d6eac1dbfc3b19abc", + "name": "GitPython", + "version": "3.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "3f71971502087521f123c9daa26bc12d31d3466738b567390b8602acad3be22a", + "name": "Jinja2", + "version": "3.1.6" + }, + { + "direct_url": null, + "metadata_sha256": "818fb343b7b6b99a32771bf4813521ae6440b4c7579b3ae46e32dd02da0afeee", + "name": "Markdown", + "version": "3.11" + }, + { + "direct_url": null, + "metadata_sha256": "dc1ee42cf8ecfeee0ab60b15b21d291833e0732548efcb7bb5b3564dca3e5bf7", + "name": "MarkupSafe", + "version": "3.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "de7389b142450a0014234286b0876f328439b823c355c73d0aed41fd67ec208c", + "name": "PyJWT", + "version": "2.15.1" + }, + { + "direct_url": null, + "metadata_sha256": "ffcad4415cafb22b8b536a61595e9ee13438b51d31b0763c1b273ce3bc58e840", + "name": "PyYAML", + "version": "6.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "8562d701cc52d9cafbb418942b0e072fc087ed8ddcf35cd10224c1b2ed8bdd91", + "name": "Pygments", + "version": "2.21.0" + }, + { + "direct_url": null, + "metadata_sha256": "b6c25fcfdcc495edf248a10ca4ad28327ef2ed6047a6ec5c6346e121414c7f21", + "name": "Werkzeug", + "version": "3.1.9" + }, + { + "direct_url": null, + "metadata_sha256": "55c400d24c71b581d9c0992f71df6047cf6c878bebe61a7d45d6e02dc0e4c510", + "name": "absl-py", + "version": "2.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "13db521f90a6a882027b2388eaa2ebf252945f9c2adb7e7e371da18239da4df0", + "name": "accelerate", + "version": "1.15.0" + }, + { + "direct_url": null, + "metadata_sha256": "86fe44e38e67872dd895c729044942ba2c2f934ae439a899fb83a186206b7fd4", + "name": "agent-detector", + "version": "2.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "afe11fe9f5aa54e734cdd51659bed8c89dc6bcd5aef0ad96f2d20149c8de5456", + "name": "aiohappyeyeballs", + "version": "2.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "570b307bc0b53fbbd3ed2ce0b7eca6bbf2fa73bf75e24a480f1034d8c0b832bf", + "name": "aiohttp", + "version": "3.14.3" + }, + { + "direct_url": null, + "metadata_sha256": "44b7f8e14c4770793e747fad50c9e0a6ee7357651d878554f192d94768dc14a8", + "name": "aiohttp-cors", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "648813a44a9ae0ab2f20ee86d2404dcc38e3f9e80c63316cf6e536735df14e54", + "name": "aiosignal", + "version": "1.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "f6a3f6668bacef7f73a2c19ccb2be910b2363d1731c4725cb04364d99e24935a", + "name": "annotated-doc", + "version": "0.0.5" + }, + { + "direct_url": null, + "metadata_sha256": "fc6d752cde6a6a4bff03474386de750e130b75da3c7815ee909f45b51fea98c8", + "name": "annotated-types", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "4e89d670a4b20029da30e5a9e8ebcbc844deff9c44209552bafd5537249c8b9e", + "name": "anthropic", + "version": "1.9.0" + }, + { + "direct_url": null, + "metadata_sha256": "b5a6f00800956387fcddab1fe1b5aa8502c249b86cfb16d58ed700f282f60142", + "name": "antlr4-python3-runtime", + "version": "4.9.3" + }, + { + "direct_url": null, + "metadata_sha256": "a6008defa9492cd08250217b134782cad1db4580e1d7ddf69cc2a2a48cea24e0", + "name": "anyio", + "version": "4.15.1" + }, + { + "direct_url": null, + "metadata_sha256": "7877c64ce8957237363f2df313819bb07f50752df016d14c5a5a99bec10f5deb", + "name": "apache-tvm-ffi", + "version": "0.1.11" + }, + { + "direct_url": null, + "metadata_sha256": "3543ca8f0e072c00ab111b20eba99ce86dbf93ada28988775bc2677284b3c07a", + "name": "astor", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "d4b328c09c024fe1e4d788a9c7715ad726095131b815cd35fd933268226f6269", + "name": "attrs", + "version": "26.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "4850c4d696a5e2a2ecbb3dd792b060acc1de79e09800669b0b9fc3a22c055e6d", + "name": "av", + "version": "19.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "863ff92208d0a02dabfa008bfe91846a5c401ded301e5687dca7dc63c911865f", + "name": "babel", + "version": "2.18.0" + }, + { + "direct_url": null, + "metadata_sha256": "f32e6df3197f05202e586624d95c5e217003d80cee655c165d533102f628df21", + "name": "backrefs", + "version": "8.0" + }, + { + "direct_url": null, + "metadata_sha256": "905c362f655fbc6d37a24686efc2b3bfbd3123b8ee5a443a43f6750d87455e90", + "name": "blake3", + "version": "1.0.10" + }, + { + "direct_url": null, + "metadata_sha256": "07c85682b6aefd5c9b48890d306c1604311902295704892ede48e5a83219a8d3", + "name": "blobfile", + "version": "3.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "2d582941a7081625a35f35a0c4a2e80f7737312e29c38e5fdb6fc08f9c113077", + "name": "bracex", + "version": "3.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "3b60c55bae0d0340c3a3fd918635bbfa3087579da66e0fd7f6be7a3782c0da3d", + "name": "cachetools", + "version": "7.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "5d11a6878d5bc3f22290281a19ef7b36daa95c910780950608b95cd788c7e12e", + "name": "cbor2", + "version": "6.1.4" + }, + { + "direct_url": null, + "metadata_sha256": "362c9942c48051f168ed2b9f2146266b7792d3c05e164cd6afc3f3b65884fdc9", + "name": "certifi", + "version": "2026.7.22" + }, + { + "direct_url": null, + "metadata_sha256": "b4abf1bcf1c1d8e0272d8007fc974499ea59e5f2a5b98af3c78a5e67515a9d87", + "name": "cffi", + "version": "2.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "766120f13c177446f51929a4d201104bc935b6d5a2a176cd6716edce757d3d95", + "name": "cfgv", + "version": "3.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "610e9a9d03ce837ffe6e42be5e02e70087f73863f7350bf7bb7f0511edcc5ec0", + "name": "charset-normalizer", + "version": "3.5.2" + }, + { + "direct_url": null, + "metadata_sha256": "7ad836b3147c9702546d9c28b4fa5be23b24445439db5d0d2a58d17281c84daa", + "name": "click", + "version": "8.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "4c5f00599ebcbf11d337e48a72784d256ca3d704fa9e9f5daadd60065e6776b7", + "name": "cloudpickle", + "version": "3.1.2" + }, + { + "direct_url": null, + "metadata_sha256": "a0970189e3ab7a596d6902d5f61f93b414f138f03d3cf19029145657bfceb382", + "name": "cmake", + "version": "4.1.2" + }, + { + "direct_url": null, + "metadata_sha256": "94a6ebf9718e55f254a43ce0d2f04e0d6d44e7141b6f3144a84feb6519a77bfd", + "name": "colorama", + "version": "0.4.6" + }, + { + "direct_url": null, + "metadata_sha256": "ca8ec227f406d970a645ec482b20619128dd34b9cf71159cc24e27db461a2711", + "name": "colorful", + "version": "0.5.8" + }, + { + "direct_url": null, + "metadata_sha256": "bbaa51b7e4d8f142bd075d01257c0572c0c844796d51426e35c8096a13e8da76", + "name": "compressed-tensors", + "version": "0.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "6063d8ff7ebc458d63a4332853d7ababf4ee2b86336362c8d2b12be6e998eb6b", + "name": "connectrpc", + "version": "0.11.1" + }, + { + "direct_url": null, + "metadata_sha256": "ac5f4b5a5f68080bd9c3fe77399fe8a1bff2ee5923c49db1df544dd054cbf15b", + "name": "cryptography", + "version": "50.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "f41d2f6b4616accca2f5e1dd47aa9e8937c28076cde698226d93e727751f3099", + "name": "cuda-bindings", + "version": "13.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "e5ca6ed34c687c6f4a4d157ad0a2cf06ec0316fe8c4c0ddeb666ad76dd6f30f4", + "name": "cuda-core", + "version": "1.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "89baadd9da23dce9990481519544115615ba3cbd2d1a41e09feea7756fffb378", + "name": "cuda-pathfinder", + "version": "1.8.2" + }, + { + "direct_url": null, + "metadata_sha256": "1ab914b9a57ca601df2e3cfe9608427b15d8afb78029076ace5d1caf9fd45f08", + "name": "cuda-python", + "version": "13.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "73d97a5eb578223b4895ef4f234574d14219cef9999ff7d0e92a3d0dd057bd3f", + "name": "cuda-tile", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "ae6f957fe66ed63081d1d83ee6e8838f3a0af2c6fce1223629d0dd6264565ead", + "name": "cuda-toolkit", + "version": "13.0.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "1f8e0ae51ad5feea63f58ed2e24f3da6f23ed548043235a14f7623d961dd9b64", + "name": "datasets", + "version": "5.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "153f4a4d6ff03dbe5c8ad7fe54bc2e7b989a4947b70f7aa77fbf652b394f2a2e", + "name": "depyf", + "version": "0.20.0" + }, + { + "direct_url": null, + "metadata_sha256": "ee09fc752d7271aac93079cfd63409957dc6b536c1ffd9355a01bf7297e72aa6", + "name": "detect-installer", + "version": "0.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "a7feab2c4f69fd5f85e5a3cb495a7f1870a6bf8199dcee5339e8118f7acbdc09", + "name": "dill", + "version": "0.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "fef3fde661fe30ba7bd1d78841a797136b2b3461705bb4eb92dc54f8308bbaae", + "name": "distlib", + "version": "0.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "fef3fde661fe30ba7bd1d78841a797136b2b3461705bb4eb92dc54f8308bbaae", + "name": "distlib", + "version": "0.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "a3ca2e39abe76c4a33d5fe4a2a84375ec9f25cdfdb7e1d8ea406bd6f1603205c", + "name": "dnspython", + "version": "2.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "92a07daad5e6ff461199de14e845d9b376e309ef916ce5379f3c9cd4e3b1623f", + "name": "dockerfile-parse", + "version": "2.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "5b566b25f0cbe4955d0b16844a7cc6d2002caa3bde2dfda7f301fd8870cbaa56", + "name": "docstring_parser", + "version": "0.18.0" + }, + { + "direct_url": null, + "metadata_sha256": "5a1080b5768c6c591e1c4f9c9812cafa808781b9eeb198043bf185e22d4a1613", + "name": "e2b", + "version": "2.51.0" + }, + { + "direct_url": null, + "metadata_sha256": "0a63979e0b946e16238e4339e60d9c1eb5a7ce3ea93dae78b5da9c65a6190540", + "name": "einops", + "version": "0.8.2" + }, + { + "direct_url": null, + "metadata_sha256": "16cbe67a57558f1d4bfdbc22a454434ba301750c57a62b1d3f5361c9e5cddc00", + "name": "email-validator", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "0617ddb55b90b42ddc9398dc7e91d61fe928a2504939f76526dc15b22d238caa", + "name": "fastapi", + "version": "0.136.3" + }, + { + "direct_url": null, + "metadata_sha256": "ddd82b9666c21988e234d623e2575e1b89fd4133260eeab43fc9a7c074f7024a", + "name": "fastapi-cli", + "version": "0.0.32" + }, + { + "direct_url": null, + "metadata_sha256": "611602e834d42e10433155ff5f5581358d732fa6b6f6f7820a8f79e74b1ce1f9", + "name": "fastapi-cloud-cli", + "version": "0.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "794524e4a9659bda6043721d848d028ea49996085a33326094fbaaa3f6e6b895", + "name": "fastar", + "version": "0.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "711401d36e60e10e35beb4d0f1bb42bf0c4d86339ae52f32b9aa4a4d790530dd", + "name": "fastsafetensors", + "version": "0.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "efaea9742e348c4c4bdcc6f616a33cc5aa3ae926494a72a46690b7da2f08ed5c", + "name": "filelock", + "version": "4.0.7" + }, + { + "direct_url": null, + "metadata_sha256": "99bd6c3f10781d3d2d350f2c3c9fc4765b55f25de8a6d6dd1f71501802d1255e", + "name": "fla-core", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "0a6ef979b75295cee2b5293ad4942b0cf2682e9e38680203064e0b70249c1a96", + "name": "flash-linear-attention", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "76b70a11ca82ea4606b529e7a8658cb3fe71412afa46f2ed57101dd91ba27558", + "name": "flashinfer-python", + "version": "0.6.18.post1" + }, + { + "direct_url": null, + "metadata_sha256": "ba8ff415192b5cbb90efce046e2271a00c8184afc362d8b47fbbc84d5e558b05", + "name": "frozenlist", + "version": "1.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "e7712831c80eb13b08fb7f7cc33988a8f24654af9eba7c6f5f943b2636e4306a", + "name": "fsspec", + "version": "2026.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "025de85c794878d0caa737869307447595f514ebf9599eacb5b1a501bae479b6", + "name": "fsspec", + "version": "2026.9.0" + }, + { + "direct_url": null, + "metadata_sha256": "ca94883bdeaa3740b45b6994443b445fd67c6e4a8064ac3bf9d92d2a5221eee8", + "name": "ghp-import", + "version": "2.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "a7e90983562a035cf767baa63d8c32bc37e1de7cad71ac7b6b2bc70a95bba4eb", + "name": "gitdb", + "version": "4.0.12" + }, + { + "direct_url": null, + "metadata_sha256": "dd96143ec79178bef685c1f5c0a58a87a66d003b421e605de65697308321d518", + "name": "google-api-core", + "version": "2.40.0" + }, + { + "direct_url": null, + "metadata_sha256": "0735d57088a83df2355e16843107fb0112abe2178fc5bb8132947a7ad962aa41", + "name": "google-auth", + "version": "2.59.1" + }, + { + "direct_url": null, + "metadata_sha256": "2f3aa9d9500d329560440e6a5a152e420aad5f5bbb23701f45b740be721784a1", + "name": "googleapis-common-protos", + "version": "1.75.5" + }, + { + "direct_url": null, + "metadata_sha256": "06d74ab04fdc03fad368868907f0d10e7d9f397aab58d58965c0b78ffaec34cc", + "name": "griffelib", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "7ee1c179e2c68a62968308b2f96f4f3469176ee3ac8bdb494ac80188d4d41271", + "name": "grpcio", + "version": "1.84.0" + }, + { + "direct_url": null, + "metadata_sha256": "04cf3a4a91575850f386f4fcfdedd8e7fbfba08feff038fbc1296d1e854db2dd", + "name": "h11", + "version": "0.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "b954a6ba4739c0cc878bb8ea27ea7c7154a48bb4b7c06dba9e9cf880cf0ec930", + "name": "h2", + "version": "4.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "6f0d7bf86e75d0bda1ceccc82367c0145ad0ec522c4d4f51bb454f467faadcc9", + "name": "hf-xet", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "f991b847550cf8225f69562902b5ccb591b2ce9a08fe07ef6e6d701bdb4694a7", + "name": "hpack", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "314d194165c4700034c1c67cee847d549a6d7091374c71f2cef0186ec56a3eb9", + "name": "httpcore", + "version": "1.0.9" + }, + { + "direct_url": null, + "metadata_sha256": "aed9767360bed1bcbda71e3b1a3c996603f86558bc77a1693ee3d09973d20cad", + "name": "httpcore2", + "version": "2.13.1" + }, + { + "direct_url": null, + "metadata_sha256": "8fa3bf3510c35e2eea9f523a1cace7120079cf51d76c4acea97de95806aaa14a", + "name": "httptools", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "3bf4804c215d111b6a4702cf9000021ab39807d1ed3207dd011b14b2843b2d14", + "name": "httpx", + "version": "0.28.1" + }, + { + "direct_url": null, + "metadata_sha256": "d11dd50813b8914bd9455e8b2b591171cd2b1618883943153afadc8bb9224678", + "name": "httpx2", + "version": "2.13.1" + }, + { + "direct_url": null, + "metadata_sha256": "43b119c34ad2b2aacc032a1a6a8feb142fdb5ca407a3519325d74dd53d8904df", + "name": "huggingface_hub", + "version": "1.33.0" + }, + { + "direct_url": null, + "metadata_sha256": "9ce850d5a6b775e5ef4a335f907e579a878e058213121b6eec567781ea68c585", + "name": "humming-kernels", + "version": "0.1.12" + }, + { + "direct_url": null, + "metadata_sha256": "67aa4f6717d82446a51ce350e7c4769eba0c4a22d2f428255cddd9d24b11a914", + "name": "hyperframe", + "version": "6.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd9511ede42f63b995c3f71944f908cb8f014048b63ecc1c8d420525a3354b59", + "name": "identify", + "version": "2.6.20" + }, + { + "direct_url": null, + "metadata_sha256": "af3c3a62bb5d82d6a43454684e0b1dedde27a21ea90eacfb1bed9814619f06d0", + "name": "idna", + "version": "3.20" + }, + { + "direct_url": null, + "metadata_sha256": "cf71393f3d079ce2e859384573e65aaacd1709bef700701f629df32398b598f0", + "name": "ijson", + "version": "3.5.1" + }, + { + "direct_url": null, + "metadata_sha256": "9305763e93d03df0e36516b1125fa046a6ebe37d44589e200e0593cf4bdfd980", + "name": "importlib_metadata", + "version": "9.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "32860c3c19b2e91f6cb5bd83400b5870cda051bc74a5a08822c8c666af0990db", + "name": "iniconfig", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "560faabb3d45d779e445a74e7e806a786f95f2200fa06d979603b7f0ee1cfb39", + "name": "instanttensor", + "version": "0.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "f6fc1f0d389e4245fc2a1a0fdfee09422e56200cb6f94659668456997ff4f7a9", + "name": "interegular", + "version": "0.3.3" + }, + { + "direct_url": null, + "metadata_sha256": "d10f300731197a4829b77f0c883bb3cf8a37ae8c76a302e095fa95d6427706d0", + "name": "jiter", + "version": "0.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "5b0c8d4b4c535a2432fb206223d774509b6e20af374c6a4b6f98bf72a7de6702", + "name": "jmespath", + "version": "1.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "6c4032c2e74273452cd77399af2ee85198f49c22da897983f26d2ed6f787c4e8", + "name": "jsonschema", + "version": "4.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "aaa6cd66f423729e8da397c9d533b7d731f6b25f3d6371b9338c36bdb9be74a0", + "name": "jsonschema-specifications", + "version": "2025.9.1" + }, + { + "direct_url": null, + "metadata_sha256": "f7c0687c032593106a2e5a3c241cf8043e7e2c222bddb0022b4cb2bf5de67115", + "name": "lark", + "version": "1.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "4511c6b04efc57a5f5333edc1f5f48b9f5412c3923d4bc19b715bdf47977511c", + "name": "linkify-it-py", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "be929870f6ecae18a819c56118f1101f3076e25ac6a4843ca6f4707ebd1e87c6", + "name": "llguidance", + "version": "1.7.6" + }, + { + "direct_url": null, + "metadata_sha256": "cf2b87669bead3e76ec54207f3354c13f73b50c32fcd13c8d627084b3379139e", + "name": "llvmlite", + "version": "0.47.0" + }, + { + "direct_url": null, + "metadata_sha256": "0a416d79c5543d94d2b18807626293d4f47655d1d22724c7ae296e413078aaba", + "name": "lm-format-enforcer", + "version": "0.11.3" + }, + { + "direct_url": null, + "metadata_sha256": "16bc1f59e34fd2a6633bd395276052eacd2c777b2cf72781e76b203f013a8fac", + "name": "loguru", + "version": "0.7.3" + }, + { + "direct_url": null, + "metadata_sha256": "5216d5acfd039a7b581a826186309594b228d37d2c8d56864124ea666689fe4e", + "name": "lxml", + "version": "6.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "f59d772b35315a928672bfcccfb89d82c0aac672c5275c048f7a93b79015bcea", + "name": "markdown-it-py", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "b137367ef0056711cbf5e53015df9168cab80373104e7899b1c0263a21d9c99c", + "name": "mcp", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "38e0b9edaae09e58cd1461fc961ced22672038a697930bedef153a74befb3de1", + "name": "mcp-types", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "799f49685865fd9cc8915fdb92a33e102eeeffad562b03b4aeffb6f422b771c1", + "name": "mdit-py-plugins", + "version": "0.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "481f9cbe08596c6eaba6343e0efa1b13b2362c30dce0610f7c08523f1d98388d", + "name": "mdurl", + "version": "0.1.2" + }, + { + "direct_url": "{\"dir_info\": {\"editable\": true}, \"url\": \"file:///Megatron-LM-training\"}", + "metadata_sha256": "2876c0c760bbfc93bd7d737bf0db2866a937308a7c1707c3a2bb59d4795986ff", + "name": "megatron-core", + "version": "0.16.0rc0" + }, + { + "direct_url": null, + "metadata_sha256": "a6e34d488c879f57ce042bec38f8864ba3ea7d6ecf0ab757fc88fe8dc0a22f26", + "name": "memray", + "version": "1.20.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd26d80dc9676b1fb8c894355bd525fbe7f49a6a86a555c72e9ec6d927247c33", + "name": "mergedeep", + "version": "1.3.4" + }, + { + "direct_url": null, + "metadata_sha256": "dd1b3b89e88d1c65a26e6e72dd075eabbc220bfb138769ec8b64578ee911795c", + "name": "mistral_common", + "version": "1.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "4859847a9f6321daf8849cf7fd1542ff430db6563a2abf9ac0d62a5b21bd951d", + "name": "mkdocs", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "1729fc31479f2582486cdc85397417659dd3b2fb3f920553de66cfe59d5f0b3e", + "name": "mkdocs-awesome-nav", + "version": "3.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "88b4b7b7c0aba5547befdedaf515c8df4867361daf55ff60b72578464d72dcbe", + "name": "mkdocs-get-deps", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "ad33bb33fb16b1f69689c4682550e97232154e367e2c8c8aee9dad0f10d269ce", + "name": "mkdocs-git-revision-date-localized-plugin", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "ed69fbfb9ac00c10c5a383a12ff9d2b9919ae184e408554434199211643d6040", + "name": "mkdocs-material", + "version": "9.7.7" + }, + { + "direct_url": null, + "metadata_sha256": "d1c549b61701148b97f8246bc924b2840e504b37b0ce7a27e78ddf81261e5363", + "name": "mkdocs-material-extensions", + "version": "1.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "4ad6171f3bf6812e4de90670ff0089d445093d4fe1d05d55f17b96a4a192a816", + "name": "ml_dtypes", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "4ad6171f3bf6812e4de90670ff0089d445093d4fe1d05d55f17b96a4a192a816", + "name": "ml_dtypes", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "b0dbdfa30ab6b1ce637a794899c9e43019182b6d1ab2d07b90f647f7331eba6b", + "name": "model-hosting-container-standards", + "version": "0.1.16" + }, + { + "direct_url": null, + "metadata_sha256": "95424470e481cfa8d18b30963b6de3aafe16614b1ea0414e184a008571dde84f", + "name": "mpmath", + "version": "1.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "eb184d83489401903615ce8a78d98d5b933dec0f7246811d396a529915fe797c", + "name": "msgpack", + "version": "1.2.3" + }, + { + "direct_url": null, + "metadata_sha256": "520006303d6a0e859970b83f7d452196e2e8f6dab08f6dcf1ba5823c1230025f", + "name": "msgspec", + "version": "0.22.0" + }, + { + "direct_url": null, + "metadata_sha256": "010d2fe039006070a711a476b171b7b7da5c29ccad3c4eecd77ef3711b07c2d0", + "name": "multidict", + "version": "6.9.1" + }, + { + "direct_url": null, + "metadata_sha256": "235634cc7ebda45f8a84dfdb1b9b35ac1a77a1888b34650c3a616d23e4a7e93f", + "name": "multiprocess", + "version": "0.70.19" + }, + { + "direct_url": null, + "metadata_sha256": "7c545b4b3e5e83d3fde41352272c10cb9deeaba5b7138fbf24383e952af8822e", + "name": "natsort", + "version": "8.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "311ee8cdaeaf9f11acf51cda9c3b5b191f76ce9d98bc3418164c3189bbc37a08", + "name": "nccl4py", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "66360539217852c3b44b37f409eade7e1559baf018bb363bacb2aa3a9759b203", + "name": "networkx", + "version": "3.7" + }, + { + "direct_url": null, + "metadata_sha256": "e8b0b1746808b87816c47e4531780ded7f246bed9575a89e8b40200aa81e9a13", + "name": "ninja", + "version": "1.13.2" + }, + { + "direct_url": null, + "metadata_sha256": "77c1117f0dbc41560ddc6e6b37b542fb4e88afcd4ef82ec06593e5bbd5f37121", + "name": "nodeenv", + "version": "1.11.0" + }, + { + "direct_url": null, + "metadata_sha256": "9af629898406c9eaa69897fe09220dc483270cdba89f6b20bf0165cdf0e1668e", + "name": "numba", + "version": "0.65.0" + }, + { + "direct_url": null, + "metadata_sha256": "0c7281a81cf76e40b27c1385ffd8a215d7227adc219f177ce807ead9e91994a5", + "name": "numpy", + "version": "2.3.5" + }, + { + "direct_url": null, + "metadata_sha256": "0c7281a81cf76e40b27c1385ffd8a215d7227adc219f177ce807ead9e91994a5", + "name": "numpy", + "version": "2.3.5" + }, + { + "direct_url": null, + "metadata_sha256": "bab990ced4537ce74ef5961ca933c4c6fd604fd09a5827a4a428c55bcb0be35b", + "name": "nvdlfw_inspect", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "10f6595146332d35f7f15a000e08b5c81432528c5d026470c1d03f0c1399fb70", + "name": "nvidia-cublas", + "version": "13.1.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "58e933b4ac8e49f098b16ab7480d03bd792afc3d1db10d0aacbdcc2c62e48fa3", + "name": "nvidia-cuda-cccl", + "version": "13.3.4.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "baac937970681d41aa0c3708b3d55d73f8d29e70aceaac0e71fe6d1548e94a09", + "name": "nvidia-cuda-crt", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "8d51e5c76ef5707b0b80d5ec9a791c0f11a480ab721820cf100a3cc566017eef", + "name": "nvidia-cuda-cupti", + "version": "13.0.85" + }, + { + "direct_url": null, + "metadata_sha256": "724bf56e61ddef5d4c2482ff64103a973b911b110b668acaea5373f6c83c1c5c", + "name": "nvidia-cuda-nvcc", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "c54801dbd815d534519a761f1f328325aa0f1d1f1659aa969fa74e7a2c76eee9", + "name": "nvidia-cuda-nvdisasm", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "af51f248363020b9fdfd2743704e901bf3d19a1a1ce1fe44fb98ba148bfc0157", + "name": "nvidia-cuda-nvrtc", + "version": "13.0.88" + }, + { + "direct_url": null, + "metadata_sha256": "055f7fc69a5a2159de82cd0718da02c8852e81c8a71ebb117b8e799badd7167e", + "name": "nvidia-cuda-runtime", + "version": "13.0.96" + }, + { + "direct_url": null, + "metadata_sha256": "df18686dbdb3074ca375a1d6c623a04102fd348950c67a721397349c6d4f0477", + "name": "nvidia-cudnn-cu13", + "version": "9.20.0.48" + }, + { + "direct_url": null, + "metadata_sha256": "abd0ca3f67af19a4d383ff2a012ae0090d4731c6492fd47236615308a50b3981", + "name": "nvidia-cudnn-frontend", + "version": "1.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "4a78545d424d0c5038353f7046a8ae40ceaf312045d71399eac9511f5fc15434", + "name": "nvidia-cufft", + "version": "12.0.0.61" + }, + { + "direct_url": null, + "metadata_sha256": "e49b909195c03ddbe203729d9b31dd88e3f207368333d1909c67c6b130a0c696", + "name": "nvidia-cufile", + "version": "1.15.1.6" + }, + { + "direct_url": null, + "metadata_sha256": "bb15a754c6be32c23aaac13c1cfa7a8ce53d92bc26652ec3b609f7a5cce3e7d1", + "name": "nvidia-curand", + "version": "10.4.0.35" + }, + { + "direct_url": null, + "metadata_sha256": "0dd58f677811eac04901a793740932e5a2a8fff2f5453aa6351614eb18391bb6", + "name": "nvidia-cusolver", + "version": "12.0.4.66" + }, + { + "direct_url": null, + "metadata_sha256": "8aeb284782ef6883095a5d1c110e221cad023a99afcfd5cdb4969a25e146d562", + "name": "nvidia-cusparse", + "version": "12.6.3.3" + }, + { + "direct_url": null, + "metadata_sha256": "09555246122896eaca3b8313eecfca4b339fefd3b597874cb9fe3bf29dab38c9", + "name": "nvidia-cusparselt-cu13", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "ac77bac79fbfb0c52ac6e2e5abc936b1e127be2192f0cbc27b00be3125fa86ae", + "name": "nvidia-cutlass-dsl", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "1ec968ec7c4083f7fe4e1fb8384c7e9b853a81491fef9f4cb1cf755961aaedf6", + "name": "nvidia-cutlass-dsl-libs-base", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "cc6f3846cd820013eaa6e2665c493d70c607be6ce7349b939eb4742888470585", + "name": "nvidia-cutlass-dsl-libs-core", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "2357d0df2d0d17c0b16663b8a89df53f751b19721f66821fd88fa78112c08e55", + "name": "nvidia-cutlass-dsl-libs-cu12", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "244590c25662dcf777b1daae97a858afe1a1aec62e5e6678b217007a459ab552", + "name": "nvidia-cutlass-dsl-libs-cu13", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "c3a25ada01f57418c1b897406c3abab18834e6adc573ab7b060620c453afb6db", + "name": "nvidia-ml-py", + "version": "13.615.71" + }, + { + "direct_url": null, + "metadata_sha256": "56baad4e7f699902b03b17580933f7bd50b6ea97b7df9d7e807750973da7529c", + "name": "nvidia-nccl-cu13", + "version": "2.29.7" + }, + { + "direct_url": null, + "metadata_sha256": "98810ef0ab8badc369e6a46a038f8ee9f412c0c753fb5ad580544f23a0aa7962", + "name": "nvidia-nvjitlink", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "b0f54ee21909d19640a58e05da755c91763eb5725f544fd0d4b84b2f5f94deba", + "name": "nvidia-nvshmem-cu13", + "version": "3.4.5" + }, + { + "direct_url": null, + "metadata_sha256": "06dc1a593c7e8b8c3f29184228c83f8f7ef57787ad91f3e5bcae1d238dd3092a", + "name": "nvidia-nvtx", + "version": "13.0.85" + }, + { + "direct_url": null, + "metadata_sha256": "32ee63450a437b6a6ed227ff6549144aa596197a322993521ec7af826ebd413e", + "name": "nvidia-nvvm", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "32c2efdcd2c673b3b7f35ca9c2cccefaad36f1f0a920648a13cad85f6a5767b2", + "name": "nvtx", + "version": "0.2.15" + }, + { + "direct_url": null, + "metadata_sha256": "3419d80e114a2c19fa9bd3582939a3942f19673055707ba6ca2ca489d58b41e0", + "name": "omegaconf", + "version": "2.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "28971076ce9c279d4b889496b046d55a1e05b02fb9851ceb717e9a10df799572", + "name": "onnx", + "version": "1.23.1" + }, + { + "direct_url": null, + "metadata_sha256": "1246f5a4d8295907a42e809ed9173ede2510ec9d260d2168989d126564897fa5", + "name": "onnx-ir", + "version": "1.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "e14643636835759700dff286f949c5ec34e7eac7ac47f44096414f0e0f1c3101", + "name": "onnxscript", + "version": "0.7.2" + }, + { + "direct_url": null, + "metadata_sha256": "00f847e99939207bd70dfd806428f6b20a3d01074b59325e4c76149a2e19be26", + "name": "openai", + "version": "3.22.1" + }, + { + "direct_url": null, + "metadata_sha256": "598d3ad5a22a14a7c4f1d218b43e345f32b0ba094b753467bae8a3f708fd48cb", + "name": "openai-agents", + "version": "0.22.3" + }, + { + "direct_url": null, + "metadata_sha256": "5a0afcb1ce845e05da12beb1767f5d2749bbc9e9050718c6b9fa3c225713c9eb", + "name": "openai-harmony", + "version": "0.0.8" + }, + { + "direct_url": null, + "metadata_sha256": "e86a6b6fcbbe152805f782c57df321002892e163019574877e9829272e25eb4e", + "name": "opencensus", + "version": "0.11.4" + }, + { + "direct_url": null, + "metadata_sha256": "53d669c8bd3d32d3275153b454e515ca5cc6dec92fae3a98309b5a2b19fe6d2d", + "name": "opencensus-context", + "version": "0.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "19778b6d66b0e45bf73e11fa37a208949d5b393aef914627394d5601455546a6", + "name": "opencv-python-headless", + "version": "5.0.0.93" + }, + { + "direct_url": null, + "metadata_sha256": "19778b6d66b0e45bf73e11fa37a208949d5b393aef914627394d5601455546a6", + "name": "opencv-python-headless", + "version": "5.0.0.93" + }, + { + "direct_url": null, + "metadata_sha256": "a3f5434fa7c80f7f7abc82173da639c8e9c59d30b4027182645562bd3d2f4f97", + "name": "opentelemetry-api", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "8611977ea596e4827874582e86250618444e1c718229dddfc16e5ea437ce5fcb", + "name": "opentelemetry-exporter-http-transport", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "2cfd41e5ca33292d987ba71fa6186d11e16ed66888f3a26f8a3a99060c4b5e90", + "name": "opentelemetry-exporter-otlp", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "3bb4494220732d4bf10e1dba231ea7638cedaa5362e1f23a50d34a14f520fea8", + "name": "opentelemetry-exporter-otlp-common", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "27fb1c8aa5c2cd07776f9f3281fc618cd3feb96017757c33d2b3586fb7fec88b", + "name": "opentelemetry-exporter-otlp-proto-common", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "5cba6098cdd0bfb06853a6c704a2451c4f82c9dea376a30b59ecd279296648ad", + "name": "opentelemetry-exporter-otlp-proto-grpc", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "6f53ef1c172ebf87af69b9ef390aa908506d0cd14bc7811985fdd937a4058808", + "name": "opentelemetry-exporter-otlp-proto-http", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "1910f4e7ebd497e98b6d231e10275288fda2cd1885117575706c62f45e065889", + "name": "opentelemetry-exporter-prometheus", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "fab18b721e30be41448be252e1dca43b48e7f15d971e0bb552492c0ef4b07bee", + "name": "opentelemetry-proto", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "3644a79f55762a646799ff52b9d837e01c8192b7b28f735a383f55c90edb9bc2", + "name": "opentelemetry-sdk", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "add3db481f7f401f65cfbddb058fde3bb4c9dd7b61064a84f8598ad7efe0b11c", + "name": "opentelemetry-semantic-conventions", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "0dfff30e912520a226bcf7a547393484cfcd8c738439c7b48418f61c95109480", + "name": "opentelemetry-semantic-conventions-ai", + "version": "0.5.1" + }, + { + "direct_url": null, + "metadata_sha256": "210ce26bad0a245a72831b4fa029708c245d4d670a88c8d5a69b1446c24a95e4", + "name": "orjson", + "version": "3.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "35ff73511848f5f934ccc39d538014716ec4579e76d54e0e407ff51794a7939c", + "name": "outlines_core", + "version": "0.2.14" + }, + { + "direct_url": null, + "metadata_sha256": "8ee2f7138ade46b6e348a6d099612f5bd6caff13511f3b4144327f37ce50eacf", + "name": "packaging", + "version": "26.3" + }, + { + "direct_url": null, + "metadata_sha256": "a4ab87bf8083001f25ccdc46095f05b678b3569dd58edc2cf941e3e7f64d7c88", + "name": "paginate", + "version": "0.5.7" + }, + { + "direct_url": null, + "metadata_sha256": "1de96a6c28c2e5613c9c87cd4ad9484791001cf58df43cf2ba74d5c4f85f0ad2", + "name": "pandas", + "version": "3.0.6" + }, + { + "direct_url": null, + "metadata_sha256": "d05b8d05da9f78176b2eefaacdfaa5e96708ec4f488daea8bbc52e3ed1bc3954", + "name": "partial-json-parser", + "version": "0.2.1.1.post7" + }, + { + "direct_url": null, + "metadata_sha256": "c1d126edceac2685e29403a8ae3a27c47143dce1f0252fa3931771562f1e2b4f", + "name": "pathspec", + "version": "1.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "30325dc8ce17bc64f9dbc0a449232fd35841a019df22a6f481007c9c5a28c1cb", + "name": "pillow", + "version": "12.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "cbc0b7b6e63b50dcb7c17cf3526a9304f285d9a31353adf3b22acc2059ab23f5", + "name": "pip", + "version": "25.0.1" + }, + { + "direct_url": "{\"dir_info\": {}, \"url\": \"file:///work\"}", + "metadata_sha256": "6ba03b5bc457a2a3d92468729501b5892a0d38ebcc36766c58859449498c5743", + "name": "pip", + "version": "26.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "0421937c4410b61c5325233d5b7671ae933bae8de174f87586ac55aa804851ea", + "name": "platformdirs", + "version": "4.12.2" + }, + { + "direct_url": null, + "metadata_sha256": "2bcffab42626e1fb50d6329765619312d30fe7f4880e98dcee99c92ebd283bb4", + "name": "pluggy", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "7e7562ba7c032f8edd02641ae71b1ac2d8f388103a68d777a7e907d19e75bc17", + "name": "pre_commit", + "version": "4.6.2" + }, + { + "direct_url": null, + "metadata_sha256": "bbe0a7662602ddd23f929fe0ee98e9d04406e138aeee18ce4861af186ea6060d", + "name": "prometheus-fastapi-instrumentator", + "version": "8.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "ece4a61f3ffb92a083fd5e47e180e3e070342e60a3bd93876a879e79a643e821", + "name": "prometheus_client", + "version": "0.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "5feba21a58eaa126e7e7739e57e2572e5bb251fcbf56e439e508acc47d769314", + "name": "propcache", + "version": "0.5.4" + }, + { + "direct_url": null, + "metadata_sha256": "3f136dbf7239c987a7685acd33440cc5efd6c4107b4b11c425201b4de70ae36f", + "name": "proto-plus", + "version": "1.29.0" + }, + { + "direct_url": null, + "metadata_sha256": "118b5ad013120a7a6e24714595ad776bf264d7b0060389133310d18ea1480902", + "name": "protobuf", + "version": "7.36.2" + }, + { + "direct_url": null, + "metadata_sha256": "0849f5a519bf9bc23ef204443fdd8d6d10678863acac7ca9340fc11bfba5a856", + "name": "protobuf-py", + "version": "0.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "eab5f2f4fd98f67a710a8fb1975b64ffa880a4f977566f022c567e08e324ccd6", + "name": "protobuf-py-ext", + "version": "0.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "39009938840de3a8b2a37eb4668d2601aae8c74e4b74743f73e59996b5b7e6e1", + "name": "psutil", + "version": "7.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "df44b58e8a4cfe57f65773ec47f7bdf2a14c8f5f73a7abf331a6b6237d6d691a", + "name": "py-cpuinfo", + "version": "9.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "2fd4a9efc5e5c74ae4c2fcf1970193c524c62ab22af8d5e66ebf7df9e6e46e83", + "name": "py-spy", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "d2ccdeb15cddedc81637a83e40baa6397fe269023b738d0fc3cb2d90722e290b", + "name": "pyarrow", + "version": "25.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "47b9f28e971a56f5adf949e0bcf105b0bf6587946566ecf197a2819d8848cc01", + "name": "pyasn1", + "version": "0.6.4" + }, + { + "direct_url": null, + "metadata_sha256": "82ce4c01c6d36841b9801fcdabab9bfe61d0b5e4e440c275941d8a2d4a790730", + "name": "pyasn1_modules", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "45cb345e4c12f63bc843b8c88902cc44c4d624a55aaef8cd5ffbc0ad16356fbe", + "name": "pybase64", + "version": "1.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "d311ae661edeac8ff029ab2960d065a7e792ebf8f79af682daa53109fe81318b", + "name": "pybind11", + "version": "3.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "cce9c0d440d065d4cdfb0d00004b8ddd65cf363a740efc5b0920b29201a59cd9", + "name": "pycountry", + "version": "26.2.16" + }, + { + "direct_url": null, + "metadata_sha256": "a1e33542883c249bf6c263b0023b9ea8a6131a77d9cb2cbc88316968e5eada83", + "name": "pycparser", + "version": "3.0" + }, + { + "direct_url": null, + "metadata_sha256": "faffcc4d7d359cb1047a9f67f7c65096b838c6db6c62852ef20fb27d55649a95", + "name": "pycryptodomex", + "version": "3.23.0" + }, + { + "direct_url": null, + "metadata_sha256": "98929f4cb80451dc3c6c8cd541a3081dccf0dee94afe7d9fa5c214a18ff236ce", + "name": "pydantic", + "version": "2.13.5" + }, + { + "direct_url": null, + "metadata_sha256": "8eccadbe707db97c397fb79073fe791b7998ef3a85f04f817f8991f7697b190b", + "name": "pydantic-extra-types", + "version": "2.11.1" + }, + { + "direct_url": null, + "metadata_sha256": "8f00c91deb34399316a5386eb2e76fe09f14a08dc3045f2e7dce9bf8573796bd", + "name": "pydantic-settings", + "version": "2.15.0" + }, + { + "direct_url": null, + "metadata_sha256": "66c729edddc20bf2764bb18bd87d907b08690e50355f39b97acc737b26d1d164", + "name": "pydantic_core", + "version": "2.46.5" + }, + { + "direct_url": null, + "metadata_sha256": "394500d78a0c1a433ae8ca3693152c08f6a901121d4b069cf1540a19759e2950", + "name": "pylatexenc", + "version": "2.11" + }, + { + "direct_url": null, + "metadata_sha256": "df2e9e9847a2aea0ae6e20fd325aeb16cf3ce7f8913462db6c2398363cd0c0bf", + "name": "pymdown-extensions", + "version": "12.1" + }, + { + "direct_url": null, + "metadata_sha256": "82fcfe724db9f0b51348da89f4f5cdc0b08d08882b1bbc0ca4913d3a0a93bcb9", + "name": "pynvvideocodec", + "version": "2.0.4" + }, + { + "direct_url": null, + "metadata_sha256": "3722422cc1478b175879143dfb78f98b7a5f53f4f684d71b7054fe2e8acd3b89", + "name": "pyqwest", + "version": "0.10.0" + }, + { + "direct_url": null, + "metadata_sha256": "7d1d1c276b7c372d55d17ac7d30f0a4b80a746e147347b8510d1355eea7f80c8", + "name": "pytest", + "version": "9.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "89e7c1c932e52b74bdcaf504389d2d1a2d7ca559b02bf5a09fc80ebd58ad10f7", + "name": "python-dateutil", + "version": "2.9.0.post0" + }, + { + "direct_url": null, + "metadata_sha256": "54f30f811841b6d772f31715712c85bfe0041839cb071f78daf41c700a98642b", + "name": "python-discovery", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "54f30f811841b6d772f31715712c85bfe0041839cb071f78daf41c700a98642b", + "name": "python-discovery", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "0cc19efd76cfbf3bcb2cb0d3ab82191036855859455aa3812c5e9e591e3f34e8", + "name": "python-dotenv", + "version": "1.2.3" + }, + { + "direct_url": null, + "metadata_sha256": "1d866c6124631b9ce1797ad412fff298ab53fc2d95210281d7c8f20e920753fa", + "name": "python-json-logger", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "2d18a1e7286d92a656ead5ec6f83d5ae6dc858634624f6b264703ae88d24d718", + "name": "python-multipart", + "version": "0.0.32" + }, + { + "direct_url": null, + "metadata_sha256": "beaa0efe9ba4b34843f5a0fc7379a73f10e95adb8cc0c31f359ab6f3a42b4def", + "name": "pyyaml_env_tag", + "version": "1.1" + }, + { + "direct_url": null, + "metadata_sha256": "238dc769e22d4f5626750cdff36e920e4a8d69c10d88de6d79b40a59cc13d873", + "name": "pyzmq", + "version": "27.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "de0a5e855bb5bb78b7acdcd2ca60619c6a0c109814881589caf158ec07155662", + "name": "quack-kernels", + "version": "0.6.5" + }, + { + "direct_url": null, + "metadata_sha256": "961ffef199b876fb4d7b10903d78e79f359d703b1638834c61d70b9879932918", + "name": "qwen-vl-utils", + "version": "0.0.14" + }, + { + "direct_url": null, + "metadata_sha256": "faf6ab9027d12de992827a2d8a224996fe6747a8c5f7d31ae495983dc73eefe9", + "name": "ray", + "version": "2.54.0" + }, + { + "direct_url": null, + "metadata_sha256": "c50d8b3ff4d113925b60dc47d1d28e87248a3338024241b0a3a66c8794fbce0c", + "name": "referencing", + "version": "0.37.0" + }, + { + "direct_url": null, + "metadata_sha256": "02acdc52d6f21d5f4b172254daaa94edfaa44c9ebe14d1c00cc4c8fe99b0e1df", + "name": "regex", + "version": "2026.9.29" + }, + { + "direct_url": null, + "metadata_sha256": "ac08207697217d1ffde8a161b424d77d6e2af6b62630fa26d75d08f11076cdca", + "name": "requests", + "version": "2.34.2" + }, + { + "direct_url": null, + "metadata_sha256": "f1abd635c3dff607a4fd654c62a88d9d4c21843cfc9176116c156f4269ca21b5", + "name": "rich", + "version": "15.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "932ff7743a756d0efcc45528d64c275ac3cb40a8dd1787ea10cb303907f0ae4f", + "name": "rich-toolkit", + "version": "0.20.5" + }, + { + "direct_url": null, + "metadata_sha256": "294a1405c0fa34b5f735bcb46459050436849a1e584c643544de99c07c529fb7", + "name": "rignore", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "5e54dd00b4ad336c5161d47de2a5c2212090c44629c28b6538b156256e49282d", + "name": "rpds-py", + "version": "2026.6.3" + }, + { + "direct_url": null, + "metadata_sha256": "0d5895abd80bfc0027c02943abaea4547061b9004bd134950d640d619a697835", + "name": "safetensors", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "91d5de3f641f33a8fbb4b6e91772da68d50b68686971d7b66af2068f2e77b694", + "name": "scipy", + "version": "1.17.1" + }, + { + "direct_url": null, + "metadata_sha256": "297fb30f701a800489c12893a951da3e5bd1f80061a1f43f0d3e9f1d4c6bc6fd", + "name": "sentencepiece", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "4245e0388ddf2048a38ae2a24a3d2c583408b2454aadc680d3c3beede639db3f", + "name": "sentry-sdk", + "version": "2.71.0" + }, + { + "direct_url": null, + "metadata_sha256": "ae8a9e6feec1a76e954d65ea48ac57842c9a7bfb5ac6e5ea82400a5ba9f71a98", + "name": "setproctitle", + "version": "1.3.7" + }, + { + "direct_url": null, + "metadata_sha256": "341d00772017437d0f6e3c943ae353f243c39fedfba403aea47cced927a76516", + "name": "setuptools", + "version": "79.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "ff4bcfb192bd542ed8f1794fb32ffc9eabd932d6e03cb00a4ad5e35a2469af88", + "name": "setuptools", + "version": "80.10.2" + }, + { + "direct_url": null, + "metadata_sha256": "f1e5a532fb8cda0bbc370e3db6cb9cea72a065d12ddd6a14976ba3cf66264221", + "name": "shellingham", + "version": "1.5.4" + }, + { + "direct_url": null, + "metadata_sha256": "2aba2cfd9c2ad7625a5d374d141af317d8f92d3534997bf98d127e52848dfc81", + "name": "six", + "version": "1.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "69ae2dfe547624be97fae348e1cfa3793f8854eed32cc1603badedc7d48fb36e", + "name": "smart_open", + "version": "8.0.2" + }, + { + "direct_url": null, + "metadata_sha256": "d415e6c6de7dee117d254a342668c489931bc88eac7ec8678b452078e366da6e", + "name": "smmap", + "version": "5.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "093bc4f0740a6fc28692e616aa8fe68d7e1d76426cc5a5faf9ea722a8ee7aaae", + "name": "sniffio", + "version": "1.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "b3cef071eb1dbeaa76a1273fe2ca2cc8ef36e835165253952d93780962529ac1", + "name": "sse-starlette", + "version": "3.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "3c01ca830e213f0311fe37bc3b46b8ab230a5e7acb894bf0fc8785cb7ccfed48", + "name": "starlette", + "version": "1.7.0" + }, + { + "direct_url": null, + "metadata_sha256": "6017ca508a293cf47a88a78cb330e9cbd131d74ec3c7fbf89bd4300ed3129d30", + "name": "supervisor", + "version": "4.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "fd5eb4925b04f9bffbc6c4f92bf8aea7243b918b43cd359493fce48a7dd3b336", + "name": "sympy", + "version": "1.14.0" + }, + { + "direct_url": null, + "metadata_sha256": "f09f0e24282c5a86346bcd5b10ae5ff81869fa8ef69c3ba524bd0a817a87dda9", + "name": "tabulate", + "version": "0.10.0" + }, + { + "direct_url": null, + "metadata_sha256": "519fa19c146fd58a0a75ecf1461e4bd98f9c06d01800c37d4a80f5fef095f4e1", + "name": "tensorboard", + "version": "2.21.0" + }, + { + "direct_url": null, + "metadata_sha256": "1af7ad76e4073b01ab147eb3c1d8e38b95d38062c6c9bc63890150738642e8eb", + "name": "tensorboard-data-server", + "version": "0.7.2" + }, + { + "direct_url": null, + "metadata_sha256": "9e597f62fc07e3b931d5c8fb0e90706fb6d45465cfb5d01dbd27ba7fc135c02c", + "name": "tensorstore", + "version": "0.1.80" + }, + { + "direct_url": null, + "metadata_sha256": "0da993d16ef6326f471796fcb065622f309c5c1aae6c6295b488ea64bb5c880c", + "name": "textual", + "version": "8.2.8" + }, + { + "direct_url": null, + "metadata_sha256": "52ca6148d4fd1497254855fa610cfdde99191cd42bce7a452fd3a68855504ac0", + "name": "tiktoken", + "version": "0.14.0" + }, + { + "direct_url": null, + "metadata_sha256": "0df9eb495cfb477dcbdfbdcd8c04d952d3eb00d77831630760571e13545398e5", + "name": "tilelang", + "version": "0.1.12" + }, + { + "direct_url": null, + "metadata_sha256": "802b576e011dc61bd2681593e8d802714b6c4ce636a9cf87035026db32ce6262", + "name": "tokenizers", + "version": "0.23.2" + }, + { + "direct_url": null, + "metadata_sha256": "4e1631b2164a49ff9a848d86ce504fdcc15e3540dbb262df8f33a2681a8de513", + "name": "tokenspeed-mla", + "version": "0.1.8" + }, + { + "direct_url": null, + "metadata_sha256": "05086095a775c5dca70998dcf442a848c13f9c68b54a54c510c3542c5abb6563", + "name": "tokenspeed-triton", + "version": "3.8.10.post20260920" + }, + { + "direct_url": null, + "metadata_sha256": "71daba472d0c5ffc25c0231dc29688ab0cb13d5bc7e7d93f6c4cce4169c50048", + "name": "torch", + "version": "2.13.0" + }, + { + "direct_url": null, + "metadata_sha256": "cccd2f1c0e5866e63732f58798c8d642ee6d10cd560d6f691e7981b908c246c9", + "name": "torch_c_dlpack_ext", + "version": "0.1.5" + }, + { + "direct_url": "{\"dir_info\": {}, \"url\": \"file:///torch_memory_saver\"}", + "metadata_sha256": "6276cef17dedbb5ee0d6157bbf63b832e916026281328d995ad3d488c2539618", + "name": "torch_memory_saver", + "version": "0.0.9.post1+slime" + }, + { + "direct_url": null, + "metadata_sha256": "29809ca2c86dda5079654f1f70564a64435e9d08f1964a2412b6f514e1b5ff64", + "name": "torchaudio", + "version": "2.11.0" + }, + { + "direct_url": null, + "metadata_sha256": "7e9be0f3a290e3fd9370d8fe010c7ffd006d5d3d05ab8bdf7df8f92f0fca9c39", + "name": "torchcodec", + "version": "0.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "181fa5e6b399c378711eddcdacd756d3c51317916f8eb160ee36cae7fae9589f", + "name": "torchvision", + "version": "0.28.0" + }, + { + "direct_url": null, + "metadata_sha256": "43d1261aff90cf3d5b1b40cf1f94234d61409b14e59f3766f457c1eec7f7ac15", + "name": "tqdm", + "version": "4.70.1" + }, + { + "direct_url": "{\"archive_info\": {\"hash\": \"sha256=3e1d9f534781c8e608240da0b495b8246317a36382f7609017cbaa7fb1d53f7b\", \"hashes\": {\"sha256\": \"3e1d9f534781c8e608240da0b495b8246317a36382f7609017cbaa7fb1d53f7b\"}}, \"url\": \"file:///wheels/transformer_engine-2.16.1%2Bc9877beb-cp312-cp312-linux_x86_64.whl\"}", + "metadata_sha256": "d882f743161d9d9f35dee4e1a8cc9136fa495f7c660caace01ab8f5602d76aa7", + "name": "transformer_engine", + "version": "2.16.1+c9877beb" + }, + { + "direct_url": null, + "metadata_sha256": "465797a59706d83b45c93fde750b228c3b6e1addc44115de2c4c02ad66d9c5ea", + "name": "transformers", + "version": "5.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "a91982ca086667c592a951973434f7c5a9f27a8300bc97af78dfb496afe53e71", + "name": "triton", + "version": "3.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "d26fbb244532c4051e715f9047cd943e2cc4abb0ac6f2a517fa2986eb1ea726a", + "name": "truststore", + "version": "0.10.4" + }, + { + "direct_url": null, + "metadata_sha256": "c84af1a069084b1b440b3594068dec29200d52d4c1a9b652030448717f270158", + "name": "typer", + "version": "0.27.2" + }, + { + "direct_url": null, + "metadata_sha256": "0ad6653b7439f4bb6a596cb7b01ed1b716458467525c4dc40b75d62bdb943c98", + "name": "typing-inspection", + "version": "0.4.4" + }, + { + "direct_url": null, + "metadata_sha256": "d005280aa13b334ac942d20219102865e559f69ffd06c35c248b2f0d0da3b933", + "name": "typing_extensions", + "version": "4.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "fba2930e9030a18965d243f8d330748db2e67572a81b3b68710462fb5110332a", + "name": "urllib3", + "version": "2.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "bc5717bd6524a33838f285261868bcc8e311e8c29fdb19e41d56c38b04890e84", + "name": "uvicorn", + "version": "0.54.0" + }, + { + "direct_url": null, + "metadata_sha256": "741c006d8441f562aa853a5430df236fbb4af923445491f396bf09943bd30258", + "name": "uvloop", + "version": "0.22.1" + }, + { + "direct_url": "{\"dir_info\": {\"editable\": true}, \"url\": \"file:///vime\"}", + "metadata_sha256": "f85aa01dfdc868756a6583434bbff040f29eb511d47d5b25ada063a84353aac6", + "name": "vime", + "version": "0.3.2" + }, + { + "direct_url": null, + "metadata_sha256": "c25431aaf1950971fe96292f395a41a55b403127bfca0d0b8f7dc9cff5dab75d", + "name": "virtualenv", + "version": "21.14.1" + }, + { + "direct_url": null, + "metadata_sha256": "4e3ee0a31d85e56268640aae853bcee4794dfe8c0483c5c6370517e480c81ae0", + "name": "virtualenv", + "version": "21.14.5" + }, + { + "direct_url": null, + "metadata_sha256": "d4ed5c7551cddb8c1aeff2f9f27b3491f6ad2c9afda8e7bb9779c33fa12a536c", + "name": "vllm", + "version": "0.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "84b482e09bac949e992594757214a1920c667a5d898ee320e309250697f6d26e", + "name": "vllm-router", + "version": "0.1.15" + }, + { + "direct_url": null, + "metadata_sha256": "9b16c871eb1060a5218e9b9a9ad33288d94844cfaf43f08dbb6c32423bde8fe3", + "name": "wandb", + "version": "0.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "8e4f2be437dfe4eb3c6c959e517ac20b75d06525563f1ebcbf06f9ec648bd7c1", + "name": "watchdog", + "version": "6.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "15218afb42938907c2ca74c54e3d8e3a5406493c4761e29e38e82bfec0f84296", + "name": "watchfiles", + "version": "1.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "8863af96e88b7db9990da99aa6c46816eacc3d2f9ae1297b53381b033cd70119", + "name": "wcmatch", + "version": "11.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "f46e6bd6cfafb2b684c29587b017b7096fd9155b74eda25a22eca784b9803ab7", + "name": "websockets", + "version": "16.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "ce82db5ccfefa4bfbe4e25a36e1f91e8e7d51fcaeb31586c4d48e1c69f99168b", + "name": "websockets", + "version": "17.1" + }, + { + "direct_url": null, + "metadata_sha256": "0f142a2c09eac643c7d0bfe77f3f121184c0b17914afbd32af669ed19b2b02ef", + "name": "wheel", + "version": "0.47.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd58938e51a3c5cb363f6f22eaa2a8a7accc1ce373388de167a82f77d3e5783f", + "name": "wrapt", + "version": "2.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "b0b72c1941f04499ca7e1a3a6e479aee8df902c3d49979624b59dba8c3228d37", + "name": "xgrammar", + "version": "0.2.8" + }, + { + "direct_url": null, + "metadata_sha256": "ef8861f39e5c36255966a36032651f937d890d55f31f1c26304b488f1ba34332", + "name": "xxhash", + "version": "4.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "740c08057b6eb69c58402c87d652af0a471e46325d811f2c605632a18817152f", + "name": "yarl", + "version": "1.25.1" + }, + { + "direct_url": null, + "metadata_sha256": "7b060e4d24394b5431875e2f74fec8e6bffa79d2e6b4cb8c7e2a5187dd2d8d69", + "name": "z3-solver", + "version": "4.15.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "3d76d4fbc95f0851191147db12300938c67a6f8fb1df884886d9601272ccc4e8", + "name": "zipp", + "version": "4.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "d3de2651e4e908dbb7c9d80508e5179590217dfac4993dc8b04381c5b9718c4c", + "name": "zstandard", + "version": "0.25.0" + } + ], + "executable": "", + "installed_provider_sources": { + "vllm/compilation/__init__.py": { + "path": "/vllm/compilation/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/backends.py": { + "path": "/vllm/compilation/backends.py", + "sha256": "fa4bff8920b363efbbde9456f135fa9d2c004a5bde1898877f177418b2d8b008" + }, + "vllm/compilation/base_static_graph.py": { + "path": "/vllm/compilation/base_static_graph.py", + "sha256": "5cfe8e06db84aa42cd41cdd93ebe93af00b3a242c8011042057530e2922b523a" + }, + "vllm/compilation/breakable_cudagraph.py": { + "path": "/vllm/compilation/breakable_cudagraph.py", + "sha256": "3cc427612a08e2b9b3fee47548026400c1d0776e2d4747535e59ef5512bdf1e8" + }, + "vllm/compilation/caching.py": { + "path": "/vllm/compilation/caching.py", + "sha256": "71d212452dde742fbf28b8a01ed29d3c08a7457ff7f8da2a20ce9d17e902c2cf" + }, + "vllm/compilation/codegen.py": { + "path": "/vllm/compilation/codegen.py", + "sha256": "e04833bec88cf9d1a13aa7341e30e3233d1138bfe23424e0fd34d664b3fedb9f" + }, + "vllm/compilation/compiler_interface.py": { + "path": "/vllm/compilation/compiler_interface.py", + "sha256": "8d84e2864bf83f754bae9e9f77119e0287cca9f97f5fa5ec2535e07b5ad88944" + }, + "vllm/compilation/counter.py": { + "path": "/vllm/compilation/counter.py", + "sha256": "d8158c54dd36a357bf24f6f84dc22f572d3a27f4875f3d5779b12bc5d454ff76" + }, + "vllm/compilation/cuda_graph.py": { + "path": "/vllm/compilation/cuda_graph.py", + "sha256": "05c86392d7fae967ac73076dba7e01990a0e3ae619e4866450a0c1be56bd1192" + }, + "vllm/compilation/decorators.py": { + "path": "/vllm/compilation/decorators.py", + "sha256": "cab6962e8a1fead59c75f5ed8cb4732f9e5441ff972030c2f4b1c4ba0c58de3c" + }, + "vllm/compilation/monitor.py": { + "path": "/vllm/compilation/monitor.py", + "sha256": "43b24c5cb1bc4d32dc979f3222596905c7b3acc58415328a234402e6edc76abf" + }, + "vllm/compilation/partition_rules.py": { + "path": "/vllm/compilation/partition_rules.py", + "sha256": "857d2fb06dc871ea1d3717cd01fbd4e5205984100d98b7b72a2933d6ff1cfa4d" + }, + "vllm/compilation/passes/__init__.py": { + "path": "/vllm/compilation/passes/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/fusion/__init__.py": { + "path": "/vllm/compilation/passes/fusion/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/fusion/act_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/act_quant_fusion.py", + "sha256": "1fa9c3ca4fb424685b7053c3dda89dda16c98dc5645d85f0f28dca58429792b3" + }, + "vllm/compilation/passes/fusion/add_rms_fusion.py": { + "path": "/vllm/compilation/passes/fusion/add_rms_fusion.py", + "sha256": "e46998552628aa5cd5962fc39ea39ae824fd97e6aeba1d176e9cc7cade39837b" + }, + "vllm/compilation/passes/fusion/allreduce_rms_fusion.py": { + "path": "/vllm/compilation/passes/fusion/allreduce_rms_fusion.py", + "sha256": "0af193505880cec0f6ffa224c688bce3c9ddc318dccdf04a696b4e4b4506a963" + }, + "vllm/compilation/passes/fusion/attn_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/attn_quant_fusion.py", + "sha256": "ecc64e82be4481954c9cac6c23d7794846ab19486b570f2dda07ab5ad67c5a49" + }, + "vllm/compilation/passes/fusion/collective_fusion.py": { + "path": "/vllm/compilation/passes/fusion/collective_fusion.py", + "sha256": "1e2c8539d6960b45907fb3bf0482441ea7250e97c56ffdea1500514efa0b164d" + }, + "vllm/compilation/passes/fusion/matcher_utils.py": { + "path": "/vllm/compilation/passes/fusion/matcher_utils.py", + "sha256": "50ac5714ce1bb113520de769ea6234316acc470a8cdf2537a996ce9a9d54337d" + }, + "vllm/compilation/passes/fusion/mla_attn_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/mla_attn_quant_fusion.py", + "sha256": "a966fe7f58bf9228379f793f5fd851735a97f9639722766b2a20cb79a9e4baec" + }, + "vllm/compilation/passes/fusion/mla_rope_kvcache_cat_fusion.py": { + "path": "/vllm/compilation/passes/fusion/mla_rope_kvcache_cat_fusion.py", + "sha256": "1602cc28055ffa8d1123ddb1d256bf0bd12006fd06ea7e16a986c55746dbe0dc" + }, + "vllm/compilation/passes/fusion/qk_norm_rope_fusion.py": { + "path": "/vllm/compilation/passes/fusion/qk_norm_rope_fusion.py", + "sha256": "aebc7d1a5189b65ac665afcc169e7baebd53efe719c48e35e7c5babe85af0d39" + }, + "vllm/compilation/passes/fusion/qk_norm_rope_kvcache_fusion.py": { + "path": "/vllm/compilation/passes/fusion/qk_norm_rope_kvcache_fusion.py", + "sha256": "f0cfd0d83ec4acb09f9bf91d199b114e9d4995e3059c13eb23a6978ce7c07eb2" + }, + "vllm/compilation/passes/fusion/rms_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rms_quant_fusion.py", + "sha256": "4852aa44e0e2087043fdac271bda9b8d9bfe3201bb84ce3919b8ed454d8083c4" + }, + "vllm/compilation/passes/fusion/rocm_aiter_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rocm_aiter_fusion.py", + "sha256": "372e76c68c75209a085deec6dd22b3816be633613ca82f6f2925c1b3773d61a0" + }, + "vllm/compilation/passes/fusion/rope_kvcache_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rope_kvcache_fusion.py", + "sha256": "3a756e9049593537143b5a56ab9185a6bc83f57ed81d84226d7791a46a984b53" + }, + "vllm/compilation/passes/fusion/sequence_parallelism.py": { + "path": "/vllm/compilation/passes/fusion/sequence_parallelism.py", + "sha256": "3af7e420dcb35fff0bae0f8f599d0f1bda34445ebe194059892a434b2976d654" + }, + "vllm/compilation/passes/fx_utils.py": { + "path": "/vllm/compilation/passes/fx_utils.py", + "sha256": "730708213acf9d1b5f3176b433dfc197a5f3c81b5ce443f0923c526924833003" + }, + "vllm/compilation/passes/inductor_pass.py": { + "path": "/vllm/compilation/passes/inductor_pass.py", + "sha256": "1f380aacf7adabb8bf8b7d41c0a93473947f0716f7445bd910fd448f6c08e672" + }, + "vllm/compilation/passes/ir/__init__.py": { + "path": "/vllm/compilation/passes/ir/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/ir/clone_elimination.py": { + "path": "/vllm/compilation/passes/ir/clone_elimination.py", + "sha256": "5297078f5cddce081faba5215814275381d2083b32318fcfeb2bf9d69fedb7c7" + }, + "vllm/compilation/passes/ir/inplace_functionalization.py": { + "path": "/vllm/compilation/passes/ir/inplace_functionalization.py", + "sha256": "2dc4f22c6f05224828c2941479185b1452d4490f488b7f0bfd124334e7809fed" + }, + "vllm/compilation/passes/ir/lowering_pass.py": { + "path": "/vllm/compilation/passes/ir/lowering_pass.py", + "sha256": "d9c3d90f63138420f0e5489447b5996573fcfbbab939da2efccd00848492b172" + }, + "vllm/compilation/passes/ir/utils.py": { + "path": "/vllm/compilation/passes/ir/utils.py", + "sha256": "f59d33a6c7d0616cbeec1e9fb1d6c948881bf81fe124caeb906eac2e2197ea21" + }, + "vllm/compilation/passes/pass_manager.py": { + "path": "/vllm/compilation/passes/pass_manager.py", + "sha256": "486979a058aa2e20ebedcbb6e039f7a59f38d2efd2cda11219fae4067be0968d" + }, + "vllm/compilation/passes/utility/__init__.py": { + "path": "/vllm/compilation/passes/utility/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/utility/fix_functionalization.py": { + "path": "/vllm/compilation/passes/utility/fix_functionalization.py", + "sha256": "ad5b504a05ccee023869b0c8df70ec2fff9a4a80d25fd903e2b532f470e7203f" + }, + "vllm/compilation/passes/utility/noop_elimination.py": { + "path": "/vllm/compilation/passes/utility/noop_elimination.py", + "sha256": "8abf85d28c13f95059f2acbc0275b9b9ed2ad4990f7c5763bbe3067a4aa629ce" + }, + "vllm/compilation/passes/utility/post_cleanup.py": { + "path": "/vllm/compilation/passes/utility/post_cleanup.py", + "sha256": "1c38b14fc209165cbcf8ca763a17ac4e528b97f59b573e5d52df2cce7d758de3" + }, + "vllm/compilation/passes/utility/scatter_split_replace.py": { + "path": "/vllm/compilation/passes/utility/scatter_split_replace.py", + "sha256": "138402cc3097768a32e9e5b8d1a054b6176e494bddc8684e23ca2dc5fdc3fdda" + }, + "vllm/compilation/passes/utility/split_coalescing.py": { + "path": "/vllm/compilation/passes/utility/split_coalescing.py", + "sha256": "0b02acd9e1ad43d7b3e128b914e969b9580773f2818078846dfbf163a8bd0871" + }, + "vllm/compilation/passes/vllm_inductor_pass.py": { + "path": "/vllm/compilation/passes/vllm_inductor_pass.py", + "sha256": "4f83ffb67f834a214221d810c7843a8e41eb4e5930eb40adbd8cf054ff6fb9c6" + }, + "vllm/compilation/piecewise_backend.py": { + "path": "/vllm/compilation/piecewise_backend.py", + "sha256": "6525318ff3ca2e4978e24dd9232a7ae0a02e920e19604b83db6f6043d1f8a54d" + }, + "vllm/compilation/wrapper.py": { + "path": "/vllm/compilation/wrapper.py", + "sha256": "c1b1fca679ea16aa07a696831a810c0d531da2bb0ea32dd6f1a95cdaef36de07" + }, + "vllm/config/__init__.py": { + "path": "/vllm/config/__init__.py", + "sha256": "56fb0cb1598d297e4f95a97e5d86dc624145d1532f5faa432b7d2834d7155bd5" + }, + "vllm/config/attention.py": { + "path": "/vllm/config/attention.py", + "sha256": "c41f345b512d9b7df882328257eb3a6381f41088c11ae83b5ecd8a9e8265d1bc" + }, + "vllm/config/cache.py": { + "path": "/vllm/config/cache.py", + "sha256": "f1c226ba679c884930dbfcaf41a57248b137a9a20d3ed8e3d3b31752bb484c07" + }, + "vllm/config/compilation.py": { + "path": "/vllm/config/compilation.py", + "sha256": "c9cec5c7200e8e559810ec8c30113ad61dab6780f9f7fb3c116bd0d9b5a43065" + }, + "vllm/config/device.py": { + "path": "/vllm/config/device.py", + "sha256": "7b82eee02ceb5842337451a27a3d5729920c47e25e8f6bf3997f5146f9330a9c" + }, + "vllm/config/diffusion.py": { + "path": "/vllm/config/diffusion.py", + "sha256": "1fa9fd2478a866098a28a3586b55af2f9738656b7813a55d76539c10dd99fe8d" + }, + "vllm/config/ec_manager_config.py": { + "path": "/vllm/config/ec_manager_config.py", + "sha256": "418b387dbe7bdf67deddce331c205768a2d42aea37141f59fb02a8a1528e3552" + }, + "vllm/config/ec_transfer.py": { + "path": "/vllm/config/ec_transfer.py", + "sha256": "0eabb2c25194676d23c6acf59562672a1dd24415043ac5737d621ce0d681ec70" + }, + "vllm/config/engram.py": { + "path": "/vllm/config/engram.py", + "sha256": "34043a22385a041d4e9be8857f64174c990c2ca8308b97b6a952b5ab96c20ee5" + }, + "vllm/config/fault_tolerance.py": { + "path": "/vllm/config/fault_tolerance.py", + "sha256": "b166b24373d599fb15ddc575e3061cf0dcb42174d0369d8468008e7ffbb2a4e2" + }, + "vllm/config/kernel.py": { + "path": "/vllm/config/kernel.py", + "sha256": "27e23c584cf862f4091858db6dc85bbc2a01f4baf9dca3f232ae6f3bac02390e" + }, + "vllm/config/kv_events.py": { + "path": "/vllm/config/kv_events.py", + "sha256": "b1dbaee3e6830e381e9157fe3bab0d65c357da88ff7cdf8b1e4b3a4e75c82a87" + }, + "vllm/config/kv_transfer.py": { + "path": "/vllm/config/kv_transfer.py", + "sha256": "506fae7a9d7f32cb3646156cf9249a856f6317dff6c4c85db70efd34418c429b" + }, + "vllm/config/load.py": { + "path": "/vllm/config/load.py", + "sha256": "bd6431c22e078362d749a56a2c84145432ebf2605d8bcfa2ac679182d18ed630" + }, + "vllm/config/lora.py": { + "path": "/vllm/config/lora.py", + "sha256": "ed6cf6575f5950f079a62f904caeae93d1a4745dd8c21788b74367883bcd4b08" + }, + "vllm/config/mamba.py": { + "path": "/vllm/config/mamba.py", + "sha256": "2090f791201ca45dd4f1d72b8651268890eb07574b6084721194eb8fdf612c48" + }, + "vllm/config/model.py": { + "path": "/vllm/config/model.py", + "sha256": "f4168b67cc93ce72ff2a6d4c66974223e32fd0f1fab4c05e44bd68a275e18d69" + }, + "vllm/config/model_arch.py": { + "path": "/vllm/config/model_arch.py", + "sha256": "2babe28329d7b60b4e205f6d72c687f0f66e6535aa2f20411469e5ec362f6b5f" + }, + "vllm/config/multimodal.py": { + "path": "/vllm/config/multimodal.py", + "sha256": "271911aee151f17f092228cecee82af0713e9a47340ffdf66834ca7638a50d22" + }, + "vllm/config/observability.py": { + "path": "/vllm/config/observability.py", + "sha256": "d57c59ec776477ab0a20e9f2b945bc954d8ea3737c869259480e9aa10dfb9f6d" + }, + "vllm/config/offload.py": { + "path": "/vllm/config/offload.py", + "sha256": "6f2db3d9a2730588473d5155811690c6241b167a21dcb62fbbd9ebb6386de42c" + }, + "vllm/config/parallel.py": { + "path": "/vllm/config/parallel.py", + "sha256": "f012ace89e3fb730a467f729f602679bc145c49f0d10721811c9d818570e7b2b" + }, + "vllm/config/pooler.py": { + "path": "/vllm/config/pooler.py", + "sha256": "9f01913dcb7bccbf9b672b16643f18471ae202455992e8afaf0725a17f2b3d08" + }, + "vllm/config/profiler.py": { + "path": "/vllm/config/profiler.py", + "sha256": "04d24fa1dc7cfedca6b5c7d9115f7f7021722fc46a5b15234a1e3b3a506c93e5" + }, + "vllm/config/quantization.py": { + "path": "/vllm/config/quantization.py", + "sha256": "acffc52f525b39a88efd656f1ed705ce3a1b758298bb0684fac7694776bc10b4" + }, + "vllm/config/reasoning.py": { + "path": "/vllm/config/reasoning.py", + "sha256": "2c4f7bdee48a9fb3d93787c4c32361c2411417cce452cfde86808d8759977861" + }, + "vllm/config/scheduler.py": { + "path": "/vllm/config/scheduler.py", + "sha256": "822179da62be4bca0619c8590082ae09123f5c4415f9cc2037be673748239edb" + }, + "vllm/config/speculative.py": { + "path": "/vllm/config/speculative.py", + "sha256": "9c642a87264339c0dbc1d0b57330572149df0f9d5e16c6893b9895e50a619e19" + }, + "vllm/config/speech_to_text.py": { + "path": "/vllm/config/speech_to_text.py", + "sha256": "bf4a566fbde6a1cec1e209070b739650c3302c12696739c88049cb8f723a4c3f" + }, + "vllm/config/structured_outputs.py": { + "path": "/vllm/config/structured_outputs.py", + "sha256": "55649776594349b8b4aa3e08fc4c88068366732a486d6fb235079188044aa829" + }, + "vllm/config/utils.py": { + "path": "/vllm/config/utils.py", + "sha256": "d035e9e488ba92b6c47a96cf05d9b2a850d53eda8a05115b22ff9af8dbc2fc64" + }, + "vllm/config/vllm.py": { + "path": "/vllm/config/vllm.py", + "sha256": "956b812e5a719bcbfa3a3958801361b38b9c928c96b8c073311bbb96376dfb7a" + }, + "vllm/config/watermarking.py": { + "path": "/vllm/config/watermarking.py", + "sha256": "30e6620a3cd7529f0736ad55e38bc326a6a78dee4552f0722208400041c94a1f" + }, + "vllm/config/weight_transfer.py": { + "path": "/vllm/config/weight_transfer.py", + "sha256": "92edd9e5ea90c97a8f3c5f20abf1734a105ee1f3f89e306e7ba87e758f1f767e" + }, + "vllm/distributed/__init__.py": { + "path": "/vllm/distributed/__init__.py", + "sha256": "97f28c30b32662af8cab163939e4ee423037f11630752e13b55cbc25a7d0ab71" + }, + "vllm/distributed/communication_op.py": { + "path": "/vllm/distributed/communication_op.py", + "sha256": "3c3f8ac60db38ece891d39dc1e2f6f1947ad438685893d2e5777d072320bd1b8" + }, + "vllm/distributed/device_communicators/__init__.py": { + "path": "/vllm/distributed/device_communicators/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/device_communicators/aiter_custom_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/aiter_custom_all_reduce.py", + "sha256": "f8eb027ce7a85d94af6260960ceb7f36fc6f1406c9af9c9b6285fddb3f178009" + }, + "vllm/distributed/device_communicators/all2all.py": { + "path": "/vllm/distributed/device_communicators/all2all.py", + "sha256": "1f1b69236acd3cd7bd94520fd6d591bfd31b57c4bc7c9f9f4161ea8bbd0c5f26" + }, + "vllm/distributed/device_communicators/all_reduce_utils.py": { + "path": "/vllm/distributed/device_communicators/all_reduce_utils.py", + "sha256": "ed0ab4dd05b2519a6313892e68824c97b540034664d7f8c3d031b322e33e1bfc" + }, + "vllm/distributed/device_communicators/base_device_communicator.py": { + "path": "/vllm/distributed/device_communicators/base_device_communicator.py", + "sha256": "4a7670f12ed7c7621b25d476e2687c24ca01f3be183fff4a6a25337596fe506b" + }, + "vllm/distributed/device_communicators/cpu_communicator.py": { + "path": "/vllm/distributed/device_communicators/cpu_communicator.py", + "sha256": "e1856c8e91cfbbb4d9ce990c1236e258ba4021e226afcbab645653380b38d64b" + }, + "vllm/distributed/device_communicators/cuda_communicator.py": { + "path": "/vllm/distributed/device_communicators/cuda_communicator.py", + "sha256": "102d95c67ec798cf352b817ba92e8abc9da37f30d1bbdf3aab45d3927b627b93" + }, + "vllm/distributed/device_communicators/cuda_wrapper.py": { + "path": "/vllm/distributed/device_communicators/cuda_wrapper.py", + "sha256": "333b6d9ed173e7a18c7f2b6627a3c9c9ed88892ce52015f05e29d6d245e48ee3" + }, + "vllm/distributed/device_communicators/custom_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/custom_all_reduce.py", + "sha256": "a048c1327c23580805600c0c951831bec333b1ffc4eb26a0e3d34119c4f0c445" + }, + "vllm/distributed/device_communicators/flashinfer_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/flashinfer_all_reduce.py", + "sha256": "b4359760e9b55963676109a5c3a015fb82e190d4df1d021de9ee01e7814cbdda" + }, + "vllm/distributed/device_communicators/flashinfer_pcie_ipc_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/flashinfer_pcie_ipc_all_reduce.py", + "sha256": "8b67b0fc356a565095f56b475cc89c513e3a5eff051ab1c52e5beb0c1a79e9f2" + }, + "vllm/distributed/device_communicators/mnnvl_compat.py": { + "path": "/vllm/distributed/device_communicators/mnnvl_compat.py", + "sha256": "72ee1e6f9571b4c8ecbd9f60cd469d1b565cb79cab519a688a93f290906a2615" + }, + "vllm/distributed/device_communicators/pynccl.py": { + "path": "/vllm/distributed/device_communicators/pynccl.py", + "sha256": "882fb83c5a3c565a3f8fd664b79f5ceae566dca180019ecafd74bc8c11d9f8cf" + }, + "vllm/distributed/device_communicators/pynccl_allocator.py": { + "path": "/vllm/distributed/device_communicators/pynccl_allocator.py", + "sha256": "390e2576cbf4ae06341ca4dab24fc7e4d4f7c24dd444329ed05d828a9ce91460" + }, + "vllm/distributed/device_communicators/pynccl_wrapper.py": { + "path": "/vllm/distributed/device_communicators/pynccl_wrapper.py", + "sha256": "ce63c8da57bb88d4cf89956bd70bb63f0f44bfad468ddb37b765611551f6d99f" + }, + "vllm/distributed/device_communicators/quick_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/quick_all_reduce.py", + "sha256": "8aacb23e7c297b0ae2f80d99c5affd2e7517115d7874be51069d14a44db7b5f2" + }, + "vllm/distributed/device_communicators/ray_communicator.py": { + "path": "/vllm/distributed/device_communicators/ray_communicator.py", + "sha256": "332c37f65495b60564d61db59bc2d30ca0236adc33442d01464790bde9aec897" + }, + "vllm/distributed/device_communicators/shm_broadcast.py": { + "path": "/vllm/distributed/device_communicators/shm_broadcast.py", + "sha256": "f3e7a3f3ff713fccbd535e0d41650ee05bdf8677e83d4b90519910645022c30b" + }, + "vllm/distributed/device_communicators/shm_object_storage.py": { + "path": "/vllm/distributed/device_communicators/shm_object_storage.py", + "sha256": "e097bf7ac0141fe8db4131e8fd553ca2ad5b0600b22a56f3924af6b795e7207c" + }, + "vllm/distributed/device_communicators/symm_mem.py": { + "path": "/vllm/distributed/device_communicators/symm_mem.py", + "sha256": "b06e3ddb9ae880a30ec4a103ce32eb9794223bb0293832e89572af28adaaa544" + }, + "vllm/distributed/device_communicators/xpu_communicator.py": { + "path": "/vllm/distributed/device_communicators/xpu_communicator.py", + "sha256": "527cbfb250760abc62096ee7cd612307b821f21b72dee1687ad866620ec89b6d" + }, + "vllm/distributed/ec_transfer/__init__.py": { + "path": "/vllm/distributed/ec_transfer/__init__.py", + "sha256": "061405bb51df7409c9938b62e25caa8bd6ebf85da6d1700dbd4affe2a0825135" + }, + "vllm/distributed/ec_transfer/ec_connector/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/base.py", + "sha256": "22d4913375bb622473fbe1a77f9376b804949cd8a7e31e9518208f9561d161e2" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/common.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/common.py", + "sha256": "e2267abd8d00a6d2605e1a82ea5c73396a71b427452eab469fcca0134c334e7c" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/connector.py", + "sha256": "72cd35d9fd754a2992dd090a8af13c91e0789b4038ac29276750d823120235db" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/base.py", + "sha256": "19e8df88b0fa831997896355ecdd49e0d86cb074cd7ae28aed0b328b0bb3ab2e" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/zmq.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/zmq.py", + "sha256": "435641c0e37551ab4937855abd067be26905b91215e759cbd9d28a419a34ff9a" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/base.py", + "sha256": "3be698aeb67d32ee3741e76b2fb71806941c587578583acf8fbc42fbf22b46a5" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/nixl.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/nixl.py", + "sha256": "03af8f6549a6027b7262a482907af591e45f28b9b1c5a3408bbc6600e38797e5" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/ec_shared_region.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/ec_shared_region.py", + "sha256": "e40607952c9920024455eca2f419e8c3ef1de9a4d8b27c147a33bb941b8c08b1" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/protocol.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/protocol.py", + "sha256": "05878336884396bfbef77b96b0fa6359f6fa0aba912961f14a84f5a436f27038" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/__init__.py", + "sha256": "01c42385bf3a55cff09cc05ba956f6dd4b8b6b986bf4d6eca4e566cb045b48e0" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/embedding_cache.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/embedding_cache.py", + "sha256": "7359fb980af1fc30b3253681310ef636e2b4a19134e04a93270c9c45de2572d8" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/session.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/session.py", + "sha256": "5973548a919e13c866222b91d502686a6757a31e5a5664b879bf2887ed9fb212" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/utils.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/utils.py", + "sha256": "160ac665f20f2c75b343c1e784084f2b0b4d1cf8fdb28ee15deee4dc8ed0ce45" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/worker/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/worker/__init__.py", + "sha256": "f08d296d3560c42173ae8af961af4a768033ccf1e36e9c17c0cdd53013d0c52e" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/worker/descriptor_buffers.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/worker/descriptor_buffers.py", + "sha256": "be7c81be214e995da8499105ba485854d9c19d6f8e905f8f1b87b83694ca0864" + }, + "vllm/distributed/ec_transfer/ec_connector/example_connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/example_connector.py", + "sha256": "09022ce07a89114bb65d9befd2e60873453aed11bbac8c0a75c1e6084e785a5f" + }, + "vllm/distributed/ec_transfer/ec_connector/factory.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/factory.py", + "sha256": "d6cedca0a99c3dd2b03cd1c15d17472b983e3f7d8f5baf4a12eecaf6abedb817" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/__init__.py", + "sha256": "1cbfc2f95f8f4d48a9253056eb1fd4b562062884e3fd5cb6571583c352fc16f3" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/config.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/config.py", + "sha256": "98c60696f79d1de67d2364cd9e8a42a393b5c8e17ed9af2f971368e47891d7b3" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/control.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/control.py", + "sha256": "58e0d1a423fbe958bfa586ac26a17107e08d0b31d044b4c74ab4dde880e7ca9b" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/memory.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/memory.py", + "sha256": "d5e90b1348de670a70f110d58eedcbdbd053db72c21dd007c3f5275c53951149" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/metadata.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/metadata.py", + "sha256": "497a7e6dfffb7fce80a41d5989f96119b970c143df77bb9d0f9c91d7a46e8c42" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/producer.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/producer.py", + "sha256": "97fa4d0b19475574778eab02f55fad73db9642beb9156da890314fd53fa1a7ab" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/reservation.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/reservation.py", + "sha256": "4790bc65cde4db5f17733ca2c2910980ba594a8a9b79ee27c5b957dffd4c1113" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/scheduler.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/scheduler.py", + "sha256": "53004b62529a31fdd80dfb2e6026610b95041a77e91f731ae526fefd84e7968d" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/state.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/state.py", + "sha256": "92f375d6c5cc9c83dbe95a7977ad8eb0f1b5629ccee92968bcacdc94eee15d65" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/transfer.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/transfer.py", + "sha256": "ada2113a5402054f1149d3edc2537f4e5e1bd696c9b17291c9f2b4cbf6b59753" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/worker.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/worker.py", + "sha256": "89eb91bb64845b3b121d502972a6b04d448714253becd2ea662e5691cd5acdd7" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake_ec_connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake_ec_connector.py", + "sha256": "aaebab4711bc00dd0c622dfbfd8639fc41e7ed5d1658d7d68fe33e4d5fbef3ba" + }, + "vllm/distributed/ec_transfer/ec_connector/utils.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/utils.py", + "sha256": "11b9014b9c0697f8846deff1a55a22fa86a15dc2ac3e139442fb6d513ac03059" + }, + "vllm/distributed/ec_transfer/ec_transfer_state.py": { + "path": "/vllm/distributed/ec_transfer/ec_transfer_state.py", + "sha256": "9487a41f23fa1a4fa6dfca8b42b8e97a0ee19d8406ffd1dcf4bef66315180827" + }, + "vllm/distributed/elastic_ep/__init__.py": { + "path": "/vllm/distributed/elastic_ep/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/elastic_ep/elastic_execute.py": { + "path": "/vllm/distributed/elastic_ep/elastic_execute.py", + "sha256": "b8f60a4183c79ff6051095b5f95bb385bc7fea0cffe8cd9ebc9087ab0e9f01b5" + }, + "vllm/distributed/elastic_ep/elastic_state.py": { + "path": "/vllm/distributed/elastic_ep/elastic_state.py", + "sha256": "fbf049199841a086fdf2fc1ab8498ef017ad3bf319db65c3ae61acbb536d2e10" + }, + "vllm/distributed/elastic_ep/standby_state.py": { + "path": "/vllm/distributed/elastic_ep/standby_state.py", + "sha256": "15282597550ebd0e07b8492ff192aea1ec0dcec8f0ad34009123e1002cc140c1" + }, + "vllm/distributed/eplb/__init__.py": { + "path": "/vllm/distributed/eplb/__init__.py", + "sha256": "1b9c2ee22abb5888c354c5aa01f0944f253e5e24e135d019778398bbe495a628" + }, + "vllm/distributed/eplb/async_worker.py": { + "path": "/vllm/distributed/eplb/async_worker.py", + "sha256": "424328600ad1003286fc5dfffa1f9482007314c060947818b2f94a8b97811f5e" + }, + "vllm/distributed/eplb/eplb_communicator.py": { + "path": "/vllm/distributed/eplb/eplb_communicator.py", + "sha256": "ba30d9d40e7b81d3f42aa9041d2f328edca4073cfe2de920285eb68375501ed8" + }, + "vllm/distributed/eplb/eplb_state.py": { + "path": "/vllm/distributed/eplb/eplb_state.py", + "sha256": "2f06bc8c63f3fdf55edb5032ae55c0ffcac3e67720ce74ea312e3d141b12acf4" + }, + "vllm/distributed/eplb/eplb_utils.py": { + "path": "/vllm/distributed/eplb/eplb_utils.py", + "sha256": "058af6104faa6d4085c1dca80bbe60d92bf0a7ec9cd92c775a180546c9d8c9c3" + }, + "vllm/distributed/eplb/policy/__init__.py": { + "path": "/vllm/distributed/eplb/policy/__init__.py", + "sha256": "daeb266c88442832b1ab8c8c4cc064891b38b9e9ba00aea324f926c87dc6d37e" + }, + "vllm/distributed/eplb/policy/abstract.py": { + "path": "/vllm/distributed/eplb/policy/abstract.py", + "sha256": "b9fd34c28bbfdded03360d7f3f6f8fb978e82689190d7ae4501dfe520e958c62" + }, + "vllm/distributed/eplb/policy/default.py": { + "path": "/vllm/distributed/eplb/policy/default.py", + "sha256": "3b54229e6240d050480390f6b29d4744fd38437d23719f78a6decf7002296a29" + }, + "vllm/distributed/eplb/rebalance_execute.py": { + "path": "/vllm/distributed/eplb/rebalance_execute.py", + "sha256": "b387e228791149018536eee96cf955b33ba79d801cdc36849d1b47a580ec2597" + }, + "vllm/distributed/kv_events.py": { + "path": "/vllm/distributed/kv_events.py", + "sha256": "de08f01e8736881560256c350a3b6418999dd4aa30f9c6ec9159527f7ed6899a" + }, + "vllm/distributed/kv_transfer/__init__.py": { + "path": "/vllm/distributed/kv_transfer/__init__.py", + "sha256": "c1be4e58ec6923bae607a355ad22891c740f056a69ff7358b1e10ea3fd2680ea" + }, + "vllm/distributed/kv_transfer/kv_connector/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/base.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/base.py", + "sha256": "2ae2a2c48f5731f3533166a75440fe91e764332305b5d713df840edba970789d" + }, + "vllm/distributed/kv_transfer/kv_connector/factory.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/factory.py", + "sha256": "add99c93c587b0098b90b1f8fd6940bdd1f15c236c5c6f1a258411863cb902d3" + }, + "vllm/distributed/kv_transfer/kv_connector/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/utils.py", + "sha256": "317ed40dc837671ca6e666165222e641a0f9b3992aea63bbf54de7e13d40b3a4" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/__init__.py", + "sha256": "5beb6ccad12fdcfe1581982da6f18321caca50e73a6b3259ebf3c8dc8b3ffcca" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/base.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/base.py", + "sha256": "97af64220475c6c9e8273438d7b5138b105ebe6944beb783facb36a3bb76f31b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/decode_bench_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/decode_bench_connector.py", + "sha256": "b4151c88cdec28f1ff9259047abc17baf23b892f4b68769a93bf26e0442b9017" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/example_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/example_connector.py", + "sha256": "6226876ef52d10d0d284d29c337ab44698e8bac6abdb2e0ece53b5756c55d068" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/example_hidden_states_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/example_hidden_states_connector.py", + "sha256": "58c22534dcad0fb73599a2d70a2fb104d5b612a4723be5e777f56a56fe07892c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/flexkv_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/flexkv_connector.py", + "sha256": "de4f68c3bd565ed898e47e0b2980049b966ff31888f1957050d30995d4953762" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_client.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_client.py", + "sha256": "bea6ecff2be281c7e96c1551c7bf463cbb01f2964696067c0ebdb683844f9aab" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_connector.py", + "sha256": "e67ed58015090e5eea9d499883f2a9422673d07f8bdbe0ccff7db15d2460de13" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_metadata_server.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_metadata_server.py", + "sha256": "6800e5cf37809f8a8e28c469c14a434db288bc3bf83a8b62ee06910a20c2da19" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/common.py", + "sha256": "8f2c02c08227a9093e6aeb183961aba36b7812cfc29b8c047a2b2c9d82f79c15" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/gather_scatter_helper.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/gather_scatter_helper.py", + "sha256": "08c1b43de34fbeca77357d7576ac1d17cba974b59d695562f68bb713061e7b54" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/hf3fs_mock_client.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/hf3fs_mock_client.py", + "sha256": "bec61a9b0c4b9124b2292d7646d76411da44396389349b53cdcbc46353c8780e" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/connector.py", + "sha256": "8c61094ce0a3a702908f9576f69482e6bf314738a2cbe33a7d3b47258fa0ab43" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/stats.py", + "sha256": "d9383a6ad6ab6b8f812d29d90495407b770eeddb79b86e9d0e3216c0bd16e0ed" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/worker.py", + "sha256": "251c0d8e57e4739c03ce3e1c899a95ff5b1752eb27676c28ab88c4ebd62c4776" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_connector.py", + "sha256": "5991f9ff8832df32bd421eb67e48237270ea0a408180e523810bb43606acf8f3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/__init__.py", + "sha256": "c53be9796e76cde637514bfc40a525d8c09bb2784b406cb516790d8285dfe433" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/multi_process_adapter.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/multi_process_adapter.py", + "sha256": "6480d67b31ed603027a83edf327880a38aee45eaeee2da9a4efa93e95527c166" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/utils.py", + "sha256": "e204fa6a853ac9c122d7a4e9d146902230f81c48d4321ed5edfdbf979dd49ba2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/vllm_v1_adapter.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/vllm_v1_adapter.py", + "sha256": "e6fe55049c6b007248516d69640e2f3a4809f9d286091a1014ae0949987fa8f1" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py", + "sha256": "c712c386a7c57bf0355a1441ba574232c3aa5498fcb70713a2b3f5d18b64f9c1" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/metrics.py", + "sha256": "de1b1797d0448f74370919dbb0278767f390e8f59e00a0c0528abefb302babc2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_connector.py", + "sha256": "516be01320e64b0110e102eeb69a6ba766dd5ac8cb3036db6b97b7d54413323d" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_utils.py", + "sha256": "26877610463fa8e9d6b092772f2551bcc0c3ac794cbe63996df0414666a8ebba" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/rdma_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/rdma_utils.py", + "sha256": "716e5042edecaba36c7ca763474988f32fa09c2668b8260260149df610af8f83" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/stats.py", + "sha256": "f39b2f0b1db2e4f922e27e684a3f7bbf5bb279b82a0a8c3bb0c7ae69b6d14d24" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/connector.py", + "sha256": "17a350bdb89e17e415d6c52a48684dc15c35a804378daf03e1f3bee1b1b123a3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/coordinator.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/coordinator.py", + "sha256": "a8eb6c2157a96e8d25233b82347ac8409a41d6390b4f2c64242119c05911010c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/data.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/data.py", + "sha256": "d3cfefdb4165a24995749cba452641b318065baa95bb1bae62f922a2f8886e7b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/metrics.py", + "sha256": "f2b9ef8927632d142aad11a374d0725c6e619ea0bb7fea9eda3f3895eb7d277a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/protocol.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/protocol.py", + "sha256": "ccb1cf6a84a932a375215627d2aaac482c351a05df015d636d05373a6845b7c8" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/scheduler.py", + "sha256": "283849ff581ec206444cdf5621622377f1c925e8d7e05cb9294af2f3a5094e79" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/worker.py", + "sha256": "55f1682dfd1ed7af689166421337126a0e1d08afa4774a242e098d79e0c1e95b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_common.py", + "sha256": "549bb4fe22dca5095515b9c0712c31cc81a9d4923881e9f112317640fd8c04ab" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_connector.py", + "sha256": "c0f474bc34b579d889fae92eaf43eaca241be51a4697a187a942f0df4e6b6a98" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_engine.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_engine.py", + "sha256": "d842f3772fc6588d5a329a67572324cb74709aa3df4033e64c791a1e706c8e88" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_layout.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_layout.py", + "sha256": "2b4ec046a78897236b0626939bb828b6ec095355097d10bca39e5f3e1c992553" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/multi_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/multi_connector.py", + "sha256": "12d8387239f3194f2cb63ccbd64824648047210323572d66671e6a1eed349fc3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/__init__.py", + "sha256": "cc3145fe3b6d219a267bf40a0f7c0cc9430e4289f94acab2df761b99b671e7ba" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py", + "sha256": "7a1db8c54e4cd846bdac747344f2aea2c2fcf507817928796063225223b7e169" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_worker.py", + "sha256": "49a2e4faf99bef146b5a1d4d18d48f240b1e561c438252274494b359db96ef52" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/connector.py", + "sha256": "b6a0dc916d052f344be72ecfcb111509c13580102c11a860fa726cf0888949a9" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/metadata.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/metadata.py", + "sha256": "2b23a07c1ec5ac5490c3b818737c7192e344ea9f52cd5623f75939f741ab4e21" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_scheduler.py", + "sha256": "ac3daf8e2246581fec84ab28f2133569421b62c32a120be4923e2f4d0f2f9de9" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_worker.py", + "sha256": "e5060c9b6cf022de35ca3d1da7a369cd6a6a2dea26219af9f7633aaf78af8a76" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_scheduler.py", + "sha256": "2d9008e33937a4d6c5cf9cc2f96160f2bdbc8e987fe37f0798a7fd7eb84c9572" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_worker.py", + "sha256": "87de3ea383dd3aa95fb2c287ea26ded8a330859cc1295f9faa69047e80865c2c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/scheduler.py", + "sha256": "09f1bfe7075b926b26a94529480e33b62c3ac273ff826f6c502084f08b1b2a08" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/stats.py", + "sha256": "3e710654e0b68d1a8592f0c4735c81b22f4bf698fb1a2dfea126d35bf2dd1ef2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/tp_mapping.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/tp_mapping.py", + "sha256": "2d43607f98701b2fad6cc0ac2767619a80b7fc2b3a3c2eb6ed0da4fb05dcd8f6" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/utils.py", + "sha256": "93de863fc8307a61d40b62f1b176b57ae93c363d34b9e9ddc8e666265b6d45dc" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/worker.py", + "sha256": "5134a36ac100ce7a64f5311029a37ac12c38d91093f63100f51f7fe53ea7c3ee" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/canonical_mapping.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/canonical_mapping.py", + "sha256": "e0b3c6f9806a650e0370c43c5068fc31c0fec94615089e15fdf270d7d96f2b64" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/common.py", + "sha256": "9b3f042c6fa1581d10e8f688d2d9bc927bb41b780a9ea01f514d57228e20c978" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/config.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/config.py", + "sha256": "aea82e60889e78dcad8564ec8285b65a6a372824a1545a98ea8e78b6f4fd418a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/events.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/events.py", + "sha256": "d7039b67be95fd444966628184040a94880873c0611c0e6e7525a22650ffdefb" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/metrics.py", + "sha256": "13d76df014e86691f58dc89a879f9808b124690c9267dd5fa3b2d4004d4c5fdf" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py", + "sha256": "2c5282f4a3165cd787fb355e215e3869f1bdd3f2c795b2155fc537c9d135191a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/worker.py", + "sha256": "acc2df53262441dfc6421a3af7f0cbd68cbfaedbd42bbc384d8e1da2d965d194" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading_connector.py", + "sha256": "cdc16ca7339a10e1993bd6220e6273f86a4e99779f58f25098a24ad31bb0dbd8" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/simple_cpu_offload_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/simple_cpu_offload_connector.py", + "sha256": "96238ca82ccf07a1eeb59b8f66de17b09034e3eb993ad9a0a836511d3f69706b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/ssm_conv_transfer_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/ssm_conv_transfer_utils.py", + "sha256": "59a949709482e65a007fbe5352fe9b4bb54c2dcc10ad2c1c41f754b6e13299f4" + }, + "vllm/distributed/kv_transfer/kv_transfer_state.py": { + "path": "/vllm/distributed/kv_transfer/kv_transfer_state.py", + "sha256": "2e5fe09438d6e2ee642f8a26cf7dcf632e870d955d30baf002b76a8bfe836d05" + }, + "vllm/distributed/nixl_utils.py": { + "path": "/vllm/distributed/nixl_utils.py", + "sha256": "0bffa3c052c9f67472b1c0bc3816114891b010c968bf4b8a292e7da4d687db53" + }, + "vllm/distributed/parallel_state.py": { + "path": "/vllm/distributed/parallel_state.py", + "sha256": "d9b10ad56833ebc08a753e1a050ef0989c30d4134021b7b7b00150b7bd01adc6" + }, + "vllm/distributed/stateless_coordinator.py": { + "path": "/vllm/distributed/stateless_coordinator.py", + "sha256": "f52848fbe985ed47b1f3e3ca555314736ca06436e8d738ab4390101f0672dcb0" + }, + "vllm/distributed/utils.py": { + "path": "/vllm/distributed/utils.py", + "sha256": "792146b357139e705064a68d3b66858de8a0baaca4dc7db1232fa217d45db231" + }, + "vllm/distributed/weight_transfer/__init__.py": { + "path": "/vllm/distributed/weight_transfer/__init__.py", + "sha256": "3fb9d4712b7c131d522f5e76e73cd8c333f3cc7af86e2d5ecf9b61b57b3b7f5a" + }, + "vllm/distributed/weight_transfer/base.py": { + "path": "/vllm/distributed/weight_transfer/base.py", + "sha256": "8ab06feb04f1379d0558fbdb77fde46bc84f179e0a26742cabab937e88caa38d" + }, + "vllm/distributed/weight_transfer/clients.py": { + "path": "/vllm/distributed/weight_transfer/clients.py", + "sha256": "ff85c79c350241e6d2749ca23c9d295a3289b4b62bfdf0257d32eb94a0151d36" + }, + "vllm/distributed/weight_transfer/factory.py": { + "path": "/vllm/distributed/weight_transfer/factory.py", + "sha256": "4e979eeac8c5bcdbffb10eb4765cfb30120fa7595c6c2561d3fa1a966ced61c8" + }, + "vllm/distributed/weight_transfer/ipc_engine.py": { + "path": "/vllm/distributed/weight_transfer/ipc_engine.py", + "sha256": "1af578293f387a19073c322b24143c3ae4716ce0c5d2bac2a4ef26fe20119330" + }, + "vllm/distributed/weight_transfer/nccl_common.py": { + "path": "/vllm/distributed/weight_transfer/nccl_common.py", + "sha256": "7b2ef7dc7481c3f478f17c49aa36c7bed54142ec5c93d36ed8426c8fdf09e500" + }, + "vllm/distributed/weight_transfer/nccl_engine.py": { + "path": "/vllm/distributed/weight_transfer/nccl_engine.py", + "sha256": "7fd020c919dc7b4723fb78e64da977b180d0fef0cd21df955a037b848dbaa008" + }, + "vllm/distributed/weight_transfer/packed_tensor.py": { + "path": "/vllm/distributed/weight_transfer/packed_tensor.py", + "sha256": "d0a27fb0be1dc029bd5a1d44fdb57a5e54aa4cd74308bedc339e86ac02c7494c" + }, + "vllm/distributed/weight_transfer/sharded_rdt_common.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_common.py", + "sha256": "be0b13801f24e7b62999b19d733c030510353603a2d5320d5dc98ee02daf22a2" + }, + "vllm/distributed/weight_transfer/sharded_rdt_engine.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_engine.py", + "sha256": "2f791970b4815511a7578ef6c957e7da97b071d26a39087a09a17475909791ee" + }, + "vllm/distributed/weight_transfer/sharded_rdt_fake.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_fake.py", + "sha256": "ee11164e17b5f2793252ce77741b8b94e0583046abf896a590131b2008d1fbb9" + }, + "vllm/distributed/weight_transfer/sharded_rdt_trainer.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_trainer.py", + "sha256": "dd413ff461d41826ccd3eb87d3df22f6cd7f24e09aac7644e3e5b40d7beec484" + }, + "vllm/distributed/weight_transfer/sparse_nccl_engine.py": { + "path": "/vllm/distributed/weight_transfer/sparse_nccl_engine.py", + "sha256": "e11b409454dda2b05ea34e8115ac19027c5e65cb2a5e9682c494f16a50e978f4" + }, + "vllm/model_executor/determinism/__init__.py": { + "path": "/vllm/model_executor/determinism/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/determinism/batch_invariant.py": { + "path": "/vllm/model_executor/determinism/batch_invariant.py", + "sha256": "af8f8d256a48fc214edf426fbe891fb15bd8b1d7ae98b811c736ff1eb0fae798" + }, + "vllm/model_executor/determinism/batch_invariant_configs.py": { + "path": "/vllm/model_executor/determinism/batch_invariant_configs.py", + "sha256": "72ea0d4df0ab5ae288abb7df5c203d2ad5f1709c7295d87ec72da775fddc1b7a" + }, + "vllm/model_executor/layers/fused_moe/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/__init__.py", + "sha256": "64a32665be6d5afcfbaf7a0915717267278b66b880b908b0263ea58f08e51b5e" + }, + "vllm/model_executor/layers/fused_moe/activation.py": { + "path": "/vllm/model_executor/layers/fused_moe/activation.py", + "sha256": "78dec0e85e0c040304515f64ccf8f2c6a7a2e5b9f1124a2138a97d9a02585541" + }, + "vllm/model_executor/layers/fused_moe/all2all_utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/all2all_utils.py", + "sha256": "dc4750a446f7de31d09a46034da5fdf479bc169af90f47aa9af8ae15e67b0828" + }, + "vllm/model_executor/layers/fused_moe/b12x.py": { + "path": "/vllm/model_executor/layers/fused_moe/b12x.py", + "sha256": "ee76cc6aa801e24be8ec78a9e8502061ad48667d5ff8711e43f68fba912425bd" + }, + "vllm/model_executor/layers/fused_moe/config.py": { + "path": "/vllm/model_executor/layers/fused_moe/config.py", + "sha256": "a3a87cebcc7ac85d73f471dcfafc2d899c6fc08f264777b74a0e919adac9e03f" + }, + "vllm/model_executor/layers/fused_moe/deep_gemm_utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/deep_gemm_utils.py", + "sha256": "8fdcd857eb333f9c68902105f157568d52067c94ba1e2df6dbfe0474ef1f4c02" + }, + "vllm/model_executor/layers/fused_moe/eep_reconfigure.py": { + "path": "/vllm/model_executor/layers/fused_moe/eep_reconfigure.py", + "sha256": "9d7580265e8563e1140c2bb4c3a81a35ddd54903f5ec0a2720ffc064681f02f9" + }, + "vllm/model_executor/layers/fused_moe/expert_map_manager.py": { + "path": "/vllm/model_executor/layers/fused_moe/expert_map_manager.py", + "sha256": "308c00f63fcb6f44518ec3a56d8f902c7bba75928c2e3aea30fbe1f3f473973b" + }, + "vllm/model_executor/layers/fused_moe/experts/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a16_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a16_moe.py", + "sha256": "53deea255175171971422d14082ad139b5ec7b62e21429a4c7cc0ebbefd29cdc" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a8_moe.py", + "sha256": "f3fc51b95ed89862381908a0134e326228827f44854248db9585a9c4899c34f4" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp8_moe.py", + "sha256": "af6db1760961a5a71234f8b1cdf42e9e30a236e13601b0826a75110b79724948" + }, + "vllm/model_executor/layers/fused_moe/experts/batched_deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/batched_deep_gemm_moe.py", + "sha256": "b0cd4ea706583518dc608fb56f832fc3595f24bd863b03ef1e8c22b36b873508" + }, + "vllm/model_executor/layers/fused_moe/experts/cpu_int4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cpu_int4_moe.py", + "sha256": "67170af3ba9dc4c4f71d78a72efc3fa4e366eac614936a79911dae5c75ac1864" + }, + "vllm/model_executor/layers/fused_moe/experts/cpu_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cpu_moe.py", + "sha256": "0754cd4ff1b28e6d3932a67609d335acefd28f95a841f0492923813356a6d81e" + }, + "vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py", + "sha256": "db901bdbcd3fdac23a1d74e39c51e67f14a82be787b2fd704ed1e787372ae868" + }, + "vllm/model_executor/layers/fused_moe/experts/deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/deep_gemm_moe.py", + "sha256": "16911a64a72eafc26a1bcb544a91f90144d85dc41e3ee57cf20e89925227bbb7" + }, + "vllm/model_executor/layers/fused_moe/experts/fallback.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fallback.py", + "sha256": "1bdd0a4f2ebaa40ec96a5aacc07aee61511af59e6324ce456aa65003b6e2991a" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_b12x_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_b12x_moe.py", + "sha256": "e613afe5da2742e42c717c1a0a56bd9e1c7e3e0452a828db0013d81063518954" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_batched_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_batched_moe.py", + "sha256": "295254dfeeec8df3eb8110e6f659a946cb9cded3de1565ecad4d741b3c3f3e00" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_moe.py", + "sha256": "08578bcd0cf72d6a470e40950175e73639efaa6d8d23c6da0869345312b229c9" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutlass_moe.py", + "sha256": "52887cec5fe628e0a4e7793deb546b40f6c29f7362b3b436c10ca36934ab9826" + }, + "vllm/model_executor/layers/fused_moe/experts/fused_batched_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fused_batched_moe.py", + "sha256": "2435587fc7f8fe8ea341ea0eb8f14c11f3f5b31fbbb9b29ce569ad3bace6e6a0" + }, + "vllm/model_executor/layers/fused_moe/experts/fused_humming_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fused_humming_moe.py", + "sha256": "a6830a76ff7f4cd3479b9c8372a30d03e8301604555cbdbcd9ac89a813b7431a" + }, + "vllm/model_executor/layers/fused_moe/experts/gpt_oss_triton_kernels_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/gpt_oss_triton_kernels_moe.py", + "sha256": "1613a7a6b256e8faee6fdcfae84f293492db6229d28ceb3e8a8d6093af480e36" + }, + "vllm/model_executor/layers/fused_moe/experts/int4_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/int4_emulation_moe.py", + "sha256": "f12857caf0671a341687ad3c5f48616b816ed51e1bcbdefa0a7edbecdb81a79d" + }, + "vllm/model_executor/layers/fused_moe/experts/lora_context.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/lora_context.py", + "sha256": "9b41eefaaa57c5dd0dc54217ef95978821b0c52e90ea4db8b0752e08452bd3e5" + }, + "vllm/model_executor/layers/fused_moe/experts/lora_experts_mixin.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/lora_experts_mixin.py", + "sha256": "b2bc55ed6be98b526c6a5698e2d98300650e78555f56b1820e58c04888e2a373" + }, + "vllm/model_executor/layers/fused_moe/experts/marlin_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/marlin_moe.py", + "sha256": "93916b721548e6194dc70cf6cec224b4b1456a0cc0980235e97beba7bf36541d" + }, + "vllm/model_executor/layers/fused_moe/experts/mxfp8_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/mxfp8_emulation_moe.py", + "sha256": "d09c62ad1398c51ff6f515f2a61014ee9e9a9798d0fe9762c47f446efc5edbef" + }, + "vllm/model_executor/layers/fused_moe/experts/mxfp8_native_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/mxfp8_native_moe.py", + "sha256": "01a42cebf18189e566034111b2145573c655319e8af1a56db60d53a319c40613" + }, + "vllm/model_executor/layers/fused_moe/experts/nvfp4_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/nvfp4_emulation_moe.py", + "sha256": "f24467762b60702f0df122ed64786be839a838a9b6cafaecbd04d35fbfedb189" + }, + "vllm/model_executor/layers/fused_moe/experts/ocp_mx_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/ocp_mx_emulation_moe.py", + "sha256": "dcaa60a9ebdb0bd8223b37af41f018ce7f95716ec7cd8526850f4433a579213b" + }, + "vllm/model_executor/layers/fused_moe/experts/rdna3_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/rdna3_moe.py", + "sha256": "e4abd802dc2f0ad9b338ebde397633c761d881c37813e2dc229902c526b597d8" + }, + "vllm/model_executor/layers/fused_moe/experts/rocm_aiter_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/rocm_aiter_moe.py", + "sha256": "bf09a7b783f5752d61cab76221b32b598d8846d801ee39dc9209d636c9659c6f" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_cutlass_moe.py", + "sha256": "ffce5ad627c540940d122d8df7981644b2eb35d07d480995c0f4f30517815fac" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_deep_gemm_moe.py", + "sha256": "c7209fa5e1ccb184a68b37a0706fc571a76696c2ae79802ddc7f889b1c29684d" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_moe.py", + "sha256": "806fbccfe30f5fbd578acf773add99bdf022b12d617958bd6281aef6de369701" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_bf16_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_bf16_moe.py", + "sha256": "76256de96fefece9c41ffb1108487919e24da364cf4412c6c3474498aba59137" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.py", + "sha256": "b54c7ceb45e5d07aa905f42ea44caccf85ca35ba9fb825d4c01947764510f68b" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_lora_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_lora_moe.py", + "sha256": "dd35a9e4242c0dc8d691168813e14bd5543e591f02ee529d0691e07651942c5a" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_mxfp4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_mxfp4_moe.py", + "sha256": "fe780f125a3dc3ba919659e9b85340bd32afcbfe47733a002bfdfb92eadf400c" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_mxint4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_mxint4_moe.py", + "sha256": "2106d67c2951aa690c4656ca58240d09c366cffe8cb4d9fd575df016c377cc30" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_nvfp4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_nvfp4_moe.py", + "sha256": "e938ac9f058f7c90b41c9610513239bec54a95304bfb5ff5f6897ebd54733d7e" + }, + "vllm/model_executor/layers/fused_moe/experts/xpu_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/xpu_moe.py", + "sha256": "2a11bac0cf9274d963315efd6eebdc62978b0b7aa02e8849ff2a562742f0b86d" + }, + "vllm/model_executor/layers/fused_moe/fused_flydsl_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_flydsl_moe.py", + "sha256": "0e74879ee5c72f616ae4064b9dff3b3a0b583b7fc70b8f92f1e8b730ecd5d39b" + }, + "vllm/model_executor/layers/fused_moe/fused_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe.py", + "sha256": "7072eb06237be9d33dcb0ef7101410f886a6363c98cbee70a014c68b70f639cb" + }, + "vllm/model_executor/layers/fused_moe/fused_moe_method_base.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe_method_base.py", + "sha256": "18dcfc469d3252749801bbf943857f58da85de1f2db8fdff5a9f4986a925dc68" + }, + "vllm/model_executor/layers/fused_moe/fused_moe_modular_method.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe_modular_method.py", + "sha256": "321c744eac1fcaffd6b1b2971204c8baa57dfec53e91e5d24140014d72d64f83" + }, + "vllm/model_executor/layers/fused_moe/hpc_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/hpc_moe.py", + "sha256": "2ca9c5d71b6fd91651027905e2b83103a8823845e053e7153e148cb8e0ee666d" + }, + "vllm/model_executor/layers/fused_moe/layer.py": { + "path": "/vllm/model_executor/layers/fused_moe/layer.py", + "sha256": "def0b4e13bcc1e4e21ee10644e647e2eda1acbf0cc01e76d6128abb59ea08224" + }, + "vllm/model_executor/layers/fused_moe/modular_kernel.py": { + "path": "/vllm/model_executor/layers/fused_moe/modular_kernel.py", + "sha256": "8dc4e0dbbf35b3aac8add63ca6f2a7bbfdadaabbd60826e24598b22c7d8e5c22" + }, + "vllm/model_executor/layers/fused_moe/moe_align_block_size.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_align_block_size.py", + "sha256": "c3f7fc2087836f0160a32ab99ceb1d8f6e87c793679da34dd672e225cb7fa31b" + }, + "vllm/model_executor/layers/fused_moe/moe_fused_mul_sum.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_fused_mul_sum.py", + "sha256": "112e72578002c3bff538418dac64b3b56d995994a2fc5e32b18d2cf3b8392a13" + }, + "vllm/model_executor/layers/fused_moe/moe_output.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_output.py", + "sha256": "6ea4cbd78f9efc7f842c5df246f553f08b991c3479b8b04b89902ed08aaf8e8f" + }, + "vllm/model_executor/layers/fused_moe/moe_permute_unpermute.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_permute_unpermute.py", + "sha256": "1adc592c6254d0c877d66be5406afbc822459c18a838f4bbd094a992e7609d06" + }, + "vllm/model_executor/layers/fused_moe/oracle/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/__init__.py", + "sha256": "4dcf941d50d48bb812de0f39e9194bf17a76b8035fe324889c6038f710fdc453" + }, + "vllm/model_executor/layers/fused_moe/oracle/base.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/base.py", + "sha256": "555bbcd18a3744e64eee4e953daabef3bd268a1bd4faf967d4cfd14d6074f685" + }, + "vllm/model_executor/layers/fused_moe/oracle/fp8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/fp8.py", + "sha256": "245bd36c285df1e6f7c51e52dcda31ad247894577a9f8d765613c2c2feae9aee" + }, + "vllm/model_executor/layers/fused_moe/oracle/int8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/int8.py", + "sha256": "c1b67886511bd966b162db5bca8930f04895fb37a969818a4a10f0726c59547f" + }, + "vllm/model_executor/layers/fused_moe/oracle/int_wna16.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/int_wna16.py", + "sha256": "cfffe8b8b290330be9d18ffa07aeecf296484395ff04df3147d99393e48b55c1" + }, + "vllm/model_executor/layers/fused_moe/oracle/mxfp4.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/mxfp4.py", + "sha256": "b7915e6779b5c88e7dcd2d227f003a8e45071d6d86877013067142d4feb64a8c" + }, + "vllm/model_executor/layers/fused_moe/oracle/mxfp8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/mxfp8.py", + "sha256": "9cfdc8102a04bb844dcd7ed88043bba96ec751794bc093da76c69aa8cf88cf48" + }, + "vllm/model_executor/layers/fused_moe/oracle/nvfp4.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/nvfp4.py", + "sha256": "735b4cdeb1258f11fb02320fc0c70cab5edaca468dd60b07b2d369389d2b0313" + }, + "vllm/model_executor/layers/fused_moe/oracle/unquantized.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/unquantized.py", + "sha256": "c8b8203bd0b73bb7f586f703607394d663f14c05711416ad42d45af564382223" + }, + "vllm/model_executor/layers/fused_moe/oracle/w4a8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/w4a8.py", + "sha256": "d7fa6e2982f20b34d5ce9c5ce28a61122762a3fcdd53d249479472a4f2316c6a" + }, + "vllm/model_executor/layers/fused_moe/oracle/w4a8_int8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/w4a8_int8.py", + "sha256": "6d6f9ca2e67b630002873de2f8d8a231d091c5c2f0f3354a9e8209449b481a4c" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/__init__.py", + "sha256": "2800113263a83c2632e522fb22790b29f63384da75d43de32f0ae2f95e8ae4c1" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/batched.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/batched.py", + "sha256": "d52425dd8c08e47cf8d9c3088daf3b1cc721c8667de4c738d04ba997f9a08ccb" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ht.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ht.py", + "sha256": "465cdf1d6cee91b2ee8c2e43abbea6e8408976e3048c10f44c089f34b415bc60" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ll.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ll.py", + "sha256": "f704922b1db680c4c212982a096e09d6b3eb97d89110313f86ed958a00df21b7" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_v2.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_v2.py", + "sha256": "8d690b016bbcfbc9eb599bcc36a6f798b2f1720c828f4347ea742e218c0cc60d" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_one_sided.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_one_sided.py", + "sha256": "acb57d8342af62bb5672036871cd4b27ecc7f37dfa7c894850bb860e6152a1f0" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_two_sided.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_two_sided.py", + "sha256": "cc5b00d6a157b6eca5afaaf7435165dbd1b4524d6d88bf75808cbe074a389f79" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/mori.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/mori.py", + "sha256": "8e9c3b5b1f0de13f467d95bf2f451cba0e4b0d9a1bdcf98da0988a3a9a79a045" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/naive_dp_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/naive_dp_ep.py", + "sha256": "db015e5b18750bbbf5b2bbaceca877dd6f3f3e74c2a94e8dc185f7413b387f91" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/nixl_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/nixl_ep.py", + "sha256": "1f71d70ac509bf5d3d67a8d95a8ee108a50af6bb5d4bde7181ca28e286f6ffce" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/no_dp_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/no_dp_ep.py", + "sha256": "adbbf529cd22059c95b5380952943a70cf11e05e321dcd707f296bebde61a6e7" + }, + "vllm/model_executor/layers/fused_moe/routed_experts.py": { + "path": "/vllm/model_executor/layers/fused_moe/routed_experts.py", + "sha256": "68c48e5df0ea4a7cc1f04436b7b9153eb53802ecd9bb55d38db8738508daac6d" + }, + "vllm/model_executor/layers/fused_moe/routed_experts_capturer.py": { + "path": "/vllm/model_executor/layers/fused_moe/routed_experts_capturer.py", + "sha256": "cd006bc1a1703418cca3b589fafb2abc4268a086fb3db044bbb64348aeac8b13" + }, + "vllm/model_executor/layers/fused_moe/router/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/layers/fused_moe/router/aiter_shared_routed_fused_moe_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/aiter_shared_routed_fused_moe_router.py", + "sha256": "f47046db1275601a2c67c9232afc7b866c9623a19639d5be867e4c7914a35069" + }, + "vllm/model_executor/layers/fused_moe/router/base_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/base_router.py", + "sha256": "47fa2324bcd9b6ebdc138d69ae6b6ecc0f2463d34bda8c5988bdb0a2a76d3fae" + }, + "vllm/model_executor/layers/fused_moe/router/bf16x3_router_gemm_cutedsl.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/bf16x3_router_gemm_cutedsl.py", + "sha256": "d0f1edd1ebc48d88e490bdb3c93db49bdc0a135ff83e7e0b57130e9f8255fc32" + }, + "vllm/model_executor/layers/fused_moe/router/cpu_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/cpu_router.py", + "sha256": "bff36b15818c87bfbb7ee3def7dc7f6396860abbe5893ff6148801fe941a4b92" + }, + "vllm/model_executor/layers/fused_moe/router/custom_routing_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/custom_routing_router.py", + "sha256": "1a40c7054e3c3a1b3ee2e98f6bc9efa9dfdc11f316a8edf7357dd91533487bfe" + }, + "vllm/model_executor/layers/fused_moe/router/dsv4_topk.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/dsv4_topk.py", + "sha256": "14f7c8487b9aef652dd61c91e0e3c3640b643bf9cd0d8a7184157d71f4beb63e" + }, + "vllm/model_executor/layers/fused_moe/router/fused_moe_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_moe_router.py", + "sha256": "0daa0dc05b931d66767feca444a4cd57ecf140f59b40ea0e8ad213eef6da2b36" + }, + "vllm/model_executor/layers/fused_moe/router/fused_topk_bias_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_topk_bias_router.py", + "sha256": "8fdc28cc248180ad4f11bb4bcda3df47926ec12665a0d84bb712fe83fc6b9376" + }, + "vllm/model_executor/layers/fused_moe/router/fused_topk_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_topk_router.py", + "sha256": "1c80f4af4d781fd66b12aa6a7a0fd30082bc521df40f1252987a8ac4c0bef51c" + }, + "vllm/model_executor/layers/fused_moe/router/gate_linear.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/gate_linear.py", + "sha256": "faa43362c2e7c568498a923c682ca18cae75e87f48d00882770821cb19c21198" + }, + "vllm/model_executor/layers/fused_moe/router/grouped_topk_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/grouped_topk_router.py", + "sha256": "048339e1799cdd42c9dae686a6cb891046577fb391b500f0d12eed73c8f61e52" + }, + "vllm/model_executor/layers/fused_moe/router/rocm_fp32_router_gemm.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/rocm_fp32_router_gemm.py", + "sha256": "9c331ef3d0bb2fb6954387d77ac62a99c5c76d2753c7438bfbb5115f68aae5ac" + }, + "vllm/model_executor/layers/fused_moe/router/router_factory.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/router_factory.py", + "sha256": "019bc8adaa7642abab82843efd53cd1a378f62c652521a1de2b781480eb88742" + }, + "vllm/model_executor/layers/fused_moe/router/routing_simulator_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/routing_simulator_router.py", + "sha256": "a7345df5add00cf3bd93024492d6fc1189fd3ecf2754a11cef1b03a295d791f7" + }, + "vllm/model_executor/layers/fused_moe/router/zero_expert_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/zero_expert_router.py", + "sha256": "dea306edd92e2b9c1b43f982ede8e1e10770d2c66220f5a106e0ed0165276e9c" + }, + "vllm/model_executor/layers/fused_moe/runner/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/layers/fused_moe/runner/moe_runner.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/moe_runner.py", + "sha256": "05893188402fe37229bf72d75088d66193c417d5d502daafd3a55e1bfedaa60c" + }, + "vllm/model_executor/layers/fused_moe/runner/moe_runner_interface.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/moe_runner_interface.py", + "sha256": "189cad01611124eb44594713cbf5918d16fc70196dc81a525ae0a7a97a5fcc51" + }, + "vllm/model_executor/layers/fused_moe/runner/shared_experts.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/shared_experts.py", + "sha256": "d89e4c79c46f6fe61262c51f3facf102e71ce1e4eb3db67f72b6bd8470937be9" + }, + "vllm/model_executor/layers/fused_moe/topk_weight_and_reduce.py": { + "path": "/vllm/model_executor/layers/fused_moe/topk_weight_and_reduce.py", + "sha256": "3dfede72d52bf99af40997994704e6c502ee3bab2bd39bfaa8a68d7dae440203" + }, + "vllm/model_executor/layers/fused_moe/unquantized_fused_moe_method.py": { + "path": "/vllm/model_executor/layers/fused_moe/unquantized_fused_moe_method.py", + "sha256": "182a5ec1874ece2091a24c5303f6ab9ea64a9a61adf325b863927f0cdd83e5d3" + }, + "vllm/model_executor/layers/fused_moe/utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/utils.py", + "sha256": "a93a0bded4008db19d8b38370526ae34fafb9c8278e5b4f60acb6acc8fdc1850" + }, + "vllm/model_executor/layers/mamba/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/abstract.py": { + "path": "/vllm/model_executor/layers/mamba/abstract.py", + "sha256": "dfdc8c836894f574e41d93d76ab989cacd3d7ecf59c97a929abfa48d9364e8ad" + }, + "vllm/model_executor/layers/mamba/gdn/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/gdn/base.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/base.py", + "sha256": "7fec748fc74131f5a45bcaf2644b3fa3a0598fd437d7347f8207ea3644a951c5" + }, + "vllm/model_executor/layers/mamba/gdn/kimi_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/kimi_gdn_linear_attn.py", + "sha256": "1cec4da5c9da73557e192bfb36cd540aae51d3e91283b554449c4a97f0f89bd9" + }, + "vllm/model_executor/layers/mamba/gdn/olmo_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/olmo_gdn_linear_attn.py", + "sha256": "60873ca3bb0c4d17c33bd259b62b658db4883cd23138f47dd4ead62cd2ff0605" + }, + "vllm/model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py", + "sha256": "b80f8e6f3fff442fb880aebb3209c52f814f66490009f4ac4003de603576d10a" + }, + "vllm/model_executor/layers/mamba/linear/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/linear/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/linear/bailing_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/linear/bailing_linear_attn.py", + "sha256": "3c480ddd6eba0766ed012a1074bbec5f241d868a87b020b0f6312222c32f93eb" + }, + "vllm/model_executor/layers/mamba/linear/base.py": { + "path": "/vllm/model_executor/layers/mamba/linear/base.py", + "sha256": "26125cd427225954e1846ca361cdaf43f2b56f11b1e217cf26e91a80ef0edb6a" + }, + "vllm/model_executor/layers/mamba/linear/minimax_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/linear/minimax_linear_attn.py", + "sha256": "4adc00f54893b5bc6c31c613deda152a19af3b1bba04153ab5924c3bf2a3aaae" + }, + "vllm/model_executor/layers/mamba/mamba_mixer.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_mixer.py", + "sha256": "a485e937ad9db14d3ad03fde5a9fe795cfa863649563e52fc7e6c52ef631164e" + }, + "vllm/model_executor/layers/mamba/mamba_mixer2.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_mixer2.py", + "sha256": "d58d93e90d9eb90bc5133b79f07c7c62d0032b35d6cf916e3fe34367b81c5cd5" + }, + "vllm/model_executor/layers/mamba/mamba_utils.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_utils.py", + "sha256": "ce9845b4a4ef4bc46577a33038ed69d59ceccb52f30e9c5bdaa36e48be3b2ca4" + }, + "vllm/model_executor/layers/mamba/ops/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/ops/causal_conv1d.py": { + "path": "/vllm/model_executor/layers/mamba/ops/causal_conv1d.py", + "sha256": "044d005cfe59fd0818ed421274e04f3e8dd679b8cdb64fca9f4422f2643484b2" + }, + "vllm/model_executor/layers/mamba/ops/cpu/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/ops/cpu/causal_conv1d.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/causal_conv1d.py", + "sha256": "64104672890ac2ef240c20c7f8059beeade707178574809dbca8721dff5ea6fa" + }, + "vllm/model_executor/layers/mamba/ops/cpu/gdn_attention.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/gdn_attention.py", + "sha256": "a50288945bf5b102ad3025ae536638dcc32d84cf7c22aaf3a85326b0c1c56c1f" + }, + "vllm/model_executor/layers/mamba/ops/cpu/mamba_ssm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/mamba_ssm.py", + "sha256": "5839e576172a3246337f5e4fb1bc19eb583b3e2b2f7e35dd060dc3041eb8372d" + }, + "vllm/model_executor/layers/mamba/ops/gather_initial_states.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gather_initial_states.py", + "sha256": "5198bb6de6d91c583a5f65d926412a76ee04a06fa72aaba76eaf156b27cd0523" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/__init__.py", + "sha256": "b88b52e71fcb21bd3fa215ea171dcd2ad2ff17c97788cfe64caa7ba45c7ecf97" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_h.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_h.py", + "sha256": "f50bbe5c0b6382323ec5dfc24a5e0c7971113d59727515e60c9fe3689734e5ba" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_kkt_inv_uw.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_kkt_inv_uw.py", + "sha256": "b4a65dd194907db08865e0596fe254f915e670a9e6b27ffa2933c1026dde9b1e" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_o.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_o.py", + "sha256": "629f7843a7e611efb9390f2ebb7a4b924b2c328d48a317fddfaa96af4d9bc60a" + }, + "vllm/model_executor/layers/mamba/ops/layernorm_gated.py": { + "path": "/vllm/model_executor/layers/mamba/ops/layernorm_gated.py", + "sha256": "3433f2e3b87c2b2ccf8e9794ce40762c86a6da38a94ecee001f439ea0d0373dd" + }, + "vllm/model_executor/layers/mamba/ops/mamba_ssm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/mamba_ssm.py", + "sha256": "a4515ec7895b40ed878cf380445034b25faa61fbaa799d96c49217bbdfd7e400" + }, + "vllm/model_executor/layers/mamba/ops/replayssm_config.py": { + "path": "/vllm/model_executor/layers/mamba/ops/replayssm_config.py", + "sha256": "5fe9d5d7aa2de6a65875b3796a919b22bc435fd76055ba054bbff43aa005bc44" + }, + "vllm/model_executor/layers/mamba/ops/scatter_states.py": { + "path": "/vllm/model_executor/layers/mamba/ops/scatter_states.py", + "sha256": "f3bb004c73edaba56337747893eb07faf29b270dc8bb9c893ee9b1044e4ead9a" + }, + "vllm/model_executor/layers/mamba/ops/selective_state_update_replayssm_output_only.py": { + "path": "/vllm/model_executor/layers/mamba/ops/selective_state_update_replayssm_output_only.py", + "sha256": "cea7fd3063ca9dcc4e33f180d01ea379195ec515cedc9d0b03b11dc67670d695" + }, + "vllm/model_executor/layers/mamba/ops/ssd_bmm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_bmm.py", + "sha256": "26983d97a7f5c5f9197a16a6bee7b1294839b9ae31a14c14aaee38b43523e630" + }, + "vllm/model_executor/layers/mamba/ops/ssd_chunk_scan.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_chunk_scan.py", + "sha256": "d5ef32e8cb47e2ce71984579df78ab69754895f891766394daf327867cfa4f8f" + }, + "vllm/model_executor/layers/mamba/ops/ssd_chunk_state.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_chunk_state.py", + "sha256": "177e3aa7fe72647133bbd86135533e8688a5802678d4d1564aa549410362316f" + }, + "vllm/model_executor/layers/mamba/ops/ssd_combined.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_combined.py", + "sha256": "1317bbb668d3c60dfe0658850f9968614f03fa5eb61196f8ce6ac17dbb31b480" + }, + "vllm/model_executor/layers/mamba/ops/ssd_state_passing.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_state_passing.py", + "sha256": "36b8c8edba437916a5b789717c61fc22077de01e77892cb96dbff3b00a57410e" + }, + "vllm/model_executor/layers/mamba/ops/ssu_dispatch.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssu_dispatch.py", + "sha256": "bbe0f0e61da87f3ddfead19a79ca376516b63f1ea868be3485333c63fa20ef41" + }, + "vllm/model_executor/layers/mamba/ops/triton_helpers.py": { + "path": "/vllm/model_executor/layers/mamba/ops/triton_helpers.py", + "sha256": "a8795532f22c37a93e82c9d8e3fadcb5f4da98673d7b321fe8481305eaafad30" + }, + "vllm/model_executor/layers/mamba/short_conv.py": { + "path": "/vllm/model_executor/layers/mamba/short_conv.py", + "sha256": "228494efab185ee17374f762874f4c8b9a26aac9decfa8c906ce38446e0de51a" + }, + "vllm/model_executor/models/qwen3_next.py": { + "path": "/vllm/model_executor/models/qwen3_next.py", + "sha256": "4fa5112ac2bf7886d41d9e1f6c3da8793620d1ec49c961b31e9609459a6a7f7a" + }, + "vllm/third_party/flash_linear_attention/__init__.py": { + "path": "/vllm/third_party/flash_linear_attention/__init__.py", + "sha256": "5dbbfa3fc286edb2e970e175ef33cee4f6181c89b0784f5a8986201b2312f54e" + }, + "vllm/third_party/flash_linear_attention/ops/__init__.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/__init__.py", + "sha256": "dd738dc1d08045e76455cdbe16052a5b769e0eb11d6e87ff28353994f880cd6c" + }, + "vllm/third_party/flash_linear_attention/ops/chunk.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk.py", + "sha256": "c105ead259e86aedc248c53e7c4cef07034d0ff12da608d80265d1dd0990803f" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_delta_h.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_delta_h.py", + "sha256": "1b3ad391f939d9443c6b7adb19e57fe381bd5dccea064e8417a4f85b0e713b26" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_o.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_o.py", + "sha256": "3b63b836a8cc561723c23db5a528a0b474d9cd78508d610f0b348c585a889a19" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_scaled_dot_kkt.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_scaled_dot_kkt.py", + "sha256": "7ae41df3755acc7e925a134d848f78bb5fc00b90069039d86403c5853323ea42" + }, + "vllm/third_party/flash_linear_attention/ops/cumsum.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/cumsum.py", + "sha256": "d818215669b451868823202ac0bcea77e7a9d75957254c7c1060a73a55dc39b6" + }, + "vllm/third_party/flash_linear_attention/ops/fused_gdn_prefill_post_conv.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_gdn_prefill_post_conv.py", + "sha256": "590717b2107abc90d72548de06b5d315229eb2775c94614f3f545df11cc2b5df" + }, + "vllm/third_party/flash_linear_attention/ops/fused_norm_gate.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_norm_gate.py", + "sha256": "e6eb90467f29d8a0a04f2a364d20a2c3191b6ab857841bfb82076b33a6022d1a" + }, + "vllm/third_party/flash_linear_attention/ops/fused_recurrent.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_recurrent.py", + "sha256": "fe6f1311014809040497aa0a623e7fa97f4b3457cdc7ee1f1f8aed21f326f755" + }, + "vllm/third_party/flash_linear_attention/ops/fused_sigmoid_gating.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_sigmoid_gating.py", + "sha256": "000ab8996af9788fdb8843a6a3b91833e7a14c8acc0e1ea073a536330f64cb6f" + }, + "vllm/third_party/flash_linear_attention/ops/index.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/index.py", + "sha256": "a4f8b2c052635cb519a80099e8a85411d1d5d6880b38f466788259bbe66b154d" + }, + "vllm/third_party/flash_linear_attention/ops/kda.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/kda.py", + "sha256": "e1f31aaa89b91f8e5db6d070b229e2c81c7206e8caec67de41db97d06be0c476" + }, + "vllm/third_party/flash_linear_attention/ops/l2norm.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/l2norm.py", + "sha256": "520f4513ef4fc97e6b88dc07877cca8e29da0d34e44673fe989e3af002d86381" + }, + "vllm/third_party/flash_linear_attention/ops/layernorm_guard.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/layernorm_guard.py", + "sha256": "42af29be26e8fc94a4658e053c095fcdab9ffdc1bc2446a01e787deda2a298c0" + }, + "vllm/third_party/flash_linear_attention/ops/op.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/op.py", + "sha256": "456da84fd12411cf53c96a90dd4f78f49afb454c3d51d2c524ea8e7106fe8ae5" + }, + "vllm/third_party/flash_linear_attention/ops/solve_tril.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/solve_tril.py", + "sha256": "d1a4ff27623a938825052500afa7e2aa24fadd2fa4c9be6376c9128824f86f82" + }, + "vllm/third_party/flash_linear_attention/ops/utils.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/utils.py", + "sha256": "d6c90d36505e02086954c23ca4dd2fea82a69416d68ff1d0501e16b3148b5b0c" + }, + "vllm/third_party/flash_linear_attention/ops/wy_fast.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/wy_fast.py", + "sha256": "c9fc8259db0a8746dc04f1d799cb73333457118cf89a0bdce8dde8a80a28cd96" + }, + "vllm/v1/attention/__init__.py": { + "path": "/vllm/v1/attention/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backend.py": { + "path": "/vllm/v1/attention/backend.py", + "sha256": "01ac364372afa75fdb22486aa3a9c7cf9aebb742e3471dfb9e0f9d9d36b734bc" + }, + "vllm/v1/attention/backends/__init__.py": { + "path": "/vllm/v1/attention/backends/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backends/b12x.py": { + "path": "/vllm/v1/attention/backends/b12x.py", + "sha256": "443f0a98738fdfefe5b9ab151d278bfd43a8ac807eb2b0b9b2a13d51922afbf9" + }, + "vllm/v1/attention/backends/composite.py": { + "path": "/vllm/v1/attention/backends/composite.py", + "sha256": "4cf3d66dca891562709eed4f50aa14b0ae6c8240d9ea86504a3304b2f356cce0" + }, + "vllm/v1/attention/backends/cpu_attn.py": { + "path": "/vllm/v1/attention/backends/cpu_attn.py", + "sha256": "76fb02a6bd725125565d84bf04f627cf16da5f7ff8f31f87c01ed6a1439398c7" + }, + "vllm/v1/attention/backends/fa_utils.py": { + "path": "/vllm/v1/attention/backends/fa_utils.py", + "sha256": "08fa6e231d3af3a71a6e59162dd12328aa8beb28548165ae58f130a92adb5a83" + }, + "vllm/v1/attention/backends/flash_attn.py": { + "path": "/vllm/v1/attention/backends/flash_attn.py", + "sha256": "b170a4789e18104c1bee35bea70df51abe6766693d8f4726a59f2e6f5c4282aa" + }, + "vllm/v1/attention/backends/flash_attn_diffkv.py": { + "path": "/vllm/v1/attention/backends/flash_attn_diffkv.py", + "sha256": "e4627c88c3ba8caee260540e994cc8137fd2ff7cd7813356b36387c6c88ce30a" + }, + "vllm/v1/attention/backends/flashinfer.py": { + "path": "/vllm/v1/attention/backends/flashinfer.py", + "sha256": "8ee541fde43ed92a417b3f01ea1e6fc64af8ab2eb54cbfc28308a49aaca4ed7f" + }, + "vllm/v1/attention/backends/flex_attention.py": { + "path": "/vllm/v1/attention/backends/flex_attention.py", + "sha256": "ad07f0ad73aeeadc3534b3a05c14f88a62cb3638874239ae9823c49b36276dc3" + }, + "vllm/v1/attention/backends/gdn_attn.py": { + "path": "/vllm/v1/attention/backends/gdn_attn.py", + "sha256": "3831019404a92200a38b43571c040cffeb6638bbdc71e4cb5e680dbc6c93d054" + }, + "vllm/v1/attention/backends/hpc_attn.py": { + "path": "/vllm/v1/attention/backends/hpc_attn.py", + "sha256": "af9e2aec1b498f0ee48a2dce3cf5646edf1976466980b2fd927c0e82b875427c" + }, + "vllm/v1/attention/backends/linear_attn.py": { + "path": "/vllm/v1/attention/backends/linear_attn.py", + "sha256": "bc42144fcd027434c6a10dc9f4c5f991db8899d387af5f6485402ce097eb0513" + }, + "vllm/v1/attention/backends/mamba1_attn.py": { + "path": "/vllm/v1/attention/backends/mamba1_attn.py", + "sha256": "32159dae11cab3c8c576b9514ad97d5108c8d1b4cac9fcfe345ec6a76223aee7" + }, + "vllm/v1/attention/backends/mamba2_attn.py": { + "path": "/vllm/v1/attention/backends/mamba2_attn.py", + "sha256": "a5bcdecb7b9547137023e1c77a386003358fa940eaf5f319ed142211dcdba139" + }, + "vllm/v1/attention/backends/mamba_attn.py": { + "path": "/vllm/v1/attention/backends/mamba_attn.py", + "sha256": "5e7b2c4058fc5e6096d001bff6c789b78368b025bbe4600f191aaca2ff59b59f" + }, + "vllm/v1/attention/backends/mla/__init__.py": { + "path": "/vllm/v1/attention/backends/mla/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backends/mla/aiter_triton_mla.py": { + "path": "/vllm/v1/attention/backends/mla/aiter_triton_mla.py", + "sha256": "ed0e285cdae06a019150c41cc958b3c0b5ceb0e4f299d5318d1c90e2c2395390" + }, + "vllm/v1/attention/backends/mla/amx_mla.py": { + "path": "/vllm/v1/attention/backends/mla/amx_mla.py", + "sha256": "7f5cddec30b2dfe22ccdbd3b9da673c879719bf6da4074317bd60add55f5d15f" + }, + "vllm/v1/attention/backends/mla/compressor_utils.py": { + "path": "/vllm/v1/attention/backends/mla/compressor_utils.py", + "sha256": "3589e94105368ea285c40b82db1a0332682ff5d071fe363627cf4c0d10f3facf" + }, + "vllm/v1/attention/backends/mla/cpu_mla.py": { + "path": "/vllm/v1/attention/backends/mla/cpu_mla.py", + "sha256": "ff2110b9f78e92adf6bab294465cbc294ae1ff71cb1780fed158179e134a4ca6" + }, + "vllm/v1/attention/backends/mla/cutlass_mla.py": { + "path": "/vllm/v1/attention/backends/mla/cutlass_mla.py", + "sha256": "211d298680f9bd793cc468281b316d6633c5f4eb6dcec71d3329b034a23ab9b5" + }, + "vllm/v1/attention/backends/mla/flashattn_mla.py": { + "path": "/vllm/v1/attention/backends/mla/flashattn_mla.py", + "sha256": "ac89e0ad75a37e92566d264bafe324735a80f9ab4709241a4454d17b3d38bb63" + }, + "vllm/v1/attention/backends/mla/flashattn_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashattn_mla_sparse.py", + "sha256": "67dd3ead2e8b9d8cda0825ecc93779cb7d670628bc741c759a7d3cd5d474030f" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla.py", + "sha256": "0c24ff016fb6b0bb41d9e7484b6f1af42f37bcc384ed613473fc3e01ad25f664" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse.py", + "sha256": "2116d965b2067134d8afa5878d4d16c0149b061258f50c4106d993aa13b073cc" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm120.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm120.py", + "sha256": "102ca08793d567f95598eefeb34c3f6ec50b3b9d704f162d1402b97b12b5777b" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm90.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm90.py", + "sha256": "df9fe4970aa3f53cf24784b8534b89e0101a2ca20a35a2ebbc9a12a4463d5993" + }, + "vllm/v1/attention/backends/mla/flashmla.py": { + "path": "/vllm/v1/attention/backends/mla/flashmla.py", + "sha256": "c9d8046a853ecbdeff9ebfc738f5bb34c4f272b278231a09a0fbf73708c7c188" + }, + "vllm/v1/attention/backends/mla/flashmla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashmla_sparse.py", + "sha256": "7a379c717adb9667ce94cbc16c0e3a1fb22a169713db6d7941c141fa84077b3f" + }, + "vllm/v1/attention/backends/mla/index_group.py": { + "path": "/vllm/v1/attention/backends/mla/index_group.py", + "sha256": "c24e028c3c160a9bb92e043da5b5b34c805e84745b7c4b8da6fb8702a0ddd641" + }, + "vllm/v1/attention/backends/mla/indexer.py": { + "path": "/vllm/v1/attention/backends/mla/indexer.py", + "sha256": "2acbc1c4fa57c3424ad95e6ecbe76eb7141747773c3e867ce704f4adccba892a" + }, + "vllm/v1/attention/backends/mla/prefill/__init__.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/__init__.py", + "sha256": "903630eb705dd175bf4ae4558a4bcaa07c110056b6a11eb830fdd2fb21b3c48a" + }, + "vllm/v1/attention/backends/mla/prefill/aiter_flash_attn.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/aiter_flash_attn.py", + "sha256": "571b8a9910c4ea3fefda60659026f3bf0d7b542c34553c8c9a4d43bb82077e61" + }, + "vllm/v1/attention/backends/mla/prefill/base.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/base.py", + "sha256": "138bf3ddaf5a94c3cdbc4e08ac676edcae84b32fc76625e546f3b47f7d8b82ec" + }, + "vllm/v1/attention/backends/mla/prefill/cpu_sdpa.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/cpu_sdpa.py", + "sha256": "1bb686395274a8ec0d9fd7327410a527655fe060cbbc263eab138fea988d96de" + }, + "vllm/v1/attention/backends/mla/prefill/flash_attn.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/flash_attn.py", + "sha256": "5e648c82c82e5f81fe11458eb82b9f90b50fc06df2ade3bf111ee6b7a2ee8481" + }, + "vllm/v1/attention/backends/mla/prefill/flashinfer.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/flashinfer.py", + "sha256": "63861219c35b8abc0ebe01e1f51543c5ed40bd46119ca261d927da7c6826b49b" + }, + "vllm/v1/attention/backends/mla/prefill/registry.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/registry.py", + "sha256": "c8c30b92213d594beaa3cab4d5003da26a85870dbb11d1ab73191962d0645b53" + }, + "vllm/v1/attention/backends/mla/prefill/selector.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/selector.py", + "sha256": "101d9fca7924b0c5d7891a17fe8942611bd6759e32b03a571dc87b14c1430f2f" + }, + "vllm/v1/attention/backends/mla/prefill/tokenspeed_mla.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/tokenspeed_mla.py", + "sha256": "047cf07bfcc83db3b11a6a54ffe189f6146e6ec9ad33ce2fa7d18860bf4210f0" + }, + "vllm/v1/attention/backends/mla/prefill/trtllm_ragged.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/trtllm_ragged.py", + "sha256": "9e13ea6f6a25accedd918c0de64bbb812ccb20ffb95350ab018a6e76d493789b" + }, + "vllm/v1/attention/backends/mla/rocm_aiter_mla.py": { + "path": "/vllm/v1/attention/backends/mla/rocm_aiter_mla.py", + "sha256": "b489f5830c655bfb6299801a70d69b9821513c69568ecab3689db5a7be867be5" + }, + "vllm/v1/attention/backends/mla/rocm_aiter_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/rocm_aiter_mla_sparse.py", + "sha256": "91b1d9b3d860a9720bc01b8ebe9bbe8649a7d6bca20d4b63939bc100309bca19" + }, + "vllm/v1/attention/backends/mla/sparse_swa.py": { + "path": "/vllm/v1/attention/backends/mla/sparse_swa.py", + "sha256": "a47853ad8a3fe40f24704592581ea323a18041b84610df010a5534da634e311e" + }, + "vllm/v1/attention/backends/mla/sparse_utils.py": { + "path": "/vllm/v1/attention/backends/mla/sparse_utils.py", + "sha256": "c3cdf060288c05542243a9fe8b5ad3a963ad75e9ce399009b5e45c1235a88ce4" + }, + "vllm/v1/attention/backends/mla/tokenspeed_mla.py": { + "path": "/vllm/v1/attention/backends/mla/tokenspeed_mla.py", + "sha256": "b9ba523c606430cecb99a88b28c53d98a99dcf5e76105a80664338110a20f1ad" + }, + "vllm/v1/attention/backends/mla/triton_mla.py": { + "path": "/vllm/v1/attention/backends/mla/triton_mla.py", + "sha256": "21b16b3b34470edcc33d0423e560837c1d37d4bab31c7b3b9cfd7faa47864b51" + }, + "vllm/v1/attention/backends/mla/xpu_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/xpu_mla_sparse.py", + "sha256": "559c6240fe466521a6b2df4c94aea02ddf3f5efa5ba6954fa180c5a51c0f12d2" + }, + "vllm/v1/attention/backends/recoverssm_metadata.py": { + "path": "/vllm/v1/attention/backends/recoverssm_metadata.py", + "sha256": "02896a667db0f0308371ceb50048b18e5866c0235d163c0357e9a05dcedb3394" + }, + "vllm/v1/attention/backends/registry.py": { + "path": "/vllm/v1/attention/backends/registry.py", + "sha256": "378e8ee78734bd8c8adbe287d4c0a4058dcbb553195a09fbcce00a3cc30adc29" + }, + "vllm/v1/attention/backends/rocm_aiter_fa.py": { + "path": "/vllm/v1/attention/backends/rocm_aiter_fa.py", + "sha256": "d1418af03bf58209c850f466b712d3ea22a14ebb758c42dd43e65738281841fd" + }, + "vllm/v1/attention/backends/rocm_aiter_unified_attn.py": { + "path": "/vllm/v1/attention/backends/rocm_aiter_unified_attn.py", + "sha256": "59d2645eb4c91dc0567754a7163d066f4f2faf48f1957b254fcdd5604e9d8c8c" + }, + "vllm/v1/attention/backends/rocm_attn.py": { + "path": "/vllm/v1/attention/backends/rocm_attn.py", + "sha256": "4a8f57067073fbceb784af6c3467487c450d00fa3957928fadb99a79f6036292" + }, + "vllm/v1/attention/backends/short_conv_attn.py": { + "path": "/vllm/v1/attention/backends/short_conv_attn.py", + "sha256": "84fc460ef2fbd09743b069bec0c14b39542af6c2254a403e37a048427e151121" + }, + "vllm/v1/attention/backends/triton_attn.py": { + "path": "/vllm/v1/attention/backends/triton_attn.py", + "sha256": "1057663d110e1d5229495a799027b27277c1eca325d5b6780fa2259afbf58a1a" + }, + "vllm/v1/attention/backends/triton_attn_diffkv.py": { + "path": "/vllm/v1/attention/backends/triton_attn_diffkv.py", + "sha256": "de0357eae005246642140f1ab8842ba5ed8bff5c84b18a6d3a7bbf409c578301" + }, + "vllm/v1/attention/backends/triton_flash_attn.py": { + "path": "/vllm/v1/attention/backends/triton_flash_attn.py", + "sha256": "176e45329aeb28a2008362bb607d1b8c89816eb665859ab908b0385a11acf1c2" + }, + "vllm/v1/attention/backends/triton_flashinfer.py": { + "path": "/vllm/v1/attention/backends/triton_flashinfer.py", + "sha256": "48d5f967e388d4e8d6bbec8d827b44d855346bc2fada28adf65768bf6623527b" + }, + "vllm/v1/attention/backends/turboquant_attn.py": { + "path": "/vllm/v1/attention/backends/turboquant_attn.py", + "sha256": "616d16d608d9d1fbf6c29548037e7e9cf330f4d36a01aa3ffabf42a731eb6e2b" + }, + "vllm/v1/attention/backends/utils.py": { + "path": "/vllm/v1/attention/backends/utils.py", + "sha256": "fbc221360d2d54cb21ef3f625dc8711500de345a355801548b4337bb9b8abee0" + }, + "vllm/v1/attention/ops/__init__.py": { + "path": "/vllm/v1/attention/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/ops/chunked_prefill_paged_decode.py": { + "path": "/vllm/v1/attention/ops/chunked_prefill_paged_decode.py", + "sha256": "973db848a790b2e8d99e728b2fc4f44b501bbe58c62747244ddff04cfcf11a85" + }, + "vllm/v1/attention/ops/common.py": { + "path": "/vllm/v1/attention/ops/common.py", + "sha256": "b4b67e7fc0cce471e337d742c097fba06da7563816e8799e27719714e31e1d5b" + }, + "vllm/v1/attention/ops/cp_common.py": { + "path": "/vllm/v1/attention/ops/cp_common.py", + "sha256": "2369181862e96db64b14ef20c5c2e249ed2ea5f3dea2467a2aa388372bb86d9d" + }, + "vllm/v1/attention/ops/dcp.py": { + "path": "/vllm/v1/attention/ops/dcp.py", + "sha256": "a478bdc781460f0582cfaf74d6431f1a826c201f02f39d882d12a96139bc3f28" + }, + "vllm/v1/attention/ops/flashmla.py": { + "path": "/vllm/v1/attention/ops/flashmla.py", + "sha256": "8a40d6e120e3ab25a95fcfeb32b0b5b4c1ea02b984633866628536dcd26ed2e8" + }, + "vllm/v1/attention/ops/flydsl_kernels/__init__.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/attention/ops/flydsl_kernels/tq_decode.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/tq_decode.py", + "sha256": "cc4b7f82897596e0974b3d3a710a1a8bc58c3d22b72cc7f461dd1c4acd2e451b" + }, + "vllm/v1/attention/ops/flydsl_kernels/tq_decode_gqa6.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/tq_decode_gqa6.py", + "sha256": "a983f6d375c325900955e11696dab1e2665770e83f84d51f93d3ed5e1d8880e0" + }, + "vllm/v1/attention/ops/flydsl_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/flydsl_turboquant_decode.py", + "sha256": "7b1dd0ef7c7fb28a6a8831759e00b939ab844d067657155cc11cf75532a22c63" + }, + "vllm/v1/attention/ops/int4_per_token_head.py": { + "path": "/vllm/v1/attention/ops/int4_per_token_head.py", + "sha256": "d91968f280cd8eaed7570ab255f0276b40e833e18a25066d371d9ca8149425f2" + }, + "vllm/v1/attention/ops/merge_attn_states.py": { + "path": "/vllm/v1/attention/ops/merge_attn_states.py", + "sha256": "ad08403d2843fc892f0b0b4b9f5fabb81884556f89f7170dca46ccef498a3539" + }, + "vllm/v1/attention/ops/metadata.py": { + "path": "/vllm/v1/attention/ops/metadata.py", + "sha256": "ca882b84c5aaefb1f77e4d8ea09a00103fbc53defa8671bba036c961c17fc760" + }, + "vllm/v1/attention/ops/paged_attn.py": { + "path": "/vllm/v1/attention/ops/paged_attn.py", + "sha256": "016a95f892ec751c86b37be1e12171bad9f0b4076bbf2219ff336f4e9c503653" + }, + "vllm/v1/attention/ops/pcp.py": { + "path": "/vllm/v1/attention/ops/pcp.py", + "sha256": "dadeff95fe2df2be8028baabeef01b0d2d628cd67de2176915e737ce096de3dd" + }, + "vllm/v1/attention/ops/prefix_prefill.py": { + "path": "/vllm/v1/attention/ops/prefix_prefill.py", + "sha256": "b08ad92db715fc03c11699de3de463d55e411f42f77548e06b41049a61de692f" + }, + "vllm/v1/attention/ops/rocm_aiter_mla_merge.py": { + "path": "/vllm/v1/attention/ops/rocm_aiter_mla_merge.py", + "sha256": "564c66e4877732e48a6f7d52405c43dc952eec0f0ae4353d34886bca056132b9" + }, + "vllm/v1/attention/ops/rocm_aiter_mla_sparse.py": { + "path": "/vllm/v1/attention/ops/rocm_aiter_mla_sparse.py", + "sha256": "feec664be5045fd1ba13b8f6ef83b52c96910ddc78baca0431bcf610c9e8f5cc" + }, + "vllm/v1/attention/ops/triton_attention_helpers.py": { + "path": "/vllm/v1/attention/ops/triton_attention_helpers.py", + "sha256": "35aa993d01345f535d2641cf9dcabb8b64c51b20a19707bc5987e616aaa87ddd" + }, + "vllm/v1/attention/ops/triton_decode_attention.py": { + "path": "/vllm/v1/attention/ops/triton_decode_attention.py", + "sha256": "b9823c65eba22d76abf64dad7d7d16a950f67471c86d6cb5b3e983aaf14381ac" + }, + "vllm/v1/attention/ops/triton_merge_attn_states.py": { + "path": "/vllm/v1/attention/ops/triton_merge_attn_states.py", + "sha256": "f63229162181ab93198550b73a115f1cc1034cfd60e6f58bc8ab3e22a6e8ce60" + }, + "vllm/v1/attention/ops/triton_prefill_attention.py": { + "path": "/vllm/v1/attention/ops/triton_prefill_attention.py", + "sha256": "352c1a4ac86146580040579fb217c2e288268830d6602b735713e154f36d74fe" + }, + "vllm/v1/attention/ops/triton_reshape_and_cache_flash.py": { + "path": "/vllm/v1/attention/ops/triton_reshape_and_cache_flash.py", + "sha256": "6cac51475b8c656992a21b2d150acd3a16a95a7ab7d49aab151a3ef13c24b80d" + }, + "vllm/v1/attention/ops/triton_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/triton_turboquant_decode.py", + "sha256": "8e52678136449e4bbca2195fbcbb87426c955a2b1b8422e7ab9511e45ee5f5c6" + }, + "vllm/v1/attention/ops/triton_turboquant_store.py": { + "path": "/vllm/v1/attention/ops/triton_turboquant_store.py", + "sha256": "6e6e2fe74a307d40f0be786ccbaea76d989e3c7b5985f3144a5218c61bf6d902" + }, + "vllm/v1/attention/ops/triton_unified_attention.py": { + "path": "/vllm/v1/attention/ops/triton_unified_attention.py", + "sha256": "65d0fbcf33d00789df8ca688c0a1c908e710cfaef53471178747ecae11f05829" + }, + "vllm/v1/attention/ops/triton_unified_attention_diffkv.py": { + "path": "/vllm/v1/attention/ops/triton_unified_attention_diffkv.py", + "sha256": "7fa36d7b7441f1c396e0348eac61d691d2e459e5c4c393c4aa262dfb670e68f7" + }, + "vllm/v1/attention/ops/turboquant_soa/__init__.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/__init__.py", + "sha256": "6b43b6fcb2a71c44ceff4ed1edd417a839f4901251ba15831b09ad979baa4984" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode.py", + "sha256": "bf00634191bba14cbf4a23c1d67dc3dcb244c2b8989f08362757b54435830986" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode_v2.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode_v2.py", + "sha256": "28e7ecc15c450d3591983a50c46a03aa6ca6fa99304c17c333940617d9916485" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_store.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_store.py", + "sha256": "dccf93b9fdd34f9b9eacd468e9de35b9d93378594487c335cf50642aaec681f2" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_unified_attention.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_unified_attention.py", + "sha256": "b4b2b5f3985b3a6126fd052e6ec1ed91c610da8a525a9ae7470ac829405bd85c" + }, + "vllm/v1/attention/ops/vit_attn_wrappers.py": { + "path": "/vllm/v1/attention/ops/vit_attn_wrappers.py", + "sha256": "a99d57b58269c7521fa5d7d47af06551f3bab2b5c7358ef78165a7f6e20a92a6" + }, + "vllm/v1/attention/ops/xpu_mla_sparse.py": { + "path": "/vllm/v1/attention/ops/xpu_mla_sparse.py", + "sha256": "d98d17110577c2b7b4d05e07bfdae15faf83321b6342a5daaaecce45b9503f38" + }, + "vllm/v1/attention/selector.py": { + "path": "/vllm/v1/attention/selector.py", + "sha256": "87f653ded7974875183c920e3e4589c28116bcbc99714d1da7cb51ae77c0b182" + }, + "vllm/v1/core/sched/__init__.py": { + "path": "/vllm/v1/core/sched/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/core/sched/async_scheduler.py": { + "path": "/vllm/v1/core/sched/async_scheduler.py", + "sha256": "e586a0ef3c6778be56a93e7f9bb712d4de9de6e7d7fe7e3e1d51dae83ecfc508" + }, + "vllm/v1/core/sched/interface.py": { + "path": "/vllm/v1/core/sched/interface.py", + "sha256": "be6c008664096c5660a8879de72b315bbe479bf1d688be9b25891063ec53a367" + }, + "vllm/v1/core/sched/output.py": { + "path": "/vllm/v1/core/sched/output.py", + "sha256": "3a66c8efaefe10c572f6f33cf1f8aa4610758c945130cad62eb9f7331005677c" + }, + "vllm/v1/core/sched/request_queue.py": { + "path": "/vllm/v1/core/sched/request_queue.py", + "sha256": "4b8d938e5fb8152fe61030b8aa991f983fcac9a405c37ed8908045e05e82ae5e" + }, + "vllm/v1/core/sched/scheduler.py": { + "path": "/vllm/v1/core/sched/scheduler.py", + "sha256": "c1db45f3bbad3a875dd8638331b8870c4380ac1ab4734265ba5c863833a82884" + }, + "vllm/v1/core/sched/utils.py": { + "path": "/vllm/v1/core/sched/utils.py", + "sha256": "1ed988044eb8028c77ede875bd1a5fd05ff6998b455d61e3997d6a3d7fc1c3a7" + }, + "vllm/v1/sample/__init__.py": { + "path": "/vllm/v1/sample/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/sample/logits_processor/__init__.py": { + "path": "/vllm/v1/sample/logits_processor/__init__.py", + "sha256": "1f9b02dae8cf6d44484638037123d3a2dec6b7b9a2bcc9afceef1a9bf3eaedec" + }, + "vllm/v1/sample/logits_processor/builtin.py": { + "path": "/vllm/v1/sample/logits_processor/builtin.py", + "sha256": "6105816ece77e5b1dbee0d07abc90ce039d650bac2ddb85c93280c48b00f2ebe" + }, + "vllm/v1/sample/logits_processor/interface.py": { + "path": "/vllm/v1/sample/logits_processor/interface.py", + "sha256": "171dfc6ef9b5b53128e8eaecc4bdf1de413a706d64bf5be686048f583c66eee1" + }, + "vllm/v1/sample/logits_processor/state.py": { + "path": "/vllm/v1/sample/logits_processor/state.py", + "sha256": "a96411f14362c45f839e181dcb3ac01d5b880812bccb3552fc17863b219f44ac" + }, + "vllm/v1/sample/metadata.py": { + "path": "/vllm/v1/sample/metadata.py", + "sha256": "6582cfe1a240c7ddb975f0ef6dd7dcd28dcf0fc7670394390250013977aa7ffd" + }, + "vllm/v1/sample/ops/__init__.py": { + "path": "/vllm/v1/sample/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/sample/ops/bad_words.py": { + "path": "/vllm/v1/sample/ops/bad_words.py", + "sha256": "0b1d0a9b13b92ddcae2c83393c07a34c0f107813725700dee794caa7fe7f3b12" + }, + "vllm/v1/sample/ops/logprobs.py": { + "path": "/vllm/v1/sample/ops/logprobs.py", + "sha256": "b286f69012a6758bfe9250038b0697294dbffe0d32c6906f284c39f75ee48be3" + }, + "vllm/v1/sample/ops/penalties.py": { + "path": "/vllm/v1/sample/ops/penalties.py", + "sha256": "4debfcf247b3887478d2b9ec98f108756bbed2805462777ef6b56f3bdf4ce682" + }, + "vllm/v1/sample/ops/topk_topp_sampler.py": { + "path": "/vllm/v1/sample/ops/topk_topp_sampler.py", + "sha256": "13ea4359832bc914492330958ec4f5ac140f408b8f410cc05c6eaf7ddcd70be4" + }, + "vllm/v1/sample/ops/topk_topp_triton.py": { + "path": "/vllm/v1/sample/ops/topk_topp_triton.py", + "sha256": "0b5fc337058e22bc28a8530ccec904d6ccd89b9548b02955c657ac429b1669d2" + }, + "vllm/v1/sample/rejection_sampler.py": { + "path": "/vllm/v1/sample/rejection_sampler.py", + "sha256": "0bb9d224887ccb1355e16199005cc23a4afc6fa75156eca419851b7247d99750" + }, + "vllm/v1/sample/sampler.py": { + "path": "/vllm/v1/sample/sampler.py", + "sha256": "f95805b2c6d06218c724826aa5f881a606e8d0a534a566aee7c85948520dd216" + }, + "vllm/v1/sample/thinking_budget_state.py": { + "path": "/vllm/v1/sample/thinking_budget_state.py", + "sha256": "962f8f55210eb0a431cb9c78b013e35f7a7dd58d06d6fb2e7fcff1b457356f8e" + }, + "vllm/v1/worker/__init__.py": { + "path": "/vllm/v1/worker/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/block_table.py": { + "path": "/vllm/v1/worker/block_table.py", + "sha256": "a09b8819e1417b7a186cf3472224e2138fc5d41a291c6692bb7df711b0c44259" + }, + "vllm/v1/worker/cp_utils.py": { + "path": "/vllm/v1/worker/cp_utils.py", + "sha256": "e32625d83a641b8dd8df82e92d1b6fb20af0cdf2e8fbd2fb131aa3c215415448" + }, + "vllm/v1/worker/cpu/__init__.py": { + "path": "/vllm/v1/worker/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/cpu/buffer_utils.py": { + "path": "/vllm/v1/worker/cpu/buffer_utils.py", + "sha256": "e7313fd8c2c76ebfb98d2fa53008bc9691d0f83a7d7c05e87602b5a29fb79e04" + }, + "vllm/v1/worker/cpu/model_runner.py": { + "path": "/vllm/v1/worker/cpu/model_runner.py", + "sha256": "24a1c916550051327dd5893243a6d4200f3824b91b3af8aa6f6c793fd7c68c3e" + }, + "vllm/v1/worker/cpu/shm.py": { + "path": "/vllm/v1/worker/cpu/shm.py", + "sha256": "08491af8ad341399d1375f2d21ad00414d4c89b0a5c03f55de8704914bbfcbd9" + }, + "vllm/v1/worker/cpu_model_runner.py": { + "path": "/vllm/v1/worker/cpu_model_runner.py", + "sha256": "92111aba92f00571f1a3c4c6e43cf1da6ccb4d2afac2f4d5abc018a4a6e7e8bd" + }, + "vllm/v1/worker/cpu_worker.py": { + "path": "/vllm/v1/worker/cpu_worker.py", + "sha256": "a8051b9e510ef0af9cc34004f2cbe5c0f902bd0cebc32c9464e744344dfdf849" + }, + "vllm/v1/worker/dp_utils.py": { + "path": "/vllm/v1/worker/dp_utils.py", + "sha256": "8cd19f1bfbc5c4f6ec60df89aea7c8a19b400ebc264f372b103014152e92158c" + }, + "vllm/v1/worker/ec_connector_model_runner_mixin.py": { + "path": "/vllm/v1/worker/ec_connector_model_runner_mixin.py", + "sha256": "fe9b11cebb8562f1bfe98b98a5647b2b081a6e424cb60d4ffe2412c91a99215e" + }, + "vllm/v1/worker/encoder_cudagraph.py": { + "path": "/vllm/v1/worker/encoder_cudagraph.py", + "sha256": "6a08d3779bca1b47dbf9daf6eafe2d3c70dbcb8aeb7d63ba7efacc68241ee3bc" + }, + "vllm/v1/worker/encoder_cudagraph_defs.py": { + "path": "/vllm/v1/worker/encoder_cudagraph_defs.py", + "sha256": "bb7be050fcaa8868e7816c84caec875da57050d65fe7eaf00f3d41473df25e3a" + }, + "vllm/v1/worker/gpu/__init__.py": { + "path": "/vllm/v1/worker/gpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/async_utils.py": { + "path": "/vllm/v1/worker/gpu/async_utils.py", + "sha256": "77e17a4570ead2be30ae9b00888cf077a3b873018c12ca0549b853bfda02c1ba" + }, + "vllm/v1/worker/gpu/attn_utils.py": { + "path": "/vllm/v1/worker/gpu/attn_utils.py", + "sha256": "b9b81e59dda2720b1f9c434471381f879228832443e52756e469b4ad4905888f" + }, + "vllm/v1/worker/gpu/block_table.py": { + "path": "/vllm/v1/worker/gpu/block_table.py", + "sha256": "61c004315d5af7e7eae4e2a9e6be92ea82c520327690a7f55a73bb9ce95f520a" + }, + "vllm/v1/worker/gpu/buffer_utils.py": { + "path": "/vllm/v1/worker/gpu/buffer_utils.py", + "sha256": "6597f701a30261bf250e9ad5a29737264624a1caa20527aeea0dad630325b093" + }, + "vllm/v1/worker/gpu/cp_utils.py": { + "path": "/vllm/v1/worker/gpu/cp_utils.py", + "sha256": "456c1bb7e262d99ff555522a4f134e5a9b42aee23290be25455eaef36ee8eaaf" + }, + "vllm/v1/worker/gpu/cudagraph_utils.py": { + "path": "/vllm/v1/worker/gpu/cudagraph_utils.py", + "sha256": "6e9c042890603535e300a40df8ee159dbed1058a64a83ae50ff0329e332e05ff" + }, + "vllm/v1/worker/gpu/dp_utils.py": { + "path": "/vllm/v1/worker/gpu/dp_utils.py", + "sha256": "e26867bc89e6bfc933cabc5ed13e5dc7b8d2d3030118ca1ca64c8785dabc0fc1" + }, + "vllm/v1/worker/gpu/ec_connector.py": { + "path": "/vllm/v1/worker/gpu/ec_connector.py", + "sha256": "2afe6e641f4ae3eb3b8da336c74eaa7479bf617b27cfb39a1fcbe487686f0a08" + }, + "vllm/v1/worker/gpu/eplb_utils.py": { + "path": "/vllm/v1/worker/gpu/eplb_utils.py", + "sha256": "1829fac11464aed4649179b302df198de51b95d0589f4e56bea305a876a63e26" + }, + "vllm/v1/worker/gpu/input_batch.py": { + "path": "/vllm/v1/worker/gpu/input_batch.py", + "sha256": "d5dd956eb319bd69dd9e762047833d81ad40b21fce619fcb2133759e73620694" + }, + "vllm/v1/worker/gpu/kv_connector.py": { + "path": "/vllm/v1/worker/gpu/kv_connector.py", + "sha256": "b89a4333f1e552d86e1815674b59e9f1335f0f49c0a7b46082439076f62c6a81" + }, + "vllm/v1/worker/gpu/lora_utils.py": { + "path": "/vllm/v1/worker/gpu/lora_utils.py", + "sha256": "1e90eddd9ddb4ca55e574bb28e87ae3a6f6750175a62d373102426543f4ccd66" + }, + "vllm/v1/worker/gpu/metrics/__init__.py": { + "path": "/vllm/v1/worker/gpu/metrics/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/metrics/logits.py": { + "path": "/vllm/v1/worker/gpu/metrics/logits.py", + "sha256": "ea058d7510a077a55f8ac7e4c3d596508346244e908cb372865d7159f62edc89" + }, + "vllm/v1/worker/gpu/mm/__init__.py": { + "path": "/vllm/v1/worker/gpu/mm/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/mm/encoder_cache.py": { + "path": "/vllm/v1/worker/gpu/mm/encoder_cache.py", + "sha256": "89c500338fddbeee7c4fca978a3a7c4c566a03e848e399d303fbee3c80631cd2" + }, + "vllm/v1/worker/gpu/mm/encoder_runner.py": { + "path": "/vllm/v1/worker/gpu/mm/encoder_runner.py", + "sha256": "0981e352d70301b7154a217a48665ffe35f215d053ec5740c2515a3e1e11b4e6" + }, + "vllm/v1/worker/gpu/mm/lora.py": { + "path": "/vllm/v1/worker/gpu/mm/lora.py", + "sha256": "a3eddfad6ad64de276964240c28dc080888df4a56dd5eac18f89428f2cbb7a01" + }, + "vllm/v1/worker/gpu/mm/rope.py": { + "path": "/vllm/v1/worker/gpu/mm/rope.py", + "sha256": "0924375bcb367267e783b57dd2ad9de1189d97025ce4313baaa54f2911eaaf1e" + }, + "vllm/v1/worker/gpu/model_runner.py": { + "path": "/vllm/v1/worker/gpu/model_runner.py", + "sha256": "174c93db921c23cf0396eee4764be25b2bd2d4b6a06e9fa41ce3598b884ce8ce" + }, + "vllm/v1/worker/gpu/model_states/__init__.py": { + "path": "/vllm/v1/worker/gpu/model_states/__init__.py", + "sha256": "07815d0b788fc88185772f581bbf892a675259f9288375571f29887622f8d93c" + }, + "vllm/v1/worker/gpu/model_states/default.py": { + "path": "/vllm/v1/worker/gpu/model_states/default.py", + "sha256": "bb614f814780f052e869f9acf31dfbfa68718ee7dc6252eefa901b5730ee8a2a" + }, + "vllm/v1/worker/gpu/model_states/encoder_decoder.py": { + "path": "/vllm/v1/worker/gpu/model_states/encoder_decoder.py", + "sha256": "a5868059d8af672548b41d0e623e884320e6ed61e6aaca2d2828ff5be0356f2f" + }, + "vllm/v1/worker/gpu/model_states/encoder_only.py": { + "path": "/vllm/v1/worker/gpu/model_states/encoder_only.py", + "sha256": "84e96b55a2639e2a73fa4a0308acc89c8d053dc715481180b237e0196dcef99f" + }, + "vllm/v1/worker/gpu/model_states/interface.py": { + "path": "/vllm/v1/worker/gpu/model_states/interface.py", + "sha256": "5675b6fedc7403a9ab410b1e5565974e78fac23c42ab4253ae1da52d6e09b594" + }, + "vllm/v1/worker/gpu/model_states/mamba_hybrid.py": { + "path": "/vllm/v1/worker/gpu/model_states/mamba_hybrid.py", + "sha256": "573e130ac5587d4822fabf97adad1ad0fda02ff83c5e70df879a5bb175ae845c" + }, + "vllm/v1/worker/gpu/model_states/mm_pruning.py": { + "path": "/vllm/v1/worker/gpu/model_states/mm_pruning.py", + "sha256": "b150940b12ae76048f050a8eeb54d532bbdc530a18ffbf320ddeeb0cfaa90f93" + }, + "vllm/v1/worker/gpu/model_states/prompt_embeds.py": { + "path": "/vllm/v1/worker/gpu/model_states/prompt_embeds.py", + "sha256": "11f9e270925c2df6a505557605ac2b859bb145cf3420b0111e7482a1c544f9b1" + }, + "vllm/v1/worker/gpu/model_states/recoverssm.py": { + "path": "/vllm/v1/worker/gpu/model_states/recoverssm.py", + "sha256": "b4b660e62eaf33f4fe8271f83ed1fb6de6bc08f800a8073b27803e42fb29a645" + }, + "vllm/v1/worker/gpu/pcp_manager.py": { + "path": "/vllm/v1/worker/gpu/pcp_manager.py", + "sha256": "2d80df0ed5b18a2069f9d0689cb59923ffe324ba200fcafe242da23da3a6ddaa" + }, + "vllm/v1/worker/gpu/pool/__init__.py": { + "path": "/vllm/v1/worker/gpu/pool/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/pool/pooling_runner.py": { + "path": "/vllm/v1/worker/gpu/pool/pooling_runner.py", + "sha256": "f8463f7648cce0f3f29418a4d9fee61634ead760957cf236d06d61cf8cd986e7" + }, + "vllm/v1/worker/gpu/pp_utils.py": { + "path": "/vllm/v1/worker/gpu/pp_utils.py", + "sha256": "dadeef0bebf61d0ad44a28d06372208ec4e6389224d6017f412683b026bdbb5c" + }, + "vllm/v1/worker/gpu/sample/__init__.py": { + "path": "/vllm/v1/worker/gpu/sample/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/sample/bad_words.py": { + "path": "/vllm/v1/worker/gpu/sample/bad_words.py", + "sha256": "8d3cbd5613398260314d94739d8ee0e1ac0c22abf2f960f541d3c0d4e39d360b" + }, + "vllm/v1/worker/gpu/sample/batch_shard.py": { + "path": "/vllm/v1/worker/gpu/sample/batch_shard.py", + "sha256": "c30274a3a04e6a03e89be9cd7c62de602b1aba4d412f64540ab6201036de3928" + }, + "vllm/v1/worker/gpu/sample/gumbel.py": { + "path": "/vllm/v1/worker/gpu/sample/gumbel.py", + "sha256": "3ec1df510bdad13e8b0a457b5b67c98affdf6e57369e56cb471246cc8f40dd34" + }, + "vllm/v1/worker/gpu/sample/logit_bias.py": { + "path": "/vllm/v1/worker/gpu/sample/logit_bias.py", + "sha256": "9e80a3fe6f3c7474723408cfff52183f4585fdeedd9c2312843ee98d0b12724c" + }, + "vllm/v1/worker/gpu/sample/logprob.py": { + "path": "/vllm/v1/worker/gpu/sample/logprob.py", + "sha256": "f47479a818192acb6b297c79fa67a3b2f9820e3492a394d5adda777e9b7c832e" + }, + "vllm/v1/worker/gpu/sample/min_p.py": { + "path": "/vllm/v1/worker/gpu/sample/min_p.py", + "sha256": "4cb5e2f45e1ced6f9685283a7a5c8cfd7204d9a249822e866cfff756c7f04f62" + }, + "vllm/v1/worker/gpu/sample/output.py": { + "path": "/vllm/v1/worker/gpu/sample/output.py", + "sha256": "d6e298c0f197d487a8faaf7200f500fa83df1d7a4bbf4339cadd6a18008f7f9c" + }, + "vllm/v1/worker/gpu/sample/penalties.py": { + "path": "/vllm/v1/worker/gpu/sample/penalties.py", + "sha256": "46c29434caf5f415129ef4a9bb2b8d4f62d2765596e3e07f73ad2b198c7def1b" + }, + "vllm/v1/worker/gpu/sample/prompt_logprob.py": { + "path": "/vllm/v1/worker/gpu/sample/prompt_logprob.py", + "sha256": "4cf22d390e7bf59e44c458cff7180268db63e95d06af2f1e14d720a2d77c9663" + }, + "vllm/v1/worker/gpu/sample/sampler.py": { + "path": "/vllm/v1/worker/gpu/sample/sampler.py", + "sha256": "832c9945d201a1e730ff9b4b52076aa83bd4a5064e1e4cfea952cf84d4a8d1f0" + }, + "vllm/v1/worker/gpu/sample/states.py": { + "path": "/vllm/v1/worker/gpu/sample/states.py", + "sha256": "4e3671f93695ba5a48fad7d2d13beb231ac8741034904ed5a15d9f7b9b86662e" + }, + "vllm/v1/worker/gpu/sample/thinking_budget.py": { + "path": "/vllm/v1/worker/gpu/sample/thinking_budget.py", + "sha256": "020513e1d3406f367de6ad995a95055008fd0c28f2873647e8283c9870e22404" + }, + "vllm/v1/worker/gpu/sample/trace_replay.py": { + "path": "/vllm/v1/worker/gpu/sample/trace_replay.py", + "sha256": "d2a7d3b3b55379efabe4740a4b7f14030126dc11be36f6ea974164ce42316a50" + }, + "vllm/v1/worker/gpu/sample/watermark.py": { + "path": "/vllm/v1/worker/gpu/sample/watermark.py", + "sha256": "a3581458169dab9153eb09fd67218e0ee5585406537a9de80ad528ae62b030c0" + }, + "vllm/v1/worker/gpu/shutdown.py": { + "path": "/vllm/v1/worker/gpu/shutdown.py", + "sha256": "bb470f14b17c7e52571ef8938b2a9527e7c2846852ae8a3a94b69cd1c30aa4b1" + }, + "vllm/v1/worker/gpu/spec_decode/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/__init__.py", + "sha256": "1f1f84bfe6f4f5af3a7e21a7a8716ecf7b9013da1d03327668a3ee36afc24c32" + }, + "vllm/v1/worker/gpu/spec_decode/acceptance_estimator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/acceptance_estimator.py", + "sha256": "505b843bdd75928b03793b395b47b8be914bd7fe2a3351c8ec04339baeebb1c2" + }, + "vllm/v1/worker/gpu/spec_decode/adaptive_verification.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/adaptive_verification.py", + "sha256": "276b2fec56758a94c71b717f6786b8a6f126db2e20cf964350202feee61a0a39" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py", + "sha256": "13392ef0a9ed59eb9c2b2bad43d7c61beb212a8805849e46b5130c230275d0a5" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/speculator.py", + "sha256": "5b97f54e20ddf65b98e939832d050745f67ef43cfa145786da300f1a8322e3c6" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/cudagraph.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/cudagraph.py", + "sha256": "beab567ae2df6a2ba2cd92fe7ee452c6b959b8a7037a4b5f493993a1824619bb" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/speculator.py", + "sha256": "f9c100f42f9326e48eb84e89281897e859ba761943f54d593523555ccd98dc63" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/utils.py", + "sha256": "53d2c3ad474d290d2c6df027446bbd80ac7447684e5242ab2c3c5337d2abd383" + }, + "vllm/v1/worker/gpu/spec_decode/dflash2/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash2/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/dflash2/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash2/speculator.py", + "sha256": "b70043550938a1df9aecc85d8c8224c38c929ca34f68834572f6e723854d2027" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/speculator.py", + "sha256": "dcf4abdedbd2bddd0d76be198ccf5b4e467c46f645038c35fcab821491a35b03" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/utils.py", + "sha256": "86af2bf30604a184312e8f076097b91ecfec704f409f9d68d634b03d6b318070" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/eagle3_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/eagle3_utils.py", + "sha256": "201ee875fcc3d076a8fc1f3876dcbf85736b221a368555243a8987ff26a1674e" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/speculator.py", + "sha256": "746e318a4f266d75522ff7f3731ea9b4527b7b4824f71364d1a62184ea1f7b3d" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/utils.py", + "sha256": "94de6f55a1761f24f4aa1388cbc3b3763d4ab3ee53260330056ad31ce0b78236" + }, + "vllm/v1/worker/gpu/spec_decode/extract_hidden_states.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/extract_hidden_states.py", + "sha256": "93c4233be7b2d2290b33902ea9b3bb5274c11701830851d03967a22144536e2d" + }, + "vllm/v1/worker/gpu/spec_decode/gemma4/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/gemma4/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/gemma4/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/gemma4/speculator.py", + "sha256": "9991210d7babd2caf2cd10797ca8688543dedeafbc3b86bc7c979c1a6ae9f949" + }, + "vllm/v1/worker/gpu/spec_decode/mtp/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/mtp/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/mtp/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/mtp/speculator.py", + "sha256": "926d6c9ffdb368c971647911a60493820d056ce236fcae9d94a42fa2e006255d" + }, + "vllm/v1/worker/gpu/spec_decode/multi_module_mtp/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/multi_module_mtp/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/multi_module_mtp/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/multi_module_mtp/speculator.py", + "sha256": "d9d4735b9b33829332b0e845b6d3073b2f0436045ed693b25c6434f351644127" + }, + "vllm/v1/worker/gpu/spec_decode/rejection_sampler.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/rejection_sampler.py", + "sha256": "030db5bfca162cc1f305112f299de5d6d61c59d3ed0807fee46575441ca4086d" + }, + "vllm/v1/worker/gpu/spec_decode/rejection_sampler_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/rejection_sampler_utils.py", + "sha256": "214b61fa0abe88573beb779872c035b3954e5651a85bd438d99ee5905d3a62ec" + }, + "vllm/v1/worker/gpu/spec_decode/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/speculator.py", + "sha256": "3a1ab15bf8b20918852eb835fe9755046e99dcbac6ba6ca3d414949fc8bc695a" + }, + "vllm/v1/worker/gpu/spec_decode/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/utils.py", + "sha256": "282f2929eddae9ca7312269f799be07472334b6df9fd91878b5e839ec05e418c" + }, + "vllm/v1/worker/gpu/states.py": { + "path": "/vllm/v1/worker/gpu/states.py", + "sha256": "99418f5df43ca612ded72609fee011620b065b2cab2f249ccb387096bf4ae71a" + }, + "vllm/v1/worker/gpu/structured_outputs.py": { + "path": "/vllm/v1/worker/gpu/structured_outputs.py", + "sha256": "18a10532db7e66b55e334acacd1fd989ad6361adf31dd0de9a9a65e23db25951" + }, + "vllm/v1/worker/gpu/ubatch_utils.py": { + "path": "/vllm/v1/worker/gpu/ubatch_utils.py", + "sha256": "5092e2e58af0561c8dc12e62847cfc6dda9ca20dfbd33e7f0cd77a83fe87f7c5" + }, + "vllm/v1/worker/gpu/warmup.py": { + "path": "/vllm/v1/worker/gpu/warmup.py", + "sha256": "423ac32d58fe008c228cfa223e4fcebfcf87e3463a9dbdf80a083c0578d73723" + }, + "vllm/v1/worker/gpu_input_batch.py": { + "path": "/vllm/v1/worker/gpu_input_batch.py", + "sha256": "18cf455c9d0eea61cc581c7932f2e6cd09786914e82dd35eef1c1430da359a0f" + }, + "vllm/v1/worker/gpu_model_runner.py": { + "path": "/vllm/v1/worker/gpu_model_runner.py", + "sha256": "87c29d08c0bbf66993d8b984811e7325e35e6436242a773feb55ec88f16b2c51" + }, + "vllm/v1/worker/gpu_ubatch_wrapper.py": { + "path": "/vllm/v1/worker/gpu_ubatch_wrapper.py", + "sha256": "4233cfbe8c9884b042c4363890108f616483b694ebe9a6e69578dcf89c6dac5c" + }, + "vllm/v1/worker/gpu_worker.py": { + "path": "/vllm/v1/worker/gpu_worker.py", + "sha256": "6994436e4547c0996ab555b3e814e8ccea26b650dfc1b378b97d640745309347" + }, + "vllm/v1/worker/kv_connector_model_runner_mixin.py": { + "path": "/vllm/v1/worker/kv_connector_model_runner_mixin.py", + "sha256": "e1cc76d065a7e60aacddb190ae795a480b65cd02ba71a1fc699a02a85c1a3de2" + }, + "vllm/v1/worker/lora_model_runner_mixin.py": { + "path": "/vllm/v1/worker/lora_model_runner_mixin.py", + "sha256": "fef6092a15d8d37f6fa22495e6106e2e5280180908d61ce43d9ff5bf4eef3f2f" + }, + "vllm/v1/worker/mamba_utils.py": { + "path": "/vllm/v1/worker/mamba_utils.py", + "sha256": "23fdaa4e8f63ee8f938eaa1a2b39f803cb04fa6ecd69789563254b1a0691413a" + }, + "vllm/v1/worker/mm_encoder_model_runner.py": { + "path": "/vllm/v1/worker/mm_encoder_model_runner.py", + "sha256": "780c41be84ad022205c21c1decb6bb8d5afb03bc7be120c1f7df03b710acc3d7" + }, + "vllm/v1/worker/sentinel/__init__.py": { + "path": "/vllm/v1/worker/sentinel/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/sentinel/gpu_worker_sentinel.py": { + "path": "/vllm/v1/worker/sentinel/gpu_worker_sentinel.py", + "sha256": "3959b8619d052c5dd247815074e03ec21ec9b43cc424ff2d296abc19b227b852" + }, + "vllm/v1/worker/startup_plan.py": { + "path": "/vllm/v1/worker/startup_plan.py", + "sha256": "84bcbb4f7a9fd7c8d10c9c895aadd9673d44c767b9132368d11eb5e017afe86b" + }, + "vllm/v1/worker/ubatch_utils.py": { + "path": "/vllm/v1/worker/ubatch_utils.py", + "sha256": "b34dce551b5195c414e6a3a997c75961cc7a17f24c7c980487fe3d3e2ba7a798" + }, + "vllm/v1/worker/ubatching.py": { + "path": "/vllm/v1/worker/ubatching.py", + "sha256": "40391241c564feb5f16c77898ae6ae152ed6e71a4682e2a406387785d8de02d7" + }, + "vllm/v1/worker/utils.py": { + "path": "/vllm/v1/worker/utils.py", + "sha256": "0ca3ec6bf4d20076145b7fe64e564962adebedc8f75a856b517ba0b2f2d77acf" + }, + "vllm/v1/worker/worker_base.py": { + "path": "/vllm/v1/worker/worker_base.py", + "sha256": "4a1a5266b912fe97991d8dc89d92b923990da9f6cb4b817d00d52e9c0d26dd7c" + }, + "vllm/v1/worker/workspace.py": { + "path": "/vllm/v1/worker/workspace.py", + "sha256": "d21c08167d1d0d1c0cddaa80453a53a0b4dec5d81b5a537c94a21324344976b3" + }, + "vllm/v1/worker/xpu_model_runner.py": { + "path": "/vllm/v1/worker/xpu_model_runner.py", + "sha256": "07fa0390d28f2b8c3c3c0019eb9c3b126e2397aea268ba47c889f06b423deb23" + }, + "vllm/v1/worker/xpu_worker.py": { + "path": "/vllm/v1/worker/xpu_worker.py", + "sha256": "711b56432506b58041cd86e71320c3960413f7bd61061990b66488421d81cfc3" + } + }, + "prefix": "", + "pth": { + "/__editable__.megatron_core-0.16.0rc0.pth": "d55c9b64480b34aae3d4d31e7706b93391c969dec6e0498e50963b03445a57b0", + "/__editable__.rl_kernel-0.1.0.pth": "1454c4987b35762a0d189d4e901c5d077fde62a1944fbaabecea230e57f3923a", + "/__editable__.vime-0.3.2.pth": "77eec5d06d628cb952e65edd813ca88d8db67ccc785083e1b7b29011b92bec4f", + "/distutils-precedence.pth": "2638ce9e2500e572a5e0de7faed6661eb569d1b696fcba07b0dd223da5f5d224", + "/qwen3_next_cuda_runtime.pth": "e0d3ab57dd3ff4f5d55fcf76e83c549cc00b3c813e6f717c540d5ded79fa2f49", + "/qwen3_next_megatron_source.pth": "8556ac057538e82856cb76cbbc954f58312a3f45373daec3eec826031cfd2709", + "/__editable__.rl_kernel-0.1.0.pth": "1454c4987b35762a0d189d4e901c5d077fde62a1944fbaabecea230e57f3923a", + "/distutils-precedence.pth": "2638ce9e2500e572a5e0de7faed6661eb569d1b696fcba07b0dd223da5f5d224", + "/nvidia_cutlass_dsl_packages.pth": "cc710b99ddb3d76361a70461461d274212a979d00c381d821fce5bb3ad9cf246" + }, + "pyvenv_cfg_sha256": "48579f2c6d35c3d535c2690d7d426587c4b8e92021463f0266b38d35dfbbb834", + "sources": { + "/Megatron-LM-training": { + "patch_sha256": "f66035f12501aa1d08e8884e0dea5a22d59825d717aeda73c3e83876e3efd79f", + "path": "/Megatron-LM-training", + "tree": "731fc44a368d6cac8c6171a29d5c687ff0d95bd1" + }, + "/vime": { + "patch_sha256": "66949839d4c18329444f4f9f6dcd702b53ce1b94e9aa15ed111f28743bfaa4b9", + "path": "/vime", + "tree": "f5174e67dbcdaef983eecd45f215fef2d8429dd0" + } + }, + "version": "3.12.14 | packaged by Anaconda, Inc. | (main, Aug 27 2026, 14:46:43) [GCC 14.3.0]" + }, + "sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca" + }, + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "cuda_identity": { + "home": "", + "nvcc_sha256": "b8e2347d9d7fcadf8812a27324d515de99d033d3e48611811ece7e66d7895f8a" + }, + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "operator_requirements": { + "suite": "all", + "case_ids": [ + "tests/check_qwen3_next_attention.py::test_d256_backward_with_cached_prefix_matches_float64_formula", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[1024]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[256]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[64]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[8]", + "tests/check_qwen3_next_attention.py::test_d256_input_device_guard_and_nondefault_stream", + "tests/check_qwen3_next_attention.py::test_native_backward_rejects_malformed_probability_and_gradient_buffers", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[0]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[2]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_target_inputs_do_not_depend_on_companions", + "tests/check_qwen3_next_batch_invariance.py::test_triton_chunked_prefill_is_batch_invariant", + "tests/check_qwen3_next_conv_bridge.py::test_chunked_and_reordered_sequences_match", + "tests/check_qwen3_next_conv_bridge.py::test_empty_sequence_preserves_cache_and_gradients", + "tests/check_qwen3_next_conv_bridge.py::test_response_gradient_reaches_prompt_and_convolution_weight", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths0]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths1]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths2]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-4]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[1]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[4]", + "tests/check_qwen3_next_core_matrix.py::test_variable_lengths_empty_and_mixed_step_match_independent_sequences", + "tests/check_qwen3_next_forward.py::test_combine_has_fixed_route_order_and_differentiable_weights", + "tests/check_qwen3_next_forward.py::test_full_vocabulary_logprob_entropy_modes_and_gradient", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_fail_closed_on_the_tensor_descriptor_path", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[128]", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[512]", + "tests/check_qwen3_next_forward.py::test_logprob_nan_rejected_before_comparison", + "tests/check_qwen3_next_forward.py::test_moe_vjp_matches_independent_double_formula", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[1024-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[128-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-16]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-256]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-3072]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-37984]", + "tests/check_qwen3_next_forward.py::test_qwen_moe_actual_tp4_shapes_and_independent_training_forward", + "tests/check_qwen3_next_forward.py::test_route_weights_are_batch_invariant", + "tests/check_qwen3_next_forward.py::test_shared_linear_vjp_and_empty_tokens", + "tests/check_qwen3_next_forward.py::test_stable_route_tie_boundary_and_router_gradient", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_backward_matches_recomputed_recurrence_vjp", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_forward_is_provider_exact_and_does_not_mutate_inputs", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_keeps_prompt_state_gradient_through_response", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[False]", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[True]", + "tests/check_qwen3_next_gdn_bridge.py::test_initial_state_vjp_matches_provider_directional_difference", + "tests/check_qwen3_next_gdn_sequence.py::test_1024_token_chunk_continuation_is_bitwise_exact", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad0]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad1]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad2]", + "tests/check_qwen3_next_gdn_sequence.py::test_chunk_boundary_retains_prompt_and_initial_state_gradients", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths0]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths1]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths2]", + "tests/check_qwen3_next_gdn_sequence.py::test_reserved_and_duplicate_slots_are_rejected", + "tests/check_qwen3_next_norm_providers.py::test_custom_op_has_distinct_native_and_cuda_paths", + "tests/check_qwen3_next_norm_providers.py::test_gdn_decode_provider_env_defaults_are_recorded", + "tests/check_qwen3_next_norm_providers.py::test_our_gated_op_is_batch_invariant", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_cuda]", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_native]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots0]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots2]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots3]", + "tests/check_qwen3_next_shared_core.py::test_independent_training_forward_matches_inference_and_retains_gradients", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[1024]", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[8]", + "tests/check_qwen3_next_shared_core.py::test_unimplemented_provider_profile_is_rejected", + "tests/test_qwen3_next_norm.py::test_bad_weight_shape_raises", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[16]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[1]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[2]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[32]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[48]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[64]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[8]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[128]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[2048]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_with_padding", + "tests/test_qwen3_next_norm.py::test_call_matches_forward", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[128]", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[2048]", + "tests/test_qwen3_next_norm.py::test_cuda_default_offset_preserves_plain_convention", + "tests/test_qwen3_next_norm.py::test_cuda_gated_backward_matches_autograd_golden", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_matches_golden_within_contract", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_bad_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_mismatched_gate", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_backward_uses_the_sigmoid_derivative", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_swish_is_an_alias_for_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_unit_weight_is_plain_norm_times_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_weight_offset_is_applied_in_fp32", + "tests/test_qwen3_next_norm.py::test_cuda_gated_wrapper_rejects_equal_numel_wrong_shape", + "tests/test_qwen3_next_norm.py::test_cuda_gated_zero_gate_zeroes_output", + "tests/test_qwen3_next_norm.py::test_cuda_offset_equals_explicit_fp32_weight", + "tests/test_qwen3_next_norm.py::test_cuda_offset_is_not_folded_through_bfloat16", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_backward_is_offset_aware", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_within_tolerance_of_golden", + "tests/test_qwen3_next_norm.py::test_deterministic_repeat", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype0]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype1]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype2]", + "tests/test_qwen3_next_norm.py::test_eps_inside_sqrt", + "tests/test_qwen3_next_norm.py::test_gated_batch_invariance_slice", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedHFOp]", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedOp]", + "tests/test_qwen3_next_norm.py::test_gated_conventions_diverge_in_low_precision", + "tests/test_qwen3_next_norm.py::test_gated_cuda_op_rejects_bad_activation_at_construction", + "tests/test_qwen3_next_norm.py::test_gated_extension_handles_empty_batch_and_nondefault_stream", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[dy_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[gate_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[rstd_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_shape]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_matches_hf_formula_fp32", + "tests/test_qwen3_next_norm.py::test_gated_shape_mismatch_raises", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_strict_matches_vllm_formula_fp32", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[128]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[2048]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_offset_applied_in_fp32_not_folded_into_bf16", + "tests/test_qwen3_next_norm.py::test_op_batch_invariance_on_device", + "tests/test_qwen3_next_norm.py::test_plain_reference_is_unchanged_by_the_offset_plumbing", + "tests/test_qwen3_next_norm.py::test_weight_offset_is_one", + "tests/test_qwen3_next_norm.py::test_zero_centred_cuda_constructor_rejects_missing_extension", + "tests/test_qwen3_next_norm.py::test_zero_centred_op_inherits_the_plain_reference", + "tests/test_qwen3_next_norm.py::test_zero_weight_is_identity_scaling" + ], + "case_ids_sha256": "694c931b65f9cfa5db963f2eca6d11bd309546c824a1df52f9da2ab128e83e0f", + "norm_gates": [ + "qwen3_next_rms_norm-forward.json", + "qwen3_next_rms_norm-gradient.json", + "rms_norm_gated-forward.json", + "rms_norm_gated-gradient.json" + ] + }, + "layer_requirements": { + "schema_version": 1, + "gates": { + "gdn": { + "script": "scripts/qwen3_next_tp_gdn_check.py", + "output_option": "--output", + "scope": "tp4_gdn_layer0", + "groups": { + "cases": [ + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "prompt-gradient", + "replicated-norm-gradient", + "hf-load-export" + ] + }, + "script_sha256": "cc4338893f90af004c51c20fc67d1a9a3f4bf8d26775277f72671c02983e4df5" + }, + "attention": { + "script": "scripts/qwen3_next_tp_attention_check.py", + "output_option": "--output", + "scope": "tp4_full_attention_layer3", + "groups": { + "attention.cases": [ + "hf-load-export", + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "batch4-varlen-reorder", + "sixteen-token-decode", + "prompt-gradient", + "kv-pair-gradient", + "qk-norm-gradient" + ] + }, + "script_sha256": "d27d43efb05415a8ef5892c3c2238a2b9744a4821f5466faf46c6510e6e01bec" + }, + "moe": { + "script": "scripts/qwen3_next_tp_moe_check.py", + "output_option": "--output", + "scope": "tp4_moe_block_layer0", + "groups": { + "moe.cases": [ + "hf-load-export-all512experts", + "routes-replicated-8", + "full-chunk-reorder-8", + "routes-replicated-64", + "full-chunk-reorder-64", + "routes-replicated-256", + "full-chunk-reorder-256", + "routes-replicated-1024", + "full-chunk-reorder-1024", + "training-forward", + "all-parameter-gradient", + "replicated-router-gradient" + ] + }, + "script_sha256": "d5c1bbbb82e408b65871b0cb1638d7a6cf8cfe07f0a3315a657b7dc232d544be" + }, + "adapters": { + "script": "scripts/qwen3_next_adapter_check.py", + "output_option": "--out", + "scope": "gdn_engine_adapter_component", + "groups": { + "cases": [ + "batch1-length8", + "batch1-length64", + "batch1-length256", + "batch1-length1024", + "batch4-length8", + "batch4-length64", + "batch4-length256", + "batch4-length1024", + "mixed-prefill-decode16-reorder" + ] + }, + "fields": { + "prompt_gradient": "passed", + "hf_conv_roundtrip": "passed", + "batch_invariance_capability_registered": false + }, + "script_sha256": "3ce45bb317237c1a06533116d65fb77c2a23b6f503ae46406ede543036eb0f20" + }, + "heads": { + "script": "scripts/qwen3_next_tp_head_check.py", + "output_option": "--output", + "scope": "tp4_embedding_lm_head_only", + "groups": { + "cases": [ + "hf-embedding-roundtrip", + "hf-lm-head-roundtrip", + "replicated-norm-gradient", + "nonzero-finite-embedding-head-gradient", + "embedding-repeat-100", + "batch-invariant-prompt8", + "batch-invariant-prompt64", + "batch-invariant-prompt256", + "batch-invariant-prompt1024", + "logprob-original-and-promoted-logits", + "entropy-interface" + ] + }, + "script_sha256": "0504185d21a75405c8e994bc57b016cf4ec357d8b16e7430772c11934f2af876" + } + }, + "scheduler_case_ids": [ + "p0008-b1-full", + "p0008-b1-chunked", + "p0008-b4-full", + "p0008-b4-chunked", + "p0064-b1-full", + "p0064-b1-chunked", + "p0064-b4-full", + "p0064-b4-chunked", + "p0256-b1-full", + "p0256-b1-chunked", + "p0256-b4-full", + "p0256-b4-chunked", + "p1024-b1-full", + "p1024-b1-chunked", + "p1024-b4-full", + "p1024-b4-chunked" + ], + "registry_sha256": "e3949a750cb27c1897a000f3b023f912629906612ae8949c1575d0acc36df5ec", + "case_ids_per_rank": [ + "adapters/cases/batch1-length1024", + "adapters/cases/batch1-length256", + "adapters/cases/batch1-length64", + "adapters/cases/batch1-length8", + "adapters/cases/batch4-length1024", + "adapters/cases/batch4-length256", + "adapters/cases/batch4-length64", + "adapters/cases/batch4-length8", + "adapters/cases/mixed-prefill-decode16-reorder", + "attention/attention.cases/batch4-varlen-reorder", + "attention/attention.cases/full-chunk-1024", + "attention/attention.cases/full-chunk-256", + "attention/attention.cases/full-chunk-64", + "attention/attention.cases/full-chunk-8", + "attention/attention.cases/hf-load-export", + "attention/attention.cases/kv-pair-gradient", + "attention/attention.cases/prompt-gradient", + "attention/attention.cases/qk-norm-gradient", + "attention/attention.cases/sixteen-token-decode", + "gdn/cases/full-chunk-1024", + "gdn/cases/full-chunk-256", + "gdn/cases/full-chunk-64", + "gdn/cases/full-chunk-8", + "gdn/cases/hf-load-export", + "gdn/cases/prompt-gradient", + "gdn/cases/replicated-norm-gradient", + "heads/cases/batch-invariant-prompt1024", + "heads/cases/batch-invariant-prompt256", + "heads/cases/batch-invariant-prompt64", + "heads/cases/batch-invariant-prompt8", + "heads/cases/embedding-repeat-100", + "heads/cases/entropy-interface", + "heads/cases/hf-embedding-roundtrip", + "heads/cases/hf-lm-head-roundtrip", + "heads/cases/logprob-original-and-promoted-logits", + "heads/cases/nonzero-finite-embedding-head-gradient", + "heads/cases/replicated-norm-gradient", + "moe/moe.cases/all-parameter-gradient", + "moe/moe.cases/full-chunk-reorder-1024", + "moe/moe.cases/full-chunk-reorder-256", + "moe/moe.cases/full-chunk-reorder-64", + "moe/moe.cases/full-chunk-reorder-8", + "moe/moe.cases/hf-load-export-all512experts", + "moe/moe.cases/replicated-router-gradient", + "moe/moe.cases/routes-replicated-1024", + "moe/moe.cases/routes-replicated-256", + "moe/moe.cases/routes-replicated-64", + "moe/moe.cases/routes-replicated-8", + "moe/moe.cases/training-forward" + ], + "case_ids_sha256": "be74417dfbd6031ba27978d06d04bb15daaab2aeb57d132c7e0d41176b28b46e" + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "scheduler_profile_certificate": { + "path": "/result.json", + "sha256": "bf3a74423b3636145cad903d5cf9d70f2c3c777b019a24d125c2ca79f8b1e8d9" + } +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/train1/updates.json b/docs/usage/evidence/qwen3-next-chain-b200/train1/updates.json new file mode 100644 index 000000000..52f6ae717 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/train1/updates.json @@ -0,0 +1,685 @@ +{ + "schema_version": 1, + "status": "passed", + "scope": "qwen3_next_training_update1", + "identity": { + "scheduler_profile_certificate": { + "path": "/result.json", + "sha256": "bf3a74423b3636145cad903d5cf9d70f2c3c777b019a24d125c2ca79f8b1e8d9" + }, + "source_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "checkpoint": "", + "weight_version": "baseline", + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "architecture_layers": 48, + "weights_dtype": "bfloat16", + "recurrent_state_dtype": "float32" + }, + "training_identity": { + "scheduler_profile_certificate": { + "path": "/result.json", + "sha256": "bf3a74423b3636145cad903d5cf9d70f2c3c777b019a24d125c2ca79f8b1e8d9" + }, + "source_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "checkpoint": "", + "weight_version": "baseline", + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "architecture_layers": 48, + "weights_dtype": "bfloat16", + "recurrent_state_dtype": "float32", + "run_id": "20261009T041838Z-train1-c67ec144-39e7db9f", + "execution_id": "39e7db9f488142f4b52872e05728c390", + "fixture_sha256": "7c98e4e17cc24bd0c5f65f6515d58a9dfc947afcdb6d4956bd3fa05f24bb28b6" + }, + "phases": [ + "update1" + ], + "l2_fixture_sha256": "b59298acf5ecbe64abb4639e7596e052f1993ee5e3c7289b63738f1b04463d01", + "l2_reports": { + "baseline": { + "path": "/attempts/0/l2-matrix.json", + "sha256": "bf9da6060e882fb3707df9093e63a4c6e6664e8a75f25e9809020c4f687bf953" + }, + "update1": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/l2-matrix.json", + "sha256": "ad78b78687d2ef725a24b42de908033b36383f69db41d2c754f87acb07cd9870" + } + }, + "workers": { + "update1": { + "path": "/attempts/0/update1-2c4f847affb0420d9622f1b699393898/worker.json", + "sha256": "b2c74ebcb2b5e538bbaf5e50439615722f26876df3cd34610ded097ee6102436" + } + }, + "events": [ + "l2:baseline", + "worker:update1", + "l2:update1" + ], + "recovery": [], + "checkpoint": { + "path": "/training-state/checkpoints/step-00000001-69200066749241628829d9734dbdd5f0", + "sha256": "1fecb76a446f6c37199011fe2348b999f843828379d25d1e5bda4c155a5bb074" + }, + "attempt": "0" +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/train2/environment.json b/docs/usage/evidence/qwen3-next-chain-b200/train2/environment.json new file mode 100644 index 000000000..d034669aa --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/train2/environment.json @@ -0,0 +1,4500 @@ +{ + "environment": { + "identity": { + "base_prefix": "/miniconda3/envs/rlkernel", + "binary": "/python3.12", + "binary_sha256": "6a1eb3ffc29f3a6b0ece607b016b4cfa5ca3ac57b34f17ed3266b404f78d2729", + "build_tools": { + "ninja": { + "path": "/miniconda3/envs/rlkernel/bin/ninja", + "sha256": "08639e194fffa7f08b259fc4abfa4803aff66b64de52549cee42ec527d55cea6" + } + }, + "distributions": [ + { + "direct_url": null, + "metadata_sha256": "6f1038270be40f9b8c0bcf391c627e7d7f41ccdd19aa192d6eac1dbfc3b19abc", + "name": "GitPython", + "version": "3.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "3f71971502087521f123c9daa26bc12d31d3466738b567390b8602acad3be22a", + "name": "Jinja2", + "version": "3.1.6" + }, + { + "direct_url": null, + "metadata_sha256": "818fb343b7b6b99a32771bf4813521ae6440b4c7579b3ae46e32dd02da0afeee", + "name": "Markdown", + "version": "3.11" + }, + { + "direct_url": null, + "metadata_sha256": "dc1ee42cf8ecfeee0ab60b15b21d291833e0732548efcb7bb5b3564dca3e5bf7", + "name": "MarkupSafe", + "version": "3.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "de7389b142450a0014234286b0876f328439b823c355c73d0aed41fd67ec208c", + "name": "PyJWT", + "version": "2.15.1" + }, + { + "direct_url": null, + "metadata_sha256": "ffcad4415cafb22b8b536a61595e9ee13438b51d31b0763c1b273ce3bc58e840", + "name": "PyYAML", + "version": "6.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "8562d701cc52d9cafbb418942b0e072fc087ed8ddcf35cd10224c1b2ed8bdd91", + "name": "Pygments", + "version": "2.21.0" + }, + { + "direct_url": null, + "metadata_sha256": "b6c25fcfdcc495edf248a10ca4ad28327ef2ed6047a6ec5c6346e121414c7f21", + "name": "Werkzeug", + "version": "3.1.9" + }, + { + "direct_url": null, + "metadata_sha256": "55c400d24c71b581d9c0992f71df6047cf6c878bebe61a7d45d6e02dc0e4c510", + "name": "absl-py", + "version": "2.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "13db521f90a6a882027b2388eaa2ebf252945f9c2adb7e7e371da18239da4df0", + "name": "accelerate", + "version": "1.15.0" + }, + { + "direct_url": null, + "metadata_sha256": "86fe44e38e67872dd895c729044942ba2c2f934ae439a899fb83a186206b7fd4", + "name": "agent-detector", + "version": "2.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "afe11fe9f5aa54e734cdd51659bed8c89dc6bcd5aef0ad96f2d20149c8de5456", + "name": "aiohappyeyeballs", + "version": "2.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "570b307bc0b53fbbd3ed2ce0b7eca6bbf2fa73bf75e24a480f1034d8c0b832bf", + "name": "aiohttp", + "version": "3.14.3" + }, + { + "direct_url": null, + "metadata_sha256": "44b7f8e14c4770793e747fad50c9e0a6ee7357651d878554f192d94768dc14a8", + "name": "aiohttp-cors", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "648813a44a9ae0ab2f20ee86d2404dcc38e3f9e80c63316cf6e536735df14e54", + "name": "aiosignal", + "version": "1.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "f6a3f6668bacef7f73a2c19ccb2be910b2363d1731c4725cb04364d99e24935a", + "name": "annotated-doc", + "version": "0.0.5" + }, + { + "direct_url": null, + "metadata_sha256": "fc6d752cde6a6a4bff03474386de750e130b75da3c7815ee909f45b51fea98c8", + "name": "annotated-types", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "4e89d670a4b20029da30e5a9e8ebcbc844deff9c44209552bafd5537249c8b9e", + "name": "anthropic", + "version": "1.9.0" + }, + { + "direct_url": null, + "metadata_sha256": "b5a6f00800956387fcddab1fe1b5aa8502c249b86cfb16d58ed700f282f60142", + "name": "antlr4-python3-runtime", + "version": "4.9.3" + }, + { + "direct_url": null, + "metadata_sha256": "a6008defa9492cd08250217b134782cad1db4580e1d7ddf69cc2a2a48cea24e0", + "name": "anyio", + "version": "4.15.1" + }, + { + "direct_url": null, + "metadata_sha256": "7877c64ce8957237363f2df313819bb07f50752df016d14c5a5a99bec10f5deb", + "name": "apache-tvm-ffi", + "version": "0.1.11" + }, + { + "direct_url": null, + "metadata_sha256": "3543ca8f0e072c00ab111b20eba99ce86dbf93ada28988775bc2677284b3c07a", + "name": "astor", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "d4b328c09c024fe1e4d788a9c7715ad726095131b815cd35fd933268226f6269", + "name": "attrs", + "version": "26.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "4850c4d696a5e2a2ecbb3dd792b060acc1de79e09800669b0b9fc3a22c055e6d", + "name": "av", + "version": "19.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "863ff92208d0a02dabfa008bfe91846a5c401ded301e5687dca7dc63c911865f", + "name": "babel", + "version": "2.18.0" + }, + { + "direct_url": null, + "metadata_sha256": "f32e6df3197f05202e586624d95c5e217003d80cee655c165d533102f628df21", + "name": "backrefs", + "version": "8.0" + }, + { + "direct_url": null, + "metadata_sha256": "905c362f655fbc6d37a24686efc2b3bfbd3123b8ee5a443a43f6750d87455e90", + "name": "blake3", + "version": "1.0.10" + }, + { + "direct_url": null, + "metadata_sha256": "07c85682b6aefd5c9b48890d306c1604311902295704892ede48e5a83219a8d3", + "name": "blobfile", + "version": "3.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "2d582941a7081625a35f35a0c4a2e80f7737312e29c38e5fdb6fc08f9c113077", + "name": "bracex", + "version": "3.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "3b60c55bae0d0340c3a3fd918635bbfa3087579da66e0fd7f6be7a3782c0da3d", + "name": "cachetools", + "version": "7.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "5d11a6878d5bc3f22290281a19ef7b36daa95c910780950608b95cd788c7e12e", + "name": "cbor2", + "version": "6.1.4" + }, + { + "direct_url": null, + "metadata_sha256": "362c9942c48051f168ed2b9f2146266b7792d3c05e164cd6afc3f3b65884fdc9", + "name": "certifi", + "version": "2026.7.22" + }, + { + "direct_url": null, + "metadata_sha256": "b4abf1bcf1c1d8e0272d8007fc974499ea59e5f2a5b98af3c78a5e67515a9d87", + "name": "cffi", + "version": "2.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "766120f13c177446f51929a4d201104bc935b6d5a2a176cd6716edce757d3d95", + "name": "cfgv", + "version": "3.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "610e9a9d03ce837ffe6e42be5e02e70087f73863f7350bf7bb7f0511edcc5ec0", + "name": "charset-normalizer", + "version": "3.5.2" + }, + { + "direct_url": null, + "metadata_sha256": "7ad836b3147c9702546d9c28b4fa5be23b24445439db5d0d2a58d17281c84daa", + "name": "click", + "version": "8.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "4c5f00599ebcbf11d337e48a72784d256ca3d704fa9e9f5daadd60065e6776b7", + "name": "cloudpickle", + "version": "3.1.2" + }, + { + "direct_url": null, + "metadata_sha256": "a0970189e3ab7a596d6902d5f61f93b414f138f03d3cf19029145657bfceb382", + "name": "cmake", + "version": "4.1.2" + }, + { + "direct_url": null, + "metadata_sha256": "94a6ebf9718e55f254a43ce0d2f04e0d6d44e7141b6f3144a84feb6519a77bfd", + "name": "colorama", + "version": "0.4.6" + }, + { + "direct_url": null, + "metadata_sha256": "ca8ec227f406d970a645ec482b20619128dd34b9cf71159cc24e27db461a2711", + "name": "colorful", + "version": "0.5.8" + }, + { + "direct_url": null, + "metadata_sha256": "bbaa51b7e4d8f142bd075d01257c0572c0c844796d51426e35c8096a13e8da76", + "name": "compressed-tensors", + "version": "0.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "6063d8ff7ebc458d63a4332853d7ababf4ee2b86336362c8d2b12be6e998eb6b", + "name": "connectrpc", + "version": "0.11.1" + }, + { + "direct_url": null, + "metadata_sha256": "ac5f4b5a5f68080bd9c3fe77399fe8a1bff2ee5923c49db1df544dd054cbf15b", + "name": "cryptography", + "version": "50.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "f41d2f6b4616accca2f5e1dd47aa9e8937c28076cde698226d93e727751f3099", + "name": "cuda-bindings", + "version": "13.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "e5ca6ed34c687c6f4a4d157ad0a2cf06ec0316fe8c4c0ddeb666ad76dd6f30f4", + "name": "cuda-core", + "version": "1.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "89baadd9da23dce9990481519544115615ba3cbd2d1a41e09feea7756fffb378", + "name": "cuda-pathfinder", + "version": "1.8.2" + }, + { + "direct_url": null, + "metadata_sha256": "1ab914b9a57ca601df2e3cfe9608427b15d8afb78029076ace5d1caf9fd45f08", + "name": "cuda-python", + "version": "13.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "73d97a5eb578223b4895ef4f234574d14219cef9999ff7d0e92a3d0dd057bd3f", + "name": "cuda-tile", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "ae6f957fe66ed63081d1d83ee6e8838f3a0af2c6fce1223629d0dd6264565ead", + "name": "cuda-toolkit", + "version": "13.0.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "1f8e0ae51ad5feea63f58ed2e24f3da6f23ed548043235a14f7623d961dd9b64", + "name": "datasets", + "version": "5.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "153f4a4d6ff03dbe5c8ad7fe54bc2e7b989a4947b70f7aa77fbf652b394f2a2e", + "name": "depyf", + "version": "0.20.0" + }, + { + "direct_url": null, + "metadata_sha256": "ee09fc752d7271aac93079cfd63409957dc6b536c1ffd9355a01bf7297e72aa6", + "name": "detect-installer", + "version": "0.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "a7feab2c4f69fd5f85e5a3cb495a7f1870a6bf8199dcee5339e8118f7acbdc09", + "name": "dill", + "version": "0.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "fef3fde661fe30ba7bd1d78841a797136b2b3461705bb4eb92dc54f8308bbaae", + "name": "distlib", + "version": "0.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "fef3fde661fe30ba7bd1d78841a797136b2b3461705bb4eb92dc54f8308bbaae", + "name": "distlib", + "version": "0.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "a3ca2e39abe76c4a33d5fe4a2a84375ec9f25cdfdb7e1d8ea406bd6f1603205c", + "name": "dnspython", + "version": "2.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "92a07daad5e6ff461199de14e845d9b376e309ef916ce5379f3c9cd4e3b1623f", + "name": "dockerfile-parse", + "version": "2.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "5b566b25f0cbe4955d0b16844a7cc6d2002caa3bde2dfda7f301fd8870cbaa56", + "name": "docstring_parser", + "version": "0.18.0" + }, + { + "direct_url": null, + "metadata_sha256": "5a1080b5768c6c591e1c4f9c9812cafa808781b9eeb198043bf185e22d4a1613", + "name": "e2b", + "version": "2.51.0" + }, + { + "direct_url": null, + "metadata_sha256": "0a63979e0b946e16238e4339e60d9c1eb5a7ce3ea93dae78b5da9c65a6190540", + "name": "einops", + "version": "0.8.2" + }, + { + "direct_url": null, + "metadata_sha256": "16cbe67a57558f1d4bfdbc22a454434ba301750c57a62b1d3f5361c9e5cddc00", + "name": "email-validator", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "0617ddb55b90b42ddc9398dc7e91d61fe928a2504939f76526dc15b22d238caa", + "name": "fastapi", + "version": "0.136.3" + }, + { + "direct_url": null, + "metadata_sha256": "ddd82b9666c21988e234d623e2575e1b89fd4133260eeab43fc9a7c074f7024a", + "name": "fastapi-cli", + "version": "0.0.32" + }, + { + "direct_url": null, + "metadata_sha256": "611602e834d42e10433155ff5f5581358d732fa6b6f6f7820a8f79e74b1ce1f9", + "name": "fastapi-cloud-cli", + "version": "0.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "794524e4a9659bda6043721d848d028ea49996085a33326094fbaaa3f6e6b895", + "name": "fastar", + "version": "0.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "711401d36e60e10e35beb4d0f1bb42bf0c4d86339ae52f32b9aa4a4d790530dd", + "name": "fastsafetensors", + "version": "0.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "efaea9742e348c4c4bdcc6f616a33cc5aa3ae926494a72a46690b7da2f08ed5c", + "name": "filelock", + "version": "4.0.7" + }, + { + "direct_url": null, + "metadata_sha256": "99bd6c3f10781d3d2d350f2c3c9fc4765b55f25de8a6d6dd1f71501802d1255e", + "name": "fla-core", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "0a6ef979b75295cee2b5293ad4942b0cf2682e9e38680203064e0b70249c1a96", + "name": "flash-linear-attention", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "76b70a11ca82ea4606b529e7a8658cb3fe71412afa46f2ed57101dd91ba27558", + "name": "flashinfer-python", + "version": "0.6.18.post1" + }, + { + "direct_url": null, + "metadata_sha256": "ba8ff415192b5cbb90efce046e2271a00c8184afc362d8b47fbbc84d5e558b05", + "name": "frozenlist", + "version": "1.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "e7712831c80eb13b08fb7f7cc33988a8f24654af9eba7c6f5f943b2636e4306a", + "name": "fsspec", + "version": "2026.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "025de85c794878d0caa737869307447595f514ebf9599eacb5b1a501bae479b6", + "name": "fsspec", + "version": "2026.9.0" + }, + { + "direct_url": null, + "metadata_sha256": "ca94883bdeaa3740b45b6994443b445fd67c6e4a8064ac3bf9d92d2a5221eee8", + "name": "ghp-import", + "version": "2.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "a7e90983562a035cf767baa63d8c32bc37e1de7cad71ac7b6b2bc70a95bba4eb", + "name": "gitdb", + "version": "4.0.12" + }, + { + "direct_url": null, + "metadata_sha256": "dd96143ec79178bef685c1f5c0a58a87a66d003b421e605de65697308321d518", + "name": "google-api-core", + "version": "2.40.0" + }, + { + "direct_url": null, + "metadata_sha256": "0735d57088a83df2355e16843107fb0112abe2178fc5bb8132947a7ad962aa41", + "name": "google-auth", + "version": "2.59.1" + }, + { + "direct_url": null, + "metadata_sha256": "2f3aa9d9500d329560440e6a5a152e420aad5f5bbb23701f45b740be721784a1", + "name": "googleapis-common-protos", + "version": "1.75.5" + }, + { + "direct_url": null, + "metadata_sha256": "06d74ab04fdc03fad368868907f0d10e7d9f397aab58d58965c0b78ffaec34cc", + "name": "griffelib", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "7ee1c179e2c68a62968308b2f96f4f3469176ee3ac8bdb494ac80188d4d41271", + "name": "grpcio", + "version": "1.84.0" + }, + { + "direct_url": null, + "metadata_sha256": "04cf3a4a91575850f386f4fcfdedd8e7fbfba08feff038fbc1296d1e854db2dd", + "name": "h11", + "version": "0.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "b954a6ba4739c0cc878bb8ea27ea7c7154a48bb4b7c06dba9e9cf880cf0ec930", + "name": "h2", + "version": "4.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "6f0d7bf86e75d0bda1ceccc82367c0145ad0ec522c4d4f51bb454f467faadcc9", + "name": "hf-xet", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "f991b847550cf8225f69562902b5ccb591b2ce9a08fe07ef6e6d701bdb4694a7", + "name": "hpack", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "314d194165c4700034c1c67cee847d549a6d7091374c71f2cef0186ec56a3eb9", + "name": "httpcore", + "version": "1.0.9" + }, + { + "direct_url": null, + "metadata_sha256": "aed9767360bed1bcbda71e3b1a3c996603f86558bc77a1693ee3d09973d20cad", + "name": "httpcore2", + "version": "2.13.1" + }, + { + "direct_url": null, + "metadata_sha256": "8fa3bf3510c35e2eea9f523a1cace7120079cf51d76c4acea97de95806aaa14a", + "name": "httptools", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "3bf4804c215d111b6a4702cf9000021ab39807d1ed3207dd011b14b2843b2d14", + "name": "httpx", + "version": "0.28.1" + }, + { + "direct_url": null, + "metadata_sha256": "d11dd50813b8914bd9455e8b2b591171cd2b1618883943153afadc8bb9224678", + "name": "httpx2", + "version": "2.13.1" + }, + { + "direct_url": null, + "metadata_sha256": "43b119c34ad2b2aacc032a1a6a8feb142fdb5ca407a3519325d74dd53d8904df", + "name": "huggingface_hub", + "version": "1.33.0" + }, + { + "direct_url": null, + "metadata_sha256": "9ce850d5a6b775e5ef4a335f907e579a878e058213121b6eec567781ea68c585", + "name": "humming-kernels", + "version": "0.1.12" + }, + { + "direct_url": null, + "metadata_sha256": "67aa4f6717d82446a51ce350e7c4769eba0c4a22d2f428255cddd9d24b11a914", + "name": "hyperframe", + "version": "6.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd9511ede42f63b995c3f71944f908cb8f014048b63ecc1c8d420525a3354b59", + "name": "identify", + "version": "2.6.20" + }, + { + "direct_url": null, + "metadata_sha256": "af3c3a62bb5d82d6a43454684e0b1dedde27a21ea90eacfb1bed9814619f06d0", + "name": "idna", + "version": "3.20" + }, + { + "direct_url": null, + "metadata_sha256": "cf71393f3d079ce2e859384573e65aaacd1709bef700701f629df32398b598f0", + "name": "ijson", + "version": "3.5.1" + }, + { + "direct_url": null, + "metadata_sha256": "9305763e93d03df0e36516b1125fa046a6ebe37d44589e200e0593cf4bdfd980", + "name": "importlib_metadata", + "version": "9.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "32860c3c19b2e91f6cb5bd83400b5870cda051bc74a5a08822c8c666af0990db", + "name": "iniconfig", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "560faabb3d45d779e445a74e7e806a786f95f2200fa06d979603b7f0ee1cfb39", + "name": "instanttensor", + "version": "0.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "f6fc1f0d389e4245fc2a1a0fdfee09422e56200cb6f94659668456997ff4f7a9", + "name": "interegular", + "version": "0.3.3" + }, + { + "direct_url": null, + "metadata_sha256": "d10f300731197a4829b77f0c883bb3cf8a37ae8c76a302e095fa95d6427706d0", + "name": "jiter", + "version": "0.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "5b0c8d4b4c535a2432fb206223d774509b6e20af374c6a4b6f98bf72a7de6702", + "name": "jmespath", + "version": "1.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "6c4032c2e74273452cd77399af2ee85198f49c22da897983f26d2ed6f787c4e8", + "name": "jsonschema", + "version": "4.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "aaa6cd66f423729e8da397c9d533b7d731f6b25f3d6371b9338c36bdb9be74a0", + "name": "jsonschema-specifications", + "version": "2025.9.1" + }, + { + "direct_url": null, + "metadata_sha256": "f7c0687c032593106a2e5a3c241cf8043e7e2c222bddb0022b4cb2bf5de67115", + "name": "lark", + "version": "1.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "4511c6b04efc57a5f5333edc1f5f48b9f5412c3923d4bc19b715bdf47977511c", + "name": "linkify-it-py", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "be929870f6ecae18a819c56118f1101f3076e25ac6a4843ca6f4707ebd1e87c6", + "name": "llguidance", + "version": "1.7.6" + }, + { + "direct_url": null, + "metadata_sha256": "cf2b87669bead3e76ec54207f3354c13f73b50c32fcd13c8d627084b3379139e", + "name": "llvmlite", + "version": "0.47.0" + }, + { + "direct_url": null, + "metadata_sha256": "0a416d79c5543d94d2b18807626293d4f47655d1d22724c7ae296e413078aaba", + "name": "lm-format-enforcer", + "version": "0.11.3" + }, + { + "direct_url": null, + "metadata_sha256": "16bc1f59e34fd2a6633bd395276052eacd2c777b2cf72781e76b203f013a8fac", + "name": "loguru", + "version": "0.7.3" + }, + { + "direct_url": null, + "metadata_sha256": "5216d5acfd039a7b581a826186309594b228d37d2c8d56864124ea666689fe4e", + "name": "lxml", + "version": "6.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "f59d772b35315a928672bfcccfb89d82c0aac672c5275c048f7a93b79015bcea", + "name": "markdown-it-py", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "b137367ef0056711cbf5e53015df9168cab80373104e7899b1c0263a21d9c99c", + "name": "mcp", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "38e0b9edaae09e58cd1461fc961ced22672038a697930bedef153a74befb3de1", + "name": "mcp-types", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "799f49685865fd9cc8915fdb92a33e102eeeffad562b03b4aeffb6f422b771c1", + "name": "mdit-py-plugins", + "version": "0.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "481f9cbe08596c6eaba6343e0efa1b13b2362c30dce0610f7c08523f1d98388d", + "name": "mdurl", + "version": "0.1.2" + }, + { + "direct_url": "{\"dir_info\": {\"editable\": true}, \"url\": \"file:///Megatron-LM-training\"}", + "metadata_sha256": "2876c0c760bbfc93bd7d737bf0db2866a937308a7c1707c3a2bb59d4795986ff", + "name": "megatron-core", + "version": "0.16.0rc0" + }, + { + "direct_url": null, + "metadata_sha256": "a6e34d488c879f57ce042bec38f8864ba3ea7d6ecf0ab757fc88fe8dc0a22f26", + "name": "memray", + "version": "1.20.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd26d80dc9676b1fb8c894355bd525fbe7f49a6a86a555c72e9ec6d927247c33", + "name": "mergedeep", + "version": "1.3.4" + }, + { + "direct_url": null, + "metadata_sha256": "dd1b3b89e88d1c65a26e6e72dd075eabbc220bfb138769ec8b64578ee911795c", + "name": "mistral_common", + "version": "1.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "4859847a9f6321daf8849cf7fd1542ff430db6563a2abf9ac0d62a5b21bd951d", + "name": "mkdocs", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "1729fc31479f2582486cdc85397417659dd3b2fb3f920553de66cfe59d5f0b3e", + "name": "mkdocs-awesome-nav", + "version": "3.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "88b4b7b7c0aba5547befdedaf515c8df4867361daf55ff60b72578464d72dcbe", + "name": "mkdocs-get-deps", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "ad33bb33fb16b1f69689c4682550e97232154e367e2c8c8aee9dad0f10d269ce", + "name": "mkdocs-git-revision-date-localized-plugin", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "ed69fbfb9ac00c10c5a383a12ff9d2b9919ae184e408554434199211643d6040", + "name": "mkdocs-material", + "version": "9.7.7" + }, + { + "direct_url": null, + "metadata_sha256": "d1c549b61701148b97f8246bc924b2840e504b37b0ce7a27e78ddf81261e5363", + "name": "mkdocs-material-extensions", + "version": "1.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "4ad6171f3bf6812e4de90670ff0089d445093d4fe1d05d55f17b96a4a192a816", + "name": "ml_dtypes", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "4ad6171f3bf6812e4de90670ff0089d445093d4fe1d05d55f17b96a4a192a816", + "name": "ml_dtypes", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "b0dbdfa30ab6b1ce637a794899c9e43019182b6d1ab2d07b90f647f7331eba6b", + "name": "model-hosting-container-standards", + "version": "0.1.16" + }, + { + "direct_url": null, + "metadata_sha256": "95424470e481cfa8d18b30963b6de3aafe16614b1ea0414e184a008571dde84f", + "name": "mpmath", + "version": "1.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "eb184d83489401903615ce8a78d98d5b933dec0f7246811d396a529915fe797c", + "name": "msgpack", + "version": "1.2.3" + }, + { + "direct_url": null, + "metadata_sha256": "520006303d6a0e859970b83f7d452196e2e8f6dab08f6dcf1ba5823c1230025f", + "name": "msgspec", + "version": "0.22.0" + }, + { + "direct_url": null, + "metadata_sha256": "010d2fe039006070a711a476b171b7b7da5c29ccad3c4eecd77ef3711b07c2d0", + "name": "multidict", + "version": "6.9.1" + }, + { + "direct_url": null, + "metadata_sha256": "235634cc7ebda45f8a84dfdb1b9b35ac1a77a1888b34650c3a616d23e4a7e93f", + "name": "multiprocess", + "version": "0.70.19" + }, + { + "direct_url": null, + "metadata_sha256": "7c545b4b3e5e83d3fde41352272c10cb9deeaba5b7138fbf24383e952af8822e", + "name": "natsort", + "version": "8.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "311ee8cdaeaf9f11acf51cda9c3b5b191f76ce9d98bc3418164c3189bbc37a08", + "name": "nccl4py", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "66360539217852c3b44b37f409eade7e1559baf018bb363bacb2aa3a9759b203", + "name": "networkx", + "version": "3.7" + }, + { + "direct_url": null, + "metadata_sha256": "e8b0b1746808b87816c47e4531780ded7f246bed9575a89e8b40200aa81e9a13", + "name": "ninja", + "version": "1.13.2" + }, + { + "direct_url": null, + "metadata_sha256": "77c1117f0dbc41560ddc6e6b37b542fb4e88afcd4ef82ec06593e5bbd5f37121", + "name": "nodeenv", + "version": "1.11.0" + }, + { + "direct_url": null, + "metadata_sha256": "9af629898406c9eaa69897fe09220dc483270cdba89f6b20bf0165cdf0e1668e", + "name": "numba", + "version": "0.65.0" + }, + { + "direct_url": null, + "metadata_sha256": "0c7281a81cf76e40b27c1385ffd8a215d7227adc219f177ce807ead9e91994a5", + "name": "numpy", + "version": "2.3.5" + }, + { + "direct_url": null, + "metadata_sha256": "0c7281a81cf76e40b27c1385ffd8a215d7227adc219f177ce807ead9e91994a5", + "name": "numpy", + "version": "2.3.5" + }, + { + "direct_url": null, + "metadata_sha256": "bab990ced4537ce74ef5961ca933c4c6fd604fd09a5827a4a428c55bcb0be35b", + "name": "nvdlfw_inspect", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "10f6595146332d35f7f15a000e08b5c81432528c5d026470c1d03f0c1399fb70", + "name": "nvidia-cublas", + "version": "13.1.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "58e933b4ac8e49f098b16ab7480d03bd792afc3d1db10d0aacbdcc2c62e48fa3", + "name": "nvidia-cuda-cccl", + "version": "13.3.4.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "baac937970681d41aa0c3708b3d55d73f8d29e70aceaac0e71fe6d1548e94a09", + "name": "nvidia-cuda-crt", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "8d51e5c76ef5707b0b80d5ec9a791c0f11a480ab721820cf100a3cc566017eef", + "name": "nvidia-cuda-cupti", + "version": "13.0.85" + }, + { + "direct_url": null, + "metadata_sha256": "724bf56e61ddef5d4c2482ff64103a973b911b110b668acaea5373f6c83c1c5c", + "name": "nvidia-cuda-nvcc", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "c54801dbd815d534519a761f1f328325aa0f1d1f1659aa969fa74e7a2c76eee9", + "name": "nvidia-cuda-nvdisasm", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "af51f248363020b9fdfd2743704e901bf3d19a1a1ce1fe44fb98ba148bfc0157", + "name": "nvidia-cuda-nvrtc", + "version": "13.0.88" + }, + { + "direct_url": null, + "metadata_sha256": "055f7fc69a5a2159de82cd0718da02c8852e81c8a71ebb117b8e799badd7167e", + "name": "nvidia-cuda-runtime", + "version": "13.0.96" + }, + { + "direct_url": null, + "metadata_sha256": "df18686dbdb3074ca375a1d6c623a04102fd348950c67a721397349c6d4f0477", + "name": "nvidia-cudnn-cu13", + "version": "9.20.0.48" + }, + { + "direct_url": null, + "metadata_sha256": "abd0ca3f67af19a4d383ff2a012ae0090d4731c6492fd47236615308a50b3981", + "name": "nvidia-cudnn-frontend", + "version": "1.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "4a78545d424d0c5038353f7046a8ae40ceaf312045d71399eac9511f5fc15434", + "name": "nvidia-cufft", + "version": "12.0.0.61" + }, + { + "direct_url": null, + "metadata_sha256": "e49b909195c03ddbe203729d9b31dd88e3f207368333d1909c67c6b130a0c696", + "name": "nvidia-cufile", + "version": "1.15.1.6" + }, + { + "direct_url": null, + "metadata_sha256": "bb15a754c6be32c23aaac13c1cfa7a8ce53d92bc26652ec3b609f7a5cce3e7d1", + "name": "nvidia-curand", + "version": "10.4.0.35" + }, + { + "direct_url": null, + "metadata_sha256": "0dd58f677811eac04901a793740932e5a2a8fff2f5453aa6351614eb18391bb6", + "name": "nvidia-cusolver", + "version": "12.0.4.66" + }, + { + "direct_url": null, + "metadata_sha256": "8aeb284782ef6883095a5d1c110e221cad023a99afcfd5cdb4969a25e146d562", + "name": "nvidia-cusparse", + "version": "12.6.3.3" + }, + { + "direct_url": null, + "metadata_sha256": "09555246122896eaca3b8313eecfca4b339fefd3b597874cb9fe3bf29dab38c9", + "name": "nvidia-cusparselt-cu13", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "ac77bac79fbfb0c52ac6e2e5abc936b1e127be2192f0cbc27b00be3125fa86ae", + "name": "nvidia-cutlass-dsl", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "1ec968ec7c4083f7fe4e1fb8384c7e9b853a81491fef9f4cb1cf755961aaedf6", + "name": "nvidia-cutlass-dsl-libs-base", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "cc6f3846cd820013eaa6e2665c493d70c607be6ce7349b939eb4742888470585", + "name": "nvidia-cutlass-dsl-libs-core", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "2357d0df2d0d17c0b16663b8a89df53f751b19721f66821fd88fa78112c08e55", + "name": "nvidia-cutlass-dsl-libs-cu12", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "244590c25662dcf777b1daae97a858afe1a1aec62e5e6678b217007a459ab552", + "name": "nvidia-cutlass-dsl-libs-cu13", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "c3a25ada01f57418c1b897406c3abab18834e6adc573ab7b060620c453afb6db", + "name": "nvidia-ml-py", + "version": "13.615.71" + }, + { + "direct_url": null, + "metadata_sha256": "56baad4e7f699902b03b17580933f7bd50b6ea97b7df9d7e807750973da7529c", + "name": "nvidia-nccl-cu13", + "version": "2.29.7" + }, + { + "direct_url": null, + "metadata_sha256": "98810ef0ab8badc369e6a46a038f8ee9f412c0c753fb5ad580544f23a0aa7962", + "name": "nvidia-nvjitlink", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "b0f54ee21909d19640a58e05da755c91763eb5725f544fd0d4b84b2f5f94deba", + "name": "nvidia-nvshmem-cu13", + "version": "3.4.5" + }, + { + "direct_url": null, + "metadata_sha256": "06dc1a593c7e8b8c3f29184228c83f8f7ef57787ad91f3e5bcae1d238dd3092a", + "name": "nvidia-nvtx", + "version": "13.0.85" + }, + { + "direct_url": null, + "metadata_sha256": "32ee63450a437b6a6ed227ff6549144aa596197a322993521ec7af826ebd413e", + "name": "nvidia-nvvm", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "32c2efdcd2c673b3b7f35ca9c2cccefaad36f1f0a920648a13cad85f6a5767b2", + "name": "nvtx", + "version": "0.2.15" + }, + { + "direct_url": null, + "metadata_sha256": "3419d80e114a2c19fa9bd3582939a3942f19673055707ba6ca2ca489d58b41e0", + "name": "omegaconf", + "version": "2.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "28971076ce9c279d4b889496b046d55a1e05b02fb9851ceb717e9a10df799572", + "name": "onnx", + "version": "1.23.1" + }, + { + "direct_url": null, + "metadata_sha256": "1246f5a4d8295907a42e809ed9173ede2510ec9d260d2168989d126564897fa5", + "name": "onnx-ir", + "version": "1.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "e14643636835759700dff286f949c5ec34e7eac7ac47f44096414f0e0f1c3101", + "name": "onnxscript", + "version": "0.7.2" + }, + { + "direct_url": null, + "metadata_sha256": "00f847e99939207bd70dfd806428f6b20a3d01074b59325e4c76149a2e19be26", + "name": "openai", + "version": "3.22.1" + }, + { + "direct_url": null, + "metadata_sha256": "598d3ad5a22a14a7c4f1d218b43e345f32b0ba094b753467bae8a3f708fd48cb", + "name": "openai-agents", + "version": "0.22.3" + }, + { + "direct_url": null, + "metadata_sha256": "5a0afcb1ce845e05da12beb1767f5d2749bbc9e9050718c6b9fa3c225713c9eb", + "name": "openai-harmony", + "version": "0.0.8" + }, + { + "direct_url": null, + "metadata_sha256": "e86a6b6fcbbe152805f782c57df321002892e163019574877e9829272e25eb4e", + "name": "opencensus", + "version": "0.11.4" + }, + { + "direct_url": null, + "metadata_sha256": "53d669c8bd3d32d3275153b454e515ca5cc6dec92fae3a98309b5a2b19fe6d2d", + "name": "opencensus-context", + "version": "0.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "19778b6d66b0e45bf73e11fa37a208949d5b393aef914627394d5601455546a6", + "name": "opencv-python-headless", + "version": "5.0.0.93" + }, + { + "direct_url": null, + "metadata_sha256": "19778b6d66b0e45bf73e11fa37a208949d5b393aef914627394d5601455546a6", + "name": "opencv-python-headless", + "version": "5.0.0.93" + }, + { + "direct_url": null, + "metadata_sha256": "a3f5434fa7c80f7f7abc82173da639c8e9c59d30b4027182645562bd3d2f4f97", + "name": "opentelemetry-api", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "8611977ea596e4827874582e86250618444e1c718229dddfc16e5ea437ce5fcb", + "name": "opentelemetry-exporter-http-transport", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "2cfd41e5ca33292d987ba71fa6186d11e16ed66888f3a26f8a3a99060c4b5e90", + "name": "opentelemetry-exporter-otlp", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "3bb4494220732d4bf10e1dba231ea7638cedaa5362e1f23a50d34a14f520fea8", + "name": "opentelemetry-exporter-otlp-common", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "27fb1c8aa5c2cd07776f9f3281fc618cd3feb96017757c33d2b3586fb7fec88b", + "name": "opentelemetry-exporter-otlp-proto-common", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "5cba6098cdd0bfb06853a6c704a2451c4f82c9dea376a30b59ecd279296648ad", + "name": "opentelemetry-exporter-otlp-proto-grpc", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "6f53ef1c172ebf87af69b9ef390aa908506d0cd14bc7811985fdd937a4058808", + "name": "opentelemetry-exporter-otlp-proto-http", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "1910f4e7ebd497e98b6d231e10275288fda2cd1885117575706c62f45e065889", + "name": "opentelemetry-exporter-prometheus", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "fab18b721e30be41448be252e1dca43b48e7f15d971e0bb552492c0ef4b07bee", + "name": "opentelemetry-proto", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "3644a79f55762a646799ff52b9d837e01c8192b7b28f735a383f55c90edb9bc2", + "name": "opentelemetry-sdk", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "add3db481f7f401f65cfbddb058fde3bb4c9dd7b61064a84f8598ad7efe0b11c", + "name": "opentelemetry-semantic-conventions", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "0dfff30e912520a226bcf7a547393484cfcd8c738439c7b48418f61c95109480", + "name": "opentelemetry-semantic-conventions-ai", + "version": "0.5.1" + }, + { + "direct_url": null, + "metadata_sha256": "210ce26bad0a245a72831b4fa029708c245d4d670a88c8d5a69b1446c24a95e4", + "name": "orjson", + "version": "3.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "35ff73511848f5f934ccc39d538014716ec4579e76d54e0e407ff51794a7939c", + "name": "outlines_core", + "version": "0.2.14" + }, + { + "direct_url": null, + "metadata_sha256": "8ee2f7138ade46b6e348a6d099612f5bd6caff13511f3b4144327f37ce50eacf", + "name": "packaging", + "version": "26.3" + }, + { + "direct_url": null, + "metadata_sha256": "a4ab87bf8083001f25ccdc46095f05b678b3569dd58edc2cf941e3e7f64d7c88", + "name": "paginate", + "version": "0.5.7" + }, + { + "direct_url": null, + "metadata_sha256": "1de96a6c28c2e5613c9c87cd4ad9484791001cf58df43cf2ba74d5c4f85f0ad2", + "name": "pandas", + "version": "3.0.6" + }, + { + "direct_url": null, + "metadata_sha256": "d05b8d05da9f78176b2eefaacdfaa5e96708ec4f488daea8bbc52e3ed1bc3954", + "name": "partial-json-parser", + "version": "0.2.1.1.post7" + }, + { + "direct_url": null, + "metadata_sha256": "c1d126edceac2685e29403a8ae3a27c47143dce1f0252fa3931771562f1e2b4f", + "name": "pathspec", + "version": "1.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "30325dc8ce17bc64f9dbc0a449232fd35841a019df22a6f481007c9c5a28c1cb", + "name": "pillow", + "version": "12.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "cbc0b7b6e63b50dcb7c17cf3526a9304f285d9a31353adf3b22acc2059ab23f5", + "name": "pip", + "version": "25.0.1" + }, + { + "direct_url": "{\"dir_info\": {}, \"url\": \"file:///work\"}", + "metadata_sha256": "6ba03b5bc457a2a3d92468729501b5892a0d38ebcc36766c58859449498c5743", + "name": "pip", + "version": "26.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "0421937c4410b61c5325233d5b7671ae933bae8de174f87586ac55aa804851ea", + "name": "platformdirs", + "version": "4.12.2" + }, + { + "direct_url": null, + "metadata_sha256": "2bcffab42626e1fb50d6329765619312d30fe7f4880e98dcee99c92ebd283bb4", + "name": "pluggy", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "7e7562ba7c032f8edd02641ae71b1ac2d8f388103a68d777a7e907d19e75bc17", + "name": "pre_commit", + "version": "4.6.2" + }, + { + "direct_url": null, + "metadata_sha256": "bbe0a7662602ddd23f929fe0ee98e9d04406e138aeee18ce4861af186ea6060d", + "name": "prometheus-fastapi-instrumentator", + "version": "8.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "ece4a61f3ffb92a083fd5e47e180e3e070342e60a3bd93876a879e79a643e821", + "name": "prometheus_client", + "version": "0.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "5feba21a58eaa126e7e7739e57e2572e5bb251fcbf56e439e508acc47d769314", + "name": "propcache", + "version": "0.5.4" + }, + { + "direct_url": null, + "metadata_sha256": "3f136dbf7239c987a7685acd33440cc5efd6c4107b4b11c425201b4de70ae36f", + "name": "proto-plus", + "version": "1.29.0" + }, + { + "direct_url": null, + "metadata_sha256": "118b5ad013120a7a6e24714595ad776bf264d7b0060389133310d18ea1480902", + "name": "protobuf", + "version": "7.36.2" + }, + { + "direct_url": null, + "metadata_sha256": "0849f5a519bf9bc23ef204443fdd8d6d10678863acac7ca9340fc11bfba5a856", + "name": "protobuf-py", + "version": "0.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "eab5f2f4fd98f67a710a8fb1975b64ffa880a4f977566f022c567e08e324ccd6", + "name": "protobuf-py-ext", + "version": "0.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "39009938840de3a8b2a37eb4668d2601aae8c74e4b74743f73e59996b5b7e6e1", + "name": "psutil", + "version": "7.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "df44b58e8a4cfe57f65773ec47f7bdf2a14c8f5f73a7abf331a6b6237d6d691a", + "name": "py-cpuinfo", + "version": "9.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "2fd4a9efc5e5c74ae4c2fcf1970193c524c62ab22af8d5e66ebf7df9e6e46e83", + "name": "py-spy", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "d2ccdeb15cddedc81637a83e40baa6397fe269023b738d0fc3cb2d90722e290b", + "name": "pyarrow", + "version": "25.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "47b9f28e971a56f5adf949e0bcf105b0bf6587946566ecf197a2819d8848cc01", + "name": "pyasn1", + "version": "0.6.4" + }, + { + "direct_url": null, + "metadata_sha256": "82ce4c01c6d36841b9801fcdabab9bfe61d0b5e4e440c275941d8a2d4a790730", + "name": "pyasn1_modules", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "45cb345e4c12f63bc843b8c88902cc44c4d624a55aaef8cd5ffbc0ad16356fbe", + "name": "pybase64", + "version": "1.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "d311ae661edeac8ff029ab2960d065a7e792ebf8f79af682daa53109fe81318b", + "name": "pybind11", + "version": "3.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "cce9c0d440d065d4cdfb0d00004b8ddd65cf363a740efc5b0920b29201a59cd9", + "name": "pycountry", + "version": "26.2.16" + }, + { + "direct_url": null, + "metadata_sha256": "a1e33542883c249bf6c263b0023b9ea8a6131a77d9cb2cbc88316968e5eada83", + "name": "pycparser", + "version": "3.0" + }, + { + "direct_url": null, + "metadata_sha256": "faffcc4d7d359cb1047a9f67f7c65096b838c6db6c62852ef20fb27d55649a95", + "name": "pycryptodomex", + "version": "3.23.0" + }, + { + "direct_url": null, + "metadata_sha256": "98929f4cb80451dc3c6c8cd541a3081dccf0dee94afe7d9fa5c214a18ff236ce", + "name": "pydantic", + "version": "2.13.5" + }, + { + "direct_url": null, + "metadata_sha256": "8eccadbe707db97c397fb79073fe791b7998ef3a85f04f817f8991f7697b190b", + "name": "pydantic-extra-types", + "version": "2.11.1" + }, + { + "direct_url": null, + "metadata_sha256": "8f00c91deb34399316a5386eb2e76fe09f14a08dc3045f2e7dce9bf8573796bd", + "name": "pydantic-settings", + "version": "2.15.0" + }, + { + "direct_url": null, + "metadata_sha256": "66c729edddc20bf2764bb18bd87d907b08690e50355f39b97acc737b26d1d164", + "name": "pydantic_core", + "version": "2.46.5" + }, + { + "direct_url": null, + "metadata_sha256": "394500d78a0c1a433ae8ca3693152c08f6a901121d4b069cf1540a19759e2950", + "name": "pylatexenc", + "version": "2.11" + }, + { + "direct_url": null, + "metadata_sha256": "df2e9e9847a2aea0ae6e20fd325aeb16cf3ce7f8913462db6c2398363cd0c0bf", + "name": "pymdown-extensions", + "version": "12.1" + }, + { + "direct_url": null, + "metadata_sha256": "82fcfe724db9f0b51348da89f4f5cdc0b08d08882b1bbc0ca4913d3a0a93bcb9", + "name": "pynvvideocodec", + "version": "2.0.4" + }, + { + "direct_url": null, + "metadata_sha256": "3722422cc1478b175879143dfb78f98b7a5f53f4f684d71b7054fe2e8acd3b89", + "name": "pyqwest", + "version": "0.10.0" + }, + { + "direct_url": null, + "metadata_sha256": "7d1d1c276b7c372d55d17ac7d30f0a4b80a746e147347b8510d1355eea7f80c8", + "name": "pytest", + "version": "9.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "89e7c1c932e52b74bdcaf504389d2d1a2d7ca559b02bf5a09fc80ebd58ad10f7", + "name": "python-dateutil", + "version": "2.9.0.post0" + }, + { + "direct_url": null, + "metadata_sha256": "54f30f811841b6d772f31715712c85bfe0041839cb071f78daf41c700a98642b", + "name": "python-discovery", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "54f30f811841b6d772f31715712c85bfe0041839cb071f78daf41c700a98642b", + "name": "python-discovery", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "0cc19efd76cfbf3bcb2cb0d3ab82191036855859455aa3812c5e9e591e3f34e8", + "name": "python-dotenv", + "version": "1.2.3" + }, + { + "direct_url": null, + "metadata_sha256": "1d866c6124631b9ce1797ad412fff298ab53fc2d95210281d7c8f20e920753fa", + "name": "python-json-logger", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "2d18a1e7286d92a656ead5ec6f83d5ae6dc858634624f6b264703ae88d24d718", + "name": "python-multipart", + "version": "0.0.32" + }, + { + "direct_url": null, + "metadata_sha256": "beaa0efe9ba4b34843f5a0fc7379a73f10e95adb8cc0c31f359ab6f3a42b4def", + "name": "pyyaml_env_tag", + "version": "1.1" + }, + { + "direct_url": null, + "metadata_sha256": "238dc769e22d4f5626750cdff36e920e4a8d69c10d88de6d79b40a59cc13d873", + "name": "pyzmq", + "version": "27.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "de0a5e855bb5bb78b7acdcd2ca60619c6a0c109814881589caf158ec07155662", + "name": "quack-kernels", + "version": "0.6.5" + }, + { + "direct_url": null, + "metadata_sha256": "961ffef199b876fb4d7b10903d78e79f359d703b1638834c61d70b9879932918", + "name": "qwen-vl-utils", + "version": "0.0.14" + }, + { + "direct_url": null, + "metadata_sha256": "faf6ab9027d12de992827a2d8a224996fe6747a8c5f7d31ae495983dc73eefe9", + "name": "ray", + "version": "2.54.0" + }, + { + "direct_url": null, + "metadata_sha256": "c50d8b3ff4d113925b60dc47d1d28e87248a3338024241b0a3a66c8794fbce0c", + "name": "referencing", + "version": "0.37.0" + }, + { + "direct_url": null, + "metadata_sha256": "02acdc52d6f21d5f4b172254daaa94edfaa44c9ebe14d1c00cc4c8fe99b0e1df", + "name": "regex", + "version": "2026.9.29" + }, + { + "direct_url": null, + "metadata_sha256": "ac08207697217d1ffde8a161b424d77d6e2af6b62630fa26d75d08f11076cdca", + "name": "requests", + "version": "2.34.2" + }, + { + "direct_url": null, + "metadata_sha256": "f1abd635c3dff607a4fd654c62a88d9d4c21843cfc9176116c156f4269ca21b5", + "name": "rich", + "version": "15.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "932ff7743a756d0efcc45528d64c275ac3cb40a8dd1787ea10cb303907f0ae4f", + "name": "rich-toolkit", + "version": "0.20.5" + }, + { + "direct_url": null, + "metadata_sha256": "294a1405c0fa34b5f735bcb46459050436849a1e584c643544de99c07c529fb7", + "name": "rignore", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "5e54dd00b4ad336c5161d47de2a5c2212090c44629c28b6538b156256e49282d", + "name": "rpds-py", + "version": "2026.6.3" + }, + { + "direct_url": null, + "metadata_sha256": "0d5895abd80bfc0027c02943abaea4547061b9004bd134950d640d619a697835", + "name": "safetensors", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "91d5de3f641f33a8fbb4b6e91772da68d50b68686971d7b66af2068f2e77b694", + "name": "scipy", + "version": "1.17.1" + }, + { + "direct_url": null, + "metadata_sha256": "297fb30f701a800489c12893a951da3e5bd1f80061a1f43f0d3e9f1d4c6bc6fd", + "name": "sentencepiece", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "4245e0388ddf2048a38ae2a24a3d2c583408b2454aadc680d3c3beede639db3f", + "name": "sentry-sdk", + "version": "2.71.0" + }, + { + "direct_url": null, + "metadata_sha256": "ae8a9e6feec1a76e954d65ea48ac57842c9a7bfb5ac6e5ea82400a5ba9f71a98", + "name": "setproctitle", + "version": "1.3.7" + }, + { + "direct_url": null, + "metadata_sha256": "341d00772017437d0f6e3c943ae353f243c39fedfba403aea47cced927a76516", + "name": "setuptools", + "version": "79.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "ff4bcfb192bd542ed8f1794fb32ffc9eabd932d6e03cb00a4ad5e35a2469af88", + "name": "setuptools", + "version": "80.10.2" + }, + { + "direct_url": null, + "metadata_sha256": "f1e5a532fb8cda0bbc370e3db6cb9cea72a065d12ddd6a14976ba3cf66264221", + "name": "shellingham", + "version": "1.5.4" + }, + { + "direct_url": null, + "metadata_sha256": "2aba2cfd9c2ad7625a5d374d141af317d8f92d3534997bf98d127e52848dfc81", + "name": "six", + "version": "1.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "69ae2dfe547624be97fae348e1cfa3793f8854eed32cc1603badedc7d48fb36e", + "name": "smart_open", + "version": "8.0.2" + }, + { + "direct_url": null, + "metadata_sha256": "d415e6c6de7dee117d254a342668c489931bc88eac7ec8678b452078e366da6e", + "name": "smmap", + "version": "5.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "093bc4f0740a6fc28692e616aa8fe68d7e1d76426cc5a5faf9ea722a8ee7aaae", + "name": "sniffio", + "version": "1.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "b3cef071eb1dbeaa76a1273fe2ca2cc8ef36e835165253952d93780962529ac1", + "name": "sse-starlette", + "version": "3.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "3c01ca830e213f0311fe37bc3b46b8ab230a5e7acb894bf0fc8785cb7ccfed48", + "name": "starlette", + "version": "1.7.0" + }, + { + "direct_url": null, + "metadata_sha256": "6017ca508a293cf47a88a78cb330e9cbd131d74ec3c7fbf89bd4300ed3129d30", + "name": "supervisor", + "version": "4.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "fd5eb4925b04f9bffbc6c4f92bf8aea7243b918b43cd359493fce48a7dd3b336", + "name": "sympy", + "version": "1.14.0" + }, + { + "direct_url": null, + "metadata_sha256": "f09f0e24282c5a86346bcd5b10ae5ff81869fa8ef69c3ba524bd0a817a87dda9", + "name": "tabulate", + "version": "0.10.0" + }, + { + "direct_url": null, + "metadata_sha256": "519fa19c146fd58a0a75ecf1461e4bd98f9c06d01800c37d4a80f5fef095f4e1", + "name": "tensorboard", + "version": "2.21.0" + }, + { + "direct_url": null, + "metadata_sha256": "1af7ad76e4073b01ab147eb3c1d8e38b95d38062c6c9bc63890150738642e8eb", + "name": "tensorboard-data-server", + "version": "0.7.2" + }, + { + "direct_url": null, + "metadata_sha256": "9e597f62fc07e3b931d5c8fb0e90706fb6d45465cfb5d01dbd27ba7fc135c02c", + "name": "tensorstore", + "version": "0.1.80" + }, + { + "direct_url": null, + "metadata_sha256": "0da993d16ef6326f471796fcb065622f309c5c1aae6c6295b488ea64bb5c880c", + "name": "textual", + "version": "8.2.8" + }, + { + "direct_url": null, + "metadata_sha256": "52ca6148d4fd1497254855fa610cfdde99191cd42bce7a452fd3a68855504ac0", + "name": "tiktoken", + "version": "0.14.0" + }, + { + "direct_url": null, + "metadata_sha256": "0df9eb495cfb477dcbdfbdcd8c04d952d3eb00d77831630760571e13545398e5", + "name": "tilelang", + "version": "0.1.12" + }, + { + "direct_url": null, + "metadata_sha256": "802b576e011dc61bd2681593e8d802714b6c4ce636a9cf87035026db32ce6262", + "name": "tokenizers", + "version": "0.23.2" + }, + { + "direct_url": null, + "metadata_sha256": "4e1631b2164a49ff9a848d86ce504fdcc15e3540dbb262df8f33a2681a8de513", + "name": "tokenspeed-mla", + "version": "0.1.8" + }, + { + "direct_url": null, + "metadata_sha256": "05086095a775c5dca70998dcf442a848c13f9c68b54a54c510c3542c5abb6563", + "name": "tokenspeed-triton", + "version": "3.8.10.post20260920" + }, + { + "direct_url": null, + "metadata_sha256": "71daba472d0c5ffc25c0231dc29688ab0cb13d5bc7e7d93f6c4cce4169c50048", + "name": "torch", + "version": "2.13.0" + }, + { + "direct_url": null, + "metadata_sha256": "cccd2f1c0e5866e63732f58798c8d642ee6d10cd560d6f691e7981b908c246c9", + "name": "torch_c_dlpack_ext", + "version": "0.1.5" + }, + { + "direct_url": "{\"dir_info\": {}, \"url\": \"file:///torch_memory_saver\"}", + "metadata_sha256": "6276cef17dedbb5ee0d6157bbf63b832e916026281328d995ad3d488c2539618", + "name": "torch_memory_saver", + "version": "0.0.9.post1+slime" + }, + { + "direct_url": null, + "metadata_sha256": "29809ca2c86dda5079654f1f70564a64435e9d08f1964a2412b6f514e1b5ff64", + "name": "torchaudio", + "version": "2.11.0" + }, + { + "direct_url": null, + "metadata_sha256": "7e9be0f3a290e3fd9370d8fe010c7ffd006d5d3d05ab8bdf7df8f92f0fca9c39", + "name": "torchcodec", + "version": "0.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "181fa5e6b399c378711eddcdacd756d3c51317916f8eb160ee36cae7fae9589f", + "name": "torchvision", + "version": "0.28.0" + }, + { + "direct_url": null, + "metadata_sha256": "43d1261aff90cf3d5b1b40cf1f94234d61409b14e59f3766f457c1eec7f7ac15", + "name": "tqdm", + "version": "4.70.1" + }, + { + "direct_url": "{\"archive_info\": {\"hash\": \"sha256=3e1d9f534781c8e608240da0b495b8246317a36382f7609017cbaa7fb1d53f7b\", \"hashes\": {\"sha256\": \"3e1d9f534781c8e608240da0b495b8246317a36382f7609017cbaa7fb1d53f7b\"}}, \"url\": \"file:///wheels/transformer_engine-2.16.1%2Bc9877beb-cp312-cp312-linux_x86_64.whl\"}", + "metadata_sha256": "d882f743161d9d9f35dee4e1a8cc9136fa495f7c660caace01ab8f5602d76aa7", + "name": "transformer_engine", + "version": "2.16.1+c9877beb" + }, + { + "direct_url": null, + "metadata_sha256": "465797a59706d83b45c93fde750b228c3b6e1addc44115de2c4c02ad66d9c5ea", + "name": "transformers", + "version": "5.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "a91982ca086667c592a951973434f7c5a9f27a8300bc97af78dfb496afe53e71", + "name": "triton", + "version": "3.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "d26fbb244532c4051e715f9047cd943e2cc4abb0ac6f2a517fa2986eb1ea726a", + "name": "truststore", + "version": "0.10.4" + }, + { + "direct_url": null, + "metadata_sha256": "c84af1a069084b1b440b3594068dec29200d52d4c1a9b652030448717f270158", + "name": "typer", + "version": "0.27.2" + }, + { + "direct_url": null, + "metadata_sha256": "0ad6653b7439f4bb6a596cb7b01ed1b716458467525c4dc40b75d62bdb943c98", + "name": "typing-inspection", + "version": "0.4.4" + }, + { + "direct_url": null, + "metadata_sha256": "d005280aa13b334ac942d20219102865e559f69ffd06c35c248b2f0d0da3b933", + "name": "typing_extensions", + "version": "4.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "fba2930e9030a18965d243f8d330748db2e67572a81b3b68710462fb5110332a", + "name": "urllib3", + "version": "2.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "bc5717bd6524a33838f285261868bcc8e311e8c29fdb19e41d56c38b04890e84", + "name": "uvicorn", + "version": "0.54.0" + }, + { + "direct_url": null, + "metadata_sha256": "741c006d8441f562aa853a5430df236fbb4af923445491f396bf09943bd30258", + "name": "uvloop", + "version": "0.22.1" + }, + { + "direct_url": "{\"dir_info\": {\"editable\": true}, \"url\": \"file:///vime\"}", + "metadata_sha256": "f85aa01dfdc868756a6583434bbff040f29eb511d47d5b25ada063a84353aac6", + "name": "vime", + "version": "0.3.2" + }, + { + "direct_url": null, + "metadata_sha256": "c25431aaf1950971fe96292f395a41a55b403127bfca0d0b8f7dc9cff5dab75d", + "name": "virtualenv", + "version": "21.14.1" + }, + { + "direct_url": null, + "metadata_sha256": "4e3ee0a31d85e56268640aae853bcee4794dfe8c0483c5c6370517e480c81ae0", + "name": "virtualenv", + "version": "21.14.5" + }, + { + "direct_url": null, + "metadata_sha256": "d4ed5c7551cddb8c1aeff2f9f27b3491f6ad2c9afda8e7bb9779c33fa12a536c", + "name": "vllm", + "version": "0.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "84b482e09bac949e992594757214a1920c667a5d898ee320e309250697f6d26e", + "name": "vllm-router", + "version": "0.1.15" + }, + { + "direct_url": null, + "metadata_sha256": "9b16c871eb1060a5218e9b9a9ad33288d94844cfaf43f08dbb6c32423bde8fe3", + "name": "wandb", + "version": "0.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "8e4f2be437dfe4eb3c6c959e517ac20b75d06525563f1ebcbf06f9ec648bd7c1", + "name": "watchdog", + "version": "6.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "15218afb42938907c2ca74c54e3d8e3a5406493c4761e29e38e82bfec0f84296", + "name": "watchfiles", + "version": "1.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "8863af96e88b7db9990da99aa6c46816eacc3d2f9ae1297b53381b033cd70119", + "name": "wcmatch", + "version": "11.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "f46e6bd6cfafb2b684c29587b017b7096fd9155b74eda25a22eca784b9803ab7", + "name": "websockets", + "version": "16.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "ce82db5ccfefa4bfbe4e25a36e1f91e8e7d51fcaeb31586c4d48e1c69f99168b", + "name": "websockets", + "version": "17.1" + }, + { + "direct_url": null, + "metadata_sha256": "0f142a2c09eac643c7d0bfe77f3f121184c0b17914afbd32af669ed19b2b02ef", + "name": "wheel", + "version": "0.47.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd58938e51a3c5cb363f6f22eaa2a8a7accc1ce373388de167a82f77d3e5783f", + "name": "wrapt", + "version": "2.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "b0b72c1941f04499ca7e1a3a6e479aee8df902c3d49979624b59dba8c3228d37", + "name": "xgrammar", + "version": "0.2.8" + }, + { + "direct_url": null, + "metadata_sha256": "ef8861f39e5c36255966a36032651f937d890d55f31f1c26304b488f1ba34332", + "name": "xxhash", + "version": "4.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "740c08057b6eb69c58402c87d652af0a471e46325d811f2c605632a18817152f", + "name": "yarl", + "version": "1.25.1" + }, + { + "direct_url": null, + "metadata_sha256": "7b060e4d24394b5431875e2f74fec8e6bffa79d2e6b4cb8c7e2a5187dd2d8d69", + "name": "z3-solver", + "version": "4.15.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "3d76d4fbc95f0851191147db12300938c67a6f8fb1df884886d9601272ccc4e8", + "name": "zipp", + "version": "4.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "d3de2651e4e908dbb7c9d80508e5179590217dfac4993dc8b04381c5b9718c4c", + "name": "zstandard", + "version": "0.25.0" + } + ], + "executable": "", + "installed_provider_sources": { + "vllm/compilation/__init__.py": { + "path": "/vllm/compilation/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/backends.py": { + "path": "/vllm/compilation/backends.py", + "sha256": "fa4bff8920b363efbbde9456f135fa9d2c004a5bde1898877f177418b2d8b008" + }, + "vllm/compilation/base_static_graph.py": { + "path": "/vllm/compilation/base_static_graph.py", + "sha256": "5cfe8e06db84aa42cd41cdd93ebe93af00b3a242c8011042057530e2922b523a" + }, + "vllm/compilation/breakable_cudagraph.py": { + "path": "/vllm/compilation/breakable_cudagraph.py", + "sha256": "3cc427612a08e2b9b3fee47548026400c1d0776e2d4747535e59ef5512bdf1e8" + }, + "vllm/compilation/caching.py": { + "path": "/vllm/compilation/caching.py", + "sha256": "71d212452dde742fbf28b8a01ed29d3c08a7457ff7f8da2a20ce9d17e902c2cf" + }, + "vllm/compilation/codegen.py": { + "path": "/vllm/compilation/codegen.py", + "sha256": "e04833bec88cf9d1a13aa7341e30e3233d1138bfe23424e0fd34d664b3fedb9f" + }, + "vllm/compilation/compiler_interface.py": { + "path": "/vllm/compilation/compiler_interface.py", + "sha256": "8d84e2864bf83f754bae9e9f77119e0287cca9f97f5fa5ec2535e07b5ad88944" + }, + "vllm/compilation/counter.py": { + "path": "/vllm/compilation/counter.py", + "sha256": "d8158c54dd36a357bf24f6f84dc22f572d3a27f4875f3d5779b12bc5d454ff76" + }, + "vllm/compilation/cuda_graph.py": { + "path": "/vllm/compilation/cuda_graph.py", + "sha256": "05c86392d7fae967ac73076dba7e01990a0e3ae619e4866450a0c1be56bd1192" + }, + "vllm/compilation/decorators.py": { + "path": "/vllm/compilation/decorators.py", + "sha256": "cab6962e8a1fead59c75f5ed8cb4732f9e5441ff972030c2f4b1c4ba0c58de3c" + }, + "vllm/compilation/monitor.py": { + "path": "/vllm/compilation/monitor.py", + "sha256": "43b24c5cb1bc4d32dc979f3222596905c7b3acc58415328a234402e6edc76abf" + }, + "vllm/compilation/partition_rules.py": { + "path": "/vllm/compilation/partition_rules.py", + "sha256": "857d2fb06dc871ea1d3717cd01fbd4e5205984100d98b7b72a2933d6ff1cfa4d" + }, + "vllm/compilation/passes/__init__.py": { + "path": "/vllm/compilation/passes/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/fusion/__init__.py": { + "path": "/vllm/compilation/passes/fusion/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/fusion/act_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/act_quant_fusion.py", + "sha256": "1fa9c3ca4fb424685b7053c3dda89dda16c98dc5645d85f0f28dca58429792b3" + }, + "vllm/compilation/passes/fusion/add_rms_fusion.py": { + "path": "/vllm/compilation/passes/fusion/add_rms_fusion.py", + "sha256": "e46998552628aa5cd5962fc39ea39ae824fd97e6aeba1d176e9cc7cade39837b" + }, + "vllm/compilation/passes/fusion/allreduce_rms_fusion.py": { + "path": "/vllm/compilation/passes/fusion/allreduce_rms_fusion.py", + "sha256": "0af193505880cec0f6ffa224c688bce3c9ddc318dccdf04a696b4e4b4506a963" + }, + "vllm/compilation/passes/fusion/attn_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/attn_quant_fusion.py", + "sha256": "ecc64e82be4481954c9cac6c23d7794846ab19486b570f2dda07ab5ad67c5a49" + }, + "vllm/compilation/passes/fusion/collective_fusion.py": { + "path": "/vllm/compilation/passes/fusion/collective_fusion.py", + "sha256": "1e2c8539d6960b45907fb3bf0482441ea7250e97c56ffdea1500514efa0b164d" + }, + "vllm/compilation/passes/fusion/matcher_utils.py": { + "path": "/vllm/compilation/passes/fusion/matcher_utils.py", + "sha256": "50ac5714ce1bb113520de769ea6234316acc470a8cdf2537a996ce9a9d54337d" + }, + "vllm/compilation/passes/fusion/mla_attn_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/mla_attn_quant_fusion.py", + "sha256": "a966fe7f58bf9228379f793f5fd851735a97f9639722766b2a20cb79a9e4baec" + }, + "vllm/compilation/passes/fusion/mla_rope_kvcache_cat_fusion.py": { + "path": "/vllm/compilation/passes/fusion/mla_rope_kvcache_cat_fusion.py", + "sha256": "1602cc28055ffa8d1123ddb1d256bf0bd12006fd06ea7e16a986c55746dbe0dc" + }, + "vllm/compilation/passes/fusion/qk_norm_rope_fusion.py": { + "path": "/vllm/compilation/passes/fusion/qk_norm_rope_fusion.py", + "sha256": "aebc7d1a5189b65ac665afcc169e7baebd53efe719c48e35e7c5babe85af0d39" + }, + "vllm/compilation/passes/fusion/qk_norm_rope_kvcache_fusion.py": { + "path": "/vllm/compilation/passes/fusion/qk_norm_rope_kvcache_fusion.py", + "sha256": "f0cfd0d83ec4acb09f9bf91d199b114e9d4995e3059c13eb23a6978ce7c07eb2" + }, + "vllm/compilation/passes/fusion/rms_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rms_quant_fusion.py", + "sha256": "4852aa44e0e2087043fdac271bda9b8d9bfe3201bb84ce3919b8ed454d8083c4" + }, + "vllm/compilation/passes/fusion/rocm_aiter_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rocm_aiter_fusion.py", + "sha256": "372e76c68c75209a085deec6dd22b3816be633613ca82f6f2925c1b3773d61a0" + }, + "vllm/compilation/passes/fusion/rope_kvcache_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rope_kvcache_fusion.py", + "sha256": "3a756e9049593537143b5a56ab9185a6bc83f57ed81d84226d7791a46a984b53" + }, + "vllm/compilation/passes/fusion/sequence_parallelism.py": { + "path": "/vllm/compilation/passes/fusion/sequence_parallelism.py", + "sha256": "3af7e420dcb35fff0bae0f8f599d0f1bda34445ebe194059892a434b2976d654" + }, + "vllm/compilation/passes/fx_utils.py": { + "path": "/vllm/compilation/passes/fx_utils.py", + "sha256": "730708213acf9d1b5f3176b433dfc197a5f3c81b5ce443f0923c526924833003" + }, + "vllm/compilation/passes/inductor_pass.py": { + "path": "/vllm/compilation/passes/inductor_pass.py", + "sha256": "1f380aacf7adabb8bf8b7d41c0a93473947f0716f7445bd910fd448f6c08e672" + }, + "vllm/compilation/passes/ir/__init__.py": { + "path": "/vllm/compilation/passes/ir/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/ir/clone_elimination.py": { + "path": "/vllm/compilation/passes/ir/clone_elimination.py", + "sha256": "5297078f5cddce081faba5215814275381d2083b32318fcfeb2bf9d69fedb7c7" + }, + "vllm/compilation/passes/ir/inplace_functionalization.py": { + "path": "/vllm/compilation/passes/ir/inplace_functionalization.py", + "sha256": "2dc4f22c6f05224828c2941479185b1452d4490f488b7f0bfd124334e7809fed" + }, + "vllm/compilation/passes/ir/lowering_pass.py": { + "path": "/vllm/compilation/passes/ir/lowering_pass.py", + "sha256": "d9c3d90f63138420f0e5489447b5996573fcfbbab939da2efccd00848492b172" + }, + "vllm/compilation/passes/ir/utils.py": { + "path": "/vllm/compilation/passes/ir/utils.py", + "sha256": "f59d33a6c7d0616cbeec1e9fb1d6c948881bf81fe124caeb906eac2e2197ea21" + }, + "vllm/compilation/passes/pass_manager.py": { + "path": "/vllm/compilation/passes/pass_manager.py", + "sha256": "486979a058aa2e20ebedcbb6e039f7a59f38d2efd2cda11219fae4067be0968d" + }, + "vllm/compilation/passes/utility/__init__.py": { + "path": "/vllm/compilation/passes/utility/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/utility/fix_functionalization.py": { + "path": "/vllm/compilation/passes/utility/fix_functionalization.py", + "sha256": "ad5b504a05ccee023869b0c8df70ec2fff9a4a80d25fd903e2b532f470e7203f" + }, + "vllm/compilation/passes/utility/noop_elimination.py": { + "path": "/vllm/compilation/passes/utility/noop_elimination.py", + "sha256": "8abf85d28c13f95059f2acbc0275b9b9ed2ad4990f7c5763bbe3067a4aa629ce" + }, + "vllm/compilation/passes/utility/post_cleanup.py": { + "path": "/vllm/compilation/passes/utility/post_cleanup.py", + "sha256": "1c38b14fc209165cbcf8ca763a17ac4e528b97f59b573e5d52df2cce7d758de3" + }, + "vllm/compilation/passes/utility/scatter_split_replace.py": { + "path": "/vllm/compilation/passes/utility/scatter_split_replace.py", + "sha256": "138402cc3097768a32e9e5b8d1a054b6176e494bddc8684e23ca2dc5fdc3fdda" + }, + "vllm/compilation/passes/utility/split_coalescing.py": { + "path": "/vllm/compilation/passes/utility/split_coalescing.py", + "sha256": "0b02acd9e1ad43d7b3e128b914e969b9580773f2818078846dfbf163a8bd0871" + }, + "vllm/compilation/passes/vllm_inductor_pass.py": { + "path": "/vllm/compilation/passes/vllm_inductor_pass.py", + "sha256": "4f83ffb67f834a214221d810c7843a8e41eb4e5930eb40adbd8cf054ff6fb9c6" + }, + "vllm/compilation/piecewise_backend.py": { + "path": "/vllm/compilation/piecewise_backend.py", + "sha256": "6525318ff3ca2e4978e24dd9232a7ae0a02e920e19604b83db6f6043d1f8a54d" + }, + "vllm/compilation/wrapper.py": { + "path": "/vllm/compilation/wrapper.py", + "sha256": "c1b1fca679ea16aa07a696831a810c0d531da2bb0ea32dd6f1a95cdaef36de07" + }, + "vllm/config/__init__.py": { + "path": "/vllm/config/__init__.py", + "sha256": "56fb0cb1598d297e4f95a97e5d86dc624145d1532f5faa432b7d2834d7155bd5" + }, + "vllm/config/attention.py": { + "path": "/vllm/config/attention.py", + "sha256": "c41f345b512d9b7df882328257eb3a6381f41088c11ae83b5ecd8a9e8265d1bc" + }, + "vllm/config/cache.py": { + "path": "/vllm/config/cache.py", + "sha256": "f1c226ba679c884930dbfcaf41a57248b137a9a20d3ed8e3d3b31752bb484c07" + }, + "vllm/config/compilation.py": { + "path": "/vllm/config/compilation.py", + "sha256": "c9cec5c7200e8e559810ec8c30113ad61dab6780f9f7fb3c116bd0d9b5a43065" + }, + "vllm/config/device.py": { + "path": "/vllm/config/device.py", + "sha256": "7b82eee02ceb5842337451a27a3d5729920c47e25e8f6bf3997f5146f9330a9c" + }, + "vllm/config/diffusion.py": { + "path": "/vllm/config/diffusion.py", + "sha256": "1fa9fd2478a866098a28a3586b55af2f9738656b7813a55d76539c10dd99fe8d" + }, + "vllm/config/ec_manager_config.py": { + "path": "/vllm/config/ec_manager_config.py", + "sha256": "418b387dbe7bdf67deddce331c205768a2d42aea37141f59fb02a8a1528e3552" + }, + "vllm/config/ec_transfer.py": { + "path": "/vllm/config/ec_transfer.py", + "sha256": "0eabb2c25194676d23c6acf59562672a1dd24415043ac5737d621ce0d681ec70" + }, + "vllm/config/engram.py": { + "path": "/vllm/config/engram.py", + "sha256": "34043a22385a041d4e9be8857f64174c990c2ca8308b97b6a952b5ab96c20ee5" + }, + "vllm/config/fault_tolerance.py": { + "path": "/vllm/config/fault_tolerance.py", + "sha256": "b166b24373d599fb15ddc575e3061cf0dcb42174d0369d8468008e7ffbb2a4e2" + }, + "vllm/config/kernel.py": { + "path": "/vllm/config/kernel.py", + "sha256": "27e23c584cf862f4091858db6dc85bbc2a01f4baf9dca3f232ae6f3bac02390e" + }, + "vllm/config/kv_events.py": { + "path": "/vllm/config/kv_events.py", + "sha256": "b1dbaee3e6830e381e9157fe3bab0d65c357da88ff7cdf8b1e4b3a4e75c82a87" + }, + "vllm/config/kv_transfer.py": { + "path": "/vllm/config/kv_transfer.py", + "sha256": "506fae7a9d7f32cb3646156cf9249a856f6317dff6c4c85db70efd34418c429b" + }, + "vllm/config/load.py": { + "path": "/vllm/config/load.py", + "sha256": "bd6431c22e078362d749a56a2c84145432ebf2605d8bcfa2ac679182d18ed630" + }, + "vllm/config/lora.py": { + "path": "/vllm/config/lora.py", + "sha256": "ed6cf6575f5950f079a62f904caeae93d1a4745dd8c21788b74367883bcd4b08" + }, + "vllm/config/mamba.py": { + "path": "/vllm/config/mamba.py", + "sha256": "2090f791201ca45dd4f1d72b8651268890eb07574b6084721194eb8fdf612c48" + }, + "vllm/config/model.py": { + "path": "/vllm/config/model.py", + "sha256": "f4168b67cc93ce72ff2a6d4c66974223e32fd0f1fab4c05e44bd68a275e18d69" + }, + "vllm/config/model_arch.py": { + "path": "/vllm/config/model_arch.py", + "sha256": "2babe28329d7b60b4e205f6d72c687f0f66e6535aa2f20411469e5ec362f6b5f" + }, + "vllm/config/multimodal.py": { + "path": "/vllm/config/multimodal.py", + "sha256": "271911aee151f17f092228cecee82af0713e9a47340ffdf66834ca7638a50d22" + }, + "vllm/config/observability.py": { + "path": "/vllm/config/observability.py", + "sha256": "d57c59ec776477ab0a20e9f2b945bc954d8ea3737c869259480e9aa10dfb9f6d" + }, + "vllm/config/offload.py": { + "path": "/vllm/config/offload.py", + "sha256": "6f2db3d9a2730588473d5155811690c6241b167a21dcb62fbbd9ebb6386de42c" + }, + "vllm/config/parallel.py": { + "path": "/vllm/config/parallel.py", + "sha256": "f012ace89e3fb730a467f729f602679bc145c49f0d10721811c9d818570e7b2b" + }, + "vllm/config/pooler.py": { + "path": "/vllm/config/pooler.py", + "sha256": "9f01913dcb7bccbf9b672b16643f18471ae202455992e8afaf0725a17f2b3d08" + }, + "vllm/config/profiler.py": { + "path": "/vllm/config/profiler.py", + "sha256": "04d24fa1dc7cfedca6b5c7d9115f7f7021722fc46a5b15234a1e3b3a506c93e5" + }, + "vllm/config/quantization.py": { + "path": "/vllm/config/quantization.py", + "sha256": "acffc52f525b39a88efd656f1ed705ce3a1b758298bb0684fac7694776bc10b4" + }, + "vllm/config/reasoning.py": { + "path": "/vllm/config/reasoning.py", + "sha256": "2c4f7bdee48a9fb3d93787c4c32361c2411417cce452cfde86808d8759977861" + }, + "vllm/config/scheduler.py": { + "path": "/vllm/config/scheduler.py", + "sha256": "822179da62be4bca0619c8590082ae09123f5c4415f9cc2037be673748239edb" + }, + "vllm/config/speculative.py": { + "path": "/vllm/config/speculative.py", + "sha256": "9c642a87264339c0dbc1d0b57330572149df0f9d5e16c6893b9895e50a619e19" + }, + "vllm/config/speech_to_text.py": { + "path": "/vllm/config/speech_to_text.py", + "sha256": "bf4a566fbde6a1cec1e209070b739650c3302c12696739c88049cb8f723a4c3f" + }, + "vllm/config/structured_outputs.py": { + "path": "/vllm/config/structured_outputs.py", + "sha256": "55649776594349b8b4aa3e08fc4c88068366732a486d6fb235079188044aa829" + }, + "vllm/config/utils.py": { + "path": "/vllm/config/utils.py", + "sha256": "d035e9e488ba92b6c47a96cf05d9b2a850d53eda8a05115b22ff9af8dbc2fc64" + }, + "vllm/config/vllm.py": { + "path": "/vllm/config/vllm.py", + "sha256": "956b812e5a719bcbfa3a3958801361b38b9c928c96b8c073311bbb96376dfb7a" + }, + "vllm/config/watermarking.py": { + "path": "/vllm/config/watermarking.py", + "sha256": "30e6620a3cd7529f0736ad55e38bc326a6a78dee4552f0722208400041c94a1f" + }, + "vllm/config/weight_transfer.py": { + "path": "/vllm/config/weight_transfer.py", + "sha256": "92edd9e5ea90c97a8f3c5f20abf1734a105ee1f3f89e306e7ba87e758f1f767e" + }, + "vllm/distributed/__init__.py": { + "path": "/vllm/distributed/__init__.py", + "sha256": "97f28c30b32662af8cab163939e4ee423037f11630752e13b55cbc25a7d0ab71" + }, + "vllm/distributed/communication_op.py": { + "path": "/vllm/distributed/communication_op.py", + "sha256": "3c3f8ac60db38ece891d39dc1e2f6f1947ad438685893d2e5777d072320bd1b8" + }, + "vllm/distributed/device_communicators/__init__.py": { + "path": "/vllm/distributed/device_communicators/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/device_communicators/aiter_custom_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/aiter_custom_all_reduce.py", + "sha256": "f8eb027ce7a85d94af6260960ceb7f36fc6f1406c9af9c9b6285fddb3f178009" + }, + "vllm/distributed/device_communicators/all2all.py": { + "path": "/vllm/distributed/device_communicators/all2all.py", + "sha256": "1f1b69236acd3cd7bd94520fd6d591bfd31b57c4bc7c9f9f4161ea8bbd0c5f26" + }, + "vllm/distributed/device_communicators/all_reduce_utils.py": { + "path": "/vllm/distributed/device_communicators/all_reduce_utils.py", + "sha256": "ed0ab4dd05b2519a6313892e68824c97b540034664d7f8c3d031b322e33e1bfc" + }, + "vllm/distributed/device_communicators/base_device_communicator.py": { + "path": "/vllm/distributed/device_communicators/base_device_communicator.py", + "sha256": "4a7670f12ed7c7621b25d476e2687c24ca01f3be183fff4a6a25337596fe506b" + }, + "vllm/distributed/device_communicators/cpu_communicator.py": { + "path": "/vllm/distributed/device_communicators/cpu_communicator.py", + "sha256": "e1856c8e91cfbbb4d9ce990c1236e258ba4021e226afcbab645653380b38d64b" + }, + "vllm/distributed/device_communicators/cuda_communicator.py": { + "path": "/vllm/distributed/device_communicators/cuda_communicator.py", + "sha256": "102d95c67ec798cf352b817ba92e8abc9da37f30d1bbdf3aab45d3927b627b93" + }, + "vllm/distributed/device_communicators/cuda_wrapper.py": { + "path": "/vllm/distributed/device_communicators/cuda_wrapper.py", + "sha256": "333b6d9ed173e7a18c7f2b6627a3c9c9ed88892ce52015f05e29d6d245e48ee3" + }, + "vllm/distributed/device_communicators/custom_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/custom_all_reduce.py", + "sha256": "a048c1327c23580805600c0c951831bec333b1ffc4eb26a0e3d34119c4f0c445" + }, + "vllm/distributed/device_communicators/flashinfer_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/flashinfer_all_reduce.py", + "sha256": "b4359760e9b55963676109a5c3a015fb82e190d4df1d021de9ee01e7814cbdda" + }, + "vllm/distributed/device_communicators/flashinfer_pcie_ipc_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/flashinfer_pcie_ipc_all_reduce.py", + "sha256": "8b67b0fc356a565095f56b475cc89c513e3a5eff051ab1c52e5beb0c1a79e9f2" + }, + "vllm/distributed/device_communicators/mnnvl_compat.py": { + "path": "/vllm/distributed/device_communicators/mnnvl_compat.py", + "sha256": "72ee1e6f9571b4c8ecbd9f60cd469d1b565cb79cab519a688a93f290906a2615" + }, + "vllm/distributed/device_communicators/pynccl.py": { + "path": "/vllm/distributed/device_communicators/pynccl.py", + "sha256": "882fb83c5a3c565a3f8fd664b79f5ceae566dca180019ecafd74bc8c11d9f8cf" + }, + "vllm/distributed/device_communicators/pynccl_allocator.py": { + "path": "/vllm/distributed/device_communicators/pynccl_allocator.py", + "sha256": "390e2576cbf4ae06341ca4dab24fc7e4d4f7c24dd444329ed05d828a9ce91460" + }, + "vllm/distributed/device_communicators/pynccl_wrapper.py": { + "path": "/vllm/distributed/device_communicators/pynccl_wrapper.py", + "sha256": "ce63c8da57bb88d4cf89956bd70bb63f0f44bfad468ddb37b765611551f6d99f" + }, + "vllm/distributed/device_communicators/quick_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/quick_all_reduce.py", + "sha256": "8aacb23e7c297b0ae2f80d99c5affd2e7517115d7874be51069d14a44db7b5f2" + }, + "vllm/distributed/device_communicators/ray_communicator.py": { + "path": "/vllm/distributed/device_communicators/ray_communicator.py", + "sha256": "332c37f65495b60564d61db59bc2d30ca0236adc33442d01464790bde9aec897" + }, + "vllm/distributed/device_communicators/shm_broadcast.py": { + "path": "/vllm/distributed/device_communicators/shm_broadcast.py", + "sha256": "f3e7a3f3ff713fccbd535e0d41650ee05bdf8677e83d4b90519910645022c30b" + }, + "vllm/distributed/device_communicators/shm_object_storage.py": { + "path": "/vllm/distributed/device_communicators/shm_object_storage.py", + "sha256": "e097bf7ac0141fe8db4131e8fd553ca2ad5b0600b22a56f3924af6b795e7207c" + }, + "vllm/distributed/device_communicators/symm_mem.py": { + "path": "/vllm/distributed/device_communicators/symm_mem.py", + "sha256": "b06e3ddb9ae880a30ec4a103ce32eb9794223bb0293832e89572af28adaaa544" + }, + "vllm/distributed/device_communicators/xpu_communicator.py": { + "path": "/vllm/distributed/device_communicators/xpu_communicator.py", + "sha256": "527cbfb250760abc62096ee7cd612307b821f21b72dee1687ad866620ec89b6d" + }, + "vllm/distributed/ec_transfer/__init__.py": { + "path": "/vllm/distributed/ec_transfer/__init__.py", + "sha256": "061405bb51df7409c9938b62e25caa8bd6ebf85da6d1700dbd4affe2a0825135" + }, + "vllm/distributed/ec_transfer/ec_connector/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/base.py", + "sha256": "22d4913375bb622473fbe1a77f9376b804949cd8a7e31e9518208f9561d161e2" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/common.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/common.py", + "sha256": "e2267abd8d00a6d2605e1a82ea5c73396a71b427452eab469fcca0134c334e7c" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/connector.py", + "sha256": "72cd35d9fd754a2992dd090a8af13c91e0789b4038ac29276750d823120235db" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/base.py", + "sha256": "19e8df88b0fa831997896355ecdd49e0d86cb074cd7ae28aed0b328b0bb3ab2e" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/zmq.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/zmq.py", + "sha256": "435641c0e37551ab4937855abd067be26905b91215e759cbd9d28a419a34ff9a" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/base.py", + "sha256": "3be698aeb67d32ee3741e76b2fb71806941c587578583acf8fbc42fbf22b46a5" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/nixl.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/nixl.py", + "sha256": "03af8f6549a6027b7262a482907af591e45f28b9b1c5a3408bbc6600e38797e5" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/ec_shared_region.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/ec_shared_region.py", + "sha256": "e40607952c9920024455eca2f419e8c3ef1de9a4d8b27c147a33bb941b8c08b1" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/protocol.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/protocol.py", + "sha256": "05878336884396bfbef77b96b0fa6359f6fa0aba912961f14a84f5a436f27038" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/__init__.py", + "sha256": "01c42385bf3a55cff09cc05ba956f6dd4b8b6b986bf4d6eca4e566cb045b48e0" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/embedding_cache.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/embedding_cache.py", + "sha256": "7359fb980af1fc30b3253681310ef636e2b4a19134e04a93270c9c45de2572d8" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/session.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/session.py", + "sha256": "5973548a919e13c866222b91d502686a6757a31e5a5664b879bf2887ed9fb212" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/utils.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/utils.py", + "sha256": "160ac665f20f2c75b343c1e784084f2b0b4d1cf8fdb28ee15deee4dc8ed0ce45" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/worker/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/worker/__init__.py", + "sha256": "f08d296d3560c42173ae8af961af4a768033ccf1e36e9c17c0cdd53013d0c52e" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/worker/descriptor_buffers.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/worker/descriptor_buffers.py", + "sha256": "be7c81be214e995da8499105ba485854d9c19d6f8e905f8f1b87b83694ca0864" + }, + "vllm/distributed/ec_transfer/ec_connector/example_connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/example_connector.py", + "sha256": "09022ce07a89114bb65d9befd2e60873453aed11bbac8c0a75c1e6084e785a5f" + }, + "vllm/distributed/ec_transfer/ec_connector/factory.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/factory.py", + "sha256": "d6cedca0a99c3dd2b03cd1c15d17472b983e3f7d8f5baf4a12eecaf6abedb817" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/__init__.py", + "sha256": "1cbfc2f95f8f4d48a9253056eb1fd4b562062884e3fd5cb6571583c352fc16f3" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/config.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/config.py", + "sha256": "98c60696f79d1de67d2364cd9e8a42a393b5c8e17ed9af2f971368e47891d7b3" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/control.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/control.py", + "sha256": "58e0d1a423fbe958bfa586ac26a17107e08d0b31d044b4c74ab4dde880e7ca9b" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/memory.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/memory.py", + "sha256": "d5e90b1348de670a70f110d58eedcbdbd053db72c21dd007c3f5275c53951149" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/metadata.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/metadata.py", + "sha256": "497a7e6dfffb7fce80a41d5989f96119b970c143df77bb9d0f9c91d7a46e8c42" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/producer.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/producer.py", + "sha256": "97fa4d0b19475574778eab02f55fad73db9642beb9156da890314fd53fa1a7ab" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/reservation.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/reservation.py", + "sha256": "4790bc65cde4db5f17733ca2c2910980ba594a8a9b79ee27c5b957dffd4c1113" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/scheduler.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/scheduler.py", + "sha256": "53004b62529a31fdd80dfb2e6026610b95041a77e91f731ae526fefd84e7968d" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/state.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/state.py", + "sha256": "92f375d6c5cc9c83dbe95a7977ad8eb0f1b5629ccee92968bcacdc94eee15d65" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/transfer.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/transfer.py", + "sha256": "ada2113a5402054f1149d3edc2537f4e5e1bd696c9b17291c9f2b4cbf6b59753" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/worker.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/worker.py", + "sha256": "89eb91bb64845b3b121d502972a6b04d448714253becd2ea662e5691cd5acdd7" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake_ec_connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake_ec_connector.py", + "sha256": "aaebab4711bc00dd0c622dfbfd8639fc41e7ed5d1658d7d68fe33e4d5fbef3ba" + }, + "vllm/distributed/ec_transfer/ec_connector/utils.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/utils.py", + "sha256": "11b9014b9c0697f8846deff1a55a22fa86a15dc2ac3e139442fb6d513ac03059" + }, + "vllm/distributed/ec_transfer/ec_transfer_state.py": { + "path": "/vllm/distributed/ec_transfer/ec_transfer_state.py", + "sha256": "9487a41f23fa1a4fa6dfca8b42b8e97a0ee19d8406ffd1dcf4bef66315180827" + }, + "vllm/distributed/elastic_ep/__init__.py": { + "path": "/vllm/distributed/elastic_ep/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/elastic_ep/elastic_execute.py": { + "path": "/vllm/distributed/elastic_ep/elastic_execute.py", + "sha256": "b8f60a4183c79ff6051095b5f95bb385bc7fea0cffe8cd9ebc9087ab0e9f01b5" + }, + "vllm/distributed/elastic_ep/elastic_state.py": { + "path": "/vllm/distributed/elastic_ep/elastic_state.py", + "sha256": "fbf049199841a086fdf2fc1ab8498ef017ad3bf319db65c3ae61acbb536d2e10" + }, + "vllm/distributed/elastic_ep/standby_state.py": { + "path": "/vllm/distributed/elastic_ep/standby_state.py", + "sha256": "15282597550ebd0e07b8492ff192aea1ec0dcec8f0ad34009123e1002cc140c1" + }, + "vllm/distributed/eplb/__init__.py": { + "path": "/vllm/distributed/eplb/__init__.py", + "sha256": "1b9c2ee22abb5888c354c5aa01f0944f253e5e24e135d019778398bbe495a628" + }, + "vllm/distributed/eplb/async_worker.py": { + "path": "/vllm/distributed/eplb/async_worker.py", + "sha256": "424328600ad1003286fc5dfffa1f9482007314c060947818b2f94a8b97811f5e" + }, + "vllm/distributed/eplb/eplb_communicator.py": { + "path": "/vllm/distributed/eplb/eplb_communicator.py", + "sha256": "ba30d9d40e7b81d3f42aa9041d2f328edca4073cfe2de920285eb68375501ed8" + }, + "vllm/distributed/eplb/eplb_state.py": { + "path": "/vllm/distributed/eplb/eplb_state.py", + "sha256": "2f06bc8c63f3fdf55edb5032ae55c0ffcac3e67720ce74ea312e3d141b12acf4" + }, + "vllm/distributed/eplb/eplb_utils.py": { + "path": "/vllm/distributed/eplb/eplb_utils.py", + "sha256": "058af6104faa6d4085c1dca80bbe60d92bf0a7ec9cd92c775a180546c9d8c9c3" + }, + "vllm/distributed/eplb/policy/__init__.py": { + "path": "/vllm/distributed/eplb/policy/__init__.py", + "sha256": "daeb266c88442832b1ab8c8c4cc064891b38b9e9ba00aea324f926c87dc6d37e" + }, + "vllm/distributed/eplb/policy/abstract.py": { + "path": "/vllm/distributed/eplb/policy/abstract.py", + "sha256": "b9fd34c28bbfdded03360d7f3f6f8fb978e82689190d7ae4501dfe520e958c62" + }, + "vllm/distributed/eplb/policy/default.py": { + "path": "/vllm/distributed/eplb/policy/default.py", + "sha256": "3b54229e6240d050480390f6b29d4744fd38437d23719f78a6decf7002296a29" + }, + "vllm/distributed/eplb/rebalance_execute.py": { + "path": "/vllm/distributed/eplb/rebalance_execute.py", + "sha256": "b387e228791149018536eee96cf955b33ba79d801cdc36849d1b47a580ec2597" + }, + "vllm/distributed/kv_events.py": { + "path": "/vllm/distributed/kv_events.py", + "sha256": "de08f01e8736881560256c350a3b6418999dd4aa30f9c6ec9159527f7ed6899a" + }, + "vllm/distributed/kv_transfer/__init__.py": { + "path": "/vllm/distributed/kv_transfer/__init__.py", + "sha256": "c1be4e58ec6923bae607a355ad22891c740f056a69ff7358b1e10ea3fd2680ea" + }, + "vllm/distributed/kv_transfer/kv_connector/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/base.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/base.py", + "sha256": "2ae2a2c48f5731f3533166a75440fe91e764332305b5d713df840edba970789d" + }, + "vllm/distributed/kv_transfer/kv_connector/factory.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/factory.py", + "sha256": "add99c93c587b0098b90b1f8fd6940bdd1f15c236c5c6f1a258411863cb902d3" + }, + "vllm/distributed/kv_transfer/kv_connector/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/utils.py", + "sha256": "317ed40dc837671ca6e666165222e641a0f9b3992aea63bbf54de7e13d40b3a4" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/__init__.py", + "sha256": "5beb6ccad12fdcfe1581982da6f18321caca50e73a6b3259ebf3c8dc8b3ffcca" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/base.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/base.py", + "sha256": "97af64220475c6c9e8273438d7b5138b105ebe6944beb783facb36a3bb76f31b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/decode_bench_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/decode_bench_connector.py", + "sha256": "b4151c88cdec28f1ff9259047abc17baf23b892f4b68769a93bf26e0442b9017" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/example_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/example_connector.py", + "sha256": "6226876ef52d10d0d284d29c337ab44698e8bac6abdb2e0ece53b5756c55d068" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/example_hidden_states_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/example_hidden_states_connector.py", + "sha256": "58c22534dcad0fb73599a2d70a2fb104d5b612a4723be5e777f56a56fe07892c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/flexkv_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/flexkv_connector.py", + "sha256": "de4f68c3bd565ed898e47e0b2980049b966ff31888f1957050d30995d4953762" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_client.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_client.py", + "sha256": "bea6ecff2be281c7e96c1551c7bf463cbb01f2964696067c0ebdb683844f9aab" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_connector.py", + "sha256": "e67ed58015090e5eea9d499883f2a9422673d07f8bdbe0ccff7db15d2460de13" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_metadata_server.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_metadata_server.py", + "sha256": "6800e5cf37809f8a8e28c469c14a434db288bc3bf83a8b62ee06910a20c2da19" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/common.py", + "sha256": "8f2c02c08227a9093e6aeb183961aba36b7812cfc29b8c047a2b2c9d82f79c15" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/gather_scatter_helper.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/gather_scatter_helper.py", + "sha256": "08c1b43de34fbeca77357d7576ac1d17cba974b59d695562f68bb713061e7b54" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/hf3fs_mock_client.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/hf3fs_mock_client.py", + "sha256": "bec61a9b0c4b9124b2292d7646d76411da44396389349b53cdcbc46353c8780e" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/connector.py", + "sha256": "8c61094ce0a3a702908f9576f69482e6bf314738a2cbe33a7d3b47258fa0ab43" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/stats.py", + "sha256": "d9383a6ad6ab6b8f812d29d90495407b770eeddb79b86e9d0e3216c0bd16e0ed" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/worker.py", + "sha256": "251c0d8e57e4739c03ce3e1c899a95ff5b1752eb27676c28ab88c4ebd62c4776" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_connector.py", + "sha256": "5991f9ff8832df32bd421eb67e48237270ea0a408180e523810bb43606acf8f3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/__init__.py", + "sha256": "c53be9796e76cde637514bfc40a525d8c09bb2784b406cb516790d8285dfe433" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/multi_process_adapter.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/multi_process_adapter.py", + "sha256": "6480d67b31ed603027a83edf327880a38aee45eaeee2da9a4efa93e95527c166" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/utils.py", + "sha256": "e204fa6a853ac9c122d7a4e9d146902230f81c48d4321ed5edfdbf979dd49ba2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/vllm_v1_adapter.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/vllm_v1_adapter.py", + "sha256": "e6fe55049c6b007248516d69640e2f3a4809f9d286091a1014ae0949987fa8f1" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py", + "sha256": "c712c386a7c57bf0355a1441ba574232c3aa5498fcb70713a2b3f5d18b64f9c1" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/metrics.py", + "sha256": "de1b1797d0448f74370919dbb0278767f390e8f59e00a0c0528abefb302babc2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_connector.py", + "sha256": "516be01320e64b0110e102eeb69a6ba766dd5ac8cb3036db6b97b7d54413323d" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_utils.py", + "sha256": "26877610463fa8e9d6b092772f2551bcc0c3ac794cbe63996df0414666a8ebba" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/rdma_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/rdma_utils.py", + "sha256": "716e5042edecaba36c7ca763474988f32fa09c2668b8260260149df610af8f83" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/stats.py", + "sha256": "f39b2f0b1db2e4f922e27e684a3f7bbf5bb279b82a0a8c3bb0c7ae69b6d14d24" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/connector.py", + "sha256": "17a350bdb89e17e415d6c52a48684dc15c35a804378daf03e1f3bee1b1b123a3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/coordinator.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/coordinator.py", + "sha256": "a8eb6c2157a96e8d25233b82347ac8409a41d6390b4f2c64242119c05911010c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/data.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/data.py", + "sha256": "d3cfefdb4165a24995749cba452641b318065baa95bb1bae62f922a2f8886e7b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/metrics.py", + "sha256": "f2b9ef8927632d142aad11a374d0725c6e619ea0bb7fea9eda3f3895eb7d277a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/protocol.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/protocol.py", + "sha256": "ccb1cf6a84a932a375215627d2aaac482c351a05df015d636d05373a6845b7c8" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/scheduler.py", + "sha256": "283849ff581ec206444cdf5621622377f1c925e8d7e05cb9294af2f3a5094e79" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/worker.py", + "sha256": "55f1682dfd1ed7af689166421337126a0e1d08afa4774a242e098d79e0c1e95b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_common.py", + "sha256": "549bb4fe22dca5095515b9c0712c31cc81a9d4923881e9f112317640fd8c04ab" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_connector.py", + "sha256": "c0f474bc34b579d889fae92eaf43eaca241be51a4697a187a942f0df4e6b6a98" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_engine.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_engine.py", + "sha256": "d842f3772fc6588d5a329a67572324cb74709aa3df4033e64c791a1e706c8e88" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_layout.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_layout.py", + "sha256": "2b4ec046a78897236b0626939bb828b6ec095355097d10bca39e5f3e1c992553" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/multi_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/multi_connector.py", + "sha256": "12d8387239f3194f2cb63ccbd64824648047210323572d66671e6a1eed349fc3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/__init__.py", + "sha256": "cc3145fe3b6d219a267bf40a0f7c0cc9430e4289f94acab2df761b99b671e7ba" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py", + "sha256": "7a1db8c54e4cd846bdac747344f2aea2c2fcf507817928796063225223b7e169" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_worker.py", + "sha256": "49a2e4faf99bef146b5a1d4d18d48f240b1e561c438252274494b359db96ef52" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/connector.py", + "sha256": "b6a0dc916d052f344be72ecfcb111509c13580102c11a860fa726cf0888949a9" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/metadata.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/metadata.py", + "sha256": "2b23a07c1ec5ac5490c3b818737c7192e344ea9f52cd5623f75939f741ab4e21" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_scheduler.py", + "sha256": "ac3daf8e2246581fec84ab28f2133569421b62c32a120be4923e2f4d0f2f9de9" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_worker.py", + "sha256": "e5060c9b6cf022de35ca3d1da7a369cd6a6a2dea26219af9f7633aaf78af8a76" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_scheduler.py", + "sha256": "2d9008e33937a4d6c5cf9cc2f96160f2bdbc8e987fe37f0798a7fd7eb84c9572" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_worker.py", + "sha256": "87de3ea383dd3aa95fb2c287ea26ded8a330859cc1295f9faa69047e80865c2c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/scheduler.py", + "sha256": "09f1bfe7075b926b26a94529480e33b62c3ac273ff826f6c502084f08b1b2a08" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/stats.py", + "sha256": "3e710654e0b68d1a8592f0c4735c81b22f4bf698fb1a2dfea126d35bf2dd1ef2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/tp_mapping.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/tp_mapping.py", + "sha256": "2d43607f98701b2fad6cc0ac2767619a80b7fc2b3a3c2eb6ed0da4fb05dcd8f6" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/utils.py", + "sha256": "93de863fc8307a61d40b62f1b176b57ae93c363d34b9e9ddc8e666265b6d45dc" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/worker.py", + "sha256": "5134a36ac100ce7a64f5311029a37ac12c38d91093f63100f51f7fe53ea7c3ee" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/canonical_mapping.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/canonical_mapping.py", + "sha256": "e0b3c6f9806a650e0370c43c5068fc31c0fec94615089e15fdf270d7d96f2b64" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/common.py", + "sha256": "9b3f042c6fa1581d10e8f688d2d9bc927bb41b780a9ea01f514d57228e20c978" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/config.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/config.py", + "sha256": "aea82e60889e78dcad8564ec8285b65a6a372824a1545a98ea8e78b6f4fd418a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/events.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/events.py", + "sha256": "d7039b67be95fd444966628184040a94880873c0611c0e6e7525a22650ffdefb" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/metrics.py", + "sha256": "13d76df014e86691f58dc89a879f9808b124690c9267dd5fa3b2d4004d4c5fdf" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py", + "sha256": "2c5282f4a3165cd787fb355e215e3869f1bdd3f2c795b2155fc537c9d135191a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/worker.py", + "sha256": "acc2df53262441dfc6421a3af7f0cbd68cbfaedbd42bbc384d8e1da2d965d194" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading_connector.py", + "sha256": "cdc16ca7339a10e1993bd6220e6273f86a4e99779f58f25098a24ad31bb0dbd8" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/simple_cpu_offload_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/simple_cpu_offload_connector.py", + "sha256": "96238ca82ccf07a1eeb59b8f66de17b09034e3eb993ad9a0a836511d3f69706b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/ssm_conv_transfer_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/ssm_conv_transfer_utils.py", + "sha256": "59a949709482e65a007fbe5352fe9b4bb54c2dcc10ad2c1c41f754b6e13299f4" + }, + "vllm/distributed/kv_transfer/kv_transfer_state.py": { + "path": "/vllm/distributed/kv_transfer/kv_transfer_state.py", + "sha256": "2e5fe09438d6e2ee642f8a26cf7dcf632e870d955d30baf002b76a8bfe836d05" + }, + "vllm/distributed/nixl_utils.py": { + "path": "/vllm/distributed/nixl_utils.py", + "sha256": "0bffa3c052c9f67472b1c0bc3816114891b010c968bf4b8a292e7da4d687db53" + }, + "vllm/distributed/parallel_state.py": { + "path": "/vllm/distributed/parallel_state.py", + "sha256": "d9b10ad56833ebc08a753e1a050ef0989c30d4134021b7b7b00150b7bd01adc6" + }, + "vllm/distributed/stateless_coordinator.py": { + "path": "/vllm/distributed/stateless_coordinator.py", + "sha256": "f52848fbe985ed47b1f3e3ca555314736ca06436e8d738ab4390101f0672dcb0" + }, + "vllm/distributed/utils.py": { + "path": "/vllm/distributed/utils.py", + "sha256": "792146b357139e705064a68d3b66858de8a0baaca4dc7db1232fa217d45db231" + }, + "vllm/distributed/weight_transfer/__init__.py": { + "path": "/vllm/distributed/weight_transfer/__init__.py", + "sha256": "3fb9d4712b7c131d522f5e76e73cd8c333f3cc7af86e2d5ecf9b61b57b3b7f5a" + }, + "vllm/distributed/weight_transfer/base.py": { + "path": "/vllm/distributed/weight_transfer/base.py", + "sha256": "8ab06feb04f1379d0558fbdb77fde46bc84f179e0a26742cabab937e88caa38d" + }, + "vllm/distributed/weight_transfer/clients.py": { + "path": "/vllm/distributed/weight_transfer/clients.py", + "sha256": "ff85c79c350241e6d2749ca23c9d295a3289b4b62bfdf0257d32eb94a0151d36" + }, + "vllm/distributed/weight_transfer/factory.py": { + "path": "/vllm/distributed/weight_transfer/factory.py", + "sha256": "4e979eeac8c5bcdbffb10eb4765cfb30120fa7595c6c2561d3fa1a966ced61c8" + }, + "vllm/distributed/weight_transfer/ipc_engine.py": { + "path": "/vllm/distributed/weight_transfer/ipc_engine.py", + "sha256": "1af578293f387a19073c322b24143c3ae4716ce0c5d2bac2a4ef26fe20119330" + }, + "vllm/distributed/weight_transfer/nccl_common.py": { + "path": "/vllm/distributed/weight_transfer/nccl_common.py", + "sha256": "7b2ef7dc7481c3f478f17c49aa36c7bed54142ec5c93d36ed8426c8fdf09e500" + }, + "vllm/distributed/weight_transfer/nccl_engine.py": { + "path": "/vllm/distributed/weight_transfer/nccl_engine.py", + "sha256": "7fd020c919dc7b4723fb78e64da977b180d0fef0cd21df955a037b848dbaa008" + }, + "vllm/distributed/weight_transfer/packed_tensor.py": { + "path": "/vllm/distributed/weight_transfer/packed_tensor.py", + "sha256": "d0a27fb0be1dc029bd5a1d44fdb57a5e54aa4cd74308bedc339e86ac02c7494c" + }, + "vllm/distributed/weight_transfer/sharded_rdt_common.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_common.py", + "sha256": "be0b13801f24e7b62999b19d733c030510353603a2d5320d5dc98ee02daf22a2" + }, + "vllm/distributed/weight_transfer/sharded_rdt_engine.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_engine.py", + "sha256": "2f791970b4815511a7578ef6c957e7da97b071d26a39087a09a17475909791ee" + }, + "vllm/distributed/weight_transfer/sharded_rdt_fake.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_fake.py", + "sha256": "ee11164e17b5f2793252ce77741b8b94e0583046abf896a590131b2008d1fbb9" + }, + "vllm/distributed/weight_transfer/sharded_rdt_trainer.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_trainer.py", + "sha256": "dd413ff461d41826ccd3eb87d3df22f6cd7f24e09aac7644e3e5b40d7beec484" + }, + "vllm/distributed/weight_transfer/sparse_nccl_engine.py": { + "path": "/vllm/distributed/weight_transfer/sparse_nccl_engine.py", + "sha256": "e11b409454dda2b05ea34e8115ac19027c5e65cb2a5e9682c494f16a50e978f4" + }, + "vllm/model_executor/determinism/__init__.py": { + "path": "/vllm/model_executor/determinism/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/determinism/batch_invariant.py": { + "path": "/vllm/model_executor/determinism/batch_invariant.py", + "sha256": "af8f8d256a48fc214edf426fbe891fb15bd8b1d7ae98b811c736ff1eb0fae798" + }, + "vllm/model_executor/determinism/batch_invariant_configs.py": { + "path": "/vllm/model_executor/determinism/batch_invariant_configs.py", + "sha256": "72ea0d4df0ab5ae288abb7df5c203d2ad5f1709c7295d87ec72da775fddc1b7a" + }, + "vllm/model_executor/layers/fused_moe/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/__init__.py", + "sha256": "64a32665be6d5afcfbaf7a0915717267278b66b880b908b0263ea58f08e51b5e" + }, + "vllm/model_executor/layers/fused_moe/activation.py": { + "path": "/vllm/model_executor/layers/fused_moe/activation.py", + "sha256": "78dec0e85e0c040304515f64ccf8f2c6a7a2e5b9f1124a2138a97d9a02585541" + }, + "vllm/model_executor/layers/fused_moe/all2all_utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/all2all_utils.py", + "sha256": "dc4750a446f7de31d09a46034da5fdf479bc169af90f47aa9af8ae15e67b0828" + }, + "vllm/model_executor/layers/fused_moe/b12x.py": { + "path": "/vllm/model_executor/layers/fused_moe/b12x.py", + "sha256": "ee76cc6aa801e24be8ec78a9e8502061ad48667d5ff8711e43f68fba912425bd" + }, + "vllm/model_executor/layers/fused_moe/config.py": { + "path": "/vllm/model_executor/layers/fused_moe/config.py", + "sha256": "a3a87cebcc7ac85d73f471dcfafc2d899c6fc08f264777b74a0e919adac9e03f" + }, + "vllm/model_executor/layers/fused_moe/deep_gemm_utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/deep_gemm_utils.py", + "sha256": "8fdcd857eb333f9c68902105f157568d52067c94ba1e2df6dbfe0474ef1f4c02" + }, + "vllm/model_executor/layers/fused_moe/eep_reconfigure.py": { + "path": "/vllm/model_executor/layers/fused_moe/eep_reconfigure.py", + "sha256": "9d7580265e8563e1140c2bb4c3a81a35ddd54903f5ec0a2720ffc064681f02f9" + }, + "vllm/model_executor/layers/fused_moe/expert_map_manager.py": { + "path": "/vllm/model_executor/layers/fused_moe/expert_map_manager.py", + "sha256": "308c00f63fcb6f44518ec3a56d8f902c7bba75928c2e3aea30fbe1f3f473973b" + }, + "vllm/model_executor/layers/fused_moe/experts/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a16_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a16_moe.py", + "sha256": "53deea255175171971422d14082ad139b5ec7b62e21429a4c7cc0ebbefd29cdc" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a8_moe.py", + "sha256": "f3fc51b95ed89862381908a0134e326228827f44854248db9585a9c4899c34f4" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp8_moe.py", + "sha256": "af6db1760961a5a71234f8b1cdf42e9e30a236e13601b0826a75110b79724948" + }, + "vllm/model_executor/layers/fused_moe/experts/batched_deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/batched_deep_gemm_moe.py", + "sha256": "b0cd4ea706583518dc608fb56f832fc3595f24bd863b03ef1e8c22b36b873508" + }, + "vllm/model_executor/layers/fused_moe/experts/cpu_int4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cpu_int4_moe.py", + "sha256": "67170af3ba9dc4c4f71d78a72efc3fa4e366eac614936a79911dae5c75ac1864" + }, + "vllm/model_executor/layers/fused_moe/experts/cpu_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cpu_moe.py", + "sha256": "0754cd4ff1b28e6d3932a67609d335acefd28f95a841f0492923813356a6d81e" + }, + "vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py", + "sha256": "db901bdbcd3fdac23a1d74e39c51e67f14a82be787b2fd704ed1e787372ae868" + }, + "vllm/model_executor/layers/fused_moe/experts/deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/deep_gemm_moe.py", + "sha256": "16911a64a72eafc26a1bcb544a91f90144d85dc41e3ee57cf20e89925227bbb7" + }, + "vllm/model_executor/layers/fused_moe/experts/fallback.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fallback.py", + "sha256": "1bdd0a4f2ebaa40ec96a5aacc07aee61511af59e6324ce456aa65003b6e2991a" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_b12x_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_b12x_moe.py", + "sha256": "e613afe5da2742e42c717c1a0a56bd9e1c7e3e0452a828db0013d81063518954" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_batched_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_batched_moe.py", + "sha256": "295254dfeeec8df3eb8110e6f659a946cb9cded3de1565ecad4d741b3c3f3e00" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_moe.py", + "sha256": "08578bcd0cf72d6a470e40950175e73639efaa6d8d23c6da0869345312b229c9" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutlass_moe.py", + "sha256": "52887cec5fe628e0a4e7793deb546b40f6c29f7362b3b436c10ca36934ab9826" + }, + "vllm/model_executor/layers/fused_moe/experts/fused_batched_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fused_batched_moe.py", + "sha256": "2435587fc7f8fe8ea341ea0eb8f14c11f3f5b31fbbb9b29ce569ad3bace6e6a0" + }, + "vllm/model_executor/layers/fused_moe/experts/fused_humming_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fused_humming_moe.py", + "sha256": "a6830a76ff7f4cd3479b9c8372a30d03e8301604555cbdbcd9ac89a813b7431a" + }, + "vllm/model_executor/layers/fused_moe/experts/gpt_oss_triton_kernels_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/gpt_oss_triton_kernels_moe.py", + "sha256": "1613a7a6b256e8faee6fdcfae84f293492db6229d28ceb3e8a8d6093af480e36" + }, + "vllm/model_executor/layers/fused_moe/experts/int4_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/int4_emulation_moe.py", + "sha256": "f12857caf0671a341687ad3c5f48616b816ed51e1bcbdefa0a7edbecdb81a79d" + }, + "vllm/model_executor/layers/fused_moe/experts/lora_context.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/lora_context.py", + "sha256": "9b41eefaaa57c5dd0dc54217ef95978821b0c52e90ea4db8b0752e08452bd3e5" + }, + "vllm/model_executor/layers/fused_moe/experts/lora_experts_mixin.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/lora_experts_mixin.py", + "sha256": "b2bc55ed6be98b526c6a5698e2d98300650e78555f56b1820e58c04888e2a373" + }, + "vllm/model_executor/layers/fused_moe/experts/marlin_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/marlin_moe.py", + "sha256": "93916b721548e6194dc70cf6cec224b4b1456a0cc0980235e97beba7bf36541d" + }, + "vllm/model_executor/layers/fused_moe/experts/mxfp8_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/mxfp8_emulation_moe.py", + "sha256": "d09c62ad1398c51ff6f515f2a61014ee9e9a9798d0fe9762c47f446efc5edbef" + }, + "vllm/model_executor/layers/fused_moe/experts/mxfp8_native_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/mxfp8_native_moe.py", + "sha256": "01a42cebf18189e566034111b2145573c655319e8af1a56db60d53a319c40613" + }, + "vllm/model_executor/layers/fused_moe/experts/nvfp4_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/nvfp4_emulation_moe.py", + "sha256": "f24467762b60702f0df122ed64786be839a838a9b6cafaecbd04d35fbfedb189" + }, + "vllm/model_executor/layers/fused_moe/experts/ocp_mx_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/ocp_mx_emulation_moe.py", + "sha256": "dcaa60a9ebdb0bd8223b37af41f018ce7f95716ec7cd8526850f4433a579213b" + }, + "vllm/model_executor/layers/fused_moe/experts/rdna3_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/rdna3_moe.py", + "sha256": "e4abd802dc2f0ad9b338ebde397633c761d881c37813e2dc229902c526b597d8" + }, + "vllm/model_executor/layers/fused_moe/experts/rocm_aiter_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/rocm_aiter_moe.py", + "sha256": "bf09a7b783f5752d61cab76221b32b598d8846d801ee39dc9209d636c9659c6f" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_cutlass_moe.py", + "sha256": "ffce5ad627c540940d122d8df7981644b2eb35d07d480995c0f4f30517815fac" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_deep_gemm_moe.py", + "sha256": "c7209fa5e1ccb184a68b37a0706fc571a76696c2ae79802ddc7f889b1c29684d" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_moe.py", + "sha256": "806fbccfe30f5fbd578acf773add99bdf022b12d617958bd6281aef6de369701" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_bf16_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_bf16_moe.py", + "sha256": "76256de96fefece9c41ffb1108487919e24da364cf4412c6c3474498aba59137" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.py", + "sha256": "b54c7ceb45e5d07aa905f42ea44caccf85ca35ba9fb825d4c01947764510f68b" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_lora_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_lora_moe.py", + "sha256": "dd35a9e4242c0dc8d691168813e14bd5543e591f02ee529d0691e07651942c5a" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_mxfp4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_mxfp4_moe.py", + "sha256": "fe780f125a3dc3ba919659e9b85340bd32afcbfe47733a002bfdfb92eadf400c" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_mxint4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_mxint4_moe.py", + "sha256": "2106d67c2951aa690c4656ca58240d09c366cffe8cb4d9fd575df016c377cc30" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_nvfp4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_nvfp4_moe.py", + "sha256": "e938ac9f058f7c90b41c9610513239bec54a95304bfb5ff5f6897ebd54733d7e" + }, + "vllm/model_executor/layers/fused_moe/experts/xpu_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/xpu_moe.py", + "sha256": "2a11bac0cf9274d963315efd6eebdc62978b0b7aa02e8849ff2a562742f0b86d" + }, + "vllm/model_executor/layers/fused_moe/fused_flydsl_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_flydsl_moe.py", + "sha256": "0e74879ee5c72f616ae4064b9dff3b3a0b583b7fc70b8f92f1e8b730ecd5d39b" + }, + "vllm/model_executor/layers/fused_moe/fused_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe.py", + "sha256": "7072eb06237be9d33dcb0ef7101410f886a6363c98cbee70a014c68b70f639cb" + }, + "vllm/model_executor/layers/fused_moe/fused_moe_method_base.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe_method_base.py", + "sha256": "18dcfc469d3252749801bbf943857f58da85de1f2db8fdff5a9f4986a925dc68" + }, + "vllm/model_executor/layers/fused_moe/fused_moe_modular_method.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe_modular_method.py", + "sha256": "321c744eac1fcaffd6b1b2971204c8baa57dfec53e91e5d24140014d72d64f83" + }, + "vllm/model_executor/layers/fused_moe/hpc_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/hpc_moe.py", + "sha256": "2ca9c5d71b6fd91651027905e2b83103a8823845e053e7153e148cb8e0ee666d" + }, + "vllm/model_executor/layers/fused_moe/layer.py": { + "path": "/vllm/model_executor/layers/fused_moe/layer.py", + "sha256": "def0b4e13bcc1e4e21ee10644e647e2eda1acbf0cc01e76d6128abb59ea08224" + }, + "vllm/model_executor/layers/fused_moe/modular_kernel.py": { + "path": "/vllm/model_executor/layers/fused_moe/modular_kernel.py", + "sha256": "8dc4e0dbbf35b3aac8add63ca6f2a7bbfdadaabbd60826e24598b22c7d8e5c22" + }, + "vllm/model_executor/layers/fused_moe/moe_align_block_size.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_align_block_size.py", + "sha256": "c3f7fc2087836f0160a32ab99ceb1d8f6e87c793679da34dd672e225cb7fa31b" + }, + "vllm/model_executor/layers/fused_moe/moe_fused_mul_sum.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_fused_mul_sum.py", + "sha256": "112e72578002c3bff538418dac64b3b56d995994a2fc5e32b18d2cf3b8392a13" + }, + "vllm/model_executor/layers/fused_moe/moe_output.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_output.py", + "sha256": "6ea4cbd78f9efc7f842c5df246f553f08b991c3479b8b04b89902ed08aaf8e8f" + }, + "vllm/model_executor/layers/fused_moe/moe_permute_unpermute.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_permute_unpermute.py", + "sha256": "1adc592c6254d0c877d66be5406afbc822459c18a838f4bbd094a992e7609d06" + }, + "vllm/model_executor/layers/fused_moe/oracle/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/__init__.py", + "sha256": "4dcf941d50d48bb812de0f39e9194bf17a76b8035fe324889c6038f710fdc453" + }, + "vllm/model_executor/layers/fused_moe/oracle/base.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/base.py", + "sha256": "555bbcd18a3744e64eee4e953daabef3bd268a1bd4faf967d4cfd14d6074f685" + }, + "vllm/model_executor/layers/fused_moe/oracle/fp8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/fp8.py", + "sha256": "245bd36c285df1e6f7c51e52dcda31ad247894577a9f8d765613c2c2feae9aee" + }, + "vllm/model_executor/layers/fused_moe/oracle/int8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/int8.py", + "sha256": "c1b67886511bd966b162db5bca8930f04895fb37a969818a4a10f0726c59547f" + }, + "vllm/model_executor/layers/fused_moe/oracle/int_wna16.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/int_wna16.py", + "sha256": "cfffe8b8b290330be9d18ffa07aeecf296484395ff04df3147d99393e48b55c1" + }, + "vllm/model_executor/layers/fused_moe/oracle/mxfp4.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/mxfp4.py", + "sha256": "b7915e6779b5c88e7dcd2d227f003a8e45071d6d86877013067142d4feb64a8c" + }, + "vllm/model_executor/layers/fused_moe/oracle/mxfp8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/mxfp8.py", + "sha256": "9cfdc8102a04bb844dcd7ed88043bba96ec751794bc093da76c69aa8cf88cf48" + }, + "vllm/model_executor/layers/fused_moe/oracle/nvfp4.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/nvfp4.py", + "sha256": "735b4cdeb1258f11fb02320fc0c70cab5edaca468dd60b07b2d369389d2b0313" + }, + "vllm/model_executor/layers/fused_moe/oracle/unquantized.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/unquantized.py", + "sha256": "c8b8203bd0b73bb7f586f703607394d663f14c05711416ad42d45af564382223" + }, + "vllm/model_executor/layers/fused_moe/oracle/w4a8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/w4a8.py", + "sha256": "d7fa6e2982f20b34d5ce9c5ce28a61122762a3fcdd53d249479472a4f2316c6a" + }, + "vllm/model_executor/layers/fused_moe/oracle/w4a8_int8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/w4a8_int8.py", + "sha256": "6d6f9ca2e67b630002873de2f8d8a231d091c5c2f0f3354a9e8209449b481a4c" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/__init__.py", + "sha256": "2800113263a83c2632e522fb22790b29f63384da75d43de32f0ae2f95e8ae4c1" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/batched.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/batched.py", + "sha256": "d52425dd8c08e47cf8d9c3088daf3b1cc721c8667de4c738d04ba997f9a08ccb" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ht.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ht.py", + "sha256": "465cdf1d6cee91b2ee8c2e43abbea6e8408976e3048c10f44c089f34b415bc60" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ll.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ll.py", + "sha256": "f704922b1db680c4c212982a096e09d6b3eb97d89110313f86ed958a00df21b7" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_v2.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_v2.py", + "sha256": "8d690b016bbcfbc9eb599bcc36a6f798b2f1720c828f4347ea742e218c0cc60d" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_one_sided.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_one_sided.py", + "sha256": "acb57d8342af62bb5672036871cd4b27ecc7f37dfa7c894850bb860e6152a1f0" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_two_sided.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_two_sided.py", + "sha256": "cc5b00d6a157b6eca5afaaf7435165dbd1b4524d6d88bf75808cbe074a389f79" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/mori.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/mori.py", + "sha256": "8e9c3b5b1f0de13f467d95bf2f451cba0e4b0d9a1bdcf98da0988a3a9a79a045" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/naive_dp_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/naive_dp_ep.py", + "sha256": "db015e5b18750bbbf5b2bbaceca877dd6f3f3e74c2a94e8dc185f7413b387f91" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/nixl_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/nixl_ep.py", + "sha256": "1f71d70ac509bf5d3d67a8d95a8ee108a50af6bb5d4bde7181ca28e286f6ffce" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/no_dp_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/no_dp_ep.py", + "sha256": "adbbf529cd22059c95b5380952943a70cf11e05e321dcd707f296bebde61a6e7" + }, + "vllm/model_executor/layers/fused_moe/routed_experts.py": { + "path": "/vllm/model_executor/layers/fused_moe/routed_experts.py", + "sha256": "68c48e5df0ea4a7cc1f04436b7b9153eb53802ecd9bb55d38db8738508daac6d" + }, + "vllm/model_executor/layers/fused_moe/routed_experts_capturer.py": { + "path": "/vllm/model_executor/layers/fused_moe/routed_experts_capturer.py", + "sha256": "cd006bc1a1703418cca3b589fafb2abc4268a086fb3db044bbb64348aeac8b13" + }, + "vllm/model_executor/layers/fused_moe/router/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/layers/fused_moe/router/aiter_shared_routed_fused_moe_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/aiter_shared_routed_fused_moe_router.py", + "sha256": "f47046db1275601a2c67c9232afc7b866c9623a19639d5be867e4c7914a35069" + }, + "vllm/model_executor/layers/fused_moe/router/base_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/base_router.py", + "sha256": "47fa2324bcd9b6ebdc138d69ae6b6ecc0f2463d34bda8c5988bdb0a2a76d3fae" + }, + "vllm/model_executor/layers/fused_moe/router/bf16x3_router_gemm_cutedsl.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/bf16x3_router_gemm_cutedsl.py", + "sha256": "d0f1edd1ebc48d88e490bdb3c93db49bdc0a135ff83e7e0b57130e9f8255fc32" + }, + "vllm/model_executor/layers/fused_moe/router/cpu_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/cpu_router.py", + "sha256": "bff36b15818c87bfbb7ee3def7dc7f6396860abbe5893ff6148801fe941a4b92" + }, + "vllm/model_executor/layers/fused_moe/router/custom_routing_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/custom_routing_router.py", + "sha256": "1a40c7054e3c3a1b3ee2e98f6bc9efa9dfdc11f316a8edf7357dd91533487bfe" + }, + "vllm/model_executor/layers/fused_moe/router/dsv4_topk.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/dsv4_topk.py", + "sha256": "14f7c8487b9aef652dd61c91e0e3c3640b643bf9cd0d8a7184157d71f4beb63e" + }, + "vllm/model_executor/layers/fused_moe/router/fused_moe_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_moe_router.py", + "sha256": "0daa0dc05b931d66767feca444a4cd57ecf140f59b40ea0e8ad213eef6da2b36" + }, + "vllm/model_executor/layers/fused_moe/router/fused_topk_bias_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_topk_bias_router.py", + "sha256": "8fdc28cc248180ad4f11bb4bcda3df47926ec12665a0d84bb712fe83fc6b9376" + }, + "vllm/model_executor/layers/fused_moe/router/fused_topk_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_topk_router.py", + "sha256": "1c80f4af4d781fd66b12aa6a7a0fd30082bc521df40f1252987a8ac4c0bef51c" + }, + "vllm/model_executor/layers/fused_moe/router/gate_linear.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/gate_linear.py", + "sha256": "faa43362c2e7c568498a923c682ca18cae75e87f48d00882770821cb19c21198" + }, + "vllm/model_executor/layers/fused_moe/router/grouped_topk_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/grouped_topk_router.py", + "sha256": "048339e1799cdd42c9dae686a6cb891046577fb391b500f0d12eed73c8f61e52" + }, + "vllm/model_executor/layers/fused_moe/router/rocm_fp32_router_gemm.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/rocm_fp32_router_gemm.py", + "sha256": "9c331ef3d0bb2fb6954387d77ac62a99c5c76d2753c7438bfbb5115f68aae5ac" + }, + "vllm/model_executor/layers/fused_moe/router/router_factory.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/router_factory.py", + "sha256": "019bc8adaa7642abab82843efd53cd1a378f62c652521a1de2b781480eb88742" + }, + "vllm/model_executor/layers/fused_moe/router/routing_simulator_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/routing_simulator_router.py", + "sha256": "a7345df5add00cf3bd93024492d6fc1189fd3ecf2754a11cef1b03a295d791f7" + }, + "vllm/model_executor/layers/fused_moe/router/zero_expert_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/zero_expert_router.py", + "sha256": "dea306edd92e2b9c1b43f982ede8e1e10770d2c66220f5a106e0ed0165276e9c" + }, + "vllm/model_executor/layers/fused_moe/runner/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/layers/fused_moe/runner/moe_runner.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/moe_runner.py", + "sha256": "05893188402fe37229bf72d75088d66193c417d5d502daafd3a55e1bfedaa60c" + }, + "vllm/model_executor/layers/fused_moe/runner/moe_runner_interface.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/moe_runner_interface.py", + "sha256": "189cad01611124eb44594713cbf5918d16fc70196dc81a525ae0a7a97a5fcc51" + }, + "vllm/model_executor/layers/fused_moe/runner/shared_experts.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/shared_experts.py", + "sha256": "d89e4c79c46f6fe61262c51f3facf102e71ce1e4eb3db67f72b6bd8470937be9" + }, + "vllm/model_executor/layers/fused_moe/topk_weight_and_reduce.py": { + "path": "/vllm/model_executor/layers/fused_moe/topk_weight_and_reduce.py", + "sha256": "3dfede72d52bf99af40997994704e6c502ee3bab2bd39bfaa8a68d7dae440203" + }, + "vllm/model_executor/layers/fused_moe/unquantized_fused_moe_method.py": { + "path": "/vllm/model_executor/layers/fused_moe/unquantized_fused_moe_method.py", + "sha256": "182a5ec1874ece2091a24c5303f6ab9ea64a9a61adf325b863927f0cdd83e5d3" + }, + "vllm/model_executor/layers/fused_moe/utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/utils.py", + "sha256": "a93a0bded4008db19d8b38370526ae34fafb9c8278e5b4f60acb6acc8fdc1850" + }, + "vllm/model_executor/layers/mamba/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/abstract.py": { + "path": "/vllm/model_executor/layers/mamba/abstract.py", + "sha256": "dfdc8c836894f574e41d93d76ab989cacd3d7ecf59c97a929abfa48d9364e8ad" + }, + "vllm/model_executor/layers/mamba/gdn/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/gdn/base.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/base.py", + "sha256": "7fec748fc74131f5a45bcaf2644b3fa3a0598fd437d7347f8207ea3644a951c5" + }, + "vllm/model_executor/layers/mamba/gdn/kimi_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/kimi_gdn_linear_attn.py", + "sha256": "1cec4da5c9da73557e192bfb36cd540aae51d3e91283b554449c4a97f0f89bd9" + }, + "vllm/model_executor/layers/mamba/gdn/olmo_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/olmo_gdn_linear_attn.py", + "sha256": "60873ca3bb0c4d17c33bd259b62b658db4883cd23138f47dd4ead62cd2ff0605" + }, + "vllm/model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py", + "sha256": "b80f8e6f3fff442fb880aebb3209c52f814f66490009f4ac4003de603576d10a" + }, + "vllm/model_executor/layers/mamba/linear/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/linear/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/linear/bailing_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/linear/bailing_linear_attn.py", + "sha256": "3c480ddd6eba0766ed012a1074bbec5f241d868a87b020b0f6312222c32f93eb" + }, + "vllm/model_executor/layers/mamba/linear/base.py": { + "path": "/vllm/model_executor/layers/mamba/linear/base.py", + "sha256": "26125cd427225954e1846ca361cdaf43f2b56f11b1e217cf26e91a80ef0edb6a" + }, + "vllm/model_executor/layers/mamba/linear/minimax_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/linear/minimax_linear_attn.py", + "sha256": "4adc00f54893b5bc6c31c613deda152a19af3b1bba04153ab5924c3bf2a3aaae" + }, + "vllm/model_executor/layers/mamba/mamba_mixer.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_mixer.py", + "sha256": "a485e937ad9db14d3ad03fde5a9fe795cfa863649563e52fc7e6c52ef631164e" + }, + "vllm/model_executor/layers/mamba/mamba_mixer2.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_mixer2.py", + "sha256": "d58d93e90d9eb90bc5133b79f07c7c62d0032b35d6cf916e3fe34367b81c5cd5" + }, + "vllm/model_executor/layers/mamba/mamba_utils.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_utils.py", + "sha256": "ce9845b4a4ef4bc46577a33038ed69d59ceccb52f30e9c5bdaa36e48be3b2ca4" + }, + "vllm/model_executor/layers/mamba/ops/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/ops/causal_conv1d.py": { + "path": "/vllm/model_executor/layers/mamba/ops/causal_conv1d.py", + "sha256": "044d005cfe59fd0818ed421274e04f3e8dd679b8cdb64fca9f4422f2643484b2" + }, + "vllm/model_executor/layers/mamba/ops/cpu/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/ops/cpu/causal_conv1d.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/causal_conv1d.py", + "sha256": "64104672890ac2ef240c20c7f8059beeade707178574809dbca8721dff5ea6fa" + }, + "vllm/model_executor/layers/mamba/ops/cpu/gdn_attention.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/gdn_attention.py", + "sha256": "a50288945bf5b102ad3025ae536638dcc32d84cf7c22aaf3a85326b0c1c56c1f" + }, + "vllm/model_executor/layers/mamba/ops/cpu/mamba_ssm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/mamba_ssm.py", + "sha256": "5839e576172a3246337f5e4fb1bc19eb583b3e2b2f7e35dd060dc3041eb8372d" + }, + "vllm/model_executor/layers/mamba/ops/gather_initial_states.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gather_initial_states.py", + "sha256": "5198bb6de6d91c583a5f65d926412a76ee04a06fa72aaba76eaf156b27cd0523" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/__init__.py", + "sha256": "b88b52e71fcb21bd3fa215ea171dcd2ad2ff17c97788cfe64caa7ba45c7ecf97" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_h.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_h.py", + "sha256": "f50bbe5c0b6382323ec5dfc24a5e0c7971113d59727515e60c9fe3689734e5ba" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_kkt_inv_uw.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_kkt_inv_uw.py", + "sha256": "b4a65dd194907db08865e0596fe254f915e670a9e6b27ffa2933c1026dde9b1e" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_o.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_o.py", + "sha256": "629f7843a7e611efb9390f2ebb7a4b924b2c328d48a317fddfaa96af4d9bc60a" + }, + "vllm/model_executor/layers/mamba/ops/layernorm_gated.py": { + "path": "/vllm/model_executor/layers/mamba/ops/layernorm_gated.py", + "sha256": "3433f2e3b87c2b2ccf8e9794ce40762c86a6da38a94ecee001f439ea0d0373dd" + }, + "vllm/model_executor/layers/mamba/ops/mamba_ssm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/mamba_ssm.py", + "sha256": "a4515ec7895b40ed878cf380445034b25faa61fbaa799d96c49217bbdfd7e400" + }, + "vllm/model_executor/layers/mamba/ops/replayssm_config.py": { + "path": "/vllm/model_executor/layers/mamba/ops/replayssm_config.py", + "sha256": "5fe9d5d7aa2de6a65875b3796a919b22bc435fd76055ba054bbff43aa005bc44" + }, + "vllm/model_executor/layers/mamba/ops/scatter_states.py": { + "path": "/vllm/model_executor/layers/mamba/ops/scatter_states.py", + "sha256": "f3bb004c73edaba56337747893eb07faf29b270dc8bb9c893ee9b1044e4ead9a" + }, + "vllm/model_executor/layers/mamba/ops/selective_state_update_replayssm_output_only.py": { + "path": "/vllm/model_executor/layers/mamba/ops/selective_state_update_replayssm_output_only.py", + "sha256": "cea7fd3063ca9dcc4e33f180d01ea379195ec515cedc9d0b03b11dc67670d695" + }, + "vllm/model_executor/layers/mamba/ops/ssd_bmm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_bmm.py", + "sha256": "26983d97a7f5c5f9197a16a6bee7b1294839b9ae31a14c14aaee38b43523e630" + }, + "vllm/model_executor/layers/mamba/ops/ssd_chunk_scan.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_chunk_scan.py", + "sha256": "d5ef32e8cb47e2ce71984579df78ab69754895f891766394daf327867cfa4f8f" + }, + "vllm/model_executor/layers/mamba/ops/ssd_chunk_state.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_chunk_state.py", + "sha256": "177e3aa7fe72647133bbd86135533e8688a5802678d4d1564aa549410362316f" + }, + "vllm/model_executor/layers/mamba/ops/ssd_combined.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_combined.py", + "sha256": "1317bbb668d3c60dfe0658850f9968614f03fa5eb61196f8ce6ac17dbb31b480" + }, + "vllm/model_executor/layers/mamba/ops/ssd_state_passing.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_state_passing.py", + "sha256": "36b8c8edba437916a5b789717c61fc22077de01e77892cb96dbff3b00a57410e" + }, + "vllm/model_executor/layers/mamba/ops/ssu_dispatch.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssu_dispatch.py", + "sha256": "bbe0f0e61da87f3ddfead19a79ca376516b63f1ea868be3485333c63fa20ef41" + }, + "vllm/model_executor/layers/mamba/ops/triton_helpers.py": { + "path": "/vllm/model_executor/layers/mamba/ops/triton_helpers.py", + "sha256": "a8795532f22c37a93e82c9d8e3fadcb5f4da98673d7b321fe8481305eaafad30" + }, + "vllm/model_executor/layers/mamba/short_conv.py": { + "path": "/vllm/model_executor/layers/mamba/short_conv.py", + "sha256": "228494efab185ee17374f762874f4c8b9a26aac9decfa8c906ce38446e0de51a" + }, + "vllm/model_executor/models/qwen3_next.py": { + "path": "/vllm/model_executor/models/qwen3_next.py", + "sha256": "4fa5112ac2bf7886d41d9e1f6c3da8793620d1ec49c961b31e9609459a6a7f7a" + }, + "vllm/third_party/flash_linear_attention/__init__.py": { + "path": "/vllm/third_party/flash_linear_attention/__init__.py", + "sha256": "5dbbfa3fc286edb2e970e175ef33cee4f6181c89b0784f5a8986201b2312f54e" + }, + "vllm/third_party/flash_linear_attention/ops/__init__.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/__init__.py", + "sha256": "dd738dc1d08045e76455cdbe16052a5b769e0eb11d6e87ff28353994f880cd6c" + }, + "vllm/third_party/flash_linear_attention/ops/chunk.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk.py", + "sha256": "c105ead259e86aedc248c53e7c4cef07034d0ff12da608d80265d1dd0990803f" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_delta_h.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_delta_h.py", + "sha256": "1b3ad391f939d9443c6b7adb19e57fe381bd5dccea064e8417a4f85b0e713b26" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_o.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_o.py", + "sha256": "3b63b836a8cc561723c23db5a528a0b474d9cd78508d610f0b348c585a889a19" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_scaled_dot_kkt.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_scaled_dot_kkt.py", + "sha256": "7ae41df3755acc7e925a134d848f78bb5fc00b90069039d86403c5853323ea42" + }, + "vllm/third_party/flash_linear_attention/ops/cumsum.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/cumsum.py", + "sha256": "d818215669b451868823202ac0bcea77e7a9d75957254c7c1060a73a55dc39b6" + }, + "vllm/third_party/flash_linear_attention/ops/fused_gdn_prefill_post_conv.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_gdn_prefill_post_conv.py", + "sha256": "590717b2107abc90d72548de06b5d315229eb2775c94614f3f545df11cc2b5df" + }, + "vllm/third_party/flash_linear_attention/ops/fused_norm_gate.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_norm_gate.py", + "sha256": "e6eb90467f29d8a0a04f2a364d20a2c3191b6ab857841bfb82076b33a6022d1a" + }, + "vllm/third_party/flash_linear_attention/ops/fused_recurrent.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_recurrent.py", + "sha256": "fe6f1311014809040497aa0a623e7fa97f4b3457cdc7ee1f1f8aed21f326f755" + }, + "vllm/third_party/flash_linear_attention/ops/fused_sigmoid_gating.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_sigmoid_gating.py", + "sha256": "000ab8996af9788fdb8843a6a3b91833e7a14c8acc0e1ea073a536330f64cb6f" + }, + "vllm/third_party/flash_linear_attention/ops/index.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/index.py", + "sha256": "a4f8b2c052635cb519a80099e8a85411d1d5d6880b38f466788259bbe66b154d" + }, + "vllm/third_party/flash_linear_attention/ops/kda.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/kda.py", + "sha256": "e1f31aaa89b91f8e5db6d070b229e2c81c7206e8caec67de41db97d06be0c476" + }, + "vllm/third_party/flash_linear_attention/ops/l2norm.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/l2norm.py", + "sha256": "520f4513ef4fc97e6b88dc07877cca8e29da0d34e44673fe989e3af002d86381" + }, + "vllm/third_party/flash_linear_attention/ops/layernorm_guard.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/layernorm_guard.py", + "sha256": "42af29be26e8fc94a4658e053c095fcdab9ffdc1bc2446a01e787deda2a298c0" + }, + "vllm/third_party/flash_linear_attention/ops/op.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/op.py", + "sha256": "456da84fd12411cf53c96a90dd4f78f49afb454c3d51d2c524ea8e7106fe8ae5" + }, + "vllm/third_party/flash_linear_attention/ops/solve_tril.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/solve_tril.py", + "sha256": "d1a4ff27623a938825052500afa7e2aa24fadd2fa4c9be6376c9128824f86f82" + }, + "vllm/third_party/flash_linear_attention/ops/utils.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/utils.py", + "sha256": "d6c90d36505e02086954c23ca4dd2fea82a69416d68ff1d0501e16b3148b5b0c" + }, + "vllm/third_party/flash_linear_attention/ops/wy_fast.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/wy_fast.py", + "sha256": "c9fc8259db0a8746dc04f1d799cb73333457118cf89a0bdce8dde8a80a28cd96" + }, + "vllm/v1/attention/__init__.py": { + "path": "/vllm/v1/attention/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backend.py": { + "path": "/vllm/v1/attention/backend.py", + "sha256": "01ac364372afa75fdb22486aa3a9c7cf9aebb742e3471dfb9e0f9d9d36b734bc" + }, + "vllm/v1/attention/backends/__init__.py": { + "path": "/vllm/v1/attention/backends/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backends/b12x.py": { + "path": "/vllm/v1/attention/backends/b12x.py", + "sha256": "443f0a98738fdfefe5b9ab151d278bfd43a8ac807eb2b0b9b2a13d51922afbf9" + }, + "vllm/v1/attention/backends/composite.py": { + "path": "/vllm/v1/attention/backends/composite.py", + "sha256": "4cf3d66dca891562709eed4f50aa14b0ae6c8240d9ea86504a3304b2f356cce0" + }, + "vllm/v1/attention/backends/cpu_attn.py": { + "path": "/vllm/v1/attention/backends/cpu_attn.py", + "sha256": "76fb02a6bd725125565d84bf04f627cf16da5f7ff8f31f87c01ed6a1439398c7" + }, + "vllm/v1/attention/backends/fa_utils.py": { + "path": "/vllm/v1/attention/backends/fa_utils.py", + "sha256": "08fa6e231d3af3a71a6e59162dd12328aa8beb28548165ae58f130a92adb5a83" + }, + "vllm/v1/attention/backends/flash_attn.py": { + "path": "/vllm/v1/attention/backends/flash_attn.py", + "sha256": "b170a4789e18104c1bee35bea70df51abe6766693d8f4726a59f2e6f5c4282aa" + }, + "vllm/v1/attention/backends/flash_attn_diffkv.py": { + "path": "/vllm/v1/attention/backends/flash_attn_diffkv.py", + "sha256": "e4627c88c3ba8caee260540e994cc8137fd2ff7cd7813356b36387c6c88ce30a" + }, + "vllm/v1/attention/backends/flashinfer.py": { + "path": "/vllm/v1/attention/backends/flashinfer.py", + "sha256": "8ee541fde43ed92a417b3f01ea1e6fc64af8ab2eb54cbfc28308a49aaca4ed7f" + }, + "vllm/v1/attention/backends/flex_attention.py": { + "path": "/vllm/v1/attention/backends/flex_attention.py", + "sha256": "ad07f0ad73aeeadc3534b3a05c14f88a62cb3638874239ae9823c49b36276dc3" + }, + "vllm/v1/attention/backends/gdn_attn.py": { + "path": "/vllm/v1/attention/backends/gdn_attn.py", + "sha256": "3831019404a92200a38b43571c040cffeb6638bbdc71e4cb5e680dbc6c93d054" + }, + "vllm/v1/attention/backends/hpc_attn.py": { + "path": "/vllm/v1/attention/backends/hpc_attn.py", + "sha256": "af9e2aec1b498f0ee48a2dce3cf5646edf1976466980b2fd927c0e82b875427c" + }, + "vllm/v1/attention/backends/linear_attn.py": { + "path": "/vllm/v1/attention/backends/linear_attn.py", + "sha256": "bc42144fcd027434c6a10dc9f4c5f991db8899d387af5f6485402ce097eb0513" + }, + "vllm/v1/attention/backends/mamba1_attn.py": { + "path": "/vllm/v1/attention/backends/mamba1_attn.py", + "sha256": "32159dae11cab3c8c576b9514ad97d5108c8d1b4cac9fcfe345ec6a76223aee7" + }, + "vllm/v1/attention/backends/mamba2_attn.py": { + "path": "/vllm/v1/attention/backends/mamba2_attn.py", + "sha256": "a5bcdecb7b9547137023e1c77a386003358fa940eaf5f319ed142211dcdba139" + }, + "vllm/v1/attention/backends/mamba_attn.py": { + "path": "/vllm/v1/attention/backends/mamba_attn.py", + "sha256": "5e7b2c4058fc5e6096d001bff6c789b78368b025bbe4600f191aaca2ff59b59f" + }, + "vllm/v1/attention/backends/mla/__init__.py": { + "path": "/vllm/v1/attention/backends/mla/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backends/mla/aiter_triton_mla.py": { + "path": "/vllm/v1/attention/backends/mla/aiter_triton_mla.py", + "sha256": "ed0e285cdae06a019150c41cc958b3c0b5ceb0e4f299d5318d1c90e2c2395390" + }, + "vllm/v1/attention/backends/mla/amx_mla.py": { + "path": "/vllm/v1/attention/backends/mla/amx_mla.py", + "sha256": "7f5cddec30b2dfe22ccdbd3b9da673c879719bf6da4074317bd60add55f5d15f" + }, + "vllm/v1/attention/backends/mla/compressor_utils.py": { + "path": "/vllm/v1/attention/backends/mla/compressor_utils.py", + "sha256": "3589e94105368ea285c40b82db1a0332682ff5d071fe363627cf4c0d10f3facf" + }, + "vllm/v1/attention/backends/mla/cpu_mla.py": { + "path": "/vllm/v1/attention/backends/mla/cpu_mla.py", + "sha256": "ff2110b9f78e92adf6bab294465cbc294ae1ff71cb1780fed158179e134a4ca6" + }, + "vllm/v1/attention/backends/mla/cutlass_mla.py": { + "path": "/vllm/v1/attention/backends/mla/cutlass_mla.py", + "sha256": "211d298680f9bd793cc468281b316d6633c5f4eb6dcec71d3329b034a23ab9b5" + }, + "vllm/v1/attention/backends/mla/flashattn_mla.py": { + "path": "/vllm/v1/attention/backends/mla/flashattn_mla.py", + "sha256": "ac89e0ad75a37e92566d264bafe324735a80f9ab4709241a4454d17b3d38bb63" + }, + "vllm/v1/attention/backends/mla/flashattn_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashattn_mla_sparse.py", + "sha256": "67dd3ead2e8b9d8cda0825ecc93779cb7d670628bc741c759a7d3cd5d474030f" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla.py", + "sha256": "0c24ff016fb6b0bb41d9e7484b6f1af42f37bcc384ed613473fc3e01ad25f664" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse.py", + "sha256": "2116d965b2067134d8afa5878d4d16c0149b061258f50c4106d993aa13b073cc" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm120.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm120.py", + "sha256": "102ca08793d567f95598eefeb34c3f6ec50b3b9d704f162d1402b97b12b5777b" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm90.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm90.py", + "sha256": "df9fe4970aa3f53cf24784b8534b89e0101a2ca20a35a2ebbc9a12a4463d5993" + }, + "vllm/v1/attention/backends/mla/flashmla.py": { + "path": "/vllm/v1/attention/backends/mla/flashmla.py", + "sha256": "c9d8046a853ecbdeff9ebfc738f5bb34c4f272b278231a09a0fbf73708c7c188" + }, + "vllm/v1/attention/backends/mla/flashmla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashmla_sparse.py", + "sha256": "7a379c717adb9667ce94cbc16c0e3a1fb22a169713db6d7941c141fa84077b3f" + }, + "vllm/v1/attention/backends/mla/index_group.py": { + "path": "/vllm/v1/attention/backends/mla/index_group.py", + "sha256": "c24e028c3c160a9bb92e043da5b5b34c805e84745b7c4b8da6fb8702a0ddd641" + }, + "vllm/v1/attention/backends/mla/indexer.py": { + "path": "/vllm/v1/attention/backends/mla/indexer.py", + "sha256": "2acbc1c4fa57c3424ad95e6ecbe76eb7141747773c3e867ce704f4adccba892a" + }, + "vllm/v1/attention/backends/mla/prefill/__init__.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/__init__.py", + "sha256": "903630eb705dd175bf4ae4558a4bcaa07c110056b6a11eb830fdd2fb21b3c48a" + }, + "vllm/v1/attention/backends/mla/prefill/aiter_flash_attn.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/aiter_flash_attn.py", + "sha256": "571b8a9910c4ea3fefda60659026f3bf0d7b542c34553c8c9a4d43bb82077e61" + }, + "vllm/v1/attention/backends/mla/prefill/base.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/base.py", + "sha256": "138bf3ddaf5a94c3cdbc4e08ac676edcae84b32fc76625e546f3b47f7d8b82ec" + }, + "vllm/v1/attention/backends/mla/prefill/cpu_sdpa.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/cpu_sdpa.py", + "sha256": "1bb686395274a8ec0d9fd7327410a527655fe060cbbc263eab138fea988d96de" + }, + "vllm/v1/attention/backends/mla/prefill/flash_attn.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/flash_attn.py", + "sha256": "5e648c82c82e5f81fe11458eb82b9f90b50fc06df2ade3bf111ee6b7a2ee8481" + }, + "vllm/v1/attention/backends/mla/prefill/flashinfer.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/flashinfer.py", + "sha256": "63861219c35b8abc0ebe01e1f51543c5ed40bd46119ca261d927da7c6826b49b" + }, + "vllm/v1/attention/backends/mla/prefill/registry.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/registry.py", + "sha256": "c8c30b92213d594beaa3cab4d5003da26a85870dbb11d1ab73191962d0645b53" + }, + "vllm/v1/attention/backends/mla/prefill/selector.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/selector.py", + "sha256": "101d9fca7924b0c5d7891a17fe8942611bd6759e32b03a571dc87b14c1430f2f" + }, + "vllm/v1/attention/backends/mla/prefill/tokenspeed_mla.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/tokenspeed_mla.py", + "sha256": "047cf07bfcc83db3b11a6a54ffe189f6146e6ec9ad33ce2fa7d18860bf4210f0" + }, + "vllm/v1/attention/backends/mla/prefill/trtllm_ragged.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/trtllm_ragged.py", + "sha256": "9e13ea6f6a25accedd918c0de64bbb812ccb20ffb95350ab018a6e76d493789b" + }, + "vllm/v1/attention/backends/mla/rocm_aiter_mla.py": { + "path": "/vllm/v1/attention/backends/mla/rocm_aiter_mla.py", + "sha256": "b489f5830c655bfb6299801a70d69b9821513c69568ecab3689db5a7be867be5" + }, + "vllm/v1/attention/backends/mla/rocm_aiter_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/rocm_aiter_mla_sparse.py", + "sha256": "91b1d9b3d860a9720bc01b8ebe9bbe8649a7d6bca20d4b63939bc100309bca19" + }, + "vllm/v1/attention/backends/mla/sparse_swa.py": { + "path": "/vllm/v1/attention/backends/mla/sparse_swa.py", + "sha256": "a47853ad8a3fe40f24704592581ea323a18041b84610df010a5534da634e311e" + }, + "vllm/v1/attention/backends/mla/sparse_utils.py": { + "path": "/vllm/v1/attention/backends/mla/sparse_utils.py", + "sha256": "c3cdf060288c05542243a9fe8b5ad3a963ad75e9ce399009b5e45c1235a88ce4" + }, + "vllm/v1/attention/backends/mla/tokenspeed_mla.py": { + "path": "/vllm/v1/attention/backends/mla/tokenspeed_mla.py", + "sha256": "b9ba523c606430cecb99a88b28c53d98a99dcf5e76105a80664338110a20f1ad" + }, + "vllm/v1/attention/backends/mla/triton_mla.py": { + "path": "/vllm/v1/attention/backends/mla/triton_mla.py", + "sha256": "21b16b3b34470edcc33d0423e560837c1d37d4bab31c7b3b9cfd7faa47864b51" + }, + "vllm/v1/attention/backends/mla/xpu_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/xpu_mla_sparse.py", + "sha256": "559c6240fe466521a6b2df4c94aea02ddf3f5efa5ba6954fa180c5a51c0f12d2" + }, + "vllm/v1/attention/backends/recoverssm_metadata.py": { + "path": "/vllm/v1/attention/backends/recoverssm_metadata.py", + "sha256": "02896a667db0f0308371ceb50048b18e5866c0235d163c0357e9a05dcedb3394" + }, + "vllm/v1/attention/backends/registry.py": { + "path": "/vllm/v1/attention/backends/registry.py", + "sha256": "378e8ee78734bd8c8adbe287d4c0a4058dcbb553195a09fbcce00a3cc30adc29" + }, + "vllm/v1/attention/backends/rocm_aiter_fa.py": { + "path": "/vllm/v1/attention/backends/rocm_aiter_fa.py", + "sha256": "d1418af03bf58209c850f466b712d3ea22a14ebb758c42dd43e65738281841fd" + }, + "vllm/v1/attention/backends/rocm_aiter_unified_attn.py": { + "path": "/vllm/v1/attention/backends/rocm_aiter_unified_attn.py", + "sha256": "59d2645eb4c91dc0567754a7163d066f4f2faf48f1957b254fcdd5604e9d8c8c" + }, + "vllm/v1/attention/backends/rocm_attn.py": { + "path": "/vllm/v1/attention/backends/rocm_attn.py", + "sha256": "4a8f57067073fbceb784af6c3467487c450d00fa3957928fadb99a79f6036292" + }, + "vllm/v1/attention/backends/short_conv_attn.py": { + "path": "/vllm/v1/attention/backends/short_conv_attn.py", + "sha256": "84fc460ef2fbd09743b069bec0c14b39542af6c2254a403e37a048427e151121" + }, + "vllm/v1/attention/backends/triton_attn.py": { + "path": "/vllm/v1/attention/backends/triton_attn.py", + "sha256": "1057663d110e1d5229495a799027b27277c1eca325d5b6780fa2259afbf58a1a" + }, + "vllm/v1/attention/backends/triton_attn_diffkv.py": { + "path": "/vllm/v1/attention/backends/triton_attn_diffkv.py", + "sha256": "de0357eae005246642140f1ab8842ba5ed8bff5c84b18a6d3a7bbf409c578301" + }, + "vllm/v1/attention/backends/triton_flash_attn.py": { + "path": "/vllm/v1/attention/backends/triton_flash_attn.py", + "sha256": "176e45329aeb28a2008362bb607d1b8c89816eb665859ab908b0385a11acf1c2" + }, + "vllm/v1/attention/backends/triton_flashinfer.py": { + "path": "/vllm/v1/attention/backends/triton_flashinfer.py", + "sha256": "48d5f967e388d4e8d6bbec8d827b44d855346bc2fada28adf65768bf6623527b" + }, + "vllm/v1/attention/backends/turboquant_attn.py": { + "path": "/vllm/v1/attention/backends/turboquant_attn.py", + "sha256": "616d16d608d9d1fbf6c29548037e7e9cf330f4d36a01aa3ffabf42a731eb6e2b" + }, + "vllm/v1/attention/backends/utils.py": { + "path": "/vllm/v1/attention/backends/utils.py", + "sha256": "fbc221360d2d54cb21ef3f625dc8711500de345a355801548b4337bb9b8abee0" + }, + "vllm/v1/attention/ops/__init__.py": { + "path": "/vllm/v1/attention/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/ops/chunked_prefill_paged_decode.py": { + "path": "/vllm/v1/attention/ops/chunked_prefill_paged_decode.py", + "sha256": "973db848a790b2e8d99e728b2fc4f44b501bbe58c62747244ddff04cfcf11a85" + }, + "vllm/v1/attention/ops/common.py": { + "path": "/vllm/v1/attention/ops/common.py", + "sha256": "b4b67e7fc0cce471e337d742c097fba06da7563816e8799e27719714e31e1d5b" + }, + "vllm/v1/attention/ops/cp_common.py": { + "path": "/vllm/v1/attention/ops/cp_common.py", + "sha256": "2369181862e96db64b14ef20c5c2e249ed2ea5f3dea2467a2aa388372bb86d9d" + }, + "vllm/v1/attention/ops/dcp.py": { + "path": "/vllm/v1/attention/ops/dcp.py", + "sha256": "a478bdc781460f0582cfaf74d6431f1a826c201f02f39d882d12a96139bc3f28" + }, + "vllm/v1/attention/ops/flashmla.py": { + "path": "/vllm/v1/attention/ops/flashmla.py", + "sha256": "8a40d6e120e3ab25a95fcfeb32b0b5b4c1ea02b984633866628536dcd26ed2e8" + }, + "vllm/v1/attention/ops/flydsl_kernels/__init__.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/attention/ops/flydsl_kernels/tq_decode.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/tq_decode.py", + "sha256": "cc4b7f82897596e0974b3d3a710a1a8bc58c3d22b72cc7f461dd1c4acd2e451b" + }, + "vllm/v1/attention/ops/flydsl_kernels/tq_decode_gqa6.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/tq_decode_gqa6.py", + "sha256": "a983f6d375c325900955e11696dab1e2665770e83f84d51f93d3ed5e1d8880e0" + }, + "vllm/v1/attention/ops/flydsl_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/flydsl_turboquant_decode.py", + "sha256": "7b1dd0ef7c7fb28a6a8831759e00b939ab844d067657155cc11cf75532a22c63" + }, + "vllm/v1/attention/ops/int4_per_token_head.py": { + "path": "/vllm/v1/attention/ops/int4_per_token_head.py", + "sha256": "d91968f280cd8eaed7570ab255f0276b40e833e18a25066d371d9ca8149425f2" + }, + "vllm/v1/attention/ops/merge_attn_states.py": { + "path": "/vllm/v1/attention/ops/merge_attn_states.py", + "sha256": "ad08403d2843fc892f0b0b4b9f5fabb81884556f89f7170dca46ccef498a3539" + }, + "vllm/v1/attention/ops/metadata.py": { + "path": "/vllm/v1/attention/ops/metadata.py", + "sha256": "ca882b84c5aaefb1f77e4d8ea09a00103fbc53defa8671bba036c961c17fc760" + }, + "vllm/v1/attention/ops/paged_attn.py": { + "path": "/vllm/v1/attention/ops/paged_attn.py", + "sha256": "016a95f892ec751c86b37be1e12171bad9f0b4076bbf2219ff336f4e9c503653" + }, + "vllm/v1/attention/ops/pcp.py": { + "path": "/vllm/v1/attention/ops/pcp.py", + "sha256": "dadeff95fe2df2be8028baabeef01b0d2d628cd67de2176915e737ce096de3dd" + }, + "vllm/v1/attention/ops/prefix_prefill.py": { + "path": "/vllm/v1/attention/ops/prefix_prefill.py", + "sha256": "b08ad92db715fc03c11699de3de463d55e411f42f77548e06b41049a61de692f" + }, + "vllm/v1/attention/ops/rocm_aiter_mla_merge.py": { + "path": "/vllm/v1/attention/ops/rocm_aiter_mla_merge.py", + "sha256": "564c66e4877732e48a6f7d52405c43dc952eec0f0ae4353d34886bca056132b9" + }, + "vllm/v1/attention/ops/rocm_aiter_mla_sparse.py": { + "path": "/vllm/v1/attention/ops/rocm_aiter_mla_sparse.py", + "sha256": "feec664be5045fd1ba13b8f6ef83b52c96910ddc78baca0431bcf610c9e8f5cc" + }, + "vllm/v1/attention/ops/triton_attention_helpers.py": { + "path": "/vllm/v1/attention/ops/triton_attention_helpers.py", + "sha256": "35aa993d01345f535d2641cf9dcabb8b64c51b20a19707bc5987e616aaa87ddd" + }, + "vllm/v1/attention/ops/triton_decode_attention.py": { + "path": "/vllm/v1/attention/ops/triton_decode_attention.py", + "sha256": "b9823c65eba22d76abf64dad7d7d16a950f67471c86d6cb5b3e983aaf14381ac" + }, + "vllm/v1/attention/ops/triton_merge_attn_states.py": { + "path": "/vllm/v1/attention/ops/triton_merge_attn_states.py", + "sha256": "f63229162181ab93198550b73a115f1cc1034cfd60e6f58bc8ab3e22a6e8ce60" + }, + "vllm/v1/attention/ops/triton_prefill_attention.py": { + "path": "/vllm/v1/attention/ops/triton_prefill_attention.py", + "sha256": "352c1a4ac86146580040579fb217c2e288268830d6602b735713e154f36d74fe" + }, + "vllm/v1/attention/ops/triton_reshape_and_cache_flash.py": { + "path": "/vllm/v1/attention/ops/triton_reshape_and_cache_flash.py", + "sha256": "6cac51475b8c656992a21b2d150acd3a16a95a7ab7d49aab151a3ef13c24b80d" + }, + "vllm/v1/attention/ops/triton_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/triton_turboquant_decode.py", + "sha256": "8e52678136449e4bbca2195fbcbb87426c955a2b1b8422e7ab9511e45ee5f5c6" + }, + "vllm/v1/attention/ops/triton_turboquant_store.py": { + "path": "/vllm/v1/attention/ops/triton_turboquant_store.py", + "sha256": "6e6e2fe74a307d40f0be786ccbaea76d989e3c7b5985f3144a5218c61bf6d902" + }, + "vllm/v1/attention/ops/triton_unified_attention.py": { + "path": "/vllm/v1/attention/ops/triton_unified_attention.py", + "sha256": "65d0fbcf33d00789df8ca688c0a1c908e710cfaef53471178747ecae11f05829" + }, + "vllm/v1/attention/ops/triton_unified_attention_diffkv.py": { + "path": "/vllm/v1/attention/ops/triton_unified_attention_diffkv.py", + "sha256": "7fa36d7b7441f1c396e0348eac61d691d2e459e5c4c393c4aa262dfb670e68f7" + }, + "vllm/v1/attention/ops/turboquant_soa/__init__.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/__init__.py", + "sha256": "6b43b6fcb2a71c44ceff4ed1edd417a839f4901251ba15831b09ad979baa4984" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode.py", + "sha256": "bf00634191bba14cbf4a23c1d67dc3dcb244c2b8989f08362757b54435830986" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode_v2.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode_v2.py", + "sha256": "28e7ecc15c450d3591983a50c46a03aa6ca6fa99304c17c333940617d9916485" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_store.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_store.py", + "sha256": "dccf93b9fdd34f9b9eacd468e9de35b9d93378594487c335cf50642aaec681f2" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_unified_attention.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_unified_attention.py", + "sha256": "b4b2b5f3985b3a6126fd052e6ec1ed91c610da8a525a9ae7470ac829405bd85c" + }, + "vllm/v1/attention/ops/vit_attn_wrappers.py": { + "path": "/vllm/v1/attention/ops/vit_attn_wrappers.py", + "sha256": "a99d57b58269c7521fa5d7d47af06551f3bab2b5c7358ef78165a7f6e20a92a6" + }, + "vllm/v1/attention/ops/xpu_mla_sparse.py": { + "path": "/vllm/v1/attention/ops/xpu_mla_sparse.py", + "sha256": "d98d17110577c2b7b4d05e07bfdae15faf83321b6342a5daaaecce45b9503f38" + }, + "vllm/v1/attention/selector.py": { + "path": "/vllm/v1/attention/selector.py", + "sha256": "87f653ded7974875183c920e3e4589c28116bcbc99714d1da7cb51ae77c0b182" + }, + "vllm/v1/core/sched/__init__.py": { + "path": "/vllm/v1/core/sched/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/core/sched/async_scheduler.py": { + "path": "/vllm/v1/core/sched/async_scheduler.py", + "sha256": "e586a0ef3c6778be56a93e7f9bb712d4de9de6e7d7fe7e3e1d51dae83ecfc508" + }, + "vllm/v1/core/sched/interface.py": { + "path": "/vllm/v1/core/sched/interface.py", + "sha256": "be6c008664096c5660a8879de72b315bbe479bf1d688be9b25891063ec53a367" + }, + "vllm/v1/core/sched/output.py": { + "path": "/vllm/v1/core/sched/output.py", + "sha256": "3a66c8efaefe10c572f6f33cf1f8aa4610758c945130cad62eb9f7331005677c" + }, + "vllm/v1/core/sched/request_queue.py": { + "path": "/vllm/v1/core/sched/request_queue.py", + "sha256": "4b8d938e5fb8152fe61030b8aa991f983fcac9a405c37ed8908045e05e82ae5e" + }, + "vllm/v1/core/sched/scheduler.py": { + "path": "/vllm/v1/core/sched/scheduler.py", + "sha256": "c1db45f3bbad3a875dd8638331b8870c4380ac1ab4734265ba5c863833a82884" + }, + "vllm/v1/core/sched/utils.py": { + "path": "/vllm/v1/core/sched/utils.py", + "sha256": "1ed988044eb8028c77ede875bd1a5fd05ff6998b455d61e3997d6a3d7fc1c3a7" + }, + "vllm/v1/sample/__init__.py": { + "path": "/vllm/v1/sample/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/sample/logits_processor/__init__.py": { + "path": "/vllm/v1/sample/logits_processor/__init__.py", + "sha256": "1f9b02dae8cf6d44484638037123d3a2dec6b7b9a2bcc9afceef1a9bf3eaedec" + }, + "vllm/v1/sample/logits_processor/builtin.py": { + "path": "/vllm/v1/sample/logits_processor/builtin.py", + "sha256": "6105816ece77e5b1dbee0d07abc90ce039d650bac2ddb85c93280c48b00f2ebe" + }, + "vllm/v1/sample/logits_processor/interface.py": { + "path": "/vllm/v1/sample/logits_processor/interface.py", + "sha256": "171dfc6ef9b5b53128e8eaecc4bdf1de413a706d64bf5be686048f583c66eee1" + }, + "vllm/v1/sample/logits_processor/state.py": { + "path": "/vllm/v1/sample/logits_processor/state.py", + "sha256": "a96411f14362c45f839e181dcb3ac01d5b880812bccb3552fc17863b219f44ac" + }, + "vllm/v1/sample/metadata.py": { + "path": "/vllm/v1/sample/metadata.py", + "sha256": "6582cfe1a240c7ddb975f0ef6dd7dcd28dcf0fc7670394390250013977aa7ffd" + }, + "vllm/v1/sample/ops/__init__.py": { + "path": "/vllm/v1/sample/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/sample/ops/bad_words.py": { + "path": "/vllm/v1/sample/ops/bad_words.py", + "sha256": "0b1d0a9b13b92ddcae2c83393c07a34c0f107813725700dee794caa7fe7f3b12" + }, + "vllm/v1/sample/ops/logprobs.py": { + "path": "/vllm/v1/sample/ops/logprobs.py", + "sha256": "b286f69012a6758bfe9250038b0697294dbffe0d32c6906f284c39f75ee48be3" + }, + "vllm/v1/sample/ops/penalties.py": { + "path": "/vllm/v1/sample/ops/penalties.py", + "sha256": "4debfcf247b3887478d2b9ec98f108756bbed2805462777ef6b56f3bdf4ce682" + }, + "vllm/v1/sample/ops/topk_topp_sampler.py": { + "path": "/vllm/v1/sample/ops/topk_topp_sampler.py", + "sha256": "13ea4359832bc914492330958ec4f5ac140f408b8f410cc05c6eaf7ddcd70be4" + }, + "vllm/v1/sample/ops/topk_topp_triton.py": { + "path": "/vllm/v1/sample/ops/topk_topp_triton.py", + "sha256": "0b5fc337058e22bc28a8530ccec904d6ccd89b9548b02955c657ac429b1669d2" + }, + "vllm/v1/sample/rejection_sampler.py": { + "path": "/vllm/v1/sample/rejection_sampler.py", + "sha256": "0bb9d224887ccb1355e16199005cc23a4afc6fa75156eca419851b7247d99750" + }, + "vllm/v1/sample/sampler.py": { + "path": "/vllm/v1/sample/sampler.py", + "sha256": "f95805b2c6d06218c724826aa5f881a606e8d0a534a566aee7c85948520dd216" + }, + "vllm/v1/sample/thinking_budget_state.py": { + "path": "/vllm/v1/sample/thinking_budget_state.py", + "sha256": "962f8f55210eb0a431cb9c78b013e35f7a7dd58d06d6fb2e7fcff1b457356f8e" + }, + "vllm/v1/worker/__init__.py": { + "path": "/vllm/v1/worker/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/block_table.py": { + "path": "/vllm/v1/worker/block_table.py", + "sha256": "a09b8819e1417b7a186cf3472224e2138fc5d41a291c6692bb7df711b0c44259" + }, + "vllm/v1/worker/cp_utils.py": { + "path": "/vllm/v1/worker/cp_utils.py", + "sha256": "e32625d83a641b8dd8df82e92d1b6fb20af0cdf2e8fbd2fb131aa3c215415448" + }, + "vllm/v1/worker/cpu/__init__.py": { + "path": "/vllm/v1/worker/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/cpu/buffer_utils.py": { + "path": "/vllm/v1/worker/cpu/buffer_utils.py", + "sha256": "e7313fd8c2c76ebfb98d2fa53008bc9691d0f83a7d7c05e87602b5a29fb79e04" + }, + "vllm/v1/worker/cpu/model_runner.py": { + "path": "/vllm/v1/worker/cpu/model_runner.py", + "sha256": "24a1c916550051327dd5893243a6d4200f3824b91b3af8aa6f6c793fd7c68c3e" + }, + "vllm/v1/worker/cpu/shm.py": { + "path": "/vllm/v1/worker/cpu/shm.py", + "sha256": "08491af8ad341399d1375f2d21ad00414d4c89b0a5c03f55de8704914bbfcbd9" + }, + "vllm/v1/worker/cpu_model_runner.py": { + "path": "/vllm/v1/worker/cpu_model_runner.py", + "sha256": "92111aba92f00571f1a3c4c6e43cf1da6ccb4d2afac2f4d5abc018a4a6e7e8bd" + }, + "vllm/v1/worker/cpu_worker.py": { + "path": "/vllm/v1/worker/cpu_worker.py", + "sha256": "a8051b9e510ef0af9cc34004f2cbe5c0f902bd0cebc32c9464e744344dfdf849" + }, + "vllm/v1/worker/dp_utils.py": { + "path": "/vllm/v1/worker/dp_utils.py", + "sha256": "8cd19f1bfbc5c4f6ec60df89aea7c8a19b400ebc264f372b103014152e92158c" + }, + "vllm/v1/worker/ec_connector_model_runner_mixin.py": { + "path": "/vllm/v1/worker/ec_connector_model_runner_mixin.py", + "sha256": "fe9b11cebb8562f1bfe98b98a5647b2b081a6e424cb60d4ffe2412c91a99215e" + }, + "vllm/v1/worker/encoder_cudagraph.py": { + "path": "/vllm/v1/worker/encoder_cudagraph.py", + "sha256": "6a08d3779bca1b47dbf9daf6eafe2d3c70dbcb8aeb7d63ba7efacc68241ee3bc" + }, + "vllm/v1/worker/encoder_cudagraph_defs.py": { + "path": "/vllm/v1/worker/encoder_cudagraph_defs.py", + "sha256": "bb7be050fcaa8868e7816c84caec875da57050d65fe7eaf00f3d41473df25e3a" + }, + "vllm/v1/worker/gpu/__init__.py": { + "path": "/vllm/v1/worker/gpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/async_utils.py": { + "path": "/vllm/v1/worker/gpu/async_utils.py", + "sha256": "77e17a4570ead2be30ae9b00888cf077a3b873018c12ca0549b853bfda02c1ba" + }, + "vllm/v1/worker/gpu/attn_utils.py": { + "path": "/vllm/v1/worker/gpu/attn_utils.py", + "sha256": "b9b81e59dda2720b1f9c434471381f879228832443e52756e469b4ad4905888f" + }, + "vllm/v1/worker/gpu/block_table.py": { + "path": "/vllm/v1/worker/gpu/block_table.py", + "sha256": "61c004315d5af7e7eae4e2a9e6be92ea82c520327690a7f55a73bb9ce95f520a" + }, + "vllm/v1/worker/gpu/buffer_utils.py": { + "path": "/vllm/v1/worker/gpu/buffer_utils.py", + "sha256": "6597f701a30261bf250e9ad5a29737264624a1caa20527aeea0dad630325b093" + }, + "vllm/v1/worker/gpu/cp_utils.py": { + "path": "/vllm/v1/worker/gpu/cp_utils.py", + "sha256": "456c1bb7e262d99ff555522a4f134e5a9b42aee23290be25455eaef36ee8eaaf" + }, + "vllm/v1/worker/gpu/cudagraph_utils.py": { + "path": "/vllm/v1/worker/gpu/cudagraph_utils.py", + "sha256": "6e9c042890603535e300a40df8ee159dbed1058a64a83ae50ff0329e332e05ff" + }, + "vllm/v1/worker/gpu/dp_utils.py": { + "path": "/vllm/v1/worker/gpu/dp_utils.py", + "sha256": "e26867bc89e6bfc933cabc5ed13e5dc7b8d2d3030118ca1ca64c8785dabc0fc1" + }, + "vllm/v1/worker/gpu/ec_connector.py": { + "path": "/vllm/v1/worker/gpu/ec_connector.py", + "sha256": "2afe6e641f4ae3eb3b8da336c74eaa7479bf617b27cfb39a1fcbe487686f0a08" + }, + "vllm/v1/worker/gpu/eplb_utils.py": { + "path": "/vllm/v1/worker/gpu/eplb_utils.py", + "sha256": "1829fac11464aed4649179b302df198de51b95d0589f4e56bea305a876a63e26" + }, + "vllm/v1/worker/gpu/input_batch.py": { + "path": "/vllm/v1/worker/gpu/input_batch.py", + "sha256": "d5dd956eb319bd69dd9e762047833d81ad40b21fce619fcb2133759e73620694" + }, + "vllm/v1/worker/gpu/kv_connector.py": { + "path": "/vllm/v1/worker/gpu/kv_connector.py", + "sha256": "b89a4333f1e552d86e1815674b59e9f1335f0f49c0a7b46082439076f62c6a81" + }, + "vllm/v1/worker/gpu/lora_utils.py": { + "path": "/vllm/v1/worker/gpu/lora_utils.py", + "sha256": "1e90eddd9ddb4ca55e574bb28e87ae3a6f6750175a62d373102426543f4ccd66" + }, + "vllm/v1/worker/gpu/metrics/__init__.py": { + "path": "/vllm/v1/worker/gpu/metrics/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/metrics/logits.py": { + "path": "/vllm/v1/worker/gpu/metrics/logits.py", + "sha256": "ea058d7510a077a55f8ac7e4c3d596508346244e908cb372865d7159f62edc89" + }, + "vllm/v1/worker/gpu/mm/__init__.py": { + "path": "/vllm/v1/worker/gpu/mm/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/mm/encoder_cache.py": { + "path": "/vllm/v1/worker/gpu/mm/encoder_cache.py", + "sha256": "89c500338fddbeee7c4fca978a3a7c4c566a03e848e399d303fbee3c80631cd2" + }, + "vllm/v1/worker/gpu/mm/encoder_runner.py": { + "path": "/vllm/v1/worker/gpu/mm/encoder_runner.py", + "sha256": "0981e352d70301b7154a217a48665ffe35f215d053ec5740c2515a3e1e11b4e6" + }, + "vllm/v1/worker/gpu/mm/lora.py": { + "path": "/vllm/v1/worker/gpu/mm/lora.py", + "sha256": "a3eddfad6ad64de276964240c28dc080888df4a56dd5eac18f89428f2cbb7a01" + }, + "vllm/v1/worker/gpu/mm/rope.py": { + "path": "/vllm/v1/worker/gpu/mm/rope.py", + "sha256": "0924375bcb367267e783b57dd2ad9de1189d97025ce4313baaa54f2911eaaf1e" + }, + "vllm/v1/worker/gpu/model_runner.py": { + "path": "/vllm/v1/worker/gpu/model_runner.py", + "sha256": "174c93db921c23cf0396eee4764be25b2bd2d4b6a06e9fa41ce3598b884ce8ce" + }, + "vllm/v1/worker/gpu/model_states/__init__.py": { + "path": "/vllm/v1/worker/gpu/model_states/__init__.py", + "sha256": "07815d0b788fc88185772f581bbf892a675259f9288375571f29887622f8d93c" + }, + "vllm/v1/worker/gpu/model_states/default.py": { + "path": "/vllm/v1/worker/gpu/model_states/default.py", + "sha256": "bb614f814780f052e869f9acf31dfbfa68718ee7dc6252eefa901b5730ee8a2a" + }, + "vllm/v1/worker/gpu/model_states/encoder_decoder.py": { + "path": "/vllm/v1/worker/gpu/model_states/encoder_decoder.py", + "sha256": "a5868059d8af672548b41d0e623e884320e6ed61e6aaca2d2828ff5be0356f2f" + }, + "vllm/v1/worker/gpu/model_states/encoder_only.py": { + "path": "/vllm/v1/worker/gpu/model_states/encoder_only.py", + "sha256": "84e96b55a2639e2a73fa4a0308acc89c8d053dc715481180b237e0196dcef99f" + }, + "vllm/v1/worker/gpu/model_states/interface.py": { + "path": "/vllm/v1/worker/gpu/model_states/interface.py", + "sha256": "5675b6fedc7403a9ab410b1e5565974e78fac23c42ab4253ae1da52d6e09b594" + }, + "vllm/v1/worker/gpu/model_states/mamba_hybrid.py": { + "path": "/vllm/v1/worker/gpu/model_states/mamba_hybrid.py", + "sha256": "573e130ac5587d4822fabf97adad1ad0fda02ff83c5e70df879a5bb175ae845c" + }, + "vllm/v1/worker/gpu/model_states/mm_pruning.py": { + "path": "/vllm/v1/worker/gpu/model_states/mm_pruning.py", + "sha256": "b150940b12ae76048f050a8eeb54d532bbdc530a18ffbf320ddeeb0cfaa90f93" + }, + "vllm/v1/worker/gpu/model_states/prompt_embeds.py": { + "path": "/vllm/v1/worker/gpu/model_states/prompt_embeds.py", + "sha256": "11f9e270925c2df6a505557605ac2b859bb145cf3420b0111e7482a1c544f9b1" + }, + "vllm/v1/worker/gpu/model_states/recoverssm.py": { + "path": "/vllm/v1/worker/gpu/model_states/recoverssm.py", + "sha256": "b4b660e62eaf33f4fe8271f83ed1fb6de6bc08f800a8073b27803e42fb29a645" + }, + "vllm/v1/worker/gpu/pcp_manager.py": { + "path": "/vllm/v1/worker/gpu/pcp_manager.py", + "sha256": "2d80df0ed5b18a2069f9d0689cb59923ffe324ba200fcafe242da23da3a6ddaa" + }, + "vllm/v1/worker/gpu/pool/__init__.py": { + "path": "/vllm/v1/worker/gpu/pool/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/pool/pooling_runner.py": { + "path": "/vllm/v1/worker/gpu/pool/pooling_runner.py", + "sha256": "f8463f7648cce0f3f29418a4d9fee61634ead760957cf236d06d61cf8cd986e7" + }, + "vllm/v1/worker/gpu/pp_utils.py": { + "path": "/vllm/v1/worker/gpu/pp_utils.py", + "sha256": "dadeef0bebf61d0ad44a28d06372208ec4e6389224d6017f412683b026bdbb5c" + }, + "vllm/v1/worker/gpu/sample/__init__.py": { + "path": "/vllm/v1/worker/gpu/sample/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/sample/bad_words.py": { + "path": "/vllm/v1/worker/gpu/sample/bad_words.py", + "sha256": "8d3cbd5613398260314d94739d8ee0e1ac0c22abf2f960f541d3c0d4e39d360b" + }, + "vllm/v1/worker/gpu/sample/batch_shard.py": { + "path": "/vllm/v1/worker/gpu/sample/batch_shard.py", + "sha256": "c30274a3a04e6a03e89be9cd7c62de602b1aba4d412f64540ab6201036de3928" + }, + "vllm/v1/worker/gpu/sample/gumbel.py": { + "path": "/vllm/v1/worker/gpu/sample/gumbel.py", + "sha256": "3ec1df510bdad13e8b0a457b5b67c98affdf6e57369e56cb471246cc8f40dd34" + }, + "vllm/v1/worker/gpu/sample/logit_bias.py": { + "path": "/vllm/v1/worker/gpu/sample/logit_bias.py", + "sha256": "9e80a3fe6f3c7474723408cfff52183f4585fdeedd9c2312843ee98d0b12724c" + }, + "vllm/v1/worker/gpu/sample/logprob.py": { + "path": "/vllm/v1/worker/gpu/sample/logprob.py", + "sha256": "f47479a818192acb6b297c79fa67a3b2f9820e3492a394d5adda777e9b7c832e" + }, + "vllm/v1/worker/gpu/sample/min_p.py": { + "path": "/vllm/v1/worker/gpu/sample/min_p.py", + "sha256": "4cb5e2f45e1ced6f9685283a7a5c8cfd7204d9a249822e866cfff756c7f04f62" + }, + "vllm/v1/worker/gpu/sample/output.py": { + "path": "/vllm/v1/worker/gpu/sample/output.py", + "sha256": "d6e298c0f197d487a8faaf7200f500fa83df1d7a4bbf4339cadd6a18008f7f9c" + }, + "vllm/v1/worker/gpu/sample/penalties.py": { + "path": "/vllm/v1/worker/gpu/sample/penalties.py", + "sha256": "46c29434caf5f415129ef4a9bb2b8d4f62d2765596e3e07f73ad2b198c7def1b" + }, + "vllm/v1/worker/gpu/sample/prompt_logprob.py": { + "path": "/vllm/v1/worker/gpu/sample/prompt_logprob.py", + "sha256": "4cf22d390e7bf59e44c458cff7180268db63e95d06af2f1e14d720a2d77c9663" + }, + "vllm/v1/worker/gpu/sample/sampler.py": { + "path": "/vllm/v1/worker/gpu/sample/sampler.py", + "sha256": "832c9945d201a1e730ff9b4b52076aa83bd4a5064e1e4cfea952cf84d4a8d1f0" + }, + "vllm/v1/worker/gpu/sample/states.py": { + "path": "/vllm/v1/worker/gpu/sample/states.py", + "sha256": "4e3671f93695ba5a48fad7d2d13beb231ac8741034904ed5a15d9f7b9b86662e" + }, + "vllm/v1/worker/gpu/sample/thinking_budget.py": { + "path": "/vllm/v1/worker/gpu/sample/thinking_budget.py", + "sha256": "020513e1d3406f367de6ad995a95055008fd0c28f2873647e8283c9870e22404" + }, + "vllm/v1/worker/gpu/sample/trace_replay.py": { + "path": "/vllm/v1/worker/gpu/sample/trace_replay.py", + "sha256": "d2a7d3b3b55379efabe4740a4b7f14030126dc11be36f6ea974164ce42316a50" + }, + "vllm/v1/worker/gpu/sample/watermark.py": { + "path": "/vllm/v1/worker/gpu/sample/watermark.py", + "sha256": "a3581458169dab9153eb09fd67218e0ee5585406537a9de80ad528ae62b030c0" + }, + "vllm/v1/worker/gpu/shutdown.py": { + "path": "/vllm/v1/worker/gpu/shutdown.py", + "sha256": "bb470f14b17c7e52571ef8938b2a9527e7c2846852ae8a3a94b69cd1c30aa4b1" + }, + "vllm/v1/worker/gpu/spec_decode/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/__init__.py", + "sha256": "1f1f84bfe6f4f5af3a7e21a7a8716ecf7b9013da1d03327668a3ee36afc24c32" + }, + "vllm/v1/worker/gpu/spec_decode/acceptance_estimator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/acceptance_estimator.py", + "sha256": "505b843bdd75928b03793b395b47b8be914bd7fe2a3351c8ec04339baeebb1c2" + }, + "vllm/v1/worker/gpu/spec_decode/adaptive_verification.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/adaptive_verification.py", + "sha256": "276b2fec56758a94c71b717f6786b8a6f126db2e20cf964350202feee61a0a39" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py", + "sha256": "13392ef0a9ed59eb9c2b2bad43d7c61beb212a8805849e46b5130c230275d0a5" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/speculator.py", + "sha256": "5b97f54e20ddf65b98e939832d050745f67ef43cfa145786da300f1a8322e3c6" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/cudagraph.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/cudagraph.py", + "sha256": "beab567ae2df6a2ba2cd92fe7ee452c6b959b8a7037a4b5f493993a1824619bb" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/speculator.py", + "sha256": "f9c100f42f9326e48eb84e89281897e859ba761943f54d593523555ccd98dc63" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/utils.py", + "sha256": "53d2c3ad474d290d2c6df027446bbd80ac7447684e5242ab2c3c5337d2abd383" + }, + "vllm/v1/worker/gpu/spec_decode/dflash2/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash2/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/dflash2/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash2/speculator.py", + "sha256": "b70043550938a1df9aecc85d8c8224c38c929ca34f68834572f6e723854d2027" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/speculator.py", + "sha256": "dcf4abdedbd2bddd0d76be198ccf5b4e467c46f645038c35fcab821491a35b03" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/utils.py", + "sha256": "86af2bf30604a184312e8f076097b91ecfec704f409f9d68d634b03d6b318070" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/eagle3_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/eagle3_utils.py", + "sha256": "201ee875fcc3d076a8fc1f3876dcbf85736b221a368555243a8987ff26a1674e" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/speculator.py", + "sha256": "746e318a4f266d75522ff7f3731ea9b4527b7b4824f71364d1a62184ea1f7b3d" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/utils.py", + "sha256": "94de6f55a1761f24f4aa1388cbc3b3763d4ab3ee53260330056ad31ce0b78236" + }, + "vllm/v1/worker/gpu/spec_decode/extract_hidden_states.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/extract_hidden_states.py", + "sha256": "93c4233be7b2d2290b33902ea9b3bb5274c11701830851d03967a22144536e2d" + }, + "vllm/v1/worker/gpu/spec_decode/gemma4/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/gemma4/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/gemma4/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/gemma4/speculator.py", + "sha256": "9991210d7babd2caf2cd10797ca8688543dedeafbc3b86bc7c979c1a6ae9f949" + }, + "vllm/v1/worker/gpu/spec_decode/mtp/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/mtp/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/mtp/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/mtp/speculator.py", + "sha256": "926d6c9ffdb368c971647911a60493820d056ce236fcae9d94a42fa2e006255d" + }, + "vllm/v1/worker/gpu/spec_decode/multi_module_mtp/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/multi_module_mtp/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/multi_module_mtp/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/multi_module_mtp/speculator.py", + "sha256": "d9d4735b9b33829332b0e845b6d3073b2f0436045ed693b25c6434f351644127" + }, + "vllm/v1/worker/gpu/spec_decode/rejection_sampler.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/rejection_sampler.py", + "sha256": "030db5bfca162cc1f305112f299de5d6d61c59d3ed0807fee46575441ca4086d" + }, + "vllm/v1/worker/gpu/spec_decode/rejection_sampler_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/rejection_sampler_utils.py", + "sha256": "214b61fa0abe88573beb779872c035b3954e5651a85bd438d99ee5905d3a62ec" + }, + "vllm/v1/worker/gpu/spec_decode/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/speculator.py", + "sha256": "3a1ab15bf8b20918852eb835fe9755046e99dcbac6ba6ca3d414949fc8bc695a" + }, + "vllm/v1/worker/gpu/spec_decode/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/utils.py", + "sha256": "282f2929eddae9ca7312269f799be07472334b6df9fd91878b5e839ec05e418c" + }, + "vllm/v1/worker/gpu/states.py": { + "path": "/vllm/v1/worker/gpu/states.py", + "sha256": "99418f5df43ca612ded72609fee011620b065b2cab2f249ccb387096bf4ae71a" + }, + "vllm/v1/worker/gpu/structured_outputs.py": { + "path": "/vllm/v1/worker/gpu/structured_outputs.py", + "sha256": "18a10532db7e66b55e334acacd1fd989ad6361adf31dd0de9a9a65e23db25951" + }, + "vllm/v1/worker/gpu/ubatch_utils.py": { + "path": "/vllm/v1/worker/gpu/ubatch_utils.py", + "sha256": "5092e2e58af0561c8dc12e62847cfc6dda9ca20dfbd33e7f0cd77a83fe87f7c5" + }, + "vllm/v1/worker/gpu/warmup.py": { + "path": "/vllm/v1/worker/gpu/warmup.py", + "sha256": "423ac32d58fe008c228cfa223e4fcebfcf87e3463a9dbdf80a083c0578d73723" + }, + "vllm/v1/worker/gpu_input_batch.py": { + "path": "/vllm/v1/worker/gpu_input_batch.py", + "sha256": "18cf455c9d0eea61cc581c7932f2e6cd09786914e82dd35eef1c1430da359a0f" + }, + "vllm/v1/worker/gpu_model_runner.py": { + "path": "/vllm/v1/worker/gpu_model_runner.py", + "sha256": "87c29d08c0bbf66993d8b984811e7325e35e6436242a773feb55ec88f16b2c51" + }, + "vllm/v1/worker/gpu_ubatch_wrapper.py": { + "path": "/vllm/v1/worker/gpu_ubatch_wrapper.py", + "sha256": "4233cfbe8c9884b042c4363890108f616483b694ebe9a6e69578dcf89c6dac5c" + }, + "vllm/v1/worker/gpu_worker.py": { + "path": "/vllm/v1/worker/gpu_worker.py", + "sha256": "6994436e4547c0996ab555b3e814e8ccea26b650dfc1b378b97d640745309347" + }, + "vllm/v1/worker/kv_connector_model_runner_mixin.py": { + "path": "/vllm/v1/worker/kv_connector_model_runner_mixin.py", + "sha256": "e1cc76d065a7e60aacddb190ae795a480b65cd02ba71a1fc699a02a85c1a3de2" + }, + "vllm/v1/worker/lora_model_runner_mixin.py": { + "path": "/vllm/v1/worker/lora_model_runner_mixin.py", + "sha256": "fef6092a15d8d37f6fa22495e6106e2e5280180908d61ce43d9ff5bf4eef3f2f" + }, + "vllm/v1/worker/mamba_utils.py": { + "path": "/vllm/v1/worker/mamba_utils.py", + "sha256": "23fdaa4e8f63ee8f938eaa1a2b39f803cb04fa6ecd69789563254b1a0691413a" + }, + "vllm/v1/worker/mm_encoder_model_runner.py": { + "path": "/vllm/v1/worker/mm_encoder_model_runner.py", + "sha256": "780c41be84ad022205c21c1decb6bb8d5afb03bc7be120c1f7df03b710acc3d7" + }, + "vllm/v1/worker/sentinel/__init__.py": { + "path": "/vllm/v1/worker/sentinel/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/sentinel/gpu_worker_sentinel.py": { + "path": "/vllm/v1/worker/sentinel/gpu_worker_sentinel.py", + "sha256": "3959b8619d052c5dd247815074e03ec21ec9b43cc424ff2d296abc19b227b852" + }, + "vllm/v1/worker/startup_plan.py": { + "path": "/vllm/v1/worker/startup_plan.py", + "sha256": "84bcbb4f7a9fd7c8d10c9c895aadd9673d44c767b9132368d11eb5e017afe86b" + }, + "vllm/v1/worker/ubatch_utils.py": { + "path": "/vllm/v1/worker/ubatch_utils.py", + "sha256": "b34dce551b5195c414e6a3a997c75961cc7a17f24c7c980487fe3d3e2ba7a798" + }, + "vllm/v1/worker/ubatching.py": { + "path": "/vllm/v1/worker/ubatching.py", + "sha256": "40391241c564feb5f16c77898ae6ae152ed6e71a4682e2a406387785d8de02d7" + }, + "vllm/v1/worker/utils.py": { + "path": "/vllm/v1/worker/utils.py", + "sha256": "0ca3ec6bf4d20076145b7fe64e564962adebedc8f75a856b517ba0b2f2d77acf" + }, + "vllm/v1/worker/worker_base.py": { + "path": "/vllm/v1/worker/worker_base.py", + "sha256": "4a1a5266b912fe97991d8dc89d92b923990da9f6cb4b817d00d52e9c0d26dd7c" + }, + "vllm/v1/worker/workspace.py": { + "path": "/vllm/v1/worker/workspace.py", + "sha256": "d21c08167d1d0d1c0cddaa80453a53a0b4dec5d81b5a537c94a21324344976b3" + }, + "vllm/v1/worker/xpu_model_runner.py": { + "path": "/vllm/v1/worker/xpu_model_runner.py", + "sha256": "07fa0390d28f2b8c3c3c0019eb9c3b126e2397aea268ba47c889f06b423deb23" + }, + "vllm/v1/worker/xpu_worker.py": { + "path": "/vllm/v1/worker/xpu_worker.py", + "sha256": "711b56432506b58041cd86e71320c3960413f7bd61061990b66488421d81cfc3" + } + }, + "prefix": "", + "pth": { + "/__editable__.megatron_core-0.16.0rc0.pth": "d55c9b64480b34aae3d4d31e7706b93391c969dec6e0498e50963b03445a57b0", + "/__editable__.rl_kernel-0.1.0.pth": "1454c4987b35762a0d189d4e901c5d077fde62a1944fbaabecea230e57f3923a", + "/__editable__.vime-0.3.2.pth": "77eec5d06d628cb952e65edd813ca88d8db67ccc785083e1b7b29011b92bec4f", + "/distutils-precedence.pth": "2638ce9e2500e572a5e0de7faed6661eb569d1b696fcba07b0dd223da5f5d224", + "/qwen3_next_cuda_runtime.pth": "e0d3ab57dd3ff4f5d55fcf76e83c549cc00b3c813e6f717c540d5ded79fa2f49", + "/qwen3_next_megatron_source.pth": "8556ac057538e82856cb76cbbc954f58312a3f45373daec3eec826031cfd2709", + "/__editable__.rl_kernel-0.1.0.pth": "1454c4987b35762a0d189d4e901c5d077fde62a1944fbaabecea230e57f3923a", + "/distutils-precedence.pth": "2638ce9e2500e572a5e0de7faed6661eb569d1b696fcba07b0dd223da5f5d224", + "/nvidia_cutlass_dsl_packages.pth": "cc710b99ddb3d76361a70461461d274212a979d00c381d821fce5bb3ad9cf246" + }, + "pyvenv_cfg_sha256": "48579f2c6d35c3d535c2690d7d426587c4b8e92021463f0266b38d35dfbbb834", + "sources": { + "/Megatron-LM-training": { + "patch_sha256": "f66035f12501aa1d08e8884e0dea5a22d59825d717aeda73c3e83876e3efd79f", + "path": "/Megatron-LM-training", + "tree": "731fc44a368d6cac8c6171a29d5c687ff0d95bd1" + }, + "/vime": { + "patch_sha256": "66949839d4c18329444f4f9f6dcd702b53ce1b94e9aa15ed111f28743bfaa4b9", + "path": "/vime", + "tree": "f5174e67dbcdaef983eecd45f215fef2d8429dd0" + } + }, + "version": "3.12.14 | packaged by Anaconda, Inc. | (main, Aug 27 2026, 14:46:43) [GCC 14.3.0]" + }, + "sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca" + }, + "gpu_uuids": [ + "b9d15c77-041c-2191-4a17-f979be328e39", + "c95a4fa0-c623-658e-cee7-d1faa63fbddd", + "d5d8fb0c-c4b9-3df4-c19a-da5bdbd78154", + "8c5af87f-f2c2-8d91-7457-b9fb6052b969" + ], + "execution_gpus": 4 +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/train2/l2_matrix.json b/docs/usage/evidence/qwen3-next-chain-b200/train2/l2_matrix.json new file mode 100644 index 000000000..149f97305 --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/train2/l2_matrix.json @@ -0,0 +1,2236 @@ +{ + "schema_version": 1, + "status": "passed", + "scope": "qwen3_next_full_model_l2", + "identity": { + "scheduler_profile_certificate": { + "path": "/result.json", + "sha256": "bf3a74423b3636145cad903d5cf9d70f2c3c777b019a24d125c2ca79f8b1e8d9" + }, + "source_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "checkpoint": "/training-state/exports/update-2-a6d7b63a7fdb43889f1e78812b3ef774", + "weight_version": "update-2", + "checkpoint_identity": { + "schema_version": 1, + "kind": "qwen3_next_native_hf_export", + "status": "complete", + "weight_version": "update-2", + "step": 2, + "export_id": "update-2-a6d7b63a7fdb43889f1e78812b3ef774", + "base_checkpoint": "", + "base_checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "training_identity": { + "scheduler_profile_certificate": { + "path": "/result.json", + "sha256": "bf3a74423b3636145cad903d5cf9d70f2c3c777b019a24d125c2ca79f8b1e8d9" + }, + "source_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "checkpoint": "", + "weight_version": "baseline", + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "architecture_layers": 48, + "weights_dtype": "bfloat16", + "recurrent_state_dtype": "float32", + "run_id": "20261009T041838Z-train1-c67ec144-39e7db9f", + "execution_id": "39e7db9f488142f4b52872e05728c390", + "fixture_sha256": "7c98e4e17cc24bd0c5f65f6515d58a9dfc947afcdb6d4956bd3fa05f24bb28b6" + }, + "architecture_layers": 48, + "weights_dtype": "bfloat16", + "model_rank_sha256": [ + "3ddc69fe7e5d977eab4514fa425840b8d398dbec82995091af644724ed19955a", + "e5d5c59ad91481f00b6e76ed8df3e937ec4178a7abc3a40e0d48c1ae6635e388", + "85886f4d00ebf1bf986f6091273d3fa5d6476f7a82866a95c1263abe541f7293", + "f2b03aad2e898c1ee33d8b1e3a146f98a9bf13253a42efd36adc38ba30e35f19" + ], + "model_identity_method": "native_parameter_hashes_after", + "base_passthrough": { + "prefixes": [ + "mtp." + ], + "tensor_count": 1553, + "shards": { + "model-base-passthrough-00001-of-00001.safetensors": { + "source": "model-00041-of-00041.safetensors", + "tensor_count": 1553 + } + }, + "names_sha256": "622080f1d1b3060957aab28c98f5a728d0c1e9b44d624474a752d0dc9a90566d" + }, + "files": { + "STAGING.json": { + "size": 27893, + "sha256": "7ed7cdf14a0e3d8a7e96e6d1ca2b1c6fbb676664945e1149c9c219c9fd5eb4e7" + }, + "config.json": { + "size": 1154, + "sha256": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303" + }, + "generation_config.json": { + "size": 221, + "sha256": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217" + }, + "merges.txt": { + "size": 1671839, + "sha256": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3" + }, + "model-00001-of-00147.safetensors": { + "size": 4216, + "sha256": "f297513e1c5e05a652b167b82a9e2c48ab5eab9ccc489d9b0db6da892675adbe" + }, + "model-00002-of-00147.safetensors": { + "size": 1073804696, + "sha256": "56881cb4b2774e84ed201d596f5ee3d0e515976cc183ae2e4b0dab1f309bf980" + }, + "model-00003-of-00147.safetensors": { + "size": 2147609384, + "sha256": "3805458f753d090f874a9fb2f128e88b06eb9dc76f89720d340417d707baef4e" + }, + "model-00004-of-00147.safetensors": { + "size": 75839416, + "sha256": "535bc45077380c0bc5e64d3ee680579260f01800e632a159446fde56be2a24bb" + }, + "model-00005-of-00147.safetensors": { + "size": 1073804696, + "sha256": "7a0a70e0683b2b2ae9c9e1b1f6530d71d903f72c5d0e728fde0349a677d4388d" + }, + "model-00006-of-00147.safetensors": { + "size": 2147609384, + "sha256": "11627fc124219e2e2041820dd8c8fab475fb95e1a19095ec052d547395bc8459" + }, + "model-00007-of-00147.safetensors": { + "size": 75839416, + "sha256": "85d06e89815967e1c6081416e1da1523240d09f10b361274b94f8bee365e4a02" + }, + "model-00008-of-00147.safetensors": { + "size": 1073805208, + "sha256": "f7b904408310cfa22313136dafc90a1ecb17c01f1557e06085110df8e49b9a32" + }, + "model-00009-of-00147.safetensors": { + "size": 2147610408, + "sha256": "b22eac5700f7355e6729edc22a939c4eb3786967ec4ab2bd7fb89b5c4bdff01f" + }, + "model-00010-of-00147.safetensors": { + "size": 75839432, + "sha256": "d0db6c52125b5e88bd8aa7034376b27e07a2e591fa76d19229cfe9edaf526c84" + }, + "model-00011-of-00147.safetensors": { + "size": 1073805208, + "sha256": "a69e00b276ce389a78cc587f34a80256ef5712fc532884d034be582255172597" + }, + "model-00012-of-00147.safetensors": { + "size": 2147610408, + "sha256": "6643fdcf4755fef08cab5dfae1d01c108f11b8fc9b921c3014ccb3444f967105" + }, + "model-00013-of-00147.safetensors": { + "size": 62929376, + "sha256": "01827703e357b4ea1426be9f2f268eff5fa2384a94dc4c04126f675d35f1a3fe" + }, + "model-00014-of-00147.safetensors": { + "size": 1073805208, + "sha256": "98f07959e99fafbd601d1df580206a9c8e9672712952a4035e249fbc5a48633c" + }, + "model-00015-of-00147.safetensors": { + "size": 2147610408, + "sha256": "9f35e066490cf90c50d292c2ebaef51de2aba88624af697146150fe8b4b91c58" + }, + "model-00016-of-00147.safetensors": { + "size": 75839432, + "sha256": "99a93a96a4fb7652205192801d5216b5d53354277291ac3cf3044606d078b182" + }, + "model-00017-of-00147.safetensors": { + "size": 1073805208, + "sha256": "216473c456f94f0879da9a8efeff8171fa6a77811c6a494673432f9b37c012cf" + }, + "model-00018-of-00147.safetensors": { + "size": 2147610408, + "sha256": "088aa59119e7f515a4d6a07a262b1140a9635f72133653c0b856974702462515" + }, + "model-00019-of-00147.safetensors": { + "size": 75839432, + "sha256": "2d19a7adf6c05b9469fe1aa08187ec546a2a8e0eca975af7da2e11aabd7f649e" + }, + "model-00020-of-00147.safetensors": { + "size": 1073805208, + "sha256": "c644ae04c5bec2dcfcf09464070df79653c589ed48f8ee78f702cd1bf70474c7" + }, + "model-00021-of-00147.safetensors": { + "size": 2147610408, + "sha256": "db106e82b8c8a145ba3d9d6bae5e318ae860f6ea860e63dfd2027fb316364525" + }, + "model-00022-of-00147.safetensors": { + "size": 75839432, + "sha256": "c64486f83d99c17d6c6a331db6ddfa4331bc4813632ddef6b2ae59a4e680d85a" + }, + "model-00023-of-00147.safetensors": { + "size": 1073805208, + "sha256": "aad4a11beb3623a55b265333cae9a4395b14e0e656e7486e150f17fa8f5239a2" + }, + "model-00024-of-00147.safetensors": { + "size": 2147610408, + "sha256": "a04b9e322dd70e5d164817abc04965862f6b349ea462fece6824b0ea85712e5f" + }, + "model-00025-of-00147.safetensors": { + "size": 62929376, + "sha256": "f17df1ae7ecdcb115bcf455b194aa6aec5d2c2972c85df40602bec6def10d53b" + }, + "model-00026-of-00147.safetensors": { + "size": 1073805208, + "sha256": "9891b4cb4bd0bd1d7613a00c944b1bdfa6b0d5151f4c167de81c30a81fabc246" + }, + "model-00027-of-00147.safetensors": { + "size": 2147610408, + "sha256": "894627b6268e9f8e11e9c6e2c9ded846de49bc43647711d4a94973e0ed14592e" + }, + "model-00028-of-00147.safetensors": { + "size": 75839432, + "sha256": "8a10198a44c6ca8ae0c2da8fd8483fa330fd26f97f895a3ddf7c5bc067d1b8f2" + }, + "model-00029-of-00147.safetensors": { + "size": 1073805208, + "sha256": "8830d3312aeefd6185dea0d3b183da38752253e74da566f4a584aabe1c4cde8a" + }, + "model-00030-of-00147.safetensors": { + "size": 2147610408, + "sha256": "09de4461ab691e78fbcd12b0a26a3e0265453d7cc4d8cfcf9570d9384ffde628" + }, + "model-00031-of-00147.safetensors": { + "size": 75839432, + "sha256": "5e884110ce4902dde296ce50b8948df4eaf3b29d77867ad18e51ea0c78f12ff0" + }, + "model-00032-of-00147.safetensors": { + "size": 1073805208, + "sha256": "47687781ad775d52c445e37a652c48f49a713e07c83f4e55d55384c0a430f0bd" + }, + "model-00033-of-00147.safetensors": { + "size": 2147610408, + "sha256": "81c5d8f4a625703491a13bf41b74eec774e497ae6ee0ef6d5fa49da36a176b66" + }, + "model-00034-of-00147.safetensors": { + "size": 75839432, + "sha256": "1df86f533833ecc51fa637f972f646f91f98308a2b60f0b405a3ee9a228369f4" + }, + "model-00035-of-00147.safetensors": { + "size": 1073805208, + "sha256": "26004a40c3457943df9cbb956196f9157a0521eabe0f9aa196e09f4844ac5f58" + }, + "model-00036-of-00147.safetensors": { + "size": 2147610408, + "sha256": "50c843cc950c3e826d703b325d2a8ec52b3eb79f232e24a95512b3054dfe985d" + }, + "model-00037-of-00147.safetensors": { + "size": 62929376, + "sha256": "a1bd257fe63bad0b11031eb2dc2cf9b2070f2dcecfbaf92768b956aac49f0693" + }, + "model-00038-of-00147.safetensors": { + "size": 1073804696, + "sha256": "ff122722e465d4524182f07fa95588f037aa5bbfa8296ecabce06bffd1a87aa8" + }, + "model-00039-of-00147.safetensors": { + "size": 2147609384, + "sha256": "3f705b190a003935be1d474d7fb4a39464f70a4cc1f0f126d44230bd73f23074" + }, + "model-00040-of-00147.safetensors": { + "size": 75839416, + "sha256": "9483528c5e1f807a19a84b4a5feed4504e362490839dc42378220d86281c5342" + }, + "model-00041-of-00147.safetensors": { + "size": 1073805208, + "sha256": "d44259c0e7fed809da9cf5a02648a8d0130984883ad8ca3a399aaf886aba0a52" + }, + "model-00042-of-00147.safetensors": { + "size": 2147610408, + "sha256": "c25f45e246e5ff464ffbaa70cd4a19feaf7fd1242224d9654e8bc488d746a284" + }, + "model-00043-of-00147.safetensors": { + "size": 75839432, + "sha256": "8bb12d6b340c195e447bc5035c1f74383dd8b0058c579c3b3678037dc3825c88" + }, + "model-00044-of-00147.safetensors": { + "size": 1073805208, + "sha256": "b97d4ff50b85c7ef0510dd801647c93a31b24047c674ab301f525a548afbd5f3" + }, + "model-00045-of-00147.safetensors": { + "size": 2147610408, + "sha256": "89966461fda186e0a059165fa059fc5838ea7a039776edd0c8c2d0f8cf5e2d11" + }, + "model-00046-of-00147.safetensors": { + "size": 75839432, + "sha256": "03a2a3ebb73479c76aa6201db8e26824cf71cc8f2a061e99b11595f59f294e27" + }, + "model-00047-of-00147.safetensors": { + "size": 1073805208, + "sha256": "021ce840d030045a041f36bfb4ba5d77517de923798532726e30e765cc822386" + }, + "model-00048-of-00147.safetensors": { + "size": 2147610408, + "sha256": "50ed385d8799e9aeb8dc58fe8c77a0c70a6b466b6193be85bf953bd80e956ee4" + }, + "model-00049-of-00147.safetensors": { + "size": 75839432, + "sha256": "953d3bf23e3ce26cf8ee377c77b39a1e1e9dc96c383d50886e37b6eda32ca7d9" + }, + "model-00050-of-00147.safetensors": { + "size": 1073805208, + "sha256": "872868c1f4fe074bd7c42e482371c90f474fea0bdcc7a4b6dce9beaafc80c211" + }, + "model-00051-of-00147.safetensors": { + "size": 2147610408, + "sha256": "97f2f15656b20fe6b5f65b42fbf5a2fd18c02bbeec6be98ef9cd044a8e526b1a" + }, + "model-00052-of-00147.safetensors": { + "size": 62929376, + "sha256": "02ff26a993fc1b42d292bca75dfcb4aa453dba596be9752100908bb3509b5121" + }, + "model-00053-of-00147.safetensors": { + "size": 1073805208, + "sha256": "e63cc29a1e3f5f4a5d6177a7f5d955488eace98e55ffc7500de8dfac8147254c" + }, + "model-00054-of-00147.safetensors": { + "size": 2147610408, + "sha256": "8a3fd7b47f9c8e1fb068f58c2b17800e87cd739eb8ea5b47b46681ee823c0bb8" + }, + "model-00055-of-00147.safetensors": { + "size": 75839432, + "sha256": "df0f64fcf66c85d8c3c34b5e67852a32e75ff7b5e48b8a41291fa9fbc1fec397" + }, + "model-00056-of-00147.safetensors": { + "size": 1073805208, + "sha256": "cdefac69a06a5ffecc88fe1866dbb531780bc49fb9fade70e763f16e155ccafe" + }, + "model-00057-of-00147.safetensors": { + "size": 2147610408, + "sha256": "d4bf2b27d828387ec2c95ac8f4b104833b35f6c6e9b7d28a06988c3d9a2ba51e" + }, + "model-00058-of-00147.safetensors": { + "size": 75839432, + "sha256": "392fbe091c5f119ca697d90da73d482291a04685a62149873f49ff7cebfa8796" + }, + "model-00059-of-00147.safetensors": { + "size": 1073805208, + "sha256": "bc682c3d69a69a6259f9ad49e54f3f71e6e717ebbb0df52443ce2ced974af8be" + }, + "model-00060-of-00147.safetensors": { + "size": 2147610408, + "sha256": "4d84ffb6af885eedf2e9ff37c9d0a96537a29c801dcf42d4c1b40d5d77e99464" + }, + "model-00061-of-00147.safetensors": { + "size": 75839432, + "sha256": "23bc528d11c85388fb232c08e376960569798a500e4e81632708a60b9f0248a7" + }, + "model-00062-of-00147.safetensors": { + "size": 1073805208, + "sha256": "aa15b425d646da3f9cfa6c2876f0e1d3574b7f0ea284152d45a043f82a5f7d57" + }, + "model-00063-of-00147.safetensors": { + "size": 2147610408, + "sha256": "18effaab66190034674f71e31f1654ce2897bd22b8e45a12688524c05986c924" + }, + "model-00064-of-00147.safetensors": { + "size": 62929376, + "sha256": "9502c8f8f0accced237be3b397d9e23761080232f7a71d041da0f232179dd607" + }, + "model-00065-of-00147.safetensors": { + "size": 1073805208, + "sha256": "d723746600e84ae5ea8c064bdcbb3923cca64027f5f1d2ceb83ff3fafa3da4a6" + }, + "model-00066-of-00147.safetensors": { + "size": 2147610408, + "sha256": "b73771ae80dbb4265e0bdacfba7e9bce0c2554842b7334982c052b99e07a7aa6" + }, + "model-00067-of-00147.safetensors": { + "size": 75839432, + "sha256": "25e6f603127ba5786697e12628e6ab24db4fcf987e941a19e43be66d38c64d0b" + }, + "model-00068-of-00147.safetensors": { + "size": 1073805208, + "sha256": "785746042bec39462abc260e78968f167e13e4f6739fe6d86b0f995f5d9c76c4" + }, + "model-00069-of-00147.safetensors": { + "size": 2147610408, + "sha256": "f0fc1ba7762a54a62454e78023b167e4c4067ee89d0a6a528a7c814c08ebe6b3" + }, + "model-00070-of-00147.safetensors": { + "size": 75839432, + "sha256": "efc4e36db6185a142ee7b40e517580ae1b8f8e7bb035941a2fb3bff72284a5e6" + }, + "model-00071-of-00147.safetensors": { + "size": 1073804696, + "sha256": "33ce05c567cc4a0bce1fa06e826a39010fdbbc4a4b7b28996a713fe8d7e6defc" + }, + "model-00072-of-00147.safetensors": { + "size": 2147609384, + "sha256": "7a636dc20b5d69453fa4971a2dda321d7927d1de3c47dd0321a8629647bc6c68" + }, + "model-00073-of-00147.safetensors": { + "size": 62929360, + "sha256": "09813f9151c294d521c007dab5980d6bda78b5482f77b91befcdec5923681423" + }, + "model-00074-of-00147.safetensors": { + "size": 1073805208, + "sha256": "572a99f9012e204e21a9bbd46afcc6cd787e099edf65842434ef7e31d0dfdeee" + }, + "model-00075-of-00147.safetensors": { + "size": 2147610408, + "sha256": "ddce5418736fb559a9f498c33b1bc41f142ba34f748cbea7f8198c789f97bcb9" + }, + "model-00076-of-00147.safetensors": { + "size": 75839432, + "sha256": "eb1634ecee78247811b1f8a72eb3d81f8a0b228fb693ba034d9849d59824b452" + }, + "model-00077-of-00147.safetensors": { + "size": 1073805208, + "sha256": "17e147dadf2cc0da2d6ef90cce282304df91a2f1445b8583ddfc776120dd8a73" + }, + "model-00078-of-00147.safetensors": { + "size": 2147610408, + "sha256": "148611aa0fa6e194b13f3de18430ac19a6d2451f5ae8e34938d5d37b419889c3" + }, + "model-00079-of-00147.safetensors": { + "size": 62929376, + "sha256": "ab527b1965121f75e1fa1a5861ce012ce553014176b41ae027074e432cbe88bf" + }, + "model-00080-of-00147.safetensors": { + "size": 1073805208, + "sha256": "2482e15ffe51e77fef00be5f19c874a01b8b6285566ee242685e76f5aa348d97" + }, + "model-00081-of-00147.safetensors": { + "size": 2147610408, + "sha256": "e4efe93a896f3641e117893d145cb63f3cc399a45c25c0357cffadb66421765c" + }, + "model-00082-of-00147.safetensors": { + "size": 75839432, + "sha256": "0c61eb6411df279aff23928f22adccb6bfaa80aec01dbc018942480e059146b7" + }, + "model-00083-of-00147.safetensors": { + "size": 1073805208, + "sha256": "c28e48ff12af6c5b573ddcdc58f77075d2c0fd673e4b1f06582a277ce09cb983" + }, + "model-00084-of-00147.safetensors": { + "size": 2147610408, + "sha256": "718d34a56fc917b71e447f82c4341dae49ed30438f9cf47611b1969d6582bca6" + }, + "model-00085-of-00147.safetensors": { + "size": 75839432, + "sha256": "f36e2b0ca5fd4bc49b7750d23a1c8c5513cafca9e2033ce0ed17ff4e4e9a8a33" + }, + "model-00086-of-00147.safetensors": { + "size": 1073805208, + "sha256": "51057f373efef2130d78079a23c1de9bca838c8b0ae0e13ad0f2c00af908392a" + }, + "model-00087-of-00147.safetensors": { + "size": 2147610408, + "sha256": "dbf26ad3ee227eeab019d64a37d2663b958ef75a443a855ca73b06cb17232737" + }, + "model-00088-of-00147.safetensors": { + "size": 75839432, + "sha256": "e1da79a6406b6d424be747d5cc4361e3a6d7fefbd62d94c6782cbe1a10bc7df4" + }, + "model-00089-of-00147.safetensors": { + "size": 1073805208, + "sha256": "3abbc5d28bf28181f7deb0a0f79d465137b56cf7b40b09aed8fbebb1721f81f8" + }, + "model-00090-of-00147.safetensors": { + "size": 2147610408, + "sha256": "6416617a8cff14af8fa3e6791375883cd2e3c809ef8cfe478e2869e725e5a89a" + }, + "model-00091-of-00147.safetensors": { + "size": 62929376, + "sha256": "4b0e6a5d07831e7e37e73533e677ddb0de9a705778fe5020962d492815a319b6" + }, + "model-00092-of-00147.safetensors": { + "size": 1073805208, + "sha256": "4c5539f8d1194a4b3d957b7f61e6587666c02215765521db933163a367a18391" + }, + "model-00093-of-00147.safetensors": { + "size": 2147610408, + "sha256": "0551ef70a150027e6e123d6e333ba7b45686353c5a7a3be34a9398e01d3e9b5e" + }, + "model-00094-of-00147.safetensors": { + "size": 75839432, + "sha256": "11d96bb282a8015844aee7b3d3d554bc7f7460b22a1a7515215bf86e157047f6" + }, + "model-00095-of-00147.safetensors": { + "size": 1073805208, + "sha256": "ca97e1b71f188cc965ec3ed85d63731819673b22ba903084668791df15a6a1f5" + }, + "model-00096-of-00147.safetensors": { + "size": 2147610408, + "sha256": "d57bdf698cc01b981fa0abddd2a44810543ecfe06890122ee45206dae8467fa0" + }, + "model-00097-of-00147.safetensors": { + "size": 75839432, + "sha256": "8c8fb90ae052525e0a6a529c4fa5ed3b5966b154c4cb6cc2204c7ac460a37ff0" + }, + "model-00098-of-00147.safetensors": { + "size": 1073805208, + "sha256": "45dec9b8a286c801bb21a29e31f9cdd31e7228d6c88558930108b4fa556962e7" + }, + "model-00099-of-00147.safetensors": { + "size": 2147610408, + "sha256": "b7ab1cb4ff2ee1fed08c9d0ed649ae5a886ae46fef694ae86caff933ebdd29cc" + }, + "model-00100-of-00147.safetensors": { + "size": 75839432, + "sha256": "4bb412842e727a1af4aae5ae628f1ce84f013c0fcf43cc9f2d0990f251c33073" + }, + "model-00101-of-00147.safetensors": { + "size": 1073805208, + "sha256": "cda8d307f76761533db21535e863b8fed7989acd728b8f24fbcffc075215d443" + }, + "model-00102-of-00147.safetensors": { + "size": 2147610408, + "sha256": "9143dc00c62f94f4774d895dcd9cba4372acfdda985172ac26a987aaf2fa3c1b" + }, + "model-00103-of-00147.safetensors": { + "size": 62929376, + "sha256": "bb2d588029386f6ca471b45ae726f9e85115732205797b024d033b4560f5b6f6" + }, + "model-00104-of-00147.safetensors": { + "size": 1073804696, + "sha256": "f73356ee3f2c07d21d9bf15ed0e59a106fb223bd6b5d65cbf8ff59d3cb87543a" + }, + "model-00105-of-00147.safetensors": { + "size": 2147609384, + "sha256": "20248a45cc956fde36e4c2d48c391eb4b6d24b272e7ae517d30f1cc759d2b0b6" + }, + "model-00106-of-00147.safetensors": { + "size": 75839416, + "sha256": "908a1d845a7b100a41b9ca9d66fb3d6af7583b75533ae5404bc536ffc7588cea" + }, + "model-00107-of-00147.safetensors": { + "size": 1073805208, + "sha256": "abd0f481fc628a5f6b8749d98cae5a94917bb7113f77b44312a87b788a1ab870" + }, + "model-00108-of-00147.safetensors": { + "size": 2147610408, + "sha256": "abbb9012f71cca747aaf1e0ea6798a2217485ed7095d93d3c2b2fbace45f327b" + }, + "model-00109-of-00147.safetensors": { + "size": 75839432, + "sha256": "5a1dbfa37fdf522c34cb8dd3428d7e6099288be38b6e0d3cf722a5af230bca48" + }, + "model-00110-of-00147.safetensors": { + "size": 1073805208, + "sha256": "ac1334476058a5513aacae4e3a81a6cc752a62d33542bfb0869ca5d3ec06a4fb" + }, + "model-00111-of-00147.safetensors": { + "size": 2147610408, + "sha256": "5e96ed4391dd06b7a146b8e2c02cf9ca37f0ccbd874f8c6926546c8f09e8be8e" + }, + "model-00112-of-00147.safetensors": { + "size": 75839432, + "sha256": "415862be771ff036cb90e963bcb1158d8c0130259c0e32e42a0d5057ca084b18" + }, + "model-00113-of-00147.safetensors": { + "size": 1073805208, + "sha256": "5309f7425fd4d426d4a4c8391436ba135c14ef54f7d78bf4673591967773647c" + }, + "model-00114-of-00147.safetensors": { + "size": 2147610408, + "sha256": "64598a8fceb64b3c05d322691507a35d40284de3c3a79211f6701369fb00535a" + }, + "model-00115-of-00147.safetensors": { + "size": 75839432, + "sha256": "018fcfa76c565623d1ef0e70d83e95e2bfda7b562855403675276756c1c9f925" + }, + "model-00116-of-00147.safetensors": { + "size": 1073805208, + "sha256": "1e33b897d362a2176c1db65b180dc6896e272763aa3299988c1a2a98500b5c16" + }, + "model-00117-of-00147.safetensors": { + "size": 2147610408, + "sha256": "a5d5945eca3855b43e530eee2cf6520135cd4a81902d0e65b57b399c8b411892" + }, + "model-00118-of-00147.safetensors": { + "size": 62929376, + "sha256": "82d22ba211128a60b00e7d3ac8e50f6cb5a0c6bdd38464c76a63921deda4acf3" + }, + "model-00119-of-00147.safetensors": { + "size": 1073805208, + "sha256": "811677ccea68be57c43f443e479eeac1dc40403089104867d7cdca0910fabf17" + }, + "model-00120-of-00147.safetensors": { + "size": 2147610408, + "sha256": "ee2e3cf412bfaad9f3135b6bce6d2b62f8538a6a27ce6bbcf9e6ef9cc72fadb6" + }, + "model-00121-of-00147.safetensors": { + "size": 75839432, + "sha256": "3f609b8675962061c8e77f887e08ca1ee521603f13a6a4b48443f4f63b38b3d6" + }, + "model-00122-of-00147.safetensors": { + "size": 1073805208, + "sha256": "ff803e36f9e4091ad01e6f9349289237e03783071b79dcfa00d91bbe0a382f2a" + }, + "model-00123-of-00147.safetensors": { + "size": 2147610408, + "sha256": "823b463ed443427b61fbdb37cac12afb29360660d9824428f752439cacbac743" + }, + "model-00124-of-00147.safetensors": { + "size": 75839432, + "sha256": "725b2c23ca2d3bee691afa2da4fff278780b9fd92f6c455b1cc7f2e7a972d1bc" + }, + "model-00125-of-00147.safetensors": { + "size": 1073805208, + "sha256": "37d53a1c01af0909ef4b5f54936a3decce53c326bdf306e1d29bfe0bc7a14ea6" + }, + "model-00126-of-00147.safetensors": { + "size": 2147610408, + "sha256": "9daeab452813435db248f768a0dc46bea96bce2389f92ebb4eb493464182ae69" + }, + "model-00127-of-00147.safetensors": { + "size": 75839432, + "sha256": "c3c9d3a05923a5cbb31df6e600e7bb7a3c06e3d023581c8d2c75d440e1ee7701" + }, + "model-00128-of-00147.safetensors": { + "size": 1073805208, + "sha256": "056e682db0ab6ae584f48ab553a2f2568cf73c5a2accf41a6909ebb20ced765d" + }, + "model-00129-of-00147.safetensors": { + "size": 2147610408, + "sha256": "262a2fd8dcd88ebc84c548a77b807c41dc314ebbca71888e25576792033e767b" + }, + "model-00130-of-00147.safetensors": { + "size": 62929376, + "sha256": "e34e22a2b0130e060487ad6224efd7d25567d73412b2a02ee3f615a6b98fef68" + }, + "model-00131-of-00147.safetensors": { + "size": 1073804696, + "sha256": "ec834d03238c9fd9b610de95c4dfe082ed9199a5c7c2edb772c81f9b91d3f4f6" + }, + "model-00132-of-00147.safetensors": { + "size": 2147609384, + "sha256": "535b686df09b832b039cd37c57d177e24e06e8c3b98564cf94a434c0b197d6bc" + }, + "model-00133-of-00147.safetensors": { + "size": 75839416, + "sha256": "e63a4efbb4c25edadfe0223c65314f1ffb611d5dd596e4ae1a678ee4a43bfff3" + }, + "model-00134-of-00147.safetensors": { + "size": 1073804696, + "sha256": "cf651ad3cecdcf8808ef041aff5eb622ed480007b936c801570008467b29610d" + }, + "model-00135-of-00147.safetensors": { + "size": 2147609384, + "sha256": "dcbe086aa112a81494dea3e41e9074c87559739bda76ca08710be82d60620fc1" + }, + "model-00136-of-00147.safetensors": { + "size": 75839416, + "sha256": "89e8fa27220b6c155d9b2020891c60eab1188eb4a0d980ccbf24c48b05c36bdf" + }, + "model-00137-of-00147.safetensors": { + "size": 1073804696, + "sha256": "b1d8f68c8214a510e2d8453dbfb155468ea1eb9459b765556779d69017d7491f" + }, + "model-00138-of-00147.safetensors": { + "size": 2147609384, + "sha256": "e933c180865b8b17b730984169a2587e9ac415e322525f23b8142e1e9da08525" + }, + "model-00139-of-00147.safetensors": { + "size": 62929360, + "sha256": "e1aeeefbaa6bbc9761c9beb88365972a56c6e871e359dca6a89c6d0a04c9169d" + }, + "model-00140-of-00147.safetensors": { + "size": 1073804696, + "sha256": "158bc9a21d875b145ff7eae574e016aa55602a866ec33521ab0d66faf284c3a9" + }, + "model-00141-of-00147.safetensors": { + "size": 2147609384, + "sha256": "03e1383a9a707cb3192341815b320b1d404b3398da473a16b91545c53c3a09be" + }, + "model-00142-of-00147.safetensors": { + "size": 75839416, + "sha256": "0bf27292f331dde74acdac6c3cbbd793d613f981b7356b45431018b4c5f35a74" + }, + "model-00143-of-00147.safetensors": { + "size": 1073804696, + "sha256": "94ee318952036a9d05849c115b392a513f3f970d00e0801200081a2006661e12" + }, + "model-00144-of-00147.safetensors": { + "size": 2147609384, + "sha256": "07226c34b635325a941df32196cc623fdea90ab4d34d96b19f18dca973ab4526" + }, + "model-00145-of-00147.safetensors": { + "size": 75839416, + "sha256": "118d57769561149f012aa99bb24e0615643eb3067a7baea436896eaf51347ff4" + }, + "model-00146-of-00147.safetensors": { + "size": 622329992, + "sha256": "2e4b51e71f585ae837f03c4236d911241a24c665be7a86f8368f36b5ccfe3c39" + }, + "model-00147-of-00147.safetensors": { + "size": 622329984, + "sha256": "5beb2069dff6c8e4bb8963b8e956b8e6db4f822c4e186ffeaf898ba0d2681cd2" + }, + "model-base-passthrough-00001-of-00001.safetensors": { + "size": 3301131328, + "sha256": "65190abf2f9cc7597a3e72c464f1f184d5e11820582a40b7ebd6977ae5273d2f" + }, + "model.safetensors.index.json": { + "size": 6922711, + "sha256": "f7a1d9a95b13a01cd482df0d992abb643b1ca4e3218acf22bd4795dc5a9d8661" + }, + "tokenizer.json": { + "size": 11422654, + "sha256": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4" + }, + "tokenizer_config.json": { + "size": 9377, + "sha256": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3" + }, + "vocab.json": { + "size": 2776833, + "sha256": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + } + }, + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "f7a1d9a95b13a01cd482df0d992abb643b1ca4e3218acf22bd4795dc5a9d8661", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "weight_schema_sha256": "babe9f7e7cf398ad6a8607ee03bb6549139b26fcdd919bb65e9d22b059536361", + "tensor_count": 75944, + "weights_content_sha256": "fd988d83f4741a74b43f642fb6f2f21a984b998694b20bf05964422a260b68db" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "architecture_layers": 48, + "weights_dtype": "bfloat16", + "recurrent_state_dtype": "float32", + "base_checkpoint": "", + "base_checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + } + }, + "fixture": { + "path": "/inputs/frozen.pt", + "sha256": "a8fc79cea6c76e5989743429b76811b3a93b6b85e1eb7f03164c9850c50f1ca8", + "content_sha256": "b59298acf5ecbe64abb4639e7596e052f1993ee5e3c7289b63738f1b04463d01" + }, + "case_ids": [ + "p0008-b1-full", + "p0008-b1-chunked", + "p0008-b4-full", + "p0008-b4-chunked", + "p0064-b1-full", + "p0064-b1-chunked", + "p0064-b4-full", + "p0064-b4-chunked", + "p0256-b1-full", + "p0256-b1-chunked", + "p0256-b4-full", + "p0256-b4-chunked", + "p1024-b1-full", + "p1024-b1-chunked", + "p1024-b4-full", + "p1024-b4-chunked" + ], + "cases": { + "p0008-b1-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/rollout/p0008-b1-full.pt", + "sha256": "97e40f375dc7fc91bf46fa13d826bd938dc19c3e2a5901886f626b048db6bb9e" + }, + "recompute": { + "path": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/recompute/p0008-b1-full.pt", + "sha256": "981aeb3d654a14ef044c48a2584bc2e7596fa6cc7b7f058121cf0d9ad51d1285" + } + } + }, + "p0008-b1-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/rollout/p0008-b1-chunked.pt", + "sha256": "7625078f7a836a26a3725ca5697d06b880b55d7eeb31a56b1ef25806cb927c1b" + }, + "recompute": { + "path": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/recompute/p0008-b1-chunked.pt", + "sha256": "b75fee7d8fcc9aead38165e4d8b6c792934446271f77fd08e6e602e019b4cd4e" + } + } + }, + "p0008-b4-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/rollout/p0008-b4-full.pt", + "sha256": "53c9ed71c6cfdb52309fe86c453b35374e84023c6b69c381c1488a046570385b" + }, + "recompute": { + "path": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/recompute/p0008-b4-full.pt", + "sha256": "f4868648f5c3c4243507608263a2faa22790f517e5cc51d46f66a567fe32cbb1" + } + } + }, + "p0008-b4-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/rollout/p0008-b4-chunked.pt", + "sha256": "fc93291c15cd8c14b639239e17fcb0816902cb5704923b3da33d1a27d08b46db" + }, + "recompute": { + "path": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/recompute/p0008-b4-chunked.pt", + "sha256": "132e6bad249bee31718560f7b3941bba52eec8e70ef4c9562f21f7ad21a23730" + } + } + }, + "p0064-b1-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/rollout/p0064-b1-full.pt", + "sha256": "cfceacebe1b6163081c665633e3de817a70eafd0611b864d07ecd9b4737e23ee" + }, + "recompute": { + "path": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/recompute/p0064-b1-full.pt", + "sha256": "e4b79468ae17a45fba676326102686fc6bb42d68e1383323a85f2e99d232665d" + } + } + }, + "p0064-b1-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/rollout/p0064-b1-chunked.pt", + "sha256": "830fec472303df523eeaeed7083b92e69ddff716645beed4c30a995bf8c976dc" + }, + "recompute": { + "path": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/recompute/p0064-b1-chunked.pt", + "sha256": "00b0e9e59a9e5456345226c71a7f52ae379be37f9856fac1361725cccc6bc477" + } + } + }, + "p0064-b4-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/rollout/p0064-b4-full.pt", + "sha256": "d4dc0b7de95210645686d5ef3916ecbc2dd98f129388dfeec966d66ed7e73e68" + }, + "recompute": { + "path": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/recompute/p0064-b4-full.pt", + "sha256": "ca2c37dec93b8f52a1e04e85a58790aab9c987a51d03db8183eca23b59b1cd9e" + } + } + }, + "p0064-b4-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/rollout/p0064-b4-chunked.pt", + "sha256": "dca9c90d640fa2ee7dbbc1b7fa161346e7bdce8be89e0842e847224a2983bbc6" + }, + "recompute": { + "path": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/recompute/p0064-b4-chunked.pt", + "sha256": "a182e1efe136a367e40bdecce6a1e1f416748ceedb18a7f895ce74fa2eceac0c" + } + } + }, + "p0256-b1-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/rollout/p0256-b1-full.pt", + "sha256": "f3db9e08839ee19e3f9890bdb23af8b6b32452a7f0b18e836029d3caf401a156" + }, + "recompute": { + "path": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/recompute/p0256-b1-full.pt", + "sha256": "34a85c111519d7f2ceff50d7312aa09d30203af9f02a8d8dfaf8417a9dcf0bf0" + } + } + }, + "p0256-b1-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/rollout/p0256-b1-chunked.pt", + "sha256": "07f0cfcd75861447a2c5625b7393673d11193c8f8fe522d965146f3c4dd32fbc" + }, + "recompute": { + "path": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/recompute/p0256-b1-chunked.pt", + "sha256": "f9a313fc6c94240071b244833f660eafa31f702f552119b97b3672b32596fed0" + } + } + }, + "p0256-b4-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/rollout/p0256-b4-full.pt", + "sha256": "81d525bc53bc8eee0430db7c3167ae5ebb395649f33918ac49fe95831334432f" + }, + "recompute": { + "path": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/recompute/p0256-b4-full.pt", + "sha256": "d9e67783adf6c26031ed9af4095eba0e849d2be9ef0361a3f455fa5fadf219d7" + } + } + }, + "p0256-b4-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/rollout/p0256-b4-chunked.pt", + "sha256": "548868302127fde800cfa5d579988e81420773d0a0789e3fd762c5e936b30feb" + }, + "recompute": { + "path": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/recompute/p0256-b4-chunked.pt", + "sha256": "4fca20f54562fa733cd140134e390841d7ba0e45d43bfe6e6b205165aaf5cc2c" + } + } + }, + "p1024-b1-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/rollout/p1024-b1-full.pt", + "sha256": "08e13b2c344b6e0714aaf2e2f7c8c8171e50e120e4a52d00e7afaa7672b59ffb" + }, + "recompute": { + "path": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/recompute/p1024-b1-full.pt", + "sha256": "da49d3b9c0e4f9ce2e54d5ce27fd4f9ea0932c10f891b95157c8df5c0eec1ea7" + } + } + }, + "p1024-b1-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/rollout/p1024-b1-chunked.pt", + "sha256": "093ffee1d07d9dbf4e2252d405c23fb5113ae9805419b2ee863e57c19cc52d19" + }, + "recompute": { + "path": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/recompute/p1024-b1-chunked.pt", + "sha256": "d559fa8b87791bb16800bcf8e8f3a6aeb983c2c1302eecc956cad6270c3c6036" + } + } + }, + "p1024-b4-full": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/rollout/p1024-b4-full.pt", + "sha256": "8a7ffa2153d4a50fda1f2fb635cd24caa93fa63336e9224125d3250777657cf4" + }, + "recompute": { + "path": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/recompute/p1024-b4-full.pt", + "sha256": "0d1bba6adc80e88542a471c8b3500d1ca4bced3abe711505d743233be1016617" + } + } + }, + "p1024-b4-chunked": { + "passed": true, + "comparisons": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "first_divergent_layer": null, + "first_divergent_node": null, + "first_difference": null, + "batch_prefill": { + "rollout": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + }, + "recompute": { + "response_tokens": true, + "logits": true, + "logprobs": true, + "layer_states": true + } + }, + "baseline_generation": {}, + "artifacts": { + "rollout": { + "path": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/rollout/p1024-b4-chunked.pt", + "sha256": "045e180d61360f62a68b58eae4c5b3c514cfc49d7b4a0ebaf391d01c0a0c86c7" + }, + "recompute": { + "path": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/recompute/p1024-b4-chunked.pt", + "sha256": "335f003f341d1f1e2c121d506dddb84d4801cf88fa60c5bc6e8c5bf16b0edad7" + } + } + } + }, + "processes": { + "rollout": { + "pid": 2945802, + "exit_code": 0, + "log": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/rollout.log", + "gpu_release_verified": true + }, + "recompute": { + "pid": 2970801, + "exit_code": 0, + "log": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/recompute.log", + "gpu_release_verified": true + } + }, + "worker_results": { + "rollout": { + "path": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/rollout/worker-result.json", + "sha256": "d35053958fdecdead196a31c27adfec4d3ded9f638d3051ecf04821837bc2950" + }, + "recompute": { + "path": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/recompute/worker-result.json", + "sha256": "13856b773dcb5f23c30481fc1010e3168e888efc37ec125eeb22fdfe8795ad30" + } + }, + "raw_bit_comparison": true, + "logits_dtype": "bfloat16", + "logprobs_dtype": "float32", + "response_length": 16, + "vocab_size": 151936, + "provider_binary": { + "path": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/provider-binary.json", + "sha256": "d0fed834cf6fbb3f425c6c3e45c7a05b797555253c8985231c8ea185a1b62a5e" + } +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/train2/operators.json b/docs/usage/evidence/qwen3-next-chain-b200/train2/operators.json new file mode 100644 index 000000000..500251cce --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/train2/operators.json @@ -0,0 +1,304 @@ +{ + "scope": "qwen3_next_operators_only", + "status": "passed", + "suite": "all", + "diagnostic_only": false, + "full_model_l2": "not_evaluated", + "git_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "git_dirty": false, + "versions": { + "torch": "2.13.0", + "vllm": "0.30.0", + "transformers": "5.17.0", + "triton": "3.7.1" + }, + "mandatory_case_ids": [ + "tests/check_qwen3_next_attention.py::test_d256_backward_with_cached_prefix_matches_float64_formula", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[1024]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[256]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[64]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[8]", + "tests/check_qwen3_next_attention.py::test_d256_input_device_guard_and_nondefault_stream", + "tests/check_qwen3_next_attention.py::test_native_backward_rejects_malformed_probability_and_gradient_buffers", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[0]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[2]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_target_inputs_do_not_depend_on_companions", + "tests/check_qwen3_next_batch_invariance.py::test_triton_chunked_prefill_is_batch_invariant", + "tests/check_qwen3_next_conv_bridge.py::test_chunked_and_reordered_sequences_match", + "tests/check_qwen3_next_conv_bridge.py::test_empty_sequence_preserves_cache_and_gradients", + "tests/check_qwen3_next_conv_bridge.py::test_response_gradient_reaches_prompt_and_convolution_weight", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths0]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths1]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths2]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-4]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[1]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[4]", + "tests/check_qwen3_next_core_matrix.py::test_variable_lengths_empty_and_mixed_step_match_independent_sequences", + "tests/check_qwen3_next_forward.py::test_combine_has_fixed_route_order_and_differentiable_weights", + "tests/check_qwen3_next_forward.py::test_full_vocabulary_logprob_entropy_modes_and_gradient", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_fail_closed_on_the_tensor_descriptor_path", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[128]", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[512]", + "tests/check_qwen3_next_forward.py::test_logprob_nan_rejected_before_comparison", + "tests/check_qwen3_next_forward.py::test_moe_vjp_matches_independent_double_formula", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[1024-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[128-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-16]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-256]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-3072]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-37984]", + "tests/check_qwen3_next_forward.py::test_qwen_moe_actual_tp4_shapes_and_independent_training_forward", + "tests/check_qwen3_next_forward.py::test_route_weights_are_batch_invariant", + "tests/check_qwen3_next_forward.py::test_shared_linear_vjp_and_empty_tokens", + "tests/check_qwen3_next_forward.py::test_stable_route_tie_boundary_and_router_gradient", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_backward_matches_recomputed_recurrence_vjp", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_forward_is_provider_exact_and_does_not_mutate_inputs", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_keeps_prompt_state_gradient_through_response", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[False]", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[True]", + "tests/check_qwen3_next_gdn_bridge.py::test_initial_state_vjp_matches_provider_directional_difference", + "tests/check_qwen3_next_gdn_sequence.py::test_1024_token_chunk_continuation_is_bitwise_exact", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad0]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad1]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad2]", + "tests/check_qwen3_next_gdn_sequence.py::test_chunk_boundary_retains_prompt_and_initial_state_gradients", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths0]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths1]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths2]", + "tests/check_qwen3_next_gdn_sequence.py::test_reserved_and_duplicate_slots_are_rejected", + "tests/check_qwen3_next_norm_providers.py::test_custom_op_has_distinct_native_and_cuda_paths", + "tests/check_qwen3_next_norm_providers.py::test_gdn_decode_provider_env_defaults_are_recorded", + "tests/check_qwen3_next_norm_providers.py::test_our_gated_op_is_batch_invariant", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_cuda]", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_native]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots0]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots2]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots3]", + "tests/check_qwen3_next_shared_core.py::test_independent_training_forward_matches_inference_and_retains_gradients", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[1024]", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[8]", + "tests/check_qwen3_next_shared_core.py::test_unimplemented_provider_profile_is_rejected", + "tests/test_qwen3_next_norm.py::test_bad_weight_shape_raises", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[16]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[1]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[2]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[32]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[48]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[64]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[8]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[128]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[2048]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_with_padding", + "tests/test_qwen3_next_norm.py::test_call_matches_forward", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[128]", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[2048]", + "tests/test_qwen3_next_norm.py::test_cuda_default_offset_preserves_plain_convention", + "tests/test_qwen3_next_norm.py::test_cuda_gated_backward_matches_autograd_golden", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_matches_golden_within_contract", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_bad_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_mismatched_gate", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_backward_uses_the_sigmoid_derivative", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_swish_is_an_alias_for_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_unit_weight_is_plain_norm_times_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_weight_offset_is_applied_in_fp32", + "tests/test_qwen3_next_norm.py::test_cuda_gated_wrapper_rejects_equal_numel_wrong_shape", + "tests/test_qwen3_next_norm.py::test_cuda_gated_zero_gate_zeroes_output", + "tests/test_qwen3_next_norm.py::test_cuda_offset_equals_explicit_fp32_weight", + "tests/test_qwen3_next_norm.py::test_cuda_offset_is_not_folded_through_bfloat16", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_backward_is_offset_aware", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_within_tolerance_of_golden", + "tests/test_qwen3_next_norm.py::test_deterministic_repeat", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype0]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype1]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype2]", + "tests/test_qwen3_next_norm.py::test_eps_inside_sqrt", + "tests/test_qwen3_next_norm.py::test_gated_batch_invariance_slice", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedHFOp]", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedOp]", + "tests/test_qwen3_next_norm.py::test_gated_conventions_diverge_in_low_precision", + "tests/test_qwen3_next_norm.py::test_gated_cuda_op_rejects_bad_activation_at_construction", + "tests/test_qwen3_next_norm.py::test_gated_extension_handles_empty_batch_and_nondefault_stream", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[dy_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[gate_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[rstd_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_shape]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_matches_hf_formula_fp32", + "tests/test_qwen3_next_norm.py::test_gated_shape_mismatch_raises", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_strict_matches_vllm_formula_fp32", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[128]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[2048]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_offset_applied_in_fp32_not_folded_into_bf16", + "tests/test_qwen3_next_norm.py::test_op_batch_invariance_on_device", + "tests/test_qwen3_next_norm.py::test_plain_reference_is_unchanged_by_the_offset_plumbing", + "tests/test_qwen3_next_norm.py::test_weight_offset_is_one", + "tests/test_qwen3_next_norm.py::test_zero_centred_cuda_constructor_rejects_missing_extension", + "tests/test_qwen3_next_norm.py::test_zero_centred_op_inherits_the_plain_reference", + "tests/test_qwen3_next_norm.py::test_zero_weight_is_identity_scaling" + ], + "case_ids_sha256": "694c931b65f9cfa5db963f2eca6d11bd309546c824a1df52f9da2ab128e83e0f", + "pytest_exit_code": 0, + "provider_tests": { + "tests": 233, + "failures": 0, + "errors": 0, + "skipped": 0 + }, + "norm_gates": { + "qwen3_next_rms_norm-forward.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + }, + "qwen3_next_rms_norm-gradient.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + }, + "rms_norm_gated-forward.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + }, + "rms_norm_gated-gradient.json": { + "passed": true, + "exit_code": 0, + "workload": { + "workload_id": "qwen3-next-80b-a3b-norm-c3-c4-v1", + "scope": "qwen3_next_norm_operators", + "fixture_identity_sha256": "3ac9490ffbb1486edac6ea509811fd4d5affbe880b208bd7d9b052b0ce418442", + "model_id": "Qwen/Qwen3-Next-80B-A3B-Instruct", + "full_model_evidence": false + } + } + } +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/train2/result.json b/docs/usage/evidence/qwen3-next-chain-b200/train2/result.json new file mode 100644 index 000000000..cc69a99db --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/train2/result.json @@ -0,0 +1,775 @@ +{ + "contract_version": 4, + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "cuda_identity": { + "home": "", + "nvcc_sha256": "b8e2347d9d7fcadf8812a27324d515de99d033d3e48611811ece7e66d7895f8a" + }, + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "operator_requirements": { + "suite": "all", + "case_ids": [ + "tests/check_qwen3_next_attention.py::test_d256_backward_with_cached_prefix_matches_float64_formula", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[1024]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[256]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[64]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[8]", + "tests/check_qwen3_next_attention.py::test_d256_input_device_guard_and_nondefault_stream", + "tests/check_qwen3_next_attention.py::test_native_backward_rejects_malformed_probability_and_gradient_buffers", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[0]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[2]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_target_inputs_do_not_depend_on_companions", + "tests/check_qwen3_next_batch_invariance.py::test_triton_chunked_prefill_is_batch_invariant", + "tests/check_qwen3_next_conv_bridge.py::test_chunked_and_reordered_sequences_match", + "tests/check_qwen3_next_conv_bridge.py::test_empty_sequence_preserves_cache_and_gradients", + "tests/check_qwen3_next_conv_bridge.py::test_response_gradient_reaches_prompt_and_convolution_weight", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths0]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths1]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths2]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-4]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[1]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[4]", + "tests/check_qwen3_next_core_matrix.py::test_variable_lengths_empty_and_mixed_step_match_independent_sequences", + "tests/check_qwen3_next_forward.py::test_combine_has_fixed_route_order_and_differentiable_weights", + "tests/check_qwen3_next_forward.py::test_full_vocabulary_logprob_entropy_modes_and_gradient", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_fail_closed_on_the_tensor_descriptor_path", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[128]", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[512]", + "tests/check_qwen3_next_forward.py::test_logprob_nan_rejected_before_comparison", + "tests/check_qwen3_next_forward.py::test_moe_vjp_matches_independent_double_formula", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[1024-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[128-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-16]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-256]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-3072]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-37984]", + "tests/check_qwen3_next_forward.py::test_qwen_moe_actual_tp4_shapes_and_independent_training_forward", + "tests/check_qwen3_next_forward.py::test_route_weights_are_batch_invariant", + "tests/check_qwen3_next_forward.py::test_shared_linear_vjp_and_empty_tokens", + "tests/check_qwen3_next_forward.py::test_stable_route_tie_boundary_and_router_gradient", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_backward_matches_recomputed_recurrence_vjp", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_forward_is_provider_exact_and_does_not_mutate_inputs", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_keeps_prompt_state_gradient_through_response", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[False]", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[True]", + "tests/check_qwen3_next_gdn_bridge.py::test_initial_state_vjp_matches_provider_directional_difference", + "tests/check_qwen3_next_gdn_sequence.py::test_1024_token_chunk_continuation_is_bitwise_exact", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad0]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad1]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad2]", + "tests/check_qwen3_next_gdn_sequence.py::test_chunk_boundary_retains_prompt_and_initial_state_gradients", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths0]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths1]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths2]", + "tests/check_qwen3_next_gdn_sequence.py::test_reserved_and_duplicate_slots_are_rejected", + "tests/check_qwen3_next_norm_providers.py::test_custom_op_has_distinct_native_and_cuda_paths", + "tests/check_qwen3_next_norm_providers.py::test_gdn_decode_provider_env_defaults_are_recorded", + "tests/check_qwen3_next_norm_providers.py::test_our_gated_op_is_batch_invariant", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_cuda]", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_native]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots0]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots2]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots3]", + "tests/check_qwen3_next_shared_core.py::test_independent_training_forward_matches_inference_and_retains_gradients", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[1024]", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[8]", + "tests/check_qwen3_next_shared_core.py::test_unimplemented_provider_profile_is_rejected", + "tests/test_qwen3_next_norm.py::test_bad_weight_shape_raises", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[16]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[1]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[2]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[32]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[48]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[64]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[8]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[128]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[2048]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_with_padding", + "tests/test_qwen3_next_norm.py::test_call_matches_forward", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[128]", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[2048]", + "tests/test_qwen3_next_norm.py::test_cuda_default_offset_preserves_plain_convention", + "tests/test_qwen3_next_norm.py::test_cuda_gated_backward_matches_autograd_golden", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_matches_golden_within_contract", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_bad_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_mismatched_gate", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_backward_uses_the_sigmoid_derivative", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_swish_is_an_alias_for_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_unit_weight_is_plain_norm_times_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_weight_offset_is_applied_in_fp32", + "tests/test_qwen3_next_norm.py::test_cuda_gated_wrapper_rejects_equal_numel_wrong_shape", + "tests/test_qwen3_next_norm.py::test_cuda_gated_zero_gate_zeroes_output", + "tests/test_qwen3_next_norm.py::test_cuda_offset_equals_explicit_fp32_weight", + "tests/test_qwen3_next_norm.py::test_cuda_offset_is_not_folded_through_bfloat16", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_backward_is_offset_aware", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_within_tolerance_of_golden", + "tests/test_qwen3_next_norm.py::test_deterministic_repeat", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype0]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype1]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype2]", + "tests/test_qwen3_next_norm.py::test_eps_inside_sqrt", + "tests/test_qwen3_next_norm.py::test_gated_batch_invariance_slice", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedHFOp]", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedOp]", + "tests/test_qwen3_next_norm.py::test_gated_conventions_diverge_in_low_precision", + "tests/test_qwen3_next_norm.py::test_gated_cuda_op_rejects_bad_activation_at_construction", + "tests/test_qwen3_next_norm.py::test_gated_extension_handles_empty_batch_and_nondefault_stream", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[dy_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[gate_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[rstd_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_shape]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_matches_hf_formula_fp32", + "tests/test_qwen3_next_norm.py::test_gated_shape_mismatch_raises", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_strict_matches_vllm_formula_fp32", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[128]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[2048]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_offset_applied_in_fp32_not_folded_into_bf16", + "tests/test_qwen3_next_norm.py::test_op_batch_invariance_on_device", + "tests/test_qwen3_next_norm.py::test_plain_reference_is_unchanged_by_the_offset_plumbing", + "tests/test_qwen3_next_norm.py::test_weight_offset_is_one", + "tests/test_qwen3_next_norm.py::test_zero_centred_cuda_constructor_rejects_missing_extension", + "tests/test_qwen3_next_norm.py::test_zero_centred_op_inherits_the_plain_reference", + "tests/test_qwen3_next_norm.py::test_zero_weight_is_identity_scaling" + ], + "case_ids_sha256": "694c931b65f9cfa5db963f2eca6d11bd309546c824a1df52f9da2ab128e83e0f", + "norm_gates": [ + "qwen3_next_rms_norm-forward.json", + "qwen3_next_rms_norm-gradient.json", + "rms_norm_gated-forward.json", + "rms_norm_gated-gradient.json" + ] + }, + "layer_requirements": { + "schema_version": 1, + "gates": { + "gdn": { + "script": "scripts/qwen3_next_tp_gdn_check.py", + "output_option": "--output", + "scope": "tp4_gdn_layer0", + "groups": { + "cases": [ + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "prompt-gradient", + "replicated-norm-gradient", + "hf-load-export" + ] + }, + "script_sha256": "cc4338893f90af004c51c20fc67d1a9a3f4bf8d26775277f72671c02983e4df5" + }, + "attention": { + "script": "scripts/qwen3_next_tp_attention_check.py", + "output_option": "--output", + "scope": "tp4_full_attention_layer3", + "groups": { + "attention.cases": [ + "hf-load-export", + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "batch4-varlen-reorder", + "sixteen-token-decode", + "prompt-gradient", + "kv-pair-gradient", + "qk-norm-gradient" + ] + }, + "script_sha256": "d27d43efb05415a8ef5892c3c2238a2b9744a4821f5466faf46c6510e6e01bec" + }, + "moe": { + "script": "scripts/qwen3_next_tp_moe_check.py", + "output_option": "--output", + "scope": "tp4_moe_block_layer0", + "groups": { + "moe.cases": [ + "hf-load-export-all512experts", + "routes-replicated-8", + "full-chunk-reorder-8", + "routes-replicated-64", + "full-chunk-reorder-64", + "routes-replicated-256", + "full-chunk-reorder-256", + "routes-replicated-1024", + "full-chunk-reorder-1024", + "training-forward", + "all-parameter-gradient", + "replicated-router-gradient" + ] + }, + "script_sha256": "d5c1bbbb82e408b65871b0cb1638d7a6cf8cfe07f0a3315a657b7dc232d544be" + }, + "adapters": { + "script": "scripts/qwen3_next_adapter_check.py", + "output_option": "--out", + "scope": "gdn_engine_adapter_component", + "groups": { + "cases": [ + "batch1-length8", + "batch1-length64", + "batch1-length256", + "batch1-length1024", + "batch4-length8", + "batch4-length64", + "batch4-length256", + "batch4-length1024", + "mixed-prefill-decode16-reorder" + ] + }, + "fields": { + "prompt_gradient": "passed", + "hf_conv_roundtrip": "passed", + "batch_invariance_capability_registered": false + }, + "script_sha256": "3ce45bb317237c1a06533116d65fb77c2a23b6f503ae46406ede543036eb0f20" + }, + "heads": { + "script": "scripts/qwen3_next_tp_head_check.py", + "output_option": "--output", + "scope": "tp4_embedding_lm_head_only", + "groups": { + "cases": [ + "hf-embedding-roundtrip", + "hf-lm-head-roundtrip", + "replicated-norm-gradient", + "nonzero-finite-embedding-head-gradient", + "embedding-repeat-100", + "batch-invariant-prompt8", + "batch-invariant-prompt64", + "batch-invariant-prompt256", + "batch-invariant-prompt1024", + "logprob-original-and-promoted-logits", + "entropy-interface" + ] + }, + "script_sha256": "0504185d21a75405c8e994bc57b016cf4ec357d8b16e7430772c11934f2af876" + } + }, + "scheduler_case_ids": [ + "p0008-b1-full", + "p0008-b1-chunked", + "p0008-b4-full", + "p0008-b4-chunked", + "p0064-b1-full", + "p0064-b1-chunked", + "p0064-b4-full", + "p0064-b4-chunked", + "p0256-b1-full", + "p0256-b1-chunked", + "p0256-b4-full", + "p0256-b4-chunked", + "p1024-b1-full", + "p1024-b1-chunked", + "p1024-b4-full", + "p1024-b4-chunked" + ], + "registry_sha256": "e3949a750cb27c1897a000f3b023f912629906612ae8949c1575d0acc36df5ec", + "case_ids_per_rank": [ + "adapters/cases/batch1-length1024", + "adapters/cases/batch1-length256", + "adapters/cases/batch1-length64", + "adapters/cases/batch1-length8", + "adapters/cases/batch4-length1024", + "adapters/cases/batch4-length256", + "adapters/cases/batch4-length64", + "adapters/cases/batch4-length8", + "adapters/cases/mixed-prefill-decode16-reorder", + "attention/attention.cases/batch4-varlen-reorder", + "attention/attention.cases/full-chunk-1024", + "attention/attention.cases/full-chunk-256", + "attention/attention.cases/full-chunk-64", + "attention/attention.cases/full-chunk-8", + "attention/attention.cases/hf-load-export", + "attention/attention.cases/kv-pair-gradient", + "attention/attention.cases/prompt-gradient", + "attention/attention.cases/qk-norm-gradient", + "attention/attention.cases/sixteen-token-decode", + "gdn/cases/full-chunk-1024", + "gdn/cases/full-chunk-256", + "gdn/cases/full-chunk-64", + "gdn/cases/full-chunk-8", + "gdn/cases/hf-load-export", + "gdn/cases/prompt-gradient", + "gdn/cases/replicated-norm-gradient", + "heads/cases/batch-invariant-prompt1024", + "heads/cases/batch-invariant-prompt256", + "heads/cases/batch-invariant-prompt64", + "heads/cases/batch-invariant-prompt8", + "heads/cases/embedding-repeat-100", + "heads/cases/entropy-interface", + "heads/cases/hf-embedding-roundtrip", + "heads/cases/hf-lm-head-roundtrip", + "heads/cases/logprob-original-and-promoted-logits", + "heads/cases/nonzero-finite-embedding-head-gradient", + "heads/cases/replicated-norm-gradient", + "moe/moe.cases/all-parameter-gradient", + "moe/moe.cases/full-chunk-reorder-1024", + "moe/moe.cases/full-chunk-reorder-256", + "moe/moe.cases/full-chunk-reorder-64", + "moe/moe.cases/full-chunk-reorder-8", + "moe/moe.cases/hf-load-export-all512experts", + "moe/moe.cases/replicated-router-gradient", + "moe/moe.cases/routes-replicated-1024", + "moe/moe.cases/routes-replicated-256", + "moe/moe.cases/routes-replicated-64", + "moe/moe.cases/routes-replicated-8", + "moe/moe.cases/training-forward" + ], + "case_ids_sha256": "be74417dfbd6031ba27978d06d04bb15daaab2aeb57d132c7e0d41176b28b46e" + }, + "source_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "run_id": "20261009T113535Z-train2-c67ec144-bfa88ef7", + "stage": "train2", + "suite": "all", + "execution_id": "bfa88ef71fde400abf6f017ca59d7486", + "attempt": "0", + "status": "passed", + "phase": "complete", + "scope": "qwen3_next_training_update2", + "full_model_l2": "passed", + "evidence": { + "updates": { + "path": "attempts/0/training-progress.json", + "sha256": "a9e2440b41620f9ca0a3146540e895e87d783995f37c9766bb2fcab22d1d7ca2" + }, + "l2_matrix": { + "path": "attempts/0/l2-matrix.json", + "sha256": "e8b9ee250133e40cf2f28134bb4b77f6ec18bb970c37a9702590284e2c570893" + }, + "operators": { + "path": "attempts/0/operators.json", + "sha256": "dedb24b6ac2a01d37eb795a001376ca0b200a03e417f8131688aac67c19c2ebd" + }, + "environment": { + "path": "attempts/0/environment.json", + "sha256": "48a6f6fdaa6e396d03f2094c9deef8b3280b8b1a62eb26d22d7e2e4c6034b120" + } + }, + "training_phases": [ + "update1", + "update2" + ] +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/train2/run.json b/docs/usage/evidence/qwen3-next-chain-b200/train2/run.json new file mode 100644 index 000000000..e4a4b124f --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/train2/run.json @@ -0,0 +1,5252 @@ +{ + "run_id": "20261009T113535Z-train2-c67ec144-bfa88ef7", + "execution_id": "bfa88ef71fde400abf6f017ca59d7486", + "contract_version": 4, + "suite": "all", + "execution_gpus": 4, + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "stage": "train2", + "source_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "source": "/source", + "python": "", + "cuda_home": "", + "checkpoint": "", + "memory": "1280G", + "previous": "", + "status": "prepared", + "full_model_l2": "not_evaluated", + "environment": { + "identity": { + "base_prefix": "/miniconda3/envs/rlkernel", + "binary": "/python3.12", + "binary_sha256": "6a1eb3ffc29f3a6b0ece607b016b4cfa5ca3ac57b34f17ed3266b404f78d2729", + "build_tools": { + "ninja": { + "path": "/miniconda3/envs/rlkernel/bin/ninja", + "sha256": "08639e194fffa7f08b259fc4abfa4803aff66b64de52549cee42ec527d55cea6" + } + }, + "distributions": [ + { + "direct_url": null, + "metadata_sha256": "6f1038270be40f9b8c0bcf391c627e7d7f41ccdd19aa192d6eac1dbfc3b19abc", + "name": "GitPython", + "version": "3.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "3f71971502087521f123c9daa26bc12d31d3466738b567390b8602acad3be22a", + "name": "Jinja2", + "version": "3.1.6" + }, + { + "direct_url": null, + "metadata_sha256": "818fb343b7b6b99a32771bf4813521ae6440b4c7579b3ae46e32dd02da0afeee", + "name": "Markdown", + "version": "3.11" + }, + { + "direct_url": null, + "metadata_sha256": "dc1ee42cf8ecfeee0ab60b15b21d291833e0732548efcb7bb5b3564dca3e5bf7", + "name": "MarkupSafe", + "version": "3.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "de7389b142450a0014234286b0876f328439b823c355c73d0aed41fd67ec208c", + "name": "PyJWT", + "version": "2.15.1" + }, + { + "direct_url": null, + "metadata_sha256": "ffcad4415cafb22b8b536a61595e9ee13438b51d31b0763c1b273ce3bc58e840", + "name": "PyYAML", + "version": "6.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "8562d701cc52d9cafbb418942b0e072fc087ed8ddcf35cd10224c1b2ed8bdd91", + "name": "Pygments", + "version": "2.21.0" + }, + { + "direct_url": null, + "metadata_sha256": "b6c25fcfdcc495edf248a10ca4ad28327ef2ed6047a6ec5c6346e121414c7f21", + "name": "Werkzeug", + "version": "3.1.9" + }, + { + "direct_url": null, + "metadata_sha256": "55c400d24c71b581d9c0992f71df6047cf6c878bebe61a7d45d6e02dc0e4c510", + "name": "absl-py", + "version": "2.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "13db521f90a6a882027b2388eaa2ebf252945f9c2adb7e7e371da18239da4df0", + "name": "accelerate", + "version": "1.15.0" + }, + { + "direct_url": null, + "metadata_sha256": "86fe44e38e67872dd895c729044942ba2c2f934ae439a899fb83a186206b7fd4", + "name": "agent-detector", + "version": "2.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "afe11fe9f5aa54e734cdd51659bed8c89dc6bcd5aef0ad96f2d20149c8de5456", + "name": "aiohappyeyeballs", + "version": "2.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "570b307bc0b53fbbd3ed2ce0b7eca6bbf2fa73bf75e24a480f1034d8c0b832bf", + "name": "aiohttp", + "version": "3.14.3" + }, + { + "direct_url": null, + "metadata_sha256": "44b7f8e14c4770793e747fad50c9e0a6ee7357651d878554f192d94768dc14a8", + "name": "aiohttp-cors", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "648813a44a9ae0ab2f20ee86d2404dcc38e3f9e80c63316cf6e536735df14e54", + "name": "aiosignal", + "version": "1.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "f6a3f6668bacef7f73a2c19ccb2be910b2363d1731c4725cb04364d99e24935a", + "name": "annotated-doc", + "version": "0.0.5" + }, + { + "direct_url": null, + "metadata_sha256": "fc6d752cde6a6a4bff03474386de750e130b75da3c7815ee909f45b51fea98c8", + "name": "annotated-types", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "4e89d670a4b20029da30e5a9e8ebcbc844deff9c44209552bafd5537249c8b9e", + "name": "anthropic", + "version": "1.9.0" + }, + { + "direct_url": null, + "metadata_sha256": "b5a6f00800956387fcddab1fe1b5aa8502c249b86cfb16d58ed700f282f60142", + "name": "antlr4-python3-runtime", + "version": "4.9.3" + }, + { + "direct_url": null, + "metadata_sha256": "a6008defa9492cd08250217b134782cad1db4580e1d7ddf69cc2a2a48cea24e0", + "name": "anyio", + "version": "4.15.1" + }, + { + "direct_url": null, + "metadata_sha256": "7877c64ce8957237363f2df313819bb07f50752df016d14c5a5a99bec10f5deb", + "name": "apache-tvm-ffi", + "version": "0.1.11" + }, + { + "direct_url": null, + "metadata_sha256": "3543ca8f0e072c00ab111b20eba99ce86dbf93ada28988775bc2677284b3c07a", + "name": "astor", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "d4b328c09c024fe1e4d788a9c7715ad726095131b815cd35fd933268226f6269", + "name": "attrs", + "version": "26.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "4850c4d696a5e2a2ecbb3dd792b060acc1de79e09800669b0b9fc3a22c055e6d", + "name": "av", + "version": "19.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "863ff92208d0a02dabfa008bfe91846a5c401ded301e5687dca7dc63c911865f", + "name": "babel", + "version": "2.18.0" + }, + { + "direct_url": null, + "metadata_sha256": "f32e6df3197f05202e586624d95c5e217003d80cee655c165d533102f628df21", + "name": "backrefs", + "version": "8.0" + }, + { + "direct_url": null, + "metadata_sha256": "905c362f655fbc6d37a24686efc2b3bfbd3123b8ee5a443a43f6750d87455e90", + "name": "blake3", + "version": "1.0.10" + }, + { + "direct_url": null, + "metadata_sha256": "07c85682b6aefd5c9b48890d306c1604311902295704892ede48e5a83219a8d3", + "name": "blobfile", + "version": "3.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "2d582941a7081625a35f35a0c4a2e80f7737312e29c38e5fdb6fc08f9c113077", + "name": "bracex", + "version": "3.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "3b60c55bae0d0340c3a3fd918635bbfa3087579da66e0fd7f6be7a3782c0da3d", + "name": "cachetools", + "version": "7.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "5d11a6878d5bc3f22290281a19ef7b36daa95c910780950608b95cd788c7e12e", + "name": "cbor2", + "version": "6.1.4" + }, + { + "direct_url": null, + "metadata_sha256": "362c9942c48051f168ed2b9f2146266b7792d3c05e164cd6afc3f3b65884fdc9", + "name": "certifi", + "version": "2026.7.22" + }, + { + "direct_url": null, + "metadata_sha256": "b4abf1bcf1c1d8e0272d8007fc974499ea59e5f2a5b98af3c78a5e67515a9d87", + "name": "cffi", + "version": "2.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "766120f13c177446f51929a4d201104bc935b6d5a2a176cd6716edce757d3d95", + "name": "cfgv", + "version": "3.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "610e9a9d03ce837ffe6e42be5e02e70087f73863f7350bf7bb7f0511edcc5ec0", + "name": "charset-normalizer", + "version": "3.5.2" + }, + { + "direct_url": null, + "metadata_sha256": "7ad836b3147c9702546d9c28b4fa5be23b24445439db5d0d2a58d17281c84daa", + "name": "click", + "version": "8.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "4c5f00599ebcbf11d337e48a72784d256ca3d704fa9e9f5daadd60065e6776b7", + "name": "cloudpickle", + "version": "3.1.2" + }, + { + "direct_url": null, + "metadata_sha256": "a0970189e3ab7a596d6902d5f61f93b414f138f03d3cf19029145657bfceb382", + "name": "cmake", + "version": "4.1.2" + }, + { + "direct_url": null, + "metadata_sha256": "94a6ebf9718e55f254a43ce0d2f04e0d6d44e7141b6f3144a84feb6519a77bfd", + "name": "colorama", + "version": "0.4.6" + }, + { + "direct_url": null, + "metadata_sha256": "ca8ec227f406d970a645ec482b20619128dd34b9cf71159cc24e27db461a2711", + "name": "colorful", + "version": "0.5.8" + }, + { + "direct_url": null, + "metadata_sha256": "bbaa51b7e4d8f142bd075d01257c0572c0c844796d51426e35c8096a13e8da76", + "name": "compressed-tensors", + "version": "0.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "6063d8ff7ebc458d63a4332853d7ababf4ee2b86336362c8d2b12be6e998eb6b", + "name": "connectrpc", + "version": "0.11.1" + }, + { + "direct_url": null, + "metadata_sha256": "ac5f4b5a5f68080bd9c3fe77399fe8a1bff2ee5923c49db1df544dd054cbf15b", + "name": "cryptography", + "version": "50.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "f41d2f6b4616accca2f5e1dd47aa9e8937c28076cde698226d93e727751f3099", + "name": "cuda-bindings", + "version": "13.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "e5ca6ed34c687c6f4a4d157ad0a2cf06ec0316fe8c4c0ddeb666ad76dd6f30f4", + "name": "cuda-core", + "version": "1.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "89baadd9da23dce9990481519544115615ba3cbd2d1a41e09feea7756fffb378", + "name": "cuda-pathfinder", + "version": "1.8.2" + }, + { + "direct_url": null, + "metadata_sha256": "1ab914b9a57ca601df2e3cfe9608427b15d8afb78029076ace5d1caf9fd45f08", + "name": "cuda-python", + "version": "13.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "73d97a5eb578223b4895ef4f234574d14219cef9999ff7d0e92a3d0dd057bd3f", + "name": "cuda-tile", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "ae6f957fe66ed63081d1d83ee6e8838f3a0af2c6fce1223629d0dd6264565ead", + "name": "cuda-toolkit", + "version": "13.0.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "1f8e0ae51ad5feea63f58ed2e24f3da6f23ed548043235a14f7623d961dd9b64", + "name": "datasets", + "version": "5.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "153f4a4d6ff03dbe5c8ad7fe54bc2e7b989a4947b70f7aa77fbf652b394f2a2e", + "name": "depyf", + "version": "0.20.0" + }, + { + "direct_url": null, + "metadata_sha256": "ee09fc752d7271aac93079cfd63409957dc6b536c1ffd9355a01bf7297e72aa6", + "name": "detect-installer", + "version": "0.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "a7feab2c4f69fd5f85e5a3cb495a7f1870a6bf8199dcee5339e8118f7acbdc09", + "name": "dill", + "version": "0.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "fef3fde661fe30ba7bd1d78841a797136b2b3461705bb4eb92dc54f8308bbaae", + "name": "distlib", + "version": "0.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "fef3fde661fe30ba7bd1d78841a797136b2b3461705bb4eb92dc54f8308bbaae", + "name": "distlib", + "version": "0.4.3" + }, + { + "direct_url": null, + "metadata_sha256": "a3ca2e39abe76c4a33d5fe4a2a84375ec9f25cdfdb7e1d8ea406bd6f1603205c", + "name": "dnspython", + "version": "2.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "92a07daad5e6ff461199de14e845d9b376e309ef916ce5379f3c9cd4e3b1623f", + "name": "dockerfile-parse", + "version": "2.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "5b566b25f0cbe4955d0b16844a7cc6d2002caa3bde2dfda7f301fd8870cbaa56", + "name": "docstring_parser", + "version": "0.18.0" + }, + { + "direct_url": null, + "metadata_sha256": "5a1080b5768c6c591e1c4f9c9812cafa808781b9eeb198043bf185e22d4a1613", + "name": "e2b", + "version": "2.51.0" + }, + { + "direct_url": null, + "metadata_sha256": "0a63979e0b946e16238e4339e60d9c1eb5a7ce3ea93dae78b5da9c65a6190540", + "name": "einops", + "version": "0.8.2" + }, + { + "direct_url": null, + "metadata_sha256": "16cbe67a57558f1d4bfdbc22a454434ba301750c57a62b1d3f5361c9e5cddc00", + "name": "email-validator", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "0617ddb55b90b42ddc9398dc7e91d61fe928a2504939f76526dc15b22d238caa", + "name": "fastapi", + "version": "0.136.3" + }, + { + "direct_url": null, + "metadata_sha256": "ddd82b9666c21988e234d623e2575e1b89fd4133260eeab43fc9a7c074f7024a", + "name": "fastapi-cli", + "version": "0.0.32" + }, + { + "direct_url": null, + "metadata_sha256": "611602e834d42e10433155ff5f5581358d732fa6b6f6f7820a8f79e74b1ce1f9", + "name": "fastapi-cloud-cli", + "version": "0.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "794524e4a9659bda6043721d848d028ea49996085a33326094fbaaa3f6e6b895", + "name": "fastar", + "version": "0.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "711401d36e60e10e35beb4d0f1bb42bf0c4d86339ae52f32b9aa4a4d790530dd", + "name": "fastsafetensors", + "version": "0.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "efaea9742e348c4c4bdcc6f616a33cc5aa3ae926494a72a46690b7da2f08ed5c", + "name": "filelock", + "version": "4.0.7" + }, + { + "direct_url": null, + "metadata_sha256": "99bd6c3f10781d3d2d350f2c3c9fc4765b55f25de8a6d6dd1f71501802d1255e", + "name": "fla-core", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "0a6ef979b75295cee2b5293ad4942b0cf2682e9e38680203064e0b70249c1a96", + "name": "flash-linear-attention", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "76b70a11ca82ea4606b529e7a8658cb3fe71412afa46f2ed57101dd91ba27558", + "name": "flashinfer-python", + "version": "0.6.18.post1" + }, + { + "direct_url": null, + "metadata_sha256": "ba8ff415192b5cbb90efce046e2271a00c8184afc362d8b47fbbc84d5e558b05", + "name": "frozenlist", + "version": "1.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "e7712831c80eb13b08fb7f7cc33988a8f24654af9eba7c6f5f943b2636e4306a", + "name": "fsspec", + "version": "2026.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "025de85c794878d0caa737869307447595f514ebf9599eacb5b1a501bae479b6", + "name": "fsspec", + "version": "2026.9.0" + }, + { + "direct_url": null, + "metadata_sha256": "ca94883bdeaa3740b45b6994443b445fd67c6e4a8064ac3bf9d92d2a5221eee8", + "name": "ghp-import", + "version": "2.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "a7e90983562a035cf767baa63d8c32bc37e1de7cad71ac7b6b2bc70a95bba4eb", + "name": "gitdb", + "version": "4.0.12" + }, + { + "direct_url": null, + "metadata_sha256": "dd96143ec79178bef685c1f5c0a58a87a66d003b421e605de65697308321d518", + "name": "google-api-core", + "version": "2.40.0" + }, + { + "direct_url": null, + "metadata_sha256": "0735d57088a83df2355e16843107fb0112abe2178fc5bb8132947a7ad962aa41", + "name": "google-auth", + "version": "2.59.1" + }, + { + "direct_url": null, + "metadata_sha256": "2f3aa9d9500d329560440e6a5a152e420aad5f5bbb23701f45b740be721784a1", + "name": "googleapis-common-protos", + "version": "1.75.5" + }, + { + "direct_url": null, + "metadata_sha256": "06d74ab04fdc03fad368868907f0d10e7d9f397aab58d58965c0b78ffaec34cc", + "name": "griffelib", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "7ee1c179e2c68a62968308b2f96f4f3469176ee3ac8bdb494ac80188d4d41271", + "name": "grpcio", + "version": "1.84.0" + }, + { + "direct_url": null, + "metadata_sha256": "04cf3a4a91575850f386f4fcfdedd8e7fbfba08feff038fbc1296d1e854db2dd", + "name": "h11", + "version": "0.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "b954a6ba4739c0cc878bb8ea27ea7c7154a48bb4b7c06dba9e9cf880cf0ec930", + "name": "h2", + "version": "4.4.1" + }, + { + "direct_url": null, + "metadata_sha256": "6f0d7bf86e75d0bda1ceccc82367c0145ad0ec522c4d4f51bb454f467faadcc9", + "name": "hf-xet", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "f991b847550cf8225f69562902b5ccb591b2ce9a08fe07ef6e6d701bdb4694a7", + "name": "hpack", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "314d194165c4700034c1c67cee847d549a6d7091374c71f2cef0186ec56a3eb9", + "name": "httpcore", + "version": "1.0.9" + }, + { + "direct_url": null, + "metadata_sha256": "aed9767360bed1bcbda71e3b1a3c996603f86558bc77a1693ee3d09973d20cad", + "name": "httpcore2", + "version": "2.13.1" + }, + { + "direct_url": null, + "metadata_sha256": "8fa3bf3510c35e2eea9f523a1cace7120079cf51d76c4acea97de95806aaa14a", + "name": "httptools", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "3bf4804c215d111b6a4702cf9000021ab39807d1ed3207dd011b14b2843b2d14", + "name": "httpx", + "version": "0.28.1" + }, + { + "direct_url": null, + "metadata_sha256": "d11dd50813b8914bd9455e8b2b591171cd2b1618883943153afadc8bb9224678", + "name": "httpx2", + "version": "2.13.1" + }, + { + "direct_url": null, + "metadata_sha256": "43b119c34ad2b2aacc032a1a6a8feb142fdb5ca407a3519325d74dd53d8904df", + "name": "huggingface_hub", + "version": "1.33.0" + }, + { + "direct_url": null, + "metadata_sha256": "9ce850d5a6b775e5ef4a335f907e579a878e058213121b6eec567781ea68c585", + "name": "humming-kernels", + "version": "0.1.12" + }, + { + "direct_url": null, + "metadata_sha256": "67aa4f6717d82446a51ce350e7c4769eba0c4a22d2f428255cddd9d24b11a914", + "name": "hyperframe", + "version": "6.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd9511ede42f63b995c3f71944f908cb8f014048b63ecc1c8d420525a3354b59", + "name": "identify", + "version": "2.6.20" + }, + { + "direct_url": null, + "metadata_sha256": "af3c3a62bb5d82d6a43454684e0b1dedde27a21ea90eacfb1bed9814619f06d0", + "name": "idna", + "version": "3.20" + }, + { + "direct_url": null, + "metadata_sha256": "cf71393f3d079ce2e859384573e65aaacd1709bef700701f629df32398b598f0", + "name": "ijson", + "version": "3.5.1" + }, + { + "direct_url": null, + "metadata_sha256": "9305763e93d03df0e36516b1125fa046a6ebe37d44589e200e0593cf4bdfd980", + "name": "importlib_metadata", + "version": "9.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "32860c3c19b2e91f6cb5bd83400b5870cda051bc74a5a08822c8c666af0990db", + "name": "iniconfig", + "version": "2.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "560faabb3d45d779e445a74e7e806a786f95f2200fa06d979603b7f0ee1cfb39", + "name": "instanttensor", + "version": "0.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "f6fc1f0d389e4245fc2a1a0fdfee09422e56200cb6f94659668456997ff4f7a9", + "name": "interegular", + "version": "0.3.3" + }, + { + "direct_url": null, + "metadata_sha256": "d10f300731197a4829b77f0c883bb3cf8a37ae8c76a302e095fa95d6427706d0", + "name": "jiter", + "version": "0.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "5b0c8d4b4c535a2432fb206223d774509b6e20af374c6a4b6f98bf72a7de6702", + "name": "jmespath", + "version": "1.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "6c4032c2e74273452cd77399af2ee85198f49c22da897983f26d2ed6f787c4e8", + "name": "jsonschema", + "version": "4.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "aaa6cd66f423729e8da397c9d533b7d731f6b25f3d6371b9338c36bdb9be74a0", + "name": "jsonschema-specifications", + "version": "2025.9.1" + }, + { + "direct_url": null, + "metadata_sha256": "f7c0687c032593106a2e5a3c241cf8043e7e2c222bddb0022b4cb2bf5de67115", + "name": "lark", + "version": "1.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "4511c6b04efc57a5f5333edc1f5f48b9f5412c3923d4bc19b715bdf47977511c", + "name": "linkify-it-py", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "be929870f6ecae18a819c56118f1101f3076e25ac6a4843ca6f4707ebd1e87c6", + "name": "llguidance", + "version": "1.7.6" + }, + { + "direct_url": null, + "metadata_sha256": "cf2b87669bead3e76ec54207f3354c13f73b50c32fcd13c8d627084b3379139e", + "name": "llvmlite", + "version": "0.47.0" + }, + { + "direct_url": null, + "metadata_sha256": "0a416d79c5543d94d2b18807626293d4f47655d1d22724c7ae296e413078aaba", + "name": "lm-format-enforcer", + "version": "0.11.3" + }, + { + "direct_url": null, + "metadata_sha256": "16bc1f59e34fd2a6633bd395276052eacd2c777b2cf72781e76b203f013a8fac", + "name": "loguru", + "version": "0.7.3" + }, + { + "direct_url": null, + "metadata_sha256": "5216d5acfd039a7b581a826186309594b228d37d2c8d56864124ea666689fe4e", + "name": "lxml", + "version": "6.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "f59d772b35315a928672bfcccfb89d82c0aac672c5275c048f7a93b79015bcea", + "name": "markdown-it-py", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "b137367ef0056711cbf5e53015df9168cab80373104e7899b1c0263a21d9c99c", + "name": "mcp", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "38e0b9edaae09e58cd1461fc961ced22672038a697930bedef153a74befb3de1", + "name": "mcp-types", + "version": "2.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "799f49685865fd9cc8915fdb92a33e102eeeffad562b03b4aeffb6f422b771c1", + "name": "mdit-py-plugins", + "version": "0.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "481f9cbe08596c6eaba6343e0efa1b13b2362c30dce0610f7c08523f1d98388d", + "name": "mdurl", + "version": "0.1.2" + }, + { + "direct_url": "{\"dir_info\": {\"editable\": true}, \"url\": \"file:///Megatron-LM-training\"}", + "metadata_sha256": "2876c0c760bbfc93bd7d737bf0db2866a937308a7c1707c3a2bb59d4795986ff", + "name": "megatron-core", + "version": "0.16.0rc0" + }, + { + "direct_url": null, + "metadata_sha256": "a6e34d488c879f57ce042bec38f8864ba3ea7d6ecf0ab757fc88fe8dc0a22f26", + "name": "memray", + "version": "1.20.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd26d80dc9676b1fb8c894355bd525fbe7f49a6a86a555c72e9ec6d927247c33", + "name": "mergedeep", + "version": "1.3.4" + }, + { + "direct_url": null, + "metadata_sha256": "dd1b3b89e88d1c65a26e6e72dd075eabbc220bfb138769ec8b64578ee911795c", + "name": "mistral_common", + "version": "1.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "4859847a9f6321daf8849cf7fd1542ff430db6563a2abf9ac0d62a5b21bd951d", + "name": "mkdocs", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "1729fc31479f2582486cdc85397417659dd3b2fb3f920553de66cfe59d5f0b3e", + "name": "mkdocs-awesome-nav", + "version": "3.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "88b4b7b7c0aba5547befdedaf515c8df4867361daf55ff60b72578464d72dcbe", + "name": "mkdocs-get-deps", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "ad33bb33fb16b1f69689c4682550e97232154e367e2c8c8aee9dad0f10d269ce", + "name": "mkdocs-git-revision-date-localized-plugin", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "ed69fbfb9ac00c10c5a383a12ff9d2b9919ae184e408554434199211643d6040", + "name": "mkdocs-material", + "version": "9.7.7" + }, + { + "direct_url": null, + "metadata_sha256": "d1c549b61701148b97f8246bc924b2840e504b37b0ce7a27e78ddf81261e5363", + "name": "mkdocs-material-extensions", + "version": "1.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "4ad6171f3bf6812e4de90670ff0089d445093d4fe1d05d55f17b96a4a192a816", + "name": "ml_dtypes", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "4ad6171f3bf6812e4de90670ff0089d445093d4fe1d05d55f17b96a4a192a816", + "name": "ml_dtypes", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "b0dbdfa30ab6b1ce637a794899c9e43019182b6d1ab2d07b90f647f7331eba6b", + "name": "model-hosting-container-standards", + "version": "0.1.16" + }, + { + "direct_url": null, + "metadata_sha256": "95424470e481cfa8d18b30963b6de3aafe16614b1ea0414e184a008571dde84f", + "name": "mpmath", + "version": "1.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "eb184d83489401903615ce8a78d98d5b933dec0f7246811d396a529915fe797c", + "name": "msgpack", + "version": "1.2.3" + }, + { + "direct_url": null, + "metadata_sha256": "520006303d6a0e859970b83f7d452196e2e8f6dab08f6dcf1ba5823c1230025f", + "name": "msgspec", + "version": "0.22.0" + }, + { + "direct_url": null, + "metadata_sha256": "010d2fe039006070a711a476b171b7b7da5c29ccad3c4eecd77ef3711b07c2d0", + "name": "multidict", + "version": "6.9.1" + }, + { + "direct_url": null, + "metadata_sha256": "235634cc7ebda45f8a84dfdb1b9b35ac1a77a1888b34650c3a616d23e4a7e93f", + "name": "multiprocess", + "version": "0.70.19" + }, + { + "direct_url": null, + "metadata_sha256": "7c545b4b3e5e83d3fde41352272c10cb9deeaba5b7138fbf24383e952af8822e", + "name": "natsort", + "version": "8.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "311ee8cdaeaf9f11acf51cda9c3b5b191f76ce9d98bc3418164c3189bbc37a08", + "name": "nccl4py", + "version": "0.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "66360539217852c3b44b37f409eade7e1559baf018bb363bacb2aa3a9759b203", + "name": "networkx", + "version": "3.7" + }, + { + "direct_url": null, + "metadata_sha256": "e8b0b1746808b87816c47e4531780ded7f246bed9575a89e8b40200aa81e9a13", + "name": "ninja", + "version": "1.13.2" + }, + { + "direct_url": null, + "metadata_sha256": "77c1117f0dbc41560ddc6e6b37b542fb4e88afcd4ef82ec06593e5bbd5f37121", + "name": "nodeenv", + "version": "1.11.0" + }, + { + "direct_url": null, + "metadata_sha256": "9af629898406c9eaa69897fe09220dc483270cdba89f6b20bf0165cdf0e1668e", + "name": "numba", + "version": "0.65.0" + }, + { + "direct_url": null, + "metadata_sha256": "0c7281a81cf76e40b27c1385ffd8a215d7227adc219f177ce807ead9e91994a5", + "name": "numpy", + "version": "2.3.5" + }, + { + "direct_url": null, + "metadata_sha256": "0c7281a81cf76e40b27c1385ffd8a215d7227adc219f177ce807ead9e91994a5", + "name": "numpy", + "version": "2.3.5" + }, + { + "direct_url": null, + "metadata_sha256": "bab990ced4537ce74ef5961ca933c4c6fd604fd09a5827a4a428c55bcb0be35b", + "name": "nvdlfw_inspect", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "10f6595146332d35f7f15a000e08b5c81432528c5d026470c1d03f0c1399fb70", + "name": "nvidia-cublas", + "version": "13.1.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "58e933b4ac8e49f098b16ab7480d03bd792afc3d1db10d0aacbdcc2c62e48fa3", + "name": "nvidia-cuda-cccl", + "version": "13.3.4.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "baac937970681d41aa0c3708b3d55d73f8d29e70aceaac0e71fe6d1548e94a09", + "name": "nvidia-cuda-crt", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "8d51e5c76ef5707b0b80d5ec9a791c0f11a480ab721820cf100a3cc566017eef", + "name": "nvidia-cuda-cupti", + "version": "13.0.85" + }, + { + "direct_url": null, + "metadata_sha256": "724bf56e61ddef5d4c2482ff64103a973b911b110b668acaea5373f6c83c1c5c", + "name": "nvidia-cuda-nvcc", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "c54801dbd815d534519a761f1f328325aa0f1d1f1659aa969fa74e7a2c76eee9", + "name": "nvidia-cuda-nvdisasm", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "af51f248363020b9fdfd2743704e901bf3d19a1a1ce1fe44fb98ba148bfc0157", + "name": "nvidia-cuda-nvrtc", + "version": "13.0.88" + }, + { + "direct_url": null, + "metadata_sha256": "055f7fc69a5a2159de82cd0718da02c8852e81c8a71ebb117b8e799badd7167e", + "name": "nvidia-cuda-runtime", + "version": "13.0.96" + }, + { + "direct_url": null, + "metadata_sha256": "df18686dbdb3074ca375a1d6c623a04102fd348950c67a721397349c6d4f0477", + "name": "nvidia-cudnn-cu13", + "version": "9.20.0.48" + }, + { + "direct_url": null, + "metadata_sha256": "abd0ca3f67af19a4d383ff2a012ae0090d4731c6492fd47236615308a50b3981", + "name": "nvidia-cudnn-frontend", + "version": "1.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "4a78545d424d0c5038353f7046a8ae40ceaf312045d71399eac9511f5fc15434", + "name": "nvidia-cufft", + "version": "12.0.0.61" + }, + { + "direct_url": null, + "metadata_sha256": "e49b909195c03ddbe203729d9b31dd88e3f207368333d1909c67c6b130a0c696", + "name": "nvidia-cufile", + "version": "1.15.1.6" + }, + { + "direct_url": null, + "metadata_sha256": "bb15a754c6be32c23aaac13c1cfa7a8ce53d92bc26652ec3b609f7a5cce3e7d1", + "name": "nvidia-curand", + "version": "10.4.0.35" + }, + { + "direct_url": null, + "metadata_sha256": "0dd58f677811eac04901a793740932e5a2a8fff2f5453aa6351614eb18391bb6", + "name": "nvidia-cusolver", + "version": "12.0.4.66" + }, + { + "direct_url": null, + "metadata_sha256": "8aeb284782ef6883095a5d1c110e221cad023a99afcfd5cdb4969a25e146d562", + "name": "nvidia-cusparse", + "version": "12.6.3.3" + }, + { + "direct_url": null, + "metadata_sha256": "09555246122896eaca3b8313eecfca4b339fefd3b597874cb9fe3bf29dab38c9", + "name": "nvidia-cusparselt-cu13", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "ac77bac79fbfb0c52ac6e2e5abc936b1e127be2192f0cbc27b00be3125fa86ae", + "name": "nvidia-cutlass-dsl", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "1ec968ec7c4083f7fe4e1fb8384c7e9b853a81491fef9f4cb1cf755961aaedf6", + "name": "nvidia-cutlass-dsl-libs-base", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "cc6f3846cd820013eaa6e2665c493d70c607be6ce7349b939eb4742888470585", + "name": "nvidia-cutlass-dsl-libs-core", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "2357d0df2d0d17c0b16663b8a89df53f751b19721f66821fd88fa78112c08e55", + "name": "nvidia-cutlass-dsl-libs-cu12", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "244590c25662dcf777b1daae97a858afe1a1aec62e5e6678b217007a459ab552", + "name": "nvidia-cutlass-dsl-libs-cu13", + "version": "4.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "c3a25ada01f57418c1b897406c3abab18834e6adc573ab7b060620c453afb6db", + "name": "nvidia-ml-py", + "version": "13.615.71" + }, + { + "direct_url": null, + "metadata_sha256": "56baad4e7f699902b03b17580933f7bd50b6ea97b7df9d7e807750973da7529c", + "name": "nvidia-nccl-cu13", + "version": "2.29.7" + }, + { + "direct_url": null, + "metadata_sha256": "98810ef0ab8badc369e6a46a038f8ee9f412c0c753fb5ad580544f23a0aa7962", + "name": "nvidia-nvjitlink", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "b0f54ee21909d19640a58e05da755c91763eb5725f544fd0d4b84b2f5f94deba", + "name": "nvidia-nvshmem-cu13", + "version": "3.4.5" + }, + { + "direct_url": null, + "metadata_sha256": "06dc1a593c7e8b8c3f29184228c83f8f7ef57787ad91f3e5bcae1d238dd3092a", + "name": "nvidia-nvtx", + "version": "13.0.85" + }, + { + "direct_url": null, + "metadata_sha256": "32ee63450a437b6a6ed227ff6549144aa596197a322993521ec7af826ebd413e", + "name": "nvidia-nvvm", + "version": "13.4.92" + }, + { + "direct_url": null, + "metadata_sha256": "32c2efdcd2c673b3b7f35ca9c2cccefaad36f1f0a920648a13cad85f6a5767b2", + "name": "nvtx", + "version": "0.2.15" + }, + { + "direct_url": null, + "metadata_sha256": "3419d80e114a2c19fa9bd3582939a3942f19673055707ba6ca2ca489d58b41e0", + "name": "omegaconf", + "version": "2.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "28971076ce9c279d4b889496b046d55a1e05b02fb9851ceb717e9a10df799572", + "name": "onnx", + "version": "1.23.1" + }, + { + "direct_url": null, + "metadata_sha256": "1246f5a4d8295907a42e809ed9173ede2510ec9d260d2168989d126564897fa5", + "name": "onnx-ir", + "version": "1.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "e14643636835759700dff286f949c5ec34e7eac7ac47f44096414f0e0f1c3101", + "name": "onnxscript", + "version": "0.7.2" + }, + { + "direct_url": null, + "metadata_sha256": "00f847e99939207bd70dfd806428f6b20a3d01074b59325e4c76149a2e19be26", + "name": "openai", + "version": "3.22.1" + }, + { + "direct_url": null, + "metadata_sha256": "598d3ad5a22a14a7c4f1d218b43e345f32b0ba094b753467bae8a3f708fd48cb", + "name": "openai-agents", + "version": "0.22.3" + }, + { + "direct_url": null, + "metadata_sha256": "5a0afcb1ce845e05da12beb1767f5d2749bbc9e9050718c6b9fa3c225713c9eb", + "name": "openai-harmony", + "version": "0.0.8" + }, + { + "direct_url": null, + "metadata_sha256": "e86a6b6fcbbe152805f782c57df321002892e163019574877e9829272e25eb4e", + "name": "opencensus", + "version": "0.11.4" + }, + { + "direct_url": null, + "metadata_sha256": "53d669c8bd3d32d3275153b454e515ca5cc6dec92fae3a98309b5a2b19fe6d2d", + "name": "opencensus-context", + "version": "0.1.3" + }, + { + "direct_url": null, + "metadata_sha256": "19778b6d66b0e45bf73e11fa37a208949d5b393aef914627394d5601455546a6", + "name": "opencv-python-headless", + "version": "5.0.0.93" + }, + { + "direct_url": null, + "metadata_sha256": "19778b6d66b0e45bf73e11fa37a208949d5b393aef914627394d5601455546a6", + "name": "opencv-python-headless", + "version": "5.0.0.93" + }, + { + "direct_url": null, + "metadata_sha256": "a3f5434fa7c80f7f7abc82173da639c8e9c59d30b4027182645562bd3d2f4f97", + "name": "opentelemetry-api", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "8611977ea596e4827874582e86250618444e1c718229dddfc16e5ea437ce5fcb", + "name": "opentelemetry-exporter-http-transport", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "2cfd41e5ca33292d987ba71fa6186d11e16ed66888f3a26f8a3a99060c4b5e90", + "name": "opentelemetry-exporter-otlp", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "3bb4494220732d4bf10e1dba231ea7638cedaa5362e1f23a50d34a14f520fea8", + "name": "opentelemetry-exporter-otlp-common", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "27fb1c8aa5c2cd07776f9f3281fc618cd3feb96017757c33d2b3586fb7fec88b", + "name": "opentelemetry-exporter-otlp-proto-common", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "5cba6098cdd0bfb06853a6c704a2451c4f82c9dea376a30b59ecd279296648ad", + "name": "opentelemetry-exporter-otlp-proto-grpc", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "6f53ef1c172ebf87af69b9ef390aa908506d0cd14bc7811985fdd937a4058808", + "name": "opentelemetry-exporter-otlp-proto-http", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "1910f4e7ebd497e98b6d231e10275288fda2cd1885117575706c62f45e065889", + "name": "opentelemetry-exporter-prometheus", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "fab18b721e30be41448be252e1dca43b48e7f15d971e0bb552492c0ef4b07bee", + "name": "opentelemetry-proto", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "3644a79f55762a646799ff52b9d837e01c8192b7b28f735a383f55c90edb9bc2", + "name": "opentelemetry-sdk", + "version": "1.45.0" + }, + { + "direct_url": null, + "metadata_sha256": "add3db481f7f401f65cfbddb058fde3bb4c9dd7b61064a84f8598ad7efe0b11c", + "name": "opentelemetry-semantic-conventions", + "version": "0.66b0" + }, + { + "direct_url": null, + "metadata_sha256": "0dfff30e912520a226bcf7a547393484cfcd8c738439c7b48418f61c95109480", + "name": "opentelemetry-semantic-conventions-ai", + "version": "0.5.1" + }, + { + "direct_url": null, + "metadata_sha256": "210ce26bad0a245a72831b4fa029708c245d4d670a88c8d5a69b1446c24a95e4", + "name": "orjson", + "version": "3.12.0" + }, + { + "direct_url": null, + "metadata_sha256": "35ff73511848f5f934ccc39d538014716ec4579e76d54e0e407ff51794a7939c", + "name": "outlines_core", + "version": "0.2.14" + }, + { + "direct_url": null, + "metadata_sha256": "8ee2f7138ade46b6e348a6d099612f5bd6caff13511f3b4144327f37ce50eacf", + "name": "packaging", + "version": "26.3" + }, + { + "direct_url": null, + "metadata_sha256": "a4ab87bf8083001f25ccdc46095f05b678b3569dd58edc2cf941e3e7f64d7c88", + "name": "paginate", + "version": "0.5.7" + }, + { + "direct_url": null, + "metadata_sha256": "1de96a6c28c2e5613c9c87cd4ad9484791001cf58df43cf2ba74d5c4f85f0ad2", + "name": "pandas", + "version": "3.0.6" + }, + { + "direct_url": null, + "metadata_sha256": "d05b8d05da9f78176b2eefaacdfaa5e96708ec4f488daea8bbc52e3ed1bc3954", + "name": "partial-json-parser", + "version": "0.2.1.1.post7" + }, + { + "direct_url": null, + "metadata_sha256": "c1d126edceac2685e29403a8ae3a27c47143dce1f0252fa3931771562f1e2b4f", + "name": "pathspec", + "version": "1.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "30325dc8ce17bc64f9dbc0a449232fd35841a019df22a6f481007c9c5a28c1cb", + "name": "pillow", + "version": "12.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "cbc0b7b6e63b50dcb7c17cf3526a9304f285d9a31353adf3b22acc2059ab23f5", + "name": "pip", + "version": "25.0.1" + }, + { + "direct_url": "{\"dir_info\": {}, \"url\": \"file:///work\"}", + "metadata_sha256": "6ba03b5bc457a2a3d92468729501b5892a0d38ebcc36766c58859449498c5743", + "name": "pip", + "version": "26.2.1" + }, + { + "direct_url": null, + "metadata_sha256": "0421937c4410b61c5325233d5b7671ae933bae8de174f87586ac55aa804851ea", + "name": "platformdirs", + "version": "4.12.2" + }, + { + "direct_url": null, + "metadata_sha256": "2bcffab42626e1fb50d6329765619312d30fe7f4880e98dcee99c92ebd283bb4", + "name": "pluggy", + "version": "1.6.0" + }, + { + "direct_url": null, + "metadata_sha256": "7e7562ba7c032f8edd02641ae71b1ac2d8f388103a68d777a7e907d19e75bc17", + "name": "pre_commit", + "version": "4.6.2" + }, + { + "direct_url": null, + "metadata_sha256": "bbe0a7662602ddd23f929fe0ee98e9d04406e138aeee18ce4861af186ea6060d", + "name": "prometheus-fastapi-instrumentator", + "version": "8.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "ece4a61f3ffb92a083fd5e47e180e3e070342e60a3bd93876a879e79a643e821", + "name": "prometheus_client", + "version": "0.26.0" + }, + { + "direct_url": null, + "metadata_sha256": "5feba21a58eaa126e7e7739e57e2572e5bb251fcbf56e439e508acc47d769314", + "name": "propcache", + "version": "0.5.4" + }, + { + "direct_url": null, + "metadata_sha256": "3f136dbf7239c987a7685acd33440cc5efd6c4107b4b11c425201b4de70ae36f", + "name": "proto-plus", + "version": "1.29.0" + }, + { + "direct_url": null, + "metadata_sha256": "118b5ad013120a7a6e24714595ad776bf264d7b0060389133310d18ea1480902", + "name": "protobuf", + "version": "7.36.2" + }, + { + "direct_url": null, + "metadata_sha256": "0849f5a519bf9bc23ef204443fdd8d6d10678863acac7ca9340fc11bfba5a856", + "name": "protobuf-py", + "version": "0.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "eab5f2f4fd98f67a710a8fb1975b64ffa880a4f977566f022c567e08e324ccd6", + "name": "protobuf-py-ext", + "version": "0.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "39009938840de3a8b2a37eb4668d2601aae8c74e4b74743f73e59996b5b7e6e1", + "name": "psutil", + "version": "7.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "df44b58e8a4cfe57f65773ec47f7bdf2a14c8f5f73a7abf331a6b6237d6d691a", + "name": "py-cpuinfo", + "version": "9.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "2fd4a9efc5e5c74ae4c2fcf1970193c524c62ab22af8d5e66ebf7df9e6e46e83", + "name": "py-spy", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "d2ccdeb15cddedc81637a83e40baa6397fe269023b738d0fc3cb2d90722e290b", + "name": "pyarrow", + "version": "25.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "47b9f28e971a56f5adf949e0bcf105b0bf6587946566ecf197a2819d8848cc01", + "name": "pyasn1", + "version": "0.6.4" + }, + { + "direct_url": null, + "metadata_sha256": "82ce4c01c6d36841b9801fcdabab9bfe61d0b5e4e440c275941d8a2d4a790730", + "name": "pyasn1_modules", + "version": "0.4.2" + }, + { + "direct_url": null, + "metadata_sha256": "45cb345e4c12f63bc843b8c88902cc44c4d624a55aaef8cd5ffbc0ad16356fbe", + "name": "pybase64", + "version": "1.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "d311ae661edeac8ff029ab2960d065a7e792ebf8f79af682daa53109fe81318b", + "name": "pybind11", + "version": "3.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "cce9c0d440d065d4cdfb0d00004b8ddd65cf363a740efc5b0920b29201a59cd9", + "name": "pycountry", + "version": "26.2.16" + }, + { + "direct_url": null, + "metadata_sha256": "a1e33542883c249bf6c263b0023b9ea8a6131a77d9cb2cbc88316968e5eada83", + "name": "pycparser", + "version": "3.0" + }, + { + "direct_url": null, + "metadata_sha256": "faffcc4d7d359cb1047a9f67f7c65096b838c6db6c62852ef20fb27d55649a95", + "name": "pycryptodomex", + "version": "3.23.0" + }, + { + "direct_url": null, + "metadata_sha256": "98929f4cb80451dc3c6c8cd541a3081dccf0dee94afe7d9fa5c214a18ff236ce", + "name": "pydantic", + "version": "2.13.5" + }, + { + "direct_url": null, + "metadata_sha256": "8eccadbe707db97c397fb79073fe791b7998ef3a85f04f817f8991f7697b190b", + "name": "pydantic-extra-types", + "version": "2.11.1" + }, + { + "direct_url": null, + "metadata_sha256": "8f00c91deb34399316a5386eb2e76fe09f14a08dc3045f2e7dce9bf8573796bd", + "name": "pydantic-settings", + "version": "2.15.0" + }, + { + "direct_url": null, + "metadata_sha256": "66c729edddc20bf2764bb18bd87d907b08690e50355f39b97acc737b26d1d164", + "name": "pydantic_core", + "version": "2.46.5" + }, + { + "direct_url": null, + "metadata_sha256": "394500d78a0c1a433ae8ca3693152c08f6a901121d4b069cf1540a19759e2950", + "name": "pylatexenc", + "version": "2.11" + }, + { + "direct_url": null, + "metadata_sha256": "df2e9e9847a2aea0ae6e20fd325aeb16cf3ce7f8913462db6c2398363cd0c0bf", + "name": "pymdown-extensions", + "version": "12.1" + }, + { + "direct_url": null, + "metadata_sha256": "82fcfe724db9f0b51348da89f4f5cdc0b08d08882b1bbc0ca4913d3a0a93bcb9", + "name": "pynvvideocodec", + "version": "2.0.4" + }, + { + "direct_url": null, + "metadata_sha256": "3722422cc1478b175879143dfb78f98b7a5f53f4f684d71b7054fe2e8acd3b89", + "name": "pyqwest", + "version": "0.10.0" + }, + { + "direct_url": null, + "metadata_sha256": "7d1d1c276b7c372d55d17ac7d30f0a4b80a746e147347b8510d1355eea7f80c8", + "name": "pytest", + "version": "9.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "89e7c1c932e52b74bdcaf504389d2d1a2d7ca559b02bf5a09fc80ebd58ad10f7", + "name": "python-dateutil", + "version": "2.9.0.post0" + }, + { + "direct_url": null, + "metadata_sha256": "54f30f811841b6d772f31715712c85bfe0041839cb071f78daf41c700a98642b", + "name": "python-discovery", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "54f30f811841b6d772f31715712c85bfe0041839cb071f78daf41c700a98642b", + "name": "python-discovery", + "version": "1.6.1" + }, + { + "direct_url": null, + "metadata_sha256": "0cc19efd76cfbf3bcb2cb0d3ab82191036855859455aa3812c5e9e591e3f34e8", + "name": "python-dotenv", + "version": "1.2.3" + }, + { + "direct_url": null, + "metadata_sha256": "1d866c6124631b9ce1797ad412fff298ab53fc2d95210281d7c8f20e920753fa", + "name": "python-json-logger", + "version": "4.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "2d18a1e7286d92a656ead5ec6f83d5ae6dc858634624f6b264703ae88d24d718", + "name": "python-multipart", + "version": "0.0.32" + }, + { + "direct_url": null, + "metadata_sha256": "beaa0efe9ba4b34843f5a0fc7379a73f10e95adb8cc0c31f359ab6f3a42b4def", + "name": "pyyaml_env_tag", + "version": "1.1" + }, + { + "direct_url": null, + "metadata_sha256": "238dc769e22d4f5626750cdff36e920e4a8d69c10d88de6d79b40a59cc13d873", + "name": "pyzmq", + "version": "27.2.0" + }, + { + "direct_url": null, + "metadata_sha256": "de0a5e855bb5bb78b7acdcd2ca60619c6a0c109814881589caf158ec07155662", + "name": "quack-kernels", + "version": "0.6.5" + }, + { + "direct_url": null, + "metadata_sha256": "961ffef199b876fb4d7b10903d78e79f359d703b1638834c61d70b9879932918", + "name": "qwen-vl-utils", + "version": "0.0.14" + }, + { + "direct_url": null, + "metadata_sha256": "faf6ab9027d12de992827a2d8a224996fe6747a8c5f7d31ae495983dc73eefe9", + "name": "ray", + "version": "2.54.0" + }, + { + "direct_url": null, + "metadata_sha256": "c50d8b3ff4d113925b60dc47d1d28e87248a3338024241b0a3a66c8794fbce0c", + "name": "referencing", + "version": "0.37.0" + }, + { + "direct_url": null, + "metadata_sha256": "02acdc52d6f21d5f4b172254daaa94edfaa44c9ebe14d1c00cc4c8fe99b0e1df", + "name": "regex", + "version": "2026.9.29" + }, + { + "direct_url": null, + "metadata_sha256": "ac08207697217d1ffde8a161b424d77d6e2af6b62630fa26d75d08f11076cdca", + "name": "requests", + "version": "2.34.2" + }, + { + "direct_url": null, + "metadata_sha256": "f1abd635c3dff607a4fd654c62a88d9d4c21843cfc9176116c156f4269ca21b5", + "name": "rich", + "version": "15.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "932ff7743a756d0efcc45528d64c275ac3cb40a8dd1787ea10cb303907f0ae4f", + "name": "rich-toolkit", + "version": "0.20.5" + }, + { + "direct_url": null, + "metadata_sha256": "294a1405c0fa34b5f735bcb46459050436849a1e584c643544de99c07c529fb7", + "name": "rignore", + "version": "0.8.1" + }, + { + "direct_url": null, + "metadata_sha256": "5e54dd00b4ad336c5161d47de2a5c2212090c44629c28b6538b156256e49282d", + "name": "rpds-py", + "version": "2026.6.3" + }, + { + "direct_url": null, + "metadata_sha256": "0d5895abd80bfc0027c02943abaea4547061b9004bd134950d640d619a697835", + "name": "safetensors", + "version": "0.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "91d5de3f641f33a8fbb4b6e91772da68d50b68686971d7b66af2068f2e77b694", + "name": "scipy", + "version": "1.17.1" + }, + { + "direct_url": null, + "metadata_sha256": "297fb30f701a800489c12893a951da3e5bd1f80061a1f43f0d3e9f1d4c6bc6fd", + "name": "sentencepiece", + "version": "0.2.2" + }, + { + "direct_url": null, + "metadata_sha256": "4245e0388ddf2048a38ae2a24a3d2c583408b2454aadc680d3c3beede639db3f", + "name": "sentry-sdk", + "version": "2.71.0" + }, + { + "direct_url": null, + "metadata_sha256": "ae8a9e6feec1a76e954d65ea48ac57842c9a7bfb5ac6e5ea82400a5ba9f71a98", + "name": "setproctitle", + "version": "1.3.7" + }, + { + "direct_url": null, + "metadata_sha256": "341d00772017437d0f6e3c943ae353f243c39fedfba403aea47cced927a76516", + "name": "setuptools", + "version": "79.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "ff4bcfb192bd542ed8f1794fb32ffc9eabd932d6e03cb00a4ad5e35a2469af88", + "name": "setuptools", + "version": "80.10.2" + }, + { + "direct_url": null, + "metadata_sha256": "f1e5a532fb8cda0bbc370e3db6cb9cea72a065d12ddd6a14976ba3cf66264221", + "name": "shellingham", + "version": "1.5.4" + }, + { + "direct_url": null, + "metadata_sha256": "2aba2cfd9c2ad7625a5d374d141af317d8f92d3534997bf98d127e52848dfc81", + "name": "six", + "version": "1.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "69ae2dfe547624be97fae348e1cfa3793f8854eed32cc1603badedc7d48fb36e", + "name": "smart_open", + "version": "8.0.2" + }, + { + "direct_url": null, + "metadata_sha256": "d415e6c6de7dee117d254a342668c489931bc88eac7ec8678b452078e366da6e", + "name": "smmap", + "version": "5.0.3" + }, + { + "direct_url": null, + "metadata_sha256": "093bc4f0740a6fc28692e616aa8fe68d7e1d76426cc5a5faf9ea722a8ee7aaae", + "name": "sniffio", + "version": "1.3.1" + }, + { + "direct_url": null, + "metadata_sha256": "b3cef071eb1dbeaa76a1273fe2ca2cc8ef36e835165253952d93780962529ac1", + "name": "sse-starlette", + "version": "3.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "3c01ca830e213f0311fe37bc3b46b8ab230a5e7acb894bf0fc8785cb7ccfed48", + "name": "starlette", + "version": "1.7.0" + }, + { + "direct_url": null, + "metadata_sha256": "6017ca508a293cf47a88a78cb330e9cbd131d74ec3c7fbf89bd4300ed3129d30", + "name": "supervisor", + "version": "4.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "fd5eb4925b04f9bffbc6c4f92bf8aea7243b918b43cd359493fce48a7dd3b336", + "name": "sympy", + "version": "1.14.0" + }, + { + "direct_url": null, + "metadata_sha256": "f09f0e24282c5a86346bcd5b10ae5ff81869fa8ef69c3ba524bd0a817a87dda9", + "name": "tabulate", + "version": "0.10.0" + }, + { + "direct_url": null, + "metadata_sha256": "519fa19c146fd58a0a75ecf1461e4bd98f9c06d01800c37d4a80f5fef095f4e1", + "name": "tensorboard", + "version": "2.21.0" + }, + { + "direct_url": null, + "metadata_sha256": "1af7ad76e4073b01ab147eb3c1d8e38b95d38062c6c9bc63890150738642e8eb", + "name": "tensorboard-data-server", + "version": "0.7.2" + }, + { + "direct_url": null, + "metadata_sha256": "9e597f62fc07e3b931d5c8fb0e90706fb6d45465cfb5d01dbd27ba7fc135c02c", + "name": "tensorstore", + "version": "0.1.80" + }, + { + "direct_url": null, + "metadata_sha256": "0da993d16ef6326f471796fcb065622f309c5c1aae6c6295b488ea64bb5c880c", + "name": "textual", + "version": "8.2.8" + }, + { + "direct_url": null, + "metadata_sha256": "52ca6148d4fd1497254855fa610cfdde99191cd42bce7a452fd3a68855504ac0", + "name": "tiktoken", + "version": "0.14.0" + }, + { + "direct_url": null, + "metadata_sha256": "0df9eb495cfb477dcbdfbdcd8c04d952d3eb00d77831630760571e13545398e5", + "name": "tilelang", + "version": "0.1.12" + }, + { + "direct_url": null, + "metadata_sha256": "802b576e011dc61bd2681593e8d802714b6c4ce636a9cf87035026db32ce6262", + "name": "tokenizers", + "version": "0.23.2" + }, + { + "direct_url": null, + "metadata_sha256": "4e1631b2164a49ff9a848d86ce504fdcc15e3540dbb262df8f33a2681a8de513", + "name": "tokenspeed-mla", + "version": "0.1.8" + }, + { + "direct_url": null, + "metadata_sha256": "05086095a775c5dca70998dcf442a848c13f9c68b54a54c510c3542c5abb6563", + "name": "tokenspeed-triton", + "version": "3.8.10.post20260920" + }, + { + "direct_url": null, + "metadata_sha256": "71daba472d0c5ffc25c0231dc29688ab0cb13d5bc7e7d93f6c4cce4169c50048", + "name": "torch", + "version": "2.13.0" + }, + { + "direct_url": null, + "metadata_sha256": "cccd2f1c0e5866e63732f58798c8d642ee6d10cd560d6f691e7981b908c246c9", + "name": "torch_c_dlpack_ext", + "version": "0.1.5" + }, + { + "direct_url": "{\"dir_info\": {}, \"url\": \"file:///torch_memory_saver\"}", + "metadata_sha256": "6276cef17dedbb5ee0d6157bbf63b832e916026281328d995ad3d488c2539618", + "name": "torch_memory_saver", + "version": "0.0.9.post1+slime" + }, + { + "direct_url": null, + "metadata_sha256": "29809ca2c86dda5079654f1f70564a64435e9d08f1964a2412b6f514e1b5ff64", + "name": "torchaudio", + "version": "2.11.0" + }, + { + "direct_url": null, + "metadata_sha256": "7e9be0f3a290e3fd9370d8fe010c7ffd006d5d3d05ab8bdf7df8f92f0fca9c39", + "name": "torchcodec", + "version": "0.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "181fa5e6b399c378711eddcdacd756d3c51317916f8eb160ee36cae7fae9589f", + "name": "torchvision", + "version": "0.28.0" + }, + { + "direct_url": null, + "metadata_sha256": "43d1261aff90cf3d5b1b40cf1f94234d61409b14e59f3766f457c1eec7f7ac15", + "name": "tqdm", + "version": "4.70.1" + }, + { + "direct_url": "{\"archive_info\": {\"hash\": \"sha256=3e1d9f534781c8e608240da0b495b8246317a36382f7609017cbaa7fb1d53f7b\", \"hashes\": {\"sha256\": \"3e1d9f534781c8e608240da0b495b8246317a36382f7609017cbaa7fb1d53f7b\"}}, \"url\": \"file:///wheels/transformer_engine-2.16.1%2Bc9877beb-cp312-cp312-linux_x86_64.whl\"}", + "metadata_sha256": "d882f743161d9d9f35dee4e1a8cc9136fa495f7c660caace01ab8f5602d76aa7", + "name": "transformer_engine", + "version": "2.16.1+c9877beb" + }, + { + "direct_url": null, + "metadata_sha256": "465797a59706d83b45c93fde750b228c3b6e1addc44115de2c4c02ad66d9c5ea", + "name": "transformers", + "version": "5.17.0" + }, + { + "direct_url": null, + "metadata_sha256": "a91982ca086667c592a951973434f7c5a9f27a8300bc97af78dfb496afe53e71", + "name": "triton", + "version": "3.7.1" + }, + { + "direct_url": null, + "metadata_sha256": "d26fbb244532c4051e715f9047cd943e2cc4abb0ac6f2a517fa2986eb1ea726a", + "name": "truststore", + "version": "0.10.4" + }, + { + "direct_url": null, + "metadata_sha256": "c84af1a069084b1b440b3594068dec29200d52d4c1a9b652030448717f270158", + "name": "typer", + "version": "0.27.2" + }, + { + "direct_url": null, + "metadata_sha256": "0ad6653b7439f4bb6a596cb7b01ed1b716458467525c4dc40b75d62bdb943c98", + "name": "typing-inspection", + "version": "0.4.4" + }, + { + "direct_url": null, + "metadata_sha256": "d005280aa13b334ac942d20219102865e559f69ffd06c35c248b2f0d0da3b933", + "name": "typing_extensions", + "version": "4.16.0" + }, + { + "direct_url": null, + "metadata_sha256": "fba2930e9030a18965d243f8d330748db2e67572a81b3b68710462fb5110332a", + "name": "urllib3", + "version": "2.8.0" + }, + { + "direct_url": null, + "metadata_sha256": "bc5717bd6524a33838f285261868bcc8e311e8c29fdb19e41d56c38b04890e84", + "name": "uvicorn", + "version": "0.54.0" + }, + { + "direct_url": null, + "metadata_sha256": "741c006d8441f562aa853a5430df236fbb4af923445491f396bf09943bd30258", + "name": "uvloop", + "version": "0.22.1" + }, + { + "direct_url": "{\"dir_info\": {\"editable\": true}, \"url\": \"file:///vime\"}", + "metadata_sha256": "f85aa01dfdc868756a6583434bbff040f29eb511d47d5b25ada063a84353aac6", + "name": "vime", + "version": "0.3.2" + }, + { + "direct_url": null, + "metadata_sha256": "c25431aaf1950971fe96292f395a41a55b403127bfca0d0b8f7dc9cff5dab75d", + "name": "virtualenv", + "version": "21.14.1" + }, + { + "direct_url": null, + "metadata_sha256": "4e3ee0a31d85e56268640aae853bcee4794dfe8c0483c5c6370517e480c81ae0", + "name": "virtualenv", + "version": "21.14.5" + }, + { + "direct_url": null, + "metadata_sha256": "d4ed5c7551cddb8c1aeff2f9f27b3491f6ad2c9afda8e7bb9779c33fa12a536c", + "name": "vllm", + "version": "0.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "84b482e09bac949e992594757214a1920c667a5d898ee320e309250697f6d26e", + "name": "vllm-router", + "version": "0.1.15" + }, + { + "direct_url": null, + "metadata_sha256": "9b16c871eb1060a5218e9b9a9ad33288d94844cfaf43f08dbb6c32423bde8fe3", + "name": "wandb", + "version": "0.30.0" + }, + { + "direct_url": null, + "metadata_sha256": "8e4f2be437dfe4eb3c6c959e517ac20b75d06525563f1ebcbf06f9ec648bd7c1", + "name": "watchdog", + "version": "6.0.0" + }, + { + "direct_url": null, + "metadata_sha256": "15218afb42938907c2ca74c54e3d8e3a5406493c4761e29e38e82bfec0f84296", + "name": "watchfiles", + "version": "1.3.0" + }, + { + "direct_url": null, + "metadata_sha256": "8863af96e88b7db9990da99aa6c46816eacc3d2f9ae1297b53381b033cd70119", + "name": "wcmatch", + "version": "11.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "f46e6bd6cfafb2b684c29587b017b7096fd9155b74eda25a22eca784b9803ab7", + "name": "websockets", + "version": "16.1.1" + }, + { + "direct_url": null, + "metadata_sha256": "ce82db5ccfefa4bfbe4e25a36e1f91e8e7d51fcaeb31586c4d48e1c69f99168b", + "name": "websockets", + "version": "17.1" + }, + { + "direct_url": null, + "metadata_sha256": "0f142a2c09eac643c7d0bfe77f3f121184c0b17914afbd32af669ed19b2b02ef", + "name": "wheel", + "version": "0.47.0" + }, + { + "direct_url": null, + "metadata_sha256": "dd58938e51a3c5cb363f6f22eaa2a8a7accc1ce373388de167a82f77d3e5783f", + "name": "wrapt", + "version": "2.5.0" + }, + { + "direct_url": null, + "metadata_sha256": "b0b72c1941f04499ca7e1a3a6e479aee8df902c3d49979624b59dba8c3228d37", + "name": "xgrammar", + "version": "0.2.8" + }, + { + "direct_url": null, + "metadata_sha256": "ef8861f39e5c36255966a36032651f937d890d55f31f1c26304b488f1ba34332", + "name": "xxhash", + "version": "4.0.1" + }, + { + "direct_url": null, + "metadata_sha256": "740c08057b6eb69c58402c87d652af0a471e46325d811f2c605632a18817152f", + "name": "yarl", + "version": "1.25.1" + }, + { + "direct_url": null, + "metadata_sha256": "7b060e4d24394b5431875e2f74fec8e6bffa79d2e6b4cb8c7e2a5187dd2d8d69", + "name": "z3-solver", + "version": "4.15.4.0" + }, + { + "direct_url": null, + "metadata_sha256": "3d76d4fbc95f0851191147db12300938c67a6f8fb1df884886d9601272ccc4e8", + "name": "zipp", + "version": "4.1.0" + }, + { + "direct_url": null, + "metadata_sha256": "d3de2651e4e908dbb7c9d80508e5179590217dfac4993dc8b04381c5b9718c4c", + "name": "zstandard", + "version": "0.25.0" + } + ], + "executable": "", + "installed_provider_sources": { + "vllm/compilation/__init__.py": { + "path": "/vllm/compilation/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/backends.py": { + "path": "/vllm/compilation/backends.py", + "sha256": "fa4bff8920b363efbbde9456f135fa9d2c004a5bde1898877f177418b2d8b008" + }, + "vllm/compilation/base_static_graph.py": { + "path": "/vllm/compilation/base_static_graph.py", + "sha256": "5cfe8e06db84aa42cd41cdd93ebe93af00b3a242c8011042057530e2922b523a" + }, + "vllm/compilation/breakable_cudagraph.py": { + "path": "/vllm/compilation/breakable_cudagraph.py", + "sha256": "3cc427612a08e2b9b3fee47548026400c1d0776e2d4747535e59ef5512bdf1e8" + }, + "vllm/compilation/caching.py": { + "path": "/vllm/compilation/caching.py", + "sha256": "71d212452dde742fbf28b8a01ed29d3c08a7457ff7f8da2a20ce9d17e902c2cf" + }, + "vllm/compilation/codegen.py": { + "path": "/vllm/compilation/codegen.py", + "sha256": "e04833bec88cf9d1a13aa7341e30e3233d1138bfe23424e0fd34d664b3fedb9f" + }, + "vllm/compilation/compiler_interface.py": { + "path": "/vllm/compilation/compiler_interface.py", + "sha256": "8d84e2864bf83f754bae9e9f77119e0287cca9f97f5fa5ec2535e07b5ad88944" + }, + "vllm/compilation/counter.py": { + "path": "/vllm/compilation/counter.py", + "sha256": "d8158c54dd36a357bf24f6f84dc22f572d3a27f4875f3d5779b12bc5d454ff76" + }, + "vllm/compilation/cuda_graph.py": { + "path": "/vllm/compilation/cuda_graph.py", + "sha256": "05c86392d7fae967ac73076dba7e01990a0e3ae619e4866450a0c1be56bd1192" + }, + "vllm/compilation/decorators.py": { + "path": "/vllm/compilation/decorators.py", + "sha256": "cab6962e8a1fead59c75f5ed8cb4732f9e5441ff972030c2f4b1c4ba0c58de3c" + }, + "vllm/compilation/monitor.py": { + "path": "/vllm/compilation/monitor.py", + "sha256": "43b24c5cb1bc4d32dc979f3222596905c7b3acc58415328a234402e6edc76abf" + }, + "vllm/compilation/partition_rules.py": { + "path": "/vllm/compilation/partition_rules.py", + "sha256": "857d2fb06dc871ea1d3717cd01fbd4e5205984100d98b7b72a2933d6ff1cfa4d" + }, + "vllm/compilation/passes/__init__.py": { + "path": "/vllm/compilation/passes/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/fusion/__init__.py": { + "path": "/vllm/compilation/passes/fusion/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/fusion/act_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/act_quant_fusion.py", + "sha256": "1fa9c3ca4fb424685b7053c3dda89dda16c98dc5645d85f0f28dca58429792b3" + }, + "vllm/compilation/passes/fusion/add_rms_fusion.py": { + "path": "/vllm/compilation/passes/fusion/add_rms_fusion.py", + "sha256": "e46998552628aa5cd5962fc39ea39ae824fd97e6aeba1d176e9cc7cade39837b" + }, + "vllm/compilation/passes/fusion/allreduce_rms_fusion.py": { + "path": "/vllm/compilation/passes/fusion/allreduce_rms_fusion.py", + "sha256": "0af193505880cec0f6ffa224c688bce3c9ddc318dccdf04a696b4e4b4506a963" + }, + "vllm/compilation/passes/fusion/attn_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/attn_quant_fusion.py", + "sha256": "ecc64e82be4481954c9cac6c23d7794846ab19486b570f2dda07ab5ad67c5a49" + }, + "vllm/compilation/passes/fusion/collective_fusion.py": { + "path": "/vllm/compilation/passes/fusion/collective_fusion.py", + "sha256": "1e2c8539d6960b45907fb3bf0482441ea7250e97c56ffdea1500514efa0b164d" + }, + "vllm/compilation/passes/fusion/matcher_utils.py": { + "path": "/vllm/compilation/passes/fusion/matcher_utils.py", + "sha256": "50ac5714ce1bb113520de769ea6234316acc470a8cdf2537a996ce9a9d54337d" + }, + "vllm/compilation/passes/fusion/mla_attn_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/mla_attn_quant_fusion.py", + "sha256": "a966fe7f58bf9228379f793f5fd851735a97f9639722766b2a20cb79a9e4baec" + }, + "vllm/compilation/passes/fusion/mla_rope_kvcache_cat_fusion.py": { + "path": "/vllm/compilation/passes/fusion/mla_rope_kvcache_cat_fusion.py", + "sha256": "1602cc28055ffa8d1123ddb1d256bf0bd12006fd06ea7e16a986c55746dbe0dc" + }, + "vllm/compilation/passes/fusion/qk_norm_rope_fusion.py": { + "path": "/vllm/compilation/passes/fusion/qk_norm_rope_fusion.py", + "sha256": "aebc7d1a5189b65ac665afcc169e7baebd53efe719c48e35e7c5babe85af0d39" + }, + "vllm/compilation/passes/fusion/qk_norm_rope_kvcache_fusion.py": { + "path": "/vllm/compilation/passes/fusion/qk_norm_rope_kvcache_fusion.py", + "sha256": "f0cfd0d83ec4acb09f9bf91d199b114e9d4995e3059c13eb23a6978ce7c07eb2" + }, + "vllm/compilation/passes/fusion/rms_quant_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rms_quant_fusion.py", + "sha256": "4852aa44e0e2087043fdac271bda9b8d9bfe3201bb84ce3919b8ed454d8083c4" + }, + "vllm/compilation/passes/fusion/rocm_aiter_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rocm_aiter_fusion.py", + "sha256": "372e76c68c75209a085deec6dd22b3816be633613ca82f6f2925c1b3773d61a0" + }, + "vllm/compilation/passes/fusion/rope_kvcache_fusion.py": { + "path": "/vllm/compilation/passes/fusion/rope_kvcache_fusion.py", + "sha256": "3a756e9049593537143b5a56ab9185a6bc83f57ed81d84226d7791a46a984b53" + }, + "vllm/compilation/passes/fusion/sequence_parallelism.py": { + "path": "/vllm/compilation/passes/fusion/sequence_parallelism.py", + "sha256": "3af7e420dcb35fff0bae0f8f599d0f1bda34445ebe194059892a434b2976d654" + }, + "vllm/compilation/passes/fx_utils.py": { + "path": "/vllm/compilation/passes/fx_utils.py", + "sha256": "730708213acf9d1b5f3176b433dfc197a5f3c81b5ce443f0923c526924833003" + }, + "vllm/compilation/passes/inductor_pass.py": { + "path": "/vllm/compilation/passes/inductor_pass.py", + "sha256": "1f380aacf7adabb8bf8b7d41c0a93473947f0716f7445bd910fd448f6c08e672" + }, + "vllm/compilation/passes/ir/__init__.py": { + "path": "/vllm/compilation/passes/ir/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/ir/clone_elimination.py": { + "path": "/vllm/compilation/passes/ir/clone_elimination.py", + "sha256": "5297078f5cddce081faba5215814275381d2083b32318fcfeb2bf9d69fedb7c7" + }, + "vllm/compilation/passes/ir/inplace_functionalization.py": { + "path": "/vllm/compilation/passes/ir/inplace_functionalization.py", + "sha256": "2dc4f22c6f05224828c2941479185b1452d4490f488b7f0bfd124334e7809fed" + }, + "vllm/compilation/passes/ir/lowering_pass.py": { + "path": "/vllm/compilation/passes/ir/lowering_pass.py", + "sha256": "d9c3d90f63138420f0e5489447b5996573fcfbbab939da2efccd00848492b172" + }, + "vllm/compilation/passes/ir/utils.py": { + "path": "/vllm/compilation/passes/ir/utils.py", + "sha256": "f59d33a6c7d0616cbeec1e9fb1d6c948881bf81fe124caeb906eac2e2197ea21" + }, + "vllm/compilation/passes/pass_manager.py": { + "path": "/vllm/compilation/passes/pass_manager.py", + "sha256": "486979a058aa2e20ebedcbb6e039f7a59f38d2efd2cda11219fae4067be0968d" + }, + "vllm/compilation/passes/utility/__init__.py": { + "path": "/vllm/compilation/passes/utility/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/compilation/passes/utility/fix_functionalization.py": { + "path": "/vllm/compilation/passes/utility/fix_functionalization.py", + "sha256": "ad5b504a05ccee023869b0c8df70ec2fff9a4a80d25fd903e2b532f470e7203f" + }, + "vllm/compilation/passes/utility/noop_elimination.py": { + "path": "/vllm/compilation/passes/utility/noop_elimination.py", + "sha256": "8abf85d28c13f95059f2acbc0275b9b9ed2ad4990f7c5763bbe3067a4aa629ce" + }, + "vllm/compilation/passes/utility/post_cleanup.py": { + "path": "/vllm/compilation/passes/utility/post_cleanup.py", + "sha256": "1c38b14fc209165cbcf8ca763a17ac4e528b97f59b573e5d52df2cce7d758de3" + }, + "vllm/compilation/passes/utility/scatter_split_replace.py": { + "path": "/vllm/compilation/passes/utility/scatter_split_replace.py", + "sha256": "138402cc3097768a32e9e5b8d1a054b6176e494bddc8684e23ca2dc5fdc3fdda" + }, + "vllm/compilation/passes/utility/split_coalescing.py": { + "path": "/vllm/compilation/passes/utility/split_coalescing.py", + "sha256": "0b02acd9e1ad43d7b3e128b914e969b9580773f2818078846dfbf163a8bd0871" + }, + "vllm/compilation/passes/vllm_inductor_pass.py": { + "path": "/vllm/compilation/passes/vllm_inductor_pass.py", + "sha256": "4f83ffb67f834a214221d810c7843a8e41eb4e5930eb40adbd8cf054ff6fb9c6" + }, + "vllm/compilation/piecewise_backend.py": { + "path": "/vllm/compilation/piecewise_backend.py", + "sha256": "6525318ff3ca2e4978e24dd9232a7ae0a02e920e19604b83db6f6043d1f8a54d" + }, + "vllm/compilation/wrapper.py": { + "path": "/vllm/compilation/wrapper.py", + "sha256": "c1b1fca679ea16aa07a696831a810c0d531da2bb0ea32dd6f1a95cdaef36de07" + }, + "vllm/config/__init__.py": { + "path": "/vllm/config/__init__.py", + "sha256": "56fb0cb1598d297e4f95a97e5d86dc624145d1532f5faa432b7d2834d7155bd5" + }, + "vllm/config/attention.py": { + "path": "/vllm/config/attention.py", + "sha256": "c41f345b512d9b7df882328257eb3a6381f41088c11ae83b5ecd8a9e8265d1bc" + }, + "vllm/config/cache.py": { + "path": "/vllm/config/cache.py", + "sha256": "f1c226ba679c884930dbfcaf41a57248b137a9a20d3ed8e3d3b31752bb484c07" + }, + "vllm/config/compilation.py": { + "path": "/vllm/config/compilation.py", + "sha256": "c9cec5c7200e8e559810ec8c30113ad61dab6780f9f7fb3c116bd0d9b5a43065" + }, + "vllm/config/device.py": { + "path": "/vllm/config/device.py", + "sha256": "7b82eee02ceb5842337451a27a3d5729920c47e25e8f6bf3997f5146f9330a9c" + }, + "vllm/config/diffusion.py": { + "path": "/vllm/config/diffusion.py", + "sha256": "1fa9fd2478a866098a28a3586b55af2f9738656b7813a55d76539c10dd99fe8d" + }, + "vllm/config/ec_manager_config.py": { + "path": "/vllm/config/ec_manager_config.py", + "sha256": "418b387dbe7bdf67deddce331c205768a2d42aea37141f59fb02a8a1528e3552" + }, + "vllm/config/ec_transfer.py": { + "path": "/vllm/config/ec_transfer.py", + "sha256": "0eabb2c25194676d23c6acf59562672a1dd24415043ac5737d621ce0d681ec70" + }, + "vllm/config/engram.py": { + "path": "/vllm/config/engram.py", + "sha256": "34043a22385a041d4e9be8857f64174c990c2ca8308b97b6a952b5ab96c20ee5" + }, + "vllm/config/fault_tolerance.py": { + "path": "/vllm/config/fault_tolerance.py", + "sha256": "b166b24373d599fb15ddc575e3061cf0dcb42174d0369d8468008e7ffbb2a4e2" + }, + "vllm/config/kernel.py": { + "path": "/vllm/config/kernel.py", + "sha256": "27e23c584cf862f4091858db6dc85bbc2a01f4baf9dca3f232ae6f3bac02390e" + }, + "vllm/config/kv_events.py": { + "path": "/vllm/config/kv_events.py", + "sha256": "b1dbaee3e6830e381e9157fe3bab0d65c357da88ff7cdf8b1e4b3a4e75c82a87" + }, + "vllm/config/kv_transfer.py": { + "path": "/vllm/config/kv_transfer.py", + "sha256": "506fae7a9d7f32cb3646156cf9249a856f6317dff6c4c85db70efd34418c429b" + }, + "vllm/config/load.py": { + "path": "/vllm/config/load.py", + "sha256": "bd6431c22e078362d749a56a2c84145432ebf2605d8bcfa2ac679182d18ed630" + }, + "vllm/config/lora.py": { + "path": "/vllm/config/lora.py", + "sha256": "ed6cf6575f5950f079a62f904caeae93d1a4745dd8c21788b74367883bcd4b08" + }, + "vllm/config/mamba.py": { + "path": "/vllm/config/mamba.py", + "sha256": "2090f791201ca45dd4f1d72b8651268890eb07574b6084721194eb8fdf612c48" + }, + "vllm/config/model.py": { + "path": "/vllm/config/model.py", + "sha256": "f4168b67cc93ce72ff2a6d4c66974223e32fd0f1fab4c05e44bd68a275e18d69" + }, + "vllm/config/model_arch.py": { + "path": "/vllm/config/model_arch.py", + "sha256": "2babe28329d7b60b4e205f6d72c687f0f66e6535aa2f20411469e5ec362f6b5f" + }, + "vllm/config/multimodal.py": { + "path": "/vllm/config/multimodal.py", + "sha256": "271911aee151f17f092228cecee82af0713e9a47340ffdf66834ca7638a50d22" + }, + "vllm/config/observability.py": { + "path": "/vllm/config/observability.py", + "sha256": "d57c59ec776477ab0a20e9f2b945bc954d8ea3737c869259480e9aa10dfb9f6d" + }, + "vllm/config/offload.py": { + "path": "/vllm/config/offload.py", + "sha256": "6f2db3d9a2730588473d5155811690c6241b167a21dcb62fbbd9ebb6386de42c" + }, + "vllm/config/parallel.py": { + "path": "/vllm/config/parallel.py", + "sha256": "f012ace89e3fb730a467f729f602679bc145c49f0d10721811c9d818570e7b2b" + }, + "vllm/config/pooler.py": { + "path": "/vllm/config/pooler.py", + "sha256": "9f01913dcb7bccbf9b672b16643f18471ae202455992e8afaf0725a17f2b3d08" + }, + "vllm/config/profiler.py": { + "path": "/vllm/config/profiler.py", + "sha256": "04d24fa1dc7cfedca6b5c7d9115f7f7021722fc46a5b15234a1e3b3a506c93e5" + }, + "vllm/config/quantization.py": { + "path": "/vllm/config/quantization.py", + "sha256": "acffc52f525b39a88efd656f1ed705ce3a1b758298bb0684fac7694776bc10b4" + }, + "vllm/config/reasoning.py": { + "path": "/vllm/config/reasoning.py", + "sha256": "2c4f7bdee48a9fb3d93787c4c32361c2411417cce452cfde86808d8759977861" + }, + "vllm/config/scheduler.py": { + "path": "/vllm/config/scheduler.py", + "sha256": "822179da62be4bca0619c8590082ae09123f5c4415f9cc2037be673748239edb" + }, + "vllm/config/speculative.py": { + "path": "/vllm/config/speculative.py", + "sha256": "9c642a87264339c0dbc1d0b57330572149df0f9d5e16c6893b9895e50a619e19" + }, + "vllm/config/speech_to_text.py": { + "path": "/vllm/config/speech_to_text.py", + "sha256": "bf4a566fbde6a1cec1e209070b739650c3302c12696739c88049cb8f723a4c3f" + }, + "vllm/config/structured_outputs.py": { + "path": "/vllm/config/structured_outputs.py", + "sha256": "55649776594349b8b4aa3e08fc4c88068366732a486d6fb235079188044aa829" + }, + "vllm/config/utils.py": { + "path": "/vllm/config/utils.py", + "sha256": "d035e9e488ba92b6c47a96cf05d9b2a850d53eda8a05115b22ff9af8dbc2fc64" + }, + "vllm/config/vllm.py": { + "path": "/vllm/config/vllm.py", + "sha256": "956b812e5a719bcbfa3a3958801361b38b9c928c96b8c073311bbb96376dfb7a" + }, + "vllm/config/watermarking.py": { + "path": "/vllm/config/watermarking.py", + "sha256": "30e6620a3cd7529f0736ad55e38bc326a6a78dee4552f0722208400041c94a1f" + }, + "vllm/config/weight_transfer.py": { + "path": "/vllm/config/weight_transfer.py", + "sha256": "92edd9e5ea90c97a8f3c5f20abf1734a105ee1f3f89e306e7ba87e758f1f767e" + }, + "vllm/distributed/__init__.py": { + "path": "/vllm/distributed/__init__.py", + "sha256": "97f28c30b32662af8cab163939e4ee423037f11630752e13b55cbc25a7d0ab71" + }, + "vllm/distributed/communication_op.py": { + "path": "/vllm/distributed/communication_op.py", + "sha256": "3c3f8ac60db38ece891d39dc1e2f6f1947ad438685893d2e5777d072320bd1b8" + }, + "vllm/distributed/device_communicators/__init__.py": { + "path": "/vllm/distributed/device_communicators/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/device_communicators/aiter_custom_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/aiter_custom_all_reduce.py", + "sha256": "f8eb027ce7a85d94af6260960ceb7f36fc6f1406c9af9c9b6285fddb3f178009" + }, + "vllm/distributed/device_communicators/all2all.py": { + "path": "/vllm/distributed/device_communicators/all2all.py", + "sha256": "1f1b69236acd3cd7bd94520fd6d591bfd31b57c4bc7c9f9f4161ea8bbd0c5f26" + }, + "vllm/distributed/device_communicators/all_reduce_utils.py": { + "path": "/vllm/distributed/device_communicators/all_reduce_utils.py", + "sha256": "ed0ab4dd05b2519a6313892e68824c97b540034664d7f8c3d031b322e33e1bfc" + }, + "vllm/distributed/device_communicators/base_device_communicator.py": { + "path": "/vllm/distributed/device_communicators/base_device_communicator.py", + "sha256": "4a7670f12ed7c7621b25d476e2687c24ca01f3be183fff4a6a25337596fe506b" + }, + "vllm/distributed/device_communicators/cpu_communicator.py": { + "path": "/vllm/distributed/device_communicators/cpu_communicator.py", + "sha256": "e1856c8e91cfbbb4d9ce990c1236e258ba4021e226afcbab645653380b38d64b" + }, + "vllm/distributed/device_communicators/cuda_communicator.py": { + "path": "/vllm/distributed/device_communicators/cuda_communicator.py", + "sha256": "102d95c67ec798cf352b817ba92e8abc9da37f30d1bbdf3aab45d3927b627b93" + }, + "vllm/distributed/device_communicators/cuda_wrapper.py": { + "path": "/vllm/distributed/device_communicators/cuda_wrapper.py", + "sha256": "333b6d9ed173e7a18c7f2b6627a3c9c9ed88892ce52015f05e29d6d245e48ee3" + }, + "vllm/distributed/device_communicators/custom_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/custom_all_reduce.py", + "sha256": "a048c1327c23580805600c0c951831bec333b1ffc4eb26a0e3d34119c4f0c445" + }, + "vllm/distributed/device_communicators/flashinfer_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/flashinfer_all_reduce.py", + "sha256": "b4359760e9b55963676109a5c3a015fb82e190d4df1d021de9ee01e7814cbdda" + }, + "vllm/distributed/device_communicators/flashinfer_pcie_ipc_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/flashinfer_pcie_ipc_all_reduce.py", + "sha256": "8b67b0fc356a565095f56b475cc89c513e3a5eff051ab1c52e5beb0c1a79e9f2" + }, + "vllm/distributed/device_communicators/mnnvl_compat.py": { + "path": "/vllm/distributed/device_communicators/mnnvl_compat.py", + "sha256": "72ee1e6f9571b4c8ecbd9f60cd469d1b565cb79cab519a688a93f290906a2615" + }, + "vllm/distributed/device_communicators/pynccl.py": { + "path": "/vllm/distributed/device_communicators/pynccl.py", + "sha256": "882fb83c5a3c565a3f8fd664b79f5ceae566dca180019ecafd74bc8c11d9f8cf" + }, + "vllm/distributed/device_communicators/pynccl_allocator.py": { + "path": "/vllm/distributed/device_communicators/pynccl_allocator.py", + "sha256": "390e2576cbf4ae06341ca4dab24fc7e4d4f7c24dd444329ed05d828a9ce91460" + }, + "vllm/distributed/device_communicators/pynccl_wrapper.py": { + "path": "/vllm/distributed/device_communicators/pynccl_wrapper.py", + "sha256": "ce63c8da57bb88d4cf89956bd70bb63f0f44bfad468ddb37b765611551f6d99f" + }, + "vllm/distributed/device_communicators/quick_all_reduce.py": { + "path": "/vllm/distributed/device_communicators/quick_all_reduce.py", + "sha256": "8aacb23e7c297b0ae2f80d99c5affd2e7517115d7874be51069d14a44db7b5f2" + }, + "vllm/distributed/device_communicators/ray_communicator.py": { + "path": "/vllm/distributed/device_communicators/ray_communicator.py", + "sha256": "332c37f65495b60564d61db59bc2d30ca0236adc33442d01464790bde9aec897" + }, + "vllm/distributed/device_communicators/shm_broadcast.py": { + "path": "/vllm/distributed/device_communicators/shm_broadcast.py", + "sha256": "f3e7a3f3ff713fccbd535e0d41650ee05bdf8677e83d4b90519910645022c30b" + }, + "vllm/distributed/device_communicators/shm_object_storage.py": { + "path": "/vllm/distributed/device_communicators/shm_object_storage.py", + "sha256": "e097bf7ac0141fe8db4131e8fd553ca2ad5b0600b22a56f3924af6b795e7207c" + }, + "vllm/distributed/device_communicators/symm_mem.py": { + "path": "/vllm/distributed/device_communicators/symm_mem.py", + "sha256": "b06e3ddb9ae880a30ec4a103ce32eb9794223bb0293832e89572af28adaaa544" + }, + "vllm/distributed/device_communicators/xpu_communicator.py": { + "path": "/vllm/distributed/device_communicators/xpu_communicator.py", + "sha256": "527cbfb250760abc62096ee7cd612307b821f21b72dee1687ad866620ec89b6d" + }, + "vllm/distributed/ec_transfer/__init__.py": { + "path": "/vllm/distributed/ec_transfer/__init__.py", + "sha256": "061405bb51df7409c9938b62e25caa8bd6ebf85da6d1700dbd4affe2a0825135" + }, + "vllm/distributed/ec_transfer/ec_connector/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/base.py", + "sha256": "22d4913375bb622473fbe1a77f9376b804949cd8a7e31e9518208f9561d161e2" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/common.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/common.py", + "sha256": "e2267abd8d00a6d2605e1a82ea5c73396a71b427452eab469fcca0134c334e7c" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/connector.py", + "sha256": "72cd35d9fd754a2992dd090a8af13c91e0789b4038ac29276750d823120235db" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/base.py", + "sha256": "19e8df88b0fa831997896355ecdd49e0d86cb074cd7ae28aed0b328b0bb3ab2e" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/control/zmq.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/control/zmq.py", + "sha256": "435641c0e37551ab4937855abd067be26905b91215e759cbd9d28a419a34ff9a" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/base.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/base.py", + "sha256": "3be698aeb67d32ee3741e76b2fb71806941c587578583acf8fbc42fbf22b46a5" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/data/nixl.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/data/nixl.py", + "sha256": "03af8f6549a6027b7262a482907af591e45f28b9b1c5a3408bbc6600e38797e5" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/ec_shared_region.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/ec_shared_region.py", + "sha256": "e40607952c9920024455eca2f419e8c3ef1de9a4d8b27c147a33bb941b8c08b1" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/protocol.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/protocol.py", + "sha256": "05878336884396bfbef77b96b0fa6359f6fa0aba912961f14a84f5a436f27038" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/__init__.py", + "sha256": "01c42385bf3a55cff09cc05ba956f6dd4b8b6b986bf4d6eca4e566cb045b48e0" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/embedding_cache.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/scheduler/embedding_cache.py", + "sha256": "7359fb980af1fc30b3253681310ef636e2b4a19134e04a93270c9c45de2572d8" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/session.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/session.py", + "sha256": "5973548a919e13c866222b91d502686a6757a31e5a5664b879bf2887ed9fb212" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/utils.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/utils.py", + "sha256": "160ac665f20f2c75b343c1e784084f2b0b4d1cf8fdb28ee15deee4dc8ed0ce45" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/worker/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/worker/__init__.py", + "sha256": "f08d296d3560c42173ae8af961af4a768033ccf1e36e9c17c0cdd53013d0c52e" + }, + "vllm/distributed/ec_transfer/ec_connector/cpu/worker/descriptor_buffers.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/cpu/worker/descriptor_buffers.py", + "sha256": "be7c81be214e995da8499105ba485854d9c19d6f8e905f8f1b87b83694ca0864" + }, + "vllm/distributed/ec_transfer/ec_connector/example_connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/example_connector.py", + "sha256": "09022ce07a89114bb65d9befd2e60873453aed11bbac8c0a75c1e6084e785a5f" + }, + "vllm/distributed/ec_transfer/ec_connector/factory.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/factory.py", + "sha256": "d6cedca0a99c3dd2b03cd1c15d17472b983e3f7d8f5baf4a12eecaf6abedb817" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/__init__.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/__init__.py", + "sha256": "1cbfc2f95f8f4d48a9253056eb1fd4b562062884e3fd5cb6571583c352fc16f3" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/config.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/config.py", + "sha256": "98c60696f79d1de67d2364cd9e8a42a393b5c8e17ed9af2f971368e47891d7b3" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/control.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/control.py", + "sha256": "58e0d1a423fbe958bfa586ac26a17107e08d0b31d044b4c74ab4dde880e7ca9b" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/memory.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/memory.py", + "sha256": "d5e90b1348de670a70f110d58eedcbdbd053db72c21dd007c3f5275c53951149" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/metadata.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/metadata.py", + "sha256": "497a7e6dfffb7fce80a41d5989f96119b970c143df77bb9d0f9c91d7a46e8c42" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/producer.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/producer.py", + "sha256": "97fa4d0b19475574778eab02f55fad73db9642beb9156da890314fd53fa1a7ab" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/reservation.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/reservation.py", + "sha256": "4790bc65cde4db5f17733ca2c2910980ba594a8a9b79ee27c5b957dffd4c1113" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/scheduler.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/scheduler.py", + "sha256": "53004b62529a31fdd80dfb2e6026610b95041a77e91f731ae526fefd84e7968d" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/state.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/state.py", + "sha256": "92f375d6c5cc9c83dbe95a7977ad8eb0f1b5629ccee92968bcacdc94eee15d65" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/transfer.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/transfer.py", + "sha256": "ada2113a5402054f1149d3edc2537f4e5e1bd696c9b17291c9f2b4cbf6b59753" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake/worker.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake/worker.py", + "sha256": "89eb91bb64845b3b121d502972a6b04d448714253becd2ea662e5691cd5acdd7" + }, + "vllm/distributed/ec_transfer/ec_connector/mooncake_ec_connector.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/mooncake_ec_connector.py", + "sha256": "aaebab4711bc00dd0c622dfbfd8639fc41e7ed5d1658d7d68fe33e4d5fbef3ba" + }, + "vllm/distributed/ec_transfer/ec_connector/utils.py": { + "path": "/vllm/distributed/ec_transfer/ec_connector/utils.py", + "sha256": "11b9014b9c0697f8846deff1a55a22fa86a15dc2ac3e139442fb6d513ac03059" + }, + "vllm/distributed/ec_transfer/ec_transfer_state.py": { + "path": "/vllm/distributed/ec_transfer/ec_transfer_state.py", + "sha256": "9487a41f23fa1a4fa6dfca8b42b8e97a0ee19d8406ffd1dcf4bef66315180827" + }, + "vllm/distributed/elastic_ep/__init__.py": { + "path": "/vllm/distributed/elastic_ep/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/elastic_ep/elastic_execute.py": { + "path": "/vllm/distributed/elastic_ep/elastic_execute.py", + "sha256": "b8f60a4183c79ff6051095b5f95bb385bc7fea0cffe8cd9ebc9087ab0e9f01b5" + }, + "vllm/distributed/elastic_ep/elastic_state.py": { + "path": "/vllm/distributed/elastic_ep/elastic_state.py", + "sha256": "fbf049199841a086fdf2fc1ab8498ef017ad3bf319db65c3ae61acbb536d2e10" + }, + "vllm/distributed/elastic_ep/standby_state.py": { + "path": "/vllm/distributed/elastic_ep/standby_state.py", + "sha256": "15282597550ebd0e07b8492ff192aea1ec0dcec8f0ad34009123e1002cc140c1" + }, + "vllm/distributed/eplb/__init__.py": { + "path": "/vllm/distributed/eplb/__init__.py", + "sha256": "1b9c2ee22abb5888c354c5aa01f0944f253e5e24e135d019778398bbe495a628" + }, + "vllm/distributed/eplb/async_worker.py": { + "path": "/vllm/distributed/eplb/async_worker.py", + "sha256": "424328600ad1003286fc5dfffa1f9482007314c060947818b2f94a8b97811f5e" + }, + "vllm/distributed/eplb/eplb_communicator.py": { + "path": "/vllm/distributed/eplb/eplb_communicator.py", + "sha256": "ba30d9d40e7b81d3f42aa9041d2f328edca4073cfe2de920285eb68375501ed8" + }, + "vllm/distributed/eplb/eplb_state.py": { + "path": "/vllm/distributed/eplb/eplb_state.py", + "sha256": "2f06bc8c63f3fdf55edb5032ae55c0ffcac3e67720ce74ea312e3d141b12acf4" + }, + "vllm/distributed/eplb/eplb_utils.py": { + "path": "/vllm/distributed/eplb/eplb_utils.py", + "sha256": "058af6104faa6d4085c1dca80bbe60d92bf0a7ec9cd92c775a180546c9d8c9c3" + }, + "vllm/distributed/eplb/policy/__init__.py": { + "path": "/vllm/distributed/eplb/policy/__init__.py", + "sha256": "daeb266c88442832b1ab8c8c4cc064891b38b9e9ba00aea324f926c87dc6d37e" + }, + "vllm/distributed/eplb/policy/abstract.py": { + "path": "/vllm/distributed/eplb/policy/abstract.py", + "sha256": "b9fd34c28bbfdded03360d7f3f6f8fb978e82689190d7ae4501dfe520e958c62" + }, + "vllm/distributed/eplb/policy/default.py": { + "path": "/vllm/distributed/eplb/policy/default.py", + "sha256": "3b54229e6240d050480390f6b29d4744fd38437d23719f78a6decf7002296a29" + }, + "vllm/distributed/eplb/rebalance_execute.py": { + "path": "/vllm/distributed/eplb/rebalance_execute.py", + "sha256": "b387e228791149018536eee96cf955b33ba79d801cdc36849d1b47a580ec2597" + }, + "vllm/distributed/kv_events.py": { + "path": "/vllm/distributed/kv_events.py", + "sha256": "de08f01e8736881560256c350a3b6418999dd4aa30f9c6ec9159527f7ed6899a" + }, + "vllm/distributed/kv_transfer/__init__.py": { + "path": "/vllm/distributed/kv_transfer/__init__.py", + "sha256": "c1be4e58ec6923bae607a355ad22891c740f056a69ff7358b1e10ea3fd2680ea" + }, + "vllm/distributed/kv_transfer/kv_connector/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/base.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/base.py", + "sha256": "2ae2a2c48f5731f3533166a75440fe91e764332305b5d713df840edba970789d" + }, + "vllm/distributed/kv_transfer/kv_connector/factory.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/factory.py", + "sha256": "add99c93c587b0098b90b1f8fd6940bdd1f15c236c5c6f1a258411863cb902d3" + }, + "vllm/distributed/kv_transfer/kv_connector/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/utils.py", + "sha256": "317ed40dc837671ca6e666165222e641a0f9b3992aea63bbf54de7e13d40b3a4" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/__init__.py", + "sha256": "5beb6ccad12fdcfe1581982da6f18321caca50e73a6b3259ebf3c8dc8b3ffcca" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/base.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/base.py", + "sha256": "97af64220475c6c9e8273438d7b5138b105ebe6944beb783facb36a3bb76f31b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/decode_bench_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/decode_bench_connector.py", + "sha256": "b4151c88cdec28f1ff9259047abc17baf23b892f4b68769a93bf26e0442b9017" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/example_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/example_connector.py", + "sha256": "6226876ef52d10d0d284d29c337ab44698e8bac6abdb2e0ece53b5756c55d068" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/example_hidden_states_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/example_hidden_states_connector.py", + "sha256": "58c22534dcad0fb73599a2d70a2fb104d5b612a4723be5e777f56a56fe07892c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/flexkv_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/flexkv_connector.py", + "sha256": "de4f68c3bd565ed898e47e0b2980049b966ff31888f1957050d30995d4953762" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_client.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_client.py", + "sha256": "bea6ecff2be281c7e96c1551c7bf463cbb01f2964696067c0ebdb683844f9aab" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_connector.py", + "sha256": "e67ed58015090e5eea9d499883f2a9422673d07f8bdbe0ccff7db15d2460de13" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_metadata_server.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/hf3fs_metadata_server.py", + "sha256": "6800e5cf37809f8a8e28c469c14a434db288bc3bf83a8b62ee06910a20c2da19" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/common.py", + "sha256": "8f2c02c08227a9093e6aeb183961aba36b7812cfc29b8c047a2b2c9d82f79c15" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/gather_scatter_helper.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/gather_scatter_helper.py", + "sha256": "08c1b43de34fbeca77357d7576ac1d17cba974b59d695562f68bb713061e7b54" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/hf3fs_mock_client.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hf3fs/utils/hf3fs_mock_client.py", + "sha256": "bec61a9b0c4b9124b2292d7646d76411da44396389349b53cdcbc46353c8780e" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/connector.py", + "sha256": "8c61094ce0a3a702908f9576f69482e6bf314738a2cbe33a7d3b47258fa0ab43" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/stats.py", + "sha256": "d9383a6ad6ab6b8f812d29d90495407b770eeddb79b86e9d0e3216c0bd16e0ed" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/hisparse/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/hisparse/worker.py", + "sha256": "251c0d8e57e4739c03ce3e1c899a95ff5b1752eb27676c28ab88c4ebd62c4776" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_connector.py", + "sha256": "5991f9ff8832df32bd421eb67e48237270ea0a408180e523810bb43606acf8f3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/__init__.py", + "sha256": "c53be9796e76cde637514bfc40a525d8c09bb2784b406cb516790d8285dfe433" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/multi_process_adapter.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/multi_process_adapter.py", + "sha256": "6480d67b31ed603027a83edf327880a38aee45eaeee2da9a4efa93e95527c166" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/utils.py", + "sha256": "e204fa6a853ac9c122d7a4e9d146902230f81c48d4321ed5edfdbf979dd49ba2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/vllm_v1_adapter.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/vllm_v1_adapter.py", + "sha256": "e6fe55049c6b007248516d69640e2f3a4809f9d286091a1014ae0949987fa8f1" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py", + "sha256": "c712c386a7c57bf0355a1441ba574232c3aa5498fcb70713a2b3f5d18b64f9c1" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/metrics.py", + "sha256": "de1b1797d0448f74370919dbb0278767f390e8f59e00a0c0528abefb302babc2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_connector.py", + "sha256": "516be01320e64b0110e102eeb69a6ba766dd5ac8cb3036db6b97b7d54413323d" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_utils.py", + "sha256": "26877610463fa8e9d6b092772f2551bcc0c3ac794cbe63996df0414666a8ebba" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/rdma_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/rdma_utils.py", + "sha256": "716e5042edecaba36c7ca763474988f32fa09c2668b8260260149df610af8f83" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/stats.py", + "sha256": "f39b2f0b1db2e4f922e27e684a3f7bbf5bb279b82a0a8c3bb0c7ae69b6d14d24" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/connector.py", + "sha256": "17a350bdb89e17e415d6c52a48684dc15c35a804378daf03e1f3bee1b1b123a3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/coordinator.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/coordinator.py", + "sha256": "a8eb6c2157a96e8d25233b82347ac8409a41d6390b4f2c64242119c05911010c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/data.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/data.py", + "sha256": "d3cfefdb4165a24995749cba452641b318065baa95bb1bae62f922a2f8886e7b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/metrics.py", + "sha256": "f2b9ef8927632d142aad11a374d0725c6e619ea0bb7fea9eda3f3895eb7d277a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/protocol.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/protocol.py", + "sha256": "ccb1cf6a84a932a375215627d2aaac482c351a05df015d636d05373a6845b7c8" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/scheduler.py", + "sha256": "283849ff581ec206444cdf5621622377f1c925e8d7e05cb9294af2f3a5094e79" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/mooncake/store/worker.py", + "sha256": "55f1682dfd1ed7af689166421337126a0e1d08afa4774a242e098d79e0c1e95b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_common.py", + "sha256": "549bb4fe22dca5095515b9c0712c31cc81a9d4923881e9f112317640fd8c04ab" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_connector.py", + "sha256": "c0f474bc34b579d889fae92eaf43eaca241be51a4697a187a942f0df4e6b6a98" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_engine.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_engine.py", + "sha256": "d842f3772fc6588d5a329a67572324cb74709aa3df4033e64c791a1e706c8e88" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_layout.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/moriio/moriio_layout.py", + "sha256": "2b4ec046a78897236b0626939bb828b6ec095355097d10bca39e5f3e1c992553" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/multi_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/multi_connector.py", + "sha256": "12d8387239f3194f2cb63ccbd64824648047210323572d66671e6a1eed349fc3" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/__init__.py", + "sha256": "cc3145fe3b6d219a267bf40a0f7c0cc9430e4289f94acab2df761b99b671e7ba" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_scheduler.py", + "sha256": "7a1db8c54e4cd846bdac747344f2aea2c2fcf507817928796063225223b7e169" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/base_worker.py", + "sha256": "49a2e4faf99bef146b5a1d4d18d48f240b1e561c438252274494b359db96ef52" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/connector.py", + "sha256": "b6a0dc916d052f344be72ecfcb111509c13580102c11a860fa726cf0888949a9" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/metadata.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/metadata.py", + "sha256": "2b23a07c1ec5ac5490c3b818737c7192e344ea9f52cd5623f75939f741ab4e21" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_scheduler.py", + "sha256": "ac3daf8e2246581fec84ab28f2133569421b62c32a120be4923e2f4d0f2f9de9" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/pull_worker.py", + "sha256": "e5060c9b6cf022de35ca3d1da7a369cd6a6a2dea26219af9f7633aaf78af8a76" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_scheduler.py", + "sha256": "2d9008e33937a4d6c5cf9cc2f96160f2bdbc8e987fe37f0798a7fd7eb84c9572" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/push_worker.py", + "sha256": "87de3ea383dd3aa95fb2c287ea26ded8a330859cc1295f9faa69047e80865c2c" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/scheduler.py", + "sha256": "09f1bfe7075b926b26a94529480e33b62c3ac273ff826f6c502084f08b1b2a08" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/stats.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/stats.py", + "sha256": "3e710654e0b68d1a8592f0c4735c81b22f4bf698fb1a2dfea126d35bf2dd1ef2" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/tp_mapping.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/tp_mapping.py", + "sha256": "2d43607f98701b2fad6cc0ac2767619a80b7fc2b3a3c2eb6ed0da4fb05dcd8f6" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/utils.py", + "sha256": "93de863fc8307a61d40b62f1b176b57ae93c363d34b9e9ddc8e666265b6d45dc" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/nixl/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/nixl/worker.py", + "sha256": "5134a36ac100ce7a64f5311029a37ac12c38d91093f63100f51f7fe53ea7c3ee" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/__init__.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/canonical_mapping.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/canonical_mapping.py", + "sha256": "e0b3c6f9806a650e0370c43c5068fc31c0fec94615089e15fdf270d7d96f2b64" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/common.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/common.py", + "sha256": "9b3f042c6fa1581d10e8f688d2d9bc927bb41b780a9ea01f514d57228e20c978" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/config.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/config.py", + "sha256": "aea82e60889e78dcad8564ec8285b65a6a372824a1545a98ea8e78b6f4fd418a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/events.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/events.py", + "sha256": "d7039b67be95fd444966628184040a94880873c0611c0e6e7525a22650ffdefb" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/metrics.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/metrics.py", + "sha256": "13d76df014e86691f58dc89a879f9808b124690c9267dd5fa3b2d4004d4c5fdf" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/scheduler.py", + "sha256": "2c5282f4a3165cd787fb355e215e3869f1bdd3f2c795b2155fc537c9d135191a" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading/worker.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading/worker.py", + "sha256": "acc2df53262441dfc6421a3af7f0cbd68cbfaedbd42bbc384d8e1da2d965d194" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/offloading_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/offloading_connector.py", + "sha256": "cdc16ca7339a10e1993bd6220e6273f86a4e99779f58f25098a24ad31bb0dbd8" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/simple_cpu_offload_connector.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/simple_cpu_offload_connector.py", + "sha256": "96238ca82ccf07a1eeb59b8f66de17b09034e3eb993ad9a0a836511d3f69706b" + }, + "vllm/distributed/kv_transfer/kv_connector/v1/ssm_conv_transfer_utils.py": { + "path": "/vllm/distributed/kv_transfer/kv_connector/v1/ssm_conv_transfer_utils.py", + "sha256": "59a949709482e65a007fbe5352fe9b4bb54c2dcc10ad2c1c41f754b6e13299f4" + }, + "vllm/distributed/kv_transfer/kv_transfer_state.py": { + "path": "/vllm/distributed/kv_transfer/kv_transfer_state.py", + "sha256": "2e5fe09438d6e2ee642f8a26cf7dcf632e870d955d30baf002b76a8bfe836d05" + }, + "vllm/distributed/nixl_utils.py": { + "path": "/vllm/distributed/nixl_utils.py", + "sha256": "0bffa3c052c9f67472b1c0bc3816114891b010c968bf4b8a292e7da4d687db53" + }, + "vllm/distributed/parallel_state.py": { + "path": "/vllm/distributed/parallel_state.py", + "sha256": "d9b10ad56833ebc08a753e1a050ef0989c30d4134021b7b7b00150b7bd01adc6" + }, + "vllm/distributed/stateless_coordinator.py": { + "path": "/vllm/distributed/stateless_coordinator.py", + "sha256": "f52848fbe985ed47b1f3e3ca555314736ca06436e8d738ab4390101f0672dcb0" + }, + "vllm/distributed/utils.py": { + "path": "/vllm/distributed/utils.py", + "sha256": "792146b357139e705064a68d3b66858de8a0baaca4dc7db1232fa217d45db231" + }, + "vllm/distributed/weight_transfer/__init__.py": { + "path": "/vllm/distributed/weight_transfer/__init__.py", + "sha256": "3fb9d4712b7c131d522f5e76e73cd8c333f3cc7af86e2d5ecf9b61b57b3b7f5a" + }, + "vllm/distributed/weight_transfer/base.py": { + "path": "/vllm/distributed/weight_transfer/base.py", + "sha256": "8ab06feb04f1379d0558fbdb77fde46bc84f179e0a26742cabab937e88caa38d" + }, + "vllm/distributed/weight_transfer/clients.py": { + "path": "/vllm/distributed/weight_transfer/clients.py", + "sha256": "ff85c79c350241e6d2749ca23c9d295a3289b4b62bfdf0257d32eb94a0151d36" + }, + "vllm/distributed/weight_transfer/factory.py": { + "path": "/vllm/distributed/weight_transfer/factory.py", + "sha256": "4e979eeac8c5bcdbffb10eb4765cfb30120fa7595c6c2561d3fa1a966ced61c8" + }, + "vllm/distributed/weight_transfer/ipc_engine.py": { + "path": "/vllm/distributed/weight_transfer/ipc_engine.py", + "sha256": "1af578293f387a19073c322b24143c3ae4716ce0c5d2bac2a4ef26fe20119330" + }, + "vllm/distributed/weight_transfer/nccl_common.py": { + "path": "/vllm/distributed/weight_transfer/nccl_common.py", + "sha256": "7b2ef7dc7481c3f478f17c49aa36c7bed54142ec5c93d36ed8426c8fdf09e500" + }, + "vllm/distributed/weight_transfer/nccl_engine.py": { + "path": "/vllm/distributed/weight_transfer/nccl_engine.py", + "sha256": "7fd020c919dc7b4723fb78e64da977b180d0fef0cd21df955a037b848dbaa008" + }, + "vllm/distributed/weight_transfer/packed_tensor.py": { + "path": "/vllm/distributed/weight_transfer/packed_tensor.py", + "sha256": "d0a27fb0be1dc029bd5a1d44fdb57a5e54aa4cd74308bedc339e86ac02c7494c" + }, + "vllm/distributed/weight_transfer/sharded_rdt_common.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_common.py", + "sha256": "be0b13801f24e7b62999b19d733c030510353603a2d5320d5dc98ee02daf22a2" + }, + "vllm/distributed/weight_transfer/sharded_rdt_engine.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_engine.py", + "sha256": "2f791970b4815511a7578ef6c957e7da97b071d26a39087a09a17475909791ee" + }, + "vllm/distributed/weight_transfer/sharded_rdt_fake.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_fake.py", + "sha256": "ee11164e17b5f2793252ce77741b8b94e0583046abf896a590131b2008d1fbb9" + }, + "vllm/distributed/weight_transfer/sharded_rdt_trainer.py": { + "path": "/vllm/distributed/weight_transfer/sharded_rdt_trainer.py", + "sha256": "dd413ff461d41826ccd3eb87d3df22f6cd7f24e09aac7644e3e5b40d7beec484" + }, + "vllm/distributed/weight_transfer/sparse_nccl_engine.py": { + "path": "/vllm/distributed/weight_transfer/sparse_nccl_engine.py", + "sha256": "e11b409454dda2b05ea34e8115ac19027c5e65cb2a5e9682c494f16a50e978f4" + }, + "vllm/model_executor/determinism/__init__.py": { + "path": "/vllm/model_executor/determinism/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/determinism/batch_invariant.py": { + "path": "/vllm/model_executor/determinism/batch_invariant.py", + "sha256": "af8f8d256a48fc214edf426fbe891fb15bd8b1d7ae98b811c736ff1eb0fae798" + }, + "vllm/model_executor/determinism/batch_invariant_configs.py": { + "path": "/vllm/model_executor/determinism/batch_invariant_configs.py", + "sha256": "72ea0d4df0ab5ae288abb7df5c203d2ad5f1709c7295d87ec72da775fddc1b7a" + }, + "vllm/model_executor/layers/fused_moe/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/__init__.py", + "sha256": "64a32665be6d5afcfbaf7a0915717267278b66b880b908b0263ea58f08e51b5e" + }, + "vllm/model_executor/layers/fused_moe/activation.py": { + "path": "/vllm/model_executor/layers/fused_moe/activation.py", + "sha256": "78dec0e85e0c040304515f64ccf8f2c6a7a2e5b9f1124a2138a97d9a02585541" + }, + "vllm/model_executor/layers/fused_moe/all2all_utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/all2all_utils.py", + "sha256": "dc4750a446f7de31d09a46034da5fdf479bc169af90f47aa9af8ae15e67b0828" + }, + "vllm/model_executor/layers/fused_moe/b12x.py": { + "path": "/vllm/model_executor/layers/fused_moe/b12x.py", + "sha256": "ee76cc6aa801e24be8ec78a9e8502061ad48667d5ff8711e43f68fba912425bd" + }, + "vllm/model_executor/layers/fused_moe/config.py": { + "path": "/vllm/model_executor/layers/fused_moe/config.py", + "sha256": "a3a87cebcc7ac85d73f471dcfafc2d899c6fc08f264777b74a0e919adac9e03f" + }, + "vllm/model_executor/layers/fused_moe/deep_gemm_utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/deep_gemm_utils.py", + "sha256": "8fdcd857eb333f9c68902105f157568d52067c94ba1e2df6dbfe0474ef1f4c02" + }, + "vllm/model_executor/layers/fused_moe/eep_reconfigure.py": { + "path": "/vllm/model_executor/layers/fused_moe/eep_reconfigure.py", + "sha256": "9d7580265e8563e1140c2bb4c3a81a35ddd54903f5ec0a2720ffc064681f02f9" + }, + "vllm/model_executor/layers/fused_moe/expert_map_manager.py": { + "path": "/vllm/model_executor/layers/fused_moe/expert_map_manager.py", + "sha256": "308c00f63fcb6f44518ec3a56d8f902c7bba75928c2e3aea30fbe1f3f473973b" + }, + "vllm/model_executor/layers/fused_moe/experts/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a16_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a16_moe.py", + "sha256": "53deea255175171971422d14082ad139b5ec7b62e21429a4c7cc0ebbefd29cdc" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp4_w4a8_moe.py", + "sha256": "f3fc51b95ed89862381908a0134e326228827f44854248db9585a9c4899c34f4" + }, + "vllm/model_executor/layers/fused_moe/experts/aiter_mxfp8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/aiter_mxfp8_moe.py", + "sha256": "af6db1760961a5a71234f8b1cdf42e9e30a236e13601b0826a75110b79724948" + }, + "vllm/model_executor/layers/fused_moe/experts/batched_deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/batched_deep_gemm_moe.py", + "sha256": "b0cd4ea706583518dc608fb56f832fc3595f24bd863b03ef1e8c22b36b873508" + }, + "vllm/model_executor/layers/fused_moe/experts/cpu_int4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cpu_int4_moe.py", + "sha256": "67170af3ba9dc4c4f71d78a72efc3fa4e366eac614936a79911dae5c75ac1864" + }, + "vllm/model_executor/layers/fused_moe/experts/cpu_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cpu_moe.py", + "sha256": "0754cd4ff1b28e6d3932a67609d335acefd28f95a841f0492923813356a6d81e" + }, + "vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/cutlass_moe.py", + "sha256": "db901bdbcd3fdac23a1d74e39c51e67f14a82be787b2fd704ed1e787372ae868" + }, + "vllm/model_executor/layers/fused_moe/experts/deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/deep_gemm_moe.py", + "sha256": "16911a64a72eafc26a1bcb544a91f90144d85dc41e3ee57cf20e89925227bbb7" + }, + "vllm/model_executor/layers/fused_moe/experts/fallback.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fallback.py", + "sha256": "1bdd0a4f2ebaa40ec96a5aacc07aee61511af59e6324ce456aa65003b6e2991a" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_b12x_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_b12x_moe.py", + "sha256": "e613afe5da2742e42c717c1a0a56bd9e1c7e3e0452a828db0013d81063518954" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_batched_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_batched_moe.py", + "sha256": "295254dfeeec8df3eb8110e6f659a946cb9cded3de1565ecad4d741b3c3f3e00" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutedsl_moe.py", + "sha256": "08578bcd0cf72d6a470e40950175e73639efaa6d8d23c6da0869345312b229c9" + }, + "vllm/model_executor/layers/fused_moe/experts/flashinfer_cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/flashinfer_cutlass_moe.py", + "sha256": "52887cec5fe628e0a4e7793deb546b40f6c29f7362b3b436c10ca36934ab9826" + }, + "vllm/model_executor/layers/fused_moe/experts/fused_batched_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fused_batched_moe.py", + "sha256": "2435587fc7f8fe8ea341ea0eb8f14c11f3f5b31fbbb9b29ce569ad3bace6e6a0" + }, + "vllm/model_executor/layers/fused_moe/experts/fused_humming_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/fused_humming_moe.py", + "sha256": "a6830a76ff7f4cd3479b9c8372a30d03e8301604555cbdbcd9ac89a813b7431a" + }, + "vllm/model_executor/layers/fused_moe/experts/gpt_oss_triton_kernels_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/gpt_oss_triton_kernels_moe.py", + "sha256": "1613a7a6b256e8faee6fdcfae84f293492db6229d28ceb3e8a8d6093af480e36" + }, + "vllm/model_executor/layers/fused_moe/experts/int4_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/int4_emulation_moe.py", + "sha256": "f12857caf0671a341687ad3c5f48616b816ed51e1bcbdefa0a7edbecdb81a79d" + }, + "vllm/model_executor/layers/fused_moe/experts/lora_context.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/lora_context.py", + "sha256": "9b41eefaaa57c5dd0dc54217ef95978821b0c52e90ea4db8b0752e08452bd3e5" + }, + "vllm/model_executor/layers/fused_moe/experts/lora_experts_mixin.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/lora_experts_mixin.py", + "sha256": "b2bc55ed6be98b526c6a5698e2d98300650e78555f56b1820e58c04888e2a373" + }, + "vllm/model_executor/layers/fused_moe/experts/marlin_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/marlin_moe.py", + "sha256": "93916b721548e6194dc70cf6cec224b4b1456a0cc0980235e97beba7bf36541d" + }, + "vllm/model_executor/layers/fused_moe/experts/mxfp8_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/mxfp8_emulation_moe.py", + "sha256": "d09c62ad1398c51ff6f515f2a61014ee9e9a9798d0fe9762c47f446efc5edbef" + }, + "vllm/model_executor/layers/fused_moe/experts/mxfp8_native_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/mxfp8_native_moe.py", + "sha256": "01a42cebf18189e566034111b2145573c655319e8af1a56db60d53a319c40613" + }, + "vllm/model_executor/layers/fused_moe/experts/nvfp4_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/nvfp4_emulation_moe.py", + "sha256": "f24467762b60702f0df122ed64786be839a838a9b6cafaecbd04d35fbfedb189" + }, + "vllm/model_executor/layers/fused_moe/experts/ocp_mx_emulation_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/ocp_mx_emulation_moe.py", + "sha256": "dcaa60a9ebdb0bd8223b37af41f018ce7f95716ec7cd8526850f4433a579213b" + }, + "vllm/model_executor/layers/fused_moe/experts/rdna3_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/rdna3_moe.py", + "sha256": "e4abd802dc2f0ad9b338ebde397633c761d881c37813e2dc229902c526b597d8" + }, + "vllm/model_executor/layers/fused_moe/experts/rocm_aiter_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/rocm_aiter_moe.py", + "sha256": "bf09a7b783f5752d61cab76221b32b598d8846d801ee39dc9209d636c9659c6f" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_cutlass_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_cutlass_moe.py", + "sha256": "ffce5ad627c540940d122d8df7981644b2eb35d07d480995c0f4f30517815fac" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_deep_gemm_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_deep_gemm_moe.py", + "sha256": "c7209fa5e1ccb184a68b37a0706fc571a76696c2ae79802ddc7f889b1c29684d" + }, + "vllm/model_executor/layers/fused_moe/experts/triton_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/triton_moe.py", + "sha256": "806fbccfe30f5fbd578acf773add99bdf022b12d617958bd6281aef6de369701" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_bf16_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_bf16_moe.py", + "sha256": "76256de96fefece9c41ffb1108487919e24da364cf4412c6c3474498aba59137" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.py", + "sha256": "b54c7ceb45e5d07aa905f42ea44caccf85ca35ba9fb825d4c01947764510f68b" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_lora_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_lora_moe.py", + "sha256": "dd35a9e4242c0dc8d691168813e14bd5543e591f02ee529d0691e07651942c5a" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_mxfp4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_mxfp4_moe.py", + "sha256": "fe780f125a3dc3ba919659e9b85340bd32afcbfe47733a002bfdfb92eadf400c" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_mxint4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_mxint4_moe.py", + "sha256": "2106d67c2951aa690c4656ca58240d09c366cffe8cb4d9fd575df016c377cc30" + }, + "vllm/model_executor/layers/fused_moe/experts/trtllm_nvfp4_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/trtllm_nvfp4_moe.py", + "sha256": "e938ac9f058f7c90b41c9610513239bec54a95304bfb5ff5f6897ebd54733d7e" + }, + "vllm/model_executor/layers/fused_moe/experts/xpu_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/experts/xpu_moe.py", + "sha256": "2a11bac0cf9274d963315efd6eebdc62978b0b7aa02e8849ff2a562742f0b86d" + }, + "vllm/model_executor/layers/fused_moe/fused_flydsl_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_flydsl_moe.py", + "sha256": "0e74879ee5c72f616ae4064b9dff3b3a0b583b7fc70b8f92f1e8b730ecd5d39b" + }, + "vllm/model_executor/layers/fused_moe/fused_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe.py", + "sha256": "7072eb06237be9d33dcb0ef7101410f886a6363c98cbee70a014c68b70f639cb" + }, + "vllm/model_executor/layers/fused_moe/fused_moe_method_base.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe_method_base.py", + "sha256": "18dcfc469d3252749801bbf943857f58da85de1f2db8fdff5a9f4986a925dc68" + }, + "vllm/model_executor/layers/fused_moe/fused_moe_modular_method.py": { + "path": "/vllm/model_executor/layers/fused_moe/fused_moe_modular_method.py", + "sha256": "321c744eac1fcaffd6b1b2971204c8baa57dfec53e91e5d24140014d72d64f83" + }, + "vllm/model_executor/layers/fused_moe/hpc_moe.py": { + "path": "/vllm/model_executor/layers/fused_moe/hpc_moe.py", + "sha256": "2ca9c5d71b6fd91651027905e2b83103a8823845e053e7153e148cb8e0ee666d" + }, + "vllm/model_executor/layers/fused_moe/layer.py": { + "path": "/vllm/model_executor/layers/fused_moe/layer.py", + "sha256": "def0b4e13bcc1e4e21ee10644e647e2eda1acbf0cc01e76d6128abb59ea08224" + }, + "vllm/model_executor/layers/fused_moe/modular_kernel.py": { + "path": "/vllm/model_executor/layers/fused_moe/modular_kernel.py", + "sha256": "8dc4e0dbbf35b3aac8add63ca6f2a7bbfdadaabbd60826e24598b22c7d8e5c22" + }, + "vllm/model_executor/layers/fused_moe/moe_align_block_size.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_align_block_size.py", + "sha256": "c3f7fc2087836f0160a32ab99ceb1d8f6e87c793679da34dd672e225cb7fa31b" + }, + "vllm/model_executor/layers/fused_moe/moe_fused_mul_sum.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_fused_mul_sum.py", + "sha256": "112e72578002c3bff538418dac64b3b56d995994a2fc5e32b18d2cf3b8392a13" + }, + "vllm/model_executor/layers/fused_moe/moe_output.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_output.py", + "sha256": "6ea4cbd78f9efc7f842c5df246f553f08b991c3479b8b04b89902ed08aaf8e8f" + }, + "vllm/model_executor/layers/fused_moe/moe_permute_unpermute.py": { + "path": "/vllm/model_executor/layers/fused_moe/moe_permute_unpermute.py", + "sha256": "1adc592c6254d0c877d66be5406afbc822459c18a838f4bbd094a992e7609d06" + }, + "vllm/model_executor/layers/fused_moe/oracle/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/__init__.py", + "sha256": "4dcf941d50d48bb812de0f39e9194bf17a76b8035fe324889c6038f710fdc453" + }, + "vllm/model_executor/layers/fused_moe/oracle/base.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/base.py", + "sha256": "555bbcd18a3744e64eee4e953daabef3bd268a1bd4faf967d4cfd14d6074f685" + }, + "vllm/model_executor/layers/fused_moe/oracle/fp8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/fp8.py", + "sha256": "245bd36c285df1e6f7c51e52dcda31ad247894577a9f8d765613c2c2feae9aee" + }, + "vllm/model_executor/layers/fused_moe/oracle/int8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/int8.py", + "sha256": "c1b67886511bd966b162db5bca8930f04895fb37a969818a4a10f0726c59547f" + }, + "vllm/model_executor/layers/fused_moe/oracle/int_wna16.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/int_wna16.py", + "sha256": "cfffe8b8b290330be9d18ffa07aeecf296484395ff04df3147d99393e48b55c1" + }, + "vllm/model_executor/layers/fused_moe/oracle/mxfp4.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/mxfp4.py", + "sha256": "b7915e6779b5c88e7dcd2d227f003a8e45071d6d86877013067142d4feb64a8c" + }, + "vllm/model_executor/layers/fused_moe/oracle/mxfp8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/mxfp8.py", + "sha256": "9cfdc8102a04bb844dcd7ed88043bba96ec751794bc093da76c69aa8cf88cf48" + }, + "vllm/model_executor/layers/fused_moe/oracle/nvfp4.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/nvfp4.py", + "sha256": "735b4cdeb1258f11fb02320fc0c70cab5edaca468dd60b07b2d369389d2b0313" + }, + "vllm/model_executor/layers/fused_moe/oracle/unquantized.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/unquantized.py", + "sha256": "c8b8203bd0b73bb7f586f703607394d663f14c05711416ad42d45af564382223" + }, + "vllm/model_executor/layers/fused_moe/oracle/w4a8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/w4a8.py", + "sha256": "d7fa6e2982f20b34d5ce9c5ce28a61122762a3fcdd53d249479472a4f2316c6a" + }, + "vllm/model_executor/layers/fused_moe/oracle/w4a8_int8.py": { + "path": "/vllm/model_executor/layers/fused_moe/oracle/w4a8_int8.py", + "sha256": "6d6f9ca2e67b630002873de2f8d8a231d091c5c2f0f3354a9e8209449b481a4c" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/__init__.py", + "sha256": "2800113263a83c2632e522fb22790b29f63384da75d43de32f0ae2f95e8ae4c1" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/batched.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/batched.py", + "sha256": "d52425dd8c08e47cf8d9c3088daf3b1cc721c8667de4c738d04ba997f9a08ccb" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ht.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ht.py", + "sha256": "465cdf1d6cee91b2ee8c2e43abbea6e8408976e3048c10f44c089f34b415bc60" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ll.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ll.py", + "sha256": "f704922b1db680c4c212982a096e09d6b3eb97d89110313f86ed958a00df21b7" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_v2.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_v2.py", + "sha256": "8d690b016bbcfbc9eb599bcc36a6f798b2f1720c828f4347ea742e218c0cc60d" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_one_sided.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_one_sided.py", + "sha256": "acb57d8342af62bb5672036871cd4b27ecc7f37dfa7c894850bb860e6152a1f0" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_two_sided.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/flashinfer_nvlink_two_sided.py", + "sha256": "cc5b00d6a157b6eca5afaaf7435165dbd1b4524d6d88bf75808cbe074a389f79" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/mori.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/mori.py", + "sha256": "8e9c3b5b1f0de13f467d95bf2f451cba0e4b0d9a1bdcf98da0988a3a9a79a045" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/naive_dp_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/naive_dp_ep.py", + "sha256": "db015e5b18750bbbf5b2bbaceca877dd6f3f3e74c2a94e8dc185f7413b387f91" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/nixl_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/nixl_ep.py", + "sha256": "1f71d70ac509bf5d3d67a8d95a8ee108a50af6bb5d4bde7181ca28e286f6ffce" + }, + "vllm/model_executor/layers/fused_moe/prepare_finalize/no_dp_ep.py": { + "path": "/vllm/model_executor/layers/fused_moe/prepare_finalize/no_dp_ep.py", + "sha256": "adbbf529cd22059c95b5380952943a70cf11e05e321dcd707f296bebde61a6e7" + }, + "vllm/model_executor/layers/fused_moe/routed_experts.py": { + "path": "/vllm/model_executor/layers/fused_moe/routed_experts.py", + "sha256": "68c48e5df0ea4a7cc1f04436b7b9153eb53802ecd9bb55d38db8738508daac6d" + }, + "vllm/model_executor/layers/fused_moe/routed_experts_capturer.py": { + "path": "/vllm/model_executor/layers/fused_moe/routed_experts_capturer.py", + "sha256": "cd006bc1a1703418cca3b589fafb2abc4268a086fb3db044bbb64348aeac8b13" + }, + "vllm/model_executor/layers/fused_moe/router/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/layers/fused_moe/router/aiter_shared_routed_fused_moe_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/aiter_shared_routed_fused_moe_router.py", + "sha256": "f47046db1275601a2c67c9232afc7b866c9623a19639d5be867e4c7914a35069" + }, + "vllm/model_executor/layers/fused_moe/router/base_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/base_router.py", + "sha256": "47fa2324bcd9b6ebdc138d69ae6b6ecc0f2463d34bda8c5988bdb0a2a76d3fae" + }, + "vllm/model_executor/layers/fused_moe/router/bf16x3_router_gemm_cutedsl.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/bf16x3_router_gemm_cutedsl.py", + "sha256": "d0f1edd1ebc48d88e490bdb3c93db49bdc0a135ff83e7e0b57130e9f8255fc32" + }, + "vllm/model_executor/layers/fused_moe/router/cpu_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/cpu_router.py", + "sha256": "bff36b15818c87bfbb7ee3def7dc7f6396860abbe5893ff6148801fe941a4b92" + }, + "vllm/model_executor/layers/fused_moe/router/custom_routing_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/custom_routing_router.py", + "sha256": "1a40c7054e3c3a1b3ee2e98f6bc9efa9dfdc11f316a8edf7357dd91533487bfe" + }, + "vllm/model_executor/layers/fused_moe/router/dsv4_topk.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/dsv4_topk.py", + "sha256": "14f7c8487b9aef652dd61c91e0e3c3640b643bf9cd0d8a7184157d71f4beb63e" + }, + "vllm/model_executor/layers/fused_moe/router/fused_moe_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_moe_router.py", + "sha256": "0daa0dc05b931d66767feca444a4cd57ecf140f59b40ea0e8ad213eef6da2b36" + }, + "vllm/model_executor/layers/fused_moe/router/fused_topk_bias_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_topk_bias_router.py", + "sha256": "8fdc28cc248180ad4f11bb4bcda3df47926ec12665a0d84bb712fe83fc6b9376" + }, + "vllm/model_executor/layers/fused_moe/router/fused_topk_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/fused_topk_router.py", + "sha256": "1c80f4af4d781fd66b12aa6a7a0fd30082bc521df40f1252987a8ac4c0bef51c" + }, + "vllm/model_executor/layers/fused_moe/router/gate_linear.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/gate_linear.py", + "sha256": "faa43362c2e7c568498a923c682ca18cae75e87f48d00882770821cb19c21198" + }, + "vllm/model_executor/layers/fused_moe/router/grouped_topk_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/grouped_topk_router.py", + "sha256": "048339e1799cdd42c9dae686a6cb891046577fb391b500f0d12eed73c8f61e52" + }, + "vllm/model_executor/layers/fused_moe/router/rocm_fp32_router_gemm.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/rocm_fp32_router_gemm.py", + "sha256": "9c331ef3d0bb2fb6954387d77ac62a99c5c76d2753c7438bfbb5115f68aae5ac" + }, + "vllm/model_executor/layers/fused_moe/router/router_factory.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/router_factory.py", + "sha256": "019bc8adaa7642abab82843efd53cd1a378f62c652521a1de2b781480eb88742" + }, + "vllm/model_executor/layers/fused_moe/router/routing_simulator_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/routing_simulator_router.py", + "sha256": "a7345df5add00cf3bd93024492d6fc1189fd3ecf2754a11cef1b03a295d791f7" + }, + "vllm/model_executor/layers/fused_moe/router/zero_expert_router.py": { + "path": "/vllm/model_executor/layers/fused_moe/router/zero_expert_router.py", + "sha256": "dea306edd92e2b9c1b43f982ede8e1e10770d2c66220f5a106e0ed0165276e9c" + }, + "vllm/model_executor/layers/fused_moe/runner/__init__.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/model_executor/layers/fused_moe/runner/moe_runner.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/moe_runner.py", + "sha256": "05893188402fe37229bf72d75088d66193c417d5d502daafd3a55e1bfedaa60c" + }, + "vllm/model_executor/layers/fused_moe/runner/moe_runner_interface.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/moe_runner_interface.py", + "sha256": "189cad01611124eb44594713cbf5918d16fc70196dc81a525ae0a7a97a5fcc51" + }, + "vllm/model_executor/layers/fused_moe/runner/shared_experts.py": { + "path": "/vllm/model_executor/layers/fused_moe/runner/shared_experts.py", + "sha256": "d89e4c79c46f6fe61262c51f3facf102e71ce1e4eb3db67f72b6bd8470937be9" + }, + "vllm/model_executor/layers/fused_moe/topk_weight_and_reduce.py": { + "path": "/vllm/model_executor/layers/fused_moe/topk_weight_and_reduce.py", + "sha256": "3dfede72d52bf99af40997994704e6c502ee3bab2bd39bfaa8a68d7dae440203" + }, + "vllm/model_executor/layers/fused_moe/unquantized_fused_moe_method.py": { + "path": "/vllm/model_executor/layers/fused_moe/unquantized_fused_moe_method.py", + "sha256": "182a5ec1874ece2091a24c5303f6ab9ea64a9a61adf325b863927f0cdd83e5d3" + }, + "vllm/model_executor/layers/fused_moe/utils.py": { + "path": "/vllm/model_executor/layers/fused_moe/utils.py", + "sha256": "a93a0bded4008db19d8b38370526ae34fafb9c8278e5b4f60acb6acc8fdc1850" + }, + "vllm/model_executor/layers/mamba/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/abstract.py": { + "path": "/vllm/model_executor/layers/mamba/abstract.py", + "sha256": "dfdc8c836894f574e41d93d76ab989cacd3d7ecf59c97a929abfa48d9364e8ad" + }, + "vllm/model_executor/layers/mamba/gdn/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/gdn/base.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/base.py", + "sha256": "7fec748fc74131f5a45bcaf2644b3fa3a0598fd437d7347f8207ea3644a951c5" + }, + "vllm/model_executor/layers/mamba/gdn/kimi_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/kimi_gdn_linear_attn.py", + "sha256": "1cec4da5c9da73557e192bfb36cd540aae51d3e91283b554449c4a97f0f89bd9" + }, + "vllm/model_executor/layers/mamba/gdn/olmo_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/olmo_gdn_linear_attn.py", + "sha256": "60873ca3bb0c4d17c33bd259b62b658db4883cd23138f47dd4ead62cd2ff0605" + }, + "vllm/model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py", + "sha256": "b80f8e6f3fff442fb880aebb3209c52f814f66490009f4ac4003de603576d10a" + }, + "vllm/model_executor/layers/mamba/linear/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/linear/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/linear/bailing_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/linear/bailing_linear_attn.py", + "sha256": "3c480ddd6eba0766ed012a1074bbec5f241d868a87b020b0f6312222c32f93eb" + }, + "vllm/model_executor/layers/mamba/linear/base.py": { + "path": "/vllm/model_executor/layers/mamba/linear/base.py", + "sha256": "26125cd427225954e1846ca361cdaf43f2b56f11b1e217cf26e91a80ef0edb6a" + }, + "vllm/model_executor/layers/mamba/linear/minimax_linear_attn.py": { + "path": "/vllm/model_executor/layers/mamba/linear/minimax_linear_attn.py", + "sha256": "4adc00f54893b5bc6c31c613deda152a19af3b1bba04153ab5924c3bf2a3aaae" + }, + "vllm/model_executor/layers/mamba/mamba_mixer.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_mixer.py", + "sha256": "a485e937ad9db14d3ad03fde5a9fe795cfa863649563e52fc7e6c52ef631164e" + }, + "vllm/model_executor/layers/mamba/mamba_mixer2.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_mixer2.py", + "sha256": "d58d93e90d9eb90bc5133b79f07c7c62d0032b35d6cf916e3fe34367b81c5cd5" + }, + "vllm/model_executor/layers/mamba/mamba_utils.py": { + "path": "/vllm/model_executor/layers/mamba/mamba_utils.py", + "sha256": "ce9845b4a4ef4bc46577a33038ed69d59ceccb52f30e9c5bdaa36e48be3b2ca4" + }, + "vllm/model_executor/layers/mamba/ops/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/ops/causal_conv1d.py": { + "path": "/vllm/model_executor/layers/mamba/ops/causal_conv1d.py", + "sha256": "044d005cfe59fd0818ed421274e04f3e8dd679b8cdb64fca9f4422f2643484b2" + }, + "vllm/model_executor/layers/mamba/ops/cpu/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/model_executor/layers/mamba/ops/cpu/causal_conv1d.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/causal_conv1d.py", + "sha256": "64104672890ac2ef240c20c7f8059beeade707178574809dbca8721dff5ea6fa" + }, + "vllm/model_executor/layers/mamba/ops/cpu/gdn_attention.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/gdn_attention.py", + "sha256": "a50288945bf5b102ad3025ae536638dcc32d84cf7c22aaf3a85326b0c1c56c1f" + }, + "vllm/model_executor/layers/mamba/ops/cpu/mamba_ssm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/cpu/mamba_ssm.py", + "sha256": "5839e576172a3246337f5e4fb1bc19eb583b3e2b2f7e35dd060dc3041eb8372d" + }, + "vllm/model_executor/layers/mamba/ops/gather_initial_states.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gather_initial_states.py", + "sha256": "5198bb6de6d91c583a5f65d926412a76ee04a06fa72aaba76eaf156b27cd0523" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/__init__.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/__init__.py", + "sha256": "b88b52e71fcb21bd3fa215ea171dcd2ad2ff17c97788cfe64caa7ba45c7ecf97" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_h.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_h.py", + "sha256": "f50bbe5c0b6382323ec5dfc24a5e0c7971113d59727515e60c9fe3689734e5ba" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_kkt_inv_uw.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_kkt_inv_uw.py", + "sha256": "b4a65dd194907db08865e0596fe254f915e670a9e6b27ffa2933c1026dde9b1e" + }, + "vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_o.py": { + "path": "/vllm/model_executor/layers/mamba/ops/gdn_chunk_cutedsl/kernel_o.py", + "sha256": "629f7843a7e611efb9390f2ebb7a4b924b2c328d48a317fddfaa96af4d9bc60a" + }, + "vllm/model_executor/layers/mamba/ops/layernorm_gated.py": { + "path": "/vllm/model_executor/layers/mamba/ops/layernorm_gated.py", + "sha256": "3433f2e3b87c2b2ccf8e9794ce40762c86a6da38a94ecee001f439ea0d0373dd" + }, + "vllm/model_executor/layers/mamba/ops/mamba_ssm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/mamba_ssm.py", + "sha256": "a4515ec7895b40ed878cf380445034b25faa61fbaa799d96c49217bbdfd7e400" + }, + "vllm/model_executor/layers/mamba/ops/replayssm_config.py": { + "path": "/vllm/model_executor/layers/mamba/ops/replayssm_config.py", + "sha256": "5fe9d5d7aa2de6a65875b3796a919b22bc435fd76055ba054bbff43aa005bc44" + }, + "vllm/model_executor/layers/mamba/ops/scatter_states.py": { + "path": "/vllm/model_executor/layers/mamba/ops/scatter_states.py", + "sha256": "f3bb004c73edaba56337747893eb07faf29b270dc8bb9c893ee9b1044e4ead9a" + }, + "vllm/model_executor/layers/mamba/ops/selective_state_update_replayssm_output_only.py": { + "path": "/vllm/model_executor/layers/mamba/ops/selective_state_update_replayssm_output_only.py", + "sha256": "cea7fd3063ca9dcc4e33f180d01ea379195ec515cedc9d0b03b11dc67670d695" + }, + "vllm/model_executor/layers/mamba/ops/ssd_bmm.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_bmm.py", + "sha256": "26983d97a7f5c5f9197a16a6bee7b1294839b9ae31a14c14aaee38b43523e630" + }, + "vllm/model_executor/layers/mamba/ops/ssd_chunk_scan.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_chunk_scan.py", + "sha256": "d5ef32e8cb47e2ce71984579df78ab69754895f891766394daf327867cfa4f8f" + }, + "vllm/model_executor/layers/mamba/ops/ssd_chunk_state.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_chunk_state.py", + "sha256": "177e3aa7fe72647133bbd86135533e8688a5802678d4d1564aa549410362316f" + }, + "vllm/model_executor/layers/mamba/ops/ssd_combined.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_combined.py", + "sha256": "1317bbb668d3c60dfe0658850f9968614f03fa5eb61196f8ce6ac17dbb31b480" + }, + "vllm/model_executor/layers/mamba/ops/ssd_state_passing.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssd_state_passing.py", + "sha256": "36b8c8edba437916a5b789717c61fc22077de01e77892cb96dbff3b00a57410e" + }, + "vllm/model_executor/layers/mamba/ops/ssu_dispatch.py": { + "path": "/vllm/model_executor/layers/mamba/ops/ssu_dispatch.py", + "sha256": "bbe0f0e61da87f3ddfead19a79ca376516b63f1ea868be3485333c63fa20ef41" + }, + "vllm/model_executor/layers/mamba/ops/triton_helpers.py": { + "path": "/vllm/model_executor/layers/mamba/ops/triton_helpers.py", + "sha256": "a8795532f22c37a93e82c9d8e3fadcb5f4da98673d7b321fe8481305eaafad30" + }, + "vllm/model_executor/layers/mamba/short_conv.py": { + "path": "/vllm/model_executor/layers/mamba/short_conv.py", + "sha256": "228494efab185ee17374f762874f4c8b9a26aac9decfa8c906ce38446e0de51a" + }, + "vllm/model_executor/models/qwen3_next.py": { + "path": "/vllm/model_executor/models/qwen3_next.py", + "sha256": "4fa5112ac2bf7886d41d9e1f6c3da8793620d1ec49c961b31e9609459a6a7f7a" + }, + "vllm/third_party/flash_linear_attention/__init__.py": { + "path": "/vllm/third_party/flash_linear_attention/__init__.py", + "sha256": "5dbbfa3fc286edb2e970e175ef33cee4f6181c89b0784f5a8986201b2312f54e" + }, + "vllm/third_party/flash_linear_attention/ops/__init__.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/__init__.py", + "sha256": "dd738dc1d08045e76455cdbe16052a5b769e0eb11d6e87ff28353994f880cd6c" + }, + "vllm/third_party/flash_linear_attention/ops/chunk.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk.py", + "sha256": "c105ead259e86aedc248c53e7c4cef07034d0ff12da608d80265d1dd0990803f" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_delta_h.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_delta_h.py", + "sha256": "1b3ad391f939d9443c6b7adb19e57fe381bd5dccea064e8417a4f85b0e713b26" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_o.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_o.py", + "sha256": "3b63b836a8cc561723c23db5a528a0b474d9cd78508d610f0b348c585a889a19" + }, + "vllm/third_party/flash_linear_attention/ops/chunk_scaled_dot_kkt.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/chunk_scaled_dot_kkt.py", + "sha256": "7ae41df3755acc7e925a134d848f78bb5fc00b90069039d86403c5853323ea42" + }, + "vllm/third_party/flash_linear_attention/ops/cumsum.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/cumsum.py", + "sha256": "d818215669b451868823202ac0bcea77e7a9d75957254c7c1060a73a55dc39b6" + }, + "vllm/third_party/flash_linear_attention/ops/fused_gdn_prefill_post_conv.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_gdn_prefill_post_conv.py", + "sha256": "590717b2107abc90d72548de06b5d315229eb2775c94614f3f545df11cc2b5df" + }, + "vllm/third_party/flash_linear_attention/ops/fused_norm_gate.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_norm_gate.py", + "sha256": "e6eb90467f29d8a0a04f2a364d20a2c3191b6ab857841bfb82076b33a6022d1a" + }, + "vllm/third_party/flash_linear_attention/ops/fused_recurrent.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_recurrent.py", + "sha256": "fe6f1311014809040497aa0a623e7fa97f4b3457cdc7ee1f1f8aed21f326f755" + }, + "vllm/third_party/flash_linear_attention/ops/fused_sigmoid_gating.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/fused_sigmoid_gating.py", + "sha256": "000ab8996af9788fdb8843a6a3b91833e7a14c8acc0e1ea073a536330f64cb6f" + }, + "vllm/third_party/flash_linear_attention/ops/index.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/index.py", + "sha256": "a4f8b2c052635cb519a80099e8a85411d1d5d6880b38f466788259bbe66b154d" + }, + "vllm/third_party/flash_linear_attention/ops/kda.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/kda.py", + "sha256": "e1f31aaa89b91f8e5db6d070b229e2c81c7206e8caec67de41db97d06be0c476" + }, + "vllm/third_party/flash_linear_attention/ops/l2norm.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/l2norm.py", + "sha256": "520f4513ef4fc97e6b88dc07877cca8e29da0d34e44673fe989e3af002d86381" + }, + "vllm/third_party/flash_linear_attention/ops/layernorm_guard.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/layernorm_guard.py", + "sha256": "42af29be26e8fc94a4658e053c095fcdab9ffdc1bc2446a01e787deda2a298c0" + }, + "vllm/third_party/flash_linear_attention/ops/op.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/op.py", + "sha256": "456da84fd12411cf53c96a90dd4f78f49afb454c3d51d2c524ea8e7106fe8ae5" + }, + "vllm/third_party/flash_linear_attention/ops/solve_tril.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/solve_tril.py", + "sha256": "d1a4ff27623a938825052500afa7e2aa24fadd2fa4c9be6376c9128824f86f82" + }, + "vllm/third_party/flash_linear_attention/ops/utils.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/utils.py", + "sha256": "d6c90d36505e02086954c23ca4dd2fea82a69416d68ff1d0501e16b3148b5b0c" + }, + "vllm/third_party/flash_linear_attention/ops/wy_fast.py": { + "path": "/vllm/third_party/flash_linear_attention/ops/wy_fast.py", + "sha256": "c9fc8259db0a8746dc04f1d799cb73333457118cf89a0bdce8dde8a80a28cd96" + }, + "vllm/v1/attention/__init__.py": { + "path": "/vllm/v1/attention/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backend.py": { + "path": "/vllm/v1/attention/backend.py", + "sha256": "01ac364372afa75fdb22486aa3a9c7cf9aebb742e3471dfb9e0f9d9d36b734bc" + }, + "vllm/v1/attention/backends/__init__.py": { + "path": "/vllm/v1/attention/backends/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backends/b12x.py": { + "path": "/vllm/v1/attention/backends/b12x.py", + "sha256": "443f0a98738fdfefe5b9ab151d278bfd43a8ac807eb2b0b9b2a13d51922afbf9" + }, + "vllm/v1/attention/backends/composite.py": { + "path": "/vllm/v1/attention/backends/composite.py", + "sha256": "4cf3d66dca891562709eed4f50aa14b0ae6c8240d9ea86504a3304b2f356cce0" + }, + "vllm/v1/attention/backends/cpu_attn.py": { + "path": "/vllm/v1/attention/backends/cpu_attn.py", + "sha256": "76fb02a6bd725125565d84bf04f627cf16da5f7ff8f31f87c01ed6a1439398c7" + }, + "vllm/v1/attention/backends/fa_utils.py": { + "path": "/vllm/v1/attention/backends/fa_utils.py", + "sha256": "08fa6e231d3af3a71a6e59162dd12328aa8beb28548165ae58f130a92adb5a83" + }, + "vllm/v1/attention/backends/flash_attn.py": { + "path": "/vllm/v1/attention/backends/flash_attn.py", + "sha256": "b170a4789e18104c1bee35bea70df51abe6766693d8f4726a59f2e6f5c4282aa" + }, + "vllm/v1/attention/backends/flash_attn_diffkv.py": { + "path": "/vllm/v1/attention/backends/flash_attn_diffkv.py", + "sha256": "e4627c88c3ba8caee260540e994cc8137fd2ff7cd7813356b36387c6c88ce30a" + }, + "vllm/v1/attention/backends/flashinfer.py": { + "path": "/vllm/v1/attention/backends/flashinfer.py", + "sha256": "8ee541fde43ed92a417b3f01ea1e6fc64af8ab2eb54cbfc28308a49aaca4ed7f" + }, + "vllm/v1/attention/backends/flex_attention.py": { + "path": "/vllm/v1/attention/backends/flex_attention.py", + "sha256": "ad07f0ad73aeeadc3534b3a05c14f88a62cb3638874239ae9823c49b36276dc3" + }, + "vllm/v1/attention/backends/gdn_attn.py": { + "path": "/vllm/v1/attention/backends/gdn_attn.py", + "sha256": "3831019404a92200a38b43571c040cffeb6638bbdc71e4cb5e680dbc6c93d054" + }, + "vllm/v1/attention/backends/hpc_attn.py": { + "path": "/vllm/v1/attention/backends/hpc_attn.py", + "sha256": "af9e2aec1b498f0ee48a2dce3cf5646edf1976466980b2fd927c0e82b875427c" + }, + "vllm/v1/attention/backends/linear_attn.py": { + "path": "/vllm/v1/attention/backends/linear_attn.py", + "sha256": "bc42144fcd027434c6a10dc9f4c5f991db8899d387af5f6485402ce097eb0513" + }, + "vllm/v1/attention/backends/mamba1_attn.py": { + "path": "/vllm/v1/attention/backends/mamba1_attn.py", + "sha256": "32159dae11cab3c8c576b9514ad97d5108c8d1b4cac9fcfe345ec6a76223aee7" + }, + "vllm/v1/attention/backends/mamba2_attn.py": { + "path": "/vllm/v1/attention/backends/mamba2_attn.py", + "sha256": "a5bcdecb7b9547137023e1c77a386003358fa940eaf5f319ed142211dcdba139" + }, + "vllm/v1/attention/backends/mamba_attn.py": { + "path": "/vllm/v1/attention/backends/mamba_attn.py", + "sha256": "5e7b2c4058fc5e6096d001bff6c789b78368b025bbe4600f191aaca2ff59b59f" + }, + "vllm/v1/attention/backends/mla/__init__.py": { + "path": "/vllm/v1/attention/backends/mla/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/backends/mla/aiter_triton_mla.py": { + "path": "/vllm/v1/attention/backends/mla/aiter_triton_mla.py", + "sha256": "ed0e285cdae06a019150c41cc958b3c0b5ceb0e4f299d5318d1c90e2c2395390" + }, + "vllm/v1/attention/backends/mla/amx_mla.py": { + "path": "/vllm/v1/attention/backends/mla/amx_mla.py", + "sha256": "7f5cddec30b2dfe22ccdbd3b9da673c879719bf6da4074317bd60add55f5d15f" + }, + "vllm/v1/attention/backends/mla/compressor_utils.py": { + "path": "/vllm/v1/attention/backends/mla/compressor_utils.py", + "sha256": "3589e94105368ea285c40b82db1a0332682ff5d071fe363627cf4c0d10f3facf" + }, + "vllm/v1/attention/backends/mla/cpu_mla.py": { + "path": "/vllm/v1/attention/backends/mla/cpu_mla.py", + "sha256": "ff2110b9f78e92adf6bab294465cbc294ae1ff71cb1780fed158179e134a4ca6" + }, + "vllm/v1/attention/backends/mla/cutlass_mla.py": { + "path": "/vllm/v1/attention/backends/mla/cutlass_mla.py", + "sha256": "211d298680f9bd793cc468281b316d6633c5f4eb6dcec71d3329b034a23ab9b5" + }, + "vllm/v1/attention/backends/mla/flashattn_mla.py": { + "path": "/vllm/v1/attention/backends/mla/flashattn_mla.py", + "sha256": "ac89e0ad75a37e92566d264bafe324735a80f9ab4709241a4454d17b3d38bb63" + }, + "vllm/v1/attention/backends/mla/flashattn_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashattn_mla_sparse.py", + "sha256": "67dd3ead2e8b9d8cda0825ecc93779cb7d670628bc741c759a7d3cd5d474030f" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla.py", + "sha256": "0c24ff016fb6b0bb41d9e7484b6f1af42f37bcc384ed613473fc3e01ad25f664" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse.py", + "sha256": "2116d965b2067134d8afa5878d4d16c0149b061258f50c4106d993aa13b073cc" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm120.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm120.py", + "sha256": "102ca08793d567f95598eefeb34c3f6ec50b3b9d704f162d1402b97b12b5777b" + }, + "vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm90.py": { + "path": "/vllm/v1/attention/backends/mla/flashinfer_mla_sparse_sm90.py", + "sha256": "df9fe4970aa3f53cf24784b8534b89e0101a2ca20a35a2ebbc9a12a4463d5993" + }, + "vllm/v1/attention/backends/mla/flashmla.py": { + "path": "/vllm/v1/attention/backends/mla/flashmla.py", + "sha256": "c9d8046a853ecbdeff9ebfc738f5bb34c4f272b278231a09a0fbf73708c7c188" + }, + "vllm/v1/attention/backends/mla/flashmla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/flashmla_sparse.py", + "sha256": "7a379c717adb9667ce94cbc16c0e3a1fb22a169713db6d7941c141fa84077b3f" + }, + "vllm/v1/attention/backends/mla/index_group.py": { + "path": "/vllm/v1/attention/backends/mla/index_group.py", + "sha256": "c24e028c3c160a9bb92e043da5b5b34c805e84745b7c4b8da6fb8702a0ddd641" + }, + "vllm/v1/attention/backends/mla/indexer.py": { + "path": "/vllm/v1/attention/backends/mla/indexer.py", + "sha256": "2acbc1c4fa57c3424ad95e6ecbe76eb7141747773c3e867ce704f4adccba892a" + }, + "vllm/v1/attention/backends/mla/prefill/__init__.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/__init__.py", + "sha256": "903630eb705dd175bf4ae4558a4bcaa07c110056b6a11eb830fdd2fb21b3c48a" + }, + "vllm/v1/attention/backends/mla/prefill/aiter_flash_attn.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/aiter_flash_attn.py", + "sha256": "571b8a9910c4ea3fefda60659026f3bf0d7b542c34553c8c9a4d43bb82077e61" + }, + "vllm/v1/attention/backends/mla/prefill/base.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/base.py", + "sha256": "138bf3ddaf5a94c3cdbc4e08ac676edcae84b32fc76625e546f3b47f7d8b82ec" + }, + "vllm/v1/attention/backends/mla/prefill/cpu_sdpa.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/cpu_sdpa.py", + "sha256": "1bb686395274a8ec0d9fd7327410a527655fe060cbbc263eab138fea988d96de" + }, + "vllm/v1/attention/backends/mla/prefill/flash_attn.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/flash_attn.py", + "sha256": "5e648c82c82e5f81fe11458eb82b9f90b50fc06df2ade3bf111ee6b7a2ee8481" + }, + "vllm/v1/attention/backends/mla/prefill/flashinfer.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/flashinfer.py", + "sha256": "63861219c35b8abc0ebe01e1f51543c5ed40bd46119ca261d927da7c6826b49b" + }, + "vllm/v1/attention/backends/mla/prefill/registry.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/registry.py", + "sha256": "c8c30b92213d594beaa3cab4d5003da26a85870dbb11d1ab73191962d0645b53" + }, + "vllm/v1/attention/backends/mla/prefill/selector.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/selector.py", + "sha256": "101d9fca7924b0c5d7891a17fe8942611bd6759e32b03a571dc87b14c1430f2f" + }, + "vllm/v1/attention/backends/mla/prefill/tokenspeed_mla.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/tokenspeed_mla.py", + "sha256": "047cf07bfcc83db3b11a6a54ffe189f6146e6ec9ad33ce2fa7d18860bf4210f0" + }, + "vllm/v1/attention/backends/mla/prefill/trtllm_ragged.py": { + "path": "/vllm/v1/attention/backends/mla/prefill/trtllm_ragged.py", + "sha256": "9e13ea6f6a25accedd918c0de64bbb812ccb20ffb95350ab018a6e76d493789b" + }, + "vllm/v1/attention/backends/mla/rocm_aiter_mla.py": { + "path": "/vllm/v1/attention/backends/mla/rocm_aiter_mla.py", + "sha256": "b489f5830c655bfb6299801a70d69b9821513c69568ecab3689db5a7be867be5" + }, + "vllm/v1/attention/backends/mla/rocm_aiter_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/rocm_aiter_mla_sparse.py", + "sha256": "91b1d9b3d860a9720bc01b8ebe9bbe8649a7d6bca20d4b63939bc100309bca19" + }, + "vllm/v1/attention/backends/mla/sparse_swa.py": { + "path": "/vllm/v1/attention/backends/mla/sparse_swa.py", + "sha256": "a47853ad8a3fe40f24704592581ea323a18041b84610df010a5534da634e311e" + }, + "vllm/v1/attention/backends/mla/sparse_utils.py": { + "path": "/vllm/v1/attention/backends/mla/sparse_utils.py", + "sha256": "c3cdf060288c05542243a9fe8b5ad3a963ad75e9ce399009b5e45c1235a88ce4" + }, + "vllm/v1/attention/backends/mla/tokenspeed_mla.py": { + "path": "/vllm/v1/attention/backends/mla/tokenspeed_mla.py", + "sha256": "b9ba523c606430cecb99a88b28c53d98a99dcf5e76105a80664338110a20f1ad" + }, + "vllm/v1/attention/backends/mla/triton_mla.py": { + "path": "/vllm/v1/attention/backends/mla/triton_mla.py", + "sha256": "21b16b3b34470edcc33d0423e560837c1d37d4bab31c7b3b9cfd7faa47864b51" + }, + "vllm/v1/attention/backends/mla/xpu_mla_sparse.py": { + "path": "/vllm/v1/attention/backends/mla/xpu_mla_sparse.py", + "sha256": "559c6240fe466521a6b2df4c94aea02ddf3f5efa5ba6954fa180c5a51c0f12d2" + }, + "vllm/v1/attention/backends/recoverssm_metadata.py": { + "path": "/vllm/v1/attention/backends/recoverssm_metadata.py", + "sha256": "02896a667db0f0308371ceb50048b18e5866c0235d163c0357e9a05dcedb3394" + }, + "vllm/v1/attention/backends/registry.py": { + "path": "/vllm/v1/attention/backends/registry.py", + "sha256": "378e8ee78734bd8c8adbe287d4c0a4058dcbb553195a09fbcce00a3cc30adc29" + }, + "vllm/v1/attention/backends/rocm_aiter_fa.py": { + "path": "/vllm/v1/attention/backends/rocm_aiter_fa.py", + "sha256": "d1418af03bf58209c850f466b712d3ea22a14ebb758c42dd43e65738281841fd" + }, + "vllm/v1/attention/backends/rocm_aiter_unified_attn.py": { + "path": "/vllm/v1/attention/backends/rocm_aiter_unified_attn.py", + "sha256": "59d2645eb4c91dc0567754a7163d066f4f2faf48f1957b254fcdd5604e9d8c8c" + }, + "vllm/v1/attention/backends/rocm_attn.py": { + "path": "/vllm/v1/attention/backends/rocm_attn.py", + "sha256": "4a8f57067073fbceb784af6c3467487c450d00fa3957928fadb99a79f6036292" + }, + "vllm/v1/attention/backends/short_conv_attn.py": { + "path": "/vllm/v1/attention/backends/short_conv_attn.py", + "sha256": "84fc460ef2fbd09743b069bec0c14b39542af6c2254a403e37a048427e151121" + }, + "vllm/v1/attention/backends/triton_attn.py": { + "path": "/vllm/v1/attention/backends/triton_attn.py", + "sha256": "1057663d110e1d5229495a799027b27277c1eca325d5b6780fa2259afbf58a1a" + }, + "vllm/v1/attention/backends/triton_attn_diffkv.py": { + "path": "/vllm/v1/attention/backends/triton_attn_diffkv.py", + "sha256": "de0357eae005246642140f1ab8842ba5ed8bff5c84b18a6d3a7bbf409c578301" + }, + "vllm/v1/attention/backends/triton_flash_attn.py": { + "path": "/vllm/v1/attention/backends/triton_flash_attn.py", + "sha256": "176e45329aeb28a2008362bb607d1b8c89816eb665859ab908b0385a11acf1c2" + }, + "vllm/v1/attention/backends/triton_flashinfer.py": { + "path": "/vllm/v1/attention/backends/triton_flashinfer.py", + "sha256": "48d5f967e388d4e8d6bbec8d827b44d855346bc2fada28adf65768bf6623527b" + }, + "vllm/v1/attention/backends/turboquant_attn.py": { + "path": "/vllm/v1/attention/backends/turboquant_attn.py", + "sha256": "616d16d608d9d1fbf6c29548037e7e9cf330f4d36a01aa3ffabf42a731eb6e2b" + }, + "vllm/v1/attention/backends/utils.py": { + "path": "/vllm/v1/attention/backends/utils.py", + "sha256": "fbc221360d2d54cb21ef3f625dc8711500de345a355801548b4337bb9b8abee0" + }, + "vllm/v1/attention/ops/__init__.py": { + "path": "/vllm/v1/attention/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/attention/ops/chunked_prefill_paged_decode.py": { + "path": "/vllm/v1/attention/ops/chunked_prefill_paged_decode.py", + "sha256": "973db848a790b2e8d99e728b2fc4f44b501bbe58c62747244ddff04cfcf11a85" + }, + "vllm/v1/attention/ops/common.py": { + "path": "/vllm/v1/attention/ops/common.py", + "sha256": "b4b67e7fc0cce471e337d742c097fba06da7563816e8799e27719714e31e1d5b" + }, + "vllm/v1/attention/ops/cp_common.py": { + "path": "/vllm/v1/attention/ops/cp_common.py", + "sha256": "2369181862e96db64b14ef20c5c2e249ed2ea5f3dea2467a2aa388372bb86d9d" + }, + "vllm/v1/attention/ops/dcp.py": { + "path": "/vllm/v1/attention/ops/dcp.py", + "sha256": "a478bdc781460f0582cfaf74d6431f1a826c201f02f39d882d12a96139bc3f28" + }, + "vllm/v1/attention/ops/flashmla.py": { + "path": "/vllm/v1/attention/ops/flashmla.py", + "sha256": "8a40d6e120e3ab25a95fcfeb32b0b5b4c1ea02b984633866628536dcd26ed2e8" + }, + "vllm/v1/attention/ops/flydsl_kernels/__init__.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/attention/ops/flydsl_kernels/tq_decode.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/tq_decode.py", + "sha256": "cc4b7f82897596e0974b3d3a710a1a8bc58c3d22b72cc7f461dd1c4acd2e451b" + }, + "vllm/v1/attention/ops/flydsl_kernels/tq_decode_gqa6.py": { + "path": "/vllm/v1/attention/ops/flydsl_kernels/tq_decode_gqa6.py", + "sha256": "a983f6d375c325900955e11696dab1e2665770e83f84d51f93d3ed5e1d8880e0" + }, + "vllm/v1/attention/ops/flydsl_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/flydsl_turboquant_decode.py", + "sha256": "7b1dd0ef7c7fb28a6a8831759e00b939ab844d067657155cc11cf75532a22c63" + }, + "vllm/v1/attention/ops/int4_per_token_head.py": { + "path": "/vllm/v1/attention/ops/int4_per_token_head.py", + "sha256": "d91968f280cd8eaed7570ab255f0276b40e833e18a25066d371d9ca8149425f2" + }, + "vllm/v1/attention/ops/merge_attn_states.py": { + "path": "/vllm/v1/attention/ops/merge_attn_states.py", + "sha256": "ad08403d2843fc892f0b0b4b9f5fabb81884556f89f7170dca46ccef498a3539" + }, + "vllm/v1/attention/ops/metadata.py": { + "path": "/vllm/v1/attention/ops/metadata.py", + "sha256": "ca882b84c5aaefb1f77e4d8ea09a00103fbc53defa8671bba036c961c17fc760" + }, + "vllm/v1/attention/ops/paged_attn.py": { + "path": "/vllm/v1/attention/ops/paged_attn.py", + "sha256": "016a95f892ec751c86b37be1e12171bad9f0b4076bbf2219ff336f4e9c503653" + }, + "vllm/v1/attention/ops/pcp.py": { + "path": "/vllm/v1/attention/ops/pcp.py", + "sha256": "dadeff95fe2df2be8028baabeef01b0d2d628cd67de2176915e737ce096de3dd" + }, + "vllm/v1/attention/ops/prefix_prefill.py": { + "path": "/vllm/v1/attention/ops/prefix_prefill.py", + "sha256": "b08ad92db715fc03c11699de3de463d55e411f42f77548e06b41049a61de692f" + }, + "vllm/v1/attention/ops/rocm_aiter_mla_merge.py": { + "path": "/vllm/v1/attention/ops/rocm_aiter_mla_merge.py", + "sha256": "564c66e4877732e48a6f7d52405c43dc952eec0f0ae4353d34886bca056132b9" + }, + "vllm/v1/attention/ops/rocm_aiter_mla_sparse.py": { + "path": "/vllm/v1/attention/ops/rocm_aiter_mla_sparse.py", + "sha256": "feec664be5045fd1ba13b8f6ef83b52c96910ddc78baca0431bcf610c9e8f5cc" + }, + "vllm/v1/attention/ops/triton_attention_helpers.py": { + "path": "/vllm/v1/attention/ops/triton_attention_helpers.py", + "sha256": "35aa993d01345f535d2641cf9dcabb8b64c51b20a19707bc5987e616aaa87ddd" + }, + "vllm/v1/attention/ops/triton_decode_attention.py": { + "path": "/vllm/v1/attention/ops/triton_decode_attention.py", + "sha256": "b9823c65eba22d76abf64dad7d7d16a950f67471c86d6cb5b3e983aaf14381ac" + }, + "vllm/v1/attention/ops/triton_merge_attn_states.py": { + "path": "/vllm/v1/attention/ops/triton_merge_attn_states.py", + "sha256": "f63229162181ab93198550b73a115f1cc1034cfd60e6f58bc8ab3e22a6e8ce60" + }, + "vllm/v1/attention/ops/triton_prefill_attention.py": { + "path": "/vllm/v1/attention/ops/triton_prefill_attention.py", + "sha256": "352c1a4ac86146580040579fb217c2e288268830d6602b735713e154f36d74fe" + }, + "vllm/v1/attention/ops/triton_reshape_and_cache_flash.py": { + "path": "/vllm/v1/attention/ops/triton_reshape_and_cache_flash.py", + "sha256": "6cac51475b8c656992a21b2d150acd3a16a95a7ab7d49aab151a3ef13c24b80d" + }, + "vllm/v1/attention/ops/triton_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/triton_turboquant_decode.py", + "sha256": "8e52678136449e4bbca2195fbcbb87426c955a2b1b8422e7ab9511e45ee5f5c6" + }, + "vllm/v1/attention/ops/triton_turboquant_store.py": { + "path": "/vllm/v1/attention/ops/triton_turboquant_store.py", + "sha256": "6e6e2fe74a307d40f0be786ccbaea76d989e3c7b5985f3144a5218c61bf6d902" + }, + "vllm/v1/attention/ops/triton_unified_attention.py": { + "path": "/vllm/v1/attention/ops/triton_unified_attention.py", + "sha256": "65d0fbcf33d00789df8ca688c0a1c908e710cfaef53471178747ecae11f05829" + }, + "vllm/v1/attention/ops/triton_unified_attention_diffkv.py": { + "path": "/vllm/v1/attention/ops/triton_unified_attention_diffkv.py", + "sha256": "7fa36d7b7441f1c396e0348eac61d691d2e459e5c4c393c4aa262dfb670e68f7" + }, + "vllm/v1/attention/ops/turboquant_soa/__init__.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/__init__.py", + "sha256": "6b43b6fcb2a71c44ceff4ed1edd417a839f4901251ba15831b09ad979baa4984" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode.py", + "sha256": "bf00634191bba14cbf4a23c1d67dc3dcb244c2b8989f08362757b54435830986" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode_v2.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_decode_v2.py", + "sha256": "28e7ecc15c450d3591983a50c46a03aa6ca6fa99304c17c333940617d9916485" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_store.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_store.py", + "sha256": "dccf93b9fdd34f9b9eacd468e9de35b9d93378594487c335cf50642aaec681f2" + }, + "vllm/v1/attention/ops/turboquant_soa/triton_turboquant_unified_attention.py": { + "path": "/vllm/v1/attention/ops/turboquant_soa/triton_turboquant_unified_attention.py", + "sha256": "b4b2b5f3985b3a6126fd052e6ec1ed91c610da8a525a9ae7470ac829405bd85c" + }, + "vllm/v1/attention/ops/vit_attn_wrappers.py": { + "path": "/vllm/v1/attention/ops/vit_attn_wrappers.py", + "sha256": "a99d57b58269c7521fa5d7d47af06551f3bab2b5c7358ef78165a7f6e20a92a6" + }, + "vllm/v1/attention/ops/xpu_mla_sparse.py": { + "path": "/vllm/v1/attention/ops/xpu_mla_sparse.py", + "sha256": "d98d17110577c2b7b4d05e07bfdae15faf83321b6342a5daaaecce45b9503f38" + }, + "vllm/v1/attention/selector.py": { + "path": "/vllm/v1/attention/selector.py", + "sha256": "87f653ded7974875183c920e3e4589c28116bcbc99714d1da7cb51ae77c0b182" + }, + "vllm/v1/core/sched/__init__.py": { + "path": "/vllm/v1/core/sched/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/core/sched/async_scheduler.py": { + "path": "/vllm/v1/core/sched/async_scheduler.py", + "sha256": "e586a0ef3c6778be56a93e7f9bb712d4de9de6e7d7fe7e3e1d51dae83ecfc508" + }, + "vllm/v1/core/sched/interface.py": { + "path": "/vllm/v1/core/sched/interface.py", + "sha256": "be6c008664096c5660a8879de72b315bbe479bf1d688be9b25891063ec53a367" + }, + "vllm/v1/core/sched/output.py": { + "path": "/vllm/v1/core/sched/output.py", + "sha256": "3a66c8efaefe10c572f6f33cf1f8aa4610758c945130cad62eb9f7331005677c" + }, + "vllm/v1/core/sched/request_queue.py": { + "path": "/vllm/v1/core/sched/request_queue.py", + "sha256": "4b8d938e5fb8152fe61030b8aa991f983fcac9a405c37ed8908045e05e82ae5e" + }, + "vllm/v1/core/sched/scheduler.py": { + "path": "/vllm/v1/core/sched/scheduler.py", + "sha256": "c1db45f3bbad3a875dd8638331b8870c4380ac1ab4734265ba5c863833a82884" + }, + "vllm/v1/core/sched/utils.py": { + "path": "/vllm/v1/core/sched/utils.py", + "sha256": "1ed988044eb8028c77ede875bd1a5fd05ff6998b455d61e3997d6a3d7fc1c3a7" + }, + "vllm/v1/sample/__init__.py": { + "path": "/vllm/v1/sample/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/sample/logits_processor/__init__.py": { + "path": "/vllm/v1/sample/logits_processor/__init__.py", + "sha256": "1f9b02dae8cf6d44484638037123d3a2dec6b7b9a2bcc9afceef1a9bf3eaedec" + }, + "vllm/v1/sample/logits_processor/builtin.py": { + "path": "/vllm/v1/sample/logits_processor/builtin.py", + "sha256": "6105816ece77e5b1dbee0d07abc90ce039d650bac2ddb85c93280c48b00f2ebe" + }, + "vllm/v1/sample/logits_processor/interface.py": { + "path": "/vllm/v1/sample/logits_processor/interface.py", + "sha256": "171dfc6ef9b5b53128e8eaecc4bdf1de413a706d64bf5be686048f583c66eee1" + }, + "vllm/v1/sample/logits_processor/state.py": { + "path": "/vllm/v1/sample/logits_processor/state.py", + "sha256": "a96411f14362c45f839e181dcb3ac01d5b880812bccb3552fc17863b219f44ac" + }, + "vllm/v1/sample/metadata.py": { + "path": "/vllm/v1/sample/metadata.py", + "sha256": "6582cfe1a240c7ddb975f0ef6dd7dcd28dcf0fc7670394390250013977aa7ffd" + }, + "vllm/v1/sample/ops/__init__.py": { + "path": "/vllm/v1/sample/ops/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/sample/ops/bad_words.py": { + "path": "/vllm/v1/sample/ops/bad_words.py", + "sha256": "0b1d0a9b13b92ddcae2c83393c07a34c0f107813725700dee794caa7fe7f3b12" + }, + "vllm/v1/sample/ops/logprobs.py": { + "path": "/vllm/v1/sample/ops/logprobs.py", + "sha256": "b286f69012a6758bfe9250038b0697294dbffe0d32c6906f284c39f75ee48be3" + }, + "vllm/v1/sample/ops/penalties.py": { + "path": "/vllm/v1/sample/ops/penalties.py", + "sha256": "4debfcf247b3887478d2b9ec98f108756bbed2805462777ef6b56f3bdf4ce682" + }, + "vllm/v1/sample/ops/topk_topp_sampler.py": { + "path": "/vllm/v1/sample/ops/topk_topp_sampler.py", + "sha256": "13ea4359832bc914492330958ec4f5ac140f408b8f410cc05c6eaf7ddcd70be4" + }, + "vllm/v1/sample/ops/topk_topp_triton.py": { + "path": "/vllm/v1/sample/ops/topk_topp_triton.py", + "sha256": "0b5fc337058e22bc28a8530ccec904d6ccd89b9548b02955c657ac429b1669d2" + }, + "vllm/v1/sample/rejection_sampler.py": { + "path": "/vllm/v1/sample/rejection_sampler.py", + "sha256": "0bb9d224887ccb1355e16199005cc23a4afc6fa75156eca419851b7247d99750" + }, + "vllm/v1/sample/sampler.py": { + "path": "/vllm/v1/sample/sampler.py", + "sha256": "f95805b2c6d06218c724826aa5f881a606e8d0a534a566aee7c85948520dd216" + }, + "vllm/v1/sample/thinking_budget_state.py": { + "path": "/vllm/v1/sample/thinking_budget_state.py", + "sha256": "962f8f55210eb0a431cb9c78b013e35f7a7dd58d06d6fb2e7fcff1b457356f8e" + }, + "vllm/v1/worker/__init__.py": { + "path": "/vllm/v1/worker/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/block_table.py": { + "path": "/vllm/v1/worker/block_table.py", + "sha256": "a09b8819e1417b7a186cf3472224e2138fc5d41a291c6692bb7df711b0c44259" + }, + "vllm/v1/worker/cp_utils.py": { + "path": "/vllm/v1/worker/cp_utils.py", + "sha256": "e32625d83a641b8dd8df82e92d1b6fb20af0cdf2e8fbd2fb131aa3c215415448" + }, + "vllm/v1/worker/cpu/__init__.py": { + "path": "/vllm/v1/worker/cpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/cpu/buffer_utils.py": { + "path": "/vllm/v1/worker/cpu/buffer_utils.py", + "sha256": "e7313fd8c2c76ebfb98d2fa53008bc9691d0f83a7d7c05e87602b5a29fb79e04" + }, + "vllm/v1/worker/cpu/model_runner.py": { + "path": "/vllm/v1/worker/cpu/model_runner.py", + "sha256": "24a1c916550051327dd5893243a6d4200f3824b91b3af8aa6f6c793fd7c68c3e" + }, + "vllm/v1/worker/cpu/shm.py": { + "path": "/vllm/v1/worker/cpu/shm.py", + "sha256": "08491af8ad341399d1375f2d21ad00414d4c89b0a5c03f55de8704914bbfcbd9" + }, + "vllm/v1/worker/cpu_model_runner.py": { + "path": "/vllm/v1/worker/cpu_model_runner.py", + "sha256": "92111aba92f00571f1a3c4c6e43cf1da6ccb4d2afac2f4d5abc018a4a6e7e8bd" + }, + "vllm/v1/worker/cpu_worker.py": { + "path": "/vllm/v1/worker/cpu_worker.py", + "sha256": "a8051b9e510ef0af9cc34004f2cbe5c0f902bd0cebc32c9464e744344dfdf849" + }, + "vllm/v1/worker/dp_utils.py": { + "path": "/vllm/v1/worker/dp_utils.py", + "sha256": "8cd19f1bfbc5c4f6ec60df89aea7c8a19b400ebc264f372b103014152e92158c" + }, + "vllm/v1/worker/ec_connector_model_runner_mixin.py": { + "path": "/vllm/v1/worker/ec_connector_model_runner_mixin.py", + "sha256": "fe9b11cebb8562f1bfe98b98a5647b2b081a6e424cb60d4ffe2412c91a99215e" + }, + "vllm/v1/worker/encoder_cudagraph.py": { + "path": "/vllm/v1/worker/encoder_cudagraph.py", + "sha256": "6a08d3779bca1b47dbf9daf6eafe2d3c70dbcb8aeb7d63ba7efacc68241ee3bc" + }, + "vllm/v1/worker/encoder_cudagraph_defs.py": { + "path": "/vllm/v1/worker/encoder_cudagraph_defs.py", + "sha256": "bb7be050fcaa8868e7816c84caec875da57050d65fe7eaf00f3d41473df25e3a" + }, + "vllm/v1/worker/gpu/__init__.py": { + "path": "/vllm/v1/worker/gpu/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/async_utils.py": { + "path": "/vllm/v1/worker/gpu/async_utils.py", + "sha256": "77e17a4570ead2be30ae9b00888cf077a3b873018c12ca0549b853bfda02c1ba" + }, + "vllm/v1/worker/gpu/attn_utils.py": { + "path": "/vllm/v1/worker/gpu/attn_utils.py", + "sha256": "b9b81e59dda2720b1f9c434471381f879228832443e52756e469b4ad4905888f" + }, + "vllm/v1/worker/gpu/block_table.py": { + "path": "/vllm/v1/worker/gpu/block_table.py", + "sha256": "61c004315d5af7e7eae4e2a9e6be92ea82c520327690a7f55a73bb9ce95f520a" + }, + "vllm/v1/worker/gpu/buffer_utils.py": { + "path": "/vllm/v1/worker/gpu/buffer_utils.py", + "sha256": "6597f701a30261bf250e9ad5a29737264624a1caa20527aeea0dad630325b093" + }, + "vllm/v1/worker/gpu/cp_utils.py": { + "path": "/vllm/v1/worker/gpu/cp_utils.py", + "sha256": "456c1bb7e262d99ff555522a4f134e5a9b42aee23290be25455eaef36ee8eaaf" + }, + "vllm/v1/worker/gpu/cudagraph_utils.py": { + "path": "/vllm/v1/worker/gpu/cudagraph_utils.py", + "sha256": "6e9c042890603535e300a40df8ee159dbed1058a64a83ae50ff0329e332e05ff" + }, + "vllm/v1/worker/gpu/dp_utils.py": { + "path": "/vllm/v1/worker/gpu/dp_utils.py", + "sha256": "e26867bc89e6bfc933cabc5ed13e5dc7b8d2d3030118ca1ca64c8785dabc0fc1" + }, + "vllm/v1/worker/gpu/ec_connector.py": { + "path": "/vllm/v1/worker/gpu/ec_connector.py", + "sha256": "2afe6e641f4ae3eb3b8da336c74eaa7479bf617b27cfb39a1fcbe487686f0a08" + }, + "vllm/v1/worker/gpu/eplb_utils.py": { + "path": "/vllm/v1/worker/gpu/eplb_utils.py", + "sha256": "1829fac11464aed4649179b302df198de51b95d0589f4e56bea305a876a63e26" + }, + "vllm/v1/worker/gpu/input_batch.py": { + "path": "/vllm/v1/worker/gpu/input_batch.py", + "sha256": "d5dd956eb319bd69dd9e762047833d81ad40b21fce619fcb2133759e73620694" + }, + "vllm/v1/worker/gpu/kv_connector.py": { + "path": "/vllm/v1/worker/gpu/kv_connector.py", + "sha256": "b89a4333f1e552d86e1815674b59e9f1335f0f49c0a7b46082439076f62c6a81" + }, + "vllm/v1/worker/gpu/lora_utils.py": { + "path": "/vllm/v1/worker/gpu/lora_utils.py", + "sha256": "1e90eddd9ddb4ca55e574bb28e87ae3a6f6750175a62d373102426543f4ccd66" + }, + "vllm/v1/worker/gpu/metrics/__init__.py": { + "path": "/vllm/v1/worker/gpu/metrics/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/metrics/logits.py": { + "path": "/vllm/v1/worker/gpu/metrics/logits.py", + "sha256": "ea058d7510a077a55f8ac7e4c3d596508346244e908cb372865d7159f62edc89" + }, + "vllm/v1/worker/gpu/mm/__init__.py": { + "path": "/vllm/v1/worker/gpu/mm/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/mm/encoder_cache.py": { + "path": "/vllm/v1/worker/gpu/mm/encoder_cache.py", + "sha256": "89c500338fddbeee7c4fca978a3a7c4c566a03e848e399d303fbee3c80631cd2" + }, + "vllm/v1/worker/gpu/mm/encoder_runner.py": { + "path": "/vllm/v1/worker/gpu/mm/encoder_runner.py", + "sha256": "0981e352d70301b7154a217a48665ffe35f215d053ec5740c2515a3e1e11b4e6" + }, + "vllm/v1/worker/gpu/mm/lora.py": { + "path": "/vllm/v1/worker/gpu/mm/lora.py", + "sha256": "a3eddfad6ad64de276964240c28dc080888df4a56dd5eac18f89428f2cbb7a01" + }, + "vllm/v1/worker/gpu/mm/rope.py": { + "path": "/vllm/v1/worker/gpu/mm/rope.py", + "sha256": "0924375bcb367267e783b57dd2ad9de1189d97025ce4313baaa54f2911eaaf1e" + }, + "vllm/v1/worker/gpu/model_runner.py": { + "path": "/vllm/v1/worker/gpu/model_runner.py", + "sha256": "174c93db921c23cf0396eee4764be25b2bd2d4b6a06e9fa41ce3598b884ce8ce" + }, + "vllm/v1/worker/gpu/model_states/__init__.py": { + "path": "/vllm/v1/worker/gpu/model_states/__init__.py", + "sha256": "07815d0b788fc88185772f581bbf892a675259f9288375571f29887622f8d93c" + }, + "vllm/v1/worker/gpu/model_states/default.py": { + "path": "/vllm/v1/worker/gpu/model_states/default.py", + "sha256": "bb614f814780f052e869f9acf31dfbfa68718ee7dc6252eefa901b5730ee8a2a" + }, + "vllm/v1/worker/gpu/model_states/encoder_decoder.py": { + "path": "/vllm/v1/worker/gpu/model_states/encoder_decoder.py", + "sha256": "a5868059d8af672548b41d0e623e884320e6ed61e6aaca2d2828ff5be0356f2f" + }, + "vllm/v1/worker/gpu/model_states/encoder_only.py": { + "path": "/vllm/v1/worker/gpu/model_states/encoder_only.py", + "sha256": "84e96b55a2639e2a73fa4a0308acc89c8d053dc715481180b237e0196dcef99f" + }, + "vllm/v1/worker/gpu/model_states/interface.py": { + "path": "/vllm/v1/worker/gpu/model_states/interface.py", + "sha256": "5675b6fedc7403a9ab410b1e5565974e78fac23c42ab4253ae1da52d6e09b594" + }, + "vllm/v1/worker/gpu/model_states/mamba_hybrid.py": { + "path": "/vllm/v1/worker/gpu/model_states/mamba_hybrid.py", + "sha256": "573e130ac5587d4822fabf97adad1ad0fda02ff83c5e70df879a5bb175ae845c" + }, + "vllm/v1/worker/gpu/model_states/mm_pruning.py": { + "path": "/vllm/v1/worker/gpu/model_states/mm_pruning.py", + "sha256": "b150940b12ae76048f050a8eeb54d532bbdc530a18ffbf320ddeeb0cfaa90f93" + }, + "vllm/v1/worker/gpu/model_states/prompt_embeds.py": { + "path": "/vllm/v1/worker/gpu/model_states/prompt_embeds.py", + "sha256": "11f9e270925c2df6a505557605ac2b859bb145cf3420b0111e7482a1c544f9b1" + }, + "vllm/v1/worker/gpu/model_states/recoverssm.py": { + "path": "/vllm/v1/worker/gpu/model_states/recoverssm.py", + "sha256": "b4b660e62eaf33f4fe8271f83ed1fb6de6bc08f800a8073b27803e42fb29a645" + }, + "vllm/v1/worker/gpu/pcp_manager.py": { + "path": "/vllm/v1/worker/gpu/pcp_manager.py", + "sha256": "2d80df0ed5b18a2069f9d0689cb59923ffe324ba200fcafe242da23da3a6ddaa" + }, + "vllm/v1/worker/gpu/pool/__init__.py": { + "path": "/vllm/v1/worker/gpu/pool/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/pool/pooling_runner.py": { + "path": "/vllm/v1/worker/gpu/pool/pooling_runner.py", + "sha256": "f8463f7648cce0f3f29418a4d9fee61634ead760957cf236d06d61cf8cd986e7" + }, + "vllm/v1/worker/gpu/pp_utils.py": { + "path": "/vllm/v1/worker/gpu/pp_utils.py", + "sha256": "dadeef0bebf61d0ad44a28d06372208ec4e6389224d6017f412683b026bdbb5c" + }, + "vllm/v1/worker/gpu/sample/__init__.py": { + "path": "/vllm/v1/worker/gpu/sample/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/sample/bad_words.py": { + "path": "/vllm/v1/worker/gpu/sample/bad_words.py", + "sha256": "8d3cbd5613398260314d94739d8ee0e1ac0c22abf2f960f541d3c0d4e39d360b" + }, + "vllm/v1/worker/gpu/sample/batch_shard.py": { + "path": "/vllm/v1/worker/gpu/sample/batch_shard.py", + "sha256": "c30274a3a04e6a03e89be9cd7c62de602b1aba4d412f64540ab6201036de3928" + }, + "vllm/v1/worker/gpu/sample/gumbel.py": { + "path": "/vllm/v1/worker/gpu/sample/gumbel.py", + "sha256": "3ec1df510bdad13e8b0a457b5b67c98affdf6e57369e56cb471246cc8f40dd34" + }, + "vllm/v1/worker/gpu/sample/logit_bias.py": { + "path": "/vllm/v1/worker/gpu/sample/logit_bias.py", + "sha256": "9e80a3fe6f3c7474723408cfff52183f4585fdeedd9c2312843ee98d0b12724c" + }, + "vllm/v1/worker/gpu/sample/logprob.py": { + "path": "/vllm/v1/worker/gpu/sample/logprob.py", + "sha256": "f47479a818192acb6b297c79fa67a3b2f9820e3492a394d5adda777e9b7c832e" + }, + "vllm/v1/worker/gpu/sample/min_p.py": { + "path": "/vllm/v1/worker/gpu/sample/min_p.py", + "sha256": "4cb5e2f45e1ced6f9685283a7a5c8cfd7204d9a249822e866cfff756c7f04f62" + }, + "vllm/v1/worker/gpu/sample/output.py": { + "path": "/vllm/v1/worker/gpu/sample/output.py", + "sha256": "d6e298c0f197d487a8faaf7200f500fa83df1d7a4bbf4339cadd6a18008f7f9c" + }, + "vllm/v1/worker/gpu/sample/penalties.py": { + "path": "/vllm/v1/worker/gpu/sample/penalties.py", + "sha256": "46c29434caf5f415129ef4a9bb2b8d4f62d2765596e3e07f73ad2b198c7def1b" + }, + "vllm/v1/worker/gpu/sample/prompt_logprob.py": { + "path": "/vllm/v1/worker/gpu/sample/prompt_logprob.py", + "sha256": "4cf22d390e7bf59e44c458cff7180268db63e95d06af2f1e14d720a2d77c9663" + }, + "vllm/v1/worker/gpu/sample/sampler.py": { + "path": "/vllm/v1/worker/gpu/sample/sampler.py", + "sha256": "832c9945d201a1e730ff9b4b52076aa83bd4a5064e1e4cfea952cf84d4a8d1f0" + }, + "vllm/v1/worker/gpu/sample/states.py": { + "path": "/vllm/v1/worker/gpu/sample/states.py", + "sha256": "4e3671f93695ba5a48fad7d2d13beb231ac8741034904ed5a15d9f7b9b86662e" + }, + "vllm/v1/worker/gpu/sample/thinking_budget.py": { + "path": "/vllm/v1/worker/gpu/sample/thinking_budget.py", + "sha256": "020513e1d3406f367de6ad995a95055008fd0c28f2873647e8283c9870e22404" + }, + "vllm/v1/worker/gpu/sample/trace_replay.py": { + "path": "/vllm/v1/worker/gpu/sample/trace_replay.py", + "sha256": "d2a7d3b3b55379efabe4740a4b7f14030126dc11be36f6ea974164ce42316a50" + }, + "vllm/v1/worker/gpu/sample/watermark.py": { + "path": "/vllm/v1/worker/gpu/sample/watermark.py", + "sha256": "a3581458169dab9153eb09fd67218e0ee5585406537a9de80ad528ae62b030c0" + }, + "vllm/v1/worker/gpu/shutdown.py": { + "path": "/vllm/v1/worker/gpu/shutdown.py", + "sha256": "bb470f14b17c7e52571ef8938b2a9527e7c2846852ae8a3a94b69cd1c30aa4b1" + }, + "vllm/v1/worker/gpu/spec_decode/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/__init__.py", + "sha256": "1f1f84bfe6f4f5af3a7e21a7a8716ecf7b9013da1d03327668a3ee36afc24c32" + }, + "vllm/v1/worker/gpu/spec_decode/acceptance_estimator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/acceptance_estimator.py", + "sha256": "505b843bdd75928b03793b395b47b8be914bd7fe2a3351c8ec04339baeebb1c2" + }, + "vllm/v1/worker/gpu/spec_decode/adaptive_verification.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/adaptive_verification.py", + "sha256": "276b2fec56758a94c71b717f6786b8a6f126db2e20cf964350202feee61a0a39" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/cudagraph_utils.py", + "sha256": "13392ef0a9ed59eb9c2b2bad43d7c61beb212a8805849e46b5130c230275d0a5" + }, + "vllm/v1/worker/gpu/spec_decode/autoregressive/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/autoregressive/speculator.py", + "sha256": "5b97f54e20ddf65b98e939832d050745f67ef43cfa145786da300f1a8322e3c6" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/cudagraph.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/cudagraph.py", + "sha256": "beab567ae2df6a2ba2cd92fe7ee452c6b959b8a7037a4b5f493993a1824619bb" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/speculator.py", + "sha256": "f9c100f42f9326e48eb84e89281897e859ba761943f54d593523555ccd98dc63" + }, + "vllm/v1/worker/gpu/spec_decode/dflash/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash/utils.py", + "sha256": "53d2c3ad474d290d2c6df027446bbd80ac7447684e5242ab2c3c5337d2abd383" + }, + "vllm/v1/worker/gpu/spec_decode/dflash2/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash2/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/dflash2/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dflash2/speculator.py", + "sha256": "b70043550938a1df9aecc85d8c8224c38c929ca34f68834572f6e723854d2027" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/speculator.py", + "sha256": "dcf4abdedbd2bddd0d76be198ccf5b4e467c46f645038c35fcab821491a35b03" + }, + "vllm/v1/worker/gpu/spec_decode/dspark/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/dspark/utils.py", + "sha256": "86af2bf30604a184312e8f076097b91ecfec704f409f9d68d634b03d6b318070" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/eagle3_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/eagle3_utils.py", + "sha256": "201ee875fcc3d076a8fc1f3876dcbf85736b221a368555243a8987ff26a1674e" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/speculator.py", + "sha256": "746e318a4f266d75522ff7f3731ea9b4527b7b4824f71364d1a62184ea1f7b3d" + }, + "vllm/v1/worker/gpu/spec_decode/eagle/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/eagle/utils.py", + "sha256": "94de6f55a1761f24f4aa1388cbc3b3763d4ab3ee53260330056ad31ce0b78236" + }, + "vllm/v1/worker/gpu/spec_decode/extract_hidden_states.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/extract_hidden_states.py", + "sha256": "93c4233be7b2d2290b33902ea9b3bb5274c11701830851d03967a22144536e2d" + }, + "vllm/v1/worker/gpu/spec_decode/gemma4/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/gemma4/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/gemma4/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/gemma4/speculator.py", + "sha256": "9991210d7babd2caf2cd10797ca8688543dedeafbc3b86bc7c979c1a6ae9f949" + }, + "vllm/v1/worker/gpu/spec_decode/mtp/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/mtp/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/mtp/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/mtp/speculator.py", + "sha256": "926d6c9ffdb368c971647911a60493820d056ce236fcae9d94a42fa2e006255d" + }, + "vllm/v1/worker/gpu/spec_decode/multi_module_mtp/__init__.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/multi_module_mtp/__init__.py", + "sha256": "e3c55cbb0d7a8bd47df6f3378835644645f5d3bc89b45793b5d5a02d013e5c58" + }, + "vllm/v1/worker/gpu/spec_decode/multi_module_mtp/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/multi_module_mtp/speculator.py", + "sha256": "d9d4735b9b33829332b0e845b6d3073b2f0436045ed693b25c6434f351644127" + }, + "vllm/v1/worker/gpu/spec_decode/rejection_sampler.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/rejection_sampler.py", + "sha256": "030db5bfca162cc1f305112f299de5d6d61c59d3ed0807fee46575441ca4086d" + }, + "vllm/v1/worker/gpu/spec_decode/rejection_sampler_utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/rejection_sampler_utils.py", + "sha256": "214b61fa0abe88573beb779872c035b3954e5651a85bd438d99ee5905d3a62ec" + }, + "vllm/v1/worker/gpu/spec_decode/speculator.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/speculator.py", + "sha256": "3a1ab15bf8b20918852eb835fe9755046e99dcbac6ba6ca3d414949fc8bc695a" + }, + "vllm/v1/worker/gpu/spec_decode/utils.py": { + "path": "/vllm/v1/worker/gpu/spec_decode/utils.py", + "sha256": "282f2929eddae9ca7312269f799be07472334b6df9fd91878b5e839ec05e418c" + }, + "vllm/v1/worker/gpu/states.py": { + "path": "/vllm/v1/worker/gpu/states.py", + "sha256": "99418f5df43ca612ded72609fee011620b065b2cab2f249ccb387096bf4ae71a" + }, + "vllm/v1/worker/gpu/structured_outputs.py": { + "path": "/vllm/v1/worker/gpu/structured_outputs.py", + "sha256": "18a10532db7e66b55e334acacd1fd989ad6361adf31dd0de9a9a65e23db25951" + }, + "vllm/v1/worker/gpu/ubatch_utils.py": { + "path": "/vllm/v1/worker/gpu/ubatch_utils.py", + "sha256": "5092e2e58af0561c8dc12e62847cfc6dda9ca20dfbd33e7f0cd77a83fe87f7c5" + }, + "vllm/v1/worker/gpu/warmup.py": { + "path": "/vllm/v1/worker/gpu/warmup.py", + "sha256": "423ac32d58fe008c228cfa223e4fcebfcf87e3463a9dbdf80a083c0578d73723" + }, + "vllm/v1/worker/gpu_input_batch.py": { + "path": "/vllm/v1/worker/gpu_input_batch.py", + "sha256": "18cf455c9d0eea61cc581c7932f2e6cd09786914e82dd35eef1c1430da359a0f" + }, + "vllm/v1/worker/gpu_model_runner.py": { + "path": "/vllm/v1/worker/gpu_model_runner.py", + "sha256": "87c29d08c0bbf66993d8b984811e7325e35e6436242a773feb55ec88f16b2c51" + }, + "vllm/v1/worker/gpu_ubatch_wrapper.py": { + "path": "/vllm/v1/worker/gpu_ubatch_wrapper.py", + "sha256": "4233cfbe8c9884b042c4363890108f616483b694ebe9a6e69578dcf89c6dac5c" + }, + "vllm/v1/worker/gpu_worker.py": { + "path": "/vllm/v1/worker/gpu_worker.py", + "sha256": "6994436e4547c0996ab555b3e814e8ccea26b650dfc1b378b97d640745309347" + }, + "vllm/v1/worker/kv_connector_model_runner_mixin.py": { + "path": "/vllm/v1/worker/kv_connector_model_runner_mixin.py", + "sha256": "e1cc76d065a7e60aacddb190ae795a480b65cd02ba71a1fc699a02a85c1a3de2" + }, + "vllm/v1/worker/lora_model_runner_mixin.py": { + "path": "/vllm/v1/worker/lora_model_runner_mixin.py", + "sha256": "fef6092a15d8d37f6fa22495e6106e2e5280180908d61ce43d9ff5bf4eef3f2f" + }, + "vllm/v1/worker/mamba_utils.py": { + "path": "/vllm/v1/worker/mamba_utils.py", + "sha256": "23fdaa4e8f63ee8f938eaa1a2b39f803cb04fa6ecd69789563254b1a0691413a" + }, + "vllm/v1/worker/mm_encoder_model_runner.py": { + "path": "/vllm/v1/worker/mm_encoder_model_runner.py", + "sha256": "780c41be84ad022205c21c1decb6bb8d5afb03bc7be120c1f7df03b710acc3d7" + }, + "vllm/v1/worker/sentinel/__init__.py": { + "path": "/vllm/v1/worker/sentinel/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "vllm/v1/worker/sentinel/gpu_worker_sentinel.py": { + "path": "/vllm/v1/worker/sentinel/gpu_worker_sentinel.py", + "sha256": "3959b8619d052c5dd247815074e03ec21ec9b43cc424ff2d296abc19b227b852" + }, + "vllm/v1/worker/startup_plan.py": { + "path": "/vllm/v1/worker/startup_plan.py", + "sha256": "84bcbb4f7a9fd7c8d10c9c895aadd9673d44c767b9132368d11eb5e017afe86b" + }, + "vllm/v1/worker/ubatch_utils.py": { + "path": "/vllm/v1/worker/ubatch_utils.py", + "sha256": "b34dce551b5195c414e6a3a997c75961cc7a17f24c7c980487fe3d3e2ba7a798" + }, + "vllm/v1/worker/ubatching.py": { + "path": "/vllm/v1/worker/ubatching.py", + "sha256": "40391241c564feb5f16c77898ae6ae152ed6e71a4682e2a406387785d8de02d7" + }, + "vllm/v1/worker/utils.py": { + "path": "/vllm/v1/worker/utils.py", + "sha256": "0ca3ec6bf4d20076145b7fe64e564962adebedc8f75a856b517ba0b2f2d77acf" + }, + "vllm/v1/worker/worker_base.py": { + "path": "/vllm/v1/worker/worker_base.py", + "sha256": "4a1a5266b912fe97991d8dc89d92b923990da9f6cb4b817d00d52e9c0d26dd7c" + }, + "vllm/v1/worker/workspace.py": { + "path": "/vllm/v1/worker/workspace.py", + "sha256": "d21c08167d1d0d1c0cddaa80453a53a0b4dec5d81b5a537c94a21324344976b3" + }, + "vllm/v1/worker/xpu_model_runner.py": { + "path": "/vllm/v1/worker/xpu_model_runner.py", + "sha256": "07fa0390d28f2b8c3c3c0019eb9c3b126e2397aea268ba47c889f06b423deb23" + }, + "vllm/v1/worker/xpu_worker.py": { + "path": "/vllm/v1/worker/xpu_worker.py", + "sha256": "711b56432506b58041cd86e71320c3960413f7bd61061990b66488421d81cfc3" + } + }, + "prefix": "", + "pth": { + "/__editable__.megatron_core-0.16.0rc0.pth": "d55c9b64480b34aae3d4d31e7706b93391c969dec6e0498e50963b03445a57b0", + "/__editable__.rl_kernel-0.1.0.pth": "1454c4987b35762a0d189d4e901c5d077fde62a1944fbaabecea230e57f3923a", + "/__editable__.vime-0.3.2.pth": "77eec5d06d628cb952e65edd813ca88d8db67ccc785083e1b7b29011b92bec4f", + "/distutils-precedence.pth": "2638ce9e2500e572a5e0de7faed6661eb569d1b696fcba07b0dd223da5f5d224", + "/qwen3_next_cuda_runtime.pth": "e0d3ab57dd3ff4f5d55fcf76e83c549cc00b3c813e6f717c540d5ded79fa2f49", + "/qwen3_next_megatron_source.pth": "8556ac057538e82856cb76cbbc954f58312a3f45373daec3eec826031cfd2709", + "/__editable__.rl_kernel-0.1.0.pth": "1454c4987b35762a0d189d4e901c5d077fde62a1944fbaabecea230e57f3923a", + "/distutils-precedence.pth": "2638ce9e2500e572a5e0de7faed6661eb569d1b696fcba07b0dd223da5f5d224", + "/nvidia_cutlass_dsl_packages.pth": "cc710b99ddb3d76361a70461461d274212a979d00c381d821fce5bb3ad9cf246" + }, + "pyvenv_cfg_sha256": "48579f2c6d35c3d535c2690d7d426587c4b8e92021463f0266b38d35dfbbb834", + "sources": { + "/Megatron-LM-training": { + "patch_sha256": "f66035f12501aa1d08e8884e0dea5a22d59825d717aeda73c3e83876e3efd79f", + "path": "/Megatron-LM-training", + "tree": "731fc44a368d6cac8c6171a29d5c687ff0d95bd1" + }, + "/vime": { + "patch_sha256": "66949839d4c18329444f4f9f6dcd702b53ce1b94e9aa15ed111f28743bfaa4b9", + "path": "/vime", + "tree": "f5174e67dbcdaef983eecd45f215fef2d8429dd0" + } + }, + "version": "3.12.14 | packaged by Anaconda, Inc. | (main, Aug 27 2026, 14:46:43) [GCC 14.3.0]" + }, + "sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca" + }, + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "cuda_identity": { + "home": "", + "nvcc_sha256": "b8e2347d9d7fcadf8812a27324d515de99d033d3e48611811ece7e66d7895f8a" + }, + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "operator_requirements": { + "suite": "all", + "case_ids": [ + "tests/check_qwen3_next_attention.py::test_d256_backward_with_cached_prefix_matches_float64_formula", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[1024]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[256]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[64]", + "tests/check_qwen3_next_attention.py::test_d256_full_chunk_decode_and_batch_are_raw_bit_equal[8]", + "tests/check_qwen3_next_attention.py::test_d256_input_device_guard_and_nondefault_stream", + "tests/check_qwen3_next_attention.py::test_native_backward_rejects_malformed_probability_and_gradient_buffers", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_causal_conv1d_update_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[0]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[1]", + "tests/check_qwen3_next_batch_invariance.py::test_chunk_metadata_partition_is_batch_invariant[2]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype0]", + "tests/check_qwen3_next_batch_invariance.py::test_packed_recurrent_decode_is_batch_invariant[state_dtype1]", + "tests/check_qwen3_next_batch_invariance.py::test_target_inputs_do_not_depend_on_companions", + "tests/check_qwen3_next_batch_invariance.py::test_triton_chunked_prefill_is_batch_invariant", + "tests/check_qwen3_next_conv_bridge.py::test_chunked_and_reordered_sequences_match", + "tests/check_qwen3_next_conv_bridge.py::test_empty_sequence_preserves_cache_and_gradients", + "tests/check_qwen3_next_conv_bridge.py::test_response_gradient_reaches_prompt_and_convolution_weight", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths0]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths1]", + "tests/check_qwen3_next_conv_bridge.py::test_varlen_matches_repeated_decode_and_preserves_inputs[lengths2]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[1024-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[256-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[64-4]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-1]", + "tests/check_qwen3_next_core_matrix.py::test_full_chunked_reordered_shared_core[8-4]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[1]", + "tests/check_qwen3_next_core_matrix.py::test_shared_core_one_hundred_repetitions[4]", + "tests/check_qwen3_next_core_matrix.py::test_variable_lengths_empty_and_mixed_step_match_independent_sequences", + "tests/check_qwen3_next_forward.py::test_combine_has_fixed_route_order_and_differentiable_weights", + "tests/check_qwen3_next_forward.py::test_full_vocabulary_logprob_entropy_modes_and_gradient", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[1-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[13-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[300-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-128]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_are_bitwise_the_per_expert_gemms[7-512]", + "tests/check_qwen3_next_forward.py::test_grouped_experts_fail_closed_on_the_tensor_descriptor_path", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[128]", + "tests/check_qwen3_next_forward.py::test_grouped_projection_is_bitwise_the_per_expert_gemm[512]", + "tests/check_qwen3_next_forward.py::test_logprob_nan_rejected_before_comparison", + "tests/check_qwen3_next_forward.py::test_moe_vjp_matches_independent_double_formula", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[1024-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[128-2048]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-16]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-256]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-3072]", + "tests/check_qwen3_next_forward.py::test_qwen_linear_shapes_batch_chunk_and_reorder[2048-37984]", + "tests/check_qwen3_next_forward.py::test_qwen_moe_actual_tp4_shapes_and_independent_training_forward", + "tests/check_qwen3_next_forward.py::test_route_weights_are_batch_invariant", + "tests/check_qwen3_next_forward.py::test_shared_linear_vjp_and_empty_tokens", + "tests/check_qwen3_next_forward.py::test_stable_route_tie_boundary_and_router_gradient", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_backward_matches_recomputed_recurrence_vjp", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_forward_is_provider_exact_and_does_not_mutate_inputs", + "tests/check_qwen3_next_gdn_bridge.py::test_bridge_keeps_prompt_state_gradient_through_response", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[False]", + "tests/check_qwen3_next_gdn_bridge.py::test_inactive_state_is_identity_in_backward[True]", + "tests/check_qwen3_next_gdn_bridge.py::test_initial_state_vjp_matches_provider_directional_difference", + "tests/check_qwen3_next_gdn_sequence.py::test_1024_token_chunk_continuation_is_bitwise_exact", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad0]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad1]", + "tests/check_qwen3_next_gdn_sequence.py::test_bad_packing_is_rejected[bad2]", + "tests/check_qwen3_next_gdn_sequence.py::test_chunk_boundary_retains_prompt_and_initial_state_gradients", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths0]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths1]", + "tests/check_qwen3_next_gdn_sequence.py::test_packed_matches_independent_sequences_and_reordering[lengths2]", + "tests/check_qwen3_next_gdn_sequence.py::test_reserved_and_duplicate_slots_are_rejected", + "tests/check_qwen3_next_norm_providers.py::test_custom_op_has_distinct_native_and_cuda_paths", + "tests/check_qwen3_next_norm_providers.py::test_gdn_decode_provider_env_defaults_are_recorded", + "tests/check_qwen3_next_norm_providers.py::test_our_gated_op_is_batch_invariant", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_cuda]", + "tests/check_qwen3_next_norm_providers.py::test_vllm_gated_norm_is_batch_invariant[forward_native]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[1024-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[65-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_full_chunk_reorder_and_cache_bits[8-4]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots0]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots1]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots2]", + "tests/check_qwen3_next_paged_attention.py::test_paged_attention_invalid_indices_do_not_mutate_cache[bad_slots3]", + "tests/check_qwen3_next_shared_core.py::test_independent_training_forward_matches_inference_and_retains_gradients", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[1024]", + "tests/check_qwen3_next_shared_core.py::test_shared_core_chunk_and_decode_state_match[8]", + "tests/check_qwen3_next_shared_core.py::test_unimplemented_provider_profile_is_rejected", + "tests/test_qwen3_next_norm.py::test_bad_weight_shape_raises", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[16]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[1]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[2]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[32]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[48]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[64]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_across_concurrency[8]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[128]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_slice[2048]", + "tests/test_qwen3_next_norm.py::test_batch_invariance_with_padding", + "tests/test_qwen3_next_norm.py::test_call_matches_forward", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[128]", + "tests/test_qwen3_next_norm.py::test_chunked_reduction_is_slice_invariant_on_device[2048]", + "tests/test_qwen3_next_norm.py::test_cuda_default_offset_preserves_plain_convention", + "tests/test_qwen3_next_norm.py::test_cuda_gated_backward_matches_autograd_golden", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dgate_keeps_signed_zero_weight[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[512]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[64]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_dweight_is_batch_invariant[8]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_matches_golden_within_contract", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[sigmoid-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_parameter_vjp_contributions_match_the_fold[silu-dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_bad_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rejects_mismatched_gate", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[bf16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp16-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-128-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-2048-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-sigmoid-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_rstd_is_bitwise_identical_to_plain_kernel[fp32-5120-silu-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_activation", + "tests/test_qwen3_next_norm.py::test_cuda_gated_sigmoid_backward_uses_the_sigmoid_derivative", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_signed_zero_weight_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_gated_swish_is_an_alias_for_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_unit_weight_is_plain_norm_times_silu", + "tests/test_qwen3_next_norm.py::test_cuda_gated_weight_offset_is_applied_in_fp32", + "tests/test_qwen3_next_norm.py::test_cuda_gated_wrapper_rejects_equal_numel_wrong_shape", + "tests/test_qwen3_next_norm.py::test_cuda_gated_zero_gate_zeroes_output", + "tests/test_qwen3_next_norm.py::test_cuda_offset_equals_explicit_fp32_weight", + "tests/test_qwen3_next_norm.py::test_cuda_offset_is_not_folded_through_bfloat16", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype0-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape0-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-0.0]", + "tests/test_qwen3_next_norm.py::test_cuda_parameter_contributions_reproduce_backward[dtype1-shape1-1.0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype0]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype1]", + "tests/test_qwen3_next_norm.py::test_cuda_plain_signed_zero_is_preserved[dtype2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_backward_is_offset_aware", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[16]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[1]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[2]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[32]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[48]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[512]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[64]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_batch_invariance[8]", + "tests/test_qwen3_next_norm.py::test_cuda_zero_centred_within_tolerance_of_golden", + "tests/test_qwen3_next_norm.py::test_deterministic_repeat", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype0]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype1]", + "tests/test_qwen3_next_norm.py::test_dtype_paths[dtype2]", + "tests/test_qwen3_next_norm.py::test_eps_inside_sqrt", + "tests/test_qwen3_next_norm.py::test_gated_batch_invariance_slice", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedHFOp]", + "tests/test_qwen3_next_norm.py::test_gated_call_matches_forward[Qwen3NextRMSNormGatedOp]", + "tests/test_qwen3_next_norm.py::test_gated_conventions_diverge_in_low_precision", + "tests/test_qwen3_next_norm.py::test_gated_cuda_op_rejects_bad_activation_at_construction", + "tests/test_qwen3_next_norm.py::test_gated_extension_handles_empty_batch_and_nondefault_stream", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[dy_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[gate_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[rstd_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_dtype]", + "tests/test_qwen3_next_norm.py::test_gated_extension_rejects_invalid_tensor_contract[weight_shape]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_hf_witness_matches_hf_formula_fp32", + "tests/test_qwen3_next_norm.py::test_gated_shape_mismatch_raises", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_gated_strict_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_gated_strict_matches_vllm_formula_fp32", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[128]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_fp32[2048]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype0]", + "tests/test_qwen3_next_norm.py::test_matches_upstream_formula_low_precision[dtype1]", + "tests/test_qwen3_next_norm.py::test_offset_applied_in_fp32_not_folded_into_bf16", + "tests/test_qwen3_next_norm.py::test_op_batch_invariance_on_device", + "tests/test_qwen3_next_norm.py::test_plain_reference_is_unchanged_by_the_offset_plumbing", + "tests/test_qwen3_next_norm.py::test_weight_offset_is_one", + "tests/test_qwen3_next_norm.py::test_zero_centred_cuda_constructor_rejects_missing_extension", + "tests/test_qwen3_next_norm.py::test_zero_centred_op_inherits_the_plain_reference", + "tests/test_qwen3_next_norm.py::test_zero_weight_is_identity_scaling" + ], + "case_ids_sha256": "694c931b65f9cfa5db963f2eca6d11bd309546c824a1df52f9da2ab128e83e0f", + "norm_gates": [ + "qwen3_next_rms_norm-forward.json", + "qwen3_next_rms_norm-gradient.json", + "rms_norm_gated-forward.json", + "rms_norm_gated-gradient.json" + ] + }, + "layer_requirements": { + "schema_version": 1, + "gates": { + "gdn": { + "script": "scripts/qwen3_next_tp_gdn_check.py", + "output_option": "--output", + "scope": "tp4_gdn_layer0", + "groups": { + "cases": [ + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "prompt-gradient", + "replicated-norm-gradient", + "hf-load-export" + ] + }, + "script_sha256": "cc4338893f90af004c51c20fc67d1a9a3f4bf8d26775277f72671c02983e4df5" + }, + "attention": { + "script": "scripts/qwen3_next_tp_attention_check.py", + "output_option": "--output", + "scope": "tp4_full_attention_layer3", + "groups": { + "attention.cases": [ + "hf-load-export", + "full-chunk-8", + "full-chunk-64", + "full-chunk-256", + "full-chunk-1024", + "batch4-varlen-reorder", + "sixteen-token-decode", + "prompt-gradient", + "kv-pair-gradient", + "qk-norm-gradient" + ] + }, + "script_sha256": "d27d43efb05415a8ef5892c3c2238a2b9744a4821f5466faf46c6510e6e01bec" + }, + "moe": { + "script": "scripts/qwen3_next_tp_moe_check.py", + "output_option": "--output", + "scope": "tp4_moe_block_layer0", + "groups": { + "moe.cases": [ + "hf-load-export-all512experts", + "routes-replicated-8", + "full-chunk-reorder-8", + "routes-replicated-64", + "full-chunk-reorder-64", + "routes-replicated-256", + "full-chunk-reorder-256", + "routes-replicated-1024", + "full-chunk-reorder-1024", + "training-forward", + "all-parameter-gradient", + "replicated-router-gradient" + ] + }, + "script_sha256": "d5c1bbbb82e408b65871b0cb1638d7a6cf8cfe07f0a3315a657b7dc232d544be" + }, + "adapters": { + "script": "scripts/qwen3_next_adapter_check.py", + "output_option": "--out", + "scope": "gdn_engine_adapter_component", + "groups": { + "cases": [ + "batch1-length8", + "batch1-length64", + "batch1-length256", + "batch1-length1024", + "batch4-length8", + "batch4-length64", + "batch4-length256", + "batch4-length1024", + "mixed-prefill-decode16-reorder" + ] + }, + "fields": { + "prompt_gradient": "passed", + "hf_conv_roundtrip": "passed", + "batch_invariance_capability_registered": false + }, + "script_sha256": "3ce45bb317237c1a06533116d65fb77c2a23b6f503ae46406ede543036eb0f20" + }, + "heads": { + "script": "scripts/qwen3_next_tp_head_check.py", + "output_option": "--output", + "scope": "tp4_embedding_lm_head_only", + "groups": { + "cases": [ + "hf-embedding-roundtrip", + "hf-lm-head-roundtrip", + "replicated-norm-gradient", + "nonzero-finite-embedding-head-gradient", + "embedding-repeat-100", + "batch-invariant-prompt8", + "batch-invariant-prompt64", + "batch-invariant-prompt256", + "batch-invariant-prompt1024", + "logprob-original-and-promoted-logits", + "entropy-interface" + ] + }, + "script_sha256": "0504185d21a75405c8e994bc57b016cf4ec357d8b16e7430772c11934f2af876" + } + }, + "scheduler_case_ids": [ + "p0008-b1-full", + "p0008-b1-chunked", + "p0008-b4-full", + "p0008-b4-chunked", + "p0064-b1-full", + "p0064-b1-chunked", + "p0064-b4-full", + "p0064-b4-chunked", + "p0256-b1-full", + "p0256-b1-chunked", + "p0256-b4-full", + "p0256-b4-chunked", + "p1024-b1-full", + "p1024-b1-chunked", + "p1024-b4-full", + "p1024-b4-chunked" + ], + "registry_sha256": "e3949a750cb27c1897a000f3b023f912629906612ae8949c1575d0acc36df5ec", + "case_ids_per_rank": [ + "adapters/cases/batch1-length1024", + "adapters/cases/batch1-length256", + "adapters/cases/batch1-length64", + "adapters/cases/batch1-length8", + "adapters/cases/batch4-length1024", + "adapters/cases/batch4-length256", + "adapters/cases/batch4-length64", + "adapters/cases/batch4-length8", + "adapters/cases/mixed-prefill-decode16-reorder", + "attention/attention.cases/batch4-varlen-reorder", + "attention/attention.cases/full-chunk-1024", + "attention/attention.cases/full-chunk-256", + "attention/attention.cases/full-chunk-64", + "attention/attention.cases/full-chunk-8", + "attention/attention.cases/hf-load-export", + "attention/attention.cases/kv-pair-gradient", + "attention/attention.cases/prompt-gradient", + "attention/attention.cases/qk-norm-gradient", + "attention/attention.cases/sixteen-token-decode", + "gdn/cases/full-chunk-1024", + "gdn/cases/full-chunk-256", + "gdn/cases/full-chunk-64", + "gdn/cases/full-chunk-8", + "gdn/cases/hf-load-export", + "gdn/cases/prompt-gradient", + "gdn/cases/replicated-norm-gradient", + "heads/cases/batch-invariant-prompt1024", + "heads/cases/batch-invariant-prompt256", + "heads/cases/batch-invariant-prompt64", + "heads/cases/batch-invariant-prompt8", + "heads/cases/embedding-repeat-100", + "heads/cases/entropy-interface", + "heads/cases/hf-embedding-roundtrip", + "heads/cases/hf-lm-head-roundtrip", + "heads/cases/logprob-original-and-promoted-logits", + "heads/cases/nonzero-finite-embedding-head-gradient", + "heads/cases/replicated-norm-gradient", + "moe/moe.cases/all-parameter-gradient", + "moe/moe.cases/full-chunk-reorder-1024", + "moe/moe.cases/full-chunk-reorder-256", + "moe/moe.cases/full-chunk-reorder-64", + "moe/moe.cases/full-chunk-reorder-8", + "moe/moe.cases/hf-load-export-all512experts", + "moe/moe.cases/replicated-router-gradient", + "moe/moe.cases/routes-replicated-1024", + "moe/moe.cases/routes-replicated-256", + "moe/moe.cases/routes-replicated-64", + "moe/moe.cases/routes-replicated-8", + "moe/moe.cases/training-forward" + ], + "case_ids_sha256": "be74417dfbd6031ba27978d06d04bb15daaab2aeb57d132c7e0d41176b28b46e" + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "scheduler_profile_certificate": { + "path": "/result.json", + "sha256": "bf3a74423b3636145cad903d5cf9d70f2c3c777b019a24d125c2ca79f8b1e8d9" + } +} diff --git a/docs/usage/evidence/qwen3-next-chain-b200/train2/updates.json b/docs/usage/evidence/qwen3-next-chain-b200/train2/updates.json new file mode 100644 index 000000000..62e6678ac --- /dev/null +++ b/docs/usage/evidence/qwen3-next-chain-b200/train2/updates.json @@ -0,0 +1,1695 @@ +{ + "schema_version": 1, + "status": "passed", + "scope": "qwen3_next_training_update2", + "identity": { + "scheduler_profile_certificate": { + "path": "/result.json", + "sha256": "bf3a74423b3636145cad903d5cf9d70f2c3c777b019a24d125c2ca79f8b1e8d9" + }, + "source_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "checkpoint": "", + "weight_version": "baseline", + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "architecture_layers": 48, + "weights_dtype": "bfloat16", + "recurrent_state_dtype": "float32" + }, + "training_identity": { + "scheduler_profile_certificate": { + "path": "/result.json", + "sha256": "bf3a74423b3636145cad903d5cf9d70f2c3c777b019a24d125c2ca79f8b1e8d9" + }, + "source_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "checkpoint": "", + "weight_version": "baseline", + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "architecture_layers": 48, + "weights_dtype": "bfloat16", + "recurrent_state_dtype": "float32", + "run_id": "20261009T041838Z-train1-c67ec144-39e7db9f", + "execution_id": "39e7db9f488142f4b52872e05728c390", + "fixture_sha256": "7c98e4e17cc24bd0c5f65f6515d58a9dfc947afcdb6d4956bd3fa05f24bb28b6" + }, + "phases": [ + "update1", + "update2" + ], + "l2_fixture_sha256": "b59298acf5ecbe64abb4639e7596e052f1993ee5e3c7289b63738f1b04463d01", + "l2_reports": { + "baseline": { + "path": "/attempts/0/l2-matrix.json", + "sha256": "bf9da6060e882fb3707df9093e63a4c6e6664e8a75f25e9809020c4f687bf953" + }, + "update1": { + "path": "/attempts/0/update1-l2-b827f298d79a42768c4f371bf81b571b/l2-matrix.json", + "sha256": "ad78b78687d2ef725a24b42de908033b36383f69db41d2c754f87acb07cd9870" + }, + "update2": { + "path": "/attempts/0/update2-l2-c2abbec996294115bf05493b92df2d01/l2-matrix.json", + "sha256": "e8b9ee250133e40cf2f28134bb4b77f6ec18bb970c37a9702590284e2c570893" + } + }, + "workers": { + "update1": { + "path": "/attempts/0/update1-2c4f847affb0420d9622f1b699393898/worker.json", + "sha256": "b2c74ebcb2b5e538bbaf5e50439615722f26876df3cd34610ded097ee6102436" + }, + "update2": { + "path": "/attempts/0/update2-57420c4714024856bad2f2d1fa960e15/worker.json", + "sha256": "b30f31ad229c12f2c710a5267f9c8eea37ff9da08a2681158279633e2777cf47" + } + }, + "events": [ + "l2:baseline", + "worker:update1", + "l2:update1", + "worker:update2", + "l2:update2" + ], + "recovery": [ + { + "schema_version": 1, + "scope": "qwen3_next_retirement", + "identity": { + "scheduler_profile_certificate": { + "path": "/result.json", + "sha256": "bf3a74423b3636145cad903d5cf9d70f2c3c777b019a24d125c2ca79f8b1e8d9" + }, + "source_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "checkpoint": "", + "weight_version": "baseline", + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "architecture_layers": 48, + "weights_dtype": "bfloat16", + "recurrent_state_dtype": "float32", + "run_id": "20261009T041838Z-train1-c67ec144-39e7db9f", + "execution_id": "39e7db9f488142f4b52872e05728c390", + "fixture_sha256": "7c98e4e17cc24bd0c5f65f6515d58a9dfc947afcdb6d4956bd3fa05f24bb28b6" + }, + "target": "step-00000002-8e604f14d0b04929abfbfb8e584b39bf.partial", + "tombstone": ".step-00000002-8e604f14d0b04929abfbfb8e584b39bf.partial.deleting", + "status": "retired", + "proof": { + "schema_version": 1, + "scope": "qwen3_next_staging_intent", + "identity": { + "scheduler_profile_certificate": { + "path": "/result.json", + "sha256": "bf3a74423b3636145cad903d5cf9d70f2c3c777b019a24d125c2ca79f8b1e8d9" + }, + "source_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "checkpoint": "", + "weight_version": "baseline", + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "architecture_layers": 48, + "weights_dtype": "bfloat16", + "recurrent_state_dtype": "float32", + "run_id": "20261009T041838Z-train1-c67ec144-39e7db9f", + "execution_id": "39e7db9f488142f4b52872e05728c390", + "fixture_sha256": "7c98e4e17cc24bd0c5f65f6515d58a9dfc947afcdb6d4956bd3fa05f24bb28b6" + }, + "staging": "step-00000002-8e604f14d0b04929abfbfb8e584b39bf.partial", + "published": "step-00000002-8e604f14d0b04929abfbfb8e584b39bf", + "metadata": { + "schema_version": 1, + "scope": "native_vime_training_checkpoint", + "status": "staging", + "identity": { + "scheduler_profile_certificate": { + "path": "/result.json", + "sha256": "bf3a74423b3636145cad903d5cf9d70f2c3c777b019a24d125c2ca79f8b1e8d9" + }, + "source_commit": "c67ec14401b0847ac96441a24acfaac0b17b77ec", + "source_tree": "425a350105f757b41cbddf73cf0cae2cbcc9c892", + "environment_sha256": "118384371a883b84289a48b5322a96b6563aec0584f74cee4a38777cfe7ff7ca", + "checkpoint": "", + "weight_version": "baseline", + "checkpoint_identity": { + "revision": "9c7f2fbe84465e40164a94cc16cd30b6999b0cc7", + "metadata": { + "config.json": "2d483c7cabad7c8704478ed4038fa7e7b2eff840bc00a118eccbe38e2b488303", + "generation_config.json": "d7115cb81df546589f9937943302901a1b75b08909293d1fc96782750b1c3217", + "merges.txt": "599bab54075088774b1733fde865d5bd747cbcc7a547c5bc12610e874e26f5e3", + "model.safetensors.index.json": "0e5274f538d750abdd7fd55a36bad64100f9e881d59c65f6a59f364d2f8b6dd7", + "tokenizer.json": "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4", + "tokenizer_config.json": "a62ff0a2472a0fa1b8eaabcb57c59b58afa42a22831dc141400b6e0cf2b65ce3", + "vocab.json": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910" + }, + "shards": { + "model-00001-of-00041.safetensors": { + "size": 3999619256, + "mtime_ns": 1790791546174358834, + "ctime_ns": 1790791546942067788, + "expected_sha256": "d8908fd48650169854b5ed815cb01bfc1741152cc58795ec99188862c6a29e11" + }, + "model-00002-of-00041.safetensors": { + "size": 3999841784, + "mtime_ns": 1790791548205198213, + "ctime_ns": 1790791549067075613, + "expected_sha256": "c753c9bfaca220781d4030c3a99e69b4a256434c9d6ec223f5147edc265289df" + }, + "model-00003-of-00041.safetensors": { + "size": 3999515584, + "mtime_ns": 1790791546659320478, + "ctime_ns": 1790791547666496184, + "expected_sha256": "51aaa14dd50c5ab90c363227bfb1ac51182118f588e0141dcaadda012548407c" + }, + "model-00004-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791546792309960, + "ctime_ns": 1790791547832659564, + "expected_sha256": "82a33096134fb6e7751a423f142e79b1bbe89f45242b75397c2d7170fffa75bd" + }, + "model-00005-of-00041.safetensors": { + "size": 3999842208, + "mtime_ns": 1790791566468753725, + "ctime_ns": 1790791566771643346, + "expected_sha256": "41abda7bf93f27c36cb28382114f5b33defa6dbfd154abb6886a6fec20f9e479" + }, + "model-00006-of-00041.safetensors": { + "size": 3999853216, + "mtime_ns": 1790791567935637707, + "ctime_ns": 1790791568395175097, + "expected_sha256": "a7794475040ebd62c9a1f9c94c17e7c600873e14fcabc656b32faea09bc7fd2d" + }, + "model-00007-of-00041.safetensors": { + "size": 3999841912, + "mtime_ns": 1790791569884483570, + "ctime_ns": 1790791570566022383, + "expected_sha256": "64d7e90d00ce15cc8bbf7677ad07bf3cffc9e90a1b777e3334fa15ffea219d6b" + }, + "model-00008-of-00041.safetensors": { + "size": 3999842000, + "mtime_ns": 1790791570260453834, + "ctime_ns": 1790791571136877151, + "expected_sha256": "9ace9b99e71490d619656956d457744f727647b3f36fa3d801798a5156599d35" + }, + "model-00009-of-00041.safetensors": { + "size": 3999843192, + "mtime_ns": 1790791579856694852, + "ctime_ns": 1790791580674373206, + "expected_sha256": "5b1b374c9e6100077c446a293566c1f644475c94739ab08b7fa26ba847110216" + }, + "model-00010-of-00041.safetensors": { + "size": 3999517808, + "mtime_ns": 1790791590882822776, + "ctime_ns": 1790791592140526656, + "expected_sha256": "38e51dc850a39c325324e6ddd23347e6e3e76cba1341aeef2e1f260ca2cb9f49" + }, + "model-00011-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791590957816845, + "ctime_ns": 1790791592263447994, + "expected_sha256": "c06719dc79fbbc796b8751ccbb29c8ecbdb686de9f89e3c741b5bbfec203cf0c" + }, + "model-00012-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791592093727004, + "ctime_ns": 1790791593052686723, + "expected_sha256": "349036c3e3f6a8645af47906dae7272bd5352f822a3c354a16ef4084b3555679" + }, + "model-00013-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791600588055171, + "ctime_ns": 1790791601409653248, + "expected_sha256": "bfab17d1535ef23e99e54ff3156ce1456aa5f0a4a93b281a7adb9d8b921dc829" + }, + "model-00014-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791616126826177, + "ctime_ns": 1790791617184055832, + "expected_sha256": "318d10df78f1647189941884acc01616a6a78d5d45d74ea30955be7f509c580a" + }, + "model-00015-of-00041.safetensors": { + "size": 4000181736, + "mtime_ns": 1790791612736094357, + "ctime_ns": 1790791613754475950, + "expected_sha256": "aa3400abde789ecca625b8cea37aa31232bf6696923f10981d028518a2393173" + }, + "model-00016-of-00041.safetensors": { + "size": 3999517256, + "mtime_ns": 1790791614069988857, + "ctime_ns": 1790791614970756796, + "expected_sha256": "3776700f68222f0174bb14fea8480da41d928a1bfd6b5317c4fc2b14006d506e" + }, + "model-00017-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791619655547082, + "ctime_ns": 1790791620819648790, + "expected_sha256": "052726cd55224d3d217dac93eaed060215b8029afb44861c0d927d87c6a046ab" + }, + "model-00018-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791634117403259, + "ctime_ns": 1790791634553812882, + "expected_sha256": "dd1b8d843e0013ed3beb6ba7fc36dc4b1f2df5d71b40520f82f369cd8fce5cba" + }, + "model-00019-of-00041.safetensors": { + "size": 3999844096, + "mtime_ns": 1790791632652519121, + "ctime_ns": 1790791633466311124, + "expected_sha256": "bfe5489c61334f9ce9bc6b369c3edf44420d7f585c6438f3afb98a120b26e6f3" + }, + "model-00020-of-00041.safetensors": { + "size": 3999855040, + "mtime_ns": 1790791637493136264, + "ctime_ns": 1790791638225184919, + "expected_sha256": "eba3113cbd34304751e148502f314be5ceae6e7d830bd33f2c0cf3bb8dfb28c2" + }, + "model-00021-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791641577813197, + "ctime_ns": 1790791642733184326, + "expected_sha256": "9ddd72e8ada4480e86e4230639210df1039802db9f78537673c19117d2e69b95" + }, + "model-00022-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791649923153141, + "ctime_ns": 1790791650945961453, + "expected_sha256": "c6fc2bb1762d34b8db83fb11566e462c9166e132bb2bfcef45a33a4bd41c02db" + }, + "model-00023-of-00041.safetensors": { + "size": 3999517464, + "mtime_ns": 1790791652104980574, + "ctime_ns": 1790791653481273439, + "expected_sha256": "484bf8c327f7f7aaa20fbc4f6800d4aab7870749335b6f6bbfdb83570a1f66e2" + }, + "model-00024-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791660168342820, + "ctime_ns": 1790791661210671960, + "expected_sha256": "cfbb94709f5dac71ffe144ee3b9a976a49a2a9b9863caa29620fbc65820c2342" + }, + "model-00025-of-00041.safetensors": { + "size": 4000181296, + "mtime_ns": 1790791662726140516, + "ctime_ns": 1790791663692642297, + "expected_sha256": "b5799d19dcccfb17b108b5349900a4c42eb7bc241149cb7d1b38b48c707070cf" + }, + "model-00026-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791668794660539, + "ctime_ns": 1790791669630424746, + "expected_sha256": "98003819929196d2f6f05c42603e9124a7a7853f372089eed3ffbd0c244fbdac" + }, + "model-00027-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791671892415528, + "ctime_ns": 1790791672969703674, + "expected_sha256": "3d6b8b9d1c0c262cc8a63c41c3f75053ab8b31b6107130800718048da64b86db" + }, + "model-00028-of-00041.safetensors": { + "size": 3999843984, + "mtime_ns": 1790791680314749379, + "ctime_ns": 1790791681243204578, + "expected_sha256": "836d4a85cc72243c6caee2b6cf470cd598d6ab817e0685daf1128fd97bb133e3" + }, + "model-00029-of-00041.safetensors": { + "size": 3999855320, + "mtime_ns": 1790791684501418242, + "ctime_ns": 1790791685405366869, + "expected_sha256": "7b083d02c732458cfaaee8b0d1407626ad5ee10fc7eeed6b294b7d6853ac30e8" + }, + "model-00030-of-00041.safetensors": { + "size": 3999843672, + "mtime_ns": 1790791696432474575, + "ctime_ns": 1790791696706857045, + "expected_sha256": "e81006eeaa1152c67798640be46b710e87d44a307effca60cbdb7e9d1a3b268b" + }, + "model-00031-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791695451552159, + "ctime_ns": 1790791696104118690, + "expected_sha256": "4fd46dbc55ceefa6146a7687cd02d040087c58b0f7ea42c4cd7dc66b838f531c" + }, + "model-00032-of-00041.safetensors": { + "size": 3999843880, + "mtime_ns": 1790791696559464530, + "ctime_ns": 1790791697371537239, + "expected_sha256": "7edf6738b9bc204f0b39e9c7899515d1a1ed9d7d5f7c1cce32c981120c4f034d" + }, + "model-00033-of-00041.safetensors": { + "size": 3999517688, + "mtime_ns": 1790791698172336963, + "ctime_ns": 1790791699265011232, + "expected_sha256": "9f0f735e75e8d648b4b8d601a598d489fc4e4c7876da4f3406bf3bcc8990a181" + }, + "model-00034-of-00041.safetensors": { + "size": 4000181496, + "mtime_ns": 1790791709791417968, + "ctime_ns": 1790791711000615739, + "expected_sha256": "3499ba70dbb6a9acf87509c3b82c5790461a73f8d0d12f0e3699354f34dc02b7" + }, + "model-00035-of-00041.safetensors": { + "size": 3999843792, + "mtime_ns": 1790791716907855102, + "ctime_ns": 1790791717900751408, + "expected_sha256": "de04b5e39b9494b44becacf22fbe9c02890ef323a3dfe37640a2bfa80335504c" + }, + "model-00036-of-00041.safetensors": { + "size": 3999517472, + "mtime_ns": 1790791719476651926, + "ctime_ns": 1790791720529370922, + "expected_sha256": "3eddb88c62194513f94ef3b1c11577ad324fdcc21265ff7b11a4b50d50b03c5f" + }, + "model-00037-of-00041.safetensors": { + "size": 3999843872, + "mtime_ns": 1790791724336267561, + "ctime_ns": 1790791725074484814, + "expected_sha256": "01992493e00d45d5fec4b5989392f401c9ebe3e13973edaaf1973577e132ca11" + }, + "model-00038-of-00041.safetensors": { + "size": 3999844264, + "mtime_ns": 1790791730174805768, + "ctime_ns": 1790791731147517406, + "expected_sha256": "e328c6d2e5f2a42eb99a0335bde7aa4c42cbd72b88fb988d5a2c96ba6231e95e" + }, + "model-00039-of-00041.safetensors": { + "size": 3999854888, + "mtime_ns": 1790791737639215377, + "ctime_ns": 1790791738579039082, + "expected_sha256": "15063cd0a46af3fa37e74590534f62a81f1ede5340e7640713bf98f39f20961d" + }, + "model-00040-of-00041.safetensors": { + "size": 3365572496, + "mtime_ns": 1790791739485069381, + "ctime_ns": 1790791740425402464, + "expected_sha256": "e458c4f4345d7082e7063f381ee1962725f84c44d53a5b70afb77e601ff22017" + }, + "model-00041-of-00041.safetensors": { + "size": 3301131296, + "mtime_ns": 1790791742843803725, + "ctime_ns": 1790791743829509928, + "expected_sha256": "1f3ac4d828f7e08dd14eb4dc6f282139ae1fa0d894e43f247da2539d2ef43826" + } + }, + "expected_content_hash": "00a6a3b5573ccbac2e01fadb673c2cd7bca172d40ddd73f95ed7afa5cbdb9dcd", + "full_hash_verification": "required_before_model_load" + }, + "provider_config": { + "profile": "qwen3_next_tp4_shared_eager_v1", + "scope": "shared_full_forward_implementation", + "scheduler_batch_invariance_certified": false, + "sources": { + "rl_engine/integrations/qwen3_next_provider.py": "a182a280820cb8395166c7e6ab6b91c18f8840807e3867ab9f7a0f4cf350d7d2", + "rl_engine/integrations/qwen3_next_conv.py": "882122df605cab6b7837c52f5a774cabd72f22dde65dadd9244c5c799936ad99", + "rl_engine/integrations/qwen3_next_gdn.py": "36e8f34be63364120d2afeb25d76ac7eb04ea493773fcbbd60a84bdddfac2f25", + "rl_engine/integrations/qwen3_next_engine_weights.py": "f08dea8ffff732923d6c384aa31357c89e3e599b1bfeac4a92caf50dd22642b0", + "rl_engine/integrations/qwen3_next_profile.py": "3f6b9ef3d4a581bb8b058cd27a7156fcd70e7b82233c273970624ca3e21a1f50", + "rl_engine/integrations/qwen3_next_tp.py": "e2be3bb9995e2168326aa3e564a960f090f43eff8175af41e138c817ae90e188", + "rl_engine/integrations/qwen3_next_tp_gdn.py": "1a33958513597345287b6feca269289d953a44c2aa5c3beb880875bd86962313", + "rl_engine/integrations/qwen3_next_tp_blocks.py": "75a304d042b15d02e8d97b5016106555b7bcf8fd73786509661a27e6be958813", + "rl_engine/integrations/qwen3_next_forward.py": "9a44c6fcfa960f3013ead17ecd31046fbdac7e0814ab04a5c219b4a7bb7e6420", + "rl_engine/integrations/qwen3_next_embedding.py": "9695c4dcd6e83d94fcb34919ba85e0ee462c111624063568afdb9072e9fe367e", + "rl_engine/integrations/qwen3_next_logprob.py": "9bb1803e7324d460c36413906e8b0161d5166bc8a588f185fb0f016e6ba82f8d", + "rl_engine/integrations/qwen3_next_vime.py": "a34d3836587bffe8f8e4bf81c8d7dca9565046b659b2ee7536244352c7383b44", + "rl_engine/integrations/qwen3_next_vllm.py": "6a143215b2963e0f6a5a51856d7d5d7ecdad984cd488a89f9a6d9e0385cc7b58", + "rl_engine/integrations/qwen3_next_vllm_attention.py": "af322104f2b290cb942386139a591e0d7e42665a11f7bd8893a4f2ef7928a395", + "rl_engine/integrations/qwen3_next_vllm_model.py": "f03a3a81f316d1b3839832c482d6329ee195c57a829442e223082ccd744738f8", + "rl_engine/kernels/ops/cuda/norm/rmsnorm.py": "8d1a21113bd7161a46a6dc6d8721bb613d4f900330cac008890b055efb576fea", + "csrc/cuda/rmsnorm.cu": "ad6ac9cba603e1c0aa7d33b2a348e6b69d8e5bd848fc93248eb2a3f0de690110" + }, + "weights": "bfloat16", + "recurrent_state": "float32", + "mtp": false, + "prefix_reuse": false, + "dropout": false, + "dynamic_tuning": false, + "cuda_graph": false, + "sequence_parallel": false, + "fp32_residual_connection": false, + "vocab_size": 151936, + "padded_vocab_size": 151936, + "expert_tensor_parallel_size": 4, + "native_rollout_kv_cache_memory_bytes": 4294967296, + "runtime_env": { + "TRITON_F32_DEFAULT": "ieee", + "VLLM_USE_V2_MODEL_RUNNER": "0" + } + }, + "topology": { + "tp": 4, + "pp": 1, + "cp": 1, + "ep": 1 + }, + "architecture_layers": 48, + "weights_dtype": "bfloat16", + "recurrent_state_dtype": "float32", + "run_id": "20261009T041838Z-train1-c67ec144-39e7db9f", + "execution_id": "39e7db9f488142f4b52872e05728c390", + "fixture_sha256": "7c98e4e17cc24bd0c5f65f6515d58a9dfc947afcdb6d4956bd3fa05f24bb28b6" + }, + "step": 2, + "sample_position": 8 + } + } + } + ], + "checkpoint": { + "path": "/training-state/checkpoints/step-00000002-3bce5b5d91b045a1bbdb4f8ef235d1b6", + "sha256": "8906eaf4e2bee9d1aec783a6086e1a09b89b7da1a37525c6464aa922fec0e691" + }, + "attempt": "0" +} From 56462e74c62862341dbca58e2b8d1aca4180a805 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Sun, 11 Oct 2026 01:32:55 +0000 Subject: [PATCH 65/70] docs(qwen3-next): chain evidence README gives commands in the migrated layout Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- docs/usage/evidence/qwen3-next-chain-b200/README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/usage/evidence/qwen3-next-chain-b200/README.md b/docs/usage/evidence/qwen3-next-chain-b200/README.md index 177077593..3fb76586c 100644 --- a/docs/usage/evidence/qwen3-next-chain-b200/README.md +++ b/docs/usage/evidence/qwen3-next-chain-b200/README.md @@ -5,15 +5,15 @@ stage after another on nodes with four B200 GPUs, in one environment (`environment_sha256` `118384371a88…` in every `run.json`), on the official `Qwen/Qwen3-Next-80B-A3B-Instruct` revision `9c7f2fbe84465e40164a94cc16cd30b6999b0cc7`. Each stage was launched with the -launcher of that commit, `python scripts/qwen3_next_run.py --stage +launcher, `python tools/validation/models/qwen3_next_run.py --stage --previous --runs-root --checkpoint --cuda-home --python /bin/python` (see `docs/usage/qwen3-next-chain.md`), and the reports were made with: ```bash -python scripts/qwen3_next_chain_report.py --last /<...-train-...> --out chain-report.json -bash ci/run_qwen3_next_chain_gate.sh chain-report.json -python scripts/qwen3_next_publish_evidence.py --last /<...-train-...> \ +python tools/validation/models/qwen3_next_chain_report.py --last /<...-train-...> --out chain-report.json +bash ci/scripts/run_qwen3_next_chain_gate.sh chain-report.json +python tools/validation/models/qwen3_next_publish_evidence.py --last /<...-train-...> \ --chain-report chain-report.json --out docs/usage/evidence/qwen3-next-chain-b200 ``` @@ -26,7 +26,8 @@ python scripts/qwen3_next_publish_evidence.py --last /<...-train-...> \ | `train/` | checkpoint reload, L2 on the reloaded weights, continuous and resumed controls | passed, 16/16; reload == update 2 | | `chain-report.json` | chain-gate report (`qwen3-next-chain-v1`, compatible with `ws1-c10-c11-v5`) | passed, 64 cells, `first_drift: null` | -The stages ran the code of `c67ec14`; the copy in this directory was made by +Commands use the current repository layout; at `c67ec14` these runners were +in `scripts/` and `ci/`. The stages ran the code of `c67ec14`; the copy in this directory was made by the publisher of `3025497`, which only adds redaction rules (`redaction.json` counts the placeholders) and changes no measured byte. `SHA256SUMS` covers every file except this README. From 5bfd0ede4724aac9636c346395e4c2803e351455 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Sun, 11 Oct 2026 01:33:38 +0000 Subject: [PATCH 66/70] build(pre-commit): leave the byte-exact Qwen3-Next chain evidence untouched The published chain evidence is a byte-exact copy covered by SHA256SUMS; a pytest JUnit XML without a final newline would otherwise be rewritten by end-of-file-fixer and break the checksum. Same treatment as reports/archive/. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- .pre-commit-config.yaml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3e37f8bd1..9ef274150 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,9 +4,10 @@ repos: hooks: - id: trailing-whitespace # Unified diffs include significant context markers and pinned hashes. - exclude: '(\.patch$|^reports/archive/)' + # Published Qwen3-Next chain evidence is byte-exact (SHA256SUMS). + exclude: '(\.patch$|^reports/archive/|^docs/usage/evidence/qwen3-next-chain-b200/)' - id: end-of-file-fixer - exclude: ^reports/archive/ + exclude: '^(reports/archive/|docs/usage/evidence/qwen3-next-chain-b200/)' - id: check-yaml exclude: 'mkdocs\.yaml$' - id: check-added-large-files From 9ce25d04826a4178c33500395bc5a711bea2bc06 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Sun, 11 Oct 2026 01:34:26 +0000 Subject: [PATCH 67/70] build(pre-commit): leave the byte-exact batch-invariance evidence untouched Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- .pre-commit-config.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9ef274150..a38433e48 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,10 +4,10 @@ repos: hooks: - id: trailing-whitespace # Unified diffs include significant context markers and pinned hashes. - # Published Qwen3-Next chain evidence is byte-exact (SHA256SUMS). - exclude: '(\.patch$|^reports/archive/|^docs/usage/evidence/qwen3-next-chain-b200/)' + # Published Qwen3-Next chain and batch-invariance evidence is byte-exact (SHA256SUMS). + exclude: '(\.patch$|^reports/archive/|^docs/usage/evidence/qwen3-next-(chain|batch-invariance)-b200/)' - id: end-of-file-fixer - exclude: '^(reports/archive/|docs/usage/evidence/qwen3-next-chain-b200/)' + exclude: '^(reports/archive/|docs/usage/evidence/qwen3-next-(chain|batch-invariance)-b200/)' - id: check-yaml exclude: 'mkdocs\.yaml$' - id: check-added-large-files From 4bd3c7f0014adfd84df392ed1a5ede97e1b08793 Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Sun, 11 Oct 2026 01:51:37 +0000 Subject: [PATCH 68/70] test(qwen3-next): pin the case-manifest subprocess rootdir to its temp directory Node ids are relative to pytest's rootdir. When the temp directory sits under another checkout, the subprocess picked that checkout as rootdir and the manifest's case id no longer matched. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- tests/models/qwen3_next/test_qwen3_next_case_manifest.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/models/qwen3_next/test_qwen3_next_case_manifest.py b/tests/models/qwen3_next/test_qwen3_next_case_manifest.py index d3897b648..7d78a236f 100644 --- a/tests/models/qwen3_next/test_qwen3_next_case_manifest.py +++ b/tests/models/qwen3_next/test_qwen3_next_case_manifest.py @@ -81,6 +81,9 @@ def test_plugin_enforces_real_pytest_outcomes(tmp_path, outcome): "-q", "-p", "no:cacheprovider", + # Node ids are relative to the rootdir; keep it here even under another checkout. + "--rootdir", + str(tmp_path), "-p", "rl_engine.validation.models.pytest_case_manifest", "--case-manifest", From e79c499b337b529cfa3925f0bcef563bc331b05e Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Sun, 11 Oct 2026 15:34:53 +0000 Subject: [PATCH 69/70] docs(qwen3-next): figure for the full-model chain evidence tools/validation/models/plot_qwen3_next_chain.py draws, from the published evidence only, the rollout-vs-recompute raw-bit matrix (16 cases x 4 weight versions x tokens/logits/logprobs/layer digests) and the per-layer digest change between weight versions. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- .../evidence/qwen3-next-chain-b200/README.md | 4 +- .../evidence/qwen3-next-chain-b200/figure.png | Bin 0 -> 181469 bytes .../models/plot_qwen3_next_chain.py | 152 ++++++++++++++++++ 3 files changed, 155 insertions(+), 1 deletion(-) create mode 100644 docs/usage/evidence/qwen3-next-chain-b200/figure.png create mode 100644 tools/validation/models/plot_qwen3_next_chain.py diff --git a/docs/usage/evidence/qwen3-next-chain-b200/README.md b/docs/usage/evidence/qwen3-next-chain-b200/README.md index 3fb76586c..c46986e28 100644 --- a/docs/usage/evidence/qwen3-next-chain-b200/README.md +++ b/docs/usage/evidence/qwen3-next-chain-b200/README.md @@ -30,7 +30,9 @@ Commands use the current repository layout; at `c67ec14` these runners were in `scripts/` and `ci/`. The stages ran the code of `c67ec14`; the copy in this directory was made by the publisher of `3025497`, which only adds redaction rules (`redaction.json` counts the placeholders) and changes no measured byte. `SHA256SUMS` covers -every file except this README. +every file except this README and `figure.png`, which +`python tools/validation/models/plot_qwen3_next_chain.py docs/usage/evidence/qwen3-next-chain-b200` +draws from the published files. `train` was preempted and restarted several times. The training journal lets a restarted run continue from its last durable step, and one restarted run reused diff --git a/docs/usage/evidence/qwen3-next-chain-b200/figure.png b/docs/usage/evidence/qwen3-next-chain-b200/figure.png new file mode 100644 index 0000000000000000000000000000000000000000..9fbe01b47e5984620abb0900581076114854ca1f GIT binary patch literal 181469 zcmeFZhdY*k|37|OsgMROgivNm3z?D1$X=;zvRAT436)BTP$EjAvS(!^l2KGLA~Pd< z@9}$_z3=<}e7?W?ANU=|@9Q|;NAII9*L9ue`FcH{kM(@rP&;#yVg1ha1VJ#IJ|(X~ z5aj<-b*x>3KUS{u+`u2=mrm$i(sZ!6@k^fPgb`1z8C z&cb33Jp+T<+ska(HjNvCf`Z~aJ=s-cWht&+y}EJh)|OcIkD-H>Upl@%JxTa~yv@@6cC<*dX{P_{)9bfx$qzQX{`%Ix(*<#w%eE1~(T}k4jn3!0;>)_Voa&mX?Pj1Ce|IZwOn$Mqma%-!qO5eB+ znmwSS_Rq~dlA@co!E5nBdPW9cqz{$Cnp`s)1Kt;Bwxg(;D^ zqZy$-60^fCA^G|4qT=GEU%re4IH(S}ys>w7amnzUwvJdhd$ytUg}OA=UB6IVL~80j zWtGo$ndVA|>|6EzWRzE|EwOZpS*eyv8q~fQ6}8>n!-G>yY~9(jXVbH@<%2h{8Jn4L zf4|(EX|5Q$_+3>x{_^n89#PF7X6ELcyu54OM%U~X8m1wPrux6W(9g0+uIMV9_E=O) zOEc-2u36PEx3v85`7?vDar~z*UxL)u((jVk-q6s{^u|@-!aMgX@p8cl>Q5EoJX3lU zmu3ws?y!AL)=bivWn^UhFy6h_$kz5&<^8?YcK7e!r*fNRS-Wms`Jt6Wn-&UlUHyO^vp%nyTFUyGfn!HRSw+*?y=I2qztm0po$65kVw27*y&G#7cD^`N z6dKBydai(;sH?9pYc%wGz5n9p?~_~Y+lv@nU8hxd5m8Z5*Zo$PxBdKicCI^Ay84jL zg$uhHUg(;7Q4s}l`bY7pmy)ZpkJ?u9-a=s?|Aj|2~r!}e@UoWzBSAzOl2iZPE03nlS-8cofEJhKW1Ec;x->~vDk?YML2PTkk9>P;(UH@cgO ze2#tl{=FwP%^+_d`CXr@JgRy{w|1%McW@sian9${SI7@aU01!R0+?V)X1O*0V3VUnurvd;k7@ zdQQ&r3kv_Z@2>ab;?nA~PR90rHaK-vHoTz1AkY3bvw%)%eSLP*WxP}`$2#Ko{Gu3Z z(rRW`Y9rUl4P5;EI}5#L6|mc+7g}Sb{q95v=yrX)Jt#7mot?ekxRm-9+p#m&9#*Nd zT}9O62PC}bHVWvb%3r*=c4Bfev4MfLUvGerX)}l`W}IH&*SS!;B&@EexLzT2WrvfK zlSZ{cjx~*qjm^0?zi&1*>18{#uRNt8q&z05&zw2);zFUg@A7mbV=mixyPx*UhcB3j zsJnO9?oHBsq5bkfD^U_2&U9IUmYOg{`Ko?m19IHu;2)J3boe; zc|q~U%+C@NORK9{;^R3*FAwo9Eib3rwajb|pySUx8M>=`xFyfg(NX5tn`t9^`=FSZ zytUW^w^@#E+`03nQ}@R%EROvL1q|-$VOe1h-Z&AmHL~`%^pkDE7fLGsF!5`rX!Q~$ z+AnoZOR?tU<|-`C7|N-tZi|mM&Ufw+DgE$ayjr;1skcU7D_P@2iUW4_bLHq;M;+Qq z>g$>A+@Zo2U}TRwmhZE8`+V$(NqJ)mL6^7i{ zvX}fu*bG`8?19HQzr;xk&o5&y<~wzZFU$-lrPtoyt2);EnI+r)*G~L?KwzNQ#KZ)e zHO0}RN99kPFkYH-67`(g{_54M-*=3ytODbF7fw%j*^d~Mm6vya_sMlYl+drbB+=%if;#PUTo+&bLi$H2zMcG1cz!kRT577dFAVvf`WXw1U}PNy^XH6BT=WywG!6>LSq*oNHQf z8J}MznH#cA__&M=vGcI?)K^L(q^h>IVrIA{!?~v_w8-u+)=1g@FLQd5DI@Yst*yysoS&a>R1=l4K5MtPRajV<<3jcp!l>?v ztX}rT3@!Z@l%4KK!;f4-LJSq5>=oD6ZF#nkrk}OOq3zw3#6;!|Y~tMOHnJYJW?Gr= zV;}nUmiE|X+mr1@KFk(6Lv@`t*$%5YH4|7yCgnGK(9O%R8|q%_3P;RNj{K4-tEiCE z)Z8NJId$#j;EDYF7~vztSTMVSQNt_gCrL?rv-WXwQ$JO>T{hU5mSI}4VQIS2(76KD z;9;xAhx>a}O4E(y?%loX|Ld(=ggCKZRCIfDbMyZF`%6$EtC?6&PsRJJF7LlI)HMFo zf=x?aPEO8veiT)jTv~^0o79pwclvjEc~?IWYAW>FmXNU9X?}u-etQRR-fHKEU~<>q z<2uFMcrtq*$5*h={96#AZ*ZzCok zK!>kOMTm-56)Q;Zu^F@w^`2Y%@Q@WH0|NuD_$4dx$t%Qv!mrow^wQE2K^(ML+IRGO z3tHH{==p^ZfmMTDJCE32$5xRuH1z#g6?SJhY4?iPEcVkamZN6|==A;pohH_Co|J$8 z*YGOJ({4^q3TtcYrfjP$<*~RXe~LSJgqsL;j=CFLDx`Z4NvG^ldH9K8g^DmRI5zd? z`!@d&Su{=J297r+7K2V9V_Y-rZvXS!EgMhgM&YEw&T4|vg?5Z2gb$= zsE8;jpEt^vOVH4tdQJ~~`uw^4&-WxH$vl97(z?2h#MqdzWAfs*p03?hD~-9sx?!7x zi;ASelpjry_uGDqod9Op9%Vi7yELJ;J~G<+8i`W+xvFYv$_iX8DXvp44Gj;6*hw4tbDfEky6rVP(g}Do*BQJi ztmC!o;EIBd&Jo|0dCO?VU9GLDonP44i3CBjJ$v?O44yw1Gu|P)@n@bxXzKa5RknHf zyen6(px*5Q*rKqrW2=9u%lKH_^(y|hwP2*RU<<0k+)RtZ*Jr1e z;8T@HNBASZz0}XzLvS2Ds++iSLM2v$ru*Yhw8E{RavFHx98b=7*&PyDSl3VG4SJM z_m7vly!df7%orN7J@@u9GeH)G?2BKIhf#EQmD6pP^t`3m-SCQUK}PF`jq15K2E0rO zPoBsm%Sie8`JF5B-ccJ{P7oRz8qdD09&PugVqtk?5=Y_xf_fr|frTKlEIx-(^ZQ&} zoEbiG?wkZG8=JAEW$=?Hv}5DrCp;JEwzIH2HLWK-za)NH! zh4L>)v5T=L*V56I4>mfeB`Pu>a%f|<`^;o0$aL*+APu0CpU#bS&nyFzRJ0rAV> zg}FVO)(7UhjqXE@4bIL!bkW*6-u~B{{-zABTeoh7ACuwt9P6MMX=9MLw%&Q^QZ`UC z0}7<;jh;@Frp}(8!20^Wy6-POY`D?W*T=PgKgo?rCSn}F5zF#oV=CJ~ee%=v zcI@g+TesfXCF%LZt|eDvu&sEH;<2RKh@hY~DcUcC0HVw+EUN4#8w~~S-M=5uQynQl ze`!@s(d+XIXG5P)i_3C%ghoAmCVsDriHX_BCRCN~)>CDUdU9$(E7|1w>SA%SBCCg0 zRV=O3^EO;Y{AIiH*|Sy!`JztA|Iy3!T?HSy_K3Sbcxq^TrU=PA|iRhB%dJ zGSXhm{_*3-^^5P=H@+Uq*yK>#-p(j1D|<@Gi$YTJeAL5-r40>dp8uYEO!kc0$%MQEIVM#h0X zs({T&S&UM^_H^6!$(Wfv zt9b+RYYIf_+~-TK9=s90@=)`nFsj#{9N)&&$Nk?D=^9d(-_|$RBqYeY@P%$xK(|tO zbi}TsuP+$S%y{@`vC@y??23w#5@OFD?F`W5bA_HXd(Xs#R}N&Elslixccggm-~pPC zI8lN-70NEXhGU_wsq#;_R-D4^oqTKr?+VB3Cr=2~IH?FP*78No;-aZwdt>7S#@Fb) z>s?)43%ZZmSa9v&l9n#k()S@@EIT_R;he?BHwZT84qOTzQA z)gBR4#M6WX;)U<9q|X8q0gRV$iMSvyf31GrcYY$VeiY3U9fbkwc5I?YX=<=h)t)dq zbLP&o_H3)~QfG+{0P0PwthewrO@NCW-HJJLe1SMn;^=)BhmW=vxX`-v);us%-_!yS za(Q$`*Z%Y$kXMtQDrONM;%iQk=k!kWGntWA5|{#qcjBgLRNFMXy1}FLVC!2$V`Jke zX+J5fDYFJph;`qeF9!j?Y&#ajfBg9IbjQx)1ufdTx)q_)E7x}%^o`VyM5zP3=qe4Q z)2Igh|CwVG%)oM_>f9Df)Kw@j+&cnpZeB~heSgU&x~+o#xc4=ls;a{7o^4kX&4r>F z-O3x~(MFsme&5je{KsVm9D#e!9!lcYZ56WyLzL&(*jTbsc~14uf9*}II{b9NXPR?# zmQgJC-QeMU`*a5My++$4lWXoksYzT<2!8fJJCFe&Ce$xOEjjM)<<-5i>;)iyrJz6z zrGm=3G4=J-%!x&&;J0q0lmsgqEx)bqgT6;8wJ$Q&dfF6~ls@FzwGf}y9OIMomONtH zM69m7Wy!Pu6?V25d}wOq7Ypusq=&+To@P&gT+n*1ymuK;gnXA>DL>v}Gw79)X-*Bu zd{^Ylk7X2i|2tn(Q_~X&ReA-^G-!+5gT*TgHh2;n8QG<-;h&+O@X-_Rd|FsWMn*^= zxQ?i)uKv*Ox5@x!`l+@y@=r^=9Ic>XQ9|q0N9*b6%vbEuY&onFOTWRxlu26tuA*_CJa_DDH$TtfA+E~dCSWeu2dvCrrEZ%j058s#d zDMLj(+}x$$jn+R>c$f*j){LCYl-p5JNn!1yZG{3JYpCw-9F)t<$w41y>-h8M2DY8i z_vfDz2mIzI%wL_Ij%=N!X4rYCWZ;L*@7TTL?P(1SDo#`VoATehQGDHw#Yl=x%AJ&lB0a17oqwz1FV7}t?tbCv{V|k1 z6bq}gqHlx6=Z80z7a31o<*1Dj3m^-fk`f(u+lij42nqt!?*k}Ax@GMy&{ktGm1n)* zG83KO`}y|=JjA!?1dr1L@N9T(Al$rxqw4HL$9pP30h75g_Gb&|ITSJ((TBgyRmLgNI8p0q9zgaah(eFuX7F@rr->GQ@B77lV(F4?X(|6$I2xTeeU^ zw}P}=9>$}T4i=Vtz@at&iu6hp4Vn%R^Aqfr{YQ?-D%WVnNc-)&ckkZzgBFMGuuF5g ze7*oV2SO1gL9%AR@dOZDd{p4emjV_wQK^oG*zEhQ>rY`T#Y2(-45h_qj`x1Hp{Azh z0Qh;SvrGd#@4Yyj*K?VkUDET~0aFF8y?bdR__dGYZh)!E{RU3jw{I(n*Vf%*s3-if z&^aU}*#OsMCwqm|k~Mf*3t85xs;ahvskh`gL{hVc1O^9l;%&~qxfFSqZO4us zYd388h~nDW)kSY-CsY$xER(pbZhj{2<*QeMf*0QDZLS&jUGt%)Mj86;8VC(h2Q5cV zK8oaTRMsC6$Y69T_Pdo4V*TwIU+?Efp-)eSa)^uX1ou~Xsq>n9kU1hmI1~_I3)i{^ zkt0W-=yGjhV&XpBixs@zeQaY*tfavoVT~9(cidR?)u)iW%9IMKASljFk+LMKAuEQ2zGT z>cYb4%F4v_bU8>##LxEG9Ee>|I``#%1|tV3r-6`7O-n1VJo_QXM)!c%OdQ??I{BW3 zsXtU)T&5uYwy-)=1YfHe%Icr=N79mR-Cn|AFA!taB}nPNqVy!V10wT5H)%8$jV z>1iJ6V&CPn_K#4iJ3lhGRgV7oBRqyX&dtsJ1oa1U86RAr)Ne&Rd-uMtt!4D*?N_Zq z@4(NgQ>XkxLX&Y zXo5@Mmncznr#)e_Khg}@f%}4C)u8^yD@O2}ORdJ0;vQxIPoR08%(NY9%9tCk*aSc1 zJ<2s4rVx~^(~=>qtgK@d>{*U|U+mx|y{}Q$$`m!41ut&{Z1 z+!pL7rf=WArK63Zfv9Kh!wXRu))1gW4A^rKRa*1IdF{qEQD2>B<#?G)R+cz&4^T zz4T}>!eYXS@l`QWv?oTLP~O0FNx6wyCEIQ>LixrNbiv(+4>NDsqwJrU*mE*E>2FPa znNYRpyQ*ipO*_j%1@;`1y?x_GHn!Vah0ea18q)5Oc$QRrcj+DOsf5?o0PL-JyOuOH zH8lczwzb%g5hl#ojNOI@!iMTy64(Ap+>Atjb5>I8&_i>Nq6m_@syaC^qtXdL?B9fs z4;N&Cnn@yU^sUk#KbYHn7lqE|dT*0R8OWN(g<$uSGB63$_iS;ow@>B%?x?>I-b0pA z0ggx0`Po%m#QuW^x8&yLHWj$&7DV2cavk7)_wJpMnb|coSFZWpkxi&!H`)DIuXJ=6 zq2OPA9}pbw@rd$@%*4=HxHZHRgS=GuHTSK&#yYN;P!S==j#O4wx=;0U5=N+8&QyIs z`|4-^j z4Q)+U_Tf@ky8iX4-$%&U>Gr?cQK4O(D^9DbR@`J3_*(4eSD6XD)@1nSVQ8QGp@9i8 z6TD384>+`)Bh6pK;uUPdO0U&4Gm#CfqW;(_#@!zo`hUD^Jju6whSW5tcufEC`PFya zs9xQ=%<+u-;lqb&y1FN2Wv^&?B!Eu6|MY1sGy?SOu<(HC@l7;yuKjfsR#sL}Dg(e| zPp{J)U&ys%dzRY`X~nYEL=DQkpkBI~eL>@Rx8Hj#cetgX&7)P}9@PGj7nNvMZ!E+4 z6LlS63cG**UTo|Jpw8$c6N<8U+s;PAy}UK&o~A(k{P6wz7Wgh@fMrTGpY$5KO(FiH zftW7Mjf*<}Ui=u8zgY&dv^Ss`UDin9GCKu+oBp z0z%DJzdeDy?ssodM9atT-!(^^VT&wHRHr$o@tB_n{e^Ua0wkMs=5b=f^iVV1;_T=L zNILsndX)pO>@4YU&c;Y*(%HYIs5H@X*kHvrijiM4gUXNK;Z$LNs3w@K_+b$-kdUeQ(lth(6cg z!Ms6`5n(v3j`?9N9RSip(b_vUAm!({VIQ7{Ke!3tcCrq16pWnXEJSTq7IM*4?F$}+PGXRt&xqG!Q5nR^Y$aQyw{E!XLNhNm`tUor41H2w^(Ja7<0%<1pcNIS_uF! z@2o>%f`p_)Cu|{XqzWhx=2cS-spnZp9|@ewae2Yj%*^c5yBSKE$bIJ%udbFU+?v}2 zB}Bo~Qyd$@$eQ2t{LJ+92{?}cRz1|KH*W1bydJllbI+bND=RA^hVMB3%HrRQ|Gj&` zJ4O87`7SH`k%ANtmQQf7iSlk-TldD5g;aT@q@==D<3|SvsjkQnw6wJ7c_az*_V(tc z@CS5Jw(6q4Y61X75O#KUr}r?*OvT@r`>+K)1UdmB1J+R>YcMl2BT`K~QMm0E-6J9* z@_Wrjre((?T;0rodV!Bx4!<%i-T?pV1HARGPh_c1FQTY%9zLvM5d)nn!Dn&CxsP*C z)y+DFqxR=2AipZs+*I3Dkz`)2gKoC@h(p^gk4bs+K|vv*4EOOalf2ib0C+dBO9{ID zit}6Ho2D2kULE;}KCZ5(cRj7hn)cW+gZ_bmPFVQ)@IZUNJPsgDFt9L?BWyeTk{KK%K91`!JukbCU`pDliCNg`YAeZBE* z9xpM5t&h0NgHjm{A0Mj9oXF_tEBX1NSTYQcjyimVvpZHR{irV6O0&R6Na*z#LLaAn zx2>leU-IC;dUaRFm&Yw+k%TI0Jk@`|c~O_iYi20~A0FMqChmRv%VYC{+*^eVFN8-& zzc{Cts2K5kO%QZ3uy9VWaFmL$o-XGoXb0i*>AJ5B@Ma=!uX4WR6&QlE-_Z zwhIOU>E?KNczpWw>F&B*0YO1|HMNb%58Vw5yBZT?dtF*uRYiq{fXN);DPYEfi_FtH?vg}-U5RMQ?jc(9pGApD;@a-9LT>UA`1>WJ~wVE z;k{ij>r8~@OMrghkaeKU(4P50QiP^2DDKk!H$WKMH#nYTcJbo%Ju1J8D+EFS=TGOJ zU}rZ3GVb@Yxu#KZn2&FVKX1!W-}8J^%|cJt`eaSAWX=_@KDw&@)K>v2R*waXkm|a1 z>%v~mO%z>PbDfeASnqa!|HZ(+1>hAb;sd4VKV9{Jq2NiSiAs^_=G9wa&!#oabj?x& zY$*)?bp4(C=j&722ZH*yu#+S_r`8(!Oh+iQoJbS1u&}7BtCR8dmBMDiKBS-+jg`e` zEF0Q1TdE_v*IBbeP6QZjd}wCWY8aRB(7hjpL^5geeYd(W^6J6&*S zGpjsrZ)+>)=JAzLsa)21^!{w;5VAMGmzSui=S)Xh#YBCVu5mxD#KthMilRuc-N{2k zP?kJ9ecy5NxwHPJs=+yw`wd`)aG|M*SLfyu{g8dG( zRq55GEtX$m?k&dq0gf`QVaA3weSejPj5`et8cn7(`yno{$} zMXgnGr6_=w5jCFj*BjUSXepe@&Y#13iuhCBjn0N1o(XfbWv z2h+5pq?V78#tIf5uIVCzTkvF&!c&FIn9#J6!t3c5ap@QHHexRR%VM8JSJ~-&&uM<} zXmm@q0tzpaE>nZ45U%k@qacYK#+E*ac?+6TF5c^@_c#utma@(IXn{B1@G^22EhFb0{cEK zmW+B|`FY^!P%C@_j>?Tz$?h6eMl}gYf=m< z0{tlMDn&xa4g9{zml!d0DiJU%!OAvcbMqVcswlAhF(++b@tWR7Vy$(ve|fT2^5&1X zb_7HpwA{_XK_C{8o|&oP+5RQY?cS32-~(DD8q9vaOuj)WCm|`x{2(p-q^c_8Wbfyb zaZ-ijL;Cc%X1xJM5jHkjlg8BZq^gLw;=e?60QHz%-AVA)+|p~S|8atSJIqezmNPL2 zw3jGMzZP}Xa85AgZ6HwG$3GtpP>iwkU}HRdSpCUl#rkuovdoCPaTJ^+73;G(g6aj% z=BM|6OH@kDhmv!xv{v}ksEZTe4UsVDh#aKI;K73j;nQ2k0UqS$ZiNh0>)f3CkB%3n z8Zl{PWwj2E8B~~`K8Em5(LQm-pt-r6c6~v?c{v@Ot<;oPT19S+YWB>}WW=e*O|f6WCAdTQ^2V_B9`>t4TK*?VJwx_ZoEThyunZKV8)t8g>8i zvkS`Xs=j9?7Pc<)3VBfE_1K~6)P3WZvPr!2rJ{QK%U5A{R8T)Vx}0~xO7B2o0Fo3W zCsx&1iT4Pp)Mc2S1jdmyZcx^~o+c)9$&Rl|RPWp3n^32=knX|35Y*t5`aFpF{lDJk zY1qAf^{TFTl@L7^_W_{gCIi7F-8ebHWa&%WR=Ahfb6-`!?c2Atc3e7v`(5q&_HW8$ z^~AqLC@wEAFVydD07+4&F83Q0{?MEpot-I(LpBY{djb?bKRisD+wjLfw70WMNfi+s zl}ky_p9kT?$Sf&oproaR)-NQKB~B6HN;k46v<}J1IXh=^6Kc(jQa2A8my$q;86Z52 zIPFo@Jx2yVI!kE?f84z;s7WA}8=)8n?mKUG@I^!!LTt$ecn#IY^TIc;AC$zC+s((P zt}&BrrD+o*<+BqvO7`;QT&*3}8D6vU<^;=8`veWg>-kGth_a7T0TB@q8jECbayouI zkgnWPw-U|-RBDA=+vBHNp-J<|?f?Vlal8AWzMdXA!|S(wbey|2Hu^b6-@ni0whYiv z?dpXjl5pd=qEd`(PJVY3)Dn~p;_i9{pGIA$KR=uF=4De+dZndTpGvWO{(NHgguDCP z$>z4{L3;>>Cv&WSI4;et(|UbY`}ys;!`GO$M5es;n6$_kE=!aVfVF2YtC(``pm{;s zDJktQ0pLD}wuPpr@8{mTm(MmbikJU`{l$xVL+)R`By`N-UT=HUlOkA~7rK0FA$(Rx zz1)ZM_`5USh7>)Mwug@%t@w10>wxp`Q$)g02P~p8@LHf-6Qupt0CZ{=sOtZa5`nZ?>aNE7K!CL)t8#yb1$>hKgFB$ZZ$Dr{4UkR``59hu zd{d3!+sni9T3Rq{LCBq3ppkX}F2ETIjEfV7(QD-3U})xJkY7;HIb-KQy=IN#!aH!~ zqEdJuo0z5uILs>-^$Wwt;oVf$_ON*)&~68Fmwn&9FXT4n*G(17JFg$A3M>S_C=iwa zsl*HDt^}eO8KdCofwY5D@=bCUiW(^R`W9Iqo0Y~Rq#&+cyC#F|vQWevG|9@^pdf8- zX}5v;bpkpsIE957x9vNJNVCu0AHvX(?CtFd|J3tJ>}6|Z__-29%rnaE+urfb6V|Qy zP8#glMYWZc>mW|%J9c^}QxXAJuW~ov)+(5R**HFx{9;MZYDQ%TK2_G*njiKW85@kA zF83+X-IQ~Y(=(Oyv_ac0{(6(6%;J=*g#0DBgP)TjIWT$tb-VWsOj+$MXjvY3nTEEq z^;%HS13mtC5;=B@%(=GBSAjXvWUGAaBa_PH)$7!=ERHx+X^{-fqKVt;ril4XyPs2x zkcz(+dbx>;W(zga%m1^2i?qyrhP9{Lh8te9zy#{(?hZgNl))3U_HlOJj6SiJNY7A@ z`6G&48%h7vO!g#ZO0-MO930SWGdOV`)uDL#$obx--#tC=o11qK&)S0hu3NrLOymKI zV?;vro%=W?9;5<96Ri==2ZK)p)6)ETPid=v>ykaU+`5Q7#d!Z$ zuIL^(bY!3h&bcEbS~8L71M1R`gcxpMhD+ZW6m@(@{kRMSwh*u{&9Xc|YMi~F?=L?Z zf>HquS_U!4x7f5WiDM!MpW59EhzWzjYGYt)mab;LJ zK{_l|%SIWm_9#aY$TXgA*zN(SL8`%IOcv`OAsZg}I55?N!G(hnGg}(35RBH)-m@n` z!w<}Cz4Rq5GTlr?;L($Dv*=-JygTXzK_D=x!Q=cA5he&(lmxc*wXw1Nm2cj?lYj-c z7KRU*@Wib|>@Z0+&IC>aK|pfSGZ0`u*M;DrqZV3^a`c2B8R0ASlU|ZwCL* zNBr0^7Ny92q~%WL`5m8hl}K&dwry?TamW}Cq6%{UR~sQ?#L#)~K3Ytbw*W^(qajm7 zz{JL%?mF-cR!!Kty1WfS+%9Y=_=KeUm`s>!>c#yD|53m;(ugp-T?kp6&7hnpe}76{ zT|JCLHKVLdz9we=ZT+-b_#E9i(!WbLE^HONiuE!!H6@P>bF?e=Ls_PIwIdv}%n^lx zkQ+DN1LQfkpTtf6(5TDQl#;Y}`3_PR^#yn=$xC6xjXDwWAXd5FkqMareTxAKzEXZ zmjT%v#wZQcf-=O7(%nXPWnVOAMC=a}1-tj}SKGX?G0(ve3tYa_os1dEaNG^=^OF7q zI=vo9I4si%?vRe&bJx!gbLQsz)M0p*)k=pRM;7xd*!0DV7dZ}3iy^?hk(rqWWt^T} z>Yc;}T5>=~%%xWb9wbQRN&H7<8R52**il_QVaO2-96E_df$gNviLBkc>(@|eNlP`R z8CHNR#iyp;fvBxSIfUJe(UdF3AA)uxn*r=phI~8sGDf4+(k@6M_SFTi44JMC$fwg1 zXq38t7^Q;gcThqHaYw`ubeK$1JOLPkTi69zEbPfi=y|9M>>|t1KCd9XMym11Ep?+0 zBi%|tNp+$cpGy{VDk`c#7ff7iw{LZfT#9}C`1ZAH?h;s76S5Pp^!;RjM3Q~T2+-qW zc@zW~>Vro=(qBM&GWq=Q2UMgIFm7y~HE2W!{8qd#+SojWxkZKp5zM@cxBK+z)M@<> z@ac@pZ!$w1jXZW)S(zStY|s38UP0tF`B9Ap*VWjdGZZbRdMlk}V3%SA7=T1v@kF-$ z3AW-3a3joUfB|wATrOe)nTAwTfkHYq^+(ft^0Q1fGB8`VY$5IS+0l@z&QRv|+x-D?E;X537@ zBE~nk@?hp6U$xJ4qV@OZ3}nirynM&Hb>kSw*;@bOuv+3x&Xv*C=lq9*_-9k^-P_b# zYv?cLV)3E8oW|GJ7Y-UTFbbIfBn|D7IKMCZj&KbJ()Cdg2m*vJ9KXIB23_*Pt+UYP z*RPjPTh`Zi;I77;9HXhJY2_$Vp}JAg1=&@D`ViXf&LJBOj73(_`ucjO(YEua$I!jI zpJlp4An*0(8xNq~`?50X9Gk|VTz|@5=$uT}Z%9Ht#vIjoC zJQ-(7NFW<6VjU;0j1~Z@zgu#d26X%`hP}pOyy@+JigqCIM?w{7P$yoWJ&f&5ft#ruD=~k+rV=5c zcAr@`h}y5lM$d!%!WCi#4m_!)#l2?3C3yrkG0S%~N%g7I>WU8`gADq9*A(Zp;408C zX3~i!!)%yHL~CS(!gw_(sCPA1w(|O&t&#y!d0t2gT)+Ne_rJz>)x{1RIr4F3d65j9 zu}TS6we^hbd(4J$m2KEHav%~n*{boppfTSyOR;L15r{s5D>$V%$E=(1xu%8;*p^`B zcEFm#``$HE+VT>Vvw-^1^=M>wzdCV{PRG}$!S2OZAK(s)yN!@0(fe=TGFx*Oi{SrV z2??QVEAn}new)8y@4kH-LbeJ~6Sx=pdoI@EgZ-9s)+6snhx>624eqqL*ST~fPK1{3 zU|OrADxx~9=l0IS8sdZ+xDWcmM_9v-AgI`JTw-GSDd5ixD@!g%Y;A4L7Ia^qWk#x@ z93~67o)_f_tTJ!nFk}d8>aPBU zDU641*?UGXk0_ZC!R0_3_&}~wRFFz%vSCeB3vWMa|4wT$Q^Ek&@fG;2T%w|Sn+g8s z=$0^%O~1qxX!Mqs!C#=UVv%-G5nw51Bvs65W)Jzz+k?H&L_&*Ag_SK~&iRPaafBB5op5yTw(cqw@ z1nH)UkO`gB`@aq~yM$L|_hFX++#l!IX!PkWr$}=W8Y>Tv&0E*OJ$yn2F^J=#QI7dt zF*y#ggaH8Q#re0ntuv&1gS%Y^np^)$U(@~(OgBoxb9O{%%PGV{{2`Yj8G#+Pt*)UV zsGwj6;){aX&y|_sLb}fk?Er4S$>5J{Ww@Cl_>^x(Peiz+6tD>D@l}`;tZZz|7AadC zS}^N`YY#h1CaHl*ISw44aA@zvNOA&zfTEAgOc5YdHz3rh)29_KT#$lW`W1PT60taJbbt;5pu+^7FLkfKsb)IWIj0y@8M^r$q*w?2%^?XwOA`)mfV9Y^o zL&`k@fzkPmxWWt2iKz)v(|#Rle`CI5e5M=PEV@eMiv1upH~Yf0u(Y|N9QmI9}BR(C?=YT5==uI>t|syo&-Qx!MuWk zcUu=-2R_AF>W3yZ;gUBpFz&`Nz3OomR4KPZS?+0Mh}N01#2VOmmQNVYX7dE32Z z+csKcMzI36K!^-Ll#HCYk(cKt$Latl1q$O}8loGJ{Ou5$D<%yD542dGE=$u!;|i_pR`IeP+`Bxi}!#Hp=d7Yd%tqF&hauC9oY)KLjry zD_8H4z+>sc++vyzfhrH@_=${t$LN#M#49q;87eU`&#=ARGvii?TyY40n{w;W$o ze3J*!#Bn~eKZFTX@+4YI_)guS3igv6z}p~ZAD}3YBNRa@$_Tx@&`4Z=HrH0)_U@~c zS{<2ip=09W>rbDq1ZI;%%Ej337d=!T^?XU~h3m({j8c(W_HdhX4tT5mv!O z58vSn7ccT+XK^yESAVG^)b#TwIY5h~9Z+rX>(@d%kJ`UV_k+{Ddv_^j6L$iHkeC^w zqws8@3G$o>=1Zc7h9Cu2Rd_^kx38V{)NDH#*{2$BAs5x~-X@4Mr&of!<|lZtt4OYp ztQ<7~{?Un|ioJ0!Tx|s7QAl|!=7d63B@@dN6VApK7I&bOBLb;8F&meYa~LwTQlUdv z<946rDo8PDH49;Pga{G^1FVKMZaQHaK|8+6NP^Fz1;rVL4ft$svD{q@*nuN>!?EG%<-<-wqB2w9) zGzUDVE<#{2YE1nV=PCZT?8#5js0$RV`)d?M1Y-pJDY`!vPYKx~5WlE=3_Me`A7QN* z*yjZi;w!DojWdzgum7f7yOx?*S{O`=bKmo?w@SQc`2C-QOsXCO*BYwLJgt=_~)bf&cTz z|2^;K|6>RBB!)*u2G7m8OZcsvOYV`EUu8~CPDU9$2?alSp%6+m^gE0*&C49*A`?>o z{#g)N_n$p6HID@4Nw|y1FdG{gjlKU#MIQD7iGnE?(}r>o1%JC?(hx};o|&!>WO5h- z@W!U50Uv@x!}DWq>LPpu6^$U1`;Y|mP2$jwIiTzTZwJ98KtktkcsMn&|LD=+hY$OY zZ8#B0ZvNOOEZ)%=-$f2WCRJ(edQdJt++|q zT4+siVbi0b+N{#jevp6!emsy8a;i(Zabq12iPZF^en|=G|D*Plo31n3y?fyqR49;n z0FYW+n6SasOV2BQgRIm|xaZP1FKa;~>5k?7M-eBSbhg_|MP>NV$84<0!Zgnv`M%U;X)KRX>| zb3BRyCt*qP!F7dGRSKO2(PEK77-i$Y%-PmI)>BZ>6Z0Aj+dHm9B_tI(NUARoAui4R z@}-X;Vft}|xWe0la2^dQ31AW6n}~Ja6w!c-lUZgnT+g>RQStnid(OZ|tI0{Q{Ql=h zi}L^#$EL5_USYrzs~G+UZ|->og*9E>-5B;6zh^OX2Ff2I&mXYP?!rUOYHQXH&-nb+ z>4{>uwBHIVx%3e#5%j{8CGzrPGs6baGe`ph0LWrgQn5udNTh{CivWj!T|90+kfF(U z$CA{aL9|1{FLphFw>aVL{qDD+qN3uBN!Sb#8jV-nYmi+km^=e0A>LL+9u$LNM%s>F zVv&1cpCS275Rl%ECjJb1+ATu@v(msxkwIXsj!vg7*d}rao+%x+*T<1PI=vEDG8_oY zVCyEcL zdO!KtGchrB0BAr#(h{}6ey_<=69me}4a9`%?V2~_eukZ{Tq|$>rG2qQy=MsuJtX9a ze4&3=6!Omm;dKX5Abs9r;W+65R!r;FL0(uw zG|$n^?PS`8LT++2trM;fh+=K?@ z5thn^T@u&fL=y?7jgX*l7|&MH3-7*=P~So(AVEK`8h4TG#Z9f*y`d|gXLMQ|8BXhqH)~d4$V9t=x z6=oJDy;I8$gbXxi?S&aaw{PD*lHu3Csg69+jd;46amTM@(i13L1#SuABvOpKB-U=*X8BiMKvC^L_zg58o(wowz^Q!?b-M!=Rlx}4HDf!w z+w8vEIbDk>5;)#KS}Fat9K;<}19<`pXc>}gWL`aa#&2bw7Hlrvq1~5Mj>(`Vl3|1l zsLcV>kE8wYPw~7+V=_kERbz9EIo=n#Wo1oae-wGfRF)+pwh{&L{Q2|kV$R%1^r}Cv znLv8`7Calo{N*fS{im`@e*WBvbC|-ueJ9d!JWTQof>;W1QllfBSfczlcLjjx47KEu z6X1X6>$(Qhj&VRIh6IkYiTF{bal)SzK{8FMHKHbP-Rr)63%gZtd3Yz8*bGML5X zuKo`4_%^R!e7n>VEjjRJy^oZ!J3Biaox~Ug1YT+kS0MPR7$-eGX@gnSexx6hzo^0x z#&H>2?AtCyQXd%T?|-6ykcFP*2tDw-;E#9z$4P$tn=Noy-@;YwVPgnj$eL+~pbaB| zg|7M)`d6r!Auh@++GhASDqL;ej)rG?K zfd41;^tQvt!L-(4EFY5D&n?gHz%75?ucAu)Hk=-K&NDNLaOEXe z*Us+lr~6H@s}n>DFss2`y@9nUlt*bR7nnOH_x2w+K*k=?G@v3&owoWFc4?q~2ezL3 z%90q4CKJlLoxkK@m986$Nx zn8hZpXYRU#W3iw&%Hj)RMUv7XrcIIYH?4nhZ!LYekp2=_pbkJtQo}`( zr4ke^>flN7Isx1d3_1j(^}#?+x`*sclff4*RF1yZ-1Cn^%R!D0uj3;Ch#_BON z0gM8t!ML}koz&5z5BgO=lR>wjz`qd*96#1=@x^Ww{(Z*-XGIF0f5QaMPjX9q{N0$C zTaf8V>&9HHm5_h$1z``_UJ9bpMRqCeqKB1st*kzqggZeFDT18>Ag#={ep^GJ#xY^M zlT@rB@ROH;K?N|OP0(k{!ujqeW=fKC$OQb?dq0Dqi~sJMZA?r|M3R*fk=MixD*}V_ znlnp?tM4SGeSAam_$%^26U4CH7iWYhDVGk|G}LH(enhI-|NeQAK*rs_Zac$z&J9er zAd$T`PMQ%3b;yAjo?bLnWh9Ku%>&U}yJ7X?$rhLuh;pd?m?%C`fH7sL{1~sG8yPtY zoza{;X#^)&KuqN&jF3x2v55)r!V%mJOg7p> z>{|mGzCnswKKc(lO4^R|PYi)0)JaZG9_50(SoCz2`!?H!eY^)S*b28n9yhkf;?DiO ze0--s-{U(KK-=8P zVkclRiSf)vM#*gfVGEm2@9m5OrgdpyyLS!_l4E97W~&DIj-1$IYDs6;LKK9Q)HhjQ3_TDszQQy%xu{KkH?&Qgn$t78l!iHV&I4;(|P%j8?utkf*z(NR)qdO%e?YksO zJV9Xu7{AK>QVY3wYyd%M8W0(}06+O17ENuRzN2U5-EjAqaMqb~TXP{b?my_I`)w9; zU8Hb;gFF*6pKD{p`l-V5xfGkhNB<9J?;Y3k-pBucY?%jztc*mFkv%FSql`#Kr7|K} z(GY3anc>qS6e>++WR!++jD(biG9smtrc#=}`^!1k_d4hL-fq7?zW%wca}N4^-tX7z zIUbM4^YOH7-Apod>Qpi16KtDv@jf*3&$w_YErbSK?XE` znBm}!yP2XP0qd_XA?y6fu%r-~O7_rJt$!uE&Lk1@C&-jC1|fC6ip!4Tq}d-H(>((r z%>~{L1l&xLm6g?V%8v7j+o;^#p7+aATU^!0-GzCj)t?{EVu;?;pc*mymwewjVi1<1 zQDgz+I|!>(>&qUsmE6Z>Rr-@7NTO*4HA}EmG$=vfi7DKgvQH11>KcsqT%0)N;{KV1 zEhL)hzq)zVQ#y?V`W$Kye)Z}JIBj9LlDKZlKaYx*?=S&&HMAM3f;@6-|21pZF6Nej z2s#}N)~@`P)*C)W`eHMx49f8Rets3x4IVGn&sw^&-OsvGmqg={CXG%BZ&PY|z8gA{ zT1JcNq>G%~5yl&N!Fq9}Z7MV0y&HtY24>Z*-Eh5G%pb3!QhEP=rLddu>_OqnvD_A< zlIQ%GsIV#QXkOpK5Dgb{42O)4b4dl26oKdJU4r5(81~zbCI}@F(}Qxl-YfO0=x$!|gQ>)yk73-Ylsa|lG%G!}Jq1Y{S@XWb zPn@)EWY(b*Q%}I_BxH}>-Dm%+hEKZiB+y6FrHkWEL9;Lw^QpM_1PHkH9_hrlB}>rI zYh{)(SJw`UKQX;QDJF(Cvg3}nSfxYy>ZO*5&CMxt?lkw)^ZS)o(8qY(t{Z)Ov5!_W zD_4<5glxOz_yB)@p+OgVpgUVr9+)8ee?-Z%ow$#8S6j00HOwe!@z4%WfSk}7=VBT6 zYqnL#4hkdMxmH$G%s?N36r`*wqwn*`lN34EH)V{#Sa2F6s7bzobm66gGYj3fe{)|F zTpc>Gd-od|LnPYM)?xT^Bw+rVH>NsH3m3?Fq;zkS>7ljq_KM_jDkjwo)kI}b#ce)o z4#g=1E|>w7*l$lLr+|ricQZ09U{#by>Uqtvlmoj?Rlo0Q6z4E$q3@37{i7}U6JjV9 zNs=(j0g0T+psv0z)1cc*-Ww2e*L=FaSGw7`Q>QJf@j-+wzmIxoYOfwW1c)QVT|g8g ztKM^ggycg=Jc(+nQ~b5X6y~Et9ao!Y^nuGi7#r&twb|uAg@E|q0_(>e_5gx3!!2K>>MtU5U1{K%De_t5@Ue$VX2_0%hd7e}+W z9nEdqC0FK)k13=Ca>G3RfEo1UAG;?9>Y5f56bLmO)}$@U!s|=-G;5)+(PIt#?*YI8 z#_rH2nMg`?6r5EI4Ug{YJS$@%F<)+dAK9ii85v%cdU#6>n)Sf8wA-B?rpGE`9EU}B zA3HWx?zXb-q)8R|14n#V8Og-De!RK=v<>d!aKAF{6Z`*JzKWWJy^76_uon)((uU2R{Kb9YzGlyoP zVHXZ&dSQne1M!%g8pwiMqjA?_S4WKdS6gj zTvSvv@5c1WQ|_%It_izp$tO~w$Lgey+im(B#I4INb6PkKSojQfIl6d~CSJq4U)nyD*Dou?IgPRpI7md%gk`P-UlXRK9= ze}Y$CmW~oSxJrd&M3XC4tmx0fB^qwq(dh8J>8NPZfEehsrg2!4FU`!ebg6NeAzsC9@h6Dub^Vd5jFavvF#xktQ)i(|*SPnjP6d8*(50Fv<4X z&6_ikwdiO0Rx@MWZP~JAVjlO}>POGlz36<2>n>PhOr-It2)uS-(NOovowvMmY6WUZ z!}S@S(5g=M<_ADOmoPstbIMh^Ppey?x2y4&di&aol+l0QCV0{{UZjm!wU0B62us9RB;Nu0wG ze3^%RALjI`&tw}h3BTdpPvbqNBv|^wP71zLgei=-cQ52Q0V#dv?QWD+F07Afa*!Qn zIAZEpeWz)P|9nx&UVG&6#BUt*ck;b3#V#k?+3rzNQV%48n7GZm-taMI*M7p|!J-q# zk6%PsY*kl%f}uL}{lj)F%(KXSc6ys_>|taiYoEI(^c?riTnvoj%p>G66u_4P1DW;f zS-$uVm~{&zyI@{ey&4FiT0v3o{wgZ%P*muhc^O9Xq6C}COI*3~JaVS?3l^x7+C5d? ztR=&iV`;d(?)Dx3saO5JNY3s6vwFxpR5D|BfT3M+QW2E2o?cfm)6G=hWpsULhKHt& z-t^{4GtwD#!F_^&B&L14;hlk?=>j6GngGcTHd`kVZDZ8Bz&dV5Yw z;dVY<$OTJM4Bk&7UoR)$a0oCns4#^r+K%!@&zC>Qt&EMZ24!11| zle<`MNEVk-f;NBx?aRE`^e6tyjXj1c{dv{M=PjkI1hs=D?5y6`20fw86{A*&v@b8b z5RC=olf5nKFvh`}Xv^`Q0~~d4GjR|X7xy-@P=Q1zq7KnaSSBJ`CPyglwVst0vQ9>_ z&1&*N%EO0zMBy+IrdQQR^4nIi_|D}Hj?2=nxP+grrKKf!<^8N^gWyu*>nT2(vvekFq7BuW`>dN# z$Ju^M-76lKwKYCR2U@iG*+Md0byIL;=YLh6a?J#F*fX3mfyX%CWQ7Sza64{h0MqUtEtZuCTB|LTR+_{r#-?wjHaGKe9UGIl%6@ELS+v3E2 zE^%r>Q>|D8^dqdIH)qEguQw8P4tYmRyW<8i?M4g{7Y#vJigh>&PN8_B0Lq~Q{>wMk zRjnAWqjJps1iXMK$HO23(`aGOJJZj`a+0_&o%$T6%orq?7QB!+kMqVoajE=Zm)-rI z(_iGtNUtpowM8vK7Fvr@8=#tPxzD5nsbgBFG3#Fpby3%QMIyTnSTz6K_yrrIcu(C&tQ4Jfa9+0K1X=Vp;^L4p zRBnZ1&BctJhx;ql5K4fF_;Ug!mVG%{x-W&M;{*zO$)binhi^6#i9O~`3t9n9GurIg z9g(et#RR3YViD{J2Jc$hpT5@-OIi`haNH6j+CP7$$oHjj9X4rUh-XtP9p~R6X2XV{ zLH+wr+xm6RG}-y;HU;_T@-S2X@2{XRF}hQ!phx#BY&)6EY9>JX{s*^&>IXM(-~L$F zr?TchmfVWvaH}nWsq!{+*gNf_zJi2&){E{?(cpV7?j0jJgh#s#as7hWLUzD1vUO7U_2!i8oMBIzMyG7oQm`_@ZZ%uP)&4j+#4n{0Uh{{2Ot z$Lr|nt=f{jgTVB7eOkA+EzeA{R;sNo?JTs@#1SHWD}p7l^fD@POj3HxUl5RVUA%Wy z!}@rq5kevSmsK7Do@21~3qxYr8h}Gh5BP%n^fPE(+epMR2#)6Kdv*%JYugK_O^hQi zZF7G4@}=;Os`in~9+?)B@NwjxpvtWX)di?7v@O^JqaW_#gyRHXFEKI$|3C2V>l~<> zn)eUD4RO2Q%VQJemaw#pO4bZa=YmeXuhy_DQcw4cgJ zx({E$yvG&fYO@f`3fhw|fXPx99GgCUcj%;~bVI(4m?FkTk)^I(UczG%+lqyS-bX2*Zkf%)grAF7I+W|A*brfOoh`sIr9J=J;NDw!GSaX z=Q#+pt4kNyC9hf=2@yzYbnvUjHlK7mD2LT?B;Z81qI9$5bv6N#(2*{^vo;3fx!xNETs; z@o~Wr+}Uc(Rh>Sx<%}6Vf=t9YayI-05>MmLJ+T|y>*;y>g%uO+2OaUHI)rYw*&nS6 z$62H>Q!Ejsv0eOL)V<0bd?<$c!8X#g`L?_F@1&`vb#&D4^+@h1mk+9=F-~T15u94v z(;RITP!=q4D-z8^mZKo`zLo3B+(UCQSX#KnXOeYmM&kBO>wmwpaE$N9qoH=3PAUG6^XVK;NPdHSqL8Sx9 zI(_EM7F2|)Rp;pp38^l`JZga4J5znXXvpRRbBY>{Hx}S&SD4ZYc4D8%D#B)6FqoLc zO4s2<&{NHVQyHd15fzQy{uxEObos5p3hINrZUE$xWYv}r^H<+1jaN{r+6~n$DxePX z6<6oKBeS=VeE@3-h>msR!S6Z4+f%m=g7{WdA?}Wq)Ee-b?~U zphbIh3QAmf=>T<)9-So07)Hc&Y6(JXD{{5lvS5U!WAm0RaANytD6xiW&MOM=nX?_c z!|k8$Hv{Lm#G@1GnY~aJ@+a0^ft0lIE<(wT)?}qPGg0fK&k~ z3r?%*d0Ug93t*jI$2DZg?NG=quc#2;_7YGjAL;V$>V8sN*qo;?&I%98I#EJVs|_`< z`}y5~)F_-Q-`y$w4KoTvoO$6D@lLTR){Dekhp@L~pF~^cmx67DIQe^~^O~ow#s8~l zQ)%&AYPk5U@PdPC6V_(5rJnDEF9jgdJ^lV~h1DABTVb&(Z0!Y`I^9AdCQKyvzdY3i z_!(VLRP^Y<18nfWZ>IYZKDPVzr6HF*nfep=rvE@qD(y{XWwn`wL2EO~nW?*Ou>w}mxL_4Dt3y{*YQd&zrX$OY*}ggP%@3YtCtD5CMM1KylWFZuX20c-YqoooWL;3 zaHHFOu3z6Sj8_CW*>3)u)YO&|;pNB4d&tzG*l{BfX$V&lVQL)TWO58sy2Zx9E5Tj%q{WWzz`);6(4Sovig}GoG zF|x_Q2l$@9Ta0!^+niP0wlHQZOc-qaFfnOdQ$7f6T{}HHrVs>p5B$;cw~nWVj2x+} zH>0LBKEre39nf#~Q2~1PV7Hk>Yn@Bp=m{gU`%h&;8q2c2q)j2mHH}AG9y)j5Kw=1f zb*}sN)mwcS@vpFu>@4$FU`WN|V?V9a3@kY~v!|ZhFE^xLX)a;egN|y%lE6-q#rMU( zF{@=71DjhBN9Stq8e!mb`t)9=BLDKk4j~W9Ccl2YhYFMuS=cj!&USxia=t+q1TCeM zw`+AWG105A-Rv&)rSUVOHo@8qv-`#M0TmmK6zj#A@_X}lJes~gZn}N+F5l?96#Gwj7ZWR!Ty(&ygGQxSIj#^m%8i;In#OT>I5F`uGZ`|3#8PA-W=Qd{dW zI8j|){j{&I>E>VANsbD#UD~!p4>baM?MbFSw87UT}(Vm_vXxrny~ zK)^7$iHy*?5W%C0Fk%ss8i_FK2)0EsGKZ{uioFaN?LVtjNAwP=KzVm!{mYN*O7HD@ z(^vAE!kq;CxbWQ_1<5MFV_}E&PKoS_?TTI^aj$~}f6if8ll!N$Ic>#_&ZVJC6T3(A;1kQSjm>Fq9rNKl$B0MB}k&S}#@UJZP;HCf^z6(0bJS*>Im(3BX-f8jl@ z8y~qZF7rYx1vD)WX8k%X%|k}(->V-l|7~rjocCbA-QYD0B!*u5K+*5NFMng&jX&vz z_*4c_#kdz8rczFDKhlcpeQy<;T2|cKq5A&)dq!=P3^;tFHovXLT~2Ct7EcNRtrt=lurjFF4kHIO9eK%D--m7X1 z<)qRWPm(Vg@R0HnCDGakpQ8wg;P3go;Y;OL@fXOQ<%Y6 z=bzt>7LBue(a&$ca85!(Pt87!zE_aBW1ez~AEs3eM9sE%#ZWE2&1=R+#7Z5;cZ6_k zX-H4)TI4PK!H+b|!>dOBZtwojg{d9c^&j2Va~&pr=A0}MLW`=R2^X(i`57Fje+f2E zP(>iygOFEN{BNhCrL(HF$b+>5!3OVtj2n!5gZ%&Wj9N`Hzf;fUktmsz$u9I;)Bn}) zXjLYUQt$NdcP0J_X}I8@;03T?xy0ANTeOMC{3etK7H)m_i#0G)DC?L4s*S7Fh*pl zRl~)1gH%F+wZT-o^92-aricj;s*m5U%t}fF8D@g{*k*10h;b|AkBMzQX#C?xK-x|k zt5MYw)$SFp@8<{mFY2myyxi0hwwHkCz%IiL*^QexC!g`)@wGS9@;#3X8OQ6RXd*8& z)`u2AK<4-cD6x@6Ox+=c8w2^uQ~VcFP%!4N-3zt-DPr-5GO4&1AKx_Oe8=ScwZAIl z)DjuuInHvA9GE6y{4Qp&05LTmeE(N38#GX~vcG$0;cp|fI`jcTTTFvGljInXC3A2F z#AyyXnVk$EB3NTZTN@_tfrvZp*s+6M5bfJ<$B7Tsg^&^oxzxtgpuOPdYY~Zw+Z_B8 zL}nt8lF!s#`#ALU$(NAG^wezZ5ui4B*Up`&lA0dz`h^8tf)%{D=$qIjF+=M%=6d!CZ$SGgd7WjEhJvCh&`qJxL(rik;YbR z6tMur>W?Qd6osIM;eXpur=)dKbllEbP@Gv@zW{YzyXE2Zq)jXJ`?{J92mTh#4o;np^zlgvK*4wu~ zKKm5=&jvm)gI`n|9` z-6|&K71K2E(cnLV{5?WRJUEd_?}I!?omohd%Mxn&xwk%WXU%vLm5f!o9Obp#)v?E;ydODMrf&REH5hI}j9t&0NcCOxaGXv~0 zMVCuKo!A#1wobHhsW$+7KLJFQRmL2o`c&@FPv4A9x)be6!cuQwc`Qsv*x(}!3*=kQ zUAF_b9k#8~9JQ4Q1s=u9AAEiBVQG(2#t$3T-fvFRahx#{Zm?kMg|DXW=h)9*tlN-v z-3(a?bO;f-kd3_sP-Z^Q!zY66h`8Y%A?MFiMF#SOgZUZF3Nu}N6+hT2HMcvy5Z#C9-NN_T^kXqZS{ntlnX-g}1&zRAC zN6C9i{lLMmPW<-}96szG_){#g_Kimy=LfnDU_G(qefa~@PBIIY*`T(DT{(JNgi4;u zotM`Nq1oPeX9+iZbw#c+NAypIKvdHjp}!d_A?D_lmECQ{hzaCXYq8r=ZnIr+)>1(p z2^@l=1V>WglZYIq+uwR#G?7n>9dvW+2C#SP?Aar40x$SyIfYGH z{5YTHJStp#!q1Q9fcEdlUrubr)Z5Y-A9aDsP{TCU-;^;i`FM9{vfQBA$M1uDwYrjLbwW?4r*>MWg6IV#_*N|6@`QN`EhYfp} z6)lglu65^=MnX8rT4(Vz4!F2{5d$#O<{WFB$MX;i5a1e5OtEtidq|nA?J1BGVyS;t zN!G3QRMce4*5WU+EPaP~zj<84&wFc1I(8JqJZ<|!WT?{`6fp0v{!xD>)cQ7bk3 zL_}4{$j`008R;{{u9HM?smPJ;ZJ9W^(}62jx{K{5Gp9z(9!E6Wo%7B|gDvFArfl z`oa)Lwtdnx0jZqiuWi0Zapxjb$sYF;nd@q45KNQiD*dE+y|!xBU{_OceC@AVa;9vu zG7E18)rrEb3qNQYJH)Uk5UdO%G7nQy^t#qBPi0fBRSQWo7&plr*FMup@F{Oh=X!i^ ztyO(Nt=S&t#8{7Z5T%n#lX+>}myqF2ny&Gghc8Z)ObEJbzE!n)yt%8|xM8B4*naRWiY~QQ znC$S%HqCK?UQYE6WFgO6w9$J_;GbDxx{vb?o|%;uyW4AoNsQQAIt*GHD4YH~a=@=r z3w*j3jBU0^N{+rr_AJ1P#=fTPQo<%!``6cM*I8j=IMmeCR9mk&t6ck_ZoE?0#@#?f zvUT?9K+IL;Pxt5L8}ry4_$neV#PhcDIpUistV3vAdU};n%%U z3ZF1n3iGweDvT<&*CeY0pe1W6$GkvGR7DY2fMT*;hYqQPspDCknWQp1Hce>j*z7JL z(PJ2{Tt$L2ZwdUIqN<}~S?Ho0!y+{~PHed_NOznhTlFbI2< zEpM-xP@{WL9_zRdy+rydK;pcNzE-wZuZ?rx&J8y${N+~cW0Ej(`V43Ijzc$k$alLD z=WjZ5gtXDIA#q_A~=eruLSn-S^0CP!wlnF5Mwx9Ri`MA4O z{h*7>kW6#4+<2M2{C?m!wO@KJig_=K1|mT)`_ke+k89eu(~`FRXW^51#IsGyKfN?# z^^!3Y)J0P~dh;_MPa-7aM(i+Z&u2ac~}si1PX|Iv#VFPgnmYUtJORAuR=p}TiH zH7gpjRAcQE8@|s5#H$;#BG0ZgHeQD{2Yr|0uRJf7vaY>RuKqG1L0jss>Fl&6^TxQe z;6^e8LKaDN+TA-Gb80y>oO|*LemlHat6ZGB4MCCI+X=5xl(#Fs+}U`19sLKR-WO zMt?kDpJirFdg+KAh04&Ob7?l0gKRBut*fg`gfzQ$qKsQ5+pk|ZuQ3Eed6gB{PLVX% zVH}_BWOR`Z$h)#MKR=L3LN`U!5qr$Kr8oP}i&)h!@kJ-e{X|Q)iXJ_Dc$5lXe2n5k zcjYBni;%#FI{c~#X0=R3S=l0vry1e~Q24%+tR`mu$bIfHFCwlsM5C#`{Wv_T=z!C( z`hY15U?Wr^-31rRsJ8Q{jwVmeoVwoib`me{Xu@^%-BR6wS)di#R{GnvU1R^FuVS!G zVNJ#l~rCdH<}hRjSg{smg43p z@3+s*Q75XH#M}iB^rO`nJY~c*``TOE({fknM4X@mI}>KM1A${-4TrhZ*n}E)|C%(l zAGryBl&FQMkdzt}e`XO8$87Fh|7uEU(4tE-cx_}Z8X#r2@d>fxE55!AZQiO~LDsF% zBXQv`Zn3JcW51~g$QIJA`j9Gp@9EZ8FAZ9>nCq%!8Z>J8!@5@#K=WO z9*N%)s5yolRB(9}AE=#-OfsxKi_#WrH*LN5&hP0IsXvbUv#B`K0Mn~ztXj2fSpakA z&76wT{GLtw)@zO2GXL2`ITig=iVbjqlec|BEd9`??&p@5=O@i%tkV3(mZru!%Z~CD z*D*u#=ga{gENs!*!JlcLU_!r@b)8-BRHof^q#6x2XPB@F1)Rp~x{w8C^T%eU@^q;8 z-T2g~se&1HIC$vLH?W0o+3~(5AI2E3R$ZO=6yaMDJ(|+fZY9Md<7!soDt4@qp9^HK zMNpaSRDXtM+K)j|f2*%$re0-P7(Dvg!mARY5;;yhoQ2y1V&Gv5-srj%am>6&Go@qM>!Z4|#)VczR$e}sj{6&6RWEgW zcSOx@Ip>)(o9XMIra#Fl_cgaV_w(n|YkE&3aTO^M*Iu3(JrgJN*92zq5m_Sh4aSa| z@rp)6Li|n}liWWfSwO>wZ=9ZSCwdl`oQxm`0jzhG+F?M{(356e9*F$j)9LDLP zz^N!NPd4{;458TYuJkQ48NWS87ueT>I_4tkX_V4)IS>m@2LIumnY(eC-rPR}GNqyt#^hV%^t6=K!4+Yz5T z6xrN~`XPtDR{Ye6Xw|;^h9}1hy+^N&)^1pK)kOD8+c#g=9hZ^M_gEehL_C3-aR-;* zWD~X|@Kr+ilT<1Su2!1aEOjs~$EvjDv)2i*e@E%ZD&5P)62G<7cIg!H^J`1Fv{=~( zArRb%p7u}$4=of9ChMME#Nq~OQ{)obs0Q@#xb2t+v$Bj85oySyjPHKBN)fWLA~(Ss zG$3Kp6x(m-b9efthi24G-tl7Rt;j&%&Q}d%!x^M2yuHlY z+M*_Tk9$#3!91hMJInSg-o?E&W88{g<2EeHUKD43(u-#jaEAb|q0s|(@n~mh%#btZ ze_XKpsBIM^!>pMfIB=`htwVqxWs^3w@W!gT(wMEo5sa&XA+deB8-Yx6wHd#hH zDj^tagULI-2T|XDd#W&`;Hkoi(!8u&MZDkWUX2auM#g!0c>&1oH*tgxS#8=>q-FX$ zCIKTduX&!ic;vEzabZm!Q_LA}bH4id>JTjDtLFCX+6cksZq;6$do_rSY}zHMi#+sBdUUqi-=V z3M|ejd#{^t&pO{#l#rw&vUdqf4;X!kI5>1|w%^|-2Q{7=Fq0j7s;b7( zTJ$1mgk^VHIk^!lS8ySciz4D{%qE$w!$qK7bm`$Y zPCZ?n&j#s|ll@AE@&yc|ZGs6rxt~5=(x<7sPkzO(^pc4zz7x-!zGnGIT925K_ zZF$oh9AmHWRg2z7-LwZF6A2K(M<}4|#>^W_d#&%%Gz&35AH>tCwr~jOy9RxB5YJAe zX{spc0!i5Nh&aQ@4Z*(7KB0uj#PsxK=$Df}Jy1C3Q0Aq+dk6B}=KSCVG|Z_4&b*S6 za8_joX&vc$ByPM$&8L~b6&9Qw;-BaF^XK&$pX=CX;#{^is0I5{(l79tI*Yb3l}kzi zwAJQ4yfwVsvWD7@kyd%_cJ1EH#xpI<2dwPumW$sQv+LN{SBj@58%M_kbAdK}eyC{! z0{9``*%V7({k_dwv9;Fm)|PkUmo~5;cbiD)@cl{7X**_DPbJU^;YEtr0QQKY3|E3SJf9a#lPW_V}o1!(%}ls_xg&S*OOh^~mw z*=w*w%~ZKA&&%|dWwr^Kcge0Fah{oE7hV3E*o5b)|Dc%@U-we5Nr|`bb6{n`L98 zzjA$>W|I5P$(RF<1D3_!cco=a^60$Q_nW#w{$w!ZH+IMOiMKXqs@;4fO43sYk&`a~ zB$-#S6MCj9zRB?_n)CSkLG$sO$T;+8>&EzeQ!?#1MM-+d(!@nRa`{CN+tH47w?p)I z&Dy&4ms-6;i`E@RDISQaRgoE>yes)f)#cJQQ+y^|tzILs$qPK%Cork4gsJWdiOG*iIv++fWP5-w}M1F4#M{h1)hjma2 z#N^u=b>FS!R1L?@%xR23NO?#^Y~>|af?y4lCrI{qwHzk-PZ4;-odK4jTNyddM~Fy% z$V>_zwz3qVHP${hg1$B3(SFmd>*XlRUb_uBt+MFiwDm61jhL^d@UkkY1wt&|G?^Zm zGU{=|sar9_lg>9KRliKM>X>rO*VmWd5(*lozPv&~dYiIVJ0;N9>B^mt_QTSOS>03h zxQB1zqep`hTHg11N!dzCwU9Y2;eC@rlPo7Me>UVctlAsgFNSMd?bxx5>J7h)t2DTU zv}KcV5|r7aypv_qG}J%FS$`egRnp8%S@FMLPZmYT2?foMK`-9DGg5GPJqPeGov+N9 zxjX-8r?1~q@)p<@R;*v|((F@{jL#%;!j6ujIE2%Vr4BpW_qnrYe0;oOFbC;uAMGcb zKE^}=v|M2cJFSxe5OFI0&r3GnVGI`(!dF9~0NtuPbi(HvU>gsHk2@Tziyw%Zj90^~ z^Se+iSVLwUYdptOTbuT0F22m{X{a1>1 za{Gck!Q|aP!$kF(nhj_#`^O&_$v{JyDLC?T%d47hti)Tu7=hFua3*x_>4ArSojiQ_ zb;*Z&texwtox%x`?b~D-yuaQ74vu4c-CLPezt~$C!uiLzhr7qkr z(fNQH>eKL@s0CRJL=eC9vX;y)d;4B}>+FubRRKPjx8%4*U!#5bu?jv_YA zH}x$n@1wobS;%kbk-J@WGbrtxpgyykzfDKQLWrK|U2m2{w5qW3L|UEoGd1IrQam?xC5L;v5SQ}rf)sM~wdgOi+1~yMhTVRyH;c zN>2nU;X_T`Uwg7u?qTXRRc)0eS8Q$!)9}@FHbFYiPK~MGKeQgDuq-z*Qhr+?hTR6nWmY9yw3#@}A34ix`n-SuqUk?+6K=g8gw06!ia;I7*wA#OTn@Haej!=9UmOP#v)z&5ZAXU@vA7mCN(Pq z2BMmY60IdN))TJK2Mh3GTXcHhtPbm-VBgTRj$8BRTo%&~NY;q2+v<DH4qiE=rbAHt4Ig~I~%|C%V zjb(99tClsrpMy;^Y2+u}d=tQ*K4Kw%>6l-$zViUaVj<$^VaZ9Z;&)VH@g$<0_ZahV zZMB7lPn_}gJ<)UY45-F&Dt6>R+KF+S-;Tm*+Mh=C{kF|OJhN?iEI!{_-lr(o`0zkE zY>wCBD0W8cYI($u@#*Dg3eF(JtDVFNm&D`TJ5#1#AFJI#HOII4$y`HRzfO||n+=0D@F z1#=!ich?z53ERuIPmceZP7KSaDeq?TtZwE;pG)cKts7?8ltdPQyIA| z>`YvJ#W2c{LCJ4l#Ljuil@g_9hYtE@)z)=&yy9QAa%9CW-;}yWp2RrE+OdyR9Ax;m z0jCGW&r^FaN|~=O@+T%yVJNwKKEKLMq(5`4NEkJ9O)d*CuYk?={>Jdu%d%=Vbts*a z+y&_XHC!o`{o|8mWppA9|7Dpye4vyJ(dtEkNguwxvNL=oe15c3Or0A%a$^A94so~s`gPxV z#;R2p{cDyQca=8L8Lg|yv*e)Ueg1rjYfBx=wYyMJ6&uWr9vs~~34CVkwolUx3=Kml zW36aL);yLr&a&3|S=uxYRADJFt^VC@tMgu6V7YT=+s67`kSX(FjZ>&lJIb^a1u*}# zk$7=LNy0dkf!LFH?AS3z0WF7OuII|oUN}dDq{gZ~z2|O2PC7U?iS~XRH$as7^chE< zOxlvAZyaSct5rMMMddj@R@=7CwRwEiT%wYhG(IB}b&ZUyL#-kCh-U^_XzD^$+h2DQ)W5N_S;y$+OHq2 zldQvg?26UfMD-p`@Y4)kzw29L!?X+PyO(j5)8{BuWkke}7^M?EdV*)_$IdJnNTp{I zc#xm}9U$v@Qt)gW{&qmkUQ!Jt?6%O@azhv0A1Xim>W`}Wq*gylT>N7?Sf6%}{P^hW ztHt(H=ZGkeg1~}>QoJg>YYMsZ&zVPEEL}1?R@48dytm$r4?MTjKwZmOvu8i2Mx`k5 zJa{mGCODX{3W6I4vT}thLI-?+<$Gpuk zY=2B{*cD_7ziMhw+|B%!`J*pw?0j@v%CDC0OVX&Dk5v!ezVN1z0fxPFTxVghpjy^shDpymRMPKKs76O54RUk?1i*H3AS__h@R8^WC zAJJK(z^|-q8&=EOpkS#7+kX@UjM(0VN}Jv&A!xzu7rKUuVKytmR%{pDG#uw-$J$6? z-wv(jF~WHA(&`^Km2`c=xM{PbqUq*&ER@<{d&d{rKn|EKvxf%64RVp|5DuTo619bK zan6Yu)mMnQ!?o?38mc>1(Y9Yb*uLqMB83GA!VD1dQvj2%d^LxRj8LDQu*>4CrFGKj z*LIv}TPi?c%(Jo4VCcD zL&{fo#n{?!p;Z2R#IXeg7I$`b0|9V`G?g(XKhtkdBJTINNN>KWvY__-OK|ypo@S2=I$&&>lH!+ zl>kQqXx~fIDTYR93?#MaZ5S7pJ<7NyW8Z31zR z1?26-7YSqEI8L*_jH~vUR}^JZS*3FoC4z`8C!}Y&0s$b!g_ISBxQ{1qH2?ZU ziabF7LuVea8=D}YP1Z+FwwRG(B&r^uEW)keJ!U`kS)enw$U(hy>bc#egY(v%Irit& zB=yZDeFA>QX)k0&Odi3XYE)@*HA}9R1LOmCtd1;R&#i=C$K~&}JIiC{awkKG>9vJ{ zM-FL45YHXK$(zE|rp&-(Y;30C$Md_#-b$)Zy}NUCW2|bhS!AS7(JYNpx9D&I8v$ks zO2sn1Z#dm$uaD>ODXUCdZn_bXl0aWbt%>?CGbnMmVG9im3@orK*_i%4d$%*cqnBFl zS|Yzb4`dltW{2_}#kHQO%g2#DW_C5y`MC2-M^Rxxp?VPg*>&%`xq$={3`gZnZS?5< zAs3fTWuK-`cBr|A7<#q4NPeENt0Fh~{@(r4m5V2j zX2JsH<)Y7%=nD1~L;N+GX{DA7cy<+k^6GiqL(?^r2l*y0J9U#=>C+^j?b-(kA~J)xJ2vt7;SQtuNJ*U8WSgCj7SZA_z&>vphuVAMcB!_W0I5>1uN}h6-$?mz7O47*2ev01t+pE4U?W^gu65K)*w~H%$W#iNEM>p;m-^ZEGrFenUE>nEsmxix2 zpt(`f_9T~CsAn9DGYMWwN#f@5f|wjejMdevAOCLTKu?MuaRmhMN3gRTs%e#b?WpYb zRJ}U-%2NuuYLoP+xjKfWp92Fj`UK#I8!IRYnsdLpi4Oos2S1LG zJ=1?swnEAm`ER5N&f;?#ltFWx%p>)T`5vO2r_)^k3N=0~x_YejS50-_U&200HvXX1 z8j+xW#pr&E9$|D_pU-cff5Ar-@{89*-@JJeTy58pYe@^w(*elZCjHt z#CNEgnjT?cIY7QUk~@J54w~Izf`ft5I5a{^%8ip!LYG^*X{D*HdmcnnHG3WBJCuoT z*30OMBTe%znz(kIoWh_Bhk`!Ry^l}TE%=dnH8!9|u21i=8_M*jTAZ`AepMcM!2I=_ zBkqziwY9CL{e7CJd3OEdQ-o+0{NEEK!Lk-{k`y0DR1SXJG{X+2O{d0q)x(jk=sqc3 z0_lj9Cr{4G?QxD-NZRC!i!(8AwLysJW}OkbT$e+pJH7<;ib$%P#r8KO=v}Y=_&!p8 ziVdEhH`lXjYC$hGvmkI_MQysxG=SJDR#WzRd}h>FGGni<8+`iN)%&i{R;z9G{f%I6 zzEAA>rMOsCI|M5n%FlIHF`N~VeDK!15YpJSYi|Lc73?^;?z#J7=z;~c^NMPC>m!B? z8KP<$w^DREK(zYNHib6xYIkRG-#8-&)|VVrJJL{Lcr^QCEzqDie2aG(mPAFKFPdc< zk*c$^`&0ox3yx^S%9;sh2l=fHUhF5t-~qU{gc7l$cm23h@-a4)U>ItZw_H3QDyLus z`_i0lIbE~VEsqzD9&cS5>t#DaDox-0cIV2%33GyzZ*Q4$b!C(uqmUB}AOA%2fq+jS zoX2kmynI&eQn~Yx$=yGiH1w{onI(#~+@0k6CWDt-d`GM-8&3)F`@Ej)*J_@Q!@SJ= zNg2l+1U}HMYwP0TVrl&(6>95f=cYK~S?;%Q-rvvoJG&K-E6x^_V>htj!9LTDn#*J6 zLayjmI!1x0NX^vpi%te0j3q`0dS*7H)ofl03s4&wMZl{l(POjI$Bjs(C01-Pf^ zE$iN$onwb;Ugmv2U*B#CNcZeKi>Uk*tMDF#+PHK$8Nhd; zq;kfSsTqch$sed} z5$odX>0|9KX6`&)TwJ!kzk3M~Rqzi|f7_x)F(rJk&bE1XcW7T2GvL=4f)~WT zQmE2;MRW6ft;B9$rz$Bu37R_S>yWEHaV}uqtLHYls`19RoeC+fP?=Z3&PK*wG z8yKY-fxOmG!7Vm)0_28H*efvn8_H~xT42N#}JGhxC!^J2oRnb%m44GKIF~$E#SeUeF zVtr;>lVZZdhbjJHbb|I3iYfk61JarVw90t1;DKBIh@x$IEoRo!FtB z+JfhE%gR=t%4`^X=bO%&2KA&G3g9r!rj^4HJYV2RFt`5Z!G0G3^{N`&(4wl=_A0*E zO)8(Vd)zg1^(1xk@E3PYf=}yDmC+WH0?;DP1Fk~=YlGm4j)YKallyG7=+f=0YL>>a zpemRyun0bq05is2oea9Z^6d+cvw!t_XRnezyeHd+2uz;7c^E|o-n(valQ2PR^(Xjc zEBI8)dzTr`FL6}-d~1_sQ@!@;!m1a#E2_p%oLG2wOl?EnF5hZx0II;l36wFCvu>QVd_jhha093j~>*u-nQ)&=aec@ z?vFoCg=pMdmw1K2a{Z>53g9lXjiI2{4|f^V@rbhwsxRYTb#=WxGT**M$#m&kcGDoy z4`Z2=Mk0y?au;P8z1~thng$0r0xv#&(^b0EI?rlhT1~V5H&KH9eLQNCuA?wRUr(Jh zPS7kgfeXBx?%C{G0$yRU;~vRwo|JjQwH3#9Y18rBNQJ%4K>CCWn$8QslmxA%80=Wr zN$JQj{9&YubLKqNzv^(t1ZPx5ZC>aS;Cgz~Sx%N{J5wsPhfQ4(R1yzJSu**W9se;Qq+ei2NullK7YY*@C>0#JaZH-e( z$i}o9Uuza6$aU>1E$ALEbHq6~vvK)Rg>2eGTjozh1OB*HrusA9vYVv!J^Jj zB(*3C0C|gKK@%OC@<68!37W-o%sF3Q?8tE;2`lxEcpSS@#t_ICj} zYPR+kisGd})xykDoEG@@Ly8CUPmI3l(>@^~?60CbzkF)a>6Q$E@n}84K*DIG1y&^W z=dGSiefg~J{(JKcYXAf;GmJbG<|Mwp;#fjCxW;Q*E)Vo^ig&&{oGw?|ndhM*^+)Zq zz9vd4U7S?6>}pOoxxo2nH{Y-_+DAPPG^(EFs5I5C$MBk^G-I=$3V|Y8qTXq{O=Ln# zG%G;`?5!P$Qn&O^dp?8;rr* zqFEH66-)HtSR{AJTMMt^8twJjPiG(be=A=)5T8TuEeHFL8^ zr4R1XWI==MJ+XWUkxrYY*Bw4A7}T-}w#x@2YWc-$g$vN4`*3pEvhtb_w}+8IAgB zvrDL9gw8R+^(A3R=nV}BQa;BaA#u}5Dz(a$p)LN;5f)kwXwYyz z|8U);u0V9JIe)oa6Cu8tbJ8wlus}e|hrJWZDtARcMIm703e)%k9D?H|n|WM`d~(Jh z>0qu|`bx#YSF6i@?DWZh_D0~HLKcgbh6X`ug=A|(h5qc1ZN6&E?B=FwG~SVIuR@Y2 zZVnV-+SNL5U{w)%#QT<3HrB{=`8iuA;VJ6;bO0>H$Cm01n+JZsw%Rucd|PNr1^I{m>KShb&Lfp`uBZ)?!`U(l z$=UGc$_WOTuR^?sl3@j~D=>C2ImAjEQQ~r@PHX%!JEIuPho9`+cplaFC2m{dn>R}^ zS`&;DjlFL{(%!yP;x1tq3qs|svZ#MNk9z=fHdNsTjB*IMcL$?hfq&gMNO2W#QgYa6 zgS1`}lV$%U@f+QQj>!DgN=MAfi0!_#%j@;H)laTDn$CU>4;P2fS1@CsP=wbZ9iMUl z{ZDGt&Skb{owS(0I~?6##!#z2wGltzd)Tu!$zTx(Lv#Mb*3qqlUHf@2| z3ccN$?jwv1fzUDdkiuYTr|4pf*-_h4W>~KJFe<@x>jBDVC-ub_gEUB)Kw%F)M zvETSy*MDql9!?w+g z@0m}IY=_%p86X^g~G^jx`2lUZ^ZL=xN|(|0sKy ze$XnZWJQ3^QV7H9+LC*vk-*g?oTP%C^x0Lv@=g6GcS6rXc$;bJSmhy97l^13#ydaV z0N@FHg6^=fuC$0+pD=SC;~%@3Q53BNMfDFcyJivv$4{O^yu(!~Kx=tVo9)|^>HIpr zlll9+a*UYnh_pDDTmLV%ZJOt&ub#SW9Xu5px+&ycE^W2w8lf7p;+^A#Hn(^0Ay5hI zkqE_9N$E(ZT|c6c7%6&q_Jntu45c8u^xjMmJj(T|)qd$k zx4>l&Ci`z-<#W4sM@u8Nf0-S!;<|M5j^o+QCjmwzsW;Ni3ehB+594i6n*B$a66dgW z+8N(vB> z?@6BKkva2qGOjrMYKNF`IZ^z?^EXyW0iu1i4^Uj)fo=`PAQ1!uq}_B8m7IvQ^l@U$ zA^En&k-@jB#X>LppAO4O-YR-=+fGGxB=Z{E8Pdfa&2GYxzCdC8)B0p*aA(D+rOTp~< zs{YgfLiMRs^+v7f>yvX*kb(`60aU{Z{R=@l{Sv zZZOg%C@3x7>zFA9NoolQl4U`v6|*wdE-c=be;$;MeWtMx5W7bM?Z73ml>W=H_p#&0o~Zj+@#fm8K>g zqh!;g*+!|(p%0&R&xT0Aw#rZ&P}FN+u;}kEM;E;V;XM@G;FqQ zd%dq!yakBq_P6*+6#gBWx^&`>ILg7TU zdP#eYiQ(6G@2wFXSm3@zx4QgBsivgt#`VLlu16EU_y4;PlT51+N_@7EgzEZs9?Jsl z7oCPI5yE7Hn^$fCztau9v7KV%uNmIs#^jRK{{G~%Xop`ncuVKQLo=G~yiS@90t?p@ zSSZ>pvmFy9r#2?tahm#{AMtD(<+5SC(*??aROo+X#s`H(E1EFvT{L`n0tB+BBJKZU z@4cg{I=B8`Vxoz$B(e9FZ2=2*V*@L)X-c<(6$LD@U_-XQ;>+n`xi;M}_xJG`C@Skzzb6&^EP{wpUOzl@>+ZC}mMEowQiDc}BBYUCZTroY(j-K60b7rr6n9 zN@+CrCZaqdfGMG6-i|#kE~%U!ub8a_0Tf5w(Ob`b28SzhvS$e`ze{|+x#yXjZcWtG zCRj{q)Z?E^`~2To`DikZKKJ~r`ztpZu)b>RDcp@0-9Vqv&Po6%t)_n>rZBI;!AQvYFAmhv@ zppSa!*r1#(nVglS;8ymqaKaBLf@r;ji?u0jjfn<8LA_5O9U*-%xS9Fs{MH2}}wcC+9dnF9p9k6`(JD7!q}Jz`w+Yk;0!~txzaYFT0&N<5gW#oJXzA zg>r_*`-`z9V>N#9c}!@tR*6CiGNXwiL< zkS{CEAJIu`%T4V&F$u?hbH7dXGKil)6SYWMcjp1aqnwpv5R_7s^;gPWW$+X80hat! z&US5(Ic3^3-i-d{bNc?v(J8m=nsd{p+k(!b!sT1d;4v8A*}DpBYgGPk-&F=ugdEX! zzH0pRX;h9|F^(luU|>BJ%~=V#V>N5HSnkZYf8fUe1>Ccq&N;}+Pd+(DHm-H(yNp&p z>DFy3<)P-LjcrDpDGtD2WWgEdsTer-@(kwQr1F+=9{Y>cKr^=bPd`#u4^d}{pT+M} zbb|-FzwNokXFFc4c(E3!WO`WihdsEk9e6>7P$5SEMl1w_V56r`o}js1nR0$~>*NCFFpb^ZD{&QpIpMcivNl z(!=9r&_BmX{S{pc*Hs(NKxgmtuh` zfK&(nIoYp&-cYW4_0N)Hnu?YUZi{ZqrrT^PDsp=6RQ#l5S)Pz~hZ34p9Y>LW0p%b> zIJitY2-+qMP7toIqe(`5ydE0n6w$D}e=!xcMnCJTTSV_lk2HK;?)OsRQyvOOf_%-T zQtk(3^3wFn++mXu&MFfpqXt(p;RCm2GRI-7fmu|TA_X2bYLoy#>K2FHC#T;Chb>sn%U-P<*5$*NUhNXhh7fT*V_%2>Z?ylN3G9H<<8 z0SMp-^LL(iIc-m<0B@tzo-Fg>?u>NN1?Al7Y#C%?UXQ1*4zRFG{3KE-0gri+G4~F3 zUzK?wuJCGuD|sHf?W+mH20(o4vU5lC2%sA26)5SavD0|a>d>|Za3Axaut1w;MeduU zVzUVVW#p=KRgJzZma|7?c6R*$h$|R|DKXdRGk8fphA*V0l0)OZ!EfJ^S$C37-zVuP-rs zN<}E+EY~r{Knw}Xno}aB@~3`PmwOAwC)(!fDj0C7wH0~yM`b5lT01RC-{g}{T2svj zef4?K8;!x9+!Y9M^3H_S1{nKZ)n6Oi;PUpHA5dGi6WLKbU<@6)F>xUAo|<8U<~?%< z^D~YSA;!V}u_uWpQ3o>xvlAA=oZ(AuTEkARq@|+zw<9V+$ueMBdHOC|52B_NbCEJy z`M#vY>}h1FxT4Hlqu_hFY{TabuK&$AP?KLa!J|67} zYSR}ePr6bB`6~kp{xUWLP;?6kS#f?z!w+z97AL^1CF{S}j1oKqt49(}^Xnt+gdBTg0E7a7Z9@{LY((2LGth#ay zzp4La)#%L~_qf9Ew|QC^7_76|_0DI(;l~ZmLjKyv|EWBjuR&h6uw6tH#23zJaJ6dt z6|Ea(&gx1ZyKEF+uHx-Z=gn|pczM^=*A~MrWU(MPb)S(JS*|n%JS8BZr#d1 zXla$y*Qa^P*y3onw>1raTJ2b?N8fIvgpg2kjPYL%Uy(T+W?XOm`Z6Kzg`KFc;UKy% zkg5t-qt78M42FX3^7@C5Rde7fQ*gtXgIYB|)46Nc5cH2c5F-fTVJ_DJOq}bA0zfKA zdY@+Fs!d|en!OQwX0p~}6^e;a?b?}vV8s2P#Hp<_yjEQeqOkT#b>g5t zHQnbF3~fB8DyfXgUw7ZqqyB8#xbZTrh3}|m8z*ZW=0gh8<+AAU-|j<)bwueq1FLC7Y5f{a-JmB;Di`pV90gQfQSH@a7sT+ z%$OjP_xpJsC;CL%A;AUtd`oA}quLS!r*Hs38-$8ir(eTToeWzhB0)&nQ=1EseW>r9 zqas0P6ED+rA_P*GRXwi=*}K6uPUR2I#L6J(NHiC9*j; zpc1&lsBW$rEXj#(2K1Ha~HI$K8)*0WUI`;D^_Um+j=UHgkxki_kAZ3ipK1h2qWCfNROkyX($xv8r(H8VX+|v4 zHNlzbLPPlb5)ENO8zz=~%C3BBbQR#VB95|0wWE(wwYuS=2B-Tr&!lFCYD})a(6i~F ziF7^UZ@keiBEqPbHOG#f!+H!M zrMV!c{8?K3!82xoGkS_~nAGI`#?I(& zJNumJ7#S6%uObfd{@#HDYmPzoTUl8N-8-Dmd}IApmE0O$1u@``Sdn@2fuJ-!z z%G%pEr|9pob{ISY-oPM!z`z{0H^=4;96W?pBk^e%MK=>99IzR{d60DryC$tj?yLaaYIz3iY^yEkNY1O4XXz2|={H z@mN53H{;GmX0cqvo6ftQkKq3P!^m#kx~cpqA#>mTX5!%?tla})l3zuE#Tkngcpvluc|3ocTo!P9`3WchJMw%~emG3UWy%|V{B@$w z(hgO$rKT}8ME3vNuf=UO*EPOY@iKTaef?FE6iU#zD&NPgTNV9&=ZRR5&QV z5m$)9mRacPq4^v(T5QkOyv}LA|8N7#xJdSLg2p>`>=MOL3$&CI^y%y$BrEf|>GwqVd;X--9GT%&mWE9@{)Tk~`0)P2vG#2cL19PKs-9?AUwp z@fx=(r+=hNh4b#YVDOdIO!A`IJFcjT_a3{Cmn~t8v;1>k--C3{Z5HXvP!-s1_wcoY zzOeyKB?+ zSG4l@?YGINt9S({L)80t^}dysR?+@woNE?7ud=dF$?J~!DMme5x=4RM(Q>0AZswdl zcW#K@U4)i{NADV4)5m-ii+^_?rJO|G+M}oUZ99ABOvUIv4IabYJ@Vrkd`Yc`)Bb;{ zCqMtmgmxu=UQ)BVXm^p#-a0j};oq;A?zo`oHYSd1=9@MAlj=9;{)=w<{719?2a@G~ z8C&yzzEQ*bFE?8^nJsICbL|!=#h7<%B^dy0GXr+t;dO#-c;+#JlF;y2GEnTlBQi9= zb>`v>gwf{=?E$_go+X;yJAQMj23!9E1gkg*HnK@M2+iBxuF`+U`O2+ z?DEyM=1eT#Z=SX$R47H-#C z%TA>KnIbtp;TN;MYE9s#Jgr{?e9pCd7QF-cz$v|hCO*{-JBm8%{c49E02hbRDT((6 zR>u@jTqsR+UbX}+A_Qu}mGqxn5Q;alzr_Gg(09;t;LuT@sv5+j%8$~gj|M(lP zuTg|KSHF*fhCe}Vb||e3Ho}4^jmnZw6L7)bJN`|B61GRdk6#RK3oX`>-vt3Fhq;Y!tElvB{3@+sU5FPL+>4Lu-BE%z;+b0Vt+UeTOS_askhIl4|&-4{g$d zOz+Gn2UxFscjG&9rj+5W)zBgxD!klUcz3MHX-o=&Z_5t;>Kgkwxw>vDKXzwnlT{^b z^>)Az0>vv$WL%BR&VuVV;;#<1H)!wz?msxo29WGJH4k>@Hbgv50boogVaykZHV<)I zE_I0+pZvsII>99*L4K!QXrFqA@x%R)_7!E( za6?N%0h*WUc@7Hk*?MGI*_Z16tLHEzkrqlQ%6iOB-84P8wlzLBL%7xq)<)_D+hO9$ zG^`n?xnaY;m;DWjKTUce@9?(vlt)Ga6Cg2kw%N7t65)FVg5ky1ZAJDetu z1JqPy|!D`+?tZYPkV8Uqzs(63IhjX=zw*3&FXiU z=S%)Vs0rv2xZs8kOTeRL7v0KxF>J_51W2KZ-V{TYDBx!*y*&OMbsC76t(CT_#}0ri z^&x!kZZNcHmZa&j5o(FW8dpn4)NBh zQQi*T+BO4bKJ*)~ATE{aP#P~RXt3H7PZqJ8_G69$79Bm4ooSe8kAl<)iRybZQWC5n zukETU-V1Rp>QPXU4y9m$;mV;_dO25-6W9dGv4| z$=q?>Hdt#{-} zloH}xe;>CcyyMI`jk|$+^$-AAWuUf&Y-~o8^paMD*!1{g zBFPyryRgid>ofZFvHe5doDo~AXG)k#(J+^^xVWUV`3u(+nKE}%m-FBNjWc|;V1X!l zm7~{=@k(uhvzuOpHQ#Yb;<0%`mccwOG3yJFEmuSnDuBJ1EJ+MA37LJnR2mMlI)hNV z0u?!kca@gdysWS#8Hfk@*S2eF<+GDmC!f8yzDF{UjXxqjS@Y)$KQ(c0y z%ee9SfgEY(75K(DD!3|0Ah9s|^YsAV%znUSYO>s*zXs=lP`GP5DV*#D_i()~gdV!T3{ zY61LU;`Cst5a_*n{pt54J6rn}gX!5h>tc^tC3UNdrPz7;^2^zu-?QLB3%&?&XE?|t zi6MI$>Du$ebQRjNw5v{E1G$*ffLbycA>p(aAGGmT)m~8t-tD-zeLb~m3eN?<+=bz; zt9aU#uf4)(=2!H~;#_YxuyXRpH+34+rDCh*{OP#2Z*>ewmvLn=)I_eGO1&49?-v6# z_L$SgH-;z4+2l4Q2Eb(*nJGF&D3SxPmfP~>sXDb$S@Arw;maPX(TR4BXBnK9s3h&W zan=ya2iwFhGv`I@n1(@hMs3c%sZxIs@}y91c>5&Dd+hs9W1C)?qJ9ze+m`cdfvJ9A zph6GdG6I_7-;b)oi!~X@eiCSK_AZhA#_;(hh-TjIR z-V}2_!uWu?630oROn@&Yfl?AqF$XM0NYC3+aL`gi0>r6Y51>9-G_(#H${hBuJ`W|x zWNLc)NLrWegf|Cq6#Ga|$OMBnVO94C#2eNH=^gKsDGN{d6u?-x76UXlgSUMD3?@jv zZ96=2qgKwf{96$NktS#$Xy?LQP2c>HcBwPzW*=s)+CWC|eWt~pLUe1(!j}z47{JgR zBaH(;0|*MV%Qv(w`P1kR3_ZjM8Y21?D z6^lxU(gmZT>T1>7vA&U#$Og_dL?eo%D?}d%yKhKV(}JpfK&@x&Ga^c`T10|5oglfVHAEUhX4jlc$ zOOx$8@Yd6@yk&u+suIom#&>sien32TW?s}tQO8hJNy6rcWe+D%FQ4Xi@!KA^K0QKw zDd-8hEthsNQXyd2J@|6z@}{C-2jvF~c_ZN^Iz?F*Ha!ij+1a9?ZJRcJtm8A2ca3WP zir2{mh*qk0Iol~z&48LI6R|-p_T7E~Azpu2T=4tm)_xB>HDlvun%ems=Jjd1 zO#*3roCl38$%@{zcKpVlrMn$g5`|HNP0p4)B>>j%d_S#X+fAxo_2jZK9q-X{?QOToUZLylFjA*#Yi}$9wjP(WD(Wlq|An@d*R4AD> zl1xpEN}+qq*`K74c^*56%9?F9g}`YkUeN{-kui1zY1bk1qIAHR((J=(qD-tG9DP7N z>?xuye0}|?2gwJd-!vu1+n9SsKvv8k^{vfzlARie*G}S6&>goW%Ssj*2-D`uW*$N& zN!=ehFWZ9S-5i4`!v^x0w}#rdyAVZK26P~Ev)8&hUKk-K97_F)O z#*DfBa^|09kxiR!dYyW)zRSpYS>R~O&_VJ&x5JRBBNs1v96pUxH681Fn!kQu9{WUE zfwZvL2N_H-gBEpJyy)t>ypxI`wqKoB^jdaVm%NcBhfpE<=Y@y!Wu;1XTHiJJXVSv5 zujT%6e)knjAAS{!Zw3HISn^H}vvV$6Ufu2r1sO2WZJ*AfX;h)jYayxJUB^V95RM)z zirwQ64zhH~Pw{kh4WU3dsCr}Tv%h^R9-BUQSS|+fNO~6OChO0j+muBhtnF75X#8Z! zA%;mJn5udCe$v2dYqJvlvNJClR1m&Y?QZ@AUi5V|_P^v(r8-<`jrY=lE8a z`f=8TBRO4Qrv1}TTWeVp6B|9RYcDD1=&nWf1LYJ*?W7Z1qAPYjOmoJdNG3=q=gytW zBxT7;7^S0q5v3HkPEm5u&%-xtaF+_vvs9zfrRIoL;Sc=I;<< zvUJ~@`GoVRC6ZVIaNQPBKqS#uIJ`f(@2K}$iQ|`*;aD8AYIrDRNPbNDLWq(5%R9;v z>9M-|mUjZ(WUq>0cHumx#8H#5nDAn$<=Flj^Vc31Wc}HW$p1p@xsiZg+mW)y*xlU@Jwsq}y`l zr~4`0nrAEI5&<&@ume3o)2yLVHbpp&g4+O^C0&8{bvMKYcnG`{o2-H&*1Yv^^5C?@(NOiL4(B4s$n` z(U5o)hWb9Q3cGY)#Be!Pkz4B@e&|WWn(2(-bxvhA$LL1i(>m?=-61n2$!&C$F(FITqlwapRWeyk$mZUF!CxJoX#V zbI5QuB$Mh(e?Emmpee*|ZLp<> zUX@eH`5s?9G+-khI(y7ebx_X{aTB&CIovzgKR~<)r&lgy!wUpP)zhoF>|=qtl=3z% zc;wVQZIXzYJ(@cNSXT!7NJ^oG^QEogUZehRb5C9!wcUJ@6}^@ekuTmFcl8RhZpiOx zyu=MA!Zv#6=H1`w-tOLtYS)sOe38hqWu7FJTM;=X3n&HG^XPM{bDFpnIkwh%d4^=q;@I6=57|73QK{N*+NXG3kHCagl)h>{`ZF&+VfLoYw>57fJXk=m z_^G6G2#HBvo15??a`)kpD^8R6&|*#jq^vnI?h(s-&WT)SJ9*QZrrVnKze_ctWVabP zX8rpYjeWYk-bZPAMtz3SCUtqg74 z{Y?C8y%SL|Fr24}u8L|#0&bj2jI||H)wyn;ftH)2gcwdBau<#^5uSz{ zds}<7ZVUHe0Ux#Fwyc(TKjmumlKq#TT*-M;M~j6G{7}-l{+7qQ>ne7nQHULUS>1Po z_R_{4>Xx5T%{puNqr10mrTLA+eU5J>gN?k!5*oTrgXeD}0WbitCKo13fF5DgfBdnx zk_~W3s-}tG?^|meenE#MMGLX3HeA~Y5(xEgjO<`i9WlwjVuh_lgZ%Krf|9-q9Ik9% z>vs_S@X73lhL67eab#KcK%?aTr|1=LRQtW2KIzxF+$rPpb2krr6WO==DbpI0uC~(8 zA6{;yjQb;UTK#*bR@ zm3-E24vBKE7Mt}e92cI67$1VKUFFxb^=-+f-uXcWhM^Jc$0sKi%4KxQ{24Kuw`3FM zIHa=Bp3W9w`^-H>Bs>jL%89&ShqjU`&YKE!p;?4gOr^??;`a=JTw+}MYdZhJ0rvUT z{mwp$%Y;Syel-RBl$OZ^anG1F3awAcaO4Dc;3eOyoEv28$~6fQq88+L2Gts@UwoQR6NX-@fD>}NMEI7 zWQ!kwuB&scn1~wNv4Q|rvhD> z2ATLD#9AT{EATyK*6_So8c-saBYF6IzP5-yXVai%j4dvC=+beRIfFPjpga}e1kwmi zA8J9C{JKsK@jP7$m>|k#6Nd-DU3nxX$HRgnxina(@46JARb$MUF-eO^OY8mk!O?@I6dOtXoHhhy*2nmOY?OKSJaeALry@470^3JqnaVXwbllGx2>?x@ee;bd+r z1WzowB7aGZB~U<8r9kM6Av*Bk-`sz8snOE_>}|_l-u;UqQf^6mocMl(@;c`NHj6+Q zUM861G-%R}J#l*_l|zEeiP`|vJ;GG7WJ&V7=b6*`i4cA~Q`;jEIM)J^BZ{aDTJSVm zRUW+RJX~Eg#3`I{Cd;x7U|WgkaOME6_^JE2%VF%69W&?5ycu@Sf|`%VYb`(%T!Goi zDN0coQQTKnt+JM0pZJXWD83|SLkW^14&xz1k|YEHJh;V~RGE0QarJbOdeT=<<+wQD z=H`3b)ocIhGNq*bN~DNn;xTAKgTZJ=kFLqhPwOv}6vfm7i0d^X5!%pGL4`Y!cUU5( z*s%u55%$whhte`qkgc2shRG#1lTJp4m7U-e8#k=(egEF+yqvs&DHtgDw1YNn_So-c z`e$_=2^+bKwHGCPI};9+LLh`xZ0)37pY3#YBc%6Kr?m)I1d&d=^E_vnt_qdt3CRsuPI=Xu{CdNHB7ImhK0kLNAeBd?0Fx+*#)WN7(=gxB^nE`y=gycNjBO1)fbE;Ti z4c5``RvE9RL_G7Hf+$!!W|kLaiHD?@Qm5%k?%&9SEJlsPE>7e@iV99qm_~a z4)l~ubv9;miQJnLG^*k~qaq$sGHU)cHHpOm$`mCuFu|xZP74wGp#)zi-81`(lrdb6 z^ufGMaqs-+u4VqaQBl^08Fa7w$tg}(@?wmD`=+n`aH@@V9lx{0-c@_JZV@j0Gz8m$ zn4*p0`FJ#8B>2a%u1u=e3^S_ z9u0_$(}biAK>){SgbTLzfu7pV)fQnuLJY+iA?yKDz-_52c2-UYy1oR|8VpwwhX`E& zN48*Mng=M6WM;34Al_TH2O)jHiGo&TZxt0a<)Gv|%V03}5jzkR&fA$f)2E%f2?F8| zz6$^tr*o#*-;bhS7#JPbN+aah2KnpDDT&GQP>BAIj@8ZoRc!Vmr;f!x)PMeM2@m0-S%A79Bssvf_G!c_ zZI-5ta)PuJ@q>t}reqy4wcL|klk>*sP2b3i#qa+5F_j79QcJ@o2Gu6qW18p3*EJ_0 z6ydA9&WDGaQ|h*!H~wwTzFmk3#vQO~WrFP4LK5p zfLd0uPSGE2R%g)th!1RExA7`6#y-4uzzW*c9SpYKJC^~sWWD9Rf0OTOaUWTkZQOY1 z!y8R$zB@YYzBnuVHMsZ{vcUTDiu3x3nhgr4vv(Apdk~l~A&Qukn)~C$A~zKzgv=z6 zcA6lN-kf5m(Ua>GF`I9=Q>6i$=UqRi8#`Tb+x{S~50mP>y?v)Shwanq)WbU43xSLY zpH+ZC#<)pTr%nw|#E{`HWm$OoeYfVkiT$1E43)V z7ZpE(G}dh5;@WVHKM*-yPH5TauHKW3?-Iq)bi1rc_aHyFGs;i?cWUh-m+JJH@>O&f ztWdjiE`H%xXybL@@a9@TrhND|*e^*6U$iFrZ>#c7XN1~k^gSQ2S`N0UTVTX)sK_hL zm}8%FyM^GtjCD{bg>SmBF0a+(s(=E3T{|S0I1fYpD%$2Sg_@?aZc2f^j)c)`m`hq!DNRM-!dn%qvW_^0=_Ye* z4!248Zf7N+y<~|T8LqCi;Ng=32{VoOZS~Z3_e^d6ln@*a}cwcZY@#$yC z?{4LTed=zHd-nKJYzHWFCHz()xdt#mmh3R*_dG%nhweMv<*$1K`}C>2lG&XUQV0;8 zkC5!+@CeK!R_7sMA}K#64ESZ>w)*mT+W{uA2RfE_+u8OJ5m;#vtE}-FKM1s=LDTv!oqiX1URlSh;!xZ8L8P@GPsK~Trd%5Qs28vUz z;wdsjMkcfJs>{>@w(Oml?T$?xw*Ru{kW)(~p_vZen2L-SQY5P~z{|P%9FO3WYK2!O zx0f9;BY0N0*a68smLM+nk!0o$h@{If-;0|ouFO<|e-V-P=L6(tAW z^}U`#wSVq!-;zlVlmejE4(ukrj3=GWR+>x&$~3dmxmm4$bl^+~9l2sQ5M|5!r%|4g z?Mw(Ex=uZaua!2t$|s#`)MI`hO3vC_dPep3zWR51K)9uv%bq7$G#Ub7!wMIr@W6C6pCb>mX5u z(&CuY8PfMsr<0>IUOyhKn?Ek@mPc}o>SsgM8Mm1O61zE$d9OJn?$+{_|5U)O`m5Du z2#WwTs(mB0y^I6sMo87qpsb44Ki=zfY(wK~!cHTm@;O}hgyD;;Bw*%E3r+pFO0N#} zJkGXt2WBojIJ)WP#B`^Td2csWdblrNXknsU@Y+LP6!2JGkBzOr%-KAV%rOq#8y{Y~ z;+XeusYmZTaqN9DLvf`5HPV3>n?AQR+frpH6iv(kHlRrSEEH&g6q`Y{&08i0a1_#V z#E>u}ptOt;qFk!ed{bAK{rl$@?(=t1dp??_co)Fp?b~h)!K%}L|FL+`h7IKjEqj|D zE;o1l`>*}|pLZtn8&9bJ{kFP0oLY=_V~hGnT(!T+KZ?w1ZJR}lSXlr3>*U}6UK;;= zLG6FfIE(*fM#qHtNVhF$l5KV!2=wfEseQ-ER9y5mJB&dicha)DO#Jb;YMf z@+t>~R!Nzf%kV@4(=7Vj#@?3GqhuC@a>_(Acr~Dm+%;~klCWTHmBTAVPmnL`INOHS_Fx1153)QdlZ!z*l%CNz8vlOKlrO_ zJc?Ra{Ah$-VT|X^4kP;5og6aNaQW^S&quB!&P`dgJ7$V&+c|}g4m@hxHn>N>v)4ZU zs@>W0`!9ZYGA=uD^wGOdG7{zv+psbGP3GY>uf_rRtYA2hF?Yl$-v4Scc8mJU39Gd_ zpYVAj{^ypQ?XuI|sK-bo{|G>Qq(oq6C;CoCBQkD4t)r_BHB({89c&u2Fco+xWc!*w zSfbPUzvA~Kr=vf*xvKOsiR-WYm>5DBPa5T8cILQ$e$40p-g94$Dzu5Dg*+;8q_pSp zEOZ5-+5@?mddjdfiPJM^^3!sY7A+p!0Rm+T=UrjQZ5{IXNz0?cNdZD!$E*Z6&bh$Z z7C^bB46$RPQqJzoU6<3l4&)<{{%#2~agg$D%Kg>@Arvr#zJD-~?1l8D7y~y$Y6LsM zcqdfeDhst9@%GI2?c4i7!=l6;axA98D5n)H!QH!ezq(Et$W}jbO;27si5q1o(2x&H%m0M>vMYo+ABf+9MPn zQF_jjK+OOEL>(0EJ<>xa(s-|+TSTNh9^!*+0R+r*59}&_=lA+?e zedp<^j?(W1qhEo?9H3Lk69d^_3bJoRMU#SGOdOomE7uwDjbWO4ui`h! z*Kt=ai~gfYgZ=HAiDJ$d#}y(Mp(jY8fe|7a1L=yavH-2R=v_gBi)iDAc5+@*DR8*-bSm?6KF(liUL0uOW#y(Wzw`6j^@kiOMgqxhy({I{ZqFx42yuv91n9mAg3=dtx%>rKU1B0~9^OgDToh$HPe5Th1+HAej9+*=l3kQj{U7&dBKKzuQQ@rW z_#-3Ea4frPJ8vb*!HTU&QYjSxTxP1pOFhTvIFB70Rd;K9blOa;cLg3|QbcrBUr~)b z{qtLP0SNG+x6l@$NV!(ncSwPUAJYd2EA9fFHE%#vdD!LGPZ+6&Td?%;(x(jjnC5Tj z1tw*I3@-{yE}&84C--m54u-nqAPHzniPPj==qj_nSw6Q9Pn+9n%-dfZe=Mc<3#2t- z6{_;QziQlAJd*7BDbu<;xWgpa#>|V_dRjmY7b$) z0&@rwE#IF0bP$#0-H-3nejB(VtJVx5E8ef}zLyh4uw7meT$N$%Y|g+$%Coli%lR;J zJ0KoLKN!tJsvEU_W^hh);j3OT?eFYyaT#7UzE`iII)!KUe3dh7L=M@ncI?l~`&qe2T6Bn@h#ra5xZ{X5IE1MmMG_5W& z4*cJK)iq9!8~qqgCoQVn6UhA#yMWC1DlN*IrjnXNsX{EnDd*1?QV>;KDN=LsF#t}S zAzJU={riThkQiX5E?8Kz0oL5%dE6FAidojzNGzeRzs_(zuFg3O4{;JZiuEE^paiXBBYaL!D z5zhEoPGvim*XlXf)kFXq_)_K^%H(ZClQJJk7UcnOFFbL>0@|A z@hQ^nS3*7!FP^3hLCDaX`>^}*$LZQN1B`RFRtB$7pO20<>Th@?m1%6VWlB_VNZojs z!4!*?MG;GAL_Gv|B(XqX9X3b}M6uyRvMma?eeoswL1Y^jO?V;9IAez{eGp8kj5qRu zjpaA7EAQihbfjp9ynLUgCl!{`cEgAj;BB&v6 z=B^stfdodyZ+~UijmLd?=FYyaVU5}fvW~qcfaoz3pf_6S0Q%cjBi`OSXPfMY1Zr67 zXCOfb+S39Y?;^onQo1+6HP_E;qo(+!)o)HFV?OVu?^^ye>eSDA z0cz3Vf8KCa_x{sa=gFPK22V_F+lE$+w>7vDwVB5k_g7m-(7K#v_Md^;fBlWxl;&|G zl6;(3>W2pX>x=cjsYuNEc7DSz4fy`QeeWLMN;mayzs^o*^RH3TpT9i+mwx{d+jy;! z@qgGPw>3Vg)-d)di>k><+tsAZ#1FdSN{KYL17o5=Ua3bJb|t!ZpfYC!(@^31iV_#&Gh>;V{8UO~ zadp(*gOdG`_wKJ7FqAXiKG`ILX#J=A)E;~fM3l6>X-?a2-A;U`wJZ!nz-{{$tjRPQ zAt{ymp;UOEzZS8wz~aasnap%c;!!r1Iwp|>co8W8mz<*lK(`-z9Y&#YVZ(#A3 z#E)!nnP(TbQM=mMKE3(`jaA&T;YTt-Q;(BtWsJyY`nu)t0&ss890^10ea1U_$P`*C zyG8ex7Ct(cd8ueRDlZ9~_+!Ht^C!(kGXS!E1@Ojj#fcN-Sg1vlN+ja+=uICHm}twY zz;k`V&!}O{M`V(VcxvkzH8x{!VxKZj$TI zCo?VN2QC@hL3aM|AtJNIMUEi$z?55LsZCYMV2SV-+DeoYmi+0Wmn2I~5!Z;&vDGi? zMwJ(&dou%ta=ys*HDPS2P=EuKBB$l`y}0C_4MLAx#Cn-@3@%#Wf|=)+gp zGhx7RMbq8mnW3l%f>g+i%{E11=%%3NFGg33q1PUGJKLhXLK?Zbpup%`>#dLH z^ffyA5O_QFw7ESw9y+Q7qfQ1b0sHrkov#zHIIh7Zs=eS1X(T6O;kO8NvrZ!knH{?| z2EG9*xjz>$EocF7oo;I1BT)hhHX#_=$9V;JpPGMR3H;DcDNl)m~Pt9Q4`l5ueWJAwE z-f}+kfpgPCyeQlv=my(hbFi<2r-3Aj%N&#c`qlQ^T8?D~vDN2iNE?r|n(XG|2t;!E z7ZRAYwKA_SLH*i>lI=*v(eBM=BcC#60mXVTX58+>!+OK64t((D z%E*?=V^bQuemz>YQR_2-`?ARPUJoUzf{@8X0-va#ABHI|M!wO>MJs1-CLs(Yen7>^?_0Pixp%}CQH zXyz#42J(N>Q$5Z;Y9tZ5#GTlUj75(qabhg%e1yaDbrFl?KD<6N<7ceOG8wJ=mWNh= zN+NT-f6Q~htf9sQd&4Rod>ZQL_%&RtxRKUroK%oU^W(&i4PLBk&W#&yYdRQ~`Tn6H zlj%HEGHEp*)0PR)&F5zNqFu3!LT2RUp4)r7_6Ln&C-w?`gSjEnHhTNbbYiopuabFe zCFt3`jGCaAJSj$6pmv&J_4Gz#mCQBW4-g+H`tB*aTaot^fH2b?q>^4~%MxBrtF>1L z=zAoHMv!vTj5(T0Vc@Y`csxJX;29H`+34C=@5;+f-TJtS98(%#`gGp9{Nz`yO_@)= zLI}DQ*;fspJ!@|+*_Muuj7%;7B%tgMY27x9LR)+^vl*ns!f3Wd-6a`|n5eqHq2@3i8e9CXX+cyJgh$4@g@s$1Vh?Awv@3ZV#dsGLO5*<)i zn_aL^+kz1oM(AWlwC&ws0bQ#bl^*up#0&VUWJ0HaWo+ZUm8j8;(SjQekrt5NnP8Yu zXmyb-i#JdFD;>5pD!|<_}jN%yDpSTBd_i`lSTUm8TLS0@7WxO zrYucsFGp~$;dZIZaKsLMR=}i=6z~Y2Iu>h6`lX>N2saI92%Uub z#m_&*q)q>Iof`h(p`ZUVKIH#Y&kgU;|GoXimV3OFGS{9bb8d6{HTt1lphVVHUhu?| zP?P>2DU~nZQGM!AhEQ*Qcz?x@y`cB3UQDH4VUbZb)K7KrZh3{^X|7@xVMI z(6>C_x{MLiTpmwt!xNYd)C!h>Ngg1U&{aSCZFo^BfxDySb!dF3WJ!60Mpl=P+P) z*02r-ltH}zk&TXy_P9*>2%gMf`ca9^LS5#zXUA`8c<1kx8XZ&HNWzuCOAKy{SM~lw zx^*1#l=zmM-iGUzbF`xQ2?E6_pz9V07mJ73?J)7bIru4fUX%qFh$QXtv-r)vGA>p^ zj%D~05fWF^8Zv`w9s{9w#Ieg0QA(hkWRT#tx!q~3L;i3ue$uQgNoX>}ADWiz9~*c5 z`b4m&hmbU_+G5UW1r%ox8oF|JWXULOyi>(*vA3&p5cb$}uV3J&M;T&A52oj%RnxiX zI*K0-6Pc6*X|{rWHmmdf-b#3XQDQTp1=w5h;E_xLCO`kwhLV#cPV!)TTU%#$NMzLd z@sxlV$rWEza9h z>ZV)q*+iK|tn4ZT50$nFhlfm=F@3@leEG^jPjZ!!gDkhxWJ}Ykc>X1o;#{OiP4~Jo zg#sCsLWwuX826jud!9zdQlDE^KaXNUiR52Uo^AFmja~Uvm3nE#9EaR@2hJ~!`=GNH z4h$RMR49&}!e(*UFa%gnD*L?5oc3Mu?1`=QjK#n-swqY}PNH-k#SgB&0s^ODEI3zW_lBz>f4&{cj3hZi0DwY}5OXS4&o z)hC`yvb^r0VXh~WB~T=lKv*b^EsJa4-PmUn(1;0y6VP&FAGz`J#fuN=8Qx~RiKmv_ zll--C&PrceDW%Fq$CtOGFaDqKjofO7w@+rpY<5zo&l98^L30WpLhO$8a087uDQup= z{MgYQZ~ZLcdONSFFtb z_iQ?F{d@DU4(-}`Jb$!*{|sfaz$^5-&^t<&l{;uOEkat1<0!7>UaE7#p(J5P@t)Zn zwHF4E{$*&@ZWkAWcag1og^nISemrvh6Cjt#X4UOuxa@RdB>kX-;@IHGOccmf&3A5QTjy@O=j226L%OE{b&>E;4Z zU^LKIQICnF9LsQuS#@8s8D6JGWS1#RKBo`-b2pyPa}VyTMv0XDQf3GZtY9)P8*YuZ1977{)5<18Sp#px$H%~(RgF(F9 z9&zRvr_6i9Z7ARsc_p@*{(4IS&|=v#D&RxOlcgie0V0+xUFvzrpbCp9{?*@6pRG=e0Uj<|Mel2C z0%Hc4`02VFqGY-?ww#*z)~9h9w|liFGP z@<8quUb%Sj)Ac>?XKk2tb3}mmJPned=1+*eOlC;z*{kaAUmMexcLeDDuh`b<c0r0;XCbhzLm*^jR+o^N3Va4vmFH=1?H@pJDpd?O2|2%He8Mph z7D>M?T=!?i+3;{#`$FEQqY?~7F4}il@S_gRo1p76YVzAeUP{S*)?#l|n(*ek_c825 zED2#1n!g**Rj+Z(Ttv?(TNGUhiIY}Rt*hIxGpsuL9~6zg>Z00UG$KzUolbFt_Fwv- z%ZIY7etZC36%EV)_57O=G-P&s4Css~KL4O;)4qmKnFtnR#?V-Uj4TR&Q7`+l8P@rH@`e-T31PZ7&xzTjw)=9O1N|eK}djIWu_IFR*2IEk7A6 zPAx=jS3lIVsL1>IxrK{R(a;&mm}jED1@3$4HXX6f8H$Z%ajILDB`KkZpM%cZ+&_&( zgPwk#bM2=9MsLe7Zq)ila6%IMBKnB56E~(IyiH|?zrfN^#5Ek?@T_gzY_*w;S0BHn zVg`NJV0%J^b_jD>S@VbH)rSCdGHOI-O`ckhDh8_W&%!pBx8Gb}SaFU|5X`^H#a3=J z8nA9U2eHBVi&y(yEzrWUQCVL1Y=8}k&!?O<8Et`-!ewnJCyD)wo4dJDgud7N+r5q< z1?XE*61&XDsqFCHE}!N|xwo}y;Ayp?>^u1kMT4Mm4;*5RTF&=}A9dpApH1W2h+ctA zHc>kOuN;&C%iXoR`C7w88PqX%T}wu;{XI>`t{6^>!1_1;?ejP0^DpCuGf;Ej?2iCd1+%&&wmb&`u|231iRcmd-vrbEZZ8)ICq~o)Ec%vHCKH@--r%Ho{ehEmL?{&x%Dwg_0GpeH*`1h1h2WK|M@3(+Fon;&1e1}{;R@pXicf`8f8RQ`v%4t1e!Zk0=cO#xHHo~ug z)_M}6!Ho9SB|>!(AynBeydfBH?`GR;$^?K>l3hHgS3xlSfQfNbUKg{vX6%4es<~Ee zJ0qP8yP7|c@5(4v`-DS7q#c%HTeKFsy32w;1w--EtQk{xKC8@hTlj$ffwLB4Gs3|7 zEXVylCz}L()8HYr+t*qxX93Sq*gHP`l(FjzAHvN@7zan;Y5R=n2Zt=uF)ai+RwxM; zn!zJhC^;(jW3#I)FAf`FUn^P7t-D0oru31ycj!4%_@~H)m=uLFN3tXyK0MTTn}kiV z@yO9h%2&B-*?jtw)uCh6Ul(HLXHu7@^2o3^O9>uYqhu)kz!Z0N?YtLLSCOQ7EqFRw zBUFmP62!_R)7^8sHuxMfyBVpu>;k2gsQ9(76Owr1>xi|J=>udm z>D-w&}$^UlaPh(Z{xT+Ckv54# z#4M$uO)^+5&OKh63qSv*NpOLu0;tOtHU$0XNrEWo%!>*ORf``yx$+UuU7%^>@WpW_ zsk38NzioIy)>9$Ys9q8a%Q?*{$2y5LXC;Z6n4M*Q7>xY6vQeFGEMBze$KQI|WwmZ) zKe&Sg_yBb1qQo(|{_75MfJNqXH)X9442kcKX3hr`u3bh?q9T%^ayfGoIXlT~YZHEn z$tHm$!8EnnV3K%Pg%`Bln~!rl?@~1u{W`aH&V^(6z@C;RI>8XpbW^Tokq- z&oq=fg#KphlSqM)1PktK9sQQ(x9_K;LuTE|>_i2>ui=!kciEGp%acO z;&>t|X7_~xH|3+dv$1?sSy3UvE?AZk7keuh>G!A1uN=B$%`mTQAVoUvhX7ULD$|IB zGM^o6|BfO=A-xsLA_>_0{;{QOfY%H5GC=;#mc#TE1Oc^e*N$nqb4;uJ^`EUSX$bVx z4dPzSr{$Cn`hT(a=3zbO?f-XX24fj!jD5>eNJ#cQWB*7}p-5#!Bs9iSq%vbL2>FB} zgwjruLaQ}G(xQY4A(a$LwBC<1GuQ9eT-R~jzwdqgzQ_H~_d1U2m<@eC@Aqpt&*yeR zmGx9ekgL>}G%I~4ZfmaeVWXkw+yc{ho}TRtNMc{u9+)nr8vOswA?6bnA*U6^o1|u> z|M^4DI_>PE$aO*DQ6|6b)?Yl9L`I2jL2d@r$I`+}Ba=G9_T1YG+Ie?`vVr&%ZV9K{ zDy5H*GfytAZt{;#w5AyxstPgXjKW<2Q3G7q{+BvNX0G;yCS_S_3?`%w5n!!&CLtz*MH zS{FKXS`!=0K_F+LFn(-(A*t~I%C?V5zF2P+E({1Z8r48|5I%5_hPgC~qNC=-_oEQ^ zr*-jd&r2bmx-;)v4=KL9Ye3jJ^iF(%h|IF^COg831A395BjZ3xI*>%kGCFtpv^}S| z%tB~vxHiky6t+t!RfoJ*v%%lD3XLL9scchu> zSgdJZ%&NZxnsP-K9J*~ZznEW1`Zc_O4bkSs%guXG9y)ZOt>UP z3do0~KMA+nXv?z$D|Z|~GCRDWWtICI|74@LGgoOp(rQ={aPQb54c8w^Rz0=-`p+)T zoh}!e*$(Q5bjCHbX5QoYCE{}ft#N(>Q(XUGGHElWEcWu+!4htF_`4%}H9H!&S z1ynT_rgz;vOlZr%DTkYfCi6J}$!X) zSD-J?BxL13%9Qy3lNxwIgU&4}NAUdh=cX&zKeK+tp`vK560eKemN~9N3b)EbZ`6XUOxy|Hvd=e+hCR z^#geibB=G0dY_l%r537OiyfAk^4RfrOGi3<_=OR9#;c}IShCPGmJ z6x!L2*=z5;xRsdl>$i;A1T;qT;{f;j{`9^2>nGva(f%rADxP4FNO$k#Wy^!+eQ=}@ zoh!8V+F&m)uWijg8=#UJ65gSCqj1~W-{@Q0*$j{f@{EuWDZni)Kg`|vE_>_9`aRyk z+@sN7eWFN713XYua9+(phsr4*OfPKxU$SY+4G2)Omt==!7LKc0EMF$5;QaSvA-XJlII56~*0OW_QFbScw z37XX8L*W{}N13x*Hj(TeqxlDKo&trVw&t6+HtpNozNBG*Kcq1&Pxq&%zx(5NbO%+ zkTvYuT_`A8}6D#I|VJG3t|M{N+VO0gOq|nsNPpCU$bsq>K{#he173CTk2mMd|`Lx zX_Z+@i6N%^@h1ZxRm}DQX77^;Fu)M4N_yT*aW=7f)HKq2guafr<6gVZ=bIZfu#1Q} zF;3i&+!DkscW&OCI$%IP{-8r9`btxBF{uiCAsgPG4jHYH*LlP*$5Gx0^CA~HB9b%^ z9pcjzG)o!5D)(t@=x^pcyE>WKGA)F?L`Rm)w>eLkI4q1h_9B-~bi`Dg65mshRjDbF zAD{}xBQffIKr~2eJvmVt6>nsSQX`(Qs^Q4Z_fFQPi z`7g36qb^wSU-v-CFrLXmDkOn(eRCKoTl&(yPMszofD#4FySSz4+7+gzQ;&9R_rnjz zo<4kSv#e#8QNbKsO!?jkd%cCJ+Wl;ccS*x6Js(;d8D2pZBZ(1nP^pf{ke-(Ha5ETV z+$)F+#eI1~akb<6Ddc^N7!&o(Y?sict@|wOo8qP>GZV>&gg8m2=Wb=D;^Dgb>#x4T z8Db~q1U9;-*{(OR=xFYPW(TBA!dK!s4$3-d#i;f z(tXnD`Zq)NWT09P+RFCEaXjPs?2BPXU*$c0S{EI?+NA~%XrGMB>osCnMO{w&nm*#PQcOIvn* z;;x24Q!)Zv)}48+x!=2d5GaNAB6EkpoM!*({H{Cn``3$>zp*!k+$gDWtZly%U4hJm z4;T-{QRSV;j6y)&Go$TJ&U`SMT3EI|U++fbo}aI6 z)8H(VcnVJQ&bjlm+U=@+4$g2mRVa2)ix~Sh4PqB~wC}{xz&_9a{K2(-(#d9}t#DF7 zz-XZQB7Er#`FTU_OBNc{4zYftuE19oGNywzf)S;fL#4lobFIh7tT zeGVo*fdNJ`y_N8C8Qh?ANH|d#G~CEBwBIjp96K{{_QiI%wCQGam9lM~nsA5mPx^9) zavkmOel4!yTArj*?b1abcOR2xZ`7=T#N;H9k5`)Sy-263b0krqk3Q~ zD^HS2?ccqMH;zT}Ey4hu;zyfR5`N9AY;`phesKBh zRLZ{YOB_OfelSauQ>S$7|_Jj)CQ}LFi)s( z11VcPk8#Z0TWhvz0$ww-%5n!GltrfM<8QM84ljV^sit_VOv4t-wWY^g4hgFq`Rjg> zv2e+8!aQ%^`!mAEM{C=hS0ijnmoJr$q(QIv;lhE-$kmmo7-c{GdfQ@}H78jg1(gHv z*W-04$2cOq z`f>A!K6lD0tvmQW3BNu8(&6!lQ!Ye)G2t$ChO4|JKQhl=<8MRvvz0cp)zDQdLgj3u zsFWgt5P0$+K}84sSBWK)jViS||7BunfBm{uMMbT1!_DImDd6W!?G&1FH$h!$vyPa|l zsdm7eptkcb{_@jwzu#*Wv=d*N81vo$7r-lZ4&;(mPAgD4pV+)v1r-F@Q0k{rH{_XI z9o@WHGZC(Xgcyx#Q}_8d4_`0if}ebLhphEMhDRYak0-uk=tufG0eMBZ2+Kgi?do-J zt9FpY^JAC7qN3C64;1tIumy&DyL#ab9Ac%d?=|iLY{RUZdyYyzsgG$@Glbf{Njk+p zS7gP<_cF-+R9Sh4N^**&M?fNfh4OUB?d&!IsWeZWW}rFp1&EzJzIXyHu9{;dI2x%GBWg zYA-efiwI)w_7E|D9{RKcLkl)KBBxYdKNUOmMt=2_g< zug2HCrxLH!(~p-@9c@y!c`cdQAh*PJP)1QhkDU~>`S5;!uHQ>_D=lDoY9gPK^jJM{`ok0 z)(qofaU4YRs&MOFyZ`E;FE^;#UFK#o$Fz^AzwT=0l9BL&S{siH!AYr0Y&@qcXGa8Y z=McgJ{qaslc?3A#!Q&6nfA+!J=Bt(X>W;gGL|LzsZ!yK&K+4_9kE;Hh+&kvyqCsM& zyDHkv$Tx2cDNqe7UVHBm!JQf@g_a%1ZrsmE^b^QAae_=x$~ZE|s?~lYZf3)0p(Zis zhs*{37cyhfZc5>;+;QGu3|E7zlXNcBjjMV8BJ@dCGYYU(62J_B;?0m!1IVTsq3~%B zxaBe+*%lAkb|))l^SBCsZ|kI!X0cU!B^?8*r4Jd%Y*?90I~yQHbnggswG?=oq7axV z)kco?dqA64@u=qAY9`>Imz@AcW4w6rA2P*SvLgtBxbdeWs4yZgKdLVgS5nx{<#bP6 z#1tl^O&d|c&Zagss3`3)JM2{@73GdhjoqYoGxs@6gm$3jLdc51fb)e;xu@hh#aAIX zm8=}S%G!KCFTTAQo%&Hm%Pozl6?A}ZOavsr7n&53BIZC3+%Cj%gZtk`Q8fjH`$2LY zsW2_a5Rx#L=t$Pj-Plu|*zf4R!de=BnKJr)$Vf&t4uB=1tcxG5PmP8EhHLSreOt~$ zyc;~N1wIfL4iDr6d)$a)goV%9-60m}FPDU>cJ zm3~!EyFmkewS>}nsqm^;p*J&0`KW)H5CKvp&3g>gEF+)z7mLKj_SvTIw{6}f?Ikw|6^Y(BAvol(*1NJj|O!P{d&YgWe7U>MEvu07E z5Aj3}BhezZySt8kl-9Ou*8y2~eMoMjs$5Qw)g6#pKe%}~dRwTO_l?>TPB_+M)U@_>ZvLoC^C?USg0eJHA-U|-5O zrvOHs?G{$FcVI69M-5 z<7_A+-pOo1Zy8!dHW`nbGq;fWHtnYURW4KZJ$5Gsk1znpai9xDF+!uP@``MZr#GK&TLEhepjm zne)SCB01=ZCjBFUtqXXE$t`u7BS3ph9u(+NBaxir@;$-n(9`tsZ0^FHe8*F+u6ck7 z=LI1W`x>8t5qVkaiebYH)E9;ns=Bi)tV!&~4`u{zLp{1uVqX|lN2K8{J&T9CBN#Iz z{v&V~27>nj3t7ODN(G}!Y^q{(>f8ge0)3Hh(Izz)tA*3&B`4?;e9*=*3Gkd%E-ddn z=-G6zIhiFTHxWb2WCmS;N(r}=3~kA;W-i!tC@GmW$*mLb{;@We8oUpU4U%W(qz{tp zEg07!w%KF8>o8~%T$58!hEd$ggPtSnUb6ktQfdvERm#ytCn4P#`guCHK-%_Ib8kgh z-dr!90_ZW<*6RW#vYp8(X4J$1CO5r6D5+D7l>7V6>C5jHrKjAxIIa#3sMcc=GDwYF zD5a(OMi?H#jEasNsi_`T%2IehRpEOw6vSJTxjD5}ANCS8*;pil7EXsQ+N$^7s#9Zf znnz0zMhAE$y@Mlb<6^HNC!eO|omL*6_GOjcp|=^VPJib zf`TWPc8yy5X*|+*K~Vo_;wD+Tq^t(a4=tS zTeNh3HPwv|pSejzbRPEs%kulo%*=$W7&0z#MTVXkdZuP|CL_eqA)VwK(-mG2CqR5xxbrkj!-+pfpEe1*=lRdNGG|%3%0;pkmC;*4Nu*!yNGLSADuS<>_D<&BtwkarO%lH zbS(rveVHA?IXnd&s6@8VNd|!f38IB_*cZaYbJ0`=2XVFX zD`s*QZxu!tCfJ5Lj0X6Z;59F>+Y*&Bn>s;sQ-*05R`e#dg*w!ld?6XRBS9Y=wE0_F zK9X2?Dp3oU(39gHc9M~Lj!dvv&g@KD#nwoH0Y_N|%C_wo1uV)Y zRp%!LVM}YP(m#Bvt!TkSp&_fEe*?nr5!=6u>ZM;}HqKB?f4q8X^vy3t;j|XXexArg z;_cfy&f%J0`MafhKEn7pBtgqt=OEJqR}sd56FZ2To7C`1G&&zSz4t+7oa!*xm#In) zh-pu)ezggSyuy&skGqdnl7xL>)!0O)Ab_{cC8YRyc;nFBU8)Zm4`HDou27HH_%)=! z!f&Qo*m__L{>|i0!)qLx9=}jNS&_m3rXg!yH4pprI%p$qM9F(D5OxP>`9VPHO#qr$ z9KF8CmoR+}OE(>5{;^lJmRY2lf-8NU%Tle_;$?szL)zp|-ZgIMpn(G~&sJ%VRLa6> zof6aIG zG|TL#NIEvTs206!|45bl6=mJOZ0ps94+?crb4=q95wW#YuXS#U%n0&axpQr;v^SZ?u|1ba~Nh#u7I~TM;aM z!`HZXaRgKUmnldkg#@o*5lIJ zqApV$C)#g@-7CWhaoB9vmyn|p3pZ`cwEjQF#%eb^bMo;ZtGgagA1?d&@uScv08~=l z(D0heuqGN?rm3mQQGNNhE$C$%%D19qbai((J~DFq*2!&ljvR44dfY<*k$$~S0FV$Y zv#9@0hpdD@LJDhtjqTpuVC#M|XQ;h~RbJvc@o{d}06LFLDZ-!Lj{`*)9gYcrcrssQ zM(@G#FZC+6Z=3S6L(GMcA0LmK+-@&U!0Ae{vauv=xN6=LT0q*Ko((){#)mv@ef70# zT|URIT(P2N_^PzsYE2&3`j14n?A5-~Id@8F%}vKq&!hJIg$i8mBy(w9B53JkcM$`f zkk+=ke~Not2hGWj%S@QNMPjc`d>GF%(Mv~P#COyxmSf7x%lF!yp<+9rM$R8x(8~x+AwSe#>gTvVX=Y%tVE=HI%gL5P&0MRLfqY zE79Q$HC}X9|M&PWz=-|hrfpp!hpmSjVc)f|N;;`?N5kaotlupy2Rl`bpsq9p2yqiX zx+H=RX|o*#gMM9~CZzCz+{L$BulxN8wnuKjbD4u-D3yyNt$Un!^5lt}C%ELWCbY6j zdj4U_lh-xb+1c8$CL1vqh2?N{5qXF7B!70a`;vQA#Twfp1gaED(v2y^4HZ~#KW`PEW2opiZ@*SRktrSKu-|p z(6+v${`UbflS%F2G$*=BR_*tNCdoMioD9Hj##O!{x1}&7lB`-*uq3i`uV~QrDQl|N zFW>Y{qeh3{@9Nq!LX}GDUDv^}#E1QucSL*5pON#gB_}78HpqWmQk&m}$T4D*f0JWC z_9&ww;vLMtY4duSp zWv2wQz0v3CE>M|M56&hbnrtxAR+GQ}_Bx-#Z1rzXg36CsR7^f90jq>;E)VOY$ zn0C4&C1^kWBuBJ1!^xRPTlErubK~P5P4%X)5+j-T5yl1AQXZl*~r$!F2 zYUnDhD`pJn{?*ss*$##2D@BupVpN7}1@QIMDoUs1=TxiG<7d`rnVjtwKZ*ukT_Nf} zuy^zD@$(_6H z`YdOHHur@h<>=^8ueBE-`GTKH^2C(gE%7E_!5pntk8MN#7X)+MJjGu`8?7Np5z`McM6*dI(u>}UTiF5pr zc;Q^co>5c#br02QiuaVXATbo&_KMpafKH-g9ahNhki;uaI0?~UI&Pc1N7)V`k#rdZ zylOMUXc}@@WXhWZJW7D=6{YT0U>GOJ6?)C($OU*tTq_iAed~hl+c_6$Z07!v8Kmoo zVk1037b)BW?j0#+QB=wp;C9L1{A z;`}mgPJ;B(+GUyNx=Ox26`>!1eT{8xmzQ~YOCQy8#j1^Rw`>^r<}}}NCyn=0okgEJ%>)$Rh?A4O&saXB3I#p9`&^_pa055m_paD-L$23fp7pR& zE#NtfP2Y6Vl1jB}?mR?bweHupjfe}cczIZi%oXy{z!AFu8{F%Hd@AKj>J}-yTA+*f|zX>7;6-P3Wr`1YMY_uVX~1t(S|1T_3R>gAv_PU}No8_pc3d=`z|Jx2HRrRN1>S-xn~= zVpH;9gN6=tuts3z5)@A(3u}}iqcFg2Oot5{)}*V}VSpE*Y3X`BifV~c>H`3(yj$+f zL0j?hvF*!(jxn{yqK&7Xwjr3=xB9~Df1NrC5;MR>JSF%~OivVKk!ur70r3V$o$NUb zZIUZbMS5(S%%bcV-LR!o9iL_d&e1f&J@oPb0h%Bl{>CB4{(LcVirK^{+&vIBQv(b$6Znd#nPhGUXgw2a zXEJenFIHkRVRmJX36(d2z|p)1JeOt+tOwj#SSY8Uw0nz_Y~P zFz^)8(Clja?V)kkXuoJ4j7Qm*97m+-4aHZ0OHTWhOU-Q+iDtO@BhsMyVnl~IJgdQBXN(>rdfqKo{fkAtnl*Jb=Q}1=OS=s3iOV5nHIc`*=H7vln{t} zT`V#)PaO;jvT^yb-JOGFDB+{T4-FG^=;PqnYKt2@YVaq~1k14`MKn5)#E*|zcR|Lr z-P^gBYFA*`HxY>!_DQ{!kgfqhS$Ftuyd!alt6A4nHMA)?^oANtHG^j!r`$qv=)YMF3(PoBl-A9E@s|e8d5w+(_6dW%h-D@ zOpc>m$Fg;KwB^*@$9}c@byu>J#(n*DAMeii&1JLQ*Up{BzajY0ym+JA&l;oR_9m&z zU>tZXt0K-%8KZFC@@5NQ*#$EGZ7l3%0ID0r&6cO<{rKUVOW=h!FItshFvP{_;Nq4= zSp}bl$B6?f{M%xgU`S?+2?o?LW1ebTCNfzUe3IN_0?#8GRXqxT5Fzn&-2id8x z>uL%Tpu`d?MYZwUn^cN=Iq79YW+DGJ@1U8`FK_?V(L>r*w;%^rvWj8{4LIzVS7UD$ zUNs7TTJ*d2btmKH_eVP!jW}g=*_07HUTlIeP84+w&J@Xuz;-HglBc+|KXk51Z0^-- zmQMRdbdRvjkt!=-ae{wRH-PLjtS%-!=RAns(CoWT2hVw3=-qqfUxA8BACm9F7hai= zcxdocyuP4x9g!5uQDX%0G>dA~e8bf&5>EXwb4aXqB(baXReI870N z5b2UIzUUeVF{;~8M6uT9jEV5I2eRYOmt2lysE|@ZNW_nu=y`z<%)O=nq-- zWRi#hNdBSF(F7Ik-Fs^48sr)B-q6&5kd78$7`93h!~}^&C$PM4joZmH-o%5M9jPo| zbngr5ejYP)QKeh!V%rISQK;1J1*v(a+`1Zw8So>{p$ev`^(Gp1$f?xIq$mzKNiuYE zb6c<=g@eVv8p17n+~*f=`)6v+qrP?>&mmd0%k9YKhwuLO6dG21bNTw80nU?heVZEz*CKOcy4`02Z@RamkiWZH6UB-A6By`Pa*wqC{-eHB)G8{iE~6NatBEubl!n{?#hW)iE*;E_Mv+zA zwDm6;SGUH!rV5s;5^7^VxsLm1YEGW@kF3lcuHuMB%Y7>Kle18+j6Bqz?zivc-!Ypz zUV&vlefkt(we4oRzr9umcYQU!?t{240g;Uy99|NSw){MGfB)+)~r z5ULQu+yP~E$K$+2wD#tKa|#^~Xy%=myvs>%RxKwR^z0ZAl`SJ4*ZTu5D_1uxF_obT zG}e>30}sZ<#nG7wnMi9h4*`Sk2qFZCQ&E87KA=4$mD!lE~k^)lz^HRuB;-ic%xb|oy4OD~5iz~1ElvA8@9ONd_44?jE$=@-x7!ClGgpI>i6>1YH;<~t0)4KJ7m zXaFkIX{8m5*1$i2U*v~xh`GlLmCqw%ti|GnS8wsak~oce&otWQcA#1W3_{V9OGYC3 ziTw8|=^FSm?cXR3Lzg(g&&7&09B^ zT0th+o4gw~Th*;`Zc>gJ(_$dy)$hCD;-7ytYKVZQqn*~fU$J{iu1y9X*Sfz&P1Lx` zU{4m2=ka&mgx8#)`efE56P<4#_%MseKJaQ83(bthqV|qlelisTVt>DXedYLNdiaH7 z{@B_<#!!p;73+iVN4~}FJB9oI$|zM=NT0$HMQyiY*c5PUPJm!Qt=RSBu=pqpIfO08 zm|pzlH!dVi1y3W6Qd<(`JZ{);eCwvhq=NwPrsr|@jsHY#h+@J61WN5tji!VPL4oWl zYx;um6HGZie50QFQN*~zwn->pe zFiQx$B@MPR_ed^vl|(>gI~0$-6m_%TnJBVvh>Y;z?Li@V%K!gsAzsRP&5XiN9>=Q2$1=x?O;v@IgR=(L^ZQPW@Hqo zpj?Za$w-C=h*Sv`^|U2-HcnH*)R##b4O1~VCjALS6@GunkhB%i zCBImnOz&dx?&#oNK_+<{H`JH5eyaVQ5WW%6#0Y-x1{VR73aAXwuBH%@ldeI8U@ayy?TtyF90?!2qft~Q#zpqn!vUf&ecXv^;W z9BJu^Y^Y87;Nkc@?CqzW#YePsy|O2BOwj{M+D|}rT7X-V!(ZCmzh85W=Ebi@G!ShM z)ovdqv-n;qc`?5QG-@WEU5G- zRys71+OPH`MdoV85|n9t<_VJz(j>eYl>}YWhK(Dgr~dcvG@`-420%3dV(``sat`s< z1L=>gj@YZ=OX7qKwW}fhk?C?XVHRXb*SSa$ybQX5WOODsuK0ffjh(gPH|01zp2{Ti z-_*ni4LH0{E$s6t|KHJA+b=NgOhXXDQP#KdM-J=4EW^m zl%WY?13@!+c<|CQTvJv%Lvb3?d_4%wy(uCdu#)}VCpL1ddUx~in9se#-ksc)(( z(X#4~?Va>OMS=-3NT|gyu0Ty%3z_OH)A+bi`lc_SdO1zgC{QJ@AkZZATbU0|%1ZxBXmk zwl;@}x~JP{I%ObR6Gyv7;Kjs86=h{^t8d6bfAmH9pe+MgP+1OE;Fq zwSMh4%E8Ka{FKX4zr}smZGF{Bl@Pm_gtO#qjBnLP`(bZPh;{!f-n_=Lsh>1NJ*WQ>!_dK4 zrT)S6pF`u@x0FFA=&AcUI8^?-sZdFn!`W{T8#Mabw7xCC-tL#Ly8XR@zx?%o@-XW^ zkN@sGOxzeUJlf}9d6t_x|1;fHR-YjJjsdZ(qHYEJ<$R z!1k-@2H(FQb&6~WK^7$@iJrAf&sCsYh$9ySui@t`AbiawxhusO1oi9ZH=3P`h%kT- zV8X{%`;ecJ(^G@bqDaeaquQZ^2Bo>otpqL+?J~{S-ttXN_T7KdZ{&7~X#{t}O^jvh z=!H@L_^8|M&Z!I(X+h(b=}6e`KB6}X;b7L_qsh1@9V!3$#MLy`Z$fFt~ z+<#?~*N-}s&{=+05X`UW8|OK2tPZh^zdPx4{{f&K$!JUKu2|3QQ!ibZ`;T_;?1JLO z4W2^Hhi~}MOQbK@DqXj1p(m;|`di8&*P&7xcX70EcM}_Okp#DsJi+DAcqp>|lryHu zkG(v0LvNo3dcN)v#xJyr%ZYKotm5bkJ1C_S2k${lk0R&=Ifyy1&I>~e7vLF} zG2-N>{iUk;Yny%wnHKTYWkfi)nP3Vdown_}LcJoYfOLSG5Gs0Ir8pM2j3g|~$~fmy zW+np;Ml%}cnb;M0h`phkK(B9lXj;T>x_xM{U)LH{hjLh~@C&P}4we3)=K9C?)4%Fo z+Cy*S)bXcw{NBTGlF#(1lN$Q;>GI9~>{CtqOdkLJzP=~<)Dt$3@Alg_DR(NTu9~t< zF=0Zp+{)_U8Y z=_f+9-8xB!hZ>2Y4poMldP5a3q`nHP2A6pxyxCLuaznLMJgVl27&LLUQL9d!g05_d zOJR==U3huCBNQ4@;dnIh^2@K6KCGrs#)zr`&AIMfq2&{?;p z5_^@HGc>BLs%i+5N6+(f$T!Ko>8vSipyEV?hevzKRmD9eN==M#TEj1_2sDq`Chm>9 z8P&mRy?Q~|#ZqwnF=p%<$#c7XENdcm!*o8tT3}c=74VqGZQ8Us<*S!NRN}Z%c5kDH z+18j*%0L{4cy3iqEmXwEpwAmueLiGQ*Rg@@{Xn$bN}o2G2WdrAU!Zh@|06SRL8Rko z6DrWO7YR8cewJF$$7kV7nj`r|Y>Na2Pb22Iu&rfnudMLAJ9(b#w+9rZjIBTUY>bxH z5S8}u^61tA_+9Z4IJay{UmMK7^nR(xEXs?w>nhneR_o)UqC8h0Nt;A^?KrZW8ex%m{ zF=cW93K@ZcQxlXSH=JYcaKqv+YDMRPnGKUOGv}e1OA`h**d(-fU{CMdM&ujfQ=%bA zL8z(s))TRx*q{HyO=LiIZNPLukIrha`E)iuQ6wDZ}PD_nOWVWiDG4=Epv9}Zr{2! z0MJKTb&#CIJ&oTYx8CIVK_?}B4ho56j;k{@)jGzK+UVgiB#9+112d4vUW#(y?%Tzz zDLn~_2Yo(8Lji+*KxF?39$rq5^oI?r9rwuPbmhC0!yjHJ_f-0vG1Jj*Qmar*RneiC zU1T-2o4ZymRLcASSJ%-U&J?k55Y`fJce>S&KT0b|s7{9vl6NFfUiyD=at+%H&cWL4 ztw6Vi9qd|JO=bVx&vX=E1j~{CM1H-wrp7oW`j~C?{k6O6Ul>WL&AwB4b?e!ZbSq2- zbZ~{NW~G{OMzGR{&epRmW=(I65eMOK!)!!+o?i6hjhi=FwGH3DzipkKmt5kdCN~{( z>tv9aG)?>=oo?>kxibYcP%mCA4vkuLKCb8KWX$^tcdTqt^r*})!2_w9b`urfrCA;J zr5{O%>WM^sw3+3p)=k&`^2>g;8#iv~e5`qK_C>0TL*@Fjl3;RTLPNLQ9jAO|`N^D1 zb2Rn(s|RQX`HWxoKCJZp?Vr>0o{jHTuh6P$7kyu4;lihL!XlU(%Ro0HsE7mm&zl}o z>oW4!>%qmSlGGJWPQE|Ia+1k;4)GKursH2{tk`({`t@l_BpDn_L4adTJf1ZCeW85e_mAdguKc9!6TFmoo+_J~rGiYk618!=~ z3EXc^zL;a#17oH}Y>%yVI@h_2+tuF_e!gpL;W#HG=HvXG<)cR~(av`$!wlEr+i&d) z>I213m%N|w^=9!Xz#%?}{u~t_0WjI8Z{OSY3xc6U#Xm+Yvo)_g9{4-T4ylMC`cy8m zEc;scDg-uux80MB;mM}0wi~ZuJ@pF85r4LMuOckRseqN@24U;#DuvjIT-$-T0&y=G zQOfPE9=>w=s42thoUhmm$GELqI%)ozx&E%D(Nb}yoVw%j=DOX-H}ep{X-sYLq09S} zMMN|)+^#4qYAWY<{4eH&)zDOWKC3Wds!q>&rjM6#gb4iuq|uj?f_rBwk}g@u!khvk zxK&bTpjGdu0DRvoVLpuD(?dEx%;}hcfx%&I%ZkAP^+Pnx+j9K9W(ucm?B^-S0ez!4 zIIjKpW~6)>49$cBw~cq=`neC{op$j5z2ITm`7fALO0A?um7Xk@>;taZ#qca}ban_r?)LUYIk_-hjqZ*^8t(8)Q&RTREe}@d6yAqEtDK6k8gG@0_f== zH-xX+Uhq<5yVvCz32c=`biWv#97o z&fM{v;}8loUYT7L6&fSCW(7f4;=RzAwrr-N7Nl*^BTp(Ywt9Wl zkGl^k=@pg}lnhbtRPZQ#7mW0YiZY7~G&u|&%~_sw%y~vd9@*qPuc0+h;NOtyD=5eY zJFOD=3_}F)WPBBifx7Scl2T)ir9w#Q! zPHToRyePh~UmST`_OalB?#N&5Wk%9oGdtuyDGT&5&!r6YBM2b2@~wlI4dCL87-C;l z)l_D*bDda)kLB*2P=K>i5(ie?;RI#%oo1bB0?*M1g5!r2a0SROLD=1%8Pr z04aI`M3#f3OiH;xi`sSa<*+5mYLwiJ1APpxE*7z{IGTCGr%*E7&K$Xmgb?zArmaA$n{R%weZS7iUFB(qK4lL+-yQH}O-Fw-bI*W- z^1Dxe`gHN`fM+__`i9l7DpXWDO#RDa_ph6$+2Ri;dx6lq|N5e2qrtyLo_@Ug)#m>5 zqiaw4)`QYip6cxFxw+nEqFnjr-$wrZ&%gQCgZ{tzeD+CnGd_?$+S=Miuj1f^IR;yk zHGiU#OTZ6nFLjS!X8nA}gDxsh*R-bgM`1sC>QtQwTjIzlz>H$L(&=vAyt#Gl6SS>~ zq4b>CicU9g{26W437U6JTI7l4>dlCZfd~W_9kezFZu7zME1oj)Ob&Z)qmdKKQ9Vq9 zc%Hj#*|Nj`95T3KP}JtylYH*o9R|;rjBEBPoRvhSI(~ks!eNy7u$Vgz+y4P<$JS3? z-oqVH9Fs8t)v>#qTk1r|mg0ldxM%D)vkQKga;qZ7Tcn=1Hd;rspx&z&UgpU-Pmc*i zfD>fQU4OCH3v|{37rfE)VM&Z#6NbZ7ih}GR?N5?wMl`QySJa(9j*@D4S znhs%>5LC&kl-JLm{oJbgejkn+&j+D0s}VA!Ns}fLCc&Wy>{@!QCM+@gl)UMt)1>Kyfz8sp_H=>OHiVCYWJYj0|5{d4f)0$&;6> z5F^MHB3deG1ZltyyX3^x=IzbWD}I&OO{mxD)27{@sv2%gL&d~KA1omNAWcV(*2#S9 zY<;@&XWGgGB;0Yngb*6&>rlngJ4z8z7y8I5RVewdqW<&u??Ykk`NYlD^*Gmq)F_FG zMNQ_`M{5rz6udJVNN^7}5ECizv!dKtfPq{a`MZakXB_PB>`_YP9Hz$Dj7E33kquK? zI0C>ORHMu4Wtr39>qh=4YyQgv-cozlVp%^D-}Ib78q+ z-o<+sJiZXJ`sR3UFLE&)pdrRgEQ})p&@$ubit@K{=NVurMB<9_t2gtBhKQ|L?y82P zGFB#wJ@8RjQgsNb z=v-S^!vyvQb!N6HP_-wkiZ7#JkOf=$=6+R;2Xg&wF2bx4VXQniWG3zeKB{DBJn++3RaaA6_WnijZbx~SD2jaSo%uV-8y%8& zk%SQ`Dsf2;zwx~p)HFC3bVUe9fyk54?F`HOu7ourc@K!m(jwPs%I8N6GIvWOTbWOs zv?NQ3t!I+hu-W0Ow&l6{B)Iv>bZ4ax-FiWW#qihspIF+DJK`M-KfnL%`}vDg|L+6X zywR{jW}DUX`Levm8A|CL@SsY)Mg|pgx&OGu@gaLMEKK*E69t;=1UBnLcAi+GE?e(`=foSjWeUyV}{=0m3a^mL&jBlpVtXKTo9Nnf{@J zuU-9!iSdsfHW>Id_0@q1rq+rS6e5g05C4_dqTw#yXPhRTqU5AB)^il7j&;yxAFu!unTK7CR3iK$^CU#1tc? zNIKbi4_|;J#4WYY61hx8;m-nM@>K=DVoztqbn44OyW}mm(Dmy+4)^Z9D0Ws))cN~O z)cv(&(89)-oBz3I&oG-^J9q9^v-C&h`$W{cD^>(2B!|Cy_fEtbtfIvDhX{4B70;kd zPNp~=y!OTE5L+jOA(?NX{o(9oRa1Vxc=oKjLI`0zZsBl~bj>CtuE-RrO`A5&h$mky zp(L^v_X+PxkFMeYS4U#So=(GOa!#cJhop|p^Oo_Gs;ai>$L2q*Ke@T4@LLtD%ZTM4 zoXMIR?`3Ie3FbWj4)GRbrjq0|4YBl#p}muB^v`c(M3ERkkW&oqum-FjeZ?QrQ*&PQ zxRKSsEpNI;`-?nKg&});_eumP50F%}Y4z((AKM8Net(<&9nFj@;i~YP0TiU;$|4E- z{<&>|n~%hja?7A;mqd@FM;#;cHqHL{<`^pG3@%GBt@W0bvR+Y z)H?K5f!s|69KO9i&_pNPP`9>=h5!geh_eykfY&vEI51-#i5U4&)+4BJ%yqPltBzo1 zd4LRoW%mV4+jkWvM+D~RoZ7_DW8vR)wkn+2AKPH&ASoBfEI7lR>EjT)zqN*;iE_v< zPgT&o>|i3&dAs7S93y!F@%2ws-N`Bgzvi*YfLj}6Jn_TWUuA{mhu-DMJa$CNRO|=j zz)q-!dyr0`qqBMFqDyM|z-FWy*d9vEh;w!p(V1b&zNltxtBw=BFfgA18~DxiIYjP0 zoGa73&|r{@5yyQ!iJ!Wp=FHP*bJK%$ZRH@Z|`jfVO0g&oqOW5BEk(x?X0CNOB43I}a9V7SplM)Txa{ zsIl^~)3RR|{4$?tU`7YKyZS9^JUmfuU0W8Deks=dN9Pci;3dUypb?WoMf^Wl1^?Db3$JtKGh- zaJ$v|CYN<{_dd#+^H6>Jyvj=@rh##m^Lx$yCc5*dEEU7};zlL*HF~l4-n3E~^Yu@| zzZw+v&6iW8)veqj_y2m+Gf8D&moHzIYRNV8RK24~rP~gbg^_DnURdC_bnen+aMYJf z-GBWmwIBXDxV*=|{hP1;=imJ6d8u6fZ+#k@?qSq8%_+5HeFu$=9hN&744pJ}Y7l2D zm_p_nulilE`8S?-2Xq@68X78{MvKlPj>D^64!P97%QrYbQsiz^c{MiZ|r!z7}@dI4% zwehSZEJ-rWkWS&;JfuHn=JI2{!*qkX1K0uO9tg3mX*a08o@k7%){;5~nN6Dp-Q}{9 zitE0<&guJzyTo87BchJaKX0!O&pPmuGk1(+*^%I3-RhGFC_lc<@_c?og0<#7rZj#X z6cQ`;x6qXzUgh9sT~63bK|uPa5meHgRX)IeUQoskSqy{baHBl z)2Zly`mQj!Bp?}#FjSTL}C^S}j{-dh$P9kk>eAGH+9V(2eV$6Gp3 zn^LOgH4o9DMNV9&^9E;FGCURs>~d^2n%CAynQ}4xO!Z_iYhx~0fv329#0FeQQyE15 zg@XH>yn@|wmV#<`2mw3_q9#REeT>(e^CFu|-6r##DnGN^=ZcEy73E=X(*o8U&h_nu zwumrpdY21jnM#Pb&QH0ts?{8j5ib(j$d5Dw`L#gcTa3C zfNz!G=>PD)b}D~oZm!i&#U7-a0vL<1{#r0#%SyDkrB@oCCOOn%x)S~-1hyO5+Wq!5 zZpz;sien!yXx!qB%=iJ+wZ=y7JHnmLmV~Y)>xZ0GqdNzZY=ZAVDfD(h&`Z%=x`n>Y zi3?%;)KqFunz;*^?eR=?nD4ML{b)ZT%YN*&DF|&7D00ty&4gmwAbtoR5DV$Fdihaopt1Uqy6_BAB6TEhUAUpt5Hk&P=tA!>C#lgYV6jb+%v$fkp^lYwUnYx*2nkcw@PV-@1ia~`PD%^ zfM&qNvc&aA9UiUg-3hv=_LaZ;+jpu5J0GMFjlh-=gj%+b!}^wjl)`1oK`?J+=DAA& z7I8`YhllJ1*${QgGDelj;TPEbPHFH+XinHWH~n!21VX(^s{IK(bDtWjk%=-h4C7)T zEriBjR4`Q}*1(!T&XR(};W_)&z-ZI}sU(?rdFK1CQC7U>zf1O3ikU;~rdVq`k4FQt zEbGCDmp=$?v}4DP!($!xG;KGt>3jCqRFncTZ%)SP$pdWJb<(uy8{Eetm{Ck$y)sgDM$#a%h#B) zzTVCW&T&x&6k^XQJvMBeE`wfHrcpma1s1H`?WqJIU>sZF#-i{@FfV0j3|)paKO6}& zNY6DDrZL|8Hw+Qp;0I!wmnZM*J6c@tEmXe-t<9_9_lq~3L51S(@J_+-a1S8nb^vx+)F0e)O&iH-IHNR z+iDnIZ~wdQTyhgZ)%5rb?)zJJc3a$bw!_85_+Bs10VWac(wk=g1etcENuY?Z!&_#d72l?&K>{1;Mh++-L#7FgerOBXLrt39^Q zbmto1+1I?46MujAu8CDf*8{HK*QVumY(5tv19MjFypqA6Z#^d+rFHGhX@i``B_s_x zbxE~d;Fm)9?*m--1G|TJWC*yL(839FO_GZ^FV!iDbeJ3JwBuRa>>YUOC1}m#J;a-((t*XP}+`;q?HA z{CVZrKY){$w0)y1))VleG3)Pj9yvx`A+D$s6MU2M733A%!hdU5e7N{q`}~xbeqH0n zH_#DxKQGjXz(gAYWF>DyEg^MqzK%_rzjef`#R*;)*tKf;3(Q7J{6moOUEmm;LPv?9elI>78f-!P7?jljl zggV~X`4ZsE2+m3u+GhIDs&-(y2v0iM?RQhIPc+5aAibFQRB^WW_;h(G4X>o!0F1=f zP(D&@#i}JFX~p^Ygc8K!>~r4 zL#VnaxVyHt0iCeSFm|kJT=p%YkC-rZqt;gkz_E6ET>CjshP)1g5tR@JWEuy-iPKJ8 zyBVKVBh0ec;)$Hyxp(j2d26uuw*K))Z!k55L^}z)4v6EiY1MGsModlJk>pb!Lb9J1 zeZPx}qoZS4?p~ec;2+Xy%E(uei7!P(1#!2=JBj)A!YZ$2pGs_npA^=a+D4u+$l0*2 z$qWQCpxT>`vi8J@?gEu(9^qjs@i)uGPVHoU^$%O>s{WkR5;%r;Q)DDjjA=>s*~Vk? zw}{h6=r)cYDW|h!l#+s9S$tuWZ{bWrNBdHYu>q*QevN!3F~o<5I~%j{NS{=_4ekO2 z0!);_V&Z$;Nii$GCY3C8c)?M-Y&zYo4F2)u-S~6TU}MaDbH}FS4pcLgQTPM5mGQMjuS9PBYK$+sE-Er2;i>Ur0>Ki;T?;z9wC?NN+hfhClv; zlk6LLns{j>4UuxehaaN}QkJwSE9o}m2j^06YP7zb@0bb%2I7ccJZ8!WZ`3*L=Ra}#Uh?AnX>|k?kYf;JLUn)_|O!Z5v03%b?E!D zMB9&5UC$K#%<`nBJhHR3Mh~!fHyiF`;PgL5K}iCSG&^_PLtY;+HaCDF9yDgvaz{$I z?%Y$NjCPPUZg8j+tsUss}UKD!j ze663nAhv9xSAo;hxEKF70Fs_YUv1v3-cu~E-5S^N$@||$H5k*i!T6_fzo~SqyGUHW zRr$)gyUM3G(f9w!@?H-6=|57)6>p=8Uou1RyTKk@t5#j=cH0WhDsiT<7X= zUAP|IupBO|^PF0!y-lFh6vkbsu8 ze2k;b6!j2os_hER1sBi8?^V^Z$f=5t0J0~2PF2!kEIrW*9UT=C0LRAVXBRk>pF4v> zcApxM^IVR3`@o^TYTku2^*F=%6a46`QPItlSOj;ioWUXW1^@lJG`PI<4QB!Q+b7f* z$Z5>+pa{3+H;?=56C_9yMlez!WzwA-BY4n%WB~6J{ye1*k6QxLr4-`s4!U^JUi4qQ zo(I&Upb33R6+DzE5xsiHs$y=the(vQj{8vE4yJbVA^#=1j$_jliHiNUHub9|g2pbd z9l=jTn+EFNUy(vjgK^;NHX4SLxIue4qTne-lT{F&QE(frD^F?qx+nZn4RUt)hx7|M zGhI1VL5Rv|jcp!BoCZ515^Gg|nH~{v`+&n7%E-al&U`+uvY#3>s1e$jvvkq0n;8}@ zfgr*W=pFKFsuF+mrcT&8KPz;9WNf&qX;5?WHQi*8o+$%SXPG=4J14~a+KXc}$yo3~RQ{`)t3<5IiholBdHEWGU!s6o|M0`UMOjeW z^7Zcn%nXVxseM;o?o4Ttcp+y`26wNz;?BWpe}=Q{R|BK5z^sufTDLXe2j!@gB|Zu6 zH=Jn#yLun~$9nmp!R6+k7+2DoQH$?iY7#y?L$uH9TfTtnPGS|n zV$_8n+i10>-jlrS+>lRl3!03MvJV%VB83tyjd2t3DxJ~DOeTrNinBcrUWdygJX zp_4*@;7SHiW*L3GzrI&CO05e7v^luh(9O#n81g4R4Y9chuSw-$oidk59csJBK1K7+ zjE-4TZ=a~7OyS29d+jm7w7dLRc*TTS-}95^qr;SQ=-oyZCoPRn`tMpPctLF>!`KL?bfKQ;nZ&Wj_X$DS{l((*?nFMBh~s9YttbywT|DTGGeJ=6OF`WzE;bMrtWzdZ?MRK6ZrANpnR z8C2nqgU~*-wyF0*HrMVI&XdFS0ZdqK5^U*e)mDa}SM%Z`AVP#^s-;@9%S>^T=OsJs28o3)9b{rOKaVF>raTX56=AI&!Ng6T`H3dQYa>e=hnAJ9IH=v&ab!|B@#yZj>Av-Yni|$0M zx@aDU>Vr0L%!T> zRMJSeYn^oQLfp46#{9xGu$<+1FZl0xoIQzE_^f`&mDeEl&4>OEMKzF%$bP;zf{u~e;+0@!uT z#So>sMKaPBP0(pKCvF8cB}Elc{k%|N6rrc`y|rQny9`M7U=m!H-4p~n7e9K zW@);qp2RRQE+>Fnv_oaZ=g$F%G)1rRZv}!VEVaXS*=I_7syVk`hEDAp;YqFBx6C+* zvjEkky>*pAR8-Tb7Xxi{+BxZ#+0D4~$Ii{}U&nPCe;d-VYf@Z7#v!w>HZSe=ddhg@ zmUaI#|7t^YHSFWlQ&1%kk5x-emaMM_HL0j{%cXp-_c#~+_N|KV#C<)s5*E>gb+vST z{rC!tuYAP^*tA{r8f0|1UqQ?5>!-}AQ?nZKtw>2If>*fInMJ8?X%AAy?gCjb?cnE_g38>uIdF7nDhI-F~<8o?-LwD!N!8%FAEe6 z>MJtogd2|+W>Jnds6DLk6b`?I-_NxDj z-ykH5K?VTnWrUvwBkLx54-0@ckl7q21TMrF_GOYT8^j}W2;vaqN_DXBk|VVw*ej~4 z3sbpS$6=dB_%WbI`sL&}>H6)XkgOrH+z_;W320L3fcdXyxMC18Q~0p*AJ8-cXI~=A zh8B*R6b`E2Ji~~UDn>-(Gu@gv3e|``3i5DCJqE?*j$tOae3Eijpw(!k$p8iif#3#U zSYbpcSQjtWlo<`=(OUL_tfa@^QYo>%4I@NdYqn{Rx#661zlJNe>p}VszZfI(6=1yM zfewx<>2jj9`6O&Ugj+Q;vsDhwHeqw3f&cpH=`Q78YtJQ_BxnPPz=Bf8_Du=oH%1Ib z49RNSv@e%y5(r-kfyv-BPs~FwKB*yPF+44`gVnPZt8koy`xM`;HimIhCqk;>l8lfl zBY1Jx>1rc55Z-<50q!d=E&ZR1^V4rg1CWFKg48WQw4^*yFhd8mfzU%P#?Grk2SOYK zxib`gUD|B7SST}5F_Gw|o%{oa9Wu_#Ryv1+b`DcNF)}TKXyaE}YByI);6d36QBBl+ zC-C z8e_aaj!{}>zAnuq4)!%+u*_%wB|53WOyDgpl7BI{9aKYNQ4eR3&6~e<_6KT`DKu7a z9F`Wg|Mdmko{nMWAp2n$H0+T>YgcDbOhT~?8}+l$+Y%52C`*)wh(R3SEB}d!sk~Ph zf%n16gYdZswWjn%mjClp=IA)cY>mwE83kgCnw!NSPI`ujEmoXU+IbiqyI>zOz|LU1);Nq;xZs_LSnFy8U|jS=w!e=_1s_khmZjL7!^!S z;|b0~MkIzn2FZLKW~7HvjcGdo10vf7KuQw*415YZjW^(PSYNWt{piP&M9hLv*A#bM zkOtUxvt=zX(nmjsqYJnygsQ{JcBtoPjhcNCqx~f9b2$I4kURs;>6aq*2$c0D1x84k zR1HKU28J^+89~Rs00yt^>y>mY3qqJek*J#HJZh`$oePO!-L{HQQj@HYlnF1UR&zM7 zlQJIcLU_SCJaeMoycxzegtUv0qOpYFnGe)p5T(X~g>)HyKA-b6)A?yGN(CwBCrbyQ z`l!M*))HTXu#XL?jYJh3MPAsB+$-7bZF#k3d}CgW8dV~hrtdK2pV5w z8cISOAG*6MV$U13{~;=V?p*ls$&vQf8=YT*-9>5ONRXZobMKoq0zyJfM%m)Sc}{bj zOd`)MsrVU`{%#=o&JhDfC5V?2IM6&gOwNbG5smnKd3v6?1zcC&(J?!rl>~)PwPqpC zO$bd8L+y49+tE@|xN|ujnif1<*Rddg?HW*qg0NCBTH%}}MqPkKFwj|}JgffKs1sqz zvr)SdU?~`ZaYM}xI~q|7g~PC>ql^%S0otJz+Jr8tY})3?%#Ds{m1PxtHx0`2(CE+{ z7HP3s=$U>x9gnplY6+w*cs2#KmREs_zx(GUw!P^*tA7`SkWj#v(Q15^+s!d{2Extq z2EnOF5K2yP!n}cS2Uo0{mE__o$5ZSJhXhs%hP5?7e&OgZosD`mZs0CY6@*t1ndk)rl}#T5S2=gmONBi&NjT@2m6@45*=sT^{47^4p-pQi5y0Aoj;ehbwe>`A z#DWr7@Lst@;YZdeqAj3Rkn#jA6KDQbl)#@@m7W=4dIPVRXE;y~Qix!E#o8VIA>F@@ z>ybpn+q(jR5y-1g`JVb+#3Z+#7&=sHQU{^o^5LT{Izr5^f?f10p=w~VQ4*YYDm9gX z%0gm!Z~#icBZ$zVQM*cOX|>~MoN0(}SAn(YG3?>zK@O>Hr4GvjcD5W;dx>C>7p$KV zXZ!W~;G%^Ws7$ z&4Irfm7raC2&;-1IuS$#Fa=h_%K|rs7)(+~L?kfuT8ti1dd8vJhy&h*dmw`jsRDL~ ztl<6QiWw9>7KI;$bk4%$$=UfaPS(%UI#q?u!M>P+^fa0je#TGWF;PO$C^^=J_0JDfSEua`H>~?5DlrWkid{frXIO4&TEJxo$h)Eq!b3Ct`1SijFVzh#D z_7(hXiB%F7mGAA_p|@_`ya8atpmsd42&~4Z8Y|Kj|A(=-`OaMNmD=4swb)(do z&h6`%PQV|%t?eZUN`z8N&KHDDg#0DHFIdDN40>)8l1zp5r`NRF6i;8@*LH2NxFq4` zTd+v@7qG-)rNAflX+%T>?m{&*w19qYxCZ|s!=KW90tXgRG!i#v zY$-}$iaOC2wt)OVnCyhz39q6Epa@959H!auno=OtaoHkUY+J`dWnJD2RBH{2xhtOD zC)1#UxkN_wz)wH7(jNZk9P@!R57iz7=L$l69rBk`S?_*?tpgEjNO|Ju3m?u4eg$z+ zFTUWBL4CxkkD3PppPiE;5)a zYPt)=ljQ+@9#3u=@w;EYt1b>U2keIqeVU#*dMW-BtE0bgRs__~4*@Q`5_VYRT0{3* zuPHf*3dd4ukvu$Mhd`yqhem0$I5*G8d*jWWJ7=*=ox<>~>rmU4jej+6oZ)!B-xxP; zsD_Lc`D2F7;|vuq9+D#l%Et71V1b65|!Gf zM~oLs0`m;ljuS!^5YC;)+N4OB=?=O9B5Yt&P(qT85=wn(jko&|;~j$Mk;HuxV`@HT zbw(y863wWO#}D&lSK=_+l?l)>99p2h4;w_4@N(|?CIx7h(|{Gcfh~UzfwcrpDWC&0#x% zNA;*@7*SOk*26#EHI z{h$%k2?G~a=ub}^7{r!>^0@}PH53mcbvB3DRe;h`|hzg6CEybmP}6t zpG)tijda@}IFF)$9jK&hc4}s2xOP5`7DnUX4EltlKNQuH?*C%T0;z`kJld4Lzu2-P zM&5_y&wvfZlY17joUai5hodk6i2I1lUK57l)AAI+D;_Q5wXlR}UBA$FdxOHRJa|@M zV4MVUHSwXw=^_KRp(l1DRMj!yHDGNmaC+m!i~+HlSOY-&LL7ET>@70%&f!aBs1M~y zUga)ryaDjQ2z@P7Bd1u?GMp8wjrd>;1f&0s#L0x%%-7C~GkWBa>nP9Ym4`DnI1J68 zC5E9wK7;`Vo=cTn#~Dj#NoX;1-iRwj600`FegK_nOAHzWq9%t|AaAJ_fZEfya}`jD z5V0MM6M0)IiG9Hvd9h!D6rzP7;y*OByD0^sFTJ`w?%&50$qK%ygYK=@t*xx8!Sn#B zKGjn6*PiR*ckYLuIL>ziYmN+#a8CaNc_t9#WfIyH^k_u1Xjr>Q2Fk?!7VsE3|6xsW z<44f`{jmBFFBO?@=_$|foV!kH-nA>l9xnMfzDs3(c%f@kqqLGMg zUZc8NtXj2)3&YTW0mJJ-bMo-P19^}zs&f|#VJ&rsB1)xFiAn~f19`cx(ss7#(XjOa zxL}Q%Lo(?#Ho$%u(UP1*py-O3wVQW2va9FSDHPN$By%e?j{SILAOYPJVIFPUHre!x zsw~8aI*sqR`58(3NEmON1Lv>@XC!eP0VG83B#H`R6jd*Xzz@Q$RD78{epH|96xfh5_vt(OmBtIRVb`Ze+TqUP38~RKih|tNbs!ZrPRkqx`@?g* zPTLx+_!DQWu`Lv6+j{{ro}y}Z%9MF3>^PYQ!y|BgPoq)IuVY4yiMtv$w+Npj|Lj)D zFFm{Xdx^Z1qLw>vK5CENqp>(YDX2+KbRKy ztch`BTO6Pj5<>~iiYqE=zWn1LlSO0P{26lq|3gm9+=(}Twqc9?=;eK{IUucS|AK=X z#eAAQMZHPE5GH1i!9?84#`arRZ-Ch3q%~pV;f~QBXWW-oiTOOd1`;IDQ2caTKb{>k zISF-H+)nQ6@$egXiN8}+UCpOHCQ0G^9m^|dXpty;z+1#KP$}d)CC|)UU((=N`vOBf zB0JFwVzoBf#Epi=8yD6yFJWIjL~PDdRcjr~}}MA-(U!UsirhroN7nCl3=V(raM zracauwE1P5*rr3U1CpCb@?zitLKYtP4l-PZKZ&Rh28T+mjK&S)fuzzwDa_C)B$U|y z?hmS%Rhr34sS0h6aK!mN-gflL8(0;?zDX5Go*byc+m1}12Jp8Zq9AB6M;_E%!W@~% zrZlO-7f{C_syCb%OcBa&ho5An0$ifWw_6=~$hV2rK4D@ZB{cB)vAq<+p#njQm|LKv z^dmz|BjZ8x3z$TmFOXi1Ffb{E%SHI|CBT@p>e}{iJQiYl&4u@riCemDsPt%$+Ql$+AG{MdIjdP|py{U!2**RL&%)`YhT~ z+}sR;$6%_AJF!aY>20LJ;2mw-=4BYszMw?6naaS|9%5*Gz=n-Yj9HG*2t=~LZOW_RvJ@L1S>zs zqxB*rgBcL%QOeJZyz!pVj~%R3WZrar&SKBZ*k6(crKCE5OYD$1dpq2xqzImddU4^R z`41lHh2bqHCx12XMGzP)L-@&d=>Tq39^DIm-riOTsi`%7n(HM-gP=JeazL_m#9pBd z6;E{qQr;)7V|1>D<}wlh(`P_sXj=Sq*O5PkYaI*lHX11r1BG&kT78~sBcci?m?Pd)yoI-39&R59$3V7k%(aS zQ!sx&5NNZXnlXjC2;OtyJGu7uR(amJ^IONJKe4>HCSjzM3^o_3eh#6718o~H^sI36 zR74mKK7+>k_Lm~N1lO^cm47~0CX(8PBehHnaZHjx!? zl%%ajS~m_vs=-e{>zVl2`E%!br&&+;eR^wQpBmrSIaN7r|TeyQJCu9Wv2U4GcaHI5$q!!<@ z2;4LP3=(cVD5CUe+c0tq**!h2xA+T~1mOsjLpKKVpBT6<>;h^U&^(OL71Ai8l`LP$ zl3WEZ%xTV_3+EH-=d1!IVf(6q2E6ggY#R_@0nzgP#414tAtBL_+AAnj6vaSnPi!B^ z6qG{4PzDe+YyPO1n3y-a%FU#aRv?JUdLA=*VvY6n6i?(UeQ-nLNwzc;A1T)JJZET_8k~RaIH=hHUzsw0o@vG>QKn)ids#}dZO=QW$R5swXOTm2?GR0 zp;uE{fb$ny1r1U3=$a40e4(TJSraEOZ?A1DK%fBOr0VDrnuZUXB3zk}`kQ34n&57@ z=p{qHmR0<3L_9s-%cK12EQJW$0ojAG1M`eZxK2!L84lppzm=VBjyAXEz#zU;dw)|X z3DQJuEQ40IhS)~5wLSSJxPkGcbv6i1ftcVD7bM^@K1bEhgW^ouy&wbkR_BwaIW9Zz z27ey9E5d`qcC)`Z;@SoOWAYf}aRQgeH`u6)^Us9r9^wE(bkir;<|LTFxSY@I8!P#J zu&aLf_%XrJ;6?#$pWY|5Rz&x!g8%OW?S%0a69`!`p*coWUuM~uzDI((=@~}E0(mS! zAvg^3w`*cUGC^vZ7Q|0znPCU?C$Ll{*SxDo_Aj5vU9?Y6U?xUQNGU;?<>gadnP0?A zn+J0!%c?&X$k9cdo%|wHROe((Vu;5hLiM-TI!U);Word)J=qAPbM2^;0}SNo!gz!0 zwUe+XQ2UF6~0;&-ffw(0rhNK{fQ6IEv#uUe6@L51j(wLh`%- zP33c#+=XgP(i4mJ6$(oK`QYWGfy>LIW(NI?aA>P1euk|2K(;XnQ$`pOIkri+57Stg zu@;OIpmUVOUgQfYFkvd=Kx0F7hl|BOV>5#f3@`TF3K(o#&HUI;o+O(YH zY+@TO#CVB-X8%NOE6JoH(;2YQ89Y**F5$oTQwV7uUm&CyoN-(b&0qsmVG^>H!`?+S zeV~sykvxqf13|GG>#87q{8UyZ`!hIVVYb>; zaMwuzUxW^j)rn?vqWzw6H4Fy`szsO^xR_8Be3@Qn_;VwplTrkc9KW^NzgePGF6^~t z-XbAHa7htg9C$t`VH)MZ)UAariLh|c@`eC+0g4&+tU5r%DRcAYioB;@Fu{QmKAwyi z@cIJIK4Omol-T>xqeltDfV#OfWV>MSvPaAnde1!tbNGP?+#_~bW`J4GCNVe>7@zGo zA@fE20yfuDObWKclJ2zCv(d=Cdq@3A;<}0SO zoSiA0cMygb)U|`uw&+cP!d8U|<3qrsnGB1;S?pa~J@G~_XDGQTk4n^Ia#Vz?os&?rhC4m9=$P$v_L!M^iuUx5Y5qumO&Wh^_$Fa;Af2p#=k zHWrS%%kD54roI=#A;9jX$O5!CDF5a}R3NCviI}V*!y*FPYB&~+q$e?t1ME%w|4>`V zpfzj&{XjbSX0C&l0RUI&tPfSze|3k8c}2mZc`bI`OfjlS=izn1mx|*lQZ_i3z;KZ* zjqm`CQO~;g!8KsUGBT<#A>DcV{ngDU zlG4%y0@=fbzI^c!ErLTJKq^0=+k|#InASle_wZD{J`wEWqnz1dD7k0wcL}joLN0w!dpKF;Xds_Y69tYNpnIOOJVTVL7by zG+XD1dn78380edX!NC0VDQurj;&m<>=L&K0gI*$Rz*pRec`Os103!yw#vePY9egGL@*0XcIp zU5>`D!Aov&Q8ZwUL0JJ{qy0h6Pez9A2~s)qLXl=N&A!YH%3{4;+*e*r>@* zPSSF}5;8Nvy;BUS<;0AInfa)V&4$jB{!o-zj2?4OJab)qD`akO7#nxw&!P#h17&S1 zBBwD^XVb8OatUu5Yx5{5>B>k8!C_095fB|CQ3m+$I_W8z7Y7Wlh!6QZjA3 zg2N)bJ9pwOxY5`r4 zBa(YG`NaL|yBaVJGQ-BnEzDmoWILkLkfi59X#{6ly5cR!hme56I_YOlxLt_v;(wPnjo+4!|KN=t_;B2FCs!u*KaD=uVHMsGJ>;=#$Xq+ISNi7?yQ6Lh(kjMqPHzk${MAw_Ddt!fuU*O&RD!r zH=r7KGUoW$cgl&<8(_!j8d4QNmnI@K^uzTjDC9*Zrm>4wf!mLOPbN%q#c@9`lfsgf zsQ++}anWS0?kzVoWb6?1w45H%N)o}UvH!c#@zspFQ->`^=Yuyy7uwiaqlS)vo4mqL z1_ay#$bb&D!5g)dJ_cq^@S_PfyL9P1`kdc7WK4l#){@yhXhno;pimKOfng%HU3&6{ zh$u1gwVk-zju5~YfeUP4@dG;~Z3JoFe>x7@*>&>HjAfI%i06TL=M&RLJf1s(KmWxp z0M@+c18jWYx=f4}*H)k+g9=6m2TUcsyI;lhST}7q-T~HmZ4${gCvN~igsjrHy^q8$Y@5ca`k1AnpH z=;&-Cb09YL`cu^bx=ju^6+!EOsj(>48Sk_BCqo-uS=i4|Z_n|G+7G<;;DZ74a52AQFALRWz>nU zUU^!d9)Nz*%nkc@GzuJayovDRJ&NT{%)tOsU9b`tCu`_p2ho*QAE; z4$=98n*cQI9L`IyNBz(eA;KVppvyq9>o~c&CBaXtz>;>;%0Lgcvk{D!L4Min}+XQKEcyzgMg3S|HW@|d`d1H!L@ zaW+vqqRhk6#9@_zNf}Eoej87VW~71+3IqyfUJoBVQUs7m{LwH<{t-~K`akR@baVkF z8@F!{oZfqY9RHZ)#1V#oC(w`sm_38t^=!f&`tKYE8$~8C06(NNwtfJAcMBL_sA8X~ zKf)O5#tn&QeD?NTPkfa70zRQ_#v=GqRK#9l#!Pk(>`@FhTOFApSOK#VWDg`$%+@t{ zlJjS%Sq_OTy4I7{77VlC2lVkz>kp<3aJ4IOBu!%f!`;_L~qu9J*-tT`45uIo?S$r?9BJ9ug>lse! zs(8ZuTOmgmQF`s64lKZDgW4U;zaLu=6$~!Stn{qmu}e<94h%C=gm?#foeF|8fBh~7 z27wgf1<2;g8uRw;g)Z5m478FxgSGQec3TIJ@at;^N}sBB@|WZvo+&s%rR) z4mTvifbP4MCHN&~CQ)eYd(}Pwj7VlLq5k4*iayXw!kOVl^hZe%90@BG?YM3%Un>;?gZvl`acwE567(P3h6 zqMPgFm{p8gu*Z3$1vg1EQ9fmHT{ z-Y;{--B5=AvbA~)Ot^TA{qJ6KN46kMLz`F=;erng4niUFf_JV3q=wuyq*&$)*btYGs%Y4qLvL!AnE&_ty?ig7|9bqg zDtHg#nsPaf=64fwfzbvsIs&8kGbl~+_I91#ek!Gw?pero0cMP2{&QFk<{cziCHs1 zF9nXl6a}mT((^(lU3Y|T2T)>+KB9m#{wKfm`8*IO;}sDz>p zQrq6qWkTQ3WTH8I3P6;C5q3TCriabbOoH|i ziT~3(T(7z8S}DM;FPIvDCMgG!Y88sqh}Z?n_rKDEG$j6>B>ZF>q-x;t>Ur%mS(u+6 zCj(%xFW|Dk2S`Em{TsG>D_FK4xB{{$=x(vj3nG=6?dqEwLsW?Ero52FM#91k!?v9s z_0q&LDTz+gzGmTV_uqv{VeWKSSA2(Z^eu6mC8kC3Yu$B_ngXM7WPP&c_ao^N-X$_- zQ+X)6ZeZUaglTXuwaf><_!J>zG8G#4b*SUZ>YRVl>H)7?VmM1cS}^$tUW;8NsQJSY zx2be1QIG#iVJJ2Yl-UCMgiOSWS^fSG9e|d9GL(>dgo%Z=1GXSA!^z|BwTLpzUNU&9ECACh|@UttliM0c-O@EHJ*}fuO>eIkY5Yj-}#Y zTCyX<(Wp z&sqdmCG_)XuCTpjE!I9c#MCp#hiyOO@OVYGCG^fRTvv&w?E>;i$Yhlm(d%Unb#rxx z5_ch7^*7kO$q;?lt^s7KiY#BgT(~;@Z|m@CB)Q68Lp~rJ)DNCEZV53URrY-i38mx_ zNEv$h=`pNx@?23WP_px`pv%cNC+V)>ak>yS6*LkQ62r@9KfVK1{?0;pbU$R(r!6it zznDhtv#x%xytMowNth(||*m<`Wh5j(A)fXlz$;k%++ zSSU&uALPv^UL@`9?Uhr?iQm})Z9P=YLj!pjE-Lw48g}8{pUcp(*33@ifyv55)VGNE zz-4HFhV58yEl{j;XN4qEQpF3MlmHtN&l*r$c9%GB0Q&q46C6a5yIaQ0sTK!-Ktq6_ zyK4f64++929AXYd&{};0FY^QIkR@z>bYTdC)E)p8a5=>jQqcbrP_PzWFAoCLKNj5t zUrr59z@QawSi*g%bv6V#(2fej2C*QN7}L zU`tze>Z`lU{|e>!VLPWo%x!U7jwVS>m&Jb>_`5cg?o`2lb&9ROZoS0!B~&D6BtgnB z*7f`Q54o@|b?Jp&5C@=9_N1bJUHzZ`@$UYAHf{NT-fiS>XYv0F+)w_`y`SJD44{E) zUH^++`;_kvu-(Il`|cM1-JrUxQHq5Q1@1*`(&*S(8U?U0)E8JWD?K1)^$`@u zGh~93Dgf(Gm$l7f$ri6`E30(%`OdAZX2Gd%78Y;e1uD3tyxIEcw9w*P0my(e=f z8w}YdMd3F|#z{E06(E-S0Tw*=kZ4pv1tNIiEa({+;+_CQ;w;`2=DY;Augb8{gW`XN z*ASBNxSwXWkjP^rDznVttbG3Whp=b_ggx+jf2v_v8P>Y;&S@a+n(2h&Tj0H)V2Xy? zo#+Ee+!`tYvRnP!Y%%vKv<-go;ss$(fO!Loq6!#fNCH>~)+QL?4avO%*t8aZCRCoA zSZ+F>)yq_YK%Wr$-Q!24?djJbWbF5g1Iy(S9^G=0czU41@J5Kus?~g_R_*b=qg3G_ zAgD;xxPA2i#4DI9K7;JxgoiBOx*_l;)?ri+8|HI7U zVf1_3zOBqNo;MU220DxtOt~QWN~rH za~OX?)z2U-EDUDr3XG@ediwjzq4w7;TYQ1pG!nm6QPUQK3eU#Dp|d!@eCuSem)8gA z`3phVM(Fs5g_wD!D79f~2cMLbl%Y_wnY{d_{rmTCO+_8@G&oqZ-2xmz-XN87J$2PQ zAGW~R4A=!;xm>TO_TtY!&qzv14fk5z{fAF{HMN z_tYgULv$xYWMt&dqTGp^M#q^>70`p13+H@!v;`r2?Zd+!Fh$1Ty#QinCMG5*Jc@zR zN$ct!zyO3UJ%jHm(g(-;s@DLKr$bpeGut0oS6~11$wtj~!{X=1=^Y$aYB<{sEQ_H^ z*UV|Lt9&_EAxK@|Pr3>AXEk*XCZnfy5IVxW-yj{GksTqvXJu!F2 z-|d>aLSBw%Usz zw9$EbM#; zlHy~gv5w+^q=BZ4M{p}$y=++tYY|2$P}zbN!KqiaBGIa!A6>@1;9wRuHnypp(y7W} zv`hYiW_!U$(M98P=@RfJr`fpc*RLPb`tvuk;J_^!89P}D&f6Iyqa(z@WQxmS@(2(~ z27#Nq3O(j5`l|H1kl%>l6nAYKE34=q!T-33&Qz`N;9c^ysp+|XrStpGpI6^K^G8I) zLHM{55&tgmyMyK+fB5a)*ROA`1crpPixzEBnw`hm=Q3_6%f{+L(;^*eT>8A#%q+6d zqRc&t+qJ3b3R%>P%`vb07mjI+eR}!Vs8exCNqJ>usA26*$MN#Qshp$#_)x5p zXB4hrb3y<1HYh3uQ>!%~I(^J<&hB1xb5nXiMOH*-!xv^Ae*V~z3=xsQX|&dM@a?hf za39@i42jHDOdjC+aAseIOr+9MaDeW{#vXnB`n4ncnx<#;4{!#FIGum-ZUx`v;d>L$ zFqNdU9F7h6dMN;E6fIbykNW522)~Syu+19^Z^aA|K9a>KwEej|rQAujrlh1K?)b&t z6Nv3w0$_RNDZmd!9F-wrb2|%}w{BI{$%-DX+BvoVpVvLjSNs{>r7Kqy+B?pj%lCiQ z;=pxg<;s=1{Q_R&|g+$<_@0K$SZT0;`s&qQ66>6}9qU4&AwV;FPj*d|23T78Vv4q@|ZkW1t!Bo^+spAzmZt^fDVd&|hVX zd}E^AV-C2vyL0jJfrpoQr4g+POF9)l%21F|KWRxD2OZ^waxxqKX&R{Nn+A)_78ao^EVx43Dg^$l^3Txzgw~ zraS%g>4avkYfhMhDbe@E9L<$WRK=D0s&qVD*qkBLJcEc!#LaBSp~r@va|ym-)SBy# zhUuD~o_OKo7j(*do6#qJ1QXkzSAVmtNWH9fl)BvhS8Q7zO41K#IGU{m=Fv56M!T2W zvZ0?3zMmy9z5WyJrrcpE2JY*tFu#H`SR$;fi9`duFl*V-W$9U29r$P%nA?7Pa1iCu zHGKHzf}2dsoRmKn7rT+N0*p?s?A=oT22KF+^4ft|@lWhCF0TpCEjD-ZD3$kax zsrLH9%w`-*bR=e1=HeXu<)-oPOTG;Z)sJv+uo&%Um#ds`-f`r}5&shtjL?C9L^lIw zcKG=@Ft^P#7jox+T*Agi?>s-clKeZx$1yz8zOOFTxc|26I=F1+do|96xMR*`pl?-_U5-WO%HNHex5c4!(L{;k|W?r8payC7=Jh zO-!ibw^KYkJm~emKuWRt_sshV37as}X@|Kv@+HJ`p6BK|->q!-Ew9dDN(~L&2jEo; zsM2#`2Ujc?9O|Fa&EhJNuQ_3EZ*Q+Wx%$ROxlM|Sl?HR^fdK&wD1f2tORL67XI}y? ze#gK-F?cJh*5^u?nQ;vbF}uOLD0DU$FD)o2=nT@F)adPPb`GAK=odd<;Ad19AC#QT zD+^TG*K^Ji65rgCR<98`g&E>3G7C5Jz%2RBqC(Ar#sT=uPcmM>&6o3?Mi z7a7S0-v9V;Yw+U2$~VD~FN=YEQ;M1IX$gr{c=XrqG8}ECvmK{nQlO)KQ!0W&7ik5XV{8 zvxB>}#qK}+T(|L+y}Vdnwe_kq_wViABcj&0=U=7wt8J#%X0`ZEmD>LO`3>vaY3Hju zyZ?D(KC?=mowD@hKflLSqdV-cuXfSZ)rEt&Xp|rQKi~E}i*dceQQN^^84k5)`^WtS zvM!PP*ZcqbU$I^L-@QN2-%kCzKgh+p+U4)R>R+Goqqf9mx_@5A zXYLn1VWs>1-~3XKJruev|K^u6i+R%ho3i(ekn0xInBfiU&#W>FjE-ic0|KY!-f{Y~ zeHAlpLqA<2b4m&AgZ;ed+hw2ZtN8JyQCj@^-Tm^7_);P5!--XU4E(754xOz%Dzn}q z;bjf=-Fek<<7`fn!6|8)y^8pvpU{uFrq>0I;F3 zluTjzHxJLMJwxtF|2OZ-fA?4aPd#>T!r@(ouHzU++YReG|M+eB@=Y5zo}y45q>5#j z;DDW;n?w8cYEX_@!oc7#B>N=rrZGh533@ryWoK^Qj3uu`k@_53J3zg!ln$pbl{ys_ z6?K5pb|u679C`Kk@7Kwz6%;&E#q4&2OaOO4M5#C$-!pIZmfR1luM?yvZ(m=7lh5aT z(KaV&I|FyoKk2>F)8GFS+$YfAm0KU$@EyefiW@gH#N=mD3JSu112)&>-6M6;V!Ve7 z)PZECFUuZ0dei}QBP=4q@Z^>~AF1yW^L#flTdOx}{m0d9z$I+Fa`#7SGmw3|_Pbo^ z>FM$4eCR+z$;bAusGtC2>}4p@-XjaU=;_6h+FC!f9LF4|O;MZdqa#BBSlTeUFbmtq z!)|}=+O^3$bS6lsF+7dl0rf_?^&g<52qu+r4`VkzpvT zre~Nw5OLSji^dog7QZ;@0mG3|G{4J6{#>J7mu|L?4m=w@2)aoN%TsIs5*7pK(yyiG z0>JQp^7QFx2w5_$2Y1pT%a{pwvBKP28N8b7-#IJX}g(d}6|Iem*%_$uZ4Dnbw?g zd4rHJqrnlcK(E`aquOX#w6u-I(uRbO@$keYmo+`##eefk#A25E+DFIrk?}^EOALnTH_QvpxJw3#;D=cgTy=Kp@mBI-9ybM zF=nEB*U;d)N9>+q@^C}1lzC#8w9~@MwNczPplxm18kxz30h_m8Fr)g-0K8q9=WBO! z?O_%d*UPjTmhYUj`gTXOHa6;}XH|7|N4{TyL2~QN3;T$tvZD7g?DB)*{@lGP(^O-@ z=3J{-NQmF+oLy&5Yb{y7{xR$fmhaowA=#0=***Yt#y2!)gYQY51=lXsSsh)j$tu9P zUAD|M*|2sA(~GEn%9Y$*fBJka^7i&_t9iKuIRce}tv*3Pt~4_wSMivdTfQ<(W8SfI z=f(PNpi`?dwp>6bG0|6xdEEM*-bj(#ckb9u4%LTiq^b<(R>cjg=}_t9pKiL6z2mIR z&Gj-erIrJAs{0=IHL!2C89UHjw$jt*#ogOE`l`b?_I$(?GeuRL3L zR@>nr7GP2VIllD`|BJ&i$%sk&7UN%Ng&- zmjzE8FHg|cbHmJXP~{9K{Z9LUZ{M!UbSrRwqVZxnB4R8?(3SO3^y*@nz1+gD#ik`faIo%-&~+NNq3 z%3M;7e5|)-%^KCL^JCf4=jQHYf!$`_SG9Wcw+^z=;OVGqJbB{?Jqt@=Jx>ILZXxN>$V{hy0idDaDT`9FJBj&a^Z!WFDV2kYTOQ@hqYIw8dOBS3QQ?NEAFdis5G zZ|Irau?q&RW2}hsvGLK)4GSYYee;g@F{V>So)=&{vhQP!A@A+0l_B5EAj~SFAM|=I0w4JL`glrmpqw-JZI} z=-e@!5T$LTcCwE+i?BU_z?sQl-KRi-jIOmuu?7nK37imd`u0YBXK~WpT0*=CP=? zDv?q`hYEA%yO-6F>`riBcG^ z^I<9h=_xlnU9Q)~YtfO?48wVDi!PJ&jEn@t3Rw>vqKRekuU@mJ14MT~-O4ZMK6a??;a>BLcAlrvP8_-AJkEw(%eCMD$4FZe`xr_yexM~jC+Xnyz z;o-XMjq@jGbl~X11;DL(fx#V4^qA(|(a5GR2K!jhqHC?#y(k%(;pQw4?6F*+l0mLA zGBKe8Cl$5F$p*0S_zob&GdTEOT3X+oMmL7M_MVF^!N<*Q?cfSEcd!M_ zM%qq;gIjgb01PvpAgVKOTsF5a21&#Luk%neL~yP28#lfK#51jiXolq($v zr1`G#ro9on(W5hQcW}Vq8dZZus}tm{J}{Pf^|kzc zlGeVXE7Y%k_Pje~nfsxx?rcsF>=rTelMc;!6aNGQPI?BjW%mv~jG&|Y$VEAOS_x<9 z$AW@m-BSU|7d2`@OPT_-r5@Yhhz(W#(3ZY#lqB@qcHFp3jZ?Wpw0*#7B2i z=fKf5uu@Z=?5|GT8k5ub#OH_1~K^&%w$JTs++_lRRv3wmwe$#x-s= zEyjlqAB{Dy2W!Ft9|@;Ml&S;tbDQuRUWP^&;c)(v0uR`Aiab2-gEhs)Z@-8zrt`f_ zv0=PWQoL#%hiJbz8Z9^{>^pE`=LQegEnBw5n~BYYg`NbxFΜJ~ed@$ZJ;|>TL|_ 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 None: + matrices = { + label: json.loads((evidence / stage / "l2_matrix.json").read_text()) + for stage, label in STAGES + } + cases = matrices["baseline"]["case_ids"] + grid = np.array( + [ + [ + bool(matrices[label]["cases"][case]["comparisons"][key]) + for _, label in STAGES + for key, _ in COMPARISONS + ] + for case in cases + ] + ) + report = json.loads((evidence / "chain-report.json").read_text()) + cells = report["cells"] + nodes = sorted(cells[f"baseline/{cases[0]}"]["node_digests"], key=_node_order) + change = np.array( + [ + [ + np.mean( + [ + cells[f"{a}/{case}"]["node_digests"][node] + != cells[f"{b}/{case}"]["node_digests"][node] + for case in cases + ] + ) + for node in nodes + ] + for a, b in STEPS + ] + ) + + fig, (left, right) = plt.subplots( + 1, 2, figsize=(16, 6.2), gridspec_kw={"width_ratios": [1, 1.55]}, facecolor=SURFACE + ) + left.imshow(grid, cmap=ListedColormap([FAIL, PASS]), vmin=0, vmax=1, aspect="auto") + left.set_yticks(range(len(cases)), cases, fontsize=8, color=INK) + names = [name for _, name in COMPARISONS] + left.set_xticks(range(grid.shape[1]), names * len(STAGES), rotation=90, fontsize=8) + for i, (_, label) in enumerate(STAGES): + left.text(i * 4 + 1.5, -1.2, label, ha="center", fontsize=9, color=INK) + if i: + left.axvline(i * 4 - 0.5, color=SURFACE, linewidth=3) + left.set_title( + f"vLLM rollout vs VIME recompute, raw bits\n{int(grid.sum())}/{grid.size} equal", + fontsize=10, + color=INK, + pad=24, + ) + + right.imshow(change, cmap=ListedColormap(CHANGE), vmin=0, vmax=1, aspect="auto") + right.set_yticks(range(len(STEPS)), [f"{a} → {b}" for a, b in STEPS], fontsize=9, color=INK) + labels = ["emb" if n == "embedding" else n.removeprefix("layer") for n in nodes] + right.set_xticks(range(len(nodes)), labels, fontsize=6, color=MUTED) + right.set_xlabel("embedding and decoder layers 0-47", fontsize=9, color=MUTED) + for row in range(len(STEPS)): + right.text( + len(nodes) + 0.6, + row, + f"{change[row].mean():.0%} of digests change", + va="center", + fontsize=8, + color=INK, + ) + right.set_xlim(-0.5, len(nodes) + 9) + right.set_title( + "Per-layer digest change between weight versions (share of the 16 cases)", + fontsize=10, + color=INK, + ) + for axis in (left, right): + for spine in axis.spines.values(): + spine.set_visible(False) + commit = report["measured_commit"][:7] + gpu = f" on {report['gpu_name']}" if report.get("gpu_name") else "" + fig.suptitle( + f"Qwen3-Next-80B-A3B full-model chain, TP4{gpu}, commit {commit}: " + f"passed={report['passed']}, first drift={report['first_drift']}", + fontsize=11, + color=INK, + ) + fig.tight_layout() + fig.savefig(out, dpi=160) + + +def main() -> None: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("evidence", type=Path) + args = parser.parse_args() + out = args.evidence / "figure.png" + plot(args.evidence, out) + print(f"wrote {out}") + + +if __name__ == "__main__": + main() From 0a5c15c1a2bbd33cefc5f6752f143b8df01a663b Mon Sep 17 00:00:00 2001 From: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> Date: Sun, 11 Oct 2026 15:35:41 +0000 Subject: [PATCH 70/70] docs(qwen3-next): figure for the batch-invariance evidence tools/validation/models/plot_qwen3_next_batch_invariance.py draws, from the published evidence only, one panel per cell family (concurrency, chunk boundaries, interference, packing); a cell is green when tokens, logits, logprobs and every layer digest are bitwise equal to its reference. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> --- .../README.md | 4 +- .../figure.png | Bin 0 -> 174172 bytes .../plot_qwen3_next_batch_invariance.py | 144 ++++++++++++++++++ 3 files changed, 147 insertions(+), 1 deletion(-) create mode 100644 docs/usage/evidence/qwen3-next-batch-invariance-b200/figure.png create mode 100644 tools/validation/models/plot_qwen3_next_batch_invariance.py diff --git a/docs/usage/evidence/qwen3-next-batch-invariance-b200/README.md b/docs/usage/evidence/qwen3-next-batch-invariance-b200/README.md index f3e81ad66..a909c31cf 100644 --- a/docs/usage/evidence/qwen3-next-batch-invariance-b200/README.md +++ b/docs/usage/evidence/qwen3-next-batch-invariance-b200/README.md @@ -18,7 +18,9 @@ Commands use the current repository layout; at `759755e` these runners were in `scripts/`. The stages ran the code of `759755e`; the copy in this directory was made by the publisher of `3025497`, which only adds redaction rules (`redaction.json` counts the placeholders) and changes no measured byte. `SHA256SUMS` covers -every file. +every file except this README and `figure.png`, which +`python tools/validation/models/plot_qwen3_next_batch_invariance.py docs/usage/evidence/qwen3-next-batch-invariance-b200` +draws from the published files. | Stage | Result | | --- | --- | diff --git a/docs/usage/evidence/qwen3-next-batch-invariance-b200/figure.png b/docs/usage/evidence/qwen3-next-batch-invariance-b200/figure.png new file mode 100644 index 0000000000000000000000000000000000000000..4984a896163149415831a33786a87039aca8c01f GIT binary patch literal 174172 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͸ zG-pv!sTc)2x5s#jgq+SNzz79~S@L)!%1x^cP|b>#32QW?e>G*uYVmQ2X#I$~P?;T15Ku+EEcxL+F13D4bH zX3=+aY|*^s&k418tmI{7btNfDc|Dv$O|HRx3T@N%QSOZEb?H|t7b^p4*Y(rT(73s- zZm`kx(Dk#GP_;s+2B#@^_tf(bYRwhwRfW9sw|{~E#;VR_HVmzqy?5_kI@tRIFW#%m zQMJTQjgA0K$^AhIrwwH|``9_l;)Hvv{`S4U*w`gq!{3 zk=phfXN1>5Qp-7ZvAX||bJc8UmZK5>83x>eCGL2gaYf+~hikI;T=u2`jNmCbK}9`C zqgX?x*LJu!F1KVfDs5PKBFN*=|F{}1UFsiT)46^8$toM~*zt@7xC299SGWJI3>rhy zQWA<0_4^0+>M5Q5;(wU3m>#ZzjK-%VDRve@sO=q?V#)6aG7H*206hy zj^>aLIIg(UG#Co^a5;6%xw7Ed3#zEY(zSZ^U{BaS?Rf_^``>dJjM$NkU^ZA)7wS+Q-pCp`U+zkM3Nd4FG8X88U}yu2`*jG^r^qPRi?eep+&io>xPOMPi*U zs!4V`vp_yhmCzjYhyB{Mv+3T;7Iw;Vo63N2jwkjpRmQn*l*KQj4tONe*8i+|N$l$I$Xc^iq16@d_LZ-#soE15 z9ZO~KzS#BzL^~^OFTC)ier4Xs>s_OsKLC%DWyOw}2|e$)^9H2s_K?6L#|))0_)lpXPxfY%`>|l3fYnIZB`hpDFUyuZJBvSz&=mM4Ck|Egfq2#<8JTIsfS@0v z*DlV|Sa1{f9z5$tB_1jb7nmL`y)3jAU%g5H^&3k?*x|cFW3!HbN^-7e&Traj{dl2e z@i}Gfo?(efZ!oVz@Z+aXm;ZTv6FY0>x#~CRMQy}B5#gH;$ZO`JECJ3?10Bkpytu9m z#1wew8@M}Y;bN; z?@$fF<^*dN2jyGN%3*2rxrSTa`I?l+m^^9PRth?DIE9bQql@b4s8Q&L-VVEDB~>2WAW&Qk;2@{$~*9jiAg_d|InP!EWjJXx-lq z{QFF-dqm*#(@otJYNCr2RSp@zNkcLV#7Tz(Y~PYM(+oLV_-2vD%TB|Wde+aP1gHXZ zj(D67!Xf7>0XF_^1s~*fe&|%`o={|l>l{C{uiAC*0^oijugJ(N_{p~M`|jqr5imve zNeg;iQu$PiI|Ys?R~INj{Z|$bPX}r{d*n#5q)i}>e#2$r#2N7VoT@9_nt`xnGGDqE zkJUGNnO1#{TPqn9(w$Sr7L~aN=x*2|<;_W_FecHt2D?eE|H@64@%ajw3`3vrC4{h` zS^y4tL@bk_=q#E97_*+Mbo^JmjYeBC?mE4CyedaadsvWHPT3MD=mSyvlhVA*&zMiE zTYrwHozo_>s@y@}gDiF4Ws zJexvE9a<6yXUD1+UVDH@Ukwj$8l+yjL7Iv@8&N39pvAjZh8zuP$URXTE;^Kr)5R(F z?owD!B;wILg1!JMu)!ze&@z`|E4iCjRyig0Ynu0ajjr67Al* zR$;HiPE+>z34?%hz&8Wfar12qMWAU_^Hez+V@O(lZehY+G zX1^!H z*=Y3#2cLmX=|y2$6Lii1EOfq9T3qaP`SNAdsDr2!hG|)?dJnM*S2?vzHT|L>q-zlN z(u-n4AJHZOuOF!Bkb6I`;_hAhyVH$s-xUG?m?JRrFZ6O!S+JP6$z(?%@L+e<`Pyau zeQVMgkvn4X?bfoJ2e_fGk|vevDwy;q-;i~po=B?jCS>c_VAoEdvv$MI^$6YEgV z3qS7tUe5Xv?zJ1}{7v8}p>%hl^&^)fE){tjbF9j*3^FtHHeK~ZGrQ^a5An)_sW#@g z>H_Drh}@V3@*x6aj?ffhumg~znwnbB*eNWzGa!}I3=dtH1!gQ2JZw+s{+3ZsQto+b z=5$!bI)s<*DV-5OtdE3(t*;*qD#-G)D|Qy?%g3)5TO0M0D*gJ2Dj$k4kJeiRoDtc* zeB}rS&lkbRgX$vpg$1KAu(`-H8(?5yKyzcT{=I+>4tPO4;I@i*SgJc1E9aO1rGUus z023~(c<#3v5~4=iW02{%6Tmo2X=BuDbqbH)AG_p}U69?8YrdDgN8~R?3e#iFhx-te z{@Nc9t7YZ3oY5||pAkyVg61HZ3g=R73r6>Qf#XL%1zO(X&t`vcqJcx^k}*ze`2;zi zE!}J8wbd!{r1N7{Fk0J=Ga5GeilnoR7CB7DiQOj5t_mLl*m4=w1It^t?t?uZ3BA9A zb;l?!sQt1MSWYfwPktZKDsyU2w^OW7yr7#y@82n-oABR29$+G3&#FAgZiTA~4&;$B zM}WeYJTjZua^*v7Oabu%nOU#2Y`FQezJPwEay?c`s4Vv#5sQy_iZ}tCg0E#P5TQ5* zxBt%Ca_K8a4C?!4x{9;U^{QbpM&_-lKjbENaID7FlANuCa3J5~qySlar zwr1?#J|JXC?{wX&mfrEa9OA8Z62)bRuA7B1$vSk<{umdX665r76@!E}0bc!RH<$LA z4fhnz!q2!fgn0kO0fG=D+U9ftJ-}4Jqd^OzUg(~TA1l7(+~y;YG%}ygZn&IYN%c-i z>lcnAGjS<1$-iGalA}7fETAKR!tgbJj+dM9r{2q=*qiO3FuZtS6>R+l5?eZi-cN5s zW@Ef0r`NUEqhXS_ijPvv`}klUx7V#}@@SehV>0NoF@H6@;h(w-n~(qa_ksCYv9Xxh z_xAd&&PZ#Nc=z)T^m6|ZhNQh9Ez4fq z+1p_y$zv$R#nOtmN!TYWC@#Y{k$DDL!Wt!5@N?dr4Z>TU-z|V}h46YQ?=BD@2S^$y z)wpPNle_QWe7(lm=TUxW`8=c?;+{^&+@$@G!gC@-rY>BjIRuv)^5wa3e0prWvKvq+ zm~%nQA5G6MJSx+s@U-(*tzonb&IDP~z%vp9Z;ksM+d1f_=$2D*U@~w9A~44hwEX?4 z$EUWHrIS?HzTy50Bj@8^wULvZ0lUTP#S}f!sMUJFU4)hp(daxlGK%_eh(aQX)K|O{ zqgNh2tNmvkC=BTzmrC3QNkfdX6?OS!MKU-SC4Lg~DuO4!%c6V;L=-aLYAh4d#LTLO zamYf^b*`2@N?Pt~8Nl?YO`Do5YuU{H`(SOElEg9)x?k$4z1x5Nb?D``Upx+>e<8=& z!6g)ZMs%lD^F$i<)mPrCk|_&KLzUxn{)K@{oU{?kep=qt+m1@;Q6MJB;dBE zSv{&z$65HlwaGrl1Op(A;GmkwIW4Sasql7ndbeME zF_afM+2Q{Tft1juTg3^%`T(((zkg9g2XH1FvD^w>EA^>oSYfX&#F?G~^`_^zAITEh zy`v`K8%K7`4q7sJ_OUI`H`sg1VaGZMy88_Bk#xoYo}`vMMZTuomvbmAITvXaN4e~A zdfI|{i{edM09&^FF}-Lq{+H#?+;QkTk=w9#JkB=C7BJz)yY^zyE6i zMQN%$vI%ITbs5rCXlj^sD?e@fF)77eS~uU-P1|rmwC>6Bth({Hc0|j7I;bg&XQx6+ z)mKxboJ^YaOUpWqK?pG%+jZ@Fl8<8qe}_R8=rl|f$?#~Tp>6+MnCaY($f&l^hRd&k z_2T^Zqf#7HAR^1q>YS0M56Z6H*7Mxr`+(gmAq_lyc8;??$E5X+j!xls)?7YYvW#XR zsu_t@IV=0uIHC?W{Hjm{tMc`%XQQ~}#pZ`g<>_f$3c9b7esS5H9R*VD608yX7isuq zWM(etGiB#oc<2m*Z3d-tIw!!zrS?@NoyiSQq5U~LZt9dN)09F$<3J`L-evNI`3Il) zj0`jB<>#f;wd=dCpz1IYFd-D=>nQykn*$@pY8#GNU1&4-5B+&Zf1fB#8T<~gtzlk! zFY$)qCC)&1kx^!obI#tG79bE+m!U^uC2*iMOE6c3BSY6ytKjF(jfR{rI(}O6H=yw0 zE4RpO`Q8IwUiOE|AP<|EP8m6m8((Q-W|lF$Iy*ai-+=?C(66*k+G~2p$J4VHGnyPS za57lcwq?t(ekvM92?hSz;a+{_O(~zMbUqP7H;K9uvH#SmCta6JGcc+;3r0hc5kiUi zT4LGN^?QGqII)x{W_#UZlgWUlpMSjR9v{Xx=~e&N@lD#dbFctVqpiy@6=?UVFym)q zs*t#nV?79YDG7UIUWYHH8QxW@smWxCr!lUVG1?nUv$?ny`sVO^-@?C{#Invw@7(^c zm#S0Ot#@$|wh^caBK}dU_n>n1(so=Ddv*Sablj&XL*@a1s3|DSQ&42$OfilCy2m^K zxl#Ss`=-r2?xb$pX8g)w($btZ?*ite-I^onJ^wf@#QR|y|vho#c5 zQ_VxDm_|KXLhUQUssY%rfH~6Aw-kei4&k3M;KXX+>UDNjamV+Jd`MViJKG4oL0tSW z>Sc}f1H&+}V#4vk%pxd3@$2-Qx{g@BkIf{`BECiT$Y@ldNO?t$8P)JvU#PWI*?T(W zo1a`+YehobCO+lA-Caqn!4@oxbSqt-!R!L}vcp;Q>Iz1<-#t!tcF84qTB%1Sd`4A}$N4jW@GLe;gEbRQ z^P#>{S69c*WsbmxbTF}ZswYeI)SIw-_g6V4b%FcTJoJz#Q0nyup@VIR_~-t*fSzu{ z=hoY){XBu%fK=c6YD`Qi?-}e?{grl9V;H;AvtEJn=&MbeLyC7FO!#%PLz+|Zqp&4z z8kdGycz*NGYLzETbGfCbKY$w`dXULr#^6q4J9uGkIeF6|Rbd{Lm948+Hg@RH;RFIL zT(~AE84M-;c45I|wHrQKmlA?P3a{LYqo8un2yx^Ai~Qu<8Ix;phvnvF0g;+QB$#N z_H-yP+|d=m7wo}Mj_ll1NyHy)RpN1crPx0B+~>{TW52)waz|EYl@~4kF-)mX!g=hy zwsFR!WEPUx4$i5*Ov5bbNlszmV6LDzzoccgA>0b<^{W&(U*1`h#Tbic8WuJVgYqs! zM8w!^O|W~Mkzup`12eQ#2bo_P58!(q%%r!XiV}eHaSg4HGon)|e+3Ky z+D7-^j%iqR*Pk}(RK{<*1ZzjmO5!qikm*-Pm8vp~q~K{{d|uNI};ezjJ~`gz@kw-`ex8J)$h6C?Ix+hik>tqfrg8z+{Vi-A+-k2 zI$Ceygw}Q+d=wlz`-)|cxylv#5cFAOyR{#vtBNpA%VuUi9J<$8b!~*cNdN57)qlEb z+zz+(>wm#jxL!wfXA|BYT^5{Ne63`1lZ8#f=zOp@W4My!pd_i;n5h$C>QDr8VV zzgn+A;L!Mc_wIdonv|4utinL~kr?I(rKUqej?r)v#;rfl_U# zEss6!uGX!pWH=X9p-fj4$~0{)&Z0qx9#!>@H>mj@3W**HZ5xYqTqr}^Ygh7M| zuQ`X6st^`S3p34RwyFIyfNN3K6zALcFFTo}TRpw+oSZ$EHaG{k7RIjW-Ont&;UydX zxTDujrNh_Y71Bn7{s|xVGZYb+p;kq$?K54v8Z;>8oju^|Qub!q+Gk`)cqMIykl~P% z&{-@dCQsTTNUntCe$n#1CVEkv2gRRHq3zyqP&R2K&(o^yA9^3 zz@;9NcdMhNQdQ)=wCEur`cr2weeVCwl8S%b43FRM$ukk@SLxUbxN(6r{!zJ{244rs+b;H@0*AuU5{LRj8D+2DT?IrwNz7!a=gn>RNd&!2orbRvnE%mYT?;^XGg2{*`Ib; zyXITBY^kua-PUkrwYL8cVq}%|*WY~--d_Lqdc)5*{PF+IK+Gy^ol3h6pYGzOrl%V2 z;e}oAHt%e>xE3F;)hK9`(Wm!l+2#MW=xF@eBj*==xv=pcAOHM6HOu&~YyW?D-t(VV zG=5VDm?AjeUp&_NL?ic_Pi8BIS~9rQ|$f zfloxn@vtc5kze5ZhI{Gr&^I=KcdzK^TOF&`}nxGF>&{l_%>gp?m9st+5ghd>iJP zkJ9V&PdIg6b^owsX^MfKOuUgfu2j_h6%9OFnT0Mz0iQtTO}${&5~D9@1=h{Q>A%=n z+;AXML3?{AjpWHaDVWbm8y195Atz+u<*XjZ1Tlj|iKw9`n6tJ{-G^c{hfY!2-+lL8 z1PV$TJVr7-6ZxAcq9xsc2^PNeGJd1dey3o>VD-36sid`Vidpm>a<6hIik%VEz9)}6 zF&Z?WdFxI`(k+XQi^~+|rpiDhY0IFnNYj%>fX4lY;WlmIx~F2kAMW=PGQLs}Xz@Xn z16CYLseJJj2wt7F5u)@@hg{Dux@9M)Dtz9#T$?bzOW@STXJ+bT)Yz2zFG;5nTyLs{ z5z05;{Kc%DsrZy!t#4(zpjo9!KiuYisM7GZC(ly#G?gtF$&b5>Ip3@>0BDv#-7C`; zK>9sZ!P>-8MSxez|GA_f!{fH#fQ+HHv}h!K$lCkqWb~;1e!u`za&M)f(amW!+I{;P z!Pdph=Z3(tku~Ju_zW(iDLC6cCt)7!g2aNGzyIE@XTZACkLXa;E3MK+uGOlQOg7*x z<3ALwb1Iy)?_f@#S+7DETrH@j3}3jsQ( z=@qh*Q|QjbJtQ&{(800nO=qzJnUbyNwRI9kl@$L9#c#{(1nfqz)2*P zkPaXPY_X0mDn0oJb7Fo}Qd7{_`dM7gi?t_W+wlH{0zlRjXK+t^tLzNIWq_$zpK4qZ zT_`pj7~ou?pStL|zeydL5$1@!`@hVxorCyIed-hTquq9@2fPR-iQ6lsHUq8}AOY8- zm@yQ}HCz6k)wH^`kT{l#u4B)*NX};?!R^^^(?RK?$D&rjPaOD0yFM<<6I2m5mT^ zMYp!%JJAxu!I!v0>bGK5IQ%@|pBVu8DYl_8CuF`av|;!l56H<&5Rc{+C(U_Z`=QuC zo`77E_}PK2^1i2T@9rK9j1fHP%RM`fJ)5&mGfr+sNrtjt`saHfrgE@u-}vy`M6_Js9c>_iewk z83`#}$En5nz~Fao-kgYAvnMEmb2XH4F{E22z5xAittKjpYNoG&|00X{D`Mp8G~_7V z&U+6_twv2e0}X2Vb&n=F=>m0Oz50j)C?SJ6S-mM*5Ronb7s@FRzH^elLi@Ge!1CeI zl)J}q?lxUfjGL9B>P@%-6MYn7?qu>h3l|uOk9%($H+=Q`0_sIC5N7*#mIIg&hZ=LdH0ihks!ndVW?wi&-m5juJ$mBq(Xr9bQmOPi<=Z><)aT|jnDCYx--ka?{eNZEA3cfa= zfB#`O7io+g>uTRs0br*z+@4lDD54@i>)EsIzV0(oC3BZ<)#6*4s7J$i3QC1^4o##i z-vBAp4}cEP4TZ93fg6Y+f>k<9DTi}cahwZaOaVOoL`i5tR{Dpeh@h3O>rdypt`0zrwhpvk4LbnY8Npe+|y7H)#RGkSW2R~#y zi?kO*KXA(*fhYHZ6p-{>>Lg_3KZ#$+nOj$KBB8ZZx(VBAS)vEa!nT5XP_l3D~jvLX4S-FWrSVt z-Z!8iJ?T&oRyEzvZ$~|&*1NzJ5W>?KjLL(FW|&SS^O418J01^s!+7_3@A+8wm`DAg zBX%E;#9u?sV`zx__UF(m{HUbgwzAgxA1GtJCpi5K84g3nnR;}hEAB)GcSI2Ok#sGz z&p;|AtWpHx7=`ZI-md>KQW6%Ms7YkHwB6x8@by?$>43*-3iKo&9ZELi5znMU4aMt} zlY2y+Dg1}Oes2awXOepnJ$KLXa$ySzyHx(mJ4N*P#Y4yEBm3gaZ7N6&L37iF~=W5QY z_UDN#awXhAr?FnVxKIC=Lk{E6v#d6-kimO7otyoWM7G#V=*1pWU1od}h(y79*Gh?^ zlhaTN3Db)`bwAkCj(affra5#F@j+#{z;I)2vYiqVXu0S7BKRYQHFG&~g+s?iR4B#X z3zi(yHJ{UZkn!lizA{=$+F+|=O1&!&gFGeg(W?za^7rF3lip`JYVgR|eoJ}XF#gS! ztPRB>!XY5uiv?0rXe5&^2bh`Nt6Ui7)qAYi;4+lrHKE*#W0+8gn2h#fAK38*y_XnO zC%x85JjWSm08;0P2^dW6ms}G9p*bFyZ8Mk{YMcvs`U(>w$^1Iu?Gkh;WsdwI*@xE!+1QnHb79Z|=)*)&n2^z@cKZkO4 zHMRb1bWY+NYj>@0sSU}o**6L$_d*U1iY0v|`cxU@QT93W( zp&d?kYHKv)>cD>5@8hw4MHk+Syj3BC8AKz#GBav&vR*R}k)Ggjx?#hB13PMxGl)7K zA6^y~ZcM5nQM{*B3EkB6YOT}kqttPXHrX5FQJ1uEsMY+yiq+)qCd++HPaW{GKha@C zjw<_q;?`fB%cIhr-P(rPUyGLZTSd1zxBIR-#b?U`yu??}Svn$1FcU=nbAn|hT~{tY zc*4(HWrhh?SLl3pR~!Ah`XqPOV`1Nt7hhPnv#D2~&;+I)0dtFK0VaZbS^TP}-Ro+N zW;RAk?WuGv7Hb|%g~&~oGB6|V8oW{$++B($eiRCNT9TJ7DfmL!a^~)<-*($zQWy8! zEzWvDse3o~@Xt53vg+S-K;f=FEpqP6UcP&}{l5K1C-w&~@HV}?L77 zvGk!K5n<>h8*A%j*v*Vt|JFmPJa;cWeQNiyy3F>>8W&m|;P@kb@04ARMG)~34$eYQ z$50ncR`MC*Snga~omIEI=((PiwRI5A<)@(RMeeT2B?ThedwTw-pJ|>995~Q64G|6k zlYN9ARs5`UM7&HG6ulAc8tdS=jOZ1Y7WU$f%$m!|y{GF9{Ki%Al z5$xSSoTE(+Y2{AkB)$K*10IF^1qZLKQg1;ObM#v!G~}$hRX(agC!VK5TvJuhf=#}& z_xMGdq*b)I4}M;>v8L2m%n8VfhdCFC_mkbrY1F`(k2(8BkfoSUm@swv?fVCYP0Wrn zctF;0=ww9B+_-`$mcHZ~i>p`1)|{cdFoAfGl=AFyt^&;-738i0(hQQ{7?cvPRxGx! z5*F=gc=CD~MR9nToIR)&EA&V1OfXkIP02O?^r5nd%{#OH^LDtIn3(uXjT>;}i{1@` zR6R+1jKx?-ke?r#xm#OVEv>7qVR+lN+k5J!XKk!raLGouZo@GuCw!_*#aBV(%&Jf} z&B^cP(T0=87eUX))kqn&&g}<~vQ&;0yDwDEd2`UAN?p358l7~zb`Fz>C1N@St5rNM zmOvI+`BJ3qBVq&O2hD%J@!}voMx?_-!V>o@mB*5FyN2>avflZL7i~>d zn~Oi)bP=)f?ckM^6hYjrR}gjf^Q9`oMz}k3V5SUre&23!v?`t~Q^;Xb$&5;#*(YTc z+j#PttFIlDpw>BKoKDPe>v*f~I$flRrjb;`qV_FB>?oe%a>DfBx&-U$Gh3RR;@7 z!ijO3oJ%QeQH7H7b$K@@%)S)jDyv(y)Zvoz*|TS*IjOijv+c9Xt3wraZ~qF-D*ap! zii6kN0M!voXIUzt|M}!bqApQX7(}%{4;%B$=AR9GFXon*G;7v!djnU?LQOvHP;ki6qKEX#LB$p?%$k z#0>xQT$AxmPUS0Bs!e;Wuhi7kd_T@a{JQRvl`fx-X&^St(Y0GpMAnSS=`|I*w^gDHhDv+e&gEMF~0Fuwl$nHr+s&~ z$pAws1jd~O(Cg6CnQV%UrCn|syD>%_>>yX)AxlTMG_-Tdm9^hB^qAq$&cUB}r<;k1 z32Z$daAj2m6-Uc2?r5v7kA1IMF7{ZCuZhQK4foO?S$$igZJQP>+jJiJ4Jj~2kf~OXPFXdZzH058OtlWp-t(oqcG?* zjdD0GI!^-PfN>u-M@#dPt*hSO8zTA=5S)o>`eX2K-XTbg82iHe z?)dw(hHJmR;nQ&r;m_?X=k*+>1U!H|t*W59tmhvfKWgfB8JapNe<17+ljM-^n%HYv z-I)bF7)p=!m^FWTT*zeoaAO!+vA^ZT`&Tj9OT}C+Sd1;$&&ojYu`hYG2kW7bXx$== zSHv)n^!Wnv`8}vn7QL}Y*Sn{OPRlb64OiDs^V8MMCZt3Vb~%@)!_b%`p(SGZJRH0j z0BJCN<|7GCY%pj=-Yfl?s-0W4TV}EL??1}!jceJHT(J4}CMKCtO-HF485!Y_;py*I zrY$db;leO#omtd1#g1yLW;(twa)M%xc1*qUnqkGexUoz*J2A%Y#jj^WLedbetT@^K zd0se1|2svOg)SBpyPuBEf@{~VF@Eq2%X!A_Yt@Amb9MObXp-O)IaQ*-rQxpCu0#?EUk3ub(pu+X!+k$T;AtR+`@@zfac4^YY= z1IICA#=s{XYOuK2bm}U{=%}ci$aC&|g8Fmcw$4vCIK!^$Lmi!qGUr2CxMgOT+AaU| zzSo~V`$ywbe+3>N`ZOHe4YyszquJjr7k>OlJ8a!s_(nJOv-)*td?H6?v3_sYpZxNZ z<1buqfBoaHH2(kjy&7Zt|BCOJ*?06f78-T*Vx<1~Z}z7=Ul`kK)SHekT2wcyys>e@ z#`Bh*#&23RUdX~P&nBm&ge5F!_*`#Sr?{nSbl<&Ws1xPNpFM^<6sLrB_$+ZjbB{&4 zizrRzpZop8{r~1CtiQ6=e>`m8QgL-rq2{d5=Z)I;Xp2kc^rw%9+-dXA_4VX(=goBe z^mLA#>aFr?G{1E0=Gt#^27lIJbIs-td@MbFt!-JW_dnPCgQn}>`rmu^|5rZg{}bO! z*1#K1G4{+D9Mi`G9vXvjr5%r(BY|XX0&QSSo%M1mHb6EmB`xb{6xq01KmMuJOJ)8a zlZbb3|4e5X$C4GGXFGs_rlPc(PUuhuQY(Qus>f;9_Gs6*VL$$EJA=8XzCkO=R9Dwptl`MWXOLq&@$anr!I2{)GcaU&=c3;SuowR0Yhhn`5mc)(W1NE_ zZAff_%&ognbkL@Xgh(qxOH%QL3m5+6{pElB9`%3IFH}1825azi$e$Y@K@ZnA z!zhR>aGj%ajA44~DP~d{&`8)D9bMf$%jD?hy6)9CfB&J#M)9wE;n8%G%K2ZiZ)$Rhy3%{djDqZFnaLs&#dKB_d8aB6jbH?W|f8CyoV>BcR6cg8k%70q2_}1 z3iTD2G*vvrn|F$%WHJVy+(nu&m(!G%*DHpVDg)vEF)1fksP6!%r9w_)&=9YLV$|1-|_3^gj@f|gO@hJ}S` zW;Z5W^{>pxs$Jiy?C1n9qlOX`wb=vIJ%V%6%oK5q)wA#<-C$yZ6rPy6?E|1f;;J!q z>Qt?HjWqj@FV$~4551qBo?c~TW#-zQ`}fcDzy0rJvAyTH{~LMwdeg=_py6^<{{QbZ z-U<2hf9BnIawuA*om*O)pu`1Dx1Ty(*1Wn|H2K^-(v_%3uElM&Oaxx2g5KQf^jpND6N*c@>ZE~oP=6f>DU zUC>?1N_s62I$S}D;~)F)-yejCE1$kt*riKGVo6g}6p%ZjubSGy)ZUp<9V&_(1I9Q8 zuWH*CyX-E~U*F)iTZS^lx(5J5p7!uif$O82exY)K0j+R!{{tauaB}OD4L!LXc;dus z9N4$-yegw9gfl_u{EJ27vOUo1(+vn)c%!JQFuDjQWt$b@moKMxU48X5!S~QkzcHl) z=bfET7uRRR+P^0O)7)cV+RJ;!%n{n1B0XkN*)Zc!8JHVTbn8F1=#Bdz_GfUCBtpd*t{|S%%Scga#YM9zQB%bni7Bu0~*h6aXB_RoY7SX z`-FD2*cTut%F)#j2kK#$y6bNE5zXie_r26cYYG!xLK1XrPFUSYRdu}2O!flD)ABf2Nzhs@zrzphslr% zvh3{YL&Lerljph2=@erPaM|tKqt0qtU)|*~*2i!~n1aSN&4}jffhAY*JSCmB1PxHY-}IOu@&E?z>Py7+*Ly zdR=!htP&wN*@!4*bShtXH8X8oL+zS3qWZzdcWaxT zN~laY4q3PMwx-boA||4Jmcz1c45PIWJ5x05T-fk~aV$%OiHOH{^527ywt>Oid|U*I zJaXmJXA%DD0dH2du2U%KT+%i>!`&X(r_V&h#!iRF;vPX(2e0$guvzMeMT>WCtZ}?X zkEdvv4rreb+XhF%JDqC1RxNmv!C;{5(4RMNwpzI|gak8=ZwJ!c5>YQ|_<1zR!4zAb zZRC^pYuSL2c)0HuuM?Ih69z|xm%eleGm{DJD^~(y*VeYTUy-EX$(ITf5D~1PrYL}9 z*o*XiuIVKD^5B*8~3kgJHIe zz26=81eQ9uoQ>~Es5pI(MtwM|4*vrv7+c=x#Wk=;!HVF1-FakuVUZf54>9%PTm8

94A~-2Phba|SZ}C%V-^=ipkI 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 literal 232121 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 z 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%0Aa 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